added alpha channel support to ShrinkBy

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2005-02-14 19:29:09 +00:00
parent a7c58211db
commit cd0bbd03d7

View File

@@ -279,6 +279,11 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
unsigned char maskRed = 0; unsigned char maskRed = 0;
unsigned char maskGreen = 0; unsigned char maskGreen = 0;
unsigned char maskBlue =0 ; unsigned char maskBlue =0 ;
unsigned char *source_data = M_IMGDATA->m_data;
unsigned char *target_data = data;
unsigned char *source_alpha = 0 ;
unsigned char *target_alpha = 0 ;
if (M_IMGDATA->m_hasMask) if (M_IMGDATA->m_hasMask)
{ {
hasMask = true ; hasMask = true ;
@@ -290,8 +295,15 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskGreen,
M_IMGDATA->m_maskBlue ); M_IMGDATA->m_maskBlue );
} }
char unsigned *source_data = M_IMGDATA->m_data; else
char unsigned *target_data = data; {
source_alpha = M_IMGDATA->m_alpha ;
if ( source_alpha )
{
image.SetAlpha() ;
target_alpha = image.GetAlpha() ;
}
}
for (long y = 0; y < height; y++) for (long y = 0; y < height; y++)
{ {
@@ -300,6 +312,7 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
unsigned long avgRed = 0 ; unsigned long avgRed = 0 ;
unsigned long avgGreen = 0; unsigned long avgGreen = 0;
unsigned long avgBlue = 0; unsigned long avgBlue = 0;
unsigned long avgAlpha = 0 ;
unsigned long counter = 0 ; unsigned long counter = 0 ;
// determine average // determine average
for ( int y1 = 0 ; y1 < yFactor ; ++y1 ) for ( int y1 = 0 ; y1 < yFactor ; ++y1 )
@@ -311,11 +324,18 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
unsigned char red = pixel[0] ; unsigned char red = pixel[0] ;
unsigned char green = pixel[1] ; unsigned char green = pixel[1] ;
unsigned char blue = pixel[2] ; unsigned char blue = pixel[2] ;
unsigned char alpha = 255 ;
if ( source_alpha )
alpha = *(source_alpha + y_offset + x * xFactor + x1) ;
if ( !hasMask || red != maskRed || green != maskGreen || blue != maskBlue ) if ( !hasMask || red != maskRed || green != maskGreen || blue != maskBlue )
{ {
avgRed += red ; if ( alpha > 0 )
avgGreen += green ; {
avgBlue += blue ; avgRed += red ;
avgGreen += green ;
avgBlue += blue ;
}
avgAlpha += alpha ;
counter++ ; counter++ ;
} }
} }
@@ -328,6 +348,8 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
} }
else else
{ {
if ( source_alpha )
*(target_alpha++) = (unsigned char)(avgAlpha / counter ) ;
*(target_data++) = (unsigned char)(avgRed / counter); *(target_data++) = (unsigned char)(avgRed / counter);
*(target_data++) = (unsigned char)(avgGreen / counter); *(target_data++) = (unsigned char)(avgGreen / counter);
*(target_data++) = (unsigned char)(avgBlue / counter); *(target_data++) = (unsigned char)(avgBlue / counter);