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
This commit is contained in:
Václav Slavík 2010-03-29 14:19:06 +00:00
parent 5a21001cdd
commit c44a49b852
4 changed files with 50 additions and 10 deletions

View 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.)

View 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;

View File

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

View 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,