projects
/
wxWidgets.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add doc for wxGraphicsContext.Create(), which is a lightweight context with no target...
[wxWidgets.git]
/
src
/
gtk
/
animate.cpp
diff --git
a/src/gtk/animate.cpp
b/src/gtk/animate.cpp
index c6f7abe951466dd3e15bf5bf4609750ee604b3f7..a70e92e87217d5342af4e8ab2b65f39ad60b179f 100644
(file)
--- a/
src/gtk/animate.cpp
+++ b/
src/gtk/animate.cpp
@@
-23,6
+23,7
@@
#endif
#include "wx/wfstream.h"
#endif
#include "wx/wfstream.h"
+#include "wx/gtk/private.h"
#include <gtk/gtk.h>
#include <gtk/gtk.h>
@@
-84,7
+85,7
@@
wxAnimation& wxAnimation::operator=(const wxAnimation& that)
bool wxAnimation::LoadFile(const wxString &name, wxAnimationType WXUNUSED(type))
{
UnRef();
bool wxAnimation::LoadFile(const wxString &name, wxAnimationType WXUNUSED(type))
{
UnRef();
- m_pixbuf = gdk_pixbuf_animation_new_from_file(
name.fn_str(
), NULL);
+ m_pixbuf = gdk_pixbuf_animation_new_from_file(
wxGTK_CONV_FN(name
), NULL);
return IsOk();
}
return IsOk();
}
@@
-116,7
+117,8
@@
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: %s"),
anim_type, error->message);
{
wxLogDebug(wxT("Could not create the loader for '%s' animation type: %s"),
anim_type, error->message);
@@
-127,21
+129,40
@@
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: %s"), error->message);
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))
{
wxLogDebug(wxT("Could not close the loader: %s"), error->message);
if (!gdk_pixbuf_loader_close(loader, &error))
{
wxLogDebug(wxT("Could not close the loader: %s"), error->message);
@@
-149,7
+170,7
@@
bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type)
}
// wait until we get the last area_updated signal
}
// 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
@@
-213,7
+234,6
@@
bool wxAnimationCtrl::Create( wxWindow *parent, wxWindowID id,
m_widget = gtk_image_new();
g_object_ref(m_widget);
m_widget = gtk_image_new();
g_object_ref(m_widget);
- gtk_widget_show(m_widget);
m_parent->DoAddChild( this );
m_parent->DoAddChild( this );
@@
-238,6
+258,8
@@
wxAnimationCtrl::~wxAnimationCtrl()
bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type)
{
wxFileInputStream fis(filename);
bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type)
{
wxFileInputStream fis(filename);
+ if (!fis.IsOk())
+ return false;
return Load(fis, type);
}
return Load(fis, type);
}
@@
-341,20
+363,8
@@
void wxAnimationCtrl::DisplayStaticImage()
if (m_bmpStaticReal.IsOk())
{
// show inactive bitmap
if (m_bmpStaticReal.IsOk())
{
// show inactive bitmap
- GdkBitmap *mask = (GdkBitmap *) NULL;
- if (m_bmpStaticReal.GetMask())
- mask = m_bmpStaticReal.GetMask()->GetBitmap();
-
- if (m_bmpStaticReal.HasPixbuf())
- {
- gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget),
+ gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget),
m_bmpStaticReal.GetPixbuf());
m_bmpStaticReal.GetPixbuf());
- }
- else
- {
- gtk_image_set_from_pixmap(GTK_IMAGE(m_widget),
- m_bmpStaticReal.GetPixmap(), mask);
- }
}
else
{
}
else
{