Mercurial > hg > openttd
view src/gfx.cpp @ 14258:a899d4e5ee1a draft
(svn r18809) -Codechange/Cleanup: remove unneeded headers from some files, if a header require a header make it include that header
author | rubidium <rubidium@openttd.org> |
---|---|
date | Fri, 15 Jan 2010 16:41:15 +0000 |
parents | 4e1b1256b52f |
children | 72cb3c72d619 |
line wrap: on
line source
/* $Id$ */ /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. */ /** @file gfx.cpp Handling of drawing text and other gfx related stuff. */ #include "stdafx.h" #include "gfx_func.h" #include "variables.h" #include "fontcache.h" #include "genworld.h" #include "zoom_func.h" #include "blitter/factory.hpp" #include "video/video_driver.hpp" #include "strings_func.h" #include "settings_type.h" #include "landscape_type.h" #include "network/network.h" #include "network/network_func.h" #include "thread/thread.h" #include "window_func.h" #include "table/palettes.h" #include "table/sprites.h" #include "table/control_codes.h" byte _dirkeys; ///< 1 = left, 2 = up, 4 = right, 8 = down bool _fullscreen; CursorVars _cursor; bool _ctrl_pressed; ///< Is Ctrl pressed? bool _shift_pressed; ///< Is Shift pressed? byte _fast_forward; bool _left_button_down; ///< Is left mouse button pressed? bool _left_button_clicked; ///< Is left mouse button clicked? bool _right_button_down; ///< Is right mouse button pressed? bool _right_button_clicked; ///< Is right mouse button clicked? DrawPixelInfo _screen; bool _screen_disable_anim = false; ///< Disable palette animation (important for 32bpp-anim blitter during giant screenshot) bool _exit_game; GameMode _game_mode; SwitchMode _switch_mode; ///< The next mainloop command. PauseModeByte _pause_mode; int _pal_first_dirty; int _pal_count_dirty; Colour _cur_palette[256]; static int _max_char_height; ///< Cache of the height of the largest font static int _max_char_width; ///< Cache of the width of the largest font static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth() DrawPixelInfo *_cur_dpi; byte _colour_gradient[COLOUR_END][8]; static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = NULL); FontSize _cur_fontsize; static FontSize _last_fontsize; static ReusableBuffer<uint8> _cursor_backup; /** * The rect for repaint. * * This rectangle defines the area which should be repaint by the video driver. * * @ingroup dirty */ static Rect _invalid_rect; static const byte *_colour_remap_ptr; static byte _string_colourremap[3]; ///< Recoloursprite for stringdrawing. The grf loader ensures, that ST_FONT sprites only use colours 0 to 2. enum { DIRTY_BLOCK_HEIGHT = 8, DIRTY_BLOCK_WIDTH = 64, }; static uint _dirty_bytes_per_line = 0; static byte *_dirty_blocks = NULL; void GfxScroll(int left, int top, int width, int height, int xo, int yo) { Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter(); if (xo == 0 && yo == 0) return; if (_cursor.visible) UndrawMouseCursor(); #ifdef ENABLE_NETWORK if (_networking) NetworkUndrawChatMessage(); #endif /* ENABLE_NETWORK */ blitter->ScrollBuffer(_screen.dst_ptr, left, top, width, height, xo, yo); /* This part of the screen is now dirty. */ _video_driver->MakeDirty(left, top, width, height); } /** * Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen. * * @pre dpi->zoom == ZOOM_LVL_NORMAL, right >= left, bottom >= top * @param left Minimum X (inclusive) * @param top Minimum Y (inclusive) * @param right Maximum X (inclusive) * @param bottom Maximum Y (inclusive) * @param colour A 8 bit palette index (FILLRECT_OPAQUE and FILLRECT_CHECKER) or a recolour spritenumber (FILLRECT_RECOLOUR) * @param mode * FILLRECT_OPAQUE: Fill the rectangle with the specified colour * FILLRECT_CHECKER: Like FILLRECT_OPAQUE, but only draw every second pixel (used to grey out things) * FILLRECT_RECOLOUR: Apply a recolour sprite to every pixel in the rectangle currently on screen */ void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode) { Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter(); const DrawPixelInfo *dpi = _cur_dpi; void *dst; const int otop = top; const int oleft = left; if (dpi->zoom != ZOOM_LVL_NORMAL) return; if (left > right || top > bottom) return; if (right < dpi->left || left >= dpi->left + dpi->width) return; if (bottom < dpi->top || top >= dpi->top + dpi->height) return; if ( (left -= dpi->left) < 0) left = 0; right = right - dpi->left + 1; if (right > dpi->width) right = dpi->width;