X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fec19ea9ff590f401ad17b1e2109b1e95d2f5e91..4f55a07f9f4c6ba6905aaa8e584e6fb14771d278:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index ef7c6c123e..a9b0a152e4 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -18,6 +18,10 @@ #pragma hdrstop #endif +#include "wx/defs.h" + +#if wxUSE_IMAGE + #include "wx/image.h" #include "wx/bitmap.h" #include "wx/debug.h" @@ -206,7 +210,14 @@ wxImage wxImage::Scale( int width, int height ) const wxCHECK_MSG( Ok(), image, wxT("invalid image") ); - wxCHECK_MSG( (width > 0) && (height > 0), image, wxT("invalid image size") ); + // can't scale to/from 0 size + wxCHECK_MSG( (width > 0) && (height > 0), image, + wxT("invalid new image size") ); + + 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") ); image.Create( width, height ); @@ -215,23 +226,32 @@ wxImage wxImage::Scale( int width, int height ) const wxCHECK_MSG( data, image, wxT("unable to create image") ); if (M_IMGDATA->m_hasMask) - image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); - - long old_height = M_IMGDATA->m_height; - long old_width = M_IMGDATA->m_width; + { + 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 j = 0; j < height; j++) + // 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; + old_height--; + old_width--; + height--; + width--; + for ( long j = 0; j <= height; j++ ) { - long y_offset = (j * old_height / height) * old_width; + // don't crash for images with height == 1 + long y_offset = height ? (j * old_height / height)* old_old_width : 0; - for (long i = 0; i < width; i++) + for ( long i = 0; i <= width; i++ ) { - memcpy( target_data, - source_data + 3*(y_offset + ((i * old_width )/ width)), - 3 ); + long x_offset = width ? (i * old_width) / width : 0; + + memcpy( target_data, source_data + 3*(y_offset + x_offset), 3 ); target_data += 3; } } @@ -410,31 +430,31 @@ void wxImage::Paste( const wxImage &image, int x, int y ) } return; } - + if (!HasMask() && image.HasMask()) { unsigned char r = image.GetMaskRed(); unsigned char g = image.GetMaskGreen(); unsigned char b = image.GetMaskBlue(); - + width *= 3; unsigned char* source_data = image.GetData() + xx*3 + yy*3*image.GetWidth(); int source_step = image.GetWidth()*3; unsigned char* target_data = GetData() + (x+xx)*3 + (y+yy)*3*M_IMGDATA->m_width; int target_step = M_IMGDATA->m_width*3; - + for (int j = 0; j < height; j++) { for (int i = 0; i < width; i+=3) { - if ((source_data[i] != r) && - (source_data[i+1] != g) && + if ((source_data[i] != r) && + (source_data[i+1] != g) && (source_data[i+2] != b)) { memcpy( target_data+i, source_data+i, 3 ); } - } + } source_data += source_step; target_data += target_step; } @@ -464,7 +484,7 @@ void wxImage::Replace( unsigned char r1, unsigned char g1, unsigned char b1, } } -wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) +wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const { wxImage image; @@ -1019,7 +1039,10 @@ wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype ) void wxImage::InitStandardHandlers() { - AddHandler( new wxBMPHandler ); + AddHandler(new wxBMPHandler); +#if !defined(__WXGTK__) && !defined(__WXMOTIF__) + AddHandler(new wxXPMHandler); +#endif } void wxImage::CleanUpHandlers() @@ -1084,7 +1107,7 @@ bool wxImageHandler::CanRead( const wxString& name ) #if wxUSE_GUI #ifdef __WXGTK__ -wxBitmap wxImage::ConvertToMonoBitmap( unsigned char red, unsigned char green, unsigned char blue ) +wxBitmap wxImage::ConvertToMonoBitmap( unsigned char red, unsigned char green, unsigned char blue ) const { wxImage mono = this->ConvertToMono( red, green, blue ); wxBitmap bitmap( mono, 1 ); @@ -1136,7 +1159,8 @@ unsigned long wxImage::CountColours( unsigned long stopafter ) { wxHashTable h; wxObject dummy; - unsigned char r, g, b, *p; + unsigned char r, g, b; + unsigned char *p; unsigned long size, nentries, key; p = GetData(); @@ -1170,7 +1194,8 @@ unsigned long wxImage::CountColours( unsigned long stopafter ) // unsigned long wxImage::ComputeHistogram( wxHashTable &h ) { - unsigned char r, g, b, *p; + unsigned char r, g, b; + unsigned char *p; unsigned long size, nentries, key; wxHNode *hnode; @@ -1460,3 +1485,4 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i return rotated; } +#endif // wxUSE_IMAGE