bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) { ValidateOrCreate() ; PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ; PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; // collate cannot be set #if 0 // not yet tested if ( m_printerName.Length() > 0 ) PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ; #endif PMColorMode color ; PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; if ( data.GetColour() ) { if ( color == kPMBlackAndWhite ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; } else PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ; // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize PMResolution res; PMPrinter printer; PMTag tag = kPMMaxSquareResolution; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); PMPrinterGetPrinterResolution(printer, tag, &res); PMSetResolution((PMPageFormat) m_macPageFormat, &res); return true ; }
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) { m_err = noErr ; wxOSXPrintData *native = (wxOSXPrintData*) data->GetNativeData() ; PMRect 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; PMPrinter printer; m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer); if ( m_err == noErr ) { m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ; if ( m_err == -9589 /* kPMKeyNotFound */ ) { m_err = noErr ; res.hRes = res.vRes = 300; } } 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)); }
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) { #if !wxMAC_USE_CORE_GRAPHICS ::GetPort( & m_macPrintFormerPort ) ; #endif m_err = noErr ; wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->GetNativeData() ; PMRect rPage; m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &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_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 PMPrinter printer; PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer); PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ; #else m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res); #endif m_ppi = wxSize(int(res.hRes), int(res.vRes)); }
void qprinterSize2CarbonSize(QPrinter::PageSize &size, PMPageFormat &format, PMPrintSession session) { if (size >= QPrinter::Custom) return; // Basically, get the supported pages supported by the printer and see what will work, // Since we document undefined behavior when we don't specify anything, don't worry if we can't. PaperSize newSize = sizes[size]; CFArrayRef formats; PMPrinter printer; if (PMSessionGetCurrentPrinter(session, &printer) == noErr && PMSessionCreatePageFormatList(session, printer, &formats) == noErr) { CFIndex total = CFArrayGetCount(formats); PMPageFormat tmp; PMRect paper; for (CFIndex idx = 0; idx < total; ++idx) { tmp = (PMPageFormat)CFArrayGetValueAtIndex(formats, idx); PMGetUnadjustedPaperRect(tmp, &paper); int wMM = int((paper.right - paper.left) / 72 * 25.4 + 0.5); int hMM = int((paper.bottom - paper.top) / 72 * 25.4 + 0.5); if (newSize.w == wMM && newSize.h == hMM) { PMCopyPageFormat(tmp, format); break; } } CFRelease(formats); } }
void wxOSXPrintData::TransferPaperInfoTo( wxPrintData &data ) { PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession, &printer ); OSStatus err = noErr ; UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) data.SetNoCopies( copies ) ; PMOrientation orientation ; err = PMGetOrientation( m_macPageFormat , &orientation ) ; if ( err == noErr ) { if ( orientation == kPMPortrait || orientation == kPMReversePortrait ) { data.SetOrientation( wxPORTRAIT ); data.SetOrientationReversed( orientation == kPMReversePortrait ); } else { data.SetOrientation( wxLANDSCAPE ); data.SetOrientationReversed( orientation == kPMReverseLandscape ); } } Boolean collate; if (PMGetCollate(m_macPrintSettings, &collate) == noErr) data.SetCollate(collate); PMDuplexMode mode = 0 ; PMGetDuplex( 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 ; } double height, width; PMPaperGetHeight(m_macPaper, &height); PMPaperGetWidth(m_macPaper, &width); wxSize sz((int)(width * pt2mm + 0.5 ) , (int)(height * pt2mm + 0.5 )); data.SetPaperSize(sz); wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); if (id != wxPAPER_NONE) { data.SetPaperId(id); } }
void wxOSXPrintData::TransferResolutionFrom( const wxPrintData &data ) { PMPrinter printer; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); UInt32 resCount; PMResolution *resolutions = GetSupportedResolutions(printer, &resCount); if (resolutions) { wxPrintQuality quality = data.GetQuality(); if (quality >= 0) quality = wxPRINT_QUALITY_HIGH; PMResolution res = resolutions[((quality - wxPRINT_QUALITY_DRAFT) * (resCount - 1)) / 3]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if ( PMPrinterSetOutputResolution != NULL ) PMPrinterSetOutputResolution(printer, m_macPrintSettings, &res); else #endif { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 PMSetResolution( m_macPageFormat, &res); #endif } free(resolutions); } }
void wxOSXPrintData::TransferResolutionTo( wxPrintData &data ) { PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession, &printer ); /* assume high quality, will change below if we are able to */ data.SetQuality(wxPRINT_QUALITY_HIGH); PMResolution *resolutions; UInt32 resCount; resolutions = GetSupportedResolutions(printer, &resCount); if (resolutions) { bool valid = false; PMResolution res; if ( PMPrinterGetOutputResolution(printer, m_macPrintSettings, &res) == noErr ) valid = true; if ( valid ) { UInt32 i; for (i = 0; i < resCount; i++) { if ((resolutions[i].hRes == res.hRes) && (resolutions[i].vRes = res.vRes)) break; } if (i < resCount) data.SetQuality((((i + 1) * 3) / resCount) + wxPRINT_QUALITY_DRAFT); } free(resolutions); } }
void QMacPrintEnginePrivate::setPaperSize(QPrinter::PaperSize ps) { Q_Q(QMacPrintEngine); QSizeF newSize = qt_paperSizeToQSizeF(ps); QCFType<CFArrayRef> formats; PMPrinter printer; if (PMSessionGetCurrentPrinter(session, &printer) == noErr && PMSessionCreatePageFormatList(session, printer, &formats) == noErr) { CFIndex total = CFArrayGetCount(formats); PMPageFormat tmp; PMRect paper; for (CFIndex idx = 0; idx < total; ++idx) { tmp = static_cast<PMPageFormat>( const_cast<void *>(CFArrayGetValueAtIndex(formats, idx))); PMGetUnadjustedPaperRect(tmp, &paper); int wMM = int((paper.right - paper.left) / 72 * 25.4 + 0.5); int hMM = int((paper.bottom - paper.top) / 72 * 25.4 + 0.5); if (newSize.width() == wMM && newSize.height() == hMM) { PMCopyPageFormat(tmp, format); // reset the orientation and resolution as they are lost in the copy. q->setProperty(QPrintEngine::PPK_Orientation, orient); if (PMSessionValidatePageFormat(session, format, kPMDontWantBoolean) != noErr) { // Don't know, warn for the moment. qWarning("QMacPrintEngine, problem setting format and resolution for this page size"); } break; } } } }
bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message ) { if ( m_err ) return false ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message)); m_err = PMSessionBeginCGDocumentNoDialog(native->GetPrintSession(), native->GetPrintSettings(), native->GetPageFormat()); if ( m_err != noErr ) return false; PMRect rPage; m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage); if ( m_err != noErr ) return false ; m_maxX = wxCoord(rPage.right - rPage.left) ; m_maxY = wxCoord(rPage.bottom - rPage.top); PMResolution res; 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; } } else #endif { #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 ; }
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) { m_err = noErr ; wxOSXPrintData *native = (wxOSXPrintData*) data->GetNativeData() ; PMRect 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; 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; } } } else #endif { #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 } } 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)); }
void wxOSXPrintData::TransferPrinterNameTo( wxPrintData &data ) { CFStringRef name; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession, &printer ); if (PMPrinterIsDefault(printer)) data.SetPrinterName(wxEmptyString); else { name = PMPrinterGetName(printer); CFRetain(name); data.SetPrinterName(wxCFStringRef(name).AsString()); } }
bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) { OSStatus err = noErr ; UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) data.SetNoCopies( copies ) ; PMOrientation orientation ; err = PMGetOrientation( m_macPageFormat , &orientation ) ; if ( err == noErr ) { if ( orientation == kPMPortrait || orientation == kPMReversePortrait ) data.SetOrientation( wxPORTRAIT ); else data.SetOrientation( wxLANDSCAPE ); } // collate cannot be set #if 0 { wxMacCFStringHolder name ; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession , &printer ) ; m_printerName = name.AsString() ; } #endif PMColorMode color ; err = PMGetColorMode( m_macPrintSettings, &color ) ; if ( err == noErr ) data.SetColour( !(color == kPMBlackAndWhite) ) ; // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize 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 ) ) ); } return true ; }
bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) ) { if ( m_err ) return false ; wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().GetNativeData() ; #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4 && wxMAC_USE_CORE_GRAPHICS { CFStringRef s[1] = { kPMGraphicsContextCoreGraphics }; CFArrayRef graphicsContextsArray = CFArrayCreate(NULL, (const void**)s, 1, &kCFTypeArrayCallBacks); PMSessionSetDocumentFormatGeneration(native->m_macPrintSession, kPMDocumentFormatPDF, graphicsContextsArray, NULL); CFRelease(graphicsContextsArray); } #endif #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 && wxMAC_USE_CORE_GRAPHICS m_err = PMSessionBeginCGDocument(native->m_macPrintSession, native->m_macPrintSettings, native->m_macPageFormat); #else m_err = PMSessionBeginDocument(native->m_macPrintSession, native->m_macPrintSettings, native->m_macPageFormat); #endif if ( m_err != noErr ) return false; PMRect rPage; m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage); if ( m_err != noErr ) return false ; m_maxX = wxCoord(rPage.right - rPage.left) ; m_maxY = wxCoord(rPage.bottom - rPage.top); PMResolution res; #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 PMPrinter printer; PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer); PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ; #else m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res); #endif m_ppi = wxSize(int(res.hRes), int(res.vRes)); return true ; }
void wxOSXPrintData::TransferResolutionFrom( const wxPrintData &data ) { PMPrinter printer; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); UInt32 resCount; PMResolution *resolutions = GetSupportedResolutions(printer, &resCount); if (resolutions) { wxPrintQuality quality = data.GetQuality(); if (quality >= 0) quality = wxPRINT_QUALITY_HIGH; PMResolution res = resolutions[((quality - wxPRINT_QUALITY_DRAFT) * (resCount - 1)) / 3]; PMPrinterSetOutputResolution(printer, m_macPrintSettings, &res); free(resolutions); } }
QList<QVariant> QMacPrintEnginePrivate::supportedResolutions() const { Q_ASSERT_X(session, "QMacPrinterEngine::supportedResolutions", "must have a valid printer session"); UInt32 resCount; QList<QVariant> resolutions; PMPrinter printer; if (PMSessionGetCurrentPrinter(session, &printer) == noErr) { PMResolution res; OSStatus status = PMPrinterGetPrinterResolutionCount(printer, &resCount); if (status == kPMNotImplemented) { #if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5) // *Sigh* we have to use the non-indexed version. if (PMPrinterGetPrinterResolution(printer, kPMMinSquareResolution, &res) == noErr) resolutions.append(int(res.hRes)); if (PMPrinterGetPrinterResolution(printer, kPMMaxSquareResolution, &res) == noErr) { QVariant var(int(res.hRes)); if (!resolutions.contains(var)) resolutions.append(var); } if (PMPrinterGetPrinterResolution(printer, kPMDefaultResolution, &res) == noErr) { QVariant var(int(res.hRes)); if (!resolutions.contains(var)) resolutions.append(var); } #endif } else if (status == noErr) { // According to the docs, index start at 1. for (UInt32 i = 1; i <= resCount; ++i) { if (PMPrinterGetIndexedPrinterResolution(printer, i, &res) == noErr) resolutions.append(QVariant(int(res.hRes))); } } else { qWarning("QMacPrintEngine::supportedResolutions: Unexpected error: %ld", status); } } return resolutions; }
bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) { sm_abortIt = false; sm_abortWindow = NULL; if (!printout) { sm_lastError = wxPRINTER_ERROR; return false; } if (m_printDialogData.GetMinPage() < 1) m_printDialogData.SetMinPage(1); if (m_printDialogData.GetMaxPage() < 1) m_printDialogData.SetMaxPage(9999); // Create a suitable device context wxPrinterDC *dc = NULL; if (prompt) { wxMacPrintDialog dialog(parent, & m_printDialogData); if (dialog.ShowModal() == wxID_OK) { dc = wxDynamicCast(dialog.GetPrintDC(), wxPrinterDC); wxASSERT(dc); m_printDialogData = dialog.GetPrintDialogData(); } } else { dc = new wxPrinterDC( m_printDialogData.GetPrintData() ) ; } // May have pressed cancel. if (!dc || !dc->IsOk()) { delete dc; return false; } PMResolution res; PMPrinter printer; wxOSXPrintData* nativeData = (wxOSXPrintData*) (m_printDialogData.GetPrintData().GetNativeData()); if (PMSessionGetCurrentPrinter(nativeData->GetPrintSession(), &printer) == noErr) { if (PMPrinterGetOutputResolution( printer, nativeData->GetPrintSettings(), &res) == -9589 /* kPMKeyNotFound */ ) { res.hRes = res.vRes = 300; } } else { // fallback res.hRes = res.vRes = 300; } printout->SetPPIPrinter(int(res.hRes), int(res.vRes)); // Set printout parameters printout->SetUp(*dc); // Create an abort window wxBeginBusyCursor(); printout->OnPreparePrinting(); // Get some parameters from the printout, if defined int fromPage, toPage; int minPage, maxPage; printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); if (maxPage == 0) { sm_lastError = wxPRINTER_ERROR; return false; } // Only set min and max, because from and to will be // set by the user if prompted for the print dialog above m_printDialogData.SetMinPage(minPage); m_printDialogData.SetMaxPage(maxPage); // Set from and to pages if bypassing the print dialog if ( !prompt ) { m_printDialogData.SetFromPage(fromPage); if( m_printDialogData.GetAllPages() ) m_printDialogData.SetToPage(maxPage); else m_printDialogData.SetToPage(toPage); } printout->OnBeginPrinting(); bool keepGoing = true; if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) { wxEndBusyCursor(); wxMessageBox(wxT("Could not start printing."), wxT("Print Error"), wxOK, parent); } int pn; for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); pn++) { if (sm_abortIt) { break; } else { dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); } } printout->OnEndDocument(); printout->OnEndPrinting(); if (sm_abortWindow) { sm_abortWindow->Show(false); wxDELETE(sm_abortWindow); } wxEndBusyCursor(); delete dc; return true; }
int QMacPrintEngine::metric(QPaintDevice::PaintDeviceMetric m) const { Q_D(const QMacPrintEngine); int val = 1; switch (m) { case QPaintDevice::PdmWidth: if (d->hasCustomPaperSize) { val = qRound(d->customSize.width()); if (d->hasCustomPageMargins) { val -= qRound(d->leftMargin + d->rightMargin); } else { QList<QVariant> margins = property(QPrintEngine::PPK_PageMargins).toList(); val -= qRound(margins.at(0).toDouble() + margins.at(2).toDouble()); } } else { val = qt_get_PDMWidth(d->format, property(PPK_FullPage).toBool(), d->resolution); } break; case QPaintDevice::PdmHeight: if (d->hasCustomPaperSize) { val = qRound(d->customSize.height()); if (d->hasCustomPageMargins) { val -= qRound(d->topMargin + d->bottomMargin); } else { QList<QVariant> margins = property(QPrintEngine::PPK_PageMargins).toList(); val -= qRound(margins.at(1).toDouble() + margins.at(3).toDouble()); } } else { val = qt_get_PDMHeight(d->format, property(PPK_FullPage).toBool(), d->resolution); } break; case QPaintDevice::PdmWidthMM: val = metric(QPaintDevice::PdmWidth); val = int((val * 254 + 5 * d->resolution.hRes) / (10 * d->resolution.hRes)); break; case QPaintDevice::PdmHeightMM: val = metric(QPaintDevice::PdmHeight); val = int((val * 254 + 5 * d->resolution.vRes) / (10 * d->resolution.vRes)); break; case QPaintDevice::PdmPhysicalDpiX: case QPaintDevice::PdmPhysicalDpiY: { PMPrinter printer; if(PMSessionGetCurrentPrinter(d->session, &printer) == noErr) { PMResolution resolution; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) { PMPrinterGetOutputResolution(printer, d->settings, &resolution); } else #endif { #ifndef Q_OS_MAC64 PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &resolution); #endif } val = (int)resolution.vRes; break; } //otherwise fall through } case QPaintDevice::PdmDpiY: val = (int)d->resolution.vRes; break; case QPaintDevice::PdmDpiX: val = (int)d->resolution.hRes; break; case QPaintDevice::PdmNumColors: val = (1 << metric(QPaintDevice::PdmDepth)); break; case QPaintDevice::PdmDepth: val = 24; break; default: val = 0; qWarning("QPrinter::metric: Invalid metric command"); } return val; }
bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) { sm_abortIt = false; sm_abortWindow = NULL; if (!printout) { sm_lastError = wxPRINTER_ERROR; return false; } if (m_printDialogData.GetMinPage() < 1) m_printDialogData.SetMinPage(1); if (m_printDialogData.GetMaxPage() < 1) m_printDialogData.SetMaxPage(9999); // Create a suitable device context wxPrinterDC *dc = NULL; if (prompt) { wxMacPrintDialog dialog(parent, & m_printDialogData); if (dialog.ShowModal() == wxID_OK) { dc = wxDynamicCast(dialog.GetPrintDC(), wxPrinterDC); wxASSERT(dc); m_printDialogData = dialog.GetPrintDialogData(); } } else { dc = new wxPrinterDC( m_printDialogData.GetPrintData() ) ; } // May have pressed cancel. if (!dc || !dc->IsOk()) { delete dc; return false; } // on the mac we have always pixels as addressing mode with 72 dpi printout->SetPPIScreen(72, 72); PMResolution res; PMPrinter printer; wxOSXPrintData* nativeData = (wxOSXPrintData*) (m_printDialogData.GetPrintData().GetNativeData()); if (PMSessionGetCurrentPrinter(nativeData->GetPrintSession(), &printer) == noErr) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if ( PMPrinterGetOutputResolution != NULL ) { if (PMPrinterGetOutputResolution( printer, nativeData->GetPrintSettings(), &res) == -9589 /* kPMKeyNotFound */ ) { res.hRes = res.vRes = 300; } } else #endif { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res); #endif } } printout->SetPPIPrinter(int(res.hRes), int(res.vRes)); // Set printout parameters printout->SetDC(dc); int w, h; dc->GetSize(&w, &h); printout->SetPageSizePixels((int)w, (int)h); printout->SetPaperRectPixels(dc->GetPaperRect()); wxCoord mw, mh; dc->GetSizeMM(&mw, &mh); printout->SetPageSizeMM((int)mw, (int)mh); // Create an abort window wxBeginBusyCursor(); printout->OnPreparePrinting(); // Get some parameters from the printout, if defined int fromPage, toPage; int minPage, maxPage; printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); if (maxPage == 0) { sm_lastError = wxPRINTER_ERROR; return false; } // Only set min and max, because from and to will be // set by the user m_printDialogData.SetMinPage(minPage); m_printDialogData.SetMaxPage(maxPage); printout->OnBeginPrinting(); bool keepGoing = true; if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) { wxEndBusyCursor(); wxMessageBox(wxT("Could not start printing."), wxT("Print Error"), wxOK, parent); } int pn; for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); pn++) { if (sm_abortIt) { break; } else { dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); } } printout->OnEndDocument(); printout->OnEndPrinting(); if (sm_abortWindow) { sm_abortWindow->Show(false); wxDELETE(sm_abortWindow); } wxEndBusyCursor(); delete dc; return true; }
void wxOSXPrintData::TransferPaperInfoFrom( const wxPrintData &data ) { PMPrinter printer; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); wxSize papersize = wxDefaultSize; const wxPaperSize paperId = data.GetPaperId(); if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase ) { papersize = wxThePrintPaperDatabase->GetSize(paperId); if ( papersize != wxDefaultSize ) { papersize.x /= 10; papersize.y /= 10; } } else { papersize = data.GetPaperSize(); } if ( papersize != wxDefaultSize ) { papersize.x = (wxInt32) (papersize.x * mm2pt); papersize.y = (wxInt32) (papersize.y * mm2pt); double height, width; PMPaperGetHeight(m_macPaper, &height); PMPaperGetWidth(m_macPaper, &width); if ( fabs( width - papersize.x ) >= 5 || fabs( height - papersize.y ) >= 5 ) { // we have to change the current paper CFArrayRef paperlist = 0 ; if ( PMPrinterGetPaperList( printer, &paperlist ) == noErr ) { PMPaper bestPaper = kPMNoData ; CFIndex top = CFArrayGetCount(paperlist); for ( CFIndex i = 0 ; i < top ; ++ i ) { PMPaper paper = (PMPaper) CFArrayGetValueAtIndex( paperlist, i ); PMPaperGetHeight(paper, &height); PMPaperGetWidth(paper, &width); if ( fabs( width - papersize.x ) < 5 && fabs( height - papersize.y ) < 5 ) { // TODO test for duplicate hits and use additional // criteria for best match bestPaper = paper; } } PMPaper paper = kPMNoData; if ( bestPaper == kPMNoData ) { const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 }; wxString id, name(wxT("Custom paper")); id.Printf(wxT("wxPaperCustom%dx%d"), papersize.x, papersize.y); if ( PMPaperCreateCustom ( printer, wxCFStringRef(id, wxFont::GetDefaultEncoding()), wxCFStringRef(name, wxFont::GetDefaultEncoding()), papersize.x, papersize.y, &margins, &paper ) ) { bestPaper = paper; } } if ( bestPaper != kPMNoData ) { PMPageFormat pageFormat; PMCreatePageFormatWithPMPaper(&pageFormat, bestPaper); PMCopyPageFormat( pageFormat, m_macPageFormat ); PMRelease(pageFormat); PMGetPageFormatPaper(m_macPageFormat, &m_macPaper); } PMRelease(paper); } } } PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ; PMSetCollate(m_macPrintSettings, data.GetCollate()); if ( data.IsOrientationReversed() ) PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMReverseLandscape : kPMReversePortrait , false ) ; else PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; 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( m_macPrintSettings, mode ) ; if ( data.IsOrientationReversed() ) PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMReverseLandscape : kPMReversePortrait , false ) ; else PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; }
void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) { Q_D(QMacPrintEngine); d->valueCache.insert(key, value); if (!d->session) return; switch (key) { case PPK_CollateCopies: break; case PPK_ColorMode: break; case PPK_Creator: break; case PPK_DocumentName: break; case PPK_PageOrder: break; case PPK_PaperSource: break; case PPK_SelectionOption: break; case PPK_Resolution: { PMPrinter printer; UInt32 count; if (PMSessionGetCurrentPrinter(d->session, &printer) != noErr) break; if (PMPrinterGetPrinterResolutionCount(printer, &count) != noErr) break; PMResolution resolution = { 0.0, 0.0 }; PMResolution bestResolution = { 0.0, 0.0 }; int dpi = value.toInt(); int bestDistance = INT_MAX; for (UInt32 i = 1; i <= count; ++i) { // Yes, it starts at 1 if (PMPrinterGetIndexedPrinterResolution(printer, i, &resolution) == noErr) { if (dpi == int(resolution.hRes)) { bestResolution = resolution; break; } else { int distance = qAbs(dpi - int(resolution.hRes)); if (distance < bestDistance) { bestDistance = distance; bestResolution = resolution; } } } } PMSessionValidatePageFormat(d->session, d->format, kPMDontWantBoolean); break; } case PPK_FullPage: d->fullPage = value.toBool(); break; case PPK_NumberOfCopies: PMSetCopies(d->settings, value.toInt(), false); break; case PPK_Orientation: { if (d->state == QPrinter::Active) { qWarning("QMacPrintEngine::setOrientation: Orientation cannot be changed during a print job, ignoring change"); } else { QPrinter::Orientation newOrientation = QPrinter::Orientation(value.toInt()); if (d->hasCustomPaperSize && (d->orient != newOrientation)) d->customSize = QSizeF(d->customSize.height(), d->customSize.width()); d->orient = newOrientation; PMOrientation o = d->orient == QPrinter::Portrait ? kPMPortrait : kPMLandscape; PMSetOrientation(d->format, o, false); PMSessionValidatePageFormat(d->session, d->format, kPMDontWantBoolean); } break; } case PPK_OutputFileName: d->outputFilename = value.toString(); break; case PPK_PaperSize: d->setPaperSize(QPrinter::PaperSize(value.toInt())); break; case PPK_PrinterName: { OSStatus status = noErr; QCFType<CFArrayRef> printerList; status = PMServerCreatePrinterList(kPMServerLocal, &printerList); if (status == noErr) { CFIndex count = CFArrayGetCount(printerList); for (CFIndex i=0; i<count; ++i) { PMPrinter printer = static_cast<PMPrinter>(const_cast<void *>(CFArrayGetValueAtIndex(printerList, i))); QString name = QCFString::toQString(PMPrinterGetName(printer)); if (name == value.toString()) { status = PMSessionSetCurrentPMPrinter(d->session, printer); break; } } } if (status != noErr) qWarning("QMacPrintEngine::setPrinterName: Error setting printer: %ld", long(status)); break; } case PPK_SuppressSystemPrintStatus: d->suppressStatus = value.toBool(); break; case PPK_CustomPaperSize: { PMOrientation orientation; PMGetOrientation(d->format, &orientation); d->hasCustomPaperSize = true; d->customSize = value.toSizeF(); if (orientation != kPMPortrait) d->customSize = QSizeF(d->customSize.height(), d->customSize.width()); break; } case PPK_PageMargins: { QList<QVariant> margins(value.toList()); Q_ASSERT(margins.size() == 4); d->leftMargin = margins.at(0).toDouble(); d->topMargin = margins.at(1).toDouble(); d->rightMargin = margins.at(2).toDouble(); d->bottomMargin = margins.at(3).toDouble(); d->hasCustomPageMargins = true; break; } default: break; } }
void QMacPrintEnginePrivate::initialize() { Q_ASSERT(!session); Q_Q(QMacPrintEngine); if (!paintEngine) paintEngine = new QCoreGraphicsPaintEngine(); q->gccaps = paintEngine->gccaps; fullPage = false; if (PMCreateSession(&session) != noErr) session = 0; PMPrinter printer; if (session && PMSessionGetCurrentPrinter(session, &printer) == noErr) { QList<QVariant> resolutions = supportedResolutions(); if (!resolutions.isEmpty() && mode != QPrinter::ScreenResolution) { if (resolutions.count() > 1 && mode == QPrinter::HighResolution) { int max = 0; for (int i = 0; i < resolutions.count(); ++i) { int value = resolutions.at(i).toInt(); if (value > max) max = value; } resolution.hRes = resolution.vRes = max; } else { resolution.hRes = resolution.vRes = resolutions.at(0).toInt(); } if(resolution.hRes == 0) resolution.hRes = resolution.vRes = 600; } else { resolution.hRes = resolution.vRes = qt_defaultDpi(); } } bool settingsInitialized = (settings != 0); bool settingsOK = !settingsInitialized ? PMCreatePrintSettings(&settings) == noErr : true; if (settingsOK && !settingsInitialized) settingsOK = PMSessionDefaultPrintSettings(session, settings) == noErr; bool formatInitialized = (format != 0); bool formatOK = !formatInitialized ? PMCreatePageFormat(&format) == noErr : true; if (formatOK) { if (!formatInitialized) { formatOK = PMSessionDefaultPageFormat(session, format) == noErr; } formatOK = PMSessionValidatePageFormat(session, format, kPMDontWantBoolean) == noErr; } #ifndef Q_OS_MAC64 # if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_4) # endif { if(paintEngine->type() == QPaintEngine::CoreGraphics) { CFStringRef strings[1] = { kPMGraphicsContextCoreGraphics }; QCFType<CFArrayRef> contextArray = CFArrayCreate(kCFAllocatorDefault, reinterpret_cast<const void **>(strings), 1, &kCFTypeArrayCallBacks); OSStatus err = PMSessionSetDocumentFormatGeneration(session, kPMDocumentFormatPDF, contextArray, 0); if(err != noErr) { qWarning("QMacPrintEngine::initialize: Cannot set format generation to PDF: %ld", err); state = QPrinter::Error; } } } #endif if (!settingsOK || !formatOK) { qWarning("QMacPrintEngine::initialize: Unable to initialize QPainter"); state = QPrinter::Error; } QHash<QMacPrintEngine::PrintEnginePropertyKey, QVariant>::const_iterator propC; for (propC = valueCache.constBegin(); propC != valueCache.constEnd(); propC++) { q->setProperty(propC.key(), propC.value()); } }
QPrinter::QPrinter(PrinterMode m) : QPaintDevice(QInternal::Printer | QInternal::ExternalDevice) { d = new QPrinterPrivate; if (PMCreateSession(&psession) != noErr) psession = NULL; switch (m) { case Compatible: devFlags |= QInternal::CompatibilityMode; // fall through case PrinterResolution: case HighResolution: { bool found = FALSE; PMPrinter printer = 0; if (psession && PMSessionGetCurrentPrinter(psession, &printer) == noErr) { PMResolution pres; UInt32 count = 0, maxRes = 0; if (PMPrinterGetPrinterResolutionCount(printer, &count) == noErr && count) for (; count > 0; --count) if (PMPrinterGetIndexedPrinterResolution(printer, count, &pres) == noErr) { found = TRUE; maxRes = QMAX((uint)pres.vRes, maxRes); res = maxRes; } } if (!found) res = 600; //just to have something break; } case ScreenResolution: { short vr, hr; ScreenRes(&hr, &vr); res = vr; break; } } if (PMCreatePageFormat(&pformat) == noErr && PMSessionDefaultPageFormat(psession, pformat) == noErr) page_size = carbonSize2QPrinterSize(pformat); else page_size = A4; //other orient = Portrait; page_order = FirstPageFirst; paper_source = OnlyOne; color_mode = GrayScale; ncopies = 1; from_pg = to_pg = min_pg = max_pg = 0; state = PST_IDLE; output_file = FALSE; to_edge = FALSE; //mac specific pformat = kPMNoPageFormat; psettings = kPMNoPrintSettings; prepare(&pformat); prepare(&psettings); interpret(&pformat); interpret(&psettings); d->printerOptions = 0; setPrintRange(AllPages); }
int QPrinter::metric(int m) const { int val = 1; switch (m) { case QPaintDeviceMetrics::PdmWidth: { bool orientInSync = true; PMOrientation o; QPrinter::Orientation tmpOrient = orientation(); if (PMGetOrientation(pformat, &o) == noErr) { orientInSync = ((o == kPMPortrait && tmpOrient == Portrait) || o == kPMLandscape && tmpOrient == Landscape); } PageSize s = pageSize(); if (s >= QPrinter::Custom) { val = tmpOrient == Portrait ? customPaperSize_.width() : customPaperSize_.height(); } else { if (state == PST_ACTIVE || (tmpOrient == Portrait || orientInSync)) { val = qt_get_PDMWidth(pformat, fullPage()); } else { val = qt_get_PDMHeight(pformat, fullPage()); } } break; } case QPaintDeviceMetrics::PdmHeight: { bool orientInSync = true; PMOrientation o; QPrinter::Orientation tmpOrient = orientation(); if (PMGetOrientation(pformat, &o) == noErr) { orientInSync = ((o == kPMPortrait && tmpOrient == Portrait) || o == kPMLandscape && tmpOrient == Landscape); } PageSize s = pageSize(); if (s >= QPrinter::Custom) { val = tmpOrient == Portrait ? customPaperSize_.height() : customPaperSize_.width(); } else { if (state == PST_ACTIVE || (tmpOrient == Portrait || orientInSync)) { val = qt_get_PDMHeight(pformat, fullPage()); } else { val = qt_get_PDMWidth(pformat, fullPage()); } } break; } // We don't have to worry about the printer state here as metric() does that for us. case QPaintDeviceMetrics::PdmWidthMM: val = metric(QPaintDeviceMetrics::PdmWidth); val = (val * 254 + 5 * res) / (10 * res); break; case QPaintDeviceMetrics::PdmHeightMM: val = metric(QPaintDeviceMetrics::PdmHeight); val = (val * 254 + 5 * res) / (10 * res); break; case QPaintDeviceMetrics::PdmPhysicalDpiX: case QPaintDeviceMetrics::PdmPhysicalDpiY: { PMPrinter printer; if (PMSessionGetCurrentPrinter(psession, &printer) == noErr) { PMResolution resolution; PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &resolution); val = (int)resolution.vRes; break; } //otherwise fall through } case QPaintDeviceMetrics::PdmDpiY: case QPaintDeviceMetrics::PdmDpiX: val = res; break; case QPaintDeviceMetrics::PdmNumColors: val = (1 << metric(QPaintDeviceMetrics::PdmDepth)); break; case QPaintDeviceMetrics::PdmDepth: val = 24; break; default: val = 0; #if defined(QT_CHECK_RANGE) qWarning("Qt: QPixmap::metric: Invalid metric command"); #endif } return val; }
bool wxOSXPrintData::TransferTo( wxPrintData &data ) { OSStatus err = noErr ; #if wxOSX_USE_COCOA UpdateToPMState(); #endif UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) data.SetNoCopies( copies ) ; PMOrientation orientation ; err = PMGetOrientation( m_macPageFormat , &orientation ) ; if ( err == noErr ) { if ( orientation == kPMPortrait || orientation == kPMReversePortrait ) { data.SetOrientation( wxPORTRAIT ); data.SetOrientationReversed( orientation == kPMReversePortrait ); } else { data.SetOrientation( wxLANDSCAPE ); data.SetOrientationReversed( orientation == kPMReverseLandscape ); } } Boolean collate; if (PMGetCollate(m_macPrintSettings, &collate) == noErr) data.SetCollate(collate); CFStringRef name; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession, &printer ); if (PMPrinterIsDefault(printer)) data.SetPrinterName(wxEmptyString); else { name = PMPrinterGetName(printer); CFRetain(name); data.SetPrinterName(wxCFStringRef(name).AsString()); } PMDuplexMode mode = 0 ; PMGetDuplex( 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 double height, width; PMPaperGetHeight(m_macPaper, &height); PMPaperGetWidth(m_macPaper, &width); wxSize sz((int)(width * pt2mm + 0.5 ) , (int)(height * 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 ; }
bool wxOSXPrintData::TransferFrom( const wxPrintData &data ) { PMPrinter printer; PMSessionGetCurrentPrinter(m_macPrintSession, &printer); wxSize papersize = wxDefaultSize; const wxPaperSize paperId = data.GetPaperId(); if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase ) { papersize = wxThePrintPaperDatabase->GetSize(paperId); if ( papersize != wxDefaultSize ) { papersize.x /= 10; papersize.y /= 10; } } else { papersize = data.GetPaperSize(); } if ( papersize != wxDefaultSize ) { papersize.x = (wxInt32) (papersize.x * mm2pt); papersize.y = (wxInt32) (papersize.y * mm2pt); double height, width; PMPaperGetHeight(m_macPaper, &height); PMPaperGetWidth(m_macPaper, &width); if ( fabs( width - papersize.x ) >= 5 || fabs( height - papersize.y ) >= 5 ) { // we have to change the current paper CFArrayRef paperlist = 0 ; if ( PMPrinterGetPaperList( printer, &paperlist ) == noErr ) { PMPaper bestPaper = kPMNoData ; CFIndex top = CFArrayGetCount(paperlist); for ( CFIndex i = 0 ; i < top ; ++ i ) { PMPaper paper = (PMPaper) CFArrayGetValueAtIndex( paperlist, i ); PMPaperGetHeight(paper, &height); PMPaperGetWidth(paper, &width); if ( fabs( width - papersize.x ) < 5 && fabs( height - papersize.y ) < 5 ) { // TODO test for duplicate hits and use additional // criteria for best match bestPaper = paper; } } PMPaper paper = kPMNoData; if ( bestPaper == kPMNoData ) { const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 }; wxString id, name(_T("Custom paper")); id.Printf(_T("wxPaperCustom%dx%d"), papersize.x, papersize.y); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if ( PMPaperCreateCustom != NULL) { PMPaperCreateCustom(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), papersize.x, papersize.y, &margins, &paper); } #endif #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 if ( paper == kPMNoData ) { PMPaperCreate(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), papersize.x, papersize.y, &margins, &paper); } #endif } if ( bestPaper != kPMNoData ) { PMPageFormat pageFormat; PMCreatePageFormatWithPMPaper(&pageFormat, bestPaper); PMCopyPageFormat( pageFormat, m_macPageFormat ); PMRelease(pageFormat); PMGetPageFormatPaper(m_macPageFormat, &m_macPaper); } PMRelease(paper); } } } CFArrayRef printerList; CFIndex index, count; CFStringRef name; if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr) { count = CFArrayGetCount(printerList); for (index = 0; index < count; index++) { printer = (PMPrinter)CFArrayGetValueAtIndex(printerList, index); if ((data.GetPrinterName().empty()) && (PMPrinterIsDefault(printer))) break; else { name = PMPrinterGetName(printer); CFRetain(name); if (data.GetPrinterName() == wxCFStringRef(name).AsString()) break; } } if (index < count) PMSessionSetCurrentPMPrinter(m_macPrintSession, printer); CFRelease(printerList); } PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ; PMSetCollate(m_macPrintSettings, data.GetCollate()); if ( data.IsOrientationReversed() ) PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMReverseLandscape : kPMReversePortrait , false ) ; else PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; 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( m_macPrintSettings, mode ) ; // PMQualityMode not yet accessible via API if ( data.IsOrientationReversed() ) PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMReverseLandscape : kPMReversePortrait , false ) ; else PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; #ifndef __LP64__ // PMQualityMode not accessible via API // TODO: use our quality property to determine optimal resolution PMResolution res; PMTag tag = kPMMaxSquareResolution; PMPrinterGetPrinterResolution(printer, tag, &res); PMSetResolution( m_macPageFormat, &res); #endif // after setting the new resolution the format has to be updated, otherwise the page rect remains // at the 'old' scaling PMSessionValidatePageFormat(m_macPrintSession, m_macPageFormat, kPMDontWantBoolean); PMSessionValidatePrintSettings(m_macPrintSession, m_macPrintSettings, kPMDontWantBoolean); #if wxOSX_USE_COCOA UpdateFromPMState(); #endif return true ; }
bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) { ValidateOrCreate() ; PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , 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() ) ) ; #endif #ifndef __LP64__ PMColorMode color ; PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; if ( data.GetColour() ) { if ( color == kPMBlackAndWhite ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; } else PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ; #endif #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( &PMSetDuplex!=NULL ) { 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 ) ; } #endif // 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 PMPrinterGetOutputResolution( printer, (PMPrintSettings) m_macPrintSettings, &res) ; // TODO transfer ? into page format ? #else PMTag tag = kPMMaxSquareResolution; PMPrinterGetPrinterResolution(printer, tag, &res); PMSetResolution((PMPageFormat) m_macPageFormat, &res); #endif // after setting the new resolution the format has to be updated, otherwise the page rect remains // at the 'old' scaling PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession, (PMPageFormat) m_macPageFormat, kPMDontWantBoolean) ; return true ; }
bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) { OSStatus err = noErr ; UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) data.SetNoCopies( copies ) ; PMOrientation orientation ; err = PMGetOrientation( m_macPageFormat , &orientation ) ; 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 ; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession , &printer ) ; m_printerName = name.AsString() ; } #endif #ifndef __LP64__ PMColorMode color ; err = PMGetColorMode( m_macPrintSettings, &color ) ; if ( err == noErr ) data.SetColour( !(color == kPMBlackAndWhite) ) ; #endif #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( &PMGetDuplex!=NULL ) { 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 ; } } #endif // PMQualityMode not yet accessible via API PMPaper paper ; PMGetPageFormatPaper( m_macPageFormat, &paper ); PMRect rPaper; 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); wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); if (id != wxPAPER_NONE) { data.SetPaperId(id); } } return true ; }
bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) { sm_abortIt = false; sm_abortWindow = NULL; if (!printout) return false; printout->SetIsPreview(false); if (m_printDialogData.GetMinPage() < 1) m_printDialogData.SetMinPage(1); if (m_printDialogData.GetMaxPage() < 1) m_printDialogData.SetMaxPage(9999); // Create a suitable device context wxPrinterDC *dc = NULL; if (prompt) { wxMacPrintDialog dialog(parent, & m_printDialogData); if (dialog.ShowModal() == wxID_OK) { dc = wxDynamicCast(dialog.GetPrintDC(), wxPrinterDC); wxASSERT(dc); m_printDialogData = dialog.GetPrintDialogData(); } } else { dc = new wxPrinterDC( m_printDialogData.GetPrintData() ) ; } // May have pressed cancel. if (!dc || !dc->Ok()) { if (dc) delete dc; return false; } // on the mac we have always pixels as addressing mode with 72 dpi printout->SetPPIScreen(72, 72); PMResolution res; wxMacCarbonPrintData* nativeData = (wxMacCarbonPrintData*) (m_printDialogData.GetPrintData().GetNativeData()); #if 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) ; #else PMGetResolution((PMPageFormat) (nativeData->m_macPageFormat), &res); #endif printout->SetPPIPrinter(int(res.hRes), int(res.vRes)); // Set printout parameters printout->SetDC(dc); int w, h; dc->GetSize(&w, &h); printout->SetPageSizePixels((int)w, (int)h); printout->SetPaperRectPixels(dc->GetPaperRect()); wxCoord mw, mh; dc->GetSizeMM(&mw, &mh); printout->SetPageSizeMM((int)mw, (int)mh); // Create an abort window wxBeginBusyCursor(); printout->OnPreparePrinting(); // Get some parameters from the printout, if defined int fromPage, toPage; int minPage, maxPage; printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); if (maxPage == 0) { wxEndBusyCursor(); return false; } // Only set min and max, because from and to have been // set by the user m_printDialogData.SetMinPage(minPage); m_printDialogData.SetMaxPage(maxPage); wxWindow *win = CreateAbortWindow(parent, printout); wxSafeYield(win,true); if (!win) { wxEndBusyCursor(); wxMessageBox(wxT("Sorry, could not create an abort dialog."), wxT("Print Error"), wxOK, parent); delete dc; return false; } sm_abortWindow = win; sm_abortWindow->Show(true); wxSafeYield(win,true); printout->OnBeginPrinting(); bool keepGoing = true; int copyCount; for (copyCount = 1; copyCount <= m_printDialogData.GetNoCopies(); copyCount ++) { if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) { wxEndBusyCursor(); wxMessageBox(wxT("Could not start printing."), wxT("Print Error"), wxOK, parent); break; } if (sm_abortIt) break; int pn; for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); pn++) { if (sm_abortIt) { keepGoing = false; break; } 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 } dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); } } printout->OnEndDocument(); } printout->OnEndPrinting(); if (sm_abortWindow) { sm_abortWindow->Show(false); delete sm_abortWindow; sm_abortWindow = NULL; } wxEndBusyCursor(); delete dc; return true; }