X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e458bb53997706d4432d2dc0b9b516320709389..198be845897a79ba350ae7f93db536ddb2eccfb2:/src/common/animatecmn.cpp diff --git a/src/common/animatecmn.cpp b/src/common/animatecmn.cpp index e9c0b8678a..e18c6e8d34 100644 --- a/src/common/animatecmn.cpp +++ b/src/common/animatecmn.cpp @@ -21,6 +21,10 @@ #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