]> git.saurik.com Git - wxWidgets.git/commitdiff
implement GetImageCount() for GIF handler (closes #10663); added test for it to the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 5 Apr 2009 12:52:22 +0000 (12:52 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 5 Apr 2009 12:52:22 +0000 (12:52 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/imaggif.h
interface/wx/image.h
samples/image/image.cpp
src/common/imaggif.cpp

index 29f6e9ab0eb3942ba873b9b91649481b74225460..b3ced8fea4d69399fbf3f6dcaa1cd77c7794780c 100644 (file)
@@ -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:
 
index d4f170843ba187409aa750a5407e99b54f735f63..7912cf956f1f8f3aea9bc741433c8730c3e867c5 100644 (file)
@@ -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_
 
index 54c7ebd73a2c579b76215c54ddbbd375ad90d630..80c8100f2c4678f67802a2d64a5c355721125907 100644 (file)
@@ -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);
index 9d1d42a7f2c555f187bc4cfd412b7fa21d41570c..47a2b9d3ae4670927c9ac68cbaec636669dc2a74 100644 (file)
@@ -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") );
index 22a8dc04cca7c1ec2b2172f9a26a0c874510faaf..7b241bd6e19ac143aa056601b4d0b91803db9286 100644 (file)
@@ -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