This commit is contained in:
Glenn Maynard
2007-02-06 01:31:14 +00:00
parent 450ebed713
commit c95f22f013
+26 -26
View File
@@ -226,47 +226,48 @@ static void FindAlphaRGB(const RageSurface *img, uint8_t &r, uint8_t &g, uint8_t
/* Local helper for FixHiddenAlpha. Set the underlying RGB values of all pixels in /* Local helper for FixHiddenAlpha. Set the underlying RGB values of all pixels in
* img that are completely transparent. */ * img that are completely transparent. */
static void SetAlphaRGB(const RageSurface *img, uint8_t r, uint8_t g, uint8_t b) static void SetAlphaRGB(const RageSurface *pImg, uint8_t r, uint8_t g, uint8_t b)
{ {
/* If it's a paletted surface, all we have to do is change the palette. */ /* If it's a paletted surface, all we have to do is change the palette. */
if( img->format->BitsPerPixel == 8 ) if( pImg->format->BitsPerPixel == 8 )
{ {
for( int c = 0; c < img->format->palette->ncolors; ++c ) for( int c = 0; c < pImg->format->palette->ncolors; ++c )
{ {
if( img->format->palette->colors[c].a ) if( pImg->format->palette->colors[c].a )
continue; continue;
img->format->palette->colors[c].r = r; pImg->format->palette->colors[c].r = r;
img->format->palette->colors[c].g = g; pImg->format->palette->colors[c].g = g;
img->format->palette->colors[c].b = b; pImg->format->palette->colors[c].b = b;
} }
return; return;
} }
/* If it's RGBA and there's no alpha channel, we have nothing to do. */ /* If it's RGBA and there's no alpha channel, we have nothing to do. */
if( img->format->BitsPerPixel > 8 && !img->format->Amask ) if( pImg->format->BitsPerPixel > 8 && !pImg->format->Amask )
return; return;
uint32_t trans; uint32_t trans;
img->format->MapRGBA( r, g, b, 0, trans ); pImg->format->MapRGBA( r, g, b, 0, trans );
for( int y = 0; y < img->h; ++y ) for( int y = 0; y < pImg->h; ++y )
{ {
uint8_t *row = img->pixels + img->pitch*y; uint8_t *row = pImg->pixels + pImg->pitch*y;
for( int x = 0; x < img->w; ++x ) for( int x = 0; x < pImg->w; ++x )
{ {
uint32_t val = RageSurfaceUtils::decodepixel( row, img->format->BytesPerPixel ); uint32_t val = RageSurfaceUtils::decodepixel( row, pImg->format->BytesPerPixel );
if( val != trans && !(val&img->format->Amask) ) if( val != trans && !(val&pImg->format->Amask) )
{ {
RageSurfaceUtils::encodepixel( row, img->format->BytesPerPixel, trans ); RageSurfaceUtils::encodepixel( row, pImg->format->BytesPerPixel, trans );
} }
row += img->format->BytesPerPixel; row += pImg->format->BytesPerPixel;
} }
} }
} }
/* When we scale up images (which we always do in high res), pixels /*
* When we scale up images (which we always do in high res), pixels
* that are completely transparent can be blended with opaque pixels, * that are completely transparent can be blended with opaque pixels,
* causing their RGB elements to show. This is visible in many textures * causing their RGB elements to show. This is visible in many textures
* as a pixel-wide border in the wrong color. This is tricky to fix. * as a pixel-wide border in the wrong color. This is tricky to fix.
@@ -277,27 +278,26 @@ static void SetAlphaRGB(const RageSurface *img, uint8_t r, uint8_t g, uint8_t b)
* color is easy: search through the image top-bottom-left-right, * color is easy: search through the image top-bottom-left-right,
* find the first non-transparent pixel, and pull out its RGB. * find the first non-transparent pixel, and pull out its RGB.
* *
* A few images don't. We can only make a guess here. What we'll do * A few images don't. We can only make a guess here. After the above
* is, after the above search, do the same in reverse (bottom-top-right- * search, do the same in reverse (bottom-top-right-left). If the color
* left). If the color we find is different, we'll just set the border * we find is different, just set the border color to black.
* color to black.
*/ */
void RageSurfaceUtils::FixHiddenAlpha( RageSurface *img ) void RageSurfaceUtils::FixHiddenAlpha( RageSurface *pImg )
{ {
/* If there are no alpha bits, there's nothing to fix. */ /* If there are no alpha bits, there's nothing to fix. */
if( img->format->BitsPerPixel != 8 && img->format->Amask == 0 ) if( pImg->format->BitsPerPixel != 8 && pImg->format->Amask == 0 )
return; return;
uint8_t r, g, b; uint8_t r, g, b;
FindAlphaRGB(img, r, g, b, false); FindAlphaRGB( pImg, r, g, b, false );
uint8_t cr, cg, cb; /* compare */ uint8_t cr, cg, cb; /* compare */
FindAlphaRGB(img, cr, cg, cb, true); FindAlphaRGB( pImg, cr, cg, cb, true );
if( cr != r || cg != g || cb != b ) if( cr != r || cg != g || cb != b )
r = g = b = 0; r = g = b = 0;
SetAlphaRGB(img, r, g, b); SetAlphaRGB( pImg, r, g, b );
} }
/* Scan the surface to see what level of alpha it uses. This can be used to /* Scan the surface to see what level of alpha it uses. This can be used to