// ____ _ __ // / __ )____ _____ | | / /___ ___________ // / __ / __ \/ ___/ | | /| / / __ `/ ___/ ___/ // / /_/ / /_/ (__ ) | |/ |/ / /_/ / / (__ ) // /_____/\____/____/ |__/|__/\__,_/_/ /____/ // // A futuristic real-time strategy game. // This file is part of Bos Wars. // //*@file intern_video.h @brief The video headerfile for video sources only. */ // // (c) Copyright 1999-2002 by Stephan Rasenbergver. // // This program 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; only version 2 of the License. // // This program 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 this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. // // $Id: intern_video.h 8551 2007-02-10 12:49:41Z feb $ #ifndef __INTERN_VIDEO_H__ #define __INTERN_VIDEO_H__ //@{ /*---------------------------------------------------------------------------- -- Documentation ----------------------------------------------------------------------------*/ /** ** @file intern_video.h ** ** THIS HEADER FILE SHOULD ONLY BE INCLUDED BY SOURCE-FILES IN VIDEO !!! ** ** This delivers an interface to basic video operations in video.c, while ** keeping these detailed operations out of the main include-file video.h ** ** @todo FIXME: Currently some interfaces listed in video.h should be ** moved in here, this includes possible "extern" declarations in ** source-files themselves. ** The doxygen docs looks not good, but now contains all info. */ /*---------------------------------------------------------------------------- -- Includes ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- -- Declarations ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- -- Variables ----------------------------------------------------------------------------*/ // Direct acces to clipping rectangle for macro CLIP_RECTANGLE extern int ClipX1; /// current clipping top left extern int ClipY1; /// current clipping top left extern int ClipX2; /// current clipping bottom right extern int ClipY2; /// current clipping bottom right /*---------------------------------------------------------------------------- -- Macros ----------------------------------------------------------------------------*/ /** ** Clip rectangle area to clipping rectangle. ** This means given arguments can be changed to take the clipping ** rectangle into account. ** ** @todo FIXME: not easy to debug, but making it a function needs: ** - pointers to be able to alter given arguments ** - special return value to denote 'outside' clipping region ** (which is now handled by a simple return in caller function) ** ** @param x int X screen pixel position ** @param y int Y screen pixel position ** (return value of X and Y can be made larger) ** @param width unsigned int width to display ** @param height unsigned int height to display ** (return value of width and height can be made smaller) */ #define CLIP_RECTANGLE(x, y, width, height) { \ int f; \ if (x < ClipX1) { \ f = ClipX1 - x; \ if (width <= f) { \ return; \ } \ width -= f; \ x = ClipX1; \ } \ if ((x + width) > ClipX2 + 1) { \ if (x > ClipX2) { \ return; \ } \ width = ClipX2 - x + 1; \ } \ if (y < ClipY1) { \ f = ClipY1 - y; \ if (height <= f) { \ return; \ } \ height -= f; \ y = ClipY1; \ } \ if ((y + height) > ClipY2 + 1) { \ if (y > ClipY2) { \ return; \ } \ height = ClipY2 - y + 1; \ } \ } /** ** Clip rectangle area (just like CLIP_RECTANGLE), but also return offsets ** (these offsets can be used to skip data when used for sprites and such) ** ** @todo FIXME: not easy to debug, but making it a function needs: ** - pointers to be able to alter given arguments ** - special return value to denote 'outside' clipping region ** (which is now handled by a simple return in caller function) ** ** @param x int X screen position ** @param y int Y screen position ** (return value of X and Y can be made larger) ** @param width int width to display ** @param height int height to display ** (return value of width and height can be made smaller) ** returns: ** @param ofsx int offset X from start of sprite data ** @param ofsy int offset Y from start of sprite data ** @param endx int offset to skip the remaining data at the ** end of each horizontal line of the sprite. ** ** @note there was no need for 'endy', as it isn't used to draw sprites.. */ #define CLIP_RECTANGLE_OFS(x, y, width, height, ofsx, ofsy, endx) { \ if (y < ClipY1) { \ ofsy = ClipY1 - y; \ if (height <= ofsy) { \ return; \ } \ height -= ofsy; \ y = ClipY1; \ } else { \ ofsy = 0; \ } \ if ((y + height) > ClipY2 + 1) { \ if (y > ClipY2) { \ return; \ } \ height = ClipY2 - y + 1; \ } \ if (x < ClipX1) { \ ofsx = ClipX1 - x; \ if (width <= ofsx) { \ return; \ } \ width -= ofsx; \ x = ClipX1; \ } else { \ ofsx = 0; \ } \ if ((x + width) > ClipX2 + 1) { \ if (x > ClipX2) { \ return; \ } \ endx = (x + width) - (ClipX2 + 1); \ width = ClipX2 - x + 1; \ } else { \ endx = 0; \ } \ } /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/ //@} #endif // !__INTERN_VIDEO_H__