]> git.saurik.com Git - wxWidgets.git/commitdiff
Use fixed screen DPI of 96 when printing HTML.
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 29 Mar 2010 14:19:06 +0000 (14:19 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 29 Mar 2010 14:19:06 +0000 (14:19 +0000)
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
include/wx/html/winpars.h
src/html/htmprint.cpp
src/html/winpars.cpp

index b5da2bad870d93a28bca326b204b1c65c000dc3b..4e0ccc9150bf2bed6226999fa9d13d667d0b2ccb 100644 (file)
@@ -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.)
index 0c9d548c32b19cb9ace30305af96cf1ed18ca311..ebc4bc1f6e85bbb5ea33aeb4436f21b7be737bbd 100644 (file)
@@ -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;
index 3b628934c5e02da836566115e10b75e38d42d6cb..14d478faa9be757c631e45c793859e406f6a8223 100644 (file)
 #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));
index cb07b1d0be345bc19853fcf03ea13f501a2f78f0..7f3fc64e50cba22ea69c2658441be164a85c459c 100644 (file)
@@ -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,