]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/animate.cpp
Add another missing #if wxUSE_MARKUP check.
[wxWidgets.git] / src / gtk / animate.cpp
index 8786f1fde980b47493a532f1aa04fbc3bc2f5353..1975fcf5d068599957fe1541f8f2a060c3ba37c6 100644 (file)
@@ -22,6 +22,8 @@
     #include "wx/stream.h"
 #endif
 
     #include "wx/stream.h"
 #endif
 
+#include "wx/wfstream.h"
+
 #include <gtk/gtk.h>
 
 
 #include <gtk/gtk.h>
 
 
 // ============================================================================
 
 void gdk_pixbuf_area_updated(GdkPixbufLoader *loader,
 // ============================================================================
 
 void gdk_pixbuf_area_updated(GdkPixbufLoader *loader,
-                             gint             x,
-                             gint             y,
-                             gint             width,
-                             gint             height,
+                             gint             WXUNUSED(x),
+                             gint             WXUNUSED(y),
+                             gint             WXUNUSED(width),
+                             gint             WXUNUSED(height),
                              wxAnimation      *anim)
 {
     if (anim && anim->GetPixbuf() == NULL)
                              wxAnimation      *anim)
 {
     if (anim && anim->GetPixbuf() == NULL)
@@ -114,9 +116,11 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type)
     else
         loader = gdk_pixbuf_loader_new();
 
     else
         loader = gdk_pixbuf_loader_new();
 
-    if (!loader)
+    if (!loader ||
+        error != NULL)  // even if the loader was allocated, an error could have happened
     {
     {
-        wxLogDebug(wxT("Could not create the loader for '%s' animation type"), anim_type);
+        wxLogDebug(wxT("Could not create the loader for '%s' animation type: %s"),
+                   anim_type, error->message);
         return false;
     }
 
         return false;
     }
 
@@ -124,29 +128,48 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type)
     g_signal_connect(loader, "area-updated", G_CALLBACK(gdk_pixbuf_area_updated), this);
 
     guchar buf[2048];
     g_signal_connect(loader, "area-updated", G_CALLBACK(gdk_pixbuf_area_updated), this);
 
     guchar buf[2048];
+    bool data_written = false;
     while (stream.IsOk())
     {
         // read a chunk of data
     while (stream.IsOk())
     {
         // read a chunk of data
-        stream.Read(buf, sizeof(buf));
+        if (!stream.Read(buf, sizeof(buf)) &&
+            stream.GetLastError() != wxSTREAM_EOF)   // EOF is OK for now
+        {
+            // gdk_pixbuf_loader_close wants the GError == NULL
+            gdk_pixbuf_loader_close(loader, NULL);
+            return false;
+        }
 
         // fetch all data into the loader
         if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error))
         {
 
         // fetch all data into the loader
         if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error))
         {
-            gdk_pixbuf_loader_close(loader, &error);
-            wxLogDebug(wxT("Could not write to the loader"));
+            wxLogDebug(wxT("Could not write to the loader: %s"), error->message);
+
+            // gdk_pixbuf_loader_close wants the GError == NULL
+            gdk_pixbuf_loader_close(loader, NULL);
             return false;
         }
             return false;
         }
+
+        data_written = true;
     }
 
     }
 
-    // load complete
+    if (!data_written)
+    {
+        wxLogDebug("Could not read data from the stream...");
+        return false;
+    }
+
+    // load complete: gdk_pixbuf_loader_close will now check if the data we
+    // wrote inside the pixbuf loader does make sense and will give an error
+    // if it doesn't (because of a truncated file, corrupted data or whatelse)
     if (!gdk_pixbuf_loader_close(loader, &error))
     {
     if (!gdk_pixbuf_loader_close(loader, &error))
     {
-        wxLogDebug(wxT("Could not close the loader"));
+        wxLogDebug(wxT("Could not close the loader: %s"), error->message);
         return false;
     }
 
     // wait until we get the last area_updated signal
         return false;
     }
 
     // wait until we get the last area_updated signal
-    return true;
+    return data_written;
 }
 
 wxImage wxAnimation::GetFrame(unsigned int WXUNUSED(frame)) const
 }
 
 wxImage wxAnimation::GetFrame(unsigned int WXUNUSED(frame)) const
@@ -209,6 +232,7 @@ bool wxAnimationCtrl::Create( wxWindow *parent, wxWindowID id,
     SetWindowStyle(style);
 
     m_widget = gtk_image_new();
     SetWindowStyle(style);
 
     m_widget = gtk_image_new();
+    g_object_ref(m_widget);
     gtk_widget_show(m_widget);
 
     m_parent->DoAddChild( this );
     gtk_widget_show(m_widget);
 
     m_parent->DoAddChild( this );
@@ -232,9 +256,17 @@ wxAnimationCtrl::~wxAnimationCtrl()
 }
 
 bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type)
 }
 
 bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type)
+{
+    wxFileInputStream fis(filename);
+    if (!fis.IsOk())
+        return false;
+    return Load(fis, type);
+}
+
+bool wxAnimationCtrl::Load(wxInputStream& stream, wxAnimationType type)
 {
     wxAnimation anim;
 {
     wxAnimation anim;
-    if (!anim.LoadFile(filename, type))
+    if ( !anim.Load(stream, type) || !anim.IsOk() )
         return false;
 
     SetAnimation(anim);
         return false;
 
     SetAnimation(anim);
@@ -331,7 +363,7 @@ void wxAnimationCtrl::DisplayStaticImage()
     if (m_bmpStaticReal.IsOk())
     {
         // show inactive bitmap
     if (m_bmpStaticReal.IsOk())
     {
         // show inactive bitmap
-        GdkBitmap *mask = (GdkBitmap *) NULL;
+        GdkBitmap *mask = NULL;
         if (m_bmpStaticReal.GetMask())
             mask = m_bmpStaticReal.GetMask()->GetBitmap();
 
         if (m_bmpStaticReal.GetMask())
             mask = m_bmpStaticReal.GetMask()->GetBitmap();
 
@@ -420,7 +452,7 @@ bool wxAnimationCtrl::SetBackgroundColour( const wxColour &colour )
 // wxAnimationCtrl - event handlers
 //-----------------------------------------------------------------------------
 
 // wxAnimationCtrl - event handlers
 //-----------------------------------------------------------------------------
 
-void wxAnimationCtrl::OnTimer(wxTimerEvent &ev)
+void wxAnimationCtrl::OnTimer(wxTimerEvent& WXUNUSED(ev))
 {
     wxASSERT(m_iter != NULL);
 
 {
     wxASSERT(m_iter != NULL);