X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d275c7eb8420c81e97a8b308c60c27d9856b58f9..f47db8f0676be7807693de8bc38c4851c37f56a2:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index fe48bf366a..999f43c5be 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -720,6 +720,100 @@ int wxImage::GetHeight() const return M_IMGDATA->m_height; } + +bool wxImage::GetUnusedColour ( unsigned char * r, unsigned char * g, unsigned char * b ) +{ + wxHashTable hTable; + unsigned long key; + + ComputeHistogram( hTable ); + + // start with blackest color and work to lightest + // 0,0,0 is quite likely to be a used color + unsigned char r2 = 1; + unsigned char g2 = 0; + unsigned char b2 = 0; + + key = (r2 << 16) | (g2 << 8) | b2; + + while ( (wxHNode *) hTable.Get(key) ) + { + // color already used + r2 ++ ; + if ( r2 >= 255 ) + { + r2 = 0; + g2 ++ ; + if ( g2 >= 255 ) + { + g2 = 0 ; + b2 ++ ; + if ( b2 >= 255 ) + { + wxLogError( _("GetUnusedColour:: No Unused Color in image ") ); + return FALSE; + } + } + } + + key = (r2 << 16) | (g2 << 8) | b2; + } + + return TRUE; +} + + +bool wxImage::ApplyMask ( const wxImage & mask ) +{ + // what to do if we already have a mask ?? + if (M_IMGDATA->m_hasMask || mask.HasMask() ) + { + wxLogError( _("Image already masked") ); + return FALSE; + } + + // 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") ); + return FALSE; + } + + // find unused colour + unsigned char r,g,b ; + if (!GetUnusedColour (&r, &g, &b)) + { + wxLogError( _("No Unused Color in image being masked") ); + return FALSE ; + } + + char unsigned *imgdata = GetData(); + char unsigned *maskdata = mask.GetData(); + + const int w = GetWidth(); + const int h = GetHeight(); + + for (int j = 0; j < h; j++) + for (int i = 0; i < w; i++) + { + if ((maskdata[0] > 128) && (maskdata[1] > 128) && (maskdata[2] > 128 )) + { + imgdata[0] = r; + imgdata[1] = g; + imgdata[2] = b; + } + imgdata += 3; + maskdata += 3; + } + + M_IMGDATA->m_maskRed = r; + M_IMGDATA->m_maskGreen = g; + M_IMGDATA->m_maskBlue = b; + M_IMGDATA->m_hasMask = TRUE; + + return TRUE; +} + #if wxUSE_PALETTE // Palette functions