rubidium@8123: /* $Id$ */ rubidium@8123: rubidium@8123: /** @file gfx_type.h Types related to the graphics and/or input devices. */ rubidium@8123: rubidium@8123: #ifndef GFX_TYPE_H rubidium@8123: #define GFX_TYPE_H rubidium@8123: smatz@9551: #include "core/endian_type.hpp" rubidium@8123: #include "core/enum_type.hpp" rubidium@8123: #include "core/geometry_type.hpp" rubidium@8123: #include "zoom_type.h" rubidium@8123: rubidium@8123: typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables rubidium@9773: rubidium@10233: /** Combination of a palette sprite and a 'real' sprite */ rubidium@8123: struct PalSpriteID { rubidium@10233: SpriteID sprite; ///< The 'real' sprite rubidium@10233: SpriteID pal; ///< The palette (use \c PAL_NONE) if not needed) rubidium@8123: }; rubidium@8123: typedef int32 CursorID; rubidium@8123: rubidium@8123: enum WindowKeyCodes { rubidium@8123: WKC_SHIFT = 0x8000, rubidium@8123: WKC_CTRL = 0x4000, rubidium@8123: WKC_ALT = 0x2000, rubidium@8123: WKC_META = 0x1000, rubidium@8123: rubidium@8123: /* Special ones */ rubidium@8123: WKC_NONE = 0, rubidium@8123: WKC_ESC = 1, rubidium@8123: WKC_BACKSPACE = 2, rubidium@8123: WKC_INSERT = 3, rubidium@8123: WKC_DELETE = 4, rubidium@8123: rubidium@8123: WKC_PAGEUP = 5, rubidium@8123: WKC_PAGEDOWN = 6, rubidium@8123: WKC_END = 7, rubidium@8123: WKC_HOME = 8, rubidium@8123: rubidium@8123: /* Arrow keys */ rubidium@8123: WKC_LEFT = 9, rubidium@8123: WKC_UP = 10, rubidium@8123: WKC_RIGHT = 11, rubidium@8123: WKC_DOWN = 12, rubidium@8123: rubidium@8123: /* Return & tab */ rubidium@8123: WKC_RETURN = 13, rubidium@8123: WKC_TAB = 14, rubidium@8123: rubidium@8123: /* Space */ rubidium@8123: WKC_SPACE = 32, rubidium@8123: rubidium@8123: /* Function keys */ rubidium@8123: WKC_F1 = 33, rubidium@8123: WKC_F2 = 34, rubidium@8123: WKC_F3 = 35, rubidium@8123: WKC_F4 = 36, rubidium@8123: WKC_F5 = 37, rubidium@8123: WKC_F6 = 38, rubidium@8123: WKC_F7 = 39, rubidium@8123: WKC_F8 = 40, rubidium@8123: WKC_F9 = 41, rubidium@8123: WKC_F10 = 42, rubidium@8123: WKC_F11 = 43, rubidium@8123: WKC_F12 = 44, rubidium@8123: rubidium@8123: /* Backquote is the key left of "1" rubidium@8123: * we only store this key here, no matter what character is really mapped to it rubidium@8123: * on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) */ rubidium@8123: WKC_BACKQUOTE = 45, rubidium@8123: WKC_PAUSE = 46, rubidium@8123: rubidium@8123: /* 0-9 are mapped to 48-57 rubidium@8123: * A-Z are mapped to 65-90 rubidium@8123: * a-z are mapped to 97-122 */ rubidium@8123: rubidium@8123: /* Numerical keyboard */ rubidium@8123: WKC_NUM_DIV = 138, rubidium@8123: WKC_NUM_MUL = 139, rubidium@8123: WKC_NUM_MINUS = 140, rubidium@8123: WKC_NUM_PLUS = 141, rubidium@8123: WKC_NUM_ENTER = 142, rubidium@8123: WKC_NUM_DECIMAL = 143, rubidium@8123: rubidium@8123: /* Other keys */ rubidium@8123: WKC_SLASH = 144, ///< / Forward slash rubidium@8123: WKC_SEMICOLON = 145, ///< ; Semicolon rubidium@8123: WKC_EQUALS = 146, ///< = Equals rubidium@8123: WKC_L_BRACKET = 147, ///< [ Left square bracket rubidium@8123: WKC_BACKSLASH = 148, ///< \ Backslash rubidium@8123: WKC_R_BRACKET = 149, ///< ] Right square bracket rubidium@8123: WKC_SINGLEQUOTE = 150, ///< ' Single quote rubidium@8123: WKC_COMMA = 151, ///< , Comma rubidium@8123: WKC_PERIOD = 152, ///< . Period rubidium@8123: WKC_MINUS = 153, ///< - Minus rubidium@8123: }; rubidium@8123: rubidium@8123: /** A single sprite of a list of animated cursors */ rubidium@8123: struct AnimCursor { rubidium@8123: static const CursorID LAST = MAX_UVALUE(CursorID); rubidium@8123: CursorID sprite; ///< Must be set to LAST_ANIM when it is the last sprite of the loop rubidium@8123: byte display_time; ///< Amount of ticks this sprite will be shown rubidium@8123: }; rubidium@8123: rubidium@9773: /** Collection of variables for cursor-display and -animation */ rubidium@8123: struct CursorVars { rubidium@8123: Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement rubidium@8123: Point draw_pos, draw_size; ///< position and size bounding-box for drawing rubidium@9670: int short_vehicle_offset; ///< offset of the X for short vehicles rubidium@8123: SpriteID sprite; ///< current image of cursor rubidium@8123: SpriteID pal; rubidium@8123: rubidium@8123: int wheel; ///< mouse wheel movement rubidium@8123: rubidium@8123: /* We need two different vars to keep track of how far the scrollwheel moved. rubidium@8123: * OSX uses this for scrolling around the map. */ rubidium@8123: int v_wheel; rubidium@8123: int h_wheel; rubidium@8123: rubidium@8123: const AnimCursor *animate_list; ///< in case of animated cursor, list of frames rubidium@8123: const AnimCursor *animate_cur; ///< in case of animated cursor, current frame rubidium@8123: uint animate_timeout; ///< in case of animated cursor, number of ticks to show the current cursor rubidium@8123: rubidium@8123: bool visible; ///< cursor is visible rubidium@8123: bool dirty; ///< the rect occupied by the mouse is dirty (redraw) rubidium@8123: bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling) rubidium@8123: bool in_window; ///< mouse inside this window, determines drawing logic smatz@8828: smatz@8828: bool vehchain; ///< vehicle chain is dragged rubidium@8123: }; rubidium@8123: rubidium@8123: struct DrawPixelInfo { rubidium@8123: void *dst_ptr; rubidium@8123: int left, top, width, height; rubidium@8123: int pitch; rubidium@8123: ZoomLevel zoom; rubidium@8123: }; rubidium@8123: rubidium@8123: struct Colour { smatz@9551: #if TTD_ENDIAN == TTD_BIG_ENDIAN smatz@9551: uint8 a, r, g, b; ///< colour channels in BE order smatz@9551: #else smatz@9551: uint8 b, g, r, a; ///< colour channels in LE order smatz@9551: #endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */ smatz@9551: smatz@9597: operator uint32 () const { return *(uint32 *)this; } rubidium@8123: }; rubidium@8123: rubidium@9773: /** Available font sizes */ rubidium@8123: enum FontSize { rubidium@8123: FS_NORMAL, rubidium@8123: FS_SMALL, rubidium@8123: FS_LARGE, rubidium@8123: FS_END, rubidium@8123: }; rubidium@8123: DECLARE_POSTFIX_INCREMENT(FontSize); rubidium@8123: rubidium@8123: /** rubidium@8123: * Used to only draw a part of the sprite. rubidium@8123: * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom). rubidium@8123: * Both corners are included in the drawing area. rubidium@8123: */ rubidium@8123: struct SubSprite { rubidium@8123: int left, top, right, bottom; rubidium@8123: }; rubidium@8123: rubidium@9044: enum Colours { rubidium@8123: COLOUR_DARK_BLUE, rubidium@8123: COLOUR_PALE_GREEN, rubidium@8123: COLOUR_PINK, rubidium@8123: COLOUR_YELLOW, rubidium@8123: COLOUR_RED, rubidium@8123: COLOUR_LIGHT_BLUE, rubidium@8123: COLOUR_GREEN, rubidium@8123: COLOUR_DARK_GREEN, rubidium@8123: COLOUR_BLUE, rubidium@8123: COLOUR_CREAM, rubidium@8123: COLOUR_MAUVE, rubidium@8123: COLOUR_PURPLE, rubidium@8123: COLOUR_ORANGE, rubidium@8123: COLOUR_BROWN, rubidium@8123: COLOUR_GREY, rubidium@9044: COLOUR_WHITE, rubidium@9044: COLOUR_END, belugas@9870: INVALID_COLOUR = 0xFF, rubidium@8123: }; rubidium@8123: rubidium@8123: /** Colour of the strings, see _string_colormap in table/palettes.h or docs/ottd-colourtext-palette.png */ rubidium@8123: enum TextColour { rubidium@8123: TC_FROMSTRING = 0x00, rubidium@8123: TC_BLUE = 0x00, rubidium@8123: TC_SILVER = 0x01, rubidium@8123: TC_GOLD = 0x02, rubidium@8123: TC_RED = 0x03, rubidium@8123: TC_PURPLE = 0x04, rubidium@8123: TC_LIGHT_BROWN = 0x05, rubidium@8123: TC_ORANGE = 0x06, rubidium@8123: TC_GREEN = 0x07, rubidium@8123: TC_YELLOW = 0x08, rubidium@8123: TC_DARK_GREEN = 0x09, rubidium@8123: TC_CREAM = 0x0A, rubidium@8123: TC_BROWN = 0x0B, rubidium@8123: TC_WHITE = 0x0C, rubidium@8123: TC_LIGHT_BLUE = 0x0D, rubidium@8123: TC_GREY = 0x0E, rubidium@8123: TC_DARK_BLUE = 0x0F, rubidium@8123: TC_BLACK = 0x10, belugas@9879: TC_INVALID = 0xFF, rubidium@8123: }; rubidium@8123: belugas@9870: /** Defines a few values that are related to animations using palette changes */ belugas@9870: enum PaletteAnimationSizes { belugas@9870: PALETTE_ANIM_SIZE_WIN = 28, ///< number of animated colours in Windows palette belugas@9870: PALETTE_ANIM_SIZE_DOS = 38, ///< number of animated colours in DOS palette belugas@9870: PALETTE_ANIM_SIZE_START = 217, ///< Index in the _palettes array from which all animations are taking places (table/palettes.h) belugas@9870: }; belugas@9870: rubidium@8123: enum StringColorFlags { rubidium@8123: IS_PALETTE_COLOR = 0x100, ///< color value is already a real palette color index, not an index of a StringColor rubidium@8123: }; rubidium@8123: frosch@9607: /** Define the operation GfxFillRect performs */ frosch@9607: enum FillRectMode { frosch@9607: FILLRECT_OPAQUE, ///< Fill rectangle with a single color frosch@9607: FILLRECT_CHECKER, ///< Draw only every second pixel, used for greying-out frosch@9607: FILLRECT_RECOLOR, ///< Apply a recolor sprite to the screen content frosch@9607: }; frosch@9607: rubidium@9989: /** Palettes OpenTTD supports. */ rubidium@9995: enum PaletteType { rubidium@9989: PAL_DOS, ///< Use the DOS palette. rubidium@9989: PAL_WINDOWS, ///< Use the Windows palette. rubidium@9989: PAL_AUTODETECT, ///< Automatically detect the palette based on the graphics pack. rubidium@9989: MAX_PAL = 2, ///< The number of palettes. rubidium@9989: }; rubidium@9989: rubidium@10056: /** Types of sprites that might be loaded */ rubidium@10056: enum SpriteType { rubidium@10056: ST_NORMAL = 0, ///< The most basic (normal) sprite rubidium@10056: ST_MAPGEN = 1, ///< Special sprite for the map generator rubidium@10056: ST_FONT = 2, ///< A sprite used for fonts rubidium@10056: ST_RECOLOUR = 3, ///< Recolour sprite rubidium@10056: }; rubidium@10056: rubidium@8123: #endif /* GFX_TYPE_H */