X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/72045d5768a126191a907bc640c28e81a11afdd6..6cab4fcac7fe26d9ae5a1d29066e0893d689bb38:/src/common/animatecmn.cpp diff --git a/src/common/animatecmn.cpp b/src/common/animatecmn.cpp index d3b69867f5..4ba1483bac 100644 --- a/src/common/animatecmn.cpp +++ b/src/common/animatecmn.cpp @@ -20,16 +20,84 @@ #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; -//wxIMPLEMENT_HANDLER_LIST_MANAGER(wxAnimation, IMPLEMENT_ABSTRACT_CLASS(wxAnimationBase, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxAnimationCtrlBase, wxControl) +// ---------------------------------------------------------------------------- +// 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