X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b6a582bef796b43ad4cf0a96bd40bfd631460c6..41550985f202b60e7e50142113b19e633d578bf0:/src/msw/dc.cpp?ds=sidebyside diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 55724274f7..320d587437 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -44,14 +44,14 @@ #include "wx/dynlib.h" #ifdef wxHAS_RAW_BITMAP -#include "wx/rawbmp.h" + #include "wx/rawbmp.h" #endif #include -#ifndef __WIN32__ - #include -#endif +#include "wx/msw/private/dc.h" + +using namespace wxMSWImpl; #ifndef AC_SRC_ALPHA #define AC_SRC_ALPHA 1 @@ -149,119 +149,6 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, // private classes // ---------------------------------------------------------------------------- -// various classes to change some DC property temporarily - -// text background and foreground colours -class wxTextColoursChanger -{ -public: - wxTextColoursChanger(HDC hdc, const wxMSWDCImpl& dc) - : m_hdc(hdc) - { - Change(dc.GetTextForeground(), dc.GetTextBackground()); - } - - wxTextColoursChanger(HDC hdc, const wxColour& colFg, const wxColour& colBg) - : m_hdc(hdc) - { - Change(colFg, colBg); - } - - ~wxTextColoursChanger() - { - if ( m_oldColFg != CLR_INVALID ) - ::SetTextColor(m_hdc, m_oldColFg); - if ( m_oldColBg != CLR_INVALID ) - ::SetBkColor(m_hdc, m_oldColBg); - } - -protected: - // this ctor doesn't change mode immediately, call Change() later to do it - // only if needed - wxTextColoursChanger(HDC hdc) - : m_hdc(hdc) - { - m_oldColFg = - m_oldColBg = CLR_INVALID; - } - - void Change(const wxColour& colFg, const wxColour& colBg) - { - if ( colFg.IsOk() ) - { - m_oldColFg = ::SetTextColor(m_hdc, colFg.GetPixel()); - if ( m_oldColFg == CLR_INVALID ) - { - wxLogLastError(_T("SetTextColor")); - } - } - else - { - m_oldColFg = CLR_INVALID; - } - - if ( colBg.IsOk() ) - { - m_oldColBg = ::SetBkColor(m_hdc, colBg.GetPixel()); - if ( m_oldColBg == CLR_INVALID ) - { - wxLogLastError(_T("SetBkColor")); - } - } - else - { - m_oldColBg = CLR_INVALID; - } - } - -private: - const HDC m_hdc; - COLORREF m_oldColFg, - m_oldColBg; - - wxDECLARE_NO_COPY_CLASS(wxTextColoursChanger); -}; - -// background mode -class wxBkModeChanger -{ -public: - // set background mode to opaque if mode != wxBRUSHSTYLE_TRANSPARENT - wxBkModeChanger(HDC hdc, int mode) - : m_hdc(hdc) - { - Change(mode); - } - - ~wxBkModeChanger() - { - if ( m_oldMode ) - ::SetBkMode(m_hdc, m_oldMode); - } - -protected: - // this ctor doesn't change mode immediately, call Change() later to do it - // only if needed - wxBkModeChanger(HDC hdc) : m_hdc(hdc) { m_oldMode = 0; } - - void Change(int mode) - { - m_oldMode = ::SetBkMode(m_hdc, mode == wxBRUSHSTYLE_TRANSPARENT - ? TRANSPARENT - : OPAQUE); - if ( !m_oldMode ) - { - wxLogLastError(_T("SetBkMode")); - } - } - -private: - const HDC m_hdc; - int m_oldMode; - - wxDECLARE_NO_COPY_CLASS(wxBkModeChanger); -}; - // instead of duplicating the same code which sets and then restores text // colours in each wxDC method working with wxSTIPPLE_MASK_OPAQUE brushes, // encapsulate this in a small helper class @@ -278,27 +165,31 @@ private: wxDECLARE_NO_COPY_CLASS(wxBrushAttrsSetter); }; -// this class saves the old stretch blit mode during its life time +#ifdef __WXWINCE__ + +#define SET_STRETCH_BLT_MODE(hdc) + +#else // !__WXWINCE__ + +// this class sets the stretch blit mode to COLORONCOLOR during its lifetime +// +// don't use it directly, use SET_STRETCH_BLT_MODE() macro instead as it +// expands to nothing under WinCE which doesn't have SetStretchBltMode() class StretchBltModeChanger { public: - StretchBltModeChanger(HDC hdc, - int WXUNUSED_IN_WINCE(mode)) + StretchBltModeChanger(HDC hdc) : m_hdc(hdc) { -#ifndef __WXWINCE__ - m_modeOld = ::SetStretchBltMode(m_hdc, mode); + m_modeOld = ::SetStretchBltMode(m_hdc, COLORONCOLOR); if ( !m_modeOld ) wxLogLastError(_T("SetStretchBltMode")); -#endif } ~StretchBltModeChanger() { -#ifndef __WXWINCE__ if ( !::SetStretchBltMode(m_hdc, m_modeOld) ) wxLogLastError(_T("SetStretchBltMode")); -#endif } private: @@ -309,6 +200,11 @@ private: wxDECLARE_NO_COPY_CLASS(StretchBltModeChanger); }; +#define SET_STRETCH_BLT_MODE(hdc) \ + StretchBltModeChanger wxMAKE_UNIQUE_NAME(stretchModeChanger)(hdc) + +#endif // __WXWINCE__/!__WXWINCE__ + #if wxUSE_DYNLIB_CLASS // helper class to cache dynamically loaded libraries and not attempt reloading @@ -1294,6 +1190,8 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool return; } + SET_STRETCH_BLT_MODE(GetHdc()); + if ( useMask ) { wxMask *mask = bmp.GetMask(); @@ -2212,9 +2110,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, wxLogLastError(wxT("BitBlt")); } -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(dc_buffer, COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); // copy src to buffer using selected raster op if ( !::StretchBlt(dc_buffer, 0, 0, dstWidth, dstHeight, @@ -2282,7 +2178,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, sizeof(ds), &ds) == sizeof(ds) ) { - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + SET_STRETCH_BLT_MODE(GetHdc()); // Figure out what co-ordinate system we're supposed to specify // ysrc in. @@ -2321,9 +2217,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, #endif // __WXWINCE__ { -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); if ( !::StretchBlt (