From: Willem J. P. <wjp...@us...> - 2005-11-27 19:33:08
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5640/plugins/SDLVideo Modified Files: SDLVideoDriver.cpp SDLVideoDriver.inl Log Message: alpha blits Index: SDLVideoDriver.inl =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.inl,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SDLVideoDriver.inl 22 Nov 2005 20:49:40 -0000 1.1 --- SDLVideoDriver.inl 27 Nov 2005 19:32:29 -0000 1.2 *************** *** 46,61 **** #endif ! // TODO: preconvert palette to surface-specific color values #ifdef TINT ! #define BLENDPIXEL(cr,cg,cb) (PTYPE)( ((tint.r*(cr)) >> (rloss+8)) << rshift \ | ((tint.g*(cg)) >> (gloss+8)) << gshift \ | ((tint.b*(cb)) >> (bloss+8)) << bshift) #else ! #define BLENDPIXEL(cr,cg,cb) (PTYPE)( ((cr) >> rloss) << rshift \ | ((cg) >> gloss) << gshift \ | ((cb) >> bloss) << bshift) #endif { #ifdef FLIP --- 46,125 ---- #endif ! #ifdef PALETTE_ALPHA ! #define ALPHA ! #ifdef TINT_ALPHA ! #define ALPHAVALUE (((PAL)[p].a * tint.a)>>8) ! #else ! #define ALPHAVALUE (PAL)[p].a ! #endif ! ! #else ! ! #ifdef TINT_ALPHA ! #define ALPHA ! #define ALPHAVALUE tint.a ! #else ! #undef ALPHA ! #define ALPHAVALUE 0 ! #endif ! ! #endif ! ! // TODO: preconvert palette to surface-specific color values, where possible ! ! #ifdef ALPHA #ifdef TINT ! #define BLENDPIXEL(target,cr,cg,cb,ca,curval) \ ! do { \ ! if ((ca) != 0) { \ ! dR = (((curval)>>rshift)<<rloss)&0xFF; \ ! dG = (((curval)>>gshift)<<gloss)&0xFF; \ ! dB = (((curval)>>bshift)<<bloss)&0xFF; \ ! dR = 1 + (ca)*((tint.r*(cr)) >> 8) + (dR * (255-(ca))); \ ! dR = (dR + (dR >> 8)) >> 8; \ ! dG = 1 + (ca)*((tint.g*(cg)) >> 8) + (dG * (255-(ca))); \ ! dG = (dG + (dG >> 8)) >> 8; \ ! dB = 1 + (ca)*((tint.b*(cb)) >> 8) + (dB * (255-(ca))); \ ! dB = (dB + (dB >> 8)) >> 8; \ ! target = (PTYPE) ( ((dR) >> rloss) << rshift \ ! | ((dG) >> gloss) << gshift \ ! | ((dB) >> bloss) << bshift); \ ! } \ ! } while (0) ! #else ! #define BLENDPIXEL(target,cr,cg,cb,ca,curval) \ ! do { \ ! if ((ca) != 0) { \ ! dR = (((curval)>>rshift)<<rloss)&0xFF; \ ! dG = (((curval)>>gshift)<<gloss)&0xFF; \ ! dB = (((curval)>>bshift)<<bloss)&0xFF; \ ! dR = 1 + (ca)*(cr) + (dR * (255-(ca))); \ ! dR = (dR + (dR >> 8)) >> 8; \ ! dG = 1 + (ca)*(cg) + (dG * (255-(ca))); \ ! dG = (dG + (dG >> 8)) >> 8; \ ! dB = 1 + (ca)*(cb) + (dB * (255-(ca))); \ ! dB = (dB + (dB >> 8)) >> 8; \ ! target = (PTYPE) ( ((dR) >> rloss) << rshift \ ! | ((dG) >> gloss) << gshift \ ! | ((dB) >> bloss) << bshift); \ ! } \ ! } while (0) ! #endif ! ! #else ! ! #ifdef TINT ! #define BLENDPIXEL(target,cr,cg,cb,ca,curval) target = (PTYPE)( ((tint.r*(cr)) >> (rloss+8)) << rshift \ | ((tint.g*(cg)) >> (gloss+8)) << gshift \ | ((tint.b*(cb)) >> (bloss+8)) << bshift) #else ! #define BLENDPIXEL(target,cr,cg,cb,ca,curval) target = (PTYPE)( ((cr) >> rloss) << rshift \ | ((cg) >> gloss) << gshift \ | ((cb) >> bloss) << bshift) #endif + #endif + { #ifdef FLIP *************** *** 74,77 **** --- 138,147 ---- const int bshift = (TARGET)->format->Bshift; + #ifdef ALPHA + unsigned int dR; + unsigned int dG; + unsigned int dB; + #endif + PTYPE* line = (PTYPE*)(TARGET)->pixels + (ty - yneg*((HEIGHT)-1))*(TARGET)->pitch/(PITCHMULT); *************** *** 127,131 **** { SPECIALPIXEL { ! *pix = BLENDPIXEL((PAL)[p].r, (PAL)[p].g, (PAL)[p].b); } } --- 197,201 ---- { SPECIALPIXEL { ! BLENDPIXEL(*pix, (PAL)[p].r, (PAL)[p].g, (PAL)[p].b, (ALPHAVALUE), *pix); } } *************** *** 154,155 **** --- 224,227 ---- #undef WIDTH #undef HEIGHT + #undef ALPHA + #undef ALPHAVALUE Index: SDLVideoDriver.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp,v retrieving revision 1.116 retrieving revision 1.117 diff -C2 -d -r1.116 -r1.117 *** SDLVideoDriver.cpp 23 Nov 2005 21:10:21 -0000 1.116 --- SDLVideoDriver.cpp 27 Nov 2005 19:32:29 -0000 1.117 *************** *** 36,39 **** --- 36,40 ---- bool flip_hor; bool flip_ver; + bool alpha_pal; }; *************** *** 424,427 **** --- 425,429 ---- data->flip_hor = false; data->flip_ver = false; + data->alpha_pal = false; spr->pixels = rledata; *************** *** 589,593 **** #define HFLIP_CONDITIONAL data->flip_hor #define VFLIP_CONDITIONAL data->flip_ver ! #define PAL data->pal #undef COVER #undef TINT --- 591,595 ---- #define HFLIP_CONDITIONAL data->flip_hor #define VFLIP_CONDITIONAL data->flip_ver ! #define PAL (Color*)data->pal #undef COVER #undef TINT *************** *** 596,606 **** --- 598,628 ---- #undef BPP16 + if (data->alpha_pal) { + + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + + } else { + + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + } else { #define BPP16 + if (data->alpha_pal) { + + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + + } else { + + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + } *************** *** 733,737 **** #define HFLIP_CONDITIONAL data->flip_hor #define VFLIP_CONDITIONAL data->flip_ver ! #define PAL data->pal #undef COVER #undef TINT --- 755,759 ---- #define HFLIP_CONDITIONAL data->flip_hor #define VFLIP_CONDITIONAL data->flip_ver ! #define PAL (Color*)data->pal #undef COVER #undef TINT *************** *** 740,750 **** --- 762,792 ---- #undef BPP16 + if (data->alpha_pal) { + + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + + } else { + + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + } else { #define BPP16 + if (data->alpha_pal) { + + #define PALETTE_ALPHA #include "SDLVideoDriver.inl" + } else { + + #undef PALETTE_ALPHA + #include "SDLVideoDriver.inl" + + } + } *************** *** 755,758 **** --- 797,801 ---- #undef PAL #undef SPECIALPIXEL + #undef PALETTE_ALPHA SDL_UnlockSurface(backBuf); *************** *** 826,830 **** #define HFLIP_CONDITIONAL data->flip_hor #define VFLIP_CONDITIONAL data->flip_ver ! #define PAL data->pal #define COVER #define COVERX (cover->XPos - spr->XPos) --- 869,873 ---- #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) *************** *** 935,944 **** --- 978,1035 ---- #undef BPP16 + + if (tint.a != 255) { + + #define TINT_ALPHA + + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } + + } else { + + #undef TINT_ALPHA + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + + } } else { #define BPP16 + if (tint.a != 255) { + + #define TINT_ALPHA + + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } + + } else { + + #undef TINT_ALPHA + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + + } + } *************** *** 950,953 **** --- 1041,1046 ---- #undef TINT #undef SPECIALPIXEL + #undef TINT_ALPHA + #undef PALETTE_ALPHA SDL_UnlockSurface(backBuf); *************** *** 1016,1025 **** --- 1109,1166 ---- #undef BPP16 + + if (tint.a != 255) { + + #define TINT_ALPHA + + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + + } else { + + #undef TINT_ALPHA + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } + + } } else { #define BPP16 + if (tint.a != 255) { + + #define TINT_ALPHA + + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA #include "SDLVideoDriver.inl" + } + + } else { + + #undef TINT_ALPHA + if (data->alpha_pal) { + #define PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } else { + #undef PALETTE_ALPHA + #include "SDLVideoDriver.inl" + } + + } + } *************** *** 1034,1037 **** --- 1175,1180 ---- #undef TINT #undef SPECIALPIXEL + #undef TINT_ALPHA + #undef PALETTE_ALPHA SDL_UnlockSurface(backBuf); *************** *** 1191,1195 **** SDL_UnlockSurface( surf ); } else { ! // FIXME: implementme } } --- 1334,1352 ---- SDL_UnlockSurface( surf ); } else { ! Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)sprite->vptr; ! for (int i = 0; i < 256; ++i) { ! unsigned int r = data->pal[i].r; ! unsigned int g = data->pal[i].g; ! unsigned int b = data->pal[i].b; ! unsigned int m = (r + g + b) / 3; ! if (m > MINCOL) ! if (( r == 0 ) && ( g == 0xff ) && ( b == 0 )) ! data->pal[i].unused = 0xff; ! else ! data->pal[i].unused = ( m * MUL > 0xff ) ? 0xff : m * MUL; ! else ! data->pal[i].unused = 0; ! } ! data->alpha_pal = true; } } *************** *** 1311,1317 **** return val == 0; } else { - int skipcount = y * sprite->Width + x; Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)sprite->vptr; Uint8* rle = (Uint8*)sprite->pixels; while (skipcount > 0) { --- 1468,1480 ---- return val == 0; } else { Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)sprite->vptr; + if (data->flip_ver) + y = sprite->Height - y - 1; + if (data->flip_hor) + x = sprite->Width - x - 1; + + int skipcount = y * sprite->Width + x; + Uint8* rle = (Uint8*)sprite->pixels; while (skipcount > 0) { *************** *** 1328,1351 **** } - static void CountTransparency(SDL_Surface *surf, unsigned short x, unsigned short y, int &sum, int &cnt) - { - if (x>=surf->w) { - return; - } - if (y>=surf->h) { - return; - } - SDL_LockSurface( surf ); - unsigned char * pixels = ( ( unsigned char * ) surf->pixels ) + - ( ( y * surf->w + x) * surf->format->BytesPerPixel ); - long val = 0; - memcpy( &val, pixels, surf->format->BytesPerPixel ); - SDL_UnlockSurface( surf ); - if(!val) { - sum++; - } - cnt++; - } - /* * Draws horizontal line. When clipped=true, it draws the line relative --- 1491,1494 ---- *************** *** 1831,1866 **** void SDLVideoDriver::CreateAlpha( Sprite2D *sprite) { if (!sprite || !sprite->vptr) return; ! if (!sprite->RLE) { ! SDL_Surface * surf = (SDL_Surface *) sprite->vptr; ! SDL_LockSurface(surf); ! unsigned int *pixels = (unsigned int *) malloc (sprite->Width * sprite->Height * 4); ! int i=0; ! for (int y = 0; y < sprite->Height; y++) { ! for (int x = 0; x < sprite->Width; x++) { ! int sum = 0; ! int cnt = 0; ! for (int xx=x-2;xx<x+2;xx++) { ! for(int yy=y-2;yy<y+2;yy++) { ! CountTransparency(surf,xx,yy,sum,cnt); ! } } - int tmp=255 - (sum * 255 / cnt); - pixels[i++]=tmp; } } ! if ( sprite->pixels ) { ! free (sprite->pixels); ! } ! sprite->pixels = pixels; ! SDL_UnlockSurface (surf); ! SDL_FreeSurface (surf); ! surf = SDL_CreateRGBSurfaceFrom( pixels, sprite->Width, sprite->Height, 32, sprite->Width*4, 0xff00, 0xff00, 0xff00, 255 ); ! sprite->vptr = surf; } else { ! // FIXME: implementme } } --- 1974,2015 ---- void SDLVideoDriver::CreateAlpha( Sprite2D *sprite) { + // Note: we convert RLE sprites back to non-RLE (SDL_Surface) sprites + // for per-pixel non-indexed alpha. + if (!sprite || !sprite->vptr) return; ! unsigned int *pixels = (unsigned int *) malloc (sprite->Width * sprite->Height * 4); ! int i=0; ! for (int y = 0; y < sprite->Height; y++) { ! for (int x = 0; x < sprite->Width; x++) { ! int sum = 0; ! int cnt = 0; ! for (int xx=x-2;xx<x+2;xx++) { ! for(int yy=y-2;yy<y+2;yy++) { ! if (xx < 0 || xx >= sprite->Width) continue; ! if (yy < 0 || yy >= sprite->Height) continue; ! cnt++; ! if (IsSpritePixelTransparent(sprite, xx, yy)) ! sum++; } } + int tmp=255 - (sum * 255 / cnt); + pixels[i++]=tmp; } ! } ! if ( sprite->pixels ) { ! free (sprite->pixels); ! } ! if (sprite->RLE) { ! Sprite2D_RLE_Internal* data = (Sprite2D_RLE_Internal*)sprite->vptr; ! delete data; ! sprite->RLE = false; } else { ! SDL_FreeSurface ((SDL_Surface*)sprite->vptr); } + sprite->pixels = pixels; + SDL_Surface* surf = SDL_CreateRGBSurfaceFrom( pixels, sprite->Width, sprite->Height, 32, sprite->Width*4, 0xff00, 0xff00, 0xff00, 255 ); + sprite->vptr = surf; } *************** *** 1933,1935 **** Evnt->MouseMove(x, y); } - --- 2082,2083 ---- |