X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47b378bd88260611387af8604a1c8f62355350ab..fd67d2658b92d731069338e68deaa7bfbec22022:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 3828683e73..d1ef3afda2 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -205,6 +205,8 @@ private: DECLARE_NO_COPY_CLASS(StretchBltModeChanger) }; +#if wxUSE_DYNLIB_CLASS + // helper class to cache dynamically loaded libraries and not attempt reloading // them if it fails class wxOnceOnlyDLLLoader @@ -244,6 +246,8 @@ private: static wxOnceOnlyDLLLoader wxGDI32DLL(_T("gdi32")); static wxOnceOnlyDLLLoader wxMSIMG32DLL(_T("msimg32")); +#endif // wxUSE_DYNLIB_CLASS + // =========================================================================== // implementation // =========================================================================== @@ -585,17 +589,7 @@ void wxDC::Clear() ::FillRect(GetHdc(), &rect, brush); ::DeleteObject(brush); -#ifndef __WXWINCE__ - int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX, - height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY; - - ::SetMapMode(GetHdc(), MM_ANISOTROPIC); - - ::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL); - ::SetWindowExtEx(GetHdc(), width, height, NULL); - ::SetViewportOrgEx(GetHdc(), (int)m_deviceOriginX, (int)m_deviceOriginY, NULL); - ::SetWindowOrgEx(GetHdc(), (int)m_logicalOriginX, (int)m_logicalOriginY, NULL); -#endif + RealizeScaleAndOrigin(); } bool wxDC::DoFloodFill(wxCoord WXUNUSED_IN_WINCE(x), @@ -1731,7 +1725,7 @@ wxCoord wxDC::GetCharWidth() const void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, - wxFont *font) const + const wxFont *font) const { #ifdef __WXMICROWIN__ if (!GetHDC()) @@ -1758,7 +1752,7 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, SIZE sizeRect; const size_t len = string.length(); - if ( !::GetTextExtentPoint32(GetHdc(), string, len, &sizeRect) ) + if ( !::GetTextExtentPoint32(GetHdc(), string.wx_str(), len, &sizeRect) ) { wxLogLastError(_T("GetTextExtentPoint32()")); } @@ -1851,8 +1845,25 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con return true; } +void wxDC::RealizeScaleAndOrigin() +{ + // VZ: it seems very wasteful to always use MM_ANISOTROPIC when in 99% of + // cases we could do with MM_TEXT and in the remaining 0.9% with + // MM_ISOTROPIC (TODO!) +#ifndef __WXWINCE__ + ::SetMapMode(GetHdc(), MM_ANISOTROPIC); + + int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX, + height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY; + ::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL); + ::SetWindowExtEx(GetHdc(), width, height, NULL); + ::SetViewportOrgEx(GetHdc(), m_deviceOriginX, m_deviceOriginY, NULL); + ::SetWindowOrgEx(GetHdc(), m_logicalOriginX, m_logicalOriginY, NULL); +#endif + +} void wxDC::SetMapMode(int mode) { @@ -1907,22 +1918,10 @@ void wxDC::SetMapMode(int mode) wxFAIL_MSG( _T("unknown mapping mode in SetMapMode") ); } } - - // VZ: it seems very wasteful to always use MM_ANISOTROPIC when in 99% of - // cases we could do with MM_TEXT and in the remaining 0.9% with - // MM_ISOTROPIC (TODO!) -#ifndef __WXWINCE__ - ::SetMapMode(GetHdc(), MM_ANISOTROPIC); - - int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX, - height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY; - - ::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL); - ::SetWindowExtEx(GetHdc(), width, height, NULL); - - ::SetViewportOrgEx(GetHdc(), m_deviceOriginX, m_deviceOriginY, NULL); - ::SetWindowOrgEx(GetHdc(), m_logicalOriginX, m_logicalOriginY, NULL); -#endif + + ComputeScaleAndOrigin(); + + RealizeScaleAndOrigin(); } void wxDC::SetUserScale(double x, double y) @@ -1932,44 +1931,25 @@ void wxDC::SetUserScale(double x, double y) if ( x == m_userScaleX && y == m_userScaleY ) return; - m_userScaleX = x; - m_userScaleY = y; - - this->SetMapMode(m_mappingMode); + wxDCBase::SetUserScale(x,y); + + RealizeScaleAndOrigin(); } -void wxDC::SetAxisOrientation(bool WXUNUSED_IN_WINCE(xLeftRight), - bool WXUNUSED_IN_WINCE(yBottomUp)) +void wxDC::SetAxisOrientation(bool xLeftRight, + bool yBottomUp) { WXMICROWIN_CHECK_HDC -#ifndef __WXWINCE__ int signX = xLeftRight ? 1 : -1, signY = yBottomUp ? -1 : 1; - - if ( signX != m_signX || signY != m_signY ) - { - m_signX = signX; - m_signY = signY; - - SetMapMode(m_mappingMode); - } -#endif -} - -void wxDC::SetSystemScale(double x, double y) -{ - WXMICROWIN_CHECK_HDC - - if ( x == m_scaleX && y == m_scaleY ) + + if (signX == m_signX && signY == m_signY) return; + + wxDCBase::SetAxisOrientation( xLeftRight, yBottomUp ); - m_scaleX = x; - m_scaleY = y; - -#ifndef __WXWINCE__ - SetMapMode(m_mappingMode); -#endif + RealizeScaleAndOrigin(); } void wxDC::SetLogicalOrigin(wxCoord x, wxCoord y) @@ -1979,8 +1959,7 @@ void wxDC::SetLogicalOrigin(wxCoord x, wxCoord y) if ( x == m_logicalOriginX && y == m_logicalOriginY ) return; - m_logicalOriginX = x; - m_logicalOriginY = y; + wxDCBase::SetLogicalOrigin( x, y ); #ifndef __WXWINCE__ ::SetWindowOrgEx(GetHdc(), (int)m_logicalOriginX, (int)m_logicalOriginY, NULL); @@ -1993,64 +1972,16 @@ void wxDC::SetDeviceOrigin(wxCoord x, wxCoord y) if ( x == m_deviceOriginX && y == m_deviceOriginY ) return; - - m_deviceOriginX = x; - m_deviceOriginY = y; + + wxDCBase::SetDeviceOrigin( x, y ); ::SetViewportOrgEx(GetHdc(), (int)m_deviceOriginX, (int)m_deviceOriginY, NULL); } -// --------------------------------------------------------------------------- -// coordinates transformations -// --------------------------------------------------------------------------- - -wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const -{ - return DeviceToLogicalXRel(x - m_deviceOriginX)*m_signX + m_logicalOriginX; -} - -wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const -{ - // axis orientation is not taken into account for conversion of a distance - return (wxCoord)(x / (m_logicalScaleX*m_userScaleX*m_scaleX)); -} - -wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const -{ - return DeviceToLogicalYRel(y - m_deviceOriginY)*m_signY + m_logicalOriginY; -} - -wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const -{ - // axis orientation is not taken into account for conversion of a distance - return (wxCoord)( y / (m_logicalScaleY*m_userScaleY*m_scaleY)); -} - -wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const -{ - return LogicalToDeviceXRel(x - m_logicalOriginX)*m_signX + m_deviceOriginX; -} - -wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const -{ - // axis orientation is not taken into account for conversion of a distance - return (wxCoord) (x*m_logicalScaleX*m_userScaleX*m_scaleX); -} - -wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const -{ - return LogicalToDeviceYRel(y - m_logicalOriginY)*m_signY + m_deviceOriginY; -} - -wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const -{ - // axis orientation is not taken into account for conversion of a distance - return (wxCoord) (y*m_logicalScaleY*m_userScaleY*m_scaleY); -} - // --------------------------------------------------------------------------- // bit blit // --------------------------------------------------------------------------- + bool wxDC::DoBlit(wxCoord dstX, wxCoord dstY, wxCoord dstWidth, wxCoord dstHeight, wxDC *source, @@ -2417,8 +2348,7 @@ void wxDC::SetLogicalScale(double x, double y) { WXMICROWIN_CHECK_HDC - m_logicalScaleX = x; - m_logicalScaleY = y; + wxDCBase::SetLogicalScale(x,y); } // ---------------------------------------------------------------------------- @@ -2747,6 +2677,8 @@ void wxDC::DoGradientFillLinear (const wxRect& rect, wxDCBase::DoGradientFillLinear(rect, initialColour, destColour, nDirection); } +#if wxUSE_DYNLIB_CLASS + static DWORD wxGetDCLayout(HDC hdc) { typedef DWORD (WINAPI *GetLayout_t)(HDC); @@ -2789,3 +2721,17 @@ void wxDC::SetLayoutDirection(wxLayoutDirection dir) pfnSetLayout(GetHdc(), layout); } + +#else // !wxUSE_DYNLIB_CLASS + +// we can't provide RTL support without dynamic loading, so stub it out +wxLayoutDirection wxDC::GetLayoutDirection() const +{ + return wxLayout_Default; +} + +void wxDC::SetLayoutDirection(wxLayoutDirection WXUNUSED(dir)) +{ +} + +#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS