Biksel Programming Interface — Quick Reference

Program entry point

// Mode (io): Main
void Main(Channel io)
{
  // Your program here.
}

Basic data types

/* Primitive types:

Int32       (32-bit signed integer)
Int64       (64-bit signed integer)
Float64     (64-bit floating point number)

StaticText  (immutable text specified in double quotes)

*/
typedef Int32 Bool;
enum { False, True };
typedef Int32 MayTag;
enum { Nothing, Just };
typedef Int32 ListTag;
enum { Nil, Cons };
typedef struct {
  MayTag tag;
  Int32 value; // only valid if tag = Just
} MaybeInt32;
typedef struct {
  MayTag tag;
  Int64 value; // only valid if tag = Just
} MaybeInt64;
typedef struct {
  MayTag tag;
  Float64 value; // only valid if tag = Just
} MaybeFloat64;

Mathematical functions and constants

Float64 RoundHalfUp(Float64 x);
Float64 Floor(Float64 x);
Float64 Exp(Float64 x);
Float64 Log(Float64 x);
Float64 Pow(Float64 x, Float64 y);
Float64 Sqrt(Float64 x);
// Angles are in radians.

const Float64 Tau; // a full turn
const Float64 Pi;  // a half turn

// Components of a unit vector at an angle to the x-axis.
Float64 Cos(Float64 angle);
Float64 Sin(Float64 angle);

// Angle of a vector relative to the x-axis, between -Tau/2 and
// Tau/2.
Float64 Angle(Float64 x, Float64 y);

Keyboard keys

typedef Int32 Key;
enum {
  // CHARACTER KEYS

  // Letters
  KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI, KeyJ,
  KeyK, KeyL, KeyM, KeyN, KeyO, KeyP, KeyQ, KeyR, KeyS, KeyT,
  KeyU, KeyV, KeyW, KeyX, KeyY, KeyZ,

  // Digits
  Key0, Key1, Key2, Key3, Key4,
  Key5, Key6, Key7, Key8, Key9,

  KeyBackquote,          KeyHyphen,              KeyEquals,
  KeyLeftSquareBracket,  KeyRightSquareBracket,  KeyBackslash,
  KeySemicolon,          KeySingleQuote,         KeyComma,
  KeyPeriod,             KeyForwardSlash,
  
  // British keyboard only
  KeyHash,
  // EDITING AND NAVIGATION KEYS

  KeyEscape,  KeyBackspace,  KeyTab,
  KeyReturn,  KeySpace,
  
  KeyInsert,  KeyDelete,  KeyHome,
  KeyEnd,     KeyPageUp,  KeyPageDown,
  
  // Arrow keys
  KeyLeft,  KeyRight,  KeyDown,  KeyUp,
  // NUMERIC KEYPAD
  
  // Digits.
  KeyNumpad0, KeyNumpad1, KeyNumpad2, KeyNumpad3, KeyNumpad4,
  KeyNumpad5, KeyNumpad6, KeyNumpad7, KeyNumpad8, KeyNumpad9,

  KeyNumpadDecimalPoint,
  
  KeyNumpadEnter,  KeyNumpadPlus,  KeyNumpadMinus,
  KeyNumpadTimes,  KeyNumpadDivide,
  // LOCK AND MODIFIER KEYS
  
  KeyCapsLock,  KeyNumLock,
  
  KeyLeftShift,  KeyRightShift,  KeyLeftCtrl,  KeyRightCtrl,
  KeyLeftAlt,
  
  // US keyboard only
  KeyRightAlt,
  
  // British keyboard only
  KeyAltGr,
  // FUNCTION KEYS

  KeyF1, KeyF2, KeyF3, KeyF4, KeyF5, KeyF6,
  KeyF7, KeyF8, KeyF9, KeyF10, KeyF11, KeyF12
};

Mouse buttons

typedef Int32 MouseButton;
enum {
  MouseLeft,
  MouseRight
};

Colours

const Color Transparent;
const Color Black;
const Color White;
const Color Red;
const Color Green;
const Color Blue;
const Color Cyan;
const Color Magenta;
const Color Yellow;
// 'red', 'green', 'blue', and 'level' must be in the range
// 0-255.
Color Rgb(Int32 red, Int32 green, Int32 blue);
Color Gray(Int32 level);

Sprites

// Mode (io): Main
// Returns a new channel in mode 'Sprite'.
Channel LoadNewSprite(StaticText name,
                      Channel io, StaticText path);

Fonts

// This channel is in mode 'Font'.
const Channel Mono11;

Text

// Mode (c): PutText
void PutText(Channel c, StaticText text);
void PutInt32AsText(Channel c, Int32 x);
void PutInt64AsText(Channel c, Int64 x);
void PutFloat64AsText(Channel c, Float64 x);

View transformations

const Trans FlipX;
const Trans FlipY;
Trans Scale(Int32 a);
Trans Rotate(Int32 quarterTurns);
Trans Translate(Int32 x, Int32 y);
Trans ClipToRect(Int32 x1, Int32 y1, Int32 x2, Int32 y2);
const Trans Identity;
Trans Compose(Trans b, Trans a);

Drawing graphics

// Mode (io): Main -> Draw >> EndDraw >> Main
void BeginDraw(Channel io);
// Mode (io): Draw >> EndDraw -> ()
void EndDraw(Channel io);
// Mode (io): Draw
void FillFrame(Channel io, Color col);
void FillTriangle(Channel io, Color col,
                  Float64 x1, Float64 y1,
                  Float64 x2, Float64 y2,
                  Float64 x3, Float64 y3);
void FillRect(Channel io, Color col,
              Float64 x1, Float64 y1, Float64 x2, Float64 y2);
void FillCircle(Channel io, Color col, Float64 radius,
                Float64 centerX, Float64 centerY);
// Mode (io): Draw
void DrawPoint(Channel io, Color col, Float64 x, Float64 y);
void DrawLine(Channel io, Color col,
              Float64 x1, Float64 y1, Float64 x2, Float64 y2);
void DrawTriangle(Channel io, Color col,
                  Float64 x1, Float64 y1,
                  Float64 x2, Float64 y2,
                  Float64 x3, Float64 y3);
void DrawRect(Channel io, Color col,
              Float64 x1, Float64 y1, Float64 x2, Float64 y2);
void DrawCircle(Channel io, Color col, Float64 radius,
                Float64 centerX, Float64 centerY);
// Mode (io): Draw
// Mode (sprite): Sprite
void DrawSprite(Channel io, Channel sprite,
                Float64 x, Float64 y);
void DrawSpriteTrans(Channel io, Channel sprite, Trans t,
                     Float64 x, Float64 y);
// Mode (io): Draw -> PutText >> EndDrawText >> Draw
// Mode (font): Font
void BeginDrawText(Channel io, Channel font, Color col,
                   Float64 x, Float64 y);
// Mode (io): PutText >> EndDrawText -> ()
void EndDrawText(Channel io);
// Mode (io): Draw -> Draw >> EndTransform >> Draw
void BeginTransform(Channel io, Trans t);
// Mode (io): Draw >> EndTransform -> ()
void EndTransform(Channel io);

Querying the keyboard and mouse

// Mode (io): Main
Bool IsKeyDown(Channel io, Key key);
Bool IsMouseButtonDown(Channel io, MouseButton button);
Float64 GetMouseX(Channel io);
Float64 GetMouseY(Channel io);

Simple event handling

// A 'tick' is one sixtieth of a second.

// Mode (io): Main
void WaitForTick(Channel io);
void WaitForTime(Channel io, Int32 ticks);
Key WaitForKeyPress(Channel io);

Full event handling

typedef Int32 EventTag;
enum {
  Tick,                             // Tick event
  KeyPress, KeyRepeat, KeyRelease,  // Key events
  MousePress, MouseRelease,         // Mouse button events
  MouseMove                         // Mouse move event
};
typedef struct {
  EventTag tag; // KeyPress, KeyRepeat, or KeyRelease
  Key key;
} KeyEvent;
typedef struct {
  EventTag tag; // MousePress or MouseRelease
  MouseButton button;
  Float64 x;
  Float64 y;
} MouseButtonEvent;
typedef struct {
  Float64 x;
  Float64 y;
} MouseMoveEvent;
// Mode (io):
//   Main -> TickEvent         (returns Tick)
//         | KeyEvent          (returns KeyPress, KeyRepeat,
//                                or KeyRelease)
//         | MouseButtonEvent  (returns MousePress or
//                                MouseRelease)
//         | MouseMoveEvent    (returns MouseMove)
EventTag WaitForEvent(Channel io);
// Mode (io): TickEvent -> Main
void TakeTickEvent(Channel io);
// Mode (io): KeyEvent -> Main
KeyEvent TakeKeyEvent(Channel io);
// Mode (io): MouseButtonEvent -> Main
MouseButtonEvent TakeMouseButtonEvent(Channel io);
// Mode (io): MouseMoveEvent -> Main
MouseMoveEvent TakeMouseMoveEvent(Channel io);
// Mode (io):
//   TickEvent | KeyEvent | MouseButtonEvent | MouseMoveEvent
//   -> Main
void DiscardEvent(Channel io);

Memory files

// Returns a new channel in mode 'File'.
Channel NewFile(StaticText name);
typedef Int32 StreamMode;
enum {
  Read,
  Write
};
// Mode (c):
//   File -> Read >> Close >> File   (streamMode == Read)
//         | Write >> Close >> File  (streamMode == Write)
void Open(Channel c, StreamMode streamMode);
// Mode (c): Read >> Close | Write >> Close -> ()
void Close(Channel c);
// Mode (c): Read
Int32 ReadInt32(Channel c);
Int64 ReadInt64(Channel c);
Float64 ReadFloat64(Channel c);
Bool ReadBool(Channel c);
MayTag ReadMayTag(Channel c);
ListTag ReadListTag(Channel c);
// Mode (c): Write
void WriteInt32(Channel c, Int32 x);
void WriteInt64(Channel c, Int64 x);
void WriteFloat64(Channel c, Float64 x);
void WriteBool(Channel c, Bool x);
void WriteMayTag(Channel c, MayTag tag);
void WriteListTag(Channel c, ListTag tag);
// Mode (c): File
void Clear(Channel c);
// Mode (c1, c2): File
void Swap(Channel c1, Channel c2);

Error handling

noreturn void Error(StaticText context, StaticText message);

Debugging

// This channel is in mode 'PutText'.
const Channel Trace;