X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f74e0d132e73250ef422c06175dcf7e4146ec57..6cef0db28018fd2644ee4e38af715872e5242459:/src/mac/carbon/printmac.cpp diff --git a/src/mac/carbon/printmac.cpp b/src/mac/carbon/printmac.cpp index 9d695cd4d2..1de459588a 100644 --- a/src/mac/carbon/printmac.cpp +++ b/src/mac/carbon/printmac.cpp @@ -33,6 +33,7 @@ #include "wx/mac/private/print.h" #include "wx/printdlg.h" +#include "wx/paper.h" #include "wx/mac/printdlg.h" #include @@ -79,12 +80,12 @@ void wxMacCarbonPrintData::ValidateOrCreate() OSStatus err = noErr ; if ( m_macPrintSession == kPMNoReference ) { - err = PMCreateSession( (PMPrintSession *) &m_macPrintSession ) ; + err = PMCreateSession( &m_macPrintSession ) ; } // Set up a valid PageFormat object. if ( m_macPageFormat == kPMNoPageFormat) { - err = PMCreatePageFormat((PMPageFormat *) &m_macPageFormat); + err = PMCreatePageFormat(&m_macPageFormat); // Note that PMPageFormat is not session-specific, but calling // PMSessionDefaultPageFormat assigns values specific to the printer @@ -92,21 +93,21 @@ void wxMacCarbonPrintData::ValidateOrCreate() if ((err == noErr) && ( m_macPageFormat != kPMNoPageFormat)) { - err = PMSessionDefaultPageFormat((PMPrintSession) m_macPrintSession, - (PMPageFormat) m_macPageFormat); + err = PMSessionDefaultPageFormat(m_macPrintSession, + m_macPageFormat); } } else { - err = PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession, - (PMPageFormat) m_macPageFormat, + err = PMSessionValidatePageFormat(m_macPrintSession, + m_macPageFormat, kPMDontWantBoolean); } // Set up a valid PrintSettings object. if ( m_macPrintSettings == kPMNoPrintSettings) { - err = PMCreatePrintSettings((PMPrintSettings *) &m_macPrintSettings); + err = PMCreatePrintSettings( &m_macPrintSettings); // Note that PMPrintSettings is not session-specific, but calling // PMSessionDefaultPrintSettings assigns values specific to the printer @@ -114,14 +115,14 @@ void wxMacCarbonPrintData::ValidateOrCreate() if ((err == noErr) && ( m_macPrintSettings != kPMNoPrintSettings)) { - err = PMSessionDefaultPrintSettings((PMPrintSession) m_macPrintSession, - (PMPrintSettings) m_macPrintSettings); + err = PMSessionDefaultPrintSettings(m_macPrintSession, + m_macPrintSettings); } } else { - err = PMSessionValidatePrintSettings((PMPrintSession) m_macPrintSession, - (PMPrintSettings) m_macPrintSettings, + err = PMSessionValidatePrintSettings( m_macPrintSession, + m_macPrintSettings, kPMDontWantBoolean); } } @@ -130,12 +131,16 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) { ValidateOrCreate() ; PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ; - PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? - kPMLandscape : kPMPortrait , false ) ; + if ( data.IsOrientationReversed() ) + PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + kPMReverseLandscape : kPMReversePortrait , false ) ; + else + PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + kPMLandscape : kPMPortrait , false ) ; // collate cannot be set #if 0 // not yet tested if ( !m_printerName.empty() ) - PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ; + PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxCFStringRef( m_printerName , wxFont::GetDefaultEncoding() ) ) ; #endif #ifndef __LP64__ PMColorMode color ; @@ -149,17 +154,33 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ; #endif - // PMDuplexMode not yet accessible via API + PMDuplexMode mode = 0 ; + switch( data.GetDuplex() ) + { + case wxDUPLEX_HORIZONTAL : + mode = kPMDuplexNoTumble ; + break ; + case wxDUPLEX_VERTICAL : + mode = kPMDuplexTumble ; + break ; + case wxDUPLEX_SIMPLEX : + default : + mode = kPMDuplexNone ; + break ; + } + PMSetDuplex( (PMPrintSettings) m_macPrintSettings, mode ) ; + // PMQualityMode not yet accessible via API // todo paperSize PMResolution res; PMPrinter printer; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +#if 0 // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 PMPrinterGetOutputResolution( printer, (PMPrintSettings) m_macPrintSettings, &res) ; // TODO transfer ? into page format ? + // may fail ! #else PMTag tag = kPMMaxSquareResolution; PMPrinterGetPrinterResolution(printer, tag, &res); @@ -188,15 +209,21 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) if ( err == noErr ) { if ( orientation == kPMPortrait || orientation == kPMReversePortrait ) + { data.SetOrientation( wxPORTRAIT ); + data.SetOrientationReversed( orientation == kPMReversePortrait ); + } else + { data.SetOrientation( wxLANDSCAPE ); + data.SetOrientationReversed( orientation == kPMReverseLandscape ); + } } // collate cannot be set #if 0 { - wxMacCFStringHolder name ; + wxCFStringRef name ; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession , &printer ) ; @@ -210,21 +237,43 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) if ( err == noErr ) data.SetColour( !(color == kPMBlackAndWhite) ) ; #endif - // PMDuplexMode not yet accessible via API + PMDuplexMode mode = 0 ; + PMGetDuplex( (PMPrintSettings) m_macPrintSettings, &mode ) ; + switch( mode ) + { + case kPMDuplexNoTumble : + data.SetDuplex(wxDUPLEX_HORIZONTAL); + break ; + case kPMDuplexTumble : + data.SetDuplex(wxDUPLEX_VERTICAL); + break ; + case kPMDuplexNone : + default : + data.SetDuplex(wxDUPLEX_SIMPLEX); + break ; + } // PMQualityMode not yet accessible via API - // todo paperSize + + PMPaper paper ; + PMGetPageFormatPaper( m_macPageFormat, &paper ); + PMRect rPaper; err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper); if ( err == noErr ) { - data.SetPaperSize( wxSize ( - (int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , - (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) ) ); + wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , + (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 )); + data.SetPaperSize(sz); + wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); + if (id != wxPAPER_NONE) + { + data.SetPaperId(id); + } } return true ; } -void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *data ) +void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *WXUNUSED(data) ) { // should we setup the page rect here ? // since MacOS sometimes has two same paper rects with different @@ -237,6 +286,10 @@ void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper); if ( err == noErr ) { + wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , + (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 )); + data->SetPaperSize(sz); + PMRect rPage ; err = PMGetUnadjustedPageRect(m_macPageFormat , &rPage ) ; if ( err == noErr ) @@ -334,13 +387,14 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) m_printDialogData.SetMaxPage(9999); // Create a suitable device context - wxDC *dc = NULL; + wxPrinterDC *dc = NULL; if (prompt) { - wxPrintDialog dialog(parent, & m_printDialogData); + wxMacPrintDialog dialog(parent, & m_printDialogData); if (dialog.ShowModal() == wxID_OK) { - dc = dialog.GetPrintDC(); + dc = wxDynamicCast(dialog.GetPrintDC(), wxPrinterDC); + wxASSERT(dc); m_printDialogData = dialog.GetPrintDialogData(); } } @@ -350,7 +404,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } // May have pressed cancel. - if (!dc || !dc->Ok()) + if (!dc || !dc->IsOk()) { if (dc) delete dc; @@ -362,7 +416,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) PMResolution res; wxMacCarbonPrintData* nativeData = (wxMacCarbonPrintData*) (m_printDialogData.GetPrintData().GetNativeData()); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +#if 0 // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 PMPrinter printer; PMSessionGetCurrentPrinter(nativeData->m_macPrintSession, &printer); PMPrinterGetOutputResolution( printer, nativeData->m_macPrintSettings, &res) ; @@ -375,11 +429,12 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) printout->SetDC(dc); int w, h; - wxCoord ww, hh; dc->GetSize(&w, &h); printout->SetPageSizePixels((int)w, (int)h); - dc->GetSizeMM(&ww, &hh); - printout->SetPageSizeMM((int)ww, (int)hh); + printout->SetPaperRectPixels(dc->GetPaperRect()); + wxCoord mw, mh; + dc->GetSizeMM(&mw, &mh); + printout->SetPageSizeMM((int)mw, (int)mh); // Create an abort window wxBeginBusyCursor(); @@ -446,19 +501,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } else { -#if TARGET_CARBON - if ( UMAGetSystemVersion() >= 0x1000 ) -#endif - { -#if !wxMAC_USE_CORE_GRAPHICS - GrafPtr thePort ; - GetPort( &thePort ) ; -#endif - wxSafeYield(win,true); -#if !wxMAC_USE_CORE_GRAPHICS - SetPort( thePort ) ; -#endif - } + wxSafeYield(win,true); dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); @@ -499,7 +542,7 @@ wxDC* wxMacPrinter::PrintDialog(wxWindow *parent) return dc; } -bool wxMacPrinter::Setup(wxWindow *parent) +bool wxMacPrinter::Setup(wxWindow *WXUNUSED(parent)) { #if 0 wxPrintDialog dialog(parent, & m_printDialogData); @@ -555,36 +598,43 @@ void wxMacPrintPreview::DetermineScaling(void) wxSize ppiScreen( 72 , 72 ) ; wxSize ppiPrinter( 72 , 72 ) ; + // Note that with Leopard, screen dpi=72 is no longer a given m_previewPrintout->SetPPIScreen( ppiScreen.x , ppiScreen.y ) ; - int x , y ; + wxCoord w , h ; wxCoord ww, hh; + wxRect paperRect; // Get a device context for the currently selected printer wxPrinterDC printerDC(m_printDialogData.GetPrintData()); - if (printerDC.Ok()) + if (printerDC.IsOk()) { printerDC.GetSizeMM(&ww, &hh); - printerDC.GetSize( &x , &y ) ; + printerDC.GetSize( &w , &h ) ; ppiPrinter = printerDC.GetPPI() ; + paperRect = printerDC.GetPaperRect(); m_isOk = true ; } else { // use some defaults - x = 8 * 72 ; - y = 11 * 72 ; - ww = (int) (x * 25.4 / ppiPrinter.x) ; - hh = (int) (y * 25.4 / ppiPrinter.y) ; + w = 8 * 72 ; + h = 11 * 72 ; + ww = (wxCoord) (w * 25.4 / ppiPrinter.x) ; + hh = (wxCoord) (h * 25.4 / ppiPrinter.y) ; + paperRect = wxRect(0, 0, w, h); m_isOk = false ; } - m_previewPrintout->SetPageSizeMM((int)ww, (int)hh); - m_previewPrintout->SetPageSizePixels( x , y) ; - m_pageWidth = x ; - m_pageHeight = y ; + m_pageWidth = w; + m_pageHeight = h; + + m_previewPrintout->SetPageSizePixels(w , h) ; + m_previewPrintout->SetPageSizeMM(ww, hh); + m_previewPrintout->SetPaperRectPixels(paperRect); m_previewPrintout->SetPPIPrinter( ppiPrinter.x , ppiPrinter.y ) ; - m_previewScale = (float)((float)ppiScreen.x/(float)ppiPrinter.y); + m_previewScaleX = float(ppiScreen.x) / ppiPrinter.x; + m_previewScaleY = float(ppiScreen.y) / ppiPrinter.y; } #endif