X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..08670ea85abf4b4946a9ce64971b591d7b1ee30b:/src/osx/carbon/dcprint.cpp diff --git a/src/osx/carbon/dcprint.cpp b/src/osx/carbon/dcprint.cpp index 40b1543e60..e0f31f91a2 100644 --- a/src/osx/carbon/dcprint.cpp +++ b/src/osx/carbon/dcprint.cpp @@ -46,7 +46,7 @@ public : // returns 0 in case of no Error, otherwise platform specific error codes virtual wxUint32 GetStatus() const = 0 ; - bool Ok() { return GetStatus() == 0 ; } + bool IsOk() { return GetStatus() == 0 ; } static wxNativePrinterDC* Create(wxPrintData* data) ; } ; @@ -84,30 +84,42 @@ wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) 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->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->GetPrintSettings(), &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->GetPageFormat()), &res); + m_err = PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res); + if ( m_err != noErr ) + { + m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res); + } #endif + } + } + else + { + res.hRes = res.vRes = 300; } + 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)); } @@ -128,10 +140,7 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if ( PMPrintSettingsSetJobName != NULL ) - PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message)); -#endif + PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message)); m_err = PMSessionBeginCGDocumentNoDialog(native->GetPrintSession(), native->GetPrintSettings(), @@ -148,12 +157,13 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message 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->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->GetPrintSettings(), &res) ; if ( m_err == -9589 /* kPMKeyNotFound */ ) @@ -162,15 +172,21 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message 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->GetPageFormat()), &res); + 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 ; } @@ -196,7 +212,7 @@ void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc ) m_err = PMSessionBeginPageNoDialog(native->GetPrintSession(), native->GetPageFormat(), - nil); + NULL); CGContextRef pageContext; @@ -213,22 +229,24 @@ void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc ) } else { - PMRect rPage; - - m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &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->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 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 ) @@ -274,7 +292,7 @@ wxPrinterDCImpl::wxPrinterDCImpl( wxPrinterDC *owner, const wxPrintData& printda m_nativePrinterDC = wxNativePrinterDC::Create( &m_printData ) ; if ( m_nativePrinterDC ) { - m_ok = m_nativePrinterDC->Ok() ; + m_ok = m_nativePrinterDC->IsOk() ; if ( !m_ok ) { wxString message ; @@ -315,7 +333,7 @@ bool wxPrinterDCImpl::StartDoc( const wxString& message ) { // in case we have to do additional things when successful } - m_ok = m_nativePrinterDC->Ok() ; + m_ok = m_nativePrinterDC->IsOk() ; if ( !m_ok ) { wxString message ; @@ -333,7 +351,7 @@ void wxPrinterDCImpl::EndDoc(void) return ; m_nativePrinterDC->EndDoc( (wxPrinterDC*) GetOwner() ) ; - m_ok = m_nativePrinterDC->Ok() ; + m_ok = m_nativePrinterDC->IsOk() ; if ( !m_ok ) { @@ -355,6 +373,13 @@ wxRect wxPrinterDCImpl::GetPaperRect() const 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)); } @@ -376,7 +401,7 @@ void wxPrinterDCImpl::StartPage() m_backgroundBrush = *wxWHITE_BRUSH; m_nativePrinterDC->StartPage( (wxPrinterDC*) GetOwner() ) ; - m_ok = m_nativePrinterDC->Ok() ; + m_ok = m_nativePrinterDC->IsOk() ; } @@ -386,7 +411,7 @@ void wxPrinterDCImpl::EndPage() return ; m_nativePrinterDC->EndPage( (wxPrinterDC*) GetOwner() ); - m_ok = m_nativePrinterDC->Ok() ; + m_ok = m_nativePrinterDC->IsOk() ; } void wxPrinterDCImpl::DoGetSize(int *width, int *height) const