-
/////////////////////////////////////////////////////////////////////////////
// Name: htmprint.cpp
// Purpose: html printing classes
m_Parser = new wxHtmlWinParser(NULL);
m_FS = new wxFileSystem();
m_Parser -> SetFS(m_FS);
- m_Scale = 1.0;
}
-void wxHtmlDCRenderer::SetDC(wxDC *dc, int maxwidth)
+void wxHtmlDCRenderer::SetDC(wxDC *dc, double pixel_scale)
{
- int dx, dy;
-
- wxDisplaySize(&dx, &dy);
- m_MaxWidth = maxwidth;
-#if 0
- m_Scale = (float)dx * 2 / 3 / (float)maxwidth;
- // let the width of A4 is approximately 2/3 the screen width
-#endif
- m_Scale = (float)800 / (float)maxwidth;
- // for now, assume screen width = 800 => good results
-
m_DC = dc;
- m_Parser -> SetDC(dc);
+ m_Parser -> SetDC(m_DC, pixel_scale);
}
void wxHtmlDCRenderer::SetSize(int width, int height)
{
- m_Width = (int)(width * m_Scale);
- m_Height = (int)(height * m_Scale);
+ m_Width = width;
+ m_Height = height;
}
if (m_Cells != NULL) delete m_Cells;
m_FS -> ChangePathTo(basepath, isdir);
- m_DC -> SetUserScale(1.0, 1.0);
m_Cells = (wxHtmlContainerCell*) m_Parser -> Parse(html);
m_Cells -> SetIndent(0, wxHTML_INDENT_ALL, wxHTML_UNITS_PIXELS);
m_Cells -> Layout(m_Width);
int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render)
{
- int pbreak;
+ int pbreak, hght;
if (m_Cells == NULL || m_DC == NULL) return 0;
- pbreak = (int)(from * m_Scale + m_Height);
+ pbreak = (int)(from + m_Height);
while (m_Cells -> AdjustPagebreak(&pbreak)) {}
+ hght = pbreak - from;
if (!dont_render) {
- int w, h;
- m_DC -> GetSize(&w, &h);
- float overallScale = (float)(w/(float)m_MaxWidth) / m_Scale;
- m_DC -> SetUserScale(overallScale, overallScale);
-
m_DC -> SetBrush(*wxWHITE_BRUSH);
- m_DC -> SetClippingRegion(x * m_Scale, y * m_Scale, m_Width, m_Height);
+ m_DC -> SetClippingRegion(x, y, m_Width, hght);
m_Cells -> Draw(*m_DC,
- x * m_Scale, (y - from) * m_Scale,
- y * m_Scale, pbreak + (y - from) * m_Scale);
+ x, (y - from),
+ y, pbreak + (y /*- from*/));
m_DC -> DestroyClippingRegion();
}
- if (pbreak < m_Cells -> GetHeight()) return (int)(pbreak / m_Scale);
+ if (pbreak < m_Cells -> GetHeight()) return pbreak;
else return GetTotalHeight();
}
int wxHtmlDCRenderer::GetTotalHeight()
{
- if (m_Cells) return (int)(m_Cells -> GetHeight() / m_Scale);
+ if (m_Cells) return m_Cells -> GetHeight();
else return 0;
}
bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
{
- int pageWidth, pageHeight, mm_w, mm_h;
+ int pageWidth, pageHeight, mm_w, mm_h, scr_w, scr_h, dc_w, dc_h;
float ppmm_h, ppmm_v;
if (!wxPrintout::OnBeginDocument(startPage, endPage)) return FALSE;
ppmm_h = (float)pageWidth / mm_w;
ppmm_v = (float)pageHeight / mm_h;
+ int ppiPrinterX, ppiPrinterY;
+ GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
+ int ppiScreenX, ppiScreenY;
+ GetPPIScreen(&ppiScreenX, &ppiScreenY);
+
+ wxDisplaySize(&scr_w, &scr_h);
+ GetDC() -> GetSize(&dc_w, &dc_h);
+
+ GetDC() -> SetUserScale((double)dc_w / (double)pageWidth, (double)dc_w / (double)pageWidth);
+
/* prepare headers/footers renderer: */
- m_RendererHdr -> SetDC(GetDC(), pageWidth);
- m_RendererHdr -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop),
- ppmm_v * (mm_h - m_MarginTop - m_MarginBottom));
+ m_RendererHdr -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
+ m_RendererHdr -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)),
+ (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom)));
if (m_Headers[0] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[0], 1));
m_HeaderHeight = m_RendererHdr -> GetTotalHeight();
}
/* prepare main renderer: */
- m_Renderer -> SetDC(GetDC(), pageWidth);
- m_Renderer -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop),
- ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) -
+ m_Renderer -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
+ m_Renderer -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)),
+ (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) -
m_FooterHeight - m_HeaderHeight -
((m_HeaderHeight == 0) ? 0 : m_MarginSpace * ppmm_v) -
((m_FooterHeight == 0) ? 0 : m_MarginSpace * ppmm_v)
- );
+ ));
m_Renderer -> SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir);
CountPages();
return TRUE;
m_PageBreaks[0] = 0;
do {
- pos = m_Renderer -> Render(ppmm_h * m_MarginLeft,
- ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+ pos = m_Renderer -> Render((int)( ppmm_h * m_MarginLeft),
+ (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
pos, TRUE);
m_PageBreaks[++m_NumPages] = pos;
} while (pos < m_Renderer -> GetTotalHeight());
{
wxBusyCursor wait;
- int pageWidth, pageHeight, mm_w, mm_h;
+ int pageWidth, pageHeight, mm_w, mm_h, scr_w, scr_h, dc_w, dc_h;
float ppmm_h, ppmm_v;
GetPageSizePixels(&pageWidth, &pageHeight);
GetPageSizeMM(&mm_w, &mm_h);
ppmm_h = (float)pageWidth / mm_w;
ppmm_v = (float)pageHeight / mm_h;
-
- m_Renderer -> SetDC(dc, pageWidth);
+ wxDisplaySize(&scr_w, &scr_h);
+ dc -> GetSize(&dc_w, &dc_h);
+ int ppiPrinterX, ppiPrinterY;
+ GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
+ int ppiScreenX, ppiScreenY;
+ GetPPIScreen(&ppiScreenX, &ppiScreenY);
+
+ dc -> SetUserScale((double)dc_w / (double)pageWidth, (double)dc_w / (double)pageWidth);
+
+ m_Renderer -> SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
+
dc -> SetBackgroundMode(wxTRANSPARENT);
- m_Renderer -> Render(ppmm_h * m_MarginLeft,
- ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+ m_Renderer -> Render((int) (ppmm_h * m_MarginLeft),
+ (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
m_PageBreaks[page-1]);
- m_RendererHdr -> SetDC(dc, pageWidth);
+ m_RendererHdr -> SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
if (m_Headers[page % 2] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
- m_RendererHdr -> Render(ppmm_h * m_MarginLeft, ppmm_v * m_MarginTop);
+ m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop));
}
if (m_Footers[page % 2] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
- m_RendererHdr -> Render(ppmm_h * m_MarginLeft, pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight);
+ m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight));
}
}