Added wxIMAGE_OPTION_ORIGINAL_{WIDTH,HEIGHT} wxImage options.

These options allow to retrieve the original image size if the image was
scaled during load.

Closes #13662.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-11-14 13:35:48 +00:00
parent d6c37f5bc4
commit b6963858fb
6 changed files with 34 additions and 1 deletions

View File

@@ -490,6 +490,7 @@ All (GUI):
- Add "checked" property for toolbar tool elements in XRC. - Add "checked" property for toolbar tool elements in XRC.
- Allow customization of the locations where persistent settings are stored. - Allow customization of the locations where persistent settings are stored.
- Restore support for reusing ids more than 254 times (Armel Asselin). - Restore support for reusing ids more than 254 times (Armel Asselin).
- Added wxIMAGE_OPTION_ORIGINAL_{WIDTH,HEIGHT} (Catalin Raceanu).
OSX: OSX:

View File

@@ -40,6 +40,9 @@
#define wxIMAGE_OPTION_MAX_WIDTH wxString(wxT("MaxWidth")) #define wxIMAGE_OPTION_MAX_WIDTH wxString(wxT("MaxWidth"))
#define wxIMAGE_OPTION_MAX_HEIGHT wxString(wxT("MaxHeight")) #define wxIMAGE_OPTION_MAX_HEIGHT wxString(wxT("MaxHeight"))
#define wxIMAGE_OPTION_ORIGINAL_WIDTH wxString(wxT("OriginalWidth"))
#define wxIMAGE_OPTION_ORIGINAL_HEIGHT wxString(wxT("OriginalHeight"))
// constants used with wxIMAGE_OPTION_RESOLUTIONUNIT // constants used with wxIMAGE_OPTION_RESOLUTIONUNIT
// //
// NB: don't change these values, they correspond to libjpeg constants // NB: don't change these values, they correspond to libjpeg constants

View File

@@ -86,6 +86,8 @@ enum wxImagePNGType
#define wxIMAGE_OPTION_RESOLUTIONUNIT wxString(wxT("ResolutionUnit")) #define wxIMAGE_OPTION_RESOLUTIONUNIT wxString(wxT("ResolutionUnit"))
#define wxIMAGE_OPTION_MAX_WIDTH wxString(wxT("MaxWidth")) #define wxIMAGE_OPTION_MAX_WIDTH wxString(wxT("MaxWidth"))
#define wxIMAGE_OPTION_MAX_HEIGHT wxString(wxT("MaxHeight")) #define wxIMAGE_OPTION_MAX_HEIGHT wxString(wxT("MaxHeight"))
#define wxIMAGE_OPTION_ORIGINAL_WIDTH wxString(wxT("OriginalWidth"))
#define wxIMAGE_OPTION_ORIGINAL_HEIGHT wxString(wxT("OriginalHeight"))
#define wxIMAGE_OPTION_BMP_FORMAT wxString(wxT("wxBMP_FORMAT")) #define wxIMAGE_OPTION_BMP_FORMAT wxString(wxT("wxBMP_FORMAT"))
#define wxIMAGE_OPTION_CUR_HOTSPOT_X wxString(wxT("HotSpotX")) #define wxIMAGE_OPTION_CUR_HOTSPOT_X wxString(wxT("HotSpotX"))
@@ -1182,6 +1184,12 @@ public:
handler, this is still what happens however). These options must be handler, this is still what happens however). These options must be
set before calling LoadFile() to have any effect. set before calling LoadFile() to have any effect.
@li @c wxIMAGE_OPTION_ORIGINAL_WIDTH and @c wxIMAGE_OPTION_ORIGINAL_HEIGHT:
These options will return the original size of the image if either
@c wxIMAGE_OPTION_MAX_WIDTH or @c wxIMAGE_OPTION_MAX_HEIGHT is
specified.
@since 2.9.3
@li @c wxIMAGE_OPTION_QUALITY: JPEG quality used when saving. This is an @li @c wxIMAGE_OPTION_QUALITY: JPEG quality used when saving. This is an
integer in 0..100 range with 0 meaning very poor and 100 excellent integer in 0..100 range with 0 meaning very poor and 100 excellent
(but very badly compressed). This option is currently ignored for (but very badly compressed). This option is currently ignored for

View File

@@ -944,10 +944,14 @@ void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) )
return; return;
} }
int origWidth = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_WIDTH );
int origHeight = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_HEIGHT );
const long loadTime = sw.Time(); const long loadTime = sw.Time();
MyImageFrame * const frame = new MyImageFrame(this, filename, image); MyImageFrame * const frame = new MyImageFrame(this, filename, image);
wxLogStatus(frame, "Loaded \"%s\" in %ldms", filename, loadTime); wxLogStatus(frame, "Loaded \"%s\" in %ldms; original size was (%d, %d)",
filename, loadTime, origWidth, origHeight);
#else #else
wxLogError( wxT("Couldn't create file selector dialog") ); wxLogError( wxT("Couldn't create file selector dialog") );
return; return;

View File

@@ -2450,7 +2450,17 @@ bool wxImage::DoLoad(wxImageHandler& handler, wxInputStream& stream, int index)
} }
if ( width != widthOrig || height != heightOrig ) if ( width != widthOrig || height != heightOrig )
{
// get the original size if it was set by the image handler
// but also in order to restore it after Rescale
int widthOrigOption = GetOptionInt(wxIMAGE_OPTION_ORIGINAL_WIDTH),
heightOrigOption = GetOptionInt(wxIMAGE_OPTION_ORIGINAL_HEIGHT);
Rescale(width, height, wxIMAGE_QUALITY_HIGH); Rescale(width, height, wxIMAGE_QUALITY_HIGH);
SetOption(wxIMAGE_OPTION_ORIGINAL_WIDTH, widthOrigOption ? widthOrigOption : widthOrig);
SetOption(wxIMAGE_OPTION_ORIGINAL_HEIGHT, heightOrigOption ? heightOrigOption : heightOrig);
}
} }
// Set this after Rescale, which currently does not preserve it // Set this after Rescale, which currently does not preserve it

View File

@@ -334,6 +334,13 @@ bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
image->SetOption(wxIMAGE_OPTION_RESOLUTIONUNIT, cinfo.density_unit); image->SetOption(wxIMAGE_OPTION_RESOLUTIONUNIT, cinfo.density_unit);
} }
if ( cinfo.image_width != cinfo.output_width || cinfo.image_height != cinfo.output_height )
{
// save the original image size
image->SetOption(wxIMAGE_OPTION_ORIGINAL_WIDTH, cinfo.image_width);
image->SetOption(wxIMAGE_OPTION_ORIGINAL_HEIGHT, cinfo.image_height);
}
jpeg_finish_decompress( &cinfo ); jpeg_finish_decompress( &cinfo );
jpeg_destroy_decompress( &cinfo ); jpeg_destroy_decompress( &cinfo );
return true; return true;