Files @ r7643:9ec38df7caf3
Branch filter:

Location: cpp/openttd-patchpack/source/src/gfx.h - annotation

rubidium
(svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
Note that this is not completely glitch free, bounding boxes sometimes aren't removed properly. This is due to the fact that the bounding boxes sometimes are larger than the sprite, which causes a smaller part than the bounding box to be redrawn. This is NOT a bug, but a known implementation limit as we do not want to slow down normal games so the debug graphics are always 100% correct.
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6179:c0508e7aefec
r6179:c0508e7aefec
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6289:e952747c6a2c
r6624:8e8cb5121304
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r7311:0facfb3f97ca
r6179:c0508e7aefec
r6729:1148cfab2fca
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r6179:c0508e7aefec
r6179:c0508e7aefec
r7310:5e788d82877a
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7310:5e788d82877a
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r7541:8de54e4bc1a7
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r7318:844268a38029
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r6138:b11eea571618
r6138:b11eea571618
r6146:870f8339cbff
r6138:b11eea571618
r6138:b11eea571618
r6138:b11eea571618
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5668:e62c2fbafb7b
r5668:e62c2fbafb7b
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6289:e952747c6a2c
r6289:e952747c6a2c
r6289:e952747c6a2c
r6289:e952747c6a2c
r6289:e952747c6a2c
r6289:e952747c6a2c
r6138:b11eea571618
r6138:b11eea571618
r6138:b11eea571618
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r6878:61440e99046f
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6624:8e8cb5121304
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6248:b940b09d7ab8
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6179:c0508e7aefec
r6179:c0508e7aefec
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6231:4cdf70b5a6ea
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6960:e903748e34e4
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r5636:6c8aae9c58e6
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r7454:edae5d345b9c
r6247:96e840dbefcc
r6247:96e840dbefcc
r6247:96e840dbefcc
r6247:96e840dbefcc
r6247:96e840dbefcc
r5636:6c8aae9c58e6
r5587:034e5e185dc2
r5475:3f5cd13d1b63
r6248:b940b09d7ab8
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6248:b940b09d7ab8
r5475:3f5cd13d1b63
r5587:034e5e185dc2
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6179:c0508e7aefec
r6179:c0508e7aefec
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r7643:9ec38df7caf3
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6247:96e840dbefcc
r5475:3f5cd13d1b63
r6377:8544b7560945
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r6247:96e840dbefcc
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r5475:3f5cd13d1b63
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r7545:2cbf405181b3
r6247:96e840dbefcc
r5475:3f5cd13d1b63
r6247:96e840dbefcc
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6179:c0508e7aefec
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5668:e62c2fbafb7b
r6138:b11eea571618
r6247:96e840dbefcc
r6247:96e840dbefcc
r6247:96e840dbefcc
r6247:96e840dbefcc
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5941:09e955ca9251
r5475:3f5cd13d1b63
r6179:c0508e7aefec
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r6248:b940b09d7ab8
r6179:c0508e7aefec
r6248:b940b09d7ab8
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
/* $Id$ */

/** @file gfx.h */

/**
 * @defgroup dirty Dirty
 *
 * Handles the repaint of some part of the screen.
 *
 * Some places in the code are called functions which makes something "dirty".
 * This has nothing to do with making a Tile or Window darker or less visible.
 * This term comes from memory caching and is used to define an object must
 * be repaint. If some data of an object (like a Tile, Window, Vehicle, whatever)
 * are changed which are so extensive the object must be repaint its marked
 * as "dirty". The video driver repaint this object instead of the whole screen
 * (this is btw. also possible if needed). This is used to avoid a
 * flickering of the screen by the video driver constantly repainting it.
 *
 * This whole mechanism is controlled by an rectangle defined in #_invalid_rect. This
 * rectangle defines the area on the screen which must be repaint. If a new object
 * needs to be repainted this rectangle is extended to 'catch' the object on the
 * screen. At some point (which is normaly uninteressted for patch writers) this
 * rectangle is send to the video drivers method
 * VideoDriver::MakeDirty and it is truncated back to an empty rectangle. At some
 * later point (which is uninteressted, too) the video driver
 * repaints all these saved rectangle instead of the whole screen and drop the
 * rectangle informations. Then a new round begins by marking objects "dirty".
 *
 * @see VideoDriver::MakeDirty
 * @see _invalid_rect
 * @see _screen
 */


#ifndef GFX_H
#define GFX_H

#include "openttd.h"
#include "zoom.hpp"

enum WindowKeyCodes {
	WKC_SHIFT = 0x8000,
	WKC_CTRL  = 0x4000,
	WKC_ALT   = 0x2000,
	WKC_META  = 0x1000,

	/* Special ones */
	WKC_NONE        =  0,
	WKC_ESC         =  1,
	WKC_BACKSPACE   =  2,
	WKC_INSERT      =  3,
	WKC_DELETE      =  4,

	WKC_PAGEUP      =  5,
	WKC_PAGEDOWN    =  6,
	WKC_END         =  7,
	WKC_HOME        =  8,

	/* Arrow keys */
	WKC_LEFT        =  9,
	WKC_UP          = 10,
	WKC_RIGHT       = 11,
	WKC_DOWN        = 12,

	/* Return & tab */
	WKC_RETURN      = 13,
	WKC_TAB         = 14,

	/* Space */
	WKC_SPACE       = 32,

	/* Function keys */
	WKC_F1          = 33,
	WKC_F2          = 34,
	WKC_F3          = 35,
	WKC_F4          = 36,
	WKC_F5          = 37,
	WKC_F6          = 38,
	WKC_F7          = 39,
	WKC_F8          = 40,
	WKC_F9          = 41,
	WKC_F10         = 42,
	WKC_F11         = 43,
	WKC_F12         = 44,

	/* Backquote is the key left of "1"
	 * we only store this key here, no matter what character is really mapped to it
	 * on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) */
	WKC_BACKQUOTE   = 45,
	WKC_PAUSE       = 46,

	/* 0-9 are mapped to 48-57
	 * A-Z are mapped to 65-90
	 * a-z are mapped to 97-122 */

	/* Numerical keyboard */
	WKC_NUM_0       = 128,
	WKC_NUM_1       = 129,
	WKC_NUM_2       = 130,
	WKC_NUM_3       = 131,
	WKC_NUM_4       = 132,
	WKC_NUM_5       = 133,
	WKC_NUM_6       = 134,
	WKC_NUM_7       = 135,
	WKC_NUM_8       = 136,
	WKC_NUM_9       = 137,
	WKC_NUM_DIV     = 138,
	WKC_NUM_MUL     = 139,
	WKC_NUM_MINUS   = 140,
	WKC_NUM_PLUS    = 141,
	WKC_NUM_ENTER   = 142,
	WKC_NUM_DECIMAL = 143,

	/* Other keys */
	WKC_SLASH       = 144, ///< / Forward slash
	WKC_SEMICOLON   = 145, ///< ; Semicolon
	WKC_EQUALS      = 146, ///< = Equals
	WKC_L_BRACKET   = 147, ///< [ Left square bracket
	WKC_BACKSLASH   = 148, ///< \ Backslash
	WKC_R_BRACKET   = 149, ///< ] Right square bracket
	WKC_SINGLEQUOTE = 150, ///< ' Single quote
	WKC_COMMA       = 151, ///< , Comma
	WKC_PERIOD      = 152, ///< . Period
	WKC_MINUS       = 153, ///< - Minus
};

enum GameModes {
	GM_MENU,
	GM_NORMAL,
	GM_EDITOR
};

void GameLoop();

void CreateConsole();

typedef int32 CursorID;

struct Point {
	int x, y;
};

struct Rect {
	int left,top,right,bottom;
};

/** A single sprite of a list of animated cursors */
struct AnimCursor {
	static const CursorID LAST = MAX_UVALUE(CursorID);
	CursorID sprite;   ///< Must be set to LAST_ANIM when it is the last sprite of the loop
	byte display_time; ///< Amount of ticks this sprite will be shown
};

struct CursorVars {
	Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement
	Point draw_pos, draw_size;    ///< position and size bounding-box for drawing
	SpriteID sprite; ///< current image of cursor
	SpriteID pal;

	int wheel;       ///< mouse wheel movement

	/* We need two different vars to keep track of how far the scrollwheel moved.
	 * OSX uses this for scrolling around the map. */
	int v_wheel;
	int h_wheel;

	const AnimCursor *animate_list; ///< in case of animated cursor, list of frames
	const AnimCursor *animate_cur;  ///< in case of animated cursor, current frame
	uint animate_timeout;           ///< in case of animated cursor, number of ticks to show the current cursor

	bool visible;    ///< cursor is visible
	bool dirty;      ///< the rect occupied by the mouse is dirty (redraw)
	bool fix_at;     ///< mouse is moving, but cursor is not (used for scrolling)
	bool in_window;  ///< mouse inside this window, determines drawing logic
};

struct DrawPixelInfo {
	void *dst_ptr;
	int left, top, width, height;
	int pitch;
	ZoomLevel zoom;
};

struct Colour {
	byte r;
	byte g;
	byte b;
};



extern byte _dirkeys;        ///< 1 = left, 2 = up, 4 = right, 8 = down
extern bool _fullscreen;
extern CursorVars _cursor;
extern bool _ctrl_pressed;   ///< Is Ctrl pressed?
extern bool _shift_pressed;  ///< Is Shift pressed?
extern byte _fast_forward;

extern bool _left_button_down;
extern bool _left_button_clicked;
extern bool _right_button_down;
extern bool _right_button_clicked;

extern DrawPixelInfo _screen;
extern bool _exit_game;
extern bool _networking;         ///< are we in networking mode?
extern byte _game_mode;
extern byte _pause_game;

extern int _pal_first_dirty;
extern int _pal_count_dirty;
extern int _num_resolutions;
extern uint16 _resolutions[32][2];
extern uint16 _cur_resolution[2];
extern Colour _cur_palette[256];

void HandleKeypress(uint32 key);
void HandleMouseEvents();
void CSleep(int milliseconds);
void UpdateWindows();

uint32 InteractiveRandom(); //< Used for random sequences that are not the same on the other end of the multiplayer link
uint InteractiveRandomRange(uint max);
void DrawChatMessage();
void DrawMouseCursor();
void ScreenSizeChanged();
void HandleExitGameRequest();
void GameSizeChanged();
void UndrawMouseCursor();

#include "helpers.hpp"

enum FontSize {
	FS_NORMAL,
	FS_SMALL,
	FS_LARGE,
	FS_END,
};

DECLARE_POSTFIX_INCREMENT(FontSize);

void RedrawScreenRect(int left, int top, int right, int bottom);
void GfxScroll(int left, int top, int width, int height, int xo, int yo);


/* XXX doesn't really belong here, but the only
 * consumers always use it in conjunction with DoDrawString() */
#define UPARROW   "\xEE\x8A\x80"
#define DOWNARROW "\xEE\x8A\xAA"


int DrawStringCentered(int x, int y, StringID str, uint16 color);
int DrawStringCenteredTruncated(int xl, int xr, int y, StringID str, uint16 color);
int DoDrawStringCentered(int x, int y, const char *str, uint16 color);

int DrawString(int x, int y, StringID str, uint16 color);
int DrawStringTruncated(int x, int y, StringID str, uint16 color, uint maxw);

int DoDrawString(const char *string, int x, int y, uint16 color);
int DoDrawStringTruncated(const char *str, int x, int y, uint16 color, uint maxw);

void DrawStringCenterUnderline(int x, int y, StringID str, uint16 color);
void DrawStringCenterUnderlineTruncated(int xl, int xr, int y, StringID str, uint16 color);

int DrawStringRightAligned(int x, int y, StringID str, uint16 color);
void DrawStringRightAlignedTruncated(int x, int y, StringID str, uint16 color, uint maxw);
void DrawStringRightAlignedUnderline(int x, int y, StringID str, uint16 color);

void GfxFillRect(int left, int top, int right, int bottom, int color);
void GfxDrawLine(int left, int top, int right, int bottom, int color);
void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);

BoundingRect GetStringBoundingBox(const char *str);
uint32 FormatStringLinebreaks(char *str, int maxw);
void LoadStringWidthTable();
void DrawStringMultiCenter(int x, int y, StringID str, int maxw);
uint DrawStringMultiLine(int x, int y, StringID str, int maxw, int maxh = -1);

/**
 * Let the dirty blocks repainting by the video driver.
 *
 * @ingroup dirty
 */
void DrawDirtyBlocks();

/**
 * Set a new dirty block.
 *
 * @ingroup dirty
 */
void SetDirtyBlocks(int left, int top, int right, int bottom);

/**
 * Marks the whole screen as dirty.
 *
 * @ingroup dirty
 */
void MarkWholeScreenDirty();

void GfxInitPalettes();

bool FillDrawPixelInfo(DrawPixelInfo* n, int left, int top, int width, int height);

/* window.cpp */
void DrawOverlappedWindowForAll(int left, int top, int right, int bottom);

void SetMouseCursor(SpriteID sprite, SpriteID pal);
void SetAnimatedMouseCursor(const AnimCursor *table);
void CursorTick();
void DrawMouseCursor();
void ScreenSizeChanged();
void UndrawMouseCursor();
bool ChangeResInGame(int w, int h);
void SortResolutions(int count);
void ToggleFullScreen(bool fs);

/* gfx.cpp */
#define ASCII_LETTERSTART 32
extern FontSize _cur_fontsize;

byte GetCharacterWidth(FontSize size, uint32 key);

static inline byte GetCharacterHeight(FontSize size)
{
	switch (size) {
		default: NOT_REACHED();
		case FS_NORMAL: return 10;
		case FS_SMALL:  return 6;
		case FS_LARGE:  return 18;
	}
}

VARDEF DrawPixelInfo *_cur_dpi;

enum {
	COLOUR_DARK_BLUE,
	COLOUR_PALE_GREEN,
	COLOUR_PINK,
	COLOUR_YELLOW,
	COLOUR_RED,
	COLOUR_LIGHT_BLUE,
	COLOUR_GREEN,
	COLOUR_DARK_GREEN,
	COLOUR_BLUE,
	COLOUR_CREAM,
	COLOUR_MAUVE,
	COLOUR_PURPLE,
	COLOUR_ORANGE,
	COLOUR_BROWN,
	COLOUR_GREY,
	COLOUR_WHITE
};

/**
 * All 16 colour gradients
 * 8 colours per gradient from darkest (0) to lightest (7)
 */
VARDEF byte _colour_gradient[16][8];

VARDEF bool _use_dos_palette;

enum StringColorFlags {
	IS_PALETTE_COLOR = 0x100, ///< color value is already a real palette color index, not an index of a StringColor
};

#endif /* GFX_H */