Mercurial > hg > openttd
changeset 8123:c26c28875749 draft
(svn r11684) -Codechange: split gfx.h in a type and functional header.
line wrap: on
line diff
--- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -1,8 +1,9 @@ /* $Id$ */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../helpers.hpp" +#include "../gfx_func.h" +#include "../zoom_func.h" #include "../debug.h" #include "../table/sprites.h" #include "../video/video_driver.hpp"
--- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -1,7 +1,7 @@ /* $Id$ */ #include "../stdafx.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "32bpp_base.hpp" void *Blitter_32bppBase::MoveTo(const void *video, int x, int y)
--- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -1,8 +1,8 @@ /* $Id$ */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../zoom_func.h" +#include "../gfx_func.h" #include "../debug.h" #include "../table/sprites.h" #include "32bpp_optimized.hpp"
--- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -1,8 +1,8 @@ /* $Id$ */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../gfx_func.h" +#include "../zoom_func.h" #include "../debug.h" #include "../table/sprites.h" #include "32bpp_simple.hpp"
--- a/src/blitter/8bpp_base.cpp +++ b/src/blitter/8bpp_base.cpp @@ -1,7 +1,7 @@ /* $Id$ */ #include "../stdafx.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "8bpp_base.hpp" void Blitter_8bppBase::DrawColorMappingRect(void *dst, int width, int height, int pal)
--- a/src/blitter/8bpp_debug.cpp +++ b/src/blitter/8bpp_debug.cpp @@ -3,8 +3,7 @@ /** @file 8bpp_debug.cpp */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../zoom_func.h" #include "../functions.h" #include "8bpp_debug.hpp"
--- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -3,9 +3,9 @@ /** @file 8bpp_optimized.cpp */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../zoom_func.h" #include "../debug.h" +#include "../helpers.hpp" #include "8bpp_optimized.hpp" static FBlitter_8bppOptimized iFBlitter_8bppOptimized;
--- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -3,8 +3,7 @@ /** @file 8bpp_simple.cpp */ #include "../stdafx.h" -#include "../zoom.hpp" -#include "../gfx.h" +#include "../zoom_func.h" #include "8bpp_simple.hpp" static FBlitter_8bppSimple iFBlitter_8bppSimple;
--- a/src/blitter/base.hpp +++ b/src/blitter/base.hpp @@ -5,7 +5,7 @@ #include "../spritecache.h" #include "../spriteloader/spriteloader.hpp" -#include "../zoom.hpp" +#include "../zoom_type.h" enum BlitterMode { BM_NORMAL,
--- a/src/bmp.cpp +++ b/src/bmp.cpp @@ -4,7 +4,6 @@ #include "stdafx.h" #include "openttd.h" -#include "gfx.h" #include "bmp.h" #include "core/bitmath_func.hpp"
--- a/src/bmp.h +++ b/src/bmp.h @@ -5,6 +5,8 @@ #ifndef BMP_H #define BMP_H +#include "gfx_type.h" + struct BmpInfo { uint32 offset; ///< offset of bitmap data from .bmp file begining uint32 width; ///< bitmap width
--- a/src/bridge.h +++ b/src/bridge.h @@ -5,6 +5,8 @@ #ifndef BRIDGE_H #define BRIDGE_H +#include "gfx_type.h" + enum { MAX_BRIDGES = 13 };
--- a/src/cargotype.h +++ b/src/cargotype.h @@ -6,6 +6,7 @@ #define CARGOTYPE_H #include "cargo_type.h" +#include "gfx_type.h" typedef uint32 CargoLabel;
--- a/src/command.cpp +++ b/src/command.cpp @@ -17,6 +17,7 @@ #include "genworld.h" #include "newgrf_storage.h" #include "strings_func.h" +#include "gfx_func.h" const char *_cmd_text = NULL;
--- a/src/command_type.h +++ b/src/command_type.h @@ -7,6 +7,7 @@ #include "economy_type.h" #include "strings_type.h" +#include "tile_type.h" /** * Common return value for all commands. Wraps the cost and
--- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -18,12 +18,6 @@ #endif /** - * The largest value that can be entered in a variable - * @param type the type of the variable - */ -#define MAX_UVALUE(type) ((type)~(type)0) - -/** * Returns the maximum of two values. * * This function returns the greater value of two given values.
--- a/src/engine.h +++ b/src/engine.h @@ -10,6 +10,7 @@ #include "cargo_type.h" #include "vehicle_type.h" #include "command_type.h" +#include "gfx_type.h" #include "sound.h" enum RailVehicleTypes {
--- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -14,6 +14,7 @@ #include "helpers.hpp" #include "spriteloader/spriteloader.hpp" #include "blitter/factory.hpp" +#include "gfx_func.h" #ifdef WITH_FREETYPE
--- a/src/fontcache.h +++ b/src/fontcache.h @@ -3,7 +3,7 @@ #ifndef FONTCACHE_H #define FONTCACHE_H -#include "gfx.h" +#include "gfx_type.h" /** Get the SpriteID mapped to the given font size and key */ SpriteID GetUnicodeGlyph(FontSize size, uint32 key);
--- a/src/functions.h +++ b/src/functions.h @@ -8,6 +8,7 @@ #include "core/random_func.hpp" #include "command_type.h" #include "window_type.h" +#include "openttd.h" void UpdateTownMaxPass(Town *t);
--- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -5,7 +5,7 @@ #include "stdafx.h" #include "openttd.h" #include "functions.h" -#include "gfx.h" +#include "gfx_func.h" #include "spritecache.h" #include "string.h" #include "table/palettes.h" @@ -15,7 +15,7 @@ #include "fontcache.h" #include "genworld.h" #include "debug.h" -#include "zoom.hpp" +#include "zoom_func.h" #include "texteff.hpp" #include "blitter/factory.hpp" #include "video/video_driver.hpp" @@ -41,6 +41,9 @@ Colour _cur_palette[256]; byte _stringwidth_table[FS_END][224]; +DrawPixelInfo *_cur_dpi; +byte _colour_gradient[16][8]; +bool _use_dos_palette; static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = NULL); @@ -561,7 +564,7 @@ * @param x offset from left side of the screen, if negative offset from the right side * @param y offset from top side of the screen, if negative offset from the bottom * @param real_color colour of the string, see _string_colormap in - * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx.h + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * @return the x-coordinates where the drawing has finished. If nothing is drawn * the originally passed x-coordinate is returned */ int DoDrawString(const char *string, int x, int y, uint16 real_color)
deleted file mode 100644 --- a/src/gfx.h +++ /dev/null @@ -1,378 +0,0 @@ -/* $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 "core/math_func.hpp" -#include "core/geometry_type.hpp" -#include "core/enum_type.hpp" -#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 -}; - -void GameLoop(); - -void CreateConsole(); - -/** 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 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(); - -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); - -/** - * Used to only draw a part of the sprite. - * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom). - * Both corners are included in the drawing area. - */ -struct SubSprite { - int left, top, right, bottom; -}; - -void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub = NULL); - -/* 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); - -Dimension 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 -}; - -/** Colour of the strings, see _string_colormap in table/palettes.h or docs/ottd-colourtext-palette.png */ -enum TextColour { - TC_FROMSTRING = 0x00, - TC_BLUE = 0x00, - TC_SILVER = 0x01, - TC_GOLD = 0x02, - TC_RED = 0x03, - TC_PURPLE = 0x04, - TC_LIGHT_BROWN = 0x05, - TC_ORANGE = 0x06, - TC_GREEN = 0x07, - TC_YELLOW = 0x08, - TC_DARK_GREEN = 0x09, - TC_CREAM = 0x0A, - TC_BROWN = 0x0B, - TC_WHITE = 0x0C, - TC_LIGHT_BLUE = 0x0D, - TC_GREY = 0x0E, - TC_DARK_BLUE = 0x0F, - TC_BLACK = 0x10, -}; - -/** - * 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 */
new file mode 100644 --- /dev/null +++ b/src/gfx_func.h @@ -0,0 +1,182 @@ +/* $Id$ */ + +/** @file gfx_func.h Functions related to the gfx engine. */ + +/** + * @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_FUNC_H +#define GFX_FUNC_H + +#include "gfx_type.h" +#include "strings_type.h" + +void GameLoop(); + +void CreateConsole(); + +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 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(); + +void RedrawScreenRect(int left, int top, int right, int bottom); +void GfxScroll(int left, int top, int width, int height, int xo, int yo); + +void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub = NULL); + +/* 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); + +Dimension 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; + } +} + +extern DrawPixelInfo *_cur_dpi; + +/** + * All 16 colour gradients + * 8 colours per gradient from darkest (0) to lightest (7) + */ +extern byte _colour_gradient[16][8]; + +extern bool _use_dos_palette; + +#endif /* GFX_FUNC_H */
new file mode 100644 --- /dev/null +++ b/src/gfx_type.h @@ -0,0 +1,210 @@ +/* $Id$ */ + +/** @file gfx_type.h Types related to the graphics and/or input devices. */ + +#ifndef GFX_TYPE_H +#define GFX_TYPE_H + +#include "core/enum_type.hpp" +#include "core/geometry_type.hpp" +#include "zoom_type.h" + +typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables +struct PalSpriteID { + SpriteID sprite; + SpriteID pal; +}; +typedef int32 CursorID; + +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 +}; + +/** 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; +}; + +enum FontSize { + FS_NORMAL, + FS_SMALL, + FS_LARGE, + FS_END, +}; +DECLARE_POSTFIX_INCREMENT(FontSize); + +/** + * Used to only draw a part of the sprite. + * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom). + * Both corners are included in the drawing area. + */ +struct SubSprite { + int left, top, right, bottom; +}; + +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 +}; + +/** Colour of the strings, see _string_colormap in table/palettes.h or docs/ottd-colourtext-palette.png */ +enum TextColour { + TC_FROMSTRING = 0x00, + TC_BLUE = 0x00, + TC_SILVER = 0x01, + TC_GOLD = 0x02, + TC_RED = 0x03, + TC_PURPLE = 0x04, + TC_LIGHT_BROWN = 0x05, + TC_ORANGE = 0x06, + TC_GREEN = 0x07, + TC_YELLOW = 0x08, + TC_DARK_GREEN = 0x09, + TC_CREAM = 0x0A, + TC_BROWN = 0x0B, + TC_WHITE = 0x0C, + TC_LIGHT_BLUE = 0x0D, + TC_GREY = 0x0E, + TC_DARK_BLUE = 0x0F, + TC_BLACK = 0x10, +}; + +enum StringColorFlags { + IS_PALETTE_COLOR = 0x100, ///< color value is already a real palette color index, not an index of a StringColor +}; + +#endif /* GFX_TYPE_H */
--- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -16,6 +16,7 @@ #include "md5.h" #include "variables.h" #include "fontcache.h" +#include "gfx_func.h" #include <string.h> struct MD5File {
--- a/src/gfxinit.h +++ b/src/gfxinit.h @@ -5,6 +5,8 @@ #ifndef GFXINIT_H #define GFXINIT_H +#include "gfx_type.h" + void CheckExternalFiles(); void GfxLoadSprites(); void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl);
--- a/src/gui.h +++ b/src/gui.h @@ -8,7 +8,7 @@ #include "string.h" #include "window_type.h" #include "vehicle_type.h" -#include "gfx.h" +#include "gfx_type.h" /* main_gui.cpp */ void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2);
--- a/src/heightmap.cpp +++ b/src/heightmap.cpp @@ -15,6 +15,7 @@ #include "saveload.h" #include "bmp.h" #include "helpers.hpp" +#include "gfx_func.h" /** * Convert RGB colors to Grayscale using 29.9% Red, 58.7% Green, 11.4% Blue
--- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -50,6 +50,7 @@ #include "industry.h" #include "transparency.h" #include "strings_func.h" +#include "zoom_func.h" static int _rename_id = 1; static int _rename_what = -1;
--- a/src/misc.cpp +++ b/src/misc.cpp @@ -25,6 +25,7 @@ #include "group.h" #include "viewport.h" #include "economy_func.h" +#include "zoom_func.h" char _name_array[512][32];
--- a/src/misc/dbg_helpers.cpp +++ b/src/misc/dbg_helpers.cpp @@ -2,6 +2,7 @@ /** @file dbg_helpers.cpp */ #include "../stdafx.h" +#include "../openttd.h" #include "../direction_type.h" #include "../rail.h" #include "../rail_map.h"
--- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -19,6 +19,7 @@ #include "player_face.h" #include "strings_func.h" #include "vehicle.h" +#include "gfx_func.h" /** Change the player's face. * @param tile unused
--- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -40,6 +40,7 @@ #include "fileio.h" #include "fios.h" #include "tile_cmd.h" +#include "zoom_func.h" /* Variables to display file lists */ FiosItem *_fios_list;
--- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -19,7 +19,6 @@ #include "../gui.h" #include "../window_gui.h" #include "../textbuf_gui.h" -#include "../gfx.h" #include "../variables.h" #include "network_server.h" #include "network_udp.h"
--- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -47,6 +47,7 @@ #include "fios.h" #include "rail.h" #include "strings_func.h" +#include "gfx_func.h" /* TTDPatch extended GRF format codec * (c) Petr Baudis 2004 (GPL'd)
--- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -23,7 +23,7 @@ #include "cargotype.h" #include "town_map.h" #include "newgrf_town.h" -#include "gfx.h" +#include "gfx_func.h" static StationClass station_classes[STAT_CLASS_MAX];
--- a/src/oldloader.cpp +++ b/src/oldloader.cpp @@ -24,7 +24,7 @@ #include "newgrf_config.h" #include "ai/ai.h" #include "date.h" -#include "zoom.hpp" +#include "zoom_func.h" enum { HEADER_SIZE = 49,
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -64,6 +64,7 @@ #include "music/music_driver.hpp" #include "video/video_driver.hpp" #include "strings_func.h" +#include "zoom_func.h" #include "bridge_map.h" #include "clear_map.h"
--- a/src/openttd.h +++ b/src/openttd.h @@ -26,12 +26,6 @@ struct Group; typedef byte VehicleOrderID; ///< The index of an order within its current vehicle (not pool related) typedef byte LandscapeID; -typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables -struct PalSpriteID { - SpriteID sprite; - SpriteID pal; -}; -typedef int32 CursorID; typedef uint16 EngineID; typedef uint16 UnitID;
--- a/src/os/macosx/splash.cpp +++ b/src/os/macosx/splash.cpp @@ -5,7 +5,7 @@ #include "../../variables.h" #include "../../debug.h" #include "../../functions.h" -#include "../../gfx.h" +#include "../../gfx_func.h" #include "../../fileio.h" #include "../../blitter/factory.hpp"
--- a/src/players.cpp +++ b/src/players.cpp @@ -29,7 +29,7 @@ #include "window_func.h" #include "tile_map.h" #include "strings_func.h" -#include "gfx.h" +#include "gfx_func.h" /** * Sets the local player and updates the patch settings that are set on a
--- a/src/rail.h +++ b/src/rail.h @@ -8,9 +8,10 @@ #include "rail_type.h" #include "track_type.h" #include "vehicle_type.h" +#include "gfx_type.h" #include "core/bitmath_func.hpp" +#include "economy_func.h" #include "variables.h" -#include "economy_func.h" /** This struct contains all the info that is needed to draw and construct tracks. */
--- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -28,6 +28,7 @@ #include "table/strings.h" #include "window_func.h" #include "strings_func.h" +#include "gfx_func.h" #include <list> extern const uint16 SAVEGAME_VERSION = 83;
--- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -16,6 +16,7 @@ #include "blitter/factory.hpp" #include "fileio.h" #include "strings_func.h" +#include "zoom_func.h" char _screenshot_format_name[8]; uint _num_screenshot_formats;
--- a/src/signs.cpp +++ b/src/signs.cpp @@ -16,6 +16,7 @@ #include "misc/autoptr.hpp" #include "strings_func.h" #include "viewport.h" +#include "zoom_func.h" SignID _new_sign_id; uint _total_signs;
--- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -27,6 +27,7 @@ #include "blitter/factory.hpp" #include "tunnelbridge_map.h" #include "strings_func.h" +#include "zoom_func.h" static const Widget _smallmap_widgets[] = {
--- a/src/sprite.h +++ b/src/sprite.h @@ -5,6 +5,8 @@ #ifndef SPRITE_H #define SPRITE_H +#include "gfx_type.h" + #define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START) #define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner]))
--- a/src/spritecache.h +++ b/src/spritecache.h @@ -5,6 +5,8 @@ #ifndef SPRITECACHE_H #define SPRITECACHE_H +#include "gfx_type.h" + struct Sprite { byte height; uint16 width;
--- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -3,7 +3,7 @@ /** @file grf.cpp */ #include "../stdafx.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../fileio.h" #include "../debug.h" #include "grf.hpp"
--- a/src/spriteloader/png.cpp +++ b/src/spriteloader/png.cpp @@ -5,7 +5,7 @@ #ifdef WITH_PNG #include "../stdafx.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../fileio.h" #include "../variables.h" #include "../debug.h"
--- a/src/station.cpp +++ b/src/station.cpp @@ -32,6 +32,7 @@ #include "cargotype.h" #include "roadveh.h" #include "station_gui.h" +#include "zoom_func.h" Station::Station(TileIndex tile) {
--- a/src/stdafx.h +++ b/src/stdafx.h @@ -374,4 +374,10 @@ #define MAX_PATH 260 #endif +/** + * The largest value that can be entered in a variable + * @param type the type of the variable + */ +#define MAX_UVALUE(type) ((type)~(type)0) + #endif /* STDAFX_H */
--- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -32,6 +32,8 @@ * @todo Split the "Sprites" enum into smaller chunks and document them */ +#include "../gfx_type.h" + enum Sprites { SPR_SELECT_TILE = 752, SPR_DOT = 774, // corner marker for lower/raise land
--- a/src/transparency.h +++ b/src/transparency.h @@ -5,6 +5,8 @@ #ifndef TRANSPARENCY_H #define TRANSPARENCY_H +#include "gfx_func.h" + /** * Transparency option bits: which position in _transparency_opt stands for which transparency. * If you change the order, change the order of the ShowTransparencyToolbar() stuff in transparency_gui.cpp too.
--- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -42,6 +42,7 @@ #include "group.h" #include "order.h" #include "strings_func.h" +#include "zoom_func.h" #define INVALID_COORD (0x7fffffff) #define GEN_HASH(x, y) ((GB((y), 6, 6) << 6) + GB((x), 7, 6))
--- a/src/vehicle.h +++ b/src/vehicle.h @@ -6,16 +6,17 @@ #define VEHICLE_H #include "vehicle_type.h" -#include "oldpool.h" -#include "order.h" #include "track_type.h" #include "rail_type.h" #include "road_type.h" #include "cargo_type.h" #include "window_type.h" +#include "gfx_type.h" +#include "command_type.h" +#include "oldpool.h" +#include "order.h" #include "cargopacket.h" #include "texteff.hpp" -#include "command_type.h" /** Road vehicle states */ enum RoadVehicleStates {
--- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -7,7 +7,7 @@ #include "../openttd.h" #include "../debug.h" #include "../functions.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../network/network.h" #include "../console.h" #include "../variables.h"
--- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -2,7 +2,7 @@ #include "../stdafx.h" #include "../openttd.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../variables.h" #include "../debug.h" #include "../blitter/factory.hpp"
--- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -7,7 +7,7 @@ #include "../openttd.h" #include "../debug.h" #include "../functions.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../sdl.h" #include "../variables.h" #include "../blitter/factory.hpp"
--- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -3,7 +3,7 @@ #include "../stdafx.h" #include "../openttd.h" #include "../functions.h" -#include "../gfx.h" +#include "../gfx_func.h" #include "../variables.h" #include "../win32.h" #include "../blitter/factory.hpp"
--- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -25,6 +25,7 @@ #include "blitter/factory.hpp" #include "transparency.h" #include "strings_func.h" +#include "zoom_func.h" #define VIEWPORT_DRAW_MEM (65536 * 2)
--- a/src/viewport.h +++ b/src/viewport.h @@ -5,10 +5,10 @@ #ifndef VIEWPORT_H #define VIEWPORT_H -#include "zoom.hpp" +#include "zoom_type.h" #include "window_type.h" #include "vehicle_type.h" -#include "gfx.h" +#include "gfx_func.h" struct ViewPort { int left,top; // screen coordinates for the viewport
--- a/src/window.cpp +++ b/src/window.cpp @@ -17,6 +17,7 @@ #include "helpers.hpp" #include "blitter/factory.hpp" #include "window_gui.h" +#include "zoom_func.h" /* delta between mouse cursor and upper left corner of dragged window */ static Point _drag_delta;
deleted file mode 100644 --- a/src/zoom.hpp +++ /dev/null @@ -1,94 +0,0 @@ -/* $Id$ */ - -/** @file zoom.hpp */ - -#ifndef ZOOM_HPP -#define ZOOM_HPP - -#include "core/enum_type.hpp" - -enum ZoomLevel { - /* Our possible zoom-levels */ - ZOOM_LVL_BEGIN = 0, - ZOOM_LVL_NORMAL = 0, - ZOOM_LVL_OUT_2X, - ZOOM_LVL_OUT_4X, - ZOOM_LVL_OUT_8X, - ZOOM_LVL_END, - - /* Here we define in which zoom viewports are */ - ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL, - ZOOM_LVL_NEWS = ZOOM_LVL_NORMAL, - ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X, - ZOOM_LVL_TOWN = ZOOM_LVL_OUT_2X, - ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL, - ZOOM_LVL_SHIP = ZOOM_LVL_NORMAL, - ZOOM_LVL_TRAIN = ZOOM_LVL_NORMAL, - ZOOM_LVL_ROADVEH = ZOOM_LVL_NORMAL, - ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL, - - ZOOM_LVL_DETAIL = ZOOM_LVL_OUT_2X, ///< All zoomlevels below or equal to this, will result in details on the screen, like road-work, ... - - ZOOM_LVL_MIN = ZOOM_LVL_NORMAL, - ZOOM_LVL_MAX = ZOOM_LVL_OUT_8X, -}; - -extern ZoomLevel _saved_scrollpos_zoom; - -DECLARE_POSTFIX_INCREMENT(ZoomLevel) - -/** - * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) - * When shifting right, value is rounded up - * @param value value to shift - * @param zoom zoom level to shift to - * @return shifted value - */ -static inline int ScaleByZoom(int value, ZoomLevel zoom) -{ - if (zoom == ZOOM_LVL_NORMAL) return value; - int izoom = zoom - ZOOM_LVL_NORMAL; - return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : (value + (1 << -izoom) - 1) >> -izoom; -} - -/** - * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) - * When shifting right, value is rounded up - * @param value value to shift - * @param zoom zoom level to shift to - * @return shifted value - */ -static inline int UnScaleByZoom(int value, ZoomLevel zoom) -{ - if (zoom == ZOOM_LVL_NORMAL) return value; - int izoom = zoom - ZOOM_LVL_NORMAL; - return (zoom > ZOOM_LVL_NORMAL) ? (value + (1 << izoom) - 1) >> izoom : value << -izoom; -} - -/** - * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) - * @param value value to shift - * @param zoom zoom level to shift to - * @return shifted value - */ -static inline int ScaleByZoomLower(int value, ZoomLevel zoom) -{ - if (zoom == ZOOM_LVL_NORMAL) return value; - int izoom = zoom - ZOOM_LVL_NORMAL; - return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom; -} - -/** - * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) - * @param value value to shift - * @param zoom zoom level to shift to - * @return shifted value - */ -static inline int UnScaleByZoomLower(int value, ZoomLevel zoom) -{ - if (zoom == ZOOM_LVL_NORMAL) return value; - int izoom = zoom - ZOOM_LVL_NORMAL; - return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom; -} - -#endif /* ZOOM_HPP */
new file mode 100644 --- /dev/null +++ b/src/zoom_func.h @@ -0,0 +1,66 @@ +/* $Id$ */ + +/** @file zoom.hpp */ + +#ifndef ZOOM_FUNC_H +#define ZOOM_FUNC_H + +#include "zoom_type.h" + +extern ZoomLevel _saved_scrollpos_zoom; + +/** + * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) + * When shifting right, value is rounded up + * @param value value to shift + * @param zoom zoom level to shift to + * @return shifted value + */ +static inline int ScaleByZoom(int value, ZoomLevel zoom) +{ + if (zoom == ZOOM_LVL_NORMAL) return value; + int izoom = zoom - ZOOM_LVL_NORMAL; + return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : (value + (1 << -izoom) - 1) >> -izoom; +} + +/** + * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) + * When shifting right, value is rounded up + * @param value value to shift + * @param zoom zoom level to shift to + * @return shifted value + */ +static inline int UnScaleByZoom(int value, ZoomLevel zoom) +{ + if (zoom == ZOOM_LVL_NORMAL) return value; + int izoom = zoom - ZOOM_LVL_NORMAL; + return (zoom > ZOOM_LVL_NORMAL) ? (value + (1 << izoom) - 1) >> izoom : value << -izoom; +} + +/** + * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) + * @param value value to shift + * @param zoom zoom level to shift to + * @return shifted value + */ +static inline int ScaleByZoomLower(int value, ZoomLevel zoom) +{ + if (zoom == ZOOM_LVL_NORMAL) return value; + int izoom = zoom - ZOOM_LVL_NORMAL; + return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom; +} + +/** + * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) + * @param value value to shift + * @param zoom zoom level to shift to + * @return shifted value + */ +static inline int UnScaleByZoomLower(int value, ZoomLevel zoom) +{ + if (zoom == ZOOM_LVL_NORMAL) return value; + int izoom = zoom - ZOOM_LVL_NORMAL; + return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom; +} + +#endif /* ZOOM_FUNC_H */
new file mode 100644 --- /dev/null +++ b/src/zoom_type.h @@ -0,0 +1,37 @@ +/* $Id$ */ + +/** @file zoom_type.h Types related to zooming in and out. */ + +#ifndef ZOOM_TYPE_H +#define ZOOM_TYPE_H + +#include "core/enum_type.hpp" + +enum ZoomLevel { + /* Our possible zoom-levels */ + ZOOM_LVL_BEGIN = 0, + ZOOM_LVL_NORMAL = 0, + ZOOM_LVL_OUT_2X, + ZOOM_LVL_OUT_4X, + ZOOM_LVL_OUT_8X, + ZOOM_LVL_END, + + /* Here we define in which zoom viewports are */ + ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL, + ZOOM_LVL_NEWS = ZOOM_LVL_NORMAL, + ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X, + ZOOM_LVL_TOWN = ZOOM_LVL_OUT_2X, + ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL, + ZOOM_LVL_SHIP = ZOOM_LVL_NORMAL, + ZOOM_LVL_TRAIN = ZOOM_LVL_NORMAL, + ZOOM_LVL_ROADVEH = ZOOM_LVL_NORMAL, + ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL, + + ZOOM_LVL_DETAIL = ZOOM_LVL_OUT_2X, ///< All zoomlevels below or equal to this, will result in details on the screen, like road-work, ... + + ZOOM_LVL_MIN = ZOOM_LVL_NORMAL, + ZOOM_LVL_MAX = ZOOM_LVL_OUT_8X, +}; +DECLARE_POSTFIX_INCREMENT(ZoomLevel) + +#endif /* ZOOM_TYPE_H */