From: Willem J. P. <wjp...@us...> - 2005-12-25 12:52:29
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18505/plugins/SDLVideo Modified Files: SDLVideoDriver.cpp SDLVideoDriver.h SDLVideoDriver.inl Log Message: translucent shadow blits; not enabled yet Index: SDLVideoDriver.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.h,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** SDLVideoDriver.h 7 Dec 2005 20:27:03 -0000 1.53 --- SDLVideoDriver.h 25 Dec 2005 12:52:20 -0000 1.54 *************** *** 74,78 **** SpriteCover* cover, Color *Palette = NULL, Region* clip = NULL); void BlitSpriteNoShadow(Sprite2D* spr, int x, int y, Color tint, ! SpriteCover* cover, Region *clip = NULL); void SetCursor(Sprite2D* up, Sprite2D* down); void SetDragCursor(Sprite2D* drag); --- 74,80 ---- SpriteCover* cover, Color *Palette = NULL, Region* clip = NULL); void BlitSpriteNoShadow(Sprite2D* spr, int x, int y, Color tint, ! SpriteCover* cover, Color *Palette = NULL, Region *clip = NULL); ! void BlitSpriteTransShadow(Sprite2D* spr, int x, int y, Color tint, ! SpriteCover* cover, Color *Palette = NULL, Region *clip = NULL); void SetCursor(Sprite2D* up, Sprite2D* down); void SetDragCursor(Sprite2D* drag); Index: SDLVideoDriver.inl =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.inl,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SDLVideoDriver.inl 27 Nov 2005 19:32:29 -0000 1.2 --- SDLVideoDriver.inl 25 Dec 2005 12:52:20 -0000 1.3 *************** *** 122,126 **** #endif ! { #ifdef FLIP const int xneg = (HFLIP_CONDITIONAL)?-1:0; --- 122,126 ---- #endif ! do { #ifdef FLIP const int xneg = (HFLIP_CONDITIONAL)?-1:0; *************** *** 144,147 **** --- 144,177 ---- #endif + int clipx, clipy, clipw, cliph; + if (clip) { + clipx = clip->x; + clipy = clip->y; + clipw = clip->w; + cliph = clip->h; + } else { + clipx = 0; + clipy = 0; + clipw = (TARGET)->w; + cliph = (TARGET)->h; + } + SDL_Rect cliprect; + SDL_GetClipRect((TARGET), &cliprect); + if (cliprect.x > clipx) { + clipw -= (cliprect.x - clipx); + clipx = cliprect.x; + } + if (cliprect.y > clipy) { + cliph -= (cliprect.y - clipy); + clipy = cliprect.y; + } + if (clipx+clipw > cliprect.x+cliprect.w) { + clipw = cliprect.x+cliprect.w-clipx; + } + if (clipy+cliph > cliprect.y+cliprect.h) { + cliph = cliprect.y+cliprect.h-clipy; + } + + PTYPE* line = (PTYPE*)(TARGET)->pixels + (ty - yneg*((HEIGHT)-1))*(TARGET)->pitch/(PITCHMULT); *************** *** 212,216 **** #endif } ! } --- 242,246 ---- #endif } ! } while(0); Index: SDLVideoDriver.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp,v retrieving revision 1.120 retrieving revision 1.121 diff -C2 -d -r1.120 -r1.121 *** SDLVideoDriver.cpp 17 Dec 2005 17:37:10 -0000 1.120 --- SDLVideoDriver.cpp 25 Dec 2005 12:52:20 -0000 1.121 *************** *** 729,762 **** SDL_LockSurface(backBuf); - int clipx, clipy, clipw, cliph; - if (clip) { - clipx = clip->x; - clipy = clip->y; - clipw = clip->w; - cliph = clip->h; - } else { - clipx = 0; - clipy = 0; - clipw = backBuf->w; - cliph = backBuf->h; - } - - SDL_Rect cliprect; - SDL_GetClipRect(backBuf, &cliprect); - if (cliprect.x > clipx) { - clipw -= (cliprect.x - clipx); - clipx = cliprect.x; - } - if (cliprect.y > clipy) { - cliph -= (cliprect.y - clipy); - clipy = cliprect.y; - } - if (clipx+clipw > cliprect.x+cliprect.w) { - clipw = cliprect.x+cliprect.w-clipx; - } - if (clipy+cliph > cliprect.y+cliprect.h) { - cliph = cliprect.y+cliprect.h-clipy; - } - #define SPECIALPIXEL #undef BPP16 --- 729,732 ---- *************** *** 812,914 **** } - //tint is always employed without anchor (only rendering ingame objects) - void SDLVideoDriver::BlitSpriteNoShadow(Sprite2D* spr, int x, int y, - Color tint, SpriteCover* cover, - Region *clip) - { - if (!spr->vptr) return; - - if (!spr->RLE) { - SDL_Surface* tmp = ( SDL_Surface* ) spr->vptr; - SDL_LockSurface( tmp ); - SDL_Color* pal = tmp->format->palette->colors; - SDL_Color oldPal[256]; - memcpy( oldPal, pal, 256 * sizeof( SDL_Color ) ); - for (int i = 2; i < 256; i++) { - pal[i].r = ( tint.r * pal[i].r ) >> 8; - pal[i].g = ( tint.g * pal[i].g ) >> 8; - pal[i].b = ( tint.b * pal[i].b ) >> 8; - } - //SDL_Color backup=pal[1]; - pal[1] = TRANSPARENT_BLACK; - SDL_UnlockSurface( tmp ); - SDL_SetAlpha( tmp, SDL_SRCALPHA, tint.a); - BlitSprite( spr, x, y, false, clip ); - //copying back the original palette - SDL_SetPalette( tmp, SDL_LOGPAL, ( SDL_Color * ) oldPal, 0, 256 ); - } else { - Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)spr->vptr; - - Uint8* rle = (Uint8*)spr->pixels; - int clipx, clipy, clipw, cliph; - if (clip) { - clipx = clip->x; - clipy = clip->y; - clipw = clip->w; - cliph = clip->h; - } else { - clipx = 0; - clipy = 0; - clipw = backBuf->w; - cliph = backBuf->h; - } - SDL_Rect cliprect; - SDL_GetClipRect(backBuf, &cliprect); - if (cliprect.x > clipx) { - clipw -= (cliprect.x - clipx); - clipx = cliprect.x; - } - if (cliprect.y > clipy) { - cliph -= (cliprect.y - clipy); - clipy = cliprect.y; - } - if (clipx+clipw > cliprect.x+cliprect.w) { - clipw = cliprect.x+cliprect.w-clipx; - } - if (clipy+cliph > cliprect.y+cliprect.h) { - cliph = cliprect.y+cliprect.h-clipy; - } - int tx = x - spr->XPos - Viewport.x; - int ty = y - spr->YPos - Viewport.y; - if (tx > backBuf->w) return; - if (tx+spr->Width <= 0) return; - SDL_LockSurface(backBuf); - - #define FLIP - #define HFLIP_CONDITIONAL data->flip_hor - #define VFLIP_CONDITIONAL data->flip_ver - #define PAL (Color*)data->pal - #define COVER - #define COVERX (cover->XPos - spr->XPos) - #define COVERY (cover->YPos - spr->YPos) - #define TINT - #define SPECIALPIXEL if (p != 1) - - if (backBuf->format->BytesPerPixel == 4) { - - #undef BPP16 - #include "SDLVideoDriver.inl" - - } else { - - #define BPP16 - #include "SDLVideoDriver.inl" - - } - - #undef FLIP - #undef HFLIP_CONDITIONAL - #undef VFLIP_CONDITIONAL - #undef PAL - #undef COVER - #undef COVERX - #undef COVERY - #undef TINT - #undef SPECIALPIXEL - - SDL_UnlockSurface(backBuf); - - } - } void SDLVideoDriver::BlitSpriteTinted(Sprite2D* spr, int x, int y, Color tint, --- 782,785 ---- *************** *** 935,971 **** SDL_SetPalette( tmp, SDL_LOGPAL, ( SDL_Color * ) oldPal, 0, 256 ); } else { - // TODO: implemented alpha tints - Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)spr->vptr; Uint8* rle = (Uint8*)spr->pixels; - int clipx, clipy, clipw, cliph; - if (clip) { - clipx = clip->x; - clipy = clip->y; - clipw = clip->w; - cliph = clip->h; - } else { - clipx = 0; - clipy = 0; - clipw = backBuf->w; - cliph = backBuf->h; - } - SDL_Rect cliprect; - SDL_GetClipRect(backBuf, &cliprect); - if (cliprect.x > clipx) { - clipw -= (cliprect.x - clipx); - clipx = cliprect.x; - } - if (cliprect.y > clipy) { - cliph -= (cliprect.y - clipy); - clipy = cliprect.y; - } - if (clipx+clipw > cliprect.x+cliprect.w) { - clipw = cliprect.x+cliprect.w-clipx; - } - if (clipy+cliph > cliprect.y+cliprect.h) { - cliph = cliprect.y+cliprect.h-clipy; - } int tx = x - spr->XPos - Viewport.x; int ty = y - spr->YPos - Viewport.y; --- 806,812 ---- *************** *** 1057,1060 **** --- 898,902 ---- } + void SDLVideoDriver::BlitSpriteCovered(Sprite2D* spr, int x, int y, Color tint, SpriteCover* cover, *************** *** 1069,1100 **** Uint8* rle = (Uint8*)spr->pixels; - int clipx, clipy, clipw, cliph; - if (clip) { - clipx = clip->x; - clipy = clip->y; - clipw = clip->w; - cliph = clip->h; - } else { - clipx = 0; - clipy = 0; - clipw = backBuf->w; - cliph = backBuf->h; - } - SDL_Rect cliprect; - SDL_GetClipRect(backBuf, &cliprect); - if (cliprect.x > clipx) { - clipw -= (cliprect.x - clipx); - clipx = cliprect.x; - } - if (cliprect.y > clipy) { - cliph -= (cliprect.y - clipy); - clipy = cliprect.y; - } - if (clipx+clipw > cliprect.x+cliprect.w) { - clipw = cliprect.x+cliprect.w-clipx; - } - if (clipy+cliph > cliprect.y+cliprect.h) { - cliph = cliprect.y+cliprect.h-clipy; - } int tx = x - spr->XPos - Viewport.x; int ty = y - spr->YPos - Viewport.y; --- 911,914 ---- *************** *** 1103,1107 **** SDL_LockSurface(backBuf); if (!Palette) ! Palette = (Color *) data->pal; //this is the original palette #define SPECIALPIXEL --- 917,921 ---- SDL_LockSurface(backBuf); if (!Palette) ! Palette = (Color *) data->pal; #define SPECIALPIXEL *************** *** 1192,1195 **** --- 1006,1159 ---- } + + void SDLVideoDriver::BlitSpriteNoShadow(Sprite2D* spr, int x, int y, + Color tint, SpriteCover* cover, + Color *Palette, Region *clip) + { + if (!spr->vptr) return; + + if (!spr->RLE) { + // not fully supported + SDL_Surface* tmp = ( SDL_Surface* ) spr->vptr; + SDL_LockSurface( tmp ); + SDL_Color* pal = tmp->format->palette->colors; + SDL_Color oldPal[256]; + memcpy( oldPal, pal, 256 * sizeof( SDL_Color ) ); + for (int i = 2; i < 256; i++) { + pal[i].r = ( tint.r * pal[i].r ) >> 8; + pal[i].g = ( tint.g * pal[i].g ) >> 8; + pal[i].b = ( tint.b * pal[i].b ) >> 8; + } + //SDL_Color backup=pal[1]; + pal[1] = TRANSPARENT_BLACK; + SDL_UnlockSurface( tmp ); + SDL_SetAlpha( tmp, SDL_SRCALPHA, tint.a); + BlitSprite( spr, x, y, false, clip ); + //copying back the original palette + SDL_SetPalette( tmp, SDL_LOGPAL, ( SDL_Color * ) oldPal, 0, 256 ); + } else { + Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)spr->vptr; + + Uint8* rle = (Uint8*)spr->pixels; + int tx = x - spr->XPos - Viewport.x; + int ty = y - spr->YPos - Viewport.y; + if (tx > backBuf->w) return; + if (tx+spr->Width <= 0) return; + if (!Palette) + Palette = (Color *) data->pal; + SDL_LockSurface(backBuf); + + #define FLIP + #define HFLIP_CONDITIONAL data->flip_hor + #define VFLIP_CONDITIONAL data->flip_ver + #define PAL Palette + #define COVER + #define COVERX (cover->XPos - spr->XPos) + #define COVERY (cover->YPos - spr->YPos) + #define TINT + #define SPECIALPIXEL if (p != 1) + + if (backBuf->format->BytesPerPixel == 4) { + + #undef BPP16 + #include "SDLVideoDriver.inl" + + } else { + + #define BPP16 + #include "SDLVideoDriver.inl" + + } + + #undef FLIP + #undef HFLIP_CONDITIONAL + #undef VFLIP_CONDITIONAL + #undef PAL + #undef COVER + #undef COVERX + #undef COVERY + #undef TINT + #undef SPECIALPIXEL + + SDL_UnlockSurface(backBuf); + + } + } + + + void SDLVideoDriver::BlitSpriteTransShadow(Sprite2D* spr, int x, int y, + Color tint, SpriteCover* cover, + Color *Palette, Region *clip) + { + if (!spr->vptr) return; + + if (!spr->RLE) { + // not supported + BlitSpriteCovered(spr, x, y, tint, cover, Palette, clip); + } else { + Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)spr->vptr; + + Uint8* rle = (Uint8*)spr->pixels; + int tx = x - spr->XPos - Viewport.x; + int ty = y - spr->YPos - Viewport.y; + if (tx > backBuf->w) return; + if (tx+spr->Width <= 0) return; + + if (!Palette) + Palette = (Color *) data->pal; + + Uint32 shadowcol32 = SDL_MapRGBA(backBuf->format, Palette[1].r/2, Palette[1].g/2, Palette[1].b/2, 0); + Uint16 shadowcol16 = (Uint16)shadowcol32; + + Uint32 mask32 = (backBuf->format->Rmask >> 1) & backBuf->format->Rmask; + mask32 |= (backBuf->format->Gmask >> 1) & backBuf->format->Gmask; + mask32 |= (backBuf->format->Bmask >> 1) & backBuf->format->Bmask; + Uint16 mask16 = (Uint16)mask32; + + SDL_LockSurface(backBuf); + + + + #define FLIP + #define HFLIP_CONDITIONAL data->flip_hor + #define VFLIP_CONDITIONAL data->flip_ver + #define PAL Palette + #define COVER + #define COVERX (cover->XPos - spr->XPos) + #define COVERY (cover->YPos - spr->YPos) + #define TINT + + if (backBuf->format->BytesPerPixel == 4) { + + #undef BPP16 + #define SPECIALPIXEL if (p == 1) { *pix = ((*pix >> 1)&mask32) + shadowcol32; } else + #include "SDLVideoDriver.inl" + + } else { + + #define BPP16 + #undef SPECIALPIXEL + #define SPECIALPIXEL if (p == 1) { *pix = ((*pix >> 1)&mask16) + shadowcol16; } else + #include "SDLVideoDriver.inl" + + } + + #undef FLIP + #undef HFLIP_CONDITIONAL + #undef VFLIP_CONDITIONAL + #undef PAL + #undef COVER + #undef COVERX + #undef COVERY + #undef TINT + #undef SPECIALPIXEL + + SDL_UnlockSurface(backBuf); + + } + } + + + void SDLVideoDriver::SetCursor(Sprite2D* up, Sprite2D* down) { |