X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..e71e4c932a4e9e77207f968b150b51d5009408b5:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index d25954bd32..c630843c67 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -723,7 +723,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). @@ -931,7 +931,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++; @@ -965,7 +965,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++; @@ -1048,11 +1048,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; @@ -1214,13 +1214,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()); @@ -1296,6 +1303,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); @@ -1543,15 +1562,22 @@ 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 ) ) { @@ -1696,6 +1722,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 @@ -1758,17 +1809,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 ) {