]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/animatecmn.cpp
no real changes, just refactor to remove some code duplication in wxToolBarTool
[wxWidgets.git] / src / common / animatecmn.cpp
index e9c0b8678a2d85753c23d81f47ee3cbe921081e7..e18c6e8d34f84f660afe5574e4eb525b90ed9129 100644 (file)
 
 #include "wx/animate.h"
 #include "wx/bitmap.h"
+#include "wx/log.h"
+#include "wx/brush.h"
+#include "wx/image.h"
+#include "wx/dcmemory.h"
 
 const wxChar wxAnimationCtrlNameStr[] = wxT("animationctrl");
 
@@ -30,11 +34,70 @@ wxAnimation wxNullAnimation;
 IMPLEMENT_ABSTRACT_CLASS(wxAnimationBase, wxObject)
 IMPLEMENT_ABSTRACT_CLASS(wxAnimationCtrlBase, wxControl)
 
-void wxAnimationCtrlBase::SetInactiveBitmap(const wxBitmap &bmp)
-{ 
-    m_bmpStatic = bmp; 
-    m_bmpStatic.UnShare();
+
+// ----------------------------------------------------------------------------
+// wxAnimationCtrlBase
+// ----------------------------------------------------------------------------
+
+void wxAnimationCtrlBase::UpdateStaticImage()
+{
+    if (!m_bmpStaticReal.IsOk() || !m_bmpStatic.IsOk())
+        return;
+
+    // if given bitmap is not of the right size, recreate m_bmpStaticReal accordingly
+    const wxSize &sz = GetClientSize();
+    if (sz.GetWidth() != m_bmpStaticReal.GetWidth() ||
+        sz.GetHeight() != m_bmpStaticReal.GetHeight())
+    {
+        if (!m_bmpStaticReal.IsOk() ||
+            m_bmpStaticReal.GetWidth() != sz.GetWidth() ||
+            m_bmpStaticReal.GetHeight() != sz.GetHeight())
+        {
+            // need to (re)create m_bmpStaticReal
+            if (!m_bmpStaticReal.Create(sz.GetWidth(), sz.GetHeight(),
+                                        m_bmpStatic.GetDepth()))
+            {
+                wxLogDebug(wxT("Cannot create the static bitmap"));
+                m_bmpStatic = wxNullBitmap;
+                return;
+            }
+        }
+
+        if (m_bmpStatic.GetWidth() <= sz.GetWidth() &&
+            m_bmpStatic.GetHeight() <= sz.GetHeight())
+        {
+            // clear the background of m_bmpStaticReal
+            wxBrush brush(GetBackgroundColour());
+            wxMemoryDC dc;
+            dc.SelectObject(m_bmpStaticReal);
+            dc.SetBackground(brush);
+            dc.Clear();
+
+            // center the user-provided bitmap in m_bmpStaticReal
+            dc.DrawBitmap(m_bmpStatic,
+                        (sz.GetWidth()-m_bmpStatic.GetWidth())/2,
+                        (sz.GetHeight()-m_bmpStatic.GetHeight())/2,
+                        true /* use mask */ );
+        }
+        else
+        {
+            // the user-provided bitmap is bigger than our control, strech it
+            wxImage temp(m_bmpStatic.ConvertToImage());
+            temp.Rescale(sz.GetWidth(), sz.GetHeight(), wxIMAGE_QUALITY_HIGH);
+            m_bmpStaticReal = wxBitmap(temp);
+        }
+    }
 }
 
+void wxAnimationCtrlBase::SetInactiveBitmap(const wxBitmap &bmp)
+{
+    m_bmpStatic = bmp;
+    m_bmpStaticReal = bmp;
+
+    // if not playing, update the control now
+    // NOTE: DisplayStaticImage() will call UpdateStaticImage automatically
+    if ( !IsPlaying() )
+        DisplayStaticImage();
+}
 
 #endif      // wxUSE_ANIMATIONCTRL