X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/906c935a80b10d53cecf57f71ab5f3f4f1d529ec..b3ee9f4d2efa4a5088b4c84eb8a0ba712fa7e7fb:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 4420abf53a..74eec510d4 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -51,6 +51,7 @@ #include #include "wx/msw/private/dc.h" +#include "wx/private/textmeasure.h" using namespace wxMSWImpl; @@ -1857,109 +1858,17 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y } #endif // __WXMICROWIN__ - HFONT hfontOld; - if ( font ) - { - wxASSERT_MSG( font->IsOk(), wxT("invalid font in wxMSWDCImpl::GetTextExtent") ); - - hfontOld = (HFONT)::SelectObject(GetHdc(), GetHfontOf(*font)); - } - else // don't change the font - { - hfontOld = 0; - } - - SIZE sizeRect; - const size_t len = string.length(); - if ( !::GetTextExtentPoint32(GetHdc(), string.wx_str(), len, &sizeRect) ) - { - wxLogLastError(wxT("GetTextExtentPoint32()")); - } - -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - // the result computed by GetTextExtentPoint32() may be too small as it - // accounts for under/overhang of the first/last character while we want - // just the bounding rect for this string so adjust the width as needed - // (using API not available in 2002 SDKs of WinCE) - if ( len > 0 ) - { - ABC width; - const wxChar chFirst = *string.begin(); - if ( ::GetCharABCWidths(GetHdc(), chFirst, chFirst, &width) ) - { - if ( width.abcA < 0 ) - sizeRect.cx -= width.abcA; - - if ( len > 1 ) - { - const wxChar chLast = *string.rbegin(); - ::GetCharABCWidths(GetHdc(), chLast, chLast, &width); - } - //else: we already have the width of the last character - - if ( width.abcC < 0 ) - sizeRect.cx -= width.abcC; - } - //else: GetCharABCWidths() failed, not a TrueType font? - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - - if (x) - *x = sizeRect.cx; - if (y) - *y = sizeRect.cy; + wxASSERT_MSG( !font || font->IsOk(), wxT("invalid font in wxMSWDCImpl::GetTextExtent") ); - if ( descent || externalLeading ) - { - DoGetFontMetrics(NULL, NULL, descent, NULL, externalLeading, NULL); - } - - if ( hfontOld ) - { - ::SelectObject(GetHdc(), hfontOld); - } + wxTextMeasure txm(GetOwner(), font); + txm.GetTextExtent(string, x, y, descent, externalLeading); } -// Each element of the array will be the width of the string up to and -// including the coresoponding character in text. - bool wxMSWDCImpl::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const { - static int maxLenText = -1; - static int maxWidth = -1; - int fit = 0; - SIZE sz = {0,0}; - int stlen = text.length(); - - if (maxLenText == -1) - { - // Win9x and WinNT+ have different limits - int version = wxGetOsVersion(); - maxLenText = version == wxOS_WINDOWS_NT ? 65535 : 8192; - maxWidth = version == wxOS_WINDOWS_NT ? INT_MAX : 32767; - } - - widths.Empty(); - widths.Add(0, stlen); // fill the array with zeros - if (stlen == 0) - return true; - - if (!::GetTextExtentExPoint(GetHdc(), - text.c_str(), // string to check - wxMin(stlen, maxLenText), - maxWidth, - &fit, // [out] count of chars - // that will fit - &widths[0], // array to fill - &sz)) - { - // API failed - wxLogLastError(wxT("GetTextExtentExPoint")); - return false; - } - - return true; + wxTextMeasure txm(GetOwner(), NULL); // don't change the font + return txm.GetPartialTextExtents(text, widths, 1.0); } namespace @@ -2317,7 +2226,8 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, // than the wxWidgets fall-back implementation. So we need // to be able to switch this on and off at runtime. #if wxUSE_SYSTEM_OPTIONS - if (wxSystemOptions::GetOptionInt(wxT("no-maskblt")) == 0) + static bool s_maskBltAllowed = wxSystemOptions::GetOptionInt("no-maskblt") == 0; + if ( s_maskBltAllowed ) #endif { if ( dstWidth == srcWidth && dstHeight == srcHeight ) @@ -2441,6 +2351,17 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, { SET_STRETCH_BLT_MODE(GetHdc()); + // Unlike all the other functions used here (i.e. AlphaBlt(), + // MaskBlt(), BitBlt() and StretchBlt()), StretchDIBits() does + // not take into account the source DC logical coordinates + // automatically as it doesn't even work with the source HDC. + // So do this manually to ensure that the coordinates are + // interpreted in the same way here as in all the other cases. + xsrc = source->LogicalToDeviceX(xsrc); + ysrc = source->LogicalToDeviceY(ysrc); + srcWidth = source->LogicalToDeviceXRel(srcWidth); + srcHeight = source->LogicalToDeviceYRel(srcHeight); + // Figure out what co-ordinate system we're supposed to specify // ysrc in. const LONG hDIB = ds.dsBmih.biHeight;