]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/animate/animate.cpp
added protection against corrupted GIFs in ReadGIF
[wxWidgets.git] / contrib / src / animate / animate.cpp
index ec393517d37eee941aae7345dc7329935f2601b9..97bf282767319b159a471c01c652706548601cb4 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-    #pragma implementation "animate.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef    __BORLANDC__
 #include "wx/wxprec.h"
 
 #ifdef    __BORLANDC__
 #include "wx/wfstream.h"
 #include "wx/image.h"
 #include "wx/gifdecod.h"
 #include "wx/wfstream.h"
 #include "wx/image.h"
 #include "wx/gifdecod.h"
-#include "wx/animate/animate.h"
 #include "wx/log.h"
 #include "wx/log.h"
+#include "wx/dcmemory.h"
+#include "wx/animate/animate.h"
 #include "wx/dc.h"
 #include "wx/dcclient.h"
 #include "wx/dc.h"
 #include "wx/dcclient.h"
-#include "wx/dcmemory.h"
 
 /*
  * wxAnimationPlayer
 
 /*
  * wxAnimationPlayer
@@ -109,7 +105,6 @@ bool wxAnimationPlayer::Build()
         int i;
         for (i = 0; i < n; i++)
         {
         int i;
         for (i = 0; i < n; i++)
         {
-            wxBitmap* bitmap = NULL;
             wxImage* image = GetFrame(i);
             if (image)
             {
             wxImage* image = GetFrame(i);
             if (image)
             {
@@ -120,7 +115,7 @@ bool wxAnimationPlayer::Build()
                 if (GetTransparentColour(transparentColour))
                     image->SetMaskColour(transparentColour.Red(), transparentColour.Green(), transparentColour.Blue());
 
                 if (GetTransparentColour(transparentColour))
                     image->SetMaskColour(transparentColour.Red(), transparentColour.Green(), transparentColour.Blue());
 
-                bitmap = new wxBitmap(* image);
+                wxBitmap* bitmap = new wxBitmap(* image);
                 delete image;
                 if (bitmap)
                     m_frames.Append(bitmap);
                 delete image;
                 if (bitmap)
                     m_frames.Append(bitmap);
@@ -246,7 +241,7 @@ bool wxAnimationPlayer::PlayFrame(int frame, wxWindow& window, const wxPoint& WX
     // Draw all intermediate frames that haven't been removed from the
     // animation
     int i;
     // Draw all intermediate frames that haven't been removed from the
     // animation
     int i;
-    for (i = 0; i < (frame - 1); i++)
+    for (i = 0; i < frame; i++)
     {
         if ((GetDisposalMethod(i) == wxANIM_DONOTREMOVE) || (GetDisposalMethod(i) == wxANIM_UNSPECIFIED))
         {
     {
         if ((GetDisposalMethod(i) == wxANIM_DONOTREMOVE) || (GetDisposalMethod(i) == wxANIM_UNSPECIFIED))
         {
@@ -271,7 +266,11 @@ bool wxAnimationPlayer::PlayFrame()
     PlayFrame(GetCurrentFrame(), * GetWindow(), GetPosition());
 
     // Set the timer for the next frame
     PlayFrame(GetCurrentFrame(), * GetWindow(), GetPosition());
 
     // Set the timer for the next frame
-    m_timer.Start(GetDelay(GetCurrentFrame()));
+    int delay = GetDelay(GetCurrentFrame());
+    if (delay == 0)
+        delay = 1;      // 0 is invalid timeout for wxTimer.
+    
+    m_timer.Start(delay);
 
     m_currentFrame ++;
 
 
     m_currentFrame ++;
 
@@ -293,13 +292,13 @@ bool wxAnimationPlayer::PlayFrame()
 // Clear the wxImage cache
 void wxAnimationPlayer::ClearCache()
 {
 // Clear the wxImage cache
 void wxAnimationPlayer::ClearCache()
 {
-    wxNode* node = m_frames.GetFirst();
+    wxList::compatibility_iterator node = m_frames.GetFirst();
     while (node)
     {
     while (node)
     {
-        wxNode* next = node->GetNext();
+        wxList::compatibility_iterator next = node->GetNext();
         wxBitmap* bitmap = (wxBitmap*) node->GetData();
         delete bitmap;
         wxBitmap* bitmap = (wxBitmap*) node->GetData();
         delete bitmap;
-        delete node;
+        m_frames.Erase(node);
         node = next;
     }
 }
         node = next;
     }
 }
@@ -370,7 +369,7 @@ void wxAnimationPlayer::DrawFrame(int frame, wxDC& dc, const wxPoint& pos)
 {
     wxASSERT_MSG( (m_animation != NULL), _T("Animation not present in wxAnimationPlayer"));
     wxASSERT_MSG( (m_frames.GetCount() != 0), _T("Animation cache not present in wxAnimationPlayer"));
 {
     wxASSERT_MSG( (m_animation != NULL), _T("Animation not present in wxAnimationPlayer"));
     wxASSERT_MSG( (m_frames.GetCount() != 0), _T("Animation cache not present in wxAnimationPlayer"));
-    wxASSERT_MSG( (m_frames.Item(frame) != (wxNode*) NULL), _T("Image not present in wxAnimationPlayer::DrawFrame"));
+    wxASSERT_MSG( !!m_frames.Item(frame), _T("Image not present in wxAnimationPlayer::DrawFrame"));
 
     wxBitmap* bitmap = (wxBitmap*) m_frames.Item(frame)->GetData() ;
 
 
     wxBitmap* bitmap = (wxBitmap*) m_frames.Item(frame)->GetData() ;
 
@@ -417,7 +416,7 @@ wxImage* wxGIFAnimation::GetFrame(int i) const
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
-    m_decoder->GoFrame(i);
+    m_decoder->GoFrame(i + 1);
 
     wxImage* image = new wxImage;
     m_decoder->ConvertToImage(image);
 
     wxImage* image = new wxImage;
     m_decoder->ConvertToImage(image);
@@ -428,7 +427,7 @@ wxAnimationDisposal wxGIFAnimation::GetDisposalMethod(int i) const
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
-    m_decoder->GoFrame(i);
+    m_decoder->GoFrame(i + 1);
 
     int disposalMethod = m_decoder->GetDisposalMethod();
     return (wxAnimationDisposal) disposalMethod;
 
     int disposalMethod = m_decoder->GetDisposalMethod();
     return (wxAnimationDisposal) disposalMethod;
@@ -438,7 +437,7 @@ wxRect wxGIFAnimation::GetFrameRect(int i) const
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
-    m_decoder->GoFrame(i);
+    m_decoder->GoFrame(i + 1);
 
     wxRect rect(m_decoder->GetLeft(), m_decoder->GetTop(), m_decoder->GetWidth(), m_decoder->GetHeight());
     return rect;
 
     wxRect rect(m_decoder->GetLeft(), m_decoder->GetTop(), m_decoder->GetWidth(), m_decoder->GetHeight());
     return rect;
@@ -448,7 +447,7 @@ int wxGIFAnimation::GetDelay(int i) const
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
 {
     wxASSERT_MSG( (m_decoder != (wxGIFDecoder*) NULL), _T("m_decoder must be non-NULL"));
 
-    m_decoder->GoFrame(i);
+    m_decoder->GoFrame(i + 1);
     return m_decoder->GetDelay();
 }
 
     return m_decoder->GetDelay();
 }
 
@@ -573,6 +572,8 @@ bool wxAnimationCtrlBase::Create(wxWindow *parent, wxWindowID id,
     m_animationPlayer.SetPosition(wxPoint(0, 0));
     m_animationPlayer.SetDestroyAnimation(FALSE);
 
     m_animationPlayer.SetPosition(wxPoint(0, 0));
     m_animationPlayer.SetDestroyAnimation(FALSE);
 
+    LoadFile(filename);
+    
     return TRUE;
 }
 
     return TRUE;
 }