X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/580ca0a4e10dbd2fb0a144065004394b9d5dcc56..088441b57cb88b8c04f8a03a7be5a5744aac6187:/src/common/animatecmn.cpp diff --git a/src/common/animatecmn.cpp b/src/common/animatecmn.cpp index 512c309942..4ba1483bac 100644 --- a/src/common/animatecmn.cpp +++ b/src/common/animatecmn.cpp @@ -21,8 +21,12 @@ #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; @@ -31,4 +35,69 @@ 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