| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- // TIGR - TIny GRaphics Library - v3.2
- // ^^ ^^
- //
- // rawr.
- /*
- This is free and unencumbered software released into the public domain.
- Our intent is that anyone is free to copy and use this software,
- for any purpose, in any form, and by any means.
- The authors dedicate any and all copyright interest in the software
- to the public domain, at their own expense for the betterment of mankind.
- The software is provided "as is", without any kind of warranty, including
- any implied warranty. If it breaks, you get to keep both pieces.
- */
- #pragma once
- #ifdef __cplusplus
- extern "C" {
- #endif
- // Compiler configuration.
- #ifdef _MSC_VER
- #define TIGR_INLINE static __forceinline
- #else
- #define TIGR_INLINE static inline
- #endif
- // Bitmaps ----------------------------------------------------------------
- // This struct contains one pixel.
- typedef struct {
- unsigned char r, g, b, a;
- } TPixel;
- // Window flags.
- #define TIGR_FIXED 0 // window's bitmap is a fixed size (default)
- #define TIGR_AUTO 1 // window's bitmap is scaled with the window
- #define TIGR_2X 2 // always enforce (at least) 2X pixel scale
- #define TIGR_3X 4 // always enforce (at least) 3X pixel scale
- #define TIGR_4X 8 // always enforce (at least) 4X pixel scale
- #define TIGR_RETINA 16 // enable retina support on OS X
- #define TIGR_NOCURSOR 32 // hide cursor
- #define TIGR_FULLSCREEN 64 // start in full-screen mode
- // A Tigr bitmap.
- typedef struct Tigr {
- int w, h; // width/height (unscaled)
- int cx, cy, cw, ch; // clip rect
- TPixel *pix; // pixel data
- void *handle; // OS window handle, NULL for off-screen bitmaps.
- int blitMode; // Target bitmap blit mode
- } Tigr;
- // Creates a new empty window with a given bitmap size.
- //
- // Title is UTF-8.
- //
- // In TIGR_FIXED mode, the window is made as large as possible to contain an integer-scaled
- // version of the bitmap while still fitting on the screen. Resizing the window will adapt
- // the scale in integer steps to fit the bitmap.
- //
- // In TIGR_AUTO mode, the initial window size is set to the bitmap size times the pixel
- // scale. Resizing the window will resize the bitmap using the specified scale.
- // For example, in forced 2X mode, the window will be twice as wide (and high) as the bitmap.
- //
- // Turning on TIGR_RETINA mode will request full backing resolution on OSX, meaning that
- // the effective window size might be integer scaled to a larger size. In TIGR_AUTO mode,
- // this means that the Tigr bitmap will change size if the window is moved between
- // retina and non-retina screens.
- //
- Tigr *tigrWindow(int w, int h, const char *title, int flags);
- // Creates an empty off-screen bitmap.
- Tigr *tigrBitmap(int w, int h);
- // Deletes a window/bitmap.
- void tigrFree(Tigr *bmp);
- // Returns non-zero if the user requested to close a window.
- int tigrClosed(Tigr *bmp);
- // Displays a window's contents on-screen and updates input.
- void tigrUpdate(Tigr *bmp);
- // Called before doing direct OpenGL calls and before tigrUpdate.
- // Returns non-zero if OpenGL is available.
- int tigrBeginOpenGL(Tigr *bmp);
- // Sets post shader for a window.
- // This replaces the built-in post-FX shader.
- void tigrSetPostShader(Tigr *bmp, const char* code, int size);
- // Sets post-FX properties for a window.
- //
- // The built-in post-FX shader uses the following parameters:
- // p1: hblur - use bilinear filtering along the x-axis (pixels)
- // p2: vblur - use bilinear filtering along the y-axis (pixels)
- // p3: scanlines - CRT scanlines effect (0-1)
- // p4: contrast - contrast boost (1 = no change, 2 = 2X contrast, etc)
- void tigrSetPostFX(Tigr *bmp, float p1, float p2, float p3, float p4);
- // Drawing ----------------------------------------------------------------
- // Helper for reading pixels.
- // For high performance, just access bmp->pix directly.
- TPixel tigrGet(Tigr *bmp, int x, int y);
- // Plots a pixel.
- // Clips and blends.
- // For high performance, just access bmp->pix directly.
- void tigrPlot(Tigr *bmp, int x, int y, TPixel pix);
- // Clears a bitmap to a color.
- // No blending, no clipping.
- void tigrClear(Tigr *bmp, TPixel color);
- // Fills a rectangular area.
- // No blending, no clipping.
- void tigrFill(Tigr *bmp, int x, int y, int w, int h, TPixel color);
- // Draws a line.
- // Start pixel is drawn, end pixel is not.
- // Clips and blends.
- void tigrLine(Tigr *bmp, int x0, int y0, int x1, int y1, TPixel color);
- // Draws an empty rectangle.
- // Drawing a 1x1 rectangle yields the same result as calling tigrPlot.
- // Clips and blends.
- void tigrRect(Tigr *bmp, int x, int y, int w, int h, TPixel color);
- // Fills a rectangle.
- // Fills the inside of the specified rectangular area.
- // Calling tigrRect followed by tigrFillRect using the same arguments
- // causes no overdrawing.
- // Clips and blends.
- void tigrFillRect(Tigr *bmp, int x, int y, int w, int h, TPixel color);
- // Draws a circle.
- // Drawing a zero radius circle yields the same result as calling tigrPlot.
- // Drawing a circle with radius one draws a circle three pixels wide.
- // Clips and blends.
- void tigrCircle(Tigr *bmp, int x, int y, int r, TPixel color);
- // Fills a circle.
- // Fills the inside of the specified circle.
- // Calling tigrCircle followed by tigrFillCircle using the same arguments
- // causes no overdrawing.
- // Filling a circle with zero radius has no effect.
- // Clips and blends.
- void tigrFillCircle(Tigr *bmp, int x, int y, int r, TPixel color);
- // Sets clip rect.
- // Set to (0, 0, -1, -1) to reset clipping to full bitmap.
- void tigrClip(Tigr *bmp, int cx, int cy, int cw, int ch);
- // Copies bitmap data.
- // dx/dy = dest co-ordinates
- // sx/sy = source co-ordinates
- // w/h = width/height
- //
- // RGBAdest = RGBAsrc
- // Clips, does not blend.
- void tigrBlit(Tigr *dest, Tigr *src, int dx, int dy, int sx, int sy, int w, int h);
- // Same as tigrBlit, but alpha blends the source bitmap with the
- // target using per pixel alpha and the specified global alpha.
- //
- // Ablend = Asrc * alpha
- // RGBdest = RGBsrc * Ablend + RGBdest * (1 - Ablend)
- //
- // Blit mode == TIGR_KEEP_ALPHA:
- // Adest = Adest
- //
- // Blit mode == TIGR_BLEND_ALPHA:
- // Adest = Asrc * Ablend + Adest * (1 - Ablend)
- // Clips and blends.
- void tigrBlitAlpha(Tigr *dest, Tigr *src, int dx, int dy, int sx, int sy, int w, int h, float alpha);
- // Same as tigrBlit, but tints the source bitmap with a color
- // and alpha blends the resulting source with the destination.
- //
- // Rblend = Rsrc * Rtint
- // Gblend = Gsrc * Gtint
- // Bblend = Bsrc * Btint
- // Ablend = Asrc * Atint
- //
- // RGBdest = RGBblend * Ablend + RGBdest * (1 - Ablend)
- //
- // Blit mode == TIGR_KEEP_ALPHA:
- // Adest = Adest
- //
- // Blit mode == TIGR_BLEND_ALPHA:
- // Adest = Ablend * Ablend + Adest * (1 - Ablend)
- // Clips and blends.
- void tigrBlitTint(Tigr *dest, Tigr *src, int dx, int dy, int sx, int sy, int w, int h, TPixel tint);
- enum TIGRBlitMode {
- TIGR_KEEP_ALPHA = 0, // Keep destination alpha value
- TIGR_BLEND_ALPHA = 1, // Blend destination alpha (default)
- };
- // Set destination bitmap blend mode for blit operations.
- void tigrBlitMode(Tigr *dest, int mode);
- // Helper for making colors.
- TIGR_INLINE TPixel tigrRGB(unsigned char r, unsigned char g, unsigned char b)
- {
- TPixel p; p.r = r; p.g = g; p.b = b; p.a = 0xff; return p;
- }
- // Helper for making colors.
- TIGR_INLINE TPixel tigrRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
- {
- TPixel p; p.r = r; p.g = g; p.b = b; p.a = a; return p;
- }
- // Font printing ----------------------------------------------------------
- typedef struct {
- int code, x, y, w, h;
- } TigrGlyph;
- typedef struct {
- Tigr *bitmap;
- int numGlyphs;
- TigrGlyph *glyphs;
- } TigrFont;
- typedef enum {
- TCP_ASCII = 0,
- TCP_1252 = 1252,
- TCP_UTF32 = 12001
- } TCodepage;
- // Loads a font from a bitmap font sheet.
- // The loaded font takes ownership of the provided bitmap.
- //
- // Codepages:
- //
- // TCP_ASCII - Regular 7-bit ASCII
- // TCP_1252 - Windows 1252
- // TCP_UTF32 - Unicode subset
- //
- // For ASCII and 1252, the font bitmap should contain all characters
- // for the given codepage, excluding the first 32 control codes.
- //
- // For UTF32 - the font bitmap contains a subset of Unicode characters
- // and must be in the format generated by tigrFont for UTF32.
- //
- TigrFont *tigrLoadFont(Tigr *bitmap, int codepage);
- // Frees a font and associated font sheet.
- void tigrFreeFont(TigrFont *font);
- // Prints UTF-8 text onto a bitmap.
- // NOTE:
- // This uses the target bitmap blit mode.
- // See tigrBlitTint for details.
- void tigrPrint(Tigr *dest, TigrFont *font, int x, int y, TPixel color, const char *text, ...);
- // Returns the width/height of a string.
- int tigrTextWidth(TigrFont *font, const char *text);
- int tigrTextHeight(TigrFont *font, const char *text);
- // The built-in font.
- extern TigrFont *tfont;
- // User Input -------------------------------------------------------------
- // Key scancodes. For letters/numbers, use ASCII ('A'-'Z' and '0'-'9').
- typedef enum {
- TK_PAD0=128,TK_PAD1,TK_PAD2,TK_PAD3,TK_PAD4,TK_PAD5,TK_PAD6,TK_PAD7,TK_PAD8,TK_PAD9,
- TK_PADMUL,TK_PADADD,TK_PADENTER,TK_PADSUB,TK_PADDOT,TK_PADDIV,
- TK_F1,TK_F2,TK_F3,TK_F4,TK_F5,TK_F6,TK_F7,TK_F8,TK_F9,TK_F10,TK_F11,TK_F12,
- TK_BACKSPACE,TK_TAB,TK_RETURN,TK_SHIFT,TK_CONTROL,TK_ALT,TK_PAUSE,TK_CAPSLOCK,
- TK_ESCAPE,TK_SPACE,TK_PAGEUP,TK_PAGEDN,TK_END,TK_HOME,TK_LEFT,TK_UP,TK_RIGHT,TK_DOWN,
- TK_INSERT,TK_DELETE,TK_LWIN,TK_RWIN,TK_NUMLOCK,TK_SCROLL,TK_LSHIFT,TK_RSHIFT,
- TK_LCONTROL,TK_RCONTROL,TK_LALT,TK_RALT,TK_SEMICOLON,TK_EQUALS,TK_COMMA,TK_MINUS,
- TK_DOT,TK_SLASH,TK_BACKTICK,TK_LSQUARE,TK_BACKSLASH,TK_RSQUARE,TK_TICK
- } TKey;
- // Returns mouse input for a window.
- // The value set to "buttons" is a bit set where bits 0, 1 and 2
- // corresponds to the left, right and middle buttons.
- // A set bit indicates that a button is held.
- void tigrMouse(Tigr *bmp, int *x, int *y, int *buttons);
- typedef struct {
- int x;
- int y;
- } TigrTouchPoint;
- // Reads touch input for a window.
- // Returns number of touch points read.
- int tigrTouch(Tigr *bmp, TigrTouchPoint* points, int maxPoints);
- // Reads the delta of the scroll "wheel" in somewhat platform neutral
- // units where 1.0 corresponds to a "notch". The actual correlation between
- // physical movement and this number varies between platforms, input methods
- // and settings.
- void tigrScrollWheel(Tigr* bmp, float* x, float *y);
- // Reads the keyboard for a window.
- // Returns non-zero if a key is pressed/held.
- // tigrKeyDown tests for the initial press, tigrKeyHeld repeats each frame.
- int tigrKeyDown(Tigr *bmp, int key);
- int tigrKeyHeld(Tigr *bmp, int key);
- // Reads character input for a window.
- // Returns the Unicode value of the last key pressed, or 0 if none.
- int tigrReadChar(Tigr *bmp);
- // Show / hide virtual keyboard.
- // (Only available on iOS / Android)
- void tigrShowKeyboard(int show);
- // Bitmap I/O -------------------------------------------------------------
- // Loads a PNG, from either a file or memory. (fileName is UTF-8)
- // On error, returns NULL and sets errno.
- Tigr *tigrLoadImage(const char *fileName);
- Tigr *tigrLoadImageMem(const void *data, int length);
- // Saves a PNG to a file. (fileName is UTF-8)
- // On error, returns zero and sets errno.
- int tigrSaveImage(const char *fileName, Tigr *bmp);
- // Helpers ----------------------------------------------------------------
- // Returns the amount of time elapsed since tigrTime was last called,
- // or zero on the first call.
- float tigrTime(void);
- // Displays an error message and quits. (UTF-8)
- // 'bmp' can be NULL.
- void tigrError(Tigr *bmp, const char *message, ...);
- // Reads an entire file into memory. (fileName is UTF-8)
- // Free it yourself after with 'free'.
- // On error, returns NULL and sets errno.
- // TIGR will automatically append a NUL terminator byte
- // to the end (not included in the length)
- void *tigrReadFile(const char *fileName, int *length);
- // Decompresses DEFLATEd zip/zlib data into a buffer.
- // Returns non-zero on success.
- int tigrInflate(void *out, unsigned outlen, const void *in, unsigned inlen);
- // Decodes a single UTF8 codepoint and returns the next pointer.
- const char *tigrDecodeUTF8(const char *text, int *cp);
- // Encodes a single UTF8 codepoint and returns the next pointer.
- char *tigrEncodeUTF8(char *text, int cp);
- #ifdef __cplusplus
- }
- #endif
|