From f8bc9abfc460255ca4a6a6885a25f29972fe2cf7 Mon Sep 17 00:00:00 2001 From: JulianSmart Date: Sun, 29 Nov 2015 20:01:10 +0000 Subject: [PATCH] Work around poor image scaling on WIN32, especially on HiDPI displays where all images without size specification will be scaled --- src/html/m_image.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp index 27e0f93977..c34042d109 100644 --- a/src/html/m_image.cpp +++ b/src/html/m_image.cpp @@ -465,17 +465,7 @@ void wxHtmlImageCell::SetImage(const wxImage& img) if ( m_bmpH == wxDefaultCoord) m_bmpH = hh; - // Only scale the bitmap at the rendering stage, - // so we don't lose quality twice -/* - if ((m_bmpW != ww) || (m_bmpH != hh)) - { - wxImage img2 = img.Scale(m_bmpW, m_bmpH); - m_bitmap = new wxBitmap(img2); - } - else -*/ - m_bitmap = new wxBitmap(img); + m_bitmap = new wxBitmap(img); } #endif } @@ -605,6 +595,24 @@ void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, // and height, so we only do the scaling once. double imageScaleX = 1.0; double imageScaleY = 1.0; + + // Optimisation for Windows: WIN32 scaling for window DCs is very poor, + // so unless we're using a printer DC, do the scaling ourselves. +#ifdef __WXMSW__ + if (m_Width >= 0 && m_Width != m_bitmap->GetWidth() && !dc.IsKindOf(CLASSINFO(wxPrinterDC))) + { + wxImage image(m_bitmap->ConvertToImage()); + if (image.HasMask()) + { + // Convert the mask to an alpha channel or scaling won't work correctly + image.InitAlpha(); + } + image.Rescale(m_Width, m_Height, wxIMAGE_QUALITY_HIGH); + delete m_bitmap; + m_bitmap = new wxBitmap(image); + } +#endif + if (m_Width != m_bitmap->GetWidth()) imageScaleX = (double) m_Width / (double) m_bitmap->GetWidth(); if (m_Height != m_bitmap->GetHeight())