X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6721fc3852ff183e0a59c990cf62ae595c036d05..01f944e67ed9db74771cdd06b1bb457d13507d68:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index a9b0a152e4..999f43c5be 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -58,7 +58,9 @@ public: unsigned char m_maskRed,m_maskGreen,m_maskBlue; bool m_ok; bool m_static; +#if wxUSE_PALETTE wxPalette m_palette; +#endif // wxUSE_PALETTE wxArrayString m_optionNames; wxArrayString m_optionValues; }; @@ -235,6 +237,9 @@ wxImage wxImage::Scale( int width, int height ) const char unsigned *source_data = M_IMGDATA->m_data; char unsigned *target_data = data; +#if 0 + // This is nonsense, RR. + // We do (x, y) -> (x, y)*oldSize/newSize but the valid values of x and y // are from 0 to size-1, hence all decrement the sizes long old_old_width = old_width; @@ -255,6 +260,20 @@ wxImage wxImage::Scale( int width, int height ) const target_data += 3; } } +#else + for (long j = 0; j < height; j++) + { + long y_offset = (j * old_height / height) * old_width; + + for (long i = 0; i < width; i++) + { + memcpy( target_data, + source_data + 3*(y_offset + ((i * old_width )/ width)), + 3 ); + target_data += 3; + } + } +#endif return image; } @@ -701,6 +720,102 @@ 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 bool wxImage::HasPalette() const @@ -725,6 +840,8 @@ void wxImage::SetPalette(const wxPalette& palette) M_IMGDATA->m_palette = palette; } +#endif // wxUSE_PALETTE + // Option functions (arbitrary name/value mapping) void wxImage::SetOption(const wxString& name, const wxString& value) { @@ -1040,7 +1157,7 @@ wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype ) void wxImage::InitStandardHandlers() { AddHandler(new wxBMPHandler); -#if !defined(__WXGTK__) && !defined(__WXMOTIF__) +#if wxUSE_XPM && !defined(__WXGTK__) && !defined(__WXMOTIF__) AddHandler(new wxXPMHandler); #endif } @@ -1160,7 +1277,7 @@ unsigned long wxImage::CountColours( unsigned long stopafter ) wxHashTable h; wxObject dummy; unsigned char r, g, b; - unsigned char *p; + unsigned char *p; unsigned long size, nentries, key; p = GetData(); @@ -1195,7 +1312,7 @@ unsigned long wxImage::CountColours( unsigned long stopafter ) unsigned long wxImage::ComputeHistogram( wxHashTable &h ) { unsigned char r, g, b; - unsigned char *p; + unsigned char *p; unsigned long size, nentries, key; wxHNode *hnode;