From: Vadim Zeitlin <vadim@wxwidgets.org> Date: Sun, 5 Apr 2009 12:52:22 +0000 (+0000) Subject: implement GetImageCount() for GIF handler (closes #10663); added test for it to the... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/85fcb94fc99880e8fdb127ea1fc6cb0aefa6986d implement GetImageCount() for GIF handler (closes #10663); added test for it to the sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 29f6e9ab0e..b3ced8fea4 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -519,6 +519,7 @@ All (GUI): - Check whether document fits into page horizontally in wxHtmlPrintout, see the new CheckFit() method for more information. - Allow reading GIFs with incorrectly specified animation size. +- Return number of frames in animated GIF from wxGIFHandler::GetImageCount(). wxGTK: diff --git a/include/wx/imaggif.h b/include/wx/imaggif.h index d4f170843b..7912cf956f 100644 --- a/include/wx/imaggif.h +++ b/include/wx/imaggif.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: imaggif.h +// Name: wx/imaggif.h // Purpose: wxImage GIF handler // Author: Vaclav Slavik & Guillermo Rodriguez Garcia // RCS-ID: $Id$ @@ -31,18 +31,20 @@ public: } #if wxUSE_STREAMS - virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); - virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual bool LoadFile(wxImage *image, wxInputStream& stream, + bool verbose = true, int index = -1); + virtual bool SaveFile(wxImage *image, wxOutputStream& stream, + bool verbose=true); + virtual int GetImageCount(wxInputStream& stream); protected: - virtual bool DoCanRead( wxInputStream& stream ); -#endif + virtual bool DoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS private: DECLARE_DYNAMIC_CLASS(wxGIFHandler) }; -#endif +#endif // wxUSE_GIF -#endif - // _WX_IMAGGIF_H_ +#endif // _WX_IMAGGIF_H_ diff --git a/interface/wx/image.h b/interface/wx/image.h index 54c7ebd73a..80c8100f2c 100644 --- a/interface/wx/image.h +++ b/interface/wx/image.h @@ -109,7 +109,9 @@ public: Currently, the stream must support seeking. @return Number of available images. For most image handlers, this is 1 - (exceptions are TIFF and ICO formats). + (exceptions are TIFF and ICO formats as well as animated GIFs + for which this function returns the number of frames in the + animation). */ virtual int GetImageCount(wxInputStream& stream); @@ -1603,7 +1605,9 @@ public: @li wxBITMAP_TYPE_ANY: Will try to autodetect the format. @return Number of available images. For most image handlers, this is 1 - (exceptions are TIFF and ICO formats). + (exceptions are TIFF and ICO formats as well as animated GIFs + for which this function returns the number of frames in the + animation). */ static int GetImageCount(const wxString& filename, wxBitmapType type = wxBITMAP_TYPE_ANY); diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 9d1d42a7f2..47a2b9d3ae 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -117,13 +117,29 @@ enum class MyImageFrame : public wxFrame { public: + MyImageFrame(wxFrame *parent, const wxString& desc, const wxImage& image) + { + Create(parent, desc, wxBitmap(image), image.GetImageCount(desc)); + } + MyImageFrame(wxFrame *parent, const wxString& desc, const wxBitmap& bitmap) - : wxFrame(parent, wxID_ANY, - wxString::Format(_T("Image from %s"), desc.c_str()), - wxDefaultPosition, wxDefaultSize, - wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE), - m_bitmap(bitmap) { + Create(parent, desc, bitmap); + } + + bool Create(wxFrame *parent, + const wxString& desc, + const wxBitmap& bitmap, + int numImages = 1) + { + if ( !wxFrame::Create(parent, wxID_ANY, + wxString::Format(_T("Image from %s"), desc), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE) ) + return false; + + m_bitmap = bitmap; + wxMenu *menu = new wxMenu; menu->Append(wxID_SAVE); menu->AppendSeparator(); @@ -138,13 +154,17 @@ public: mbar->Append(menu, _T("&Image")); SetMenuBar(mbar); - CreateStatusBar(); + CreateStatusBar(2); + if ( numImages != 1 ) + SetStatusText(wxString::Format("%d images", numImages), 1); SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); UpdateStatusBar(); -// SetBackgroundColour(*wxWHITE); + Show(); + + return true; } void OnEraseBackground(wxEraseEvent& WXUNUSED(event)) @@ -656,7 +676,7 @@ void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) ) wxImage image; wxString filename = LoadUserImage(image); if ( !filename.empty() ) - (new MyImageFrame(this, filename, wxBitmap(image)))->Show(); + new MyImageFrame(this, filename, image); } void MyFrame::OnImageInfo( wxCommandEvent &WXUNUSED(event) ) @@ -735,7 +755,7 @@ void MyFrame::OnPaste(wxCommandEvent& WXUNUSED(event)) } else { - (new MyImageFrame(this, _T("Clipboard"), dobjBmp.GetBitmap()))->Show(); + new MyImageFrame(this, _T("Clipboard"), dobjBmp.GetBitmap()); } wxTheClipboard->Close(); } @@ -765,9 +785,7 @@ void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) ) const long loadTime = sw.Time(); - MyImageFrame * const - frame = new MyImageFrame(this, filename, wxBitmap(image)); - frame->Show(); + MyImageFrame * const frame = new MyImageFrame(this, filename, image); wxLogStatus(frame, "Loaded \"%s\" in %ldms", filename, loadTime); #else wxLogError( _T("Couldn't create file selector dialog") ); diff --git a/src/common/imaggif.cpp b/src/common/imaggif.cpp index 22a8dc04cc..7b241bd6e1 100644 --- a/src/common/imaggif.cpp +++ b/src/common/imaggif.cpp @@ -100,6 +100,16 @@ bool wxGIFHandler::DoCanRead( wxInputStream& stream ) return decod.CanRead(stream); } +int wxGIFHandler::GetImageCount( wxInputStream& stream ) +{ + wxGIFDecoder decod; + wxGIFErrorCode error = decod.LoadGIF(stream); + if ( (error != wxGIF_OK) && (error != wxGIF_TRUNCATED) ) + return -1; + + return decod.GetFrameCount(); +} + #endif // wxUSE_STREAMS #endif // wxUSE_GIF