+void wxPrintout::FitThisSizeToPaper(const wxSize& imageSize)
+{
+ // Set the DC scale and origin so that the given image size fits within the
+ // entire page and the origin is at the top left corner of the page. Note
+ // that with most printers, portions of the page will be non-printable. Use
+ // this if you're managing your own page margins.
+ if (!m_printoutDC) return;
+ wxRect paperRect = GetPaperRectPixels();
+ wxCoord pw, ph;
+ GetPageSizePixels(&pw, &ph);
+ wxCoord w, h;
+ m_printoutDC->GetSize(&w, &h);
+ float scaleX = ((float(paperRect.width) * w) / (float(pw) * imageSize.x));
+ float scaleY = ((float(paperRect.height) * h) / (float(ph) * imageSize.y));
+ float actualScale = wxMin(scaleX, scaleY);
+ m_printoutDC->SetUserScale(actualScale, actualScale);
+ m_printoutDC->SetDeviceOrigin(0, 0);
+ wxRect logicalPaperRect = GetLogicalPaperRect();
+ SetLogicalOrigin(logicalPaperRect.x, logicalPaperRect.y);
+}
+
+void wxPrintout::FitThisSizeToPage(const wxSize& imageSize)
+{
+ // Set the DC scale and origin so that the given image size fits within the
+ // printable area of the page and the origin is at the top left corner of
+ // the printable area.
+ if (!m_printoutDC) return;
+ int w, h;
+ m_printoutDC->GetSize(&w, &h);
+ float scaleX = float(w) / imageSize.x;
+ float scaleY = float(h) / imageSize.y;
+ float actualScale = wxMin(scaleX, scaleY);
+ m_printoutDC->SetUserScale(actualScale, actualScale);
+ m_printoutDC->SetDeviceOrigin(0, 0);
+}
+
+void wxPrintout::FitThisSizeToPageMargins(const wxSize& imageSize, const wxPageSetupDialogData& pageSetupData)
+{
+ // Set the DC scale and origin so that the given image size fits within the
+ // page margins defined in the given wxPageSetupDialogData object and the
+ // origin is at the top left corner of the page margins.
+ if (!m_printoutDC) return;
+ wxRect paperRect = GetPaperRectPixels();
+ wxCoord pw, ph;
+ GetPageSizePixels(&pw, &ph);
+ wxPoint topLeft = pageSetupData.GetMarginTopLeft();
+ wxPoint bottomRight = pageSetupData.GetMarginBottomRight();
+ wxCoord mw, mh;
+ GetPageSizeMM(&mw, &mh);
+ float mmToDeviceX = float(pw) / mw;
+ float mmToDeviceY = float(ph) / mh;
+ wxRect pageMarginsRect(paperRect.x + wxRound(mmToDeviceX * topLeft.x),
+ paperRect.y + wxRound(mmToDeviceY * topLeft.y),
+ paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)),
+ paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y)));
+ wxCoord w, h;
+ m_printoutDC->GetSize(&w, &h);
+ float scaleX = (float(pageMarginsRect.width) * w) / (float(pw) * imageSize.x);
+ float scaleY = (float(pageMarginsRect.height) * h) / (float(ph) * imageSize.y);
+ float actualScale = wxMin(scaleX, scaleY);
+ m_printoutDC->SetUserScale(actualScale, actualScale);
+ m_printoutDC->SetDeviceOrigin(0, 0);
+ wxRect logicalPageMarginsRect = GetLogicalPageMarginsRect(pageSetupData);
+ SetLogicalOrigin(logicalPageMarginsRect.x, logicalPageMarginsRect.y);
+}
+
+void wxPrintout::MapScreenSizeToPaper()
+{
+ // Set the DC scale so that an image on the screen is the same size on the
+ // paper and the origin is at the top left of the paper. Note that with most
+ // printers, portions of the page will be cut off. Use this if you're
+ // managing your own page margins.
+ if (!m_printoutDC) return;
+ MapScreenSizeToPage();
+ wxRect logicalPaperRect = GetLogicalPaperRect();
+ SetLogicalOrigin(logicalPaperRect.x, logicalPaperRect.y);
+}
+
+void wxPrintout::MapScreenSizeToPage()
+{
+ // Set the DC scale and origin so that an image on the screen is the same
+ // size on the paper and the origin is at the top left of the printable area.
+ if (!m_printoutDC) return;
+ int ppiScreenX, ppiScreenY;
+ GetPPIScreen(&ppiScreenX, &ppiScreenY);
+ int ppiPrinterX, ppiPrinterY;
+ GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
+ int w, h;
+ m_printoutDC->GetSize(&w, &h);
+ int pageSizePixelsX, pageSizePixelsY;
+ GetPageSizePixels(&pageSizePixelsX, &pageSizePixelsY);
+ float userScaleX = (float(ppiPrinterX) * w) / (float(ppiScreenX) * pageSizePixelsX);
+ float userScaleY = (float(ppiPrinterY) * h) / (float(ppiScreenY) * pageSizePixelsY);
+ m_printoutDC->SetUserScale(userScaleX, userScaleY);
+ m_printoutDC->SetDeviceOrigin(0, 0);
+}
+
+void wxPrintout::MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData)
+{
+ // Set the DC scale so that an image on the screen is the same size on the
+ // paper and the origin is at the top left of the page margins defined by
+ // the given wxPageSetupDialogData object.
+ if (!m_printoutDC) return;
+ MapScreenSizeToPage();
+ wxRect logicalPageMarginsRect = GetLogicalPageMarginsRect(pageSetupData);
+ SetLogicalOrigin(logicalPageMarginsRect.x, logicalPageMarginsRect.y);
+}
+
+void wxPrintout::MapScreenSizeToDevice()
+{
+ // Set the DC scale so that a screen pixel is the same size as a device
+ // pixel and the origin is at the top left of the printable area.
+ if (!m_printoutDC) return;
+ int w, h;
+ m_printoutDC->GetSize(&w, &h);
+ int pageSizePixelsX, pageSizePixelsY;
+ GetPageSizePixels(&pageSizePixelsX, &pageSizePixelsY);
+ float userScaleX = float(w) / pageSizePixelsX;
+ float userScaleY = float(h) / pageSizePixelsY;
+ m_printoutDC->SetUserScale(userScaleX, userScaleY);
+ m_printoutDC->SetDeviceOrigin(0, 0);
+}
+
+wxRect wxPrintout::GetLogicalPaperRect() const
+{
+ // Return the rectangle in logical units that corresponds to the paper
+ // rectangle.
+ wxRect paperRect = GetPaperRectPixels();
+ wxCoord pw, ph;
+ GetPageSizePixels(&pw, &ph);
+ wxCoord w, h;
+ m_printoutDC->GetSize(&w, &h);
+ if (w == pw && h == ph) {
+ // this DC matches the printed page, so no scaling
+ return wxRect(m_printoutDC->DeviceToLogicalX(paperRect.x),
+ m_printoutDC->DeviceToLogicalY(paperRect.y),
+ m_printoutDC->DeviceToLogicalXRel(paperRect.width),
+ m_printoutDC->DeviceToLogicalYRel(paperRect.height));
+ }
+ // This DC doesn't match the printed page, so we have to scale.
+ float scaleX = float(w) / pw;
+ float scaleY = float(h) / ph;
+ return wxRect(m_printoutDC->DeviceToLogicalX(wxRound(paperRect.x * scaleX)),
+ m_printoutDC->DeviceToLogicalY(wxRound(paperRect.y * scaleY)),
+ m_printoutDC->DeviceToLogicalXRel(wxRound(paperRect.width * scaleX)),
+ m_printoutDC->DeviceToLogicalYRel(wxRound(paperRect.height * scaleY)));
+}