#include "wx/stream.h"
#endif
+#include "wx/wfstream.h"
+
#include <gtk/gtk.h>
// ============================================================================
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)
bool wxAnimation::LoadFile(const wxString &name, wxAnimationType WXUNUSED(type))
{
UnRef();
- m_pixbuf = gdk_pixbuf_animation_new_from_file(
- wxConvFileName->cWX2MB(name), NULL);
+ m_pixbuf = gdk_pixbuf_animation_new_from_file(name.fn_str(), NULL);
return IsOk();
}
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;
}
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
- 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))
{
- 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;
}
+
+ 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))
{
- 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 true;
+ return data_written;
}
wxImage wxAnimation::GetFrame(unsigned int WXUNUSED(frame)) const
SetWindowStyle(style);
m_widget = gtk_image_new();
+ g_object_ref(m_widget);
gtk_widget_show(m_widget);
m_parent->DoAddChild( this );
}
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;
- if (!anim.LoadFile(filename, type))
+ if ( !anim.Load(stream, type) || !anim.IsOk() )
return false;
SetAnimation(anim);
if (m_bmpStaticReal.IsOk())
{
// show inactive bitmap
- GdkBitmap *mask = (GdkBitmap *) NULL;
+ GdkBitmap *mask = NULL;
if (m_bmpStaticReal.GetMask())
mask = m_bmpStaticReal.GetMask()->GetBitmap();
// wxAnimationCtrl - event handlers
//-----------------------------------------------------------------------------
-void wxAnimationCtrl::OnTimer(wxTimerEvent &ev)
+void wxAnimationCtrl::OnTimer(wxTimerEvent& WXUNUSED(ev))
{
wxASSERT(m_iter != NULL);