X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc88f66f5f4028956955ad1cb676b94db713e9b3..698b34facdbae62cce6b2c9837e698ef9c3fbe8c:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index 369bdf5fcd..784a016b94 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -110,10 +110,6 @@ wxImage wxNullImage; IMPLEMENT_DYNAMIC_CLASS(wxImage, wxObject) -wxImage::wxImage() -{ -} - wxImage::wxImage( int width, int height, bool clear ) { Create( width, height, clear ); @@ -231,7 +227,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 +238,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 +261,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++) @@ -936,6 +932,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 @@ -1445,7 +1481,7 @@ bool wxImageHandler::CanRead( const wxString& name ) bool wxImageHandler::CallDoCanRead(wxInputStream& stream) { - off_t posOld = stream.TellI(); + wxFileSize_t posOld = stream.TellI(); if ( posOld == wxInvalidOffset ) { // can't test unseekable stream