#include "wx/osx/private.h"
#include "wx/osx/private/print.h"
-#include "wx/osx/carbon/dcprint.h"
+#include "wx/osx/dcprint.h"
#include "wx/graphics.h"
IMPLEMENT_ABSTRACT_CLASS(wxPrinterDCImpl, wxGCDCImpl)
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data )
{
m_err = noErr ;
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->GetNativeData() ;
-
+ wxOSXPrintData *native = (wxOSXPrintData*) data->GetNativeData() ;
+
PMRect rPage;
- m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
+ m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage);
if ( m_err != noErr )
return;
-
+
m_maxX = wxCoord(rPage.right - rPage.left) ;
m_maxY = wxCoord(rPage.bottom - rPage.top);
-
+
PMResolution res;
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- if ( PMPrinterGetOutputResolution != NULL )
- {
- PMPrinter printer;
- m_err = PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer);
- if ( m_err == noErr )
+ PMPrinter printer;
+ m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
+ if ( m_err == noErr )
+ {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( PMPrinterGetOutputResolution != NULL )
{
- m_err = PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ;
- if ( m_err == -9589 /* kPMKeyNotFound */ )
{
- m_err = noErr ;
- res.hRes = res.vRes = 300;
+ m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ;
+ if ( m_err == -9589 /* kPMKeyNotFound */ )
+ {
+ m_err = noErr ;
+ res.hRes = res.vRes = 300;
+ }
}
}
- }
- else
+ else
#endif
- {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res);
+ {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ m_err = PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
+ if ( m_err != noErr )
+ {
+ m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res);
+ }
#endif
+ }
}
+ m_maxX = wxCoord((double)m_maxX * res.hRes / 72.0);
+ m_maxY = wxCoord((double)m_maxY * res.vRes / 72.0);
+
m_ppi = wxSize(int(res.hRes), int(res.vRes));
}
return new wxMacCarbonPrinterDC(data) ;
}
-bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
+bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message )
{
if ( m_err )
return false ;
wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl();
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ;
+ wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ;
+
+ PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message));
- m_err = PMSessionBeginCGDocumentNoDialog(native->m_macPrintSession,
- native->m_macPrintSettings,
- native->m_macPageFormat);
+ m_err = PMSessionBeginCGDocumentNoDialog(native->GetPrintSession(),
+ native->GetPrintSettings(),
+ native->GetPageFormat());
if ( m_err != noErr )
return false;
PMRect rPage;
- m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
+ m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage);
if ( m_err != noErr )
return false ;
m_maxY = wxCoord(rPage.bottom - rPage.top);
PMResolution res;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- if ( PMPrinterGetOutputResolution != NULL )
+ PMPrinter printer;
+
+ m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
+ if (m_err == noErr)
{
- PMPrinter printer;
- m_err = PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer);
- if ( m_err == noErr )
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( PMPrinterGetOutputResolution != NULL )
{
- m_err = PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ;
+ m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ;
if ( m_err == -9589 /* kPMKeyNotFound */ )
{
m_err = noErr ;
res.hRes = res.vRes = 300;
}
}
- }
- else
+ else
#endif
- {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res);
+ {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ if ( PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res) != noErr )
+ {
+ res.hRes = res.vRes = 300;
+ }
#endif
+ }
}
+
+ m_maxX = wxCoord((double)m_maxX * res.hRes / 72.0);
+ m_maxY = wxCoord((double)m_maxY * res.vRes / 72.0);
m_ppi = wxSize(int(res.hRes), int(res.vRes));
return true ;
return ;
wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl();
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ;
+ wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ;
- m_err = PMSessionEndDocumentNoDialog(native->m_macPrintSession);
+ m_err = PMSessionEndDocumentNoDialog(native->GetPrintSession());
}
void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
return ;
wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl();
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ;
+ wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ;
- m_err = PMSessionBeginPageNoDialog(native->m_macPrintSession,
- native->m_macPageFormat,
- nil);
+ m_err = PMSessionBeginPageNoDialog(native->GetPrintSession(),
+ native->GetPageFormat(),
+ NULL);
CGContextRef pageContext;
if ( m_err == noErr )
{
- m_err = PMSessionGetCGGraphicsContext(native->m_macPrintSession,
+ m_err = PMSessionGetCGGraphicsContext(native->GetPrintSession(),
&pageContext );
}
if ( m_err != noErr )
{
- PMSessionEndPageNoDialog(native->m_macPrintSession);
- PMSessionEndDocumentNoDialog(native->m_macPrintSession);
+ PMSessionEndPageNoDialog(native->GetPrintSession());
+ PMSessionEndDocumentNoDialog(native->GetPrintSession());
}
else
{
- PMRect rPage;
-
- m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
+ PMRect paperRect ;
+ m_err = PMGetAdjustedPaperRect( native->GetPageFormat() , &paperRect ) ;
+ // make sure (0,0) is at the upper left of the printable area (wx conventions)
+ // Core Graphics initially has the lower left of the paper as 0,0
if ( !m_err )
- {
- PMRect paperRect ;
- PMGetAdjustedPaperRect( native->m_macPageFormat , &paperRect ) ;
- // make sure (0,0) is at the upper left of the printable area (wx conventions)
- // Core Graphics initially has the lower left of the paper as 0,0
CGContextTranslateCTM( pageContext , (CGFloat) -paperRect.left , (CGFloat) paperRect.bottom ) ;
- CGContextScaleCTM( pageContext , 1 , -1 ) ;
- }
+
// since this is a non-critical error, we set the flag back
m_err = noErr ;
+
+ // Leopard deprecated PMSetResolution() which will not be available in 64 bit mode, so we avoid using it.
+ // To set the proper drawing resolution, the docs suggest the use of CGContextScaleCTM(), so here we go; as a
+ // consequence though, PMGetAdjustedPaperRect() and PMGetAdjustedPageRect() return unscaled rects, so we
+ // have to manually scale them later.
+ CGContextScaleCTM( pageContext, 72.0 / (double)m_ppi.x, -72.0 / (double)m_ppi.y);
+
+ impl->SetGraphicsContext( wxGraphicsContext::CreateFromNative( pageContext ) );
}
- impl->SetGraphicsContext( wxGraphicsContext::CreateFromNative( pageContext ) );
}
void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc )
return ;
wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl();
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ;
+ wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ;
- m_err = PMSessionEndPageNoDialog(native->m_macPrintSession);
+ m_err = PMSessionEndPageNoDialog(native->GetPrintSession());
if ( m_err != noErr )
{
- PMSessionEndDocumentNoDialog(native->m_macPrintSession);
+ PMSessionEndDocumentNoDialog(native->GetPrintSession());
}
// the cg context we got when starting the page isn't valid anymore, so replace it
impl->SetGraphicsContext( wxGraphicsContext::Create() );
*h = m_maxY ;
}
-wxSize wxMacCarbonPrinterDC::GetPPI() const
+wxSize wxMacCarbonPrinterDC::GetPPI() const
{
return m_ppi ;
};
{
wxSize sz = GetPPI();
m_mm_to_pix_x = mm2inches * sz.x;
- m_mm_to_pix_y = mm2inches * sz.y;
+ m_mm_to_pix_y = mm2inches * sz.y;
}
// we need at least a measuring context because people start measuring before a page
// gets printed at all
}
}
-wxRect wxPrinterDCImpl::GetPaperRect()
+wxRect wxPrinterDCImpl::GetPaperRect() const
{
wxCoord w, h;
GetOwner()->GetSize(&w, &h);
wxRect pageRect(0, 0, w, h);
- wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) m_printData.GetNativeData() ;
+ wxOSXPrintData *native = (wxOSXPrintData*) m_printData.GetNativeData() ;
OSStatus err = noErr ;
PMRect rPaper;
- err = PMGetAdjustedPaperRect(native->m_macPageFormat, &rPaper);
+ err = PMGetAdjustedPaperRect(native->GetPageFormat(), &rPaper);
if ( err != noErr )
return pageRect;
+
+ wxSize ppi = GetOwner()->GetPPI();
+ rPaper.right *= (ppi.x / 72.0);
+ rPaper.bottom *= (ppi.y / 72.0);
+ rPaper.left *= (ppi.x / 72.0);
+ rPaper.top *= (ppi.y / 72.0);
+
return wxRect(wxCoord(rPaper.left), wxCoord(rPaper.top),
wxCoord(rPaper.right - rPaper.left), wxCoord(rPaper.bottom - rPaper.top));
}
void wxPrinterDCImpl::DoGetSize(int *width, int *height) const
{
- wxCHECK_RET( m_ok , _T("GetSize() doesn't work without a valid wxPrinterDC") );
+ wxCHECK_RET( m_ok , wxT("GetSize() doesn't work without a valid wxPrinterDC") );
m_nativePrinterDC->GetSize(width, height ) ;
}