X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e458bb53997706d4432d2dc0b9b516320709389..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/common/animatecmn.cpp?ds=sidebyside diff --git a/src/common/animatecmn.cpp b/src/common/animatecmn.cpp index e9c0b8678a..2bee893970 100644 --- a/src/common/animatecmn.cpp +++ b/src/common/animatecmn.cpp @@ -17,12 +17,20 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + #if wxUSE_ANIMATIONCTRL #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"); +const char wxAnimationCtrlNameStr[] = "animationctrl"; // global object wxAnimation wxNullAnimation; @@ -30,11 +38,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