From c44a49b85215955e41efbb4c51c998367cb18896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 29 Mar 2010 14:19:06 +0000 Subject: [PATCH] Use fixed screen DPI of 96 when printing HTML. Unlike font sizes, which depend on screen resolution because of weird wxFont API, pixel sizes used elsewhere (and in particular, for images) shouldn't depend on screen DPI. This finally makes the output independent of screen size. Fixes #10942. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63781 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmprint.h | 4 +++- include/wx/html/winpars.h | 5 +++-- src/html/htmprint.cpp | 42 ++++++++++++++++++++++++++++++++------ src/html/winpars.cpp | 9 +++++++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h index b5da2bad87..4e0ccc9150 100644 --- a/include/wx/html/htmprint.h +++ b/include/wx/html/htmprint.h @@ -39,7 +39,9 @@ public: // Following 3 methods *must* be called before any call to Render: // Assign DC to this render - void SetDC(wxDC *dc, double pixel_scale = 1.0); + void SetDC(wxDC *dc, double pixel_scale = 1.0) + { SetDC(dc, pixel_scale, pixel_scale); } + void SetDC(wxDC *dc, double pixel_scale, double font_scale); // Sets size of output rectangle, in pixels. Note that you *can't* change // width of the rectangle between calls to Render! (You can freely change height.) diff --git a/include/wx/html/winpars.h b/include/wx/html/winpars.h index 0c9d548c32..ebc4bc1f6e 100644 --- a/include/wx/html/winpars.h +++ b/include/wx/html/winpars.h @@ -52,7 +52,8 @@ public: // Set's the DC used for parsing. If SetDC() is not called, // parsing won't proceed virtual void SetDC(wxDC *dc, double pixel_scale = 1.0) - { m_DC = dc; m_PixelScale = pixel_scale; } + { SetDC(dc, pixel_scale, pixel_scale); } + void SetDC(wxDC *dc, double pixel_scale, double font_scale); wxDC *GetDC() {return m_DC;} double GetPixelScale() {return m_PixelScale;} @@ -171,7 +172,7 @@ private: // temporary variables used by AddText wxHtmlWindowInterface *m_windowInterface; // window we're parsing for - double m_PixelScale; + double m_PixelScale, m_FontScale; wxDC *m_DC; // Device Context we're parsing for static wxList m_Modules; diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp index 3b628934c5..14d478faa9 100644 --- a/src/html/htmprint.cpp +++ b/src/html/htmprint.cpp @@ -37,6 +37,28 @@ #define DEFAULT_PRINT_FONT_SIZE 12 +// CSS specification offer following guidance on dealing with pixel sizes +// when printing at +// http://www.w3.org/TR/2004/CR-CSS21-20040225/syndata.html#length-units: +// +// Pixel units are relative to the resolution of the viewing device, i.e., +// most often a computer display. If the pixel density of the output +// device is very different from that of a typical computer display, the +// user agent should rescale pixel values. It is recommended that the [ +// reference pixel] be the visual angle of one pixel on a device with a +// pixel density of 96dpi and a distance from the reader of an arm's +// length. For a nominal arm's length of 28 inches, the visual angle is +// therefore about 0.0213 degrees. +// +// For reading at arm's length, 1px thus corresponds to about 0.26 mm +// (1/96 inch). When printed on a laser printer, meant for reading at a +// little less than arm's length (55 cm, 21 inches), 1px is about 0.20 mm. +// On a 300 dots-per-inch (dpi) printer, that may be rounded up to 3 dots +// (0.25 mm); on a 600 dpi printer, it can be rounded to 5 dots. +// +// See also http://trac.wxwidgets.org/ticket/10942. +#define TYPICAL_SCREEN_DPI 96.0 + //-------------------------------------------------------------------------------- // wxHtmlDCRenderer //-------------------------------------------------------------------------------- @@ -64,10 +86,10 @@ wxHtmlDCRenderer::~wxHtmlDCRenderer() -void wxHtmlDCRenderer::SetDC(wxDC *dc, double pixel_scale) +void wxHtmlDCRenderer::SetDC(wxDC *dc, double pixel_scale, double font_scale) { m_DC = dc; - m_Parser->SetDC(m_DC, pixel_scale); + m_Parser->SetDC(m_DC, pixel_scale, font_scale); } @@ -258,7 +280,9 @@ void wxHtmlPrintout::OnPreparePrinting() /* prepare headers/footers renderer: */ - m_RendererHdr->SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY); + m_RendererHdr->SetDC(GetDC(), + (double)ppiPrinterY / TYPICAL_SCREEN_DPI, + (double)ppiPrinterY / (double)ppiScreenY); m_RendererHdr->SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginRight)), (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom))); if (m_Headers[0] != wxEmptyString) @@ -283,7 +307,9 @@ void wxHtmlPrintout::OnPreparePrinting() } /* prepare main renderer: */ - m_Renderer->SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY); + m_Renderer->SetDC(GetDC(), + (double)ppiPrinterY / TYPICAL_SCREEN_DPI, + (double)ppiPrinterY / (double)ppiScreenY); const int printAreaW = int(ppmm_h * (mm_w - m_MarginLeft - m_MarginRight)); int printAreaH = int(ppmm_v * (mm_h - m_MarginTop - m_MarginBottom)); @@ -475,7 +501,9 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page) dc->SetUserScale((double)dc_w / (double)pageWidth, (double)dc_h / (double)pageHeight); - m_Renderer->SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY); + m_Renderer->SetDC(dc, + (double)ppiPrinterY / TYPICAL_SCREEN_DPI, + (double)ppiPrinterY / (double)ppiScreenY); dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); @@ -484,7 +512,9 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page) m_PageBreaks[page-1], false, m_PageBreaks[page]-m_PageBreaks[page-1]); - m_RendererHdr->SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY); + m_RendererHdr->SetDC(dc, + (double)ppiPrinterY / TYPICAL_SCREEN_DPI, + (double)ppiPrinterY / (double)ppiScreenY); if (m_Headers[page % 2] != wxEmptyString) { m_RendererHdr->SetHtmlText(TranslateHeader(m_Headers[page % 2], page)); diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index cb07b1d0be..7f3fc64e50 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -552,6 +552,13 @@ void wxHtmlWinParser::SetFontSize(int s) } +void wxHtmlWinParser::SetDC(wxDC *dc, double pixel_scale, double font_scale) +{ + m_DC = dc; + m_PixelScale = pixel_scale; + m_FontScale = font_scale; +} + wxFont* wxHtmlWinParser::CreateCurrentFont() { @@ -582,7 +589,7 @@ wxFont* wxHtmlWinParser::CreateCurrentFont() { *faceptr = face; *fontptr = new wxFont( - (int) (m_FontsSizes[fs] * m_PixelScale), + (int) (m_FontsSizes[fs] * m_FontScale), ff ? wxMODERN : wxSWISS, fi ? wxITALIC : wxNORMAL, fb ? wxBOLD : wxNORMAL,