X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/999836aacade840a5d9a0cbb5fad7b1d4de62c93..c932709d31bf359c994dc2050bec1b3b986bbd62:/src/common/image.cpp?ds=sidebyside diff --git a/src/common/image.cpp b/src/common/image.cpp index a5f3c35f48..d5ea5590e7 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -231,7 +231,7 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const { if( xFactor == 1 && yFactor == 1 ) return Copy() ; - + wxImage image; wxCHECK_MSG( Ok(), image, wxT("invalid image") ); @@ -242,7 +242,7 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const long old_height = M_IMGDATA->m_height, old_width = M_IMGDATA->m_width; - + wxCHECK_MSG( (old_height > 0) && (old_width > 0), image, wxT("invalid old image size") ); @@ -265,14 +265,14 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const maskRed = M_IMGDATA->m_maskRed; maskGreen = M_IMGDATA->m_maskGreen; maskBlue =M_IMGDATA->m_maskBlue ; - + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); } char unsigned *source_data = M_IMGDATA->m_data; char unsigned *target_data = data; - + for (long y = 0; y < height; y++) { for (long x = 0; x < width; x++) @@ -796,7 +796,7 @@ void wxImage::SetAlpha(int x, int y, unsigned char alpha) M_IMGDATA->m_alpha[y*w + x] = alpha; } -unsigned char wxImage::GetAlpha(int x, int y) +unsigned char wxImage::GetAlpha(int x, int y) const { wxCHECK_MSG( Ok() && HasAlpha(), 0, wxT("invalid image or no alpha channel") ); @@ -817,7 +817,7 @@ void wxImage::SetAlpha( unsigned char *alpha ) alpha = (unsigned char *)malloc(M_IMGDATA->m_width*M_IMGDATA->m_height); } - delete [] M_IMGDATA->m_alpha; + free(M_IMGDATA->m_alpha); M_IMGDATA->m_alpha = alpha; } @@ -897,7 +897,7 @@ bool wxImage::SetMaskFromImage(const wxImage& mask, // check that the images are the same size if ( (M_IMGDATA->m_height != mask.GetHeight() ) || (M_IMGDATA->m_width != mask.GetWidth () ) ) { - wxLogError( _("Image and Mask have different sizes") ); + wxLogError( _("Image and mask have different sizes.") ); return false; } @@ -905,7 +905,7 @@ bool wxImage::SetMaskFromImage(const wxImage& mask, unsigned char r,g,b ; if (!FindFirstUnusedColour(&r, &g, &b)) { - wxLogError( _("No Unused Color in image being masked") ); + wxLogError( _("No unused colour in image being masked.") ); return false ; } @@ -936,6 +936,46 @@ bool wxImage::SetMaskFromImage(const wxImage& mask, return true; } +bool wxImage::ConvertAlphaToMask(unsigned char threshold) +{ + if (!HasAlpha()) + return true; + + unsigned char mr, mg, mb; + if (!FindFirstUnusedColour(&mr, &mg, &mb)) + { + wxLogError( _("No unused colour in image being masked.") ); + return false; + } + + SetMask(true); + SetMaskColour(mr, mg, mb); + + unsigned char *imgdata = GetData(); + unsigned char *alphadata = GetAlpha(); + + int w = GetWidth(); + int h = GetHeight(); + + for (int y = 0; y < h; y++) + { + for (int x = 0; x < w; x++, imgdata += 3, alphadata++) + { + if (*alphadata < threshold) + { + imgdata[0] = mr; + imgdata[1] = mg; + imgdata[2] = mb; + } + } + } + + free(M_IMGDATA->m_alpha); + M_IMGDATA->m_alpha = NULL; + + return true; +} + #if wxUSE_PALETTE // Palette functions @@ -1496,7 +1536,7 @@ wxImageHistogram::FindFirstUnusedColour(unsigned char *r, b2++; if ( b2 >= 255 ) { - wxLogError(_("GetUnusedColour:: No Unused Color in image ") ); + wxLogError(_("No unused colour in image.") ); return false; } }