?? sdlgraphics.cpp
字號:
/* _______ __ __ __ ______ __ __ _______ __ __ * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * * Copyright (c) 2004, 2005 darkbits Js_./ * Per Larsson a.k.a finalman _RqZ{a<^_aa * Olof Naess閚 a.k.a jansem/yakslem _asww7!uY`> )\a// * _Qhm`] _f "'c 1!5m * Visit: http://guichan.darkbits.org )Qk<P ` _: :+' .' "{[ * .)j(] .d_/ '-( P . S * License: (BSD) <Td/Z <fP"5(\"??"\a. .L * Redistribution and use in source and _dV>ws?a-?' ._/L #' * binary forms, with or without )4d[#7r, . ' )d`)[ * modification, are permitted provided _Q-5'5W..j/?' -?!\)cam' * that the following conditions are met: j<<WP+k/);. _W=j f * 1. Redistributions of source code must .$%w\/]Q . ."' . mj$ * retain the above copyright notice, ]E.pYY(Q]>. a J@\ * this list of conditions and the j(]1u<sE"L,. . ./^ ]{a * following disclaimer. 4'_uomm\. )L);-4 (3= * 2. Redistributions in binary form must )_]X{Z('a_"a7'<a"a, ]"[ * reproduce the above copyright notice, #}<]m7`Za??4,P-"'7. ).m * this list of conditions and the ]d2e)Q(<Q( ?94 b- LQ/ * following disclaimer in the <B!</]C)d_, '(<' .f. =C+m * documentation and/or other materials .Z!=J ]e []('-4f _ ) -.)m]' * provided with the distribution. .w[5]' _[ /.)_-"+? _/ <W" * 3. Neither the name of Guichan nor the :$we` _! + _/ . j? * names of its contributors may be used =3)= _f (_yQmWW$#( " * to endorse or promote products derived - W, sQQQQmZQ#Wwa].. * from this software without specific (js, \[QQW$QWW#?!V"". * prior written permission. ]y:.<\.. . * -]n w/ ' [. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT )/ )/ ! * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY < (; sac , ' * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, ]^ .- % * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF c < r * MERCHANTABILITY AND FITNESS FOR A PARTICULAR aga< <La * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 5% )P'-3L * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR _bQf` y`..)a * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ,J?4P'.P"_(\?d'., * EXEMPLARY, OR CONSEQUENTIAL DAMAGES _Pa,)!f/<[]/ ?" * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT _2-..:. .r+_,.. . * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ?a.<%"' " -'.a_ _, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ^ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *//* * For comments regarding functions please see the header file. */#include "guichan/exception.h"#include "guichan/font.h"#include "guichan/sdl/sdlgraphics.h"#include "guichan/sdl/sdlpixel.h"#include "stratagus.h"#include "video.h"// For some reason an old version of MSVC did not like std::abs,// so we added this macro.#ifndef ABS#define ABS(x) ((x)<0?-(x):(x))#endifnamespace gcn{ SDLGraphics::SDLGraphics() { mAlpha = false; } void SDLGraphics::_beginDraw() { Rectangle area; area.x = 0; area.y = 0; area.width = mTarget->w; area.height = mTarget->h; pushClipArea(area); } void SDLGraphics::_endDraw() { popClipArea(); } void SDLGraphics::setTarget(SDL_Surface* target) { mTarget = target; } bool SDLGraphics::pushClipArea(Rectangle area) { SDL_Rect rect; bool result = Graphics::pushClipArea(area); ClipRectangle carea = mClipStack.top(); rect.x = carea.x; rect.y = carea.y; rect.w = carea.width; rect.h = carea.height; SDL_SetClipRect(mTarget, &rect); return result; } void SDLGraphics::popClipArea() { SDL_Rect rect; Graphics::popClipArea(); if (mClipStack.empty()) { return; } ClipRectangle carea = mClipStack.top(); rect.x = carea.x; rect.y = carea.y; rect.w = carea.width; rect.h = carea.height; SDL_SetClipRect(mTarget, &rect); } SDL_Surface* SDLGraphics::getTarget() const { return mTarget; } void SDLGraphics::drawImage(const Image* image, int srcX, int srcY, int dstX, int dstY, int width, int height) { ClipRectangle top = mClipStack.top(); SDL_Rect src; SDL_Rect dst; src.x = srcX; src.y = srcY; src.w = width; src.h = height; dst.x = dstX + top.xOffset; dst.y = dstY + top.yOffset; SDL_Surface* srcImage = (SDL_Surface*)image->_getData(); SDL_BlitSurface(srcImage, &src, mTarget, &dst); } void SDLGraphics::fillRectangle(const Rectangle& rectangle) { Rectangle area = rectangle; ClipRectangle top = mClipStack.top(); area.x += top.xOffset; area.y += top.yOffset; if(!area.intersect(top) || mColor.a == 0) { return; } if (mAlpha) { int x1 = area.x > top.x ? area.x : top.x; int y1 = area.y > top.y ? area.y : top.y; int x2 = area.x + area.width < top.x + top.width ? area.x + area.width : top.x + top.width; int y2 = area.y + area.height < top.y + top.height ? area.y + area.height : top.y + top.height; Video.FillTransRectangle(SDL_MapRGB(TheScreen->format, mColor.r, mColor.g, mColor.b), x1, y1, x2 - x1, y2 - y1, mColor.a); } else { SDL_Rect rect; rect.x = area.x; rect.y = area.y; rect.w = area.width; rect.h = area.height; Uint32 color = SDL_MapRGBA(mTarget->format, mColor.r, mColor.g, mColor.b, mColor.a); SDL_FillRect(mTarget, &rect, color); } } void SDLGraphics::drawPoint(int x, int y) { ClipRectangle top = mClipStack.top(); x += top.xOffset; y += top.yOffset; if(!top.isPointInRect(x,y)) return; if (mAlpha) { SDLputPixelAlpha(mTarget, x, y, mColor); } else { SDLputPixel(mTarget, x, y, mColor); } } void SDLGraphics::drawHLine(int x1, int y, int x2) { ClipRectangle top = mClipStack.top(); x1 += top.xOffset; y += top.yOffset; x2 += top.xOffset; if (y < top.y || y >= top.y + top.height) return; if (x1 > x2) { x1 ^= x2; x2 ^= x1; x1 ^= x2; } if (top.x > x1) { if (top.x > x2) { return; } x1 = top.x; } if (top.x + top.width <= x2) { if (top.x + top.width <= x1) { return; } x2 = top.x + top.width -1; } int bpp = mTarget->format->BytesPerPixel; SDL_LockSurface(mTarget); Uint8 *p = (Uint8 *)mTarget->pixels + y * mTarget->pitch + x1 * bpp; Uint32 pixel = SDL_MapRGB(mTarget->format, mColor.r, mColor.g, mColor.b); switch(bpp) { case 1: { for (;x1 <= x2; ++x1) { *(p++) = pixel; } } break; case 2: { Uint16* q = (Uint16*)p; for (;x1 <= x2; ++x1) { *(q++) = pixel; } } break; case 3: { if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { for (;x1 <= x2; ++x1) { p[0] = (pixel >> 16) & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = pixel & 0xff; p += 3; } } else { for (;x1 <= x2; ++x1) { p[0] = pixel & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = (pixel >> 16) & 0xff; p += 3; } } } break; case 4: { Uint32* q = (Uint32*)p; for (;x1 <= x2; ++x1) { if (mAlpha) { *q = SDLAlpha32(pixel,*q,mColor.a); q++; } else { *(q++) = pixel; } } } break; } // end switch
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -