-
-#if wxUSE_HIGH_QUALITY_PREVIEW
-
-// The preview, as implemented in wxPrintPreviewBase (and as used prior to wx3)
-// is inexact: it uses screen DC, which has much lower resolution and has
-// other properties different from printer DC, so the preview is not quite
-// right.
-//
-// To make matters worse, if the application depends heavily on GetTextExtent()
-// or does text layout itself, the output in preview and on paper can be very
-// different. In particular, wxHtmlEasyPrinting is affected and the preview
-// can be easily off by several pages.
-//
-// To fix this, we attempt to render the preview into high-resolution bitmap
-// using DC with same resolution etc. as the printer DC. This takes lot of
-// memory, so the code is more complicated than it could be, but the results
-// are much better.
-//
-// Finally, this code is specific to wxMSW, because it doesn't make sense to
-// bother with it on other platforms. Both OSX and modern GNOME/GTK+
-// environments have builtin accurate preview (that applications should use
-// instead) and the differences between screen and printer DC in wxGTK are so
-// large than this trick doesn't help at all.
-
-namespace
-{
-
-// If there's not enough memory, we need to render the preview in parts.
-// Unfortunately we cannot simply use wxMemoryDC, because it reports its size
-// as bitmap's size, and we need to use smaller bitmap while still reporting
-// original ("correct") DC size, because printing code frequently uses
-// GetSize() to determine scaling factor. This DC class handles this.
-
-class PageFragmentDCImpl : public wxMemoryDCImpl
-{
-public:
- PageFragmentDCImpl(wxMemoryDC *owner, wxDC *printer,
- const wxPoint& offset,
- const wxSize& fullSize)
- : wxMemoryDCImpl(owner, printer),
- m_offset(offset),
- m_fullSize(fullSize)
- {
- SetDeviceOrigin(0, 0);
- }
-
- virtual void SetDeviceOrigin(wxCoord x, wxCoord y)
- {
- wxMemoryDCImpl::SetDeviceOrigin(x - m_offset.x, y - m_offset.y);
- }
-
- virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const
- {
- wxMemoryDCImpl::DoGetDeviceOrigin(x, y);
- if ( x ) *x += m_offset.x;
- if ( x ) *y += m_offset.y;
- }
-
- virtual void DoGetSize(int *width, int *height) const
- {
- if ( width )
- *width = m_fullSize.x;
- if ( height )
- *height = m_fullSize.y;
- }
-
-private:
- wxPoint m_offset;
- wxSize m_fullSize;
-};
-
-class PageFragmentDC : public wxDC
-{
-public:
- PageFragmentDC(wxDC* printer, wxBitmap& bmp,
- const wxPoint& offset,
- const wxSize& fullSize)
- : wxDC(new PageFragmentDCImpl((wxMemoryDC*)this, printer, offset, fullSize))
- {
- wx_static_cast(PageFragmentDCImpl*, m_pimpl)->DoSelect(bmp);
- }
-};
-
-// estimate how big chunks we can render, given available RAM
-long ComputeFragmentSize(long printerDepth,
- long width,
- long height)