Work around poor image scaling on WIN32, especially on HiDPI displays where all images without size specification will be scaled

This commit is contained in:
JulianSmart 2015-11-29 20:01:10 +00:00
parent c3ae2fc54a
commit f8bc9abfc4

View File

@ -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())