+ // In case this is a cursor, make sure the hotspot is scalled accordingly:
+ if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X) )
+ image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X,
+ (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X))/xFactor);
+ if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y) )
+ image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y,
+ (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y))/yFactor);
+
+ return image;
+}
+
+wxImage wxImage::Scale( int width, int height ) const
+{
+ wxImage image;
+
+ wxCHECK_MSG( Ok(), image, wxT("invalid image") );
+
+ // 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") );
+
+ if ( old_width % width == 0 && old_width >= width &&
+ old_height % height == 0 && old_height >= height )
+ {
+ return ShrinkBy( old_width / width , old_height / height ) ;
+ }
+ image.Create( width, height, false );
+
+ unsigned char *data = image.GetData();
+
+ 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 );
+ }
+
+ unsigned char *source_data = M_IMGDATA->m_data;
+ unsigned char *target_data = data;
+
+ long x_delta = (old_width<<16) / width;
+ long y_delta = (old_height<<16) / height;
+
+ unsigned char* dest_pixel = target_data;
+
+ long y = 0;
+ for ( long j = 0; j < height; j++ )
+ {
+ unsigned char* src_line = &source_data[(y>>16)*old_width*3];
+
+ long x = 0;
+ for ( long i = 0; i < width; i++ )