X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eb72e9aa28d47f0ee3da6ab0881a639d1c55c499..cbbb1f548962b30c43849e29fd64eceb4d8720e8:/src/msw/dc.cpp?ds=sidebyside diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 848d6b7258..5079795653 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,35 @@ 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 + { + wxLogLastError(wxT("SetStretchBltMode")); + } } ~StretchBltModeChanger() { -#ifndef __WXWINCE__ if ( !::SetStretchBltMode(m_hdc, m_modeOld) ) - wxLogLastError(_T("SetStretchBltMode")); -#endif + { + wxLogLastError(wxT("SetStretchBltMode")); + } } private: @@ -309,6 +204,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 @@ -355,7 +255,7 @@ private: const wxChar *m_dllName; }; -static wxOnceOnlyDLLLoader wxMSIMG32DLL(_T("msimg32")); +static wxOnceOnlyDLLLoader wxMSIMG32DLL(wxT("msimg32")); // we must ensure that DLLs are unloaded before the static objects cleanup time // because we may hit the notorious DllMain() dead lock in this case if wx is @@ -373,6 +273,98 @@ private: IMPLEMENT_DYNAMIC_CLASS(wxGDIDLLsCleanupModule, wxModule) +namespace +{ + +#if wxUSE_DC_TRANSFORM_MATRIX + +// Class used to dynamically load world transform related API functions. +class GdiWorldTransformFuncs +{ +public: + static bool IsOk() + { + if ( !ms_worldTransformSymbolsLoaded ) + LoadWorldTransformSymbols(); + + return ms_pfnSetGraphicsMode && + ms_pfnSetWorldTransform && + ms_pfnGetWorldTransform && + ms_pfnModifyWorldTransform; + } + + typedef int (WINAPI *SetGraphicsMode_t)(HDC, int); + static SetGraphicsMode_t SetGraphicsMode() + { + if ( !ms_worldTransformSymbolsLoaded ) + LoadWorldTransformSymbols(); + + return ms_pfnSetGraphicsMode; + } + + typedef BOOL (WINAPI *SetWorldTransform_t)(HDC, const XFORM *); + static SetWorldTransform_t SetWorldTransform() + { + if ( !ms_worldTransformSymbolsLoaded ) + LoadWorldTransformSymbols(); + + return ms_pfnSetWorldTransform; + } + + typedef BOOL (WINAPI *GetWorldTransform_t)(HDC, LPXFORM); + static GetWorldTransform_t GetWorldTransform() + { + if ( !ms_worldTransformSymbolsLoaded ) + LoadWorldTransformSymbols(); + + return ms_pfnGetWorldTransform; + } + + typedef BOOL (WINAPI *ModifyWorldTransform_t)(HDC, const XFORM *, DWORD); + static ModifyWorldTransform_t ModifyWorldTransform() + { + if ( !ms_worldTransformSymbolsLoaded ) + LoadWorldTransformSymbols(); + + return ms_pfnModifyWorldTransform; + } + +private: + static void LoadWorldTransformSymbols() + { + wxDynamicLibrary dll(wxT("gdi32.dll")); + + wxDL_INIT_FUNC(ms_pfn, SetGraphicsMode, dll); + wxDL_INIT_FUNC(ms_pfn, SetWorldTransform, dll); + wxDL_INIT_FUNC(ms_pfn, GetWorldTransform, dll); + wxDL_INIT_FUNC(ms_pfn, ModifyWorldTransform, dll); + + ms_worldTransformSymbolsLoaded = true; + } + + static SetGraphicsMode_t ms_pfnSetGraphicsMode; + static SetWorldTransform_t ms_pfnSetWorldTransform; + static GetWorldTransform_t ms_pfnGetWorldTransform; + static ModifyWorldTransform_t ms_pfnModifyWorldTransform; + + static bool ms_worldTransformSymbolsLoaded; +}; + +GdiWorldTransformFuncs::SetGraphicsMode_t + GdiWorldTransformFuncs::ms_pfnSetGraphicsMode = NULL; +GdiWorldTransformFuncs::SetWorldTransform_t + GdiWorldTransformFuncs::ms_pfnSetWorldTransform = NULL; +GdiWorldTransformFuncs::GetWorldTransform_t + GdiWorldTransformFuncs::ms_pfnGetWorldTransform = NULL; +GdiWorldTransformFuncs::ModifyWorldTransform_t + GdiWorldTransformFuncs::ms_pfnModifyWorldTransform = NULL; + +bool GdiWorldTransformFuncs::ms_worldTransformSymbolsLoaded = false; + +#endif // wxUSE_DC_TRANSFORM_MATRIX + +} // anonymous namespace + #endif // wxUSE_DYNLIB_CLASS // =========================================================================== @@ -568,7 +560,7 @@ void wxMSWDCImpl::SetClippingHrgn(WXHRGN hrgn) #else // !WinCE if ( ::ExtSelectClipRgn(GetHdc(), (HRGN)hrgn, RGN_AND) == ERROR ) { - wxLogLastError(_T("ExtSelectClipRgn")); + wxLogLastError(wxT("ExtSelectClipRgn")); return; } @@ -591,7 +583,7 @@ void wxMSWDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h LogicalToDeviceY(y + h)); if ( !hrgn ) { - wxLogLastError(_T("CreateRectRgn")); + wxLogLastError(wxT("CreateRectRgn")); } else { @@ -741,7 +733,7 @@ bool wxMSWDCImpl::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const { WXMICROWIN_CHECK_HDC_RET(false) - wxCHECK_MSG( col, false, _T("NULL colour parameter in wxMSWDCImpl::GetPixel") ); + wxCHECK_MSG( col, false, wxT("NULL colour parameter in wxMSWDCImpl::GetPixel") ); // get the color of the pixel COLORREF pixelcolor = ::GetPixel(GetHdc(), XLOG2DEV(x), YLOG2DEV(y)); @@ -823,7 +815,7 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord xxx2 = (wxCoord) (xxc+ray); wxCoord yyy2 = (wxCoord) (yyc+ray); - if ( m_brush.IsOk() && m_brush.GetStyle() != wxBRUSHSTYLE_TRANSPARENT ) + if ( m_brush.IsNonTransparent() ) { // Have to add 1 to bottom-right corner of rectangle // to make semi-circles look right (crooked line otherwise). @@ -1031,7 +1023,7 @@ void wxMSWDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h // (i.e. drawn with a transparent pen) one pixel smaller in both directions // and we want them to have the same size regardless of which pen is used #ifndef __WXWINCE__ - if ( m_pen.IsOk() && m_pen.GetStyle() == wxPENSTYLE_TRANSPARENT ) + if ( m_pen.IsTransparent() ) { x2dev++; y2dev++; @@ -1065,7 +1057,7 @@ void wxMSWDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx // Windows draws the filled rectangles without outline (i.e. drawn with a // transparent pen) one pixel smaller in both directions and we want them // to have the same size regardless of which pen is used - adjust - if ( m_pen.GetStyle() == wxPENSTYLE_TRANSPARENT ) + if ( m_pen.IsTransparent() ) { x2++; y2++; @@ -1148,11 +1140,11 @@ void wxMSWDCImpl::DoDrawSpline(const wxPointList *points) lppt[ bezier_pos ] = lppt[ bezier_pos-1 ]; bezier_pos++; -#if !wxUSE_STL +#if !wxUSE_STD_CONTAINERS while ((node = node->GetNext()) != NULL) #else while ((node = node->GetNext())) -#endif // !wxUSE_STL +#endif // !wxUSE_STD_CONTAINERS { p = (wxPoint *)node->GetData(); x1 = x2; @@ -1274,7 +1266,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool { WXMICROWIN_CHECK_HDC - wxCHECK_RET( bmp.IsOk(), _T("invalid bitmap in wxMSWDCImpl::DrawBitmap") ); + wxCHECK_RET( bmp.IsOk(), wxT("invalid bitmap in wxMSWDCImpl::DrawBitmap") ); int width = bmp.GetWidth(), height = bmp.GetHeight(); @@ -1294,9 +1286,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool return; } -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); if ( useMask ) { @@ -1316,13 +1306,20 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool #ifdef __WIN32__ // use MaskBlt() with ROP which doesn't do anything to dst in the mask // points + bool ok = false; + +#if wxUSE_SYSTEM_OPTIONS // On some systems, MaskBlt succeeds yet is much much slower // than the wxWidgets fall-back implementation. So we need // to be able to switch this on and off at runtime. - bool ok = false; -#if wxUSE_SYSTEM_OPTIONS - if (wxSystemOptions::GetOptionInt(wxT("no-maskblt")) == 0) -#endif + // + // NB: don't query the value of the option every time but do it only + // once as otherwise it can have real (and bad) performance + // implications (see #11172) + static bool + s_maskBltAllowed = wxSystemOptions::GetOptionInt("no-maskblt") == 0; + if ( s_maskBltAllowed ) +#endif // wxUSE_SYSTEM_OPTIONS { HDC cdc = GetHdc(); HDC hdcMem = ::CreateCompatibleDC(GetHdc()); @@ -1398,6 +1395,18 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool void wxMSWDCImpl::DoDrawText(const wxString& text, wxCoord x, wxCoord y) { + // For compatibility with other ports (notably wxGTK) and because it's + // genuinely useful, we allow passing multiline strings to DrawText(). + // However there is no native MSW function to draw them directly so we + // instead reuse the generic DrawLabel() method to render them. Of course, + // DrawLabel() itself will call back to us but with single line strings + // only so there won't be any infinite recursion here. + if ( text.find('\n') != wxString::npos ) + { + GetOwner()->DrawLabel(text, wxRect(x, y, 0, 0)); + return; + } + WXMICROWIN_CHECK_HDC DrawAnyText(text, x, y); @@ -1571,7 +1580,7 @@ void wxMSWDCImpl::SetFont(const wxFont& font) HGDIOBJ hfont = ::SelectObject(GetHdc(), GetHfontOf(font)); if ( hfont == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(font)")); + wxLogLastError(wxT("SelectObject(font)")); } else // selected ok { @@ -1587,7 +1596,7 @@ void wxMSWDCImpl::SetFont(const wxFont& font) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldFont) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old font)")); + wxLogLastError(wxT("SelectObject(old font)")); } m_oldFont = 0; @@ -1609,7 +1618,7 @@ void wxMSWDCImpl::SetPen(const wxPen& pen) HGDIOBJ hpen = ::SelectObject(GetHdc(), GetHpenOf(pen)); if ( hpen == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(pen)")); + wxLogLastError(wxT("SelectObject(pen)")); } else // selected ok { @@ -1625,7 +1634,7 @@ void wxMSWDCImpl::SetPen(const wxPen& pen) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldPen) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old pen)")); + wxLogLastError(wxT("SelectObject(old pen)")); } m_oldPen = 0; @@ -1645,26 +1654,33 @@ void wxMSWDCImpl::SetBrush(const wxBrush& brush) if ( brush.IsOk() ) { // we must make sure the brush is aligned with the logical coordinates - // before selecting it + // before selecting it or using the same brush for the background of + // different windows would result in discontinuities + wxSize sizeBrushBitmap = wxDefaultSize; wxBitmap *stipple = brush.GetStipple(); if ( stipple && stipple->IsOk() ) + sizeBrushBitmap = stipple->GetSize(); + else if ( brush.IsHatch() ) + sizeBrushBitmap = wxSize(8, 8); + + if ( sizeBrushBitmap.IsFullySpecified() ) { if ( !::SetBrushOrgEx ( GetHdc(), - m_deviceOriginX % stipple->GetWidth(), - m_deviceOriginY % stipple->GetHeight(), + m_deviceOriginX % sizeBrushBitmap.x, + m_deviceOriginY % sizeBrushBitmap.y, NULL // [out] previous brush origin ) ) { - wxLogLastError(_T("SetBrushOrgEx()")); + wxLogLastError(wxT("SetBrushOrgEx()")); } } HGDIOBJ hbrush = ::SelectObject(GetHdc(), GetHbrushOf(brush)); if ( hbrush == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(brush)")); + wxLogLastError(wxT("SelectObject(brush)")); } else // selected ok { @@ -1680,7 +1696,7 @@ void wxMSWDCImpl::SetBrush(const wxBrush& brush) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldBrush) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old brush)")); + wxLogLastError(wxT("SelectObject(old brush)")); } m_oldBrush = 0; @@ -1798,6 +1814,31 @@ wxCoord wxMSWDCImpl::GetCharWidth() const return lpTextMetric.tmAveCharWidth; } +void wxMSWDCImpl::DoGetFontMetrics(int *height, + int *ascent, + int *descent, + int *internalLeading, + int *externalLeading, + int *averageWidth) const +{ + TEXTMETRIC tm; + + GetTextMetrics(GetHdc(), &tm); + + if ( height ) + *height = tm.tmHeight; + if ( ascent ) + *ascent = tm.tmAscent; + if ( descent ) + *descent = tm.tmDescent; + if ( internalLeading ) + *internalLeading = tm.tmInternalLeading; + if ( externalLeading ) + *externalLeading = tm.tmExternalLeading; + if ( averageWidth ) + *averageWidth = tm.tmAveCharWidth; +} + void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, const wxFont *font) const @@ -1816,7 +1857,7 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y HFONT hfontOld; if ( font ) { - wxASSERT_MSG( font->IsOk(), _T("invalid font in wxMSWDCImpl::GetTextExtent") ); + wxASSERT_MSG( font->IsOk(), wxT("invalid font in wxMSWDCImpl::GetTextExtent") ); hfontOld = (HFONT)::SelectObject(GetHdc(), GetHfontOf(*font)); } @@ -1829,7 +1870,7 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y const size_t len = string.length(); if ( !::GetTextExtentPoint32(GetHdc(), string.wx_str(), len, &sizeRect) ) { - wxLogLastError(_T("GetTextExtentPoint32()")); + wxLogLastError(wxT("GetTextExtentPoint32()")); } #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) @@ -1860,17 +1901,15 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y } #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - TEXTMETRIC tm; - ::GetTextMetrics(GetHdc(), &tm); - if (x) *x = sizeRect.cx; if (y) *y = sizeRect.cy; - if (descent) - *descent = tm.tmDescent; - if (externalLeading) - *externalLeading = tm.tmExternalLeading; + + if ( descent || externalLeading ) + { + DoGetFontMetrics(NULL, NULL, descent, NULL, externalLeading, NULL); + } if ( hfontOld ) { @@ -1989,7 +2028,7 @@ void wxMSWDCImpl::SetMapMode(wxMappingMode mode) break; default: - wxFAIL_MSG( _T("unknown mapping mode in SetMapMode") ); + wxFAIL_MSG( wxT("unknown mapping mode in SetMapMode") ); } } @@ -2058,6 +2097,87 @@ void wxMSWDCImpl::SetDeviceOrigin(wxCoord x, wxCoord y) ::SetViewportOrgEx(GetHdc(), (int)m_deviceOriginX, (int)m_deviceOriginY, NULL); } +// ---------------------------------------------------------------------------- +// Transform matrix +// ---------------------------------------------------------------------------- + +#if wxUSE_DC_TRANSFORM_MATRIX + +bool wxMSWDCImpl::CanUseTransformMatrix() const +{ + return GdiWorldTransformFuncs::IsOk(); +} + +bool wxMSWDCImpl::SetTransformMatrix(const wxAffineMatrix2D &matrix) +{ + if ( !GdiWorldTransformFuncs::IsOk() ) + return false; + + if ( matrix.IsIdentity() ) + { + ResetTransformMatrix(); + return true; + } + + if ( !GdiWorldTransformFuncs::SetGraphicsMode()(GetHdc(), GM_ADVANCED) ) + { + wxLogLastError(wxT("SetGraphicsMode")); + return false; + } + + wxMatrix2D mat; + wxPoint2DDouble tr; + matrix.Get(&mat, &tr); + + XFORM xform; + xform.eM11 = mat.m_11; + xform.eM12 = mat.m_12; + xform.eM21 = mat.m_21; + xform.eM22 = mat.m_22; + xform.eDx = tr.m_x; + xform.eDy = tr.m_y; + + if ( !GdiWorldTransformFuncs::SetWorldTransform()(GetHdc(), &xform) ) + { + wxLogLastError(wxT("SetWorldTransform")); + return false; + } + + return true; +} + +wxAffineMatrix2D wxMSWDCImpl::GetTransformMatrix() const +{ + wxAffineMatrix2D transform; + + if ( !GdiWorldTransformFuncs::IsOk() ) + return transform; + + XFORM xform; + if ( !GdiWorldTransformFuncs::GetWorldTransform()(GetHdc(), &xform) ) + { + wxLogLastError(wxT("GetWorldTransform")); + return transform; + } + + wxMatrix2D m(xform.eM11, xform.eM12, xform.eM21, xform.eM22); + wxPoint2DDouble p(xform.eDx, xform.eDy); + transform.Set(m, p); + + return transform; +} + +void wxMSWDCImpl::ResetTransformMatrix() +{ + if ( GdiWorldTransformFuncs::IsOk() ) + { + GdiWorldTransformFuncs::ModifyWorldTransform()(GetHdc(), NULL, MWT_IDENTITY); + GdiWorldTransformFuncs::SetGraphicsMode()(GetHdc(), GM_COMPATIBLE); + } +} + +#endif // wxUSE_DC_TRANSFORM_MATRIX + // --------------------------------------------------------------------------- // bit blit // --------------------------------------------------------------------------- @@ -2080,7 +2200,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, wxRasterOperationMode rop, bool useMask, wxCoord xsrcMask, wxCoord ysrcMask) { - wxCHECK_MSG( source, false, _T("wxMSWDCImpl::Blit(): NULL wxDC pointer") ); + wxCHECK_MSG( source, false, wxT("wxMSWDCImpl::Blit(): NULL wxDC pointer") ); WXMICROWIN_CHECK_HDC_RET(false) @@ -2216,9 +2336,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, @@ -2286,7 +2404,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. @@ -2325,9 +2443,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, #endif // __WXWINCE__ { -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); if ( !::StretchBlt ( @@ -2338,7 +2454,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, dwRop ) ) { - wxLogLastError(_T("StretchBlt")); + wxLogLastError(wxT("StretchBlt")); } else { @@ -2351,7 +2467,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( !::BitBlt(GetHdc(), xdest, ydest, dstWidth, dstHeight, hdcSrc, xsrc, ysrc, dwRop) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } else { @@ -2388,7 +2504,7 @@ void wxMSWDCImpl::DoGetSizeMM(int *w, int *h) const { int wTotal = ::GetDeviceCaps(GetHdc(), HORZRES); - wxCHECK_RET( wTotal, _T("0 width device?") ); + wxCHECK_RET( wTotal, wxT("0 width device?") ); *w = (wPixels * ::GetDeviceCaps(GetHdc(), HORZSIZE)) / wTotal; } @@ -2397,7 +2513,7 @@ void wxMSWDCImpl::DoGetSizeMM(int *w, int *h) const { int hTotal = ::GetDeviceCaps(GetHdc(), VERTRES); - wxCHECK_RET( hTotal, _T("0 height device?") ); + wxCHECK_RET( hTotal, wxT("0 height device?") ); *h = (hPixels * ::GetDeviceCaps(GetHdc(), VERTSIZE)) / hTotal; } @@ -2561,8 +2677,8 @@ static bool AlphaBlt(HDC hdcDst, HDC hdcSrc, const wxBitmap& bmp) { - wxASSERT_MSG( bmp.IsOk() && bmp.HasAlpha(), _T("AlphaBlt(): invalid bitmap") ); - wxASSERT_MSG( hdcDst && hdcSrc, _T("AlphaBlt(): invalid HDC") ); + wxASSERT_MSG( bmp.IsOk() && bmp.HasAlpha(), wxT("AlphaBlt(): invalid bitmap") ); + wxASSERT_MSG( hdcDst && hdcSrc, wxT("AlphaBlt(): invalid HDC") ); // do we have AlphaBlend() and company in the headers? #if defined(AC_SRC_OVER) && wxUSE_DYNLIB_CLASS @@ -2572,7 +2688,7 @@ static bool AlphaBlt(HDC hdcDst, BLENDFUNCTION); static AlphaBlend_t - pfnAlphaBlend = (AlphaBlend_t)wxMSIMG32DLL.GetSymbol(_T("AlphaBlend")); + pfnAlphaBlend = (AlphaBlend_t)wxMSIMG32DLL.GetSymbol(wxT("AlphaBlend")); if ( pfnAlphaBlend ) { BLENDFUNCTION bf; @@ -2589,7 +2705,7 @@ static bool AlphaBlt(HDC hdcDst, return true; } - wxLogLastError(_T("AlphaBlend")); + wxLogLastError(wxT("AlphaBlend")); } #else wxUnusedVar(hdcSrc); @@ -2627,7 +2743,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, if ( !::BitBlt(hdcMem, 0, 0, dstWidth, dstHeight, hdcDst, xDst, yDst, SRCCOPY) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } // combine them with the source bitmap using alpha @@ -2635,7 +2751,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, dataSrc((wxBitmap &)bmpSrc); wxCHECK_RET( dataDst && dataSrc, - _T("failed to get raw data in wxAlphaBlend") ); + wxT("failed to get raw data in wxAlphaBlend") ); wxAlphaPixelData::Iterator pDst(dataDst), pSrc(dataSrc); @@ -2669,7 +2785,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, // and finally blit them back to the destination DC if ( !::BitBlt(hdcDst, xDst, yDst, dstWidth, dstHeight, hdcMem, 0, 0, SRCCOPY) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } } @@ -2687,7 +2803,7 @@ void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, typedef BOOL (WINAPI *GradientFill_t)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG); static GradientFill_t pfnGradientFill = - (GradientFill_t)wxMSIMG32DLL.GetSymbol(_T("GradientFill")); + (GradientFill_t)wxMSIMG32DLL.GetSymbol(wxT("GradientFill")); if ( pfnGradientFill ) { @@ -2732,7 +2848,7 @@ void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, return; } - wxLogLastError(_T("GradientFill")); + wxLogLastError(wxT("GradientFill")); } #endif // wxUSE_DYNLIB_CLASS @@ -2745,7 +2861,7 @@ static DWORD wxGetDCLayout(HDC hdc) { typedef DWORD (WINAPI *GetLayout_t)(HDC); static GetLayout_t - wxDL_INIT_FUNC(s_pfn, GetLayout, wxDynamicLibrary(_T("gdi32.dll"))); + wxDL_INIT_FUNC(s_pfn, GetLayout, wxDynamicLibrary(wxT("gdi32.dll"))); return s_pfnGetLayout ? s_pfnGetLayout(hdc) : (DWORD)-1; } @@ -2764,7 +2880,7 @@ void wxMSWDCImpl::SetLayoutDirection(wxLayoutDirection dir) { typedef DWORD (WINAPI *SetLayout_t)(HDC, DWORD); static SetLayout_t - wxDL_INIT_FUNC(s_pfn, SetLayout, wxDynamicLibrary(_T("gdi32.dll"))); + wxDL_INIT_FUNC(s_pfn, SetLayout, wxDynamicLibrary(wxT("gdi32.dll"))); if ( !s_pfnSetLayout ) return;