bool QMacPrintEngine::begin(QPaintDevice *dev) { Q_D(QMacPrintEngine); if (d->state == QPrinter::Idle && d->session == 0) // Need to reinitialize d->initialize(); d->paintEngine->state = state; d->paintEngine->begin(dev); Q_ASSERT_X(d->state == QPrinter::Idle, "QMacPrintEngine", "printer already active"); if (PMSessionValidatePrintSettings(d->session, d->settings, kPMDontWantBoolean) != noErr || PMSessionValidatePageFormat(d->session, d->format, kPMDontWantBoolean) != noErr) { d->state = QPrinter::Error; return false; } if (!d->outputFilename.isEmpty()) { QCFType<CFURLRef> outFile = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, QCFString(d->outputFilename), kCFURLPOSIXPathStyle, false); if (PMSessionSetDestination(d->session, d->settings, kPMDestinationFile, kPMDocumentFormatPDF, outFile) != noErr) { qWarning("QMacPrintEngine::begin: Problem setting file [%s]", d->outputFilename.toUtf8().constData()); return false; } } OSStatus status = noErr; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) { status = d->shouldSuppressStatus() ? PMSessionBeginCGDocumentNoDialog(d->session, d->settings, d->format) : PMSessionBeginCGDocument(d->session, d->settings, d->format); } else #endif { #ifndef Q_OS_MAC64 status = d->shouldSuppressStatus() ? PMSessionBeginDocumentNoDialog(d->session, d->settings, d->format) : PMSessionBeginDocument(d->session, d->settings, d->format); #endif } if (status != noErr) { d->state = QPrinter::Error; return false; } d->state = QPrinter::Active; setActive(true); d->newPage_helper(); 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 ; }
//----------------------------------------------------------------------------------------------------------------------- static OSStatus DoPrintLoop(DocStoragePtr docStP, PMPrintSession printSession, PMPageFormat pageFormat, PMPrintSettings printSettings) { OSStatus status = noErr, tempErr; CGContextRef printingCtx; UInt32 realNumberOfPagesinDoc, pageNumber, firstPage, lastPage; CFStringRef jobName; // use window title status = CopyWindowTitleAsCFString(docStP->ownerWindow, &jobName); status = PMPrintSettingsSetJobName(printSettings, jobName); CFRelease (jobName); // Get the user's Print dialog selection for first and last pages to print. if (status == noErr) { status = PMGetFirstPage(printSettings, &firstPage); if (status == noErr) status = PMGetLastPage(printSettings, &lastPage); } // Check that the selected page range does not exceed the actual number of pages in the document. if (status == noErr) { status = DetermineNumberOfPagesInDoc(pageFormat, &realNumberOfPagesinDoc); if (realNumberOfPagesinDoc < lastPage) lastPage = realNumberOfPagesinDoc; } // Before executing the print loop, tell the Carbon Printing Manager which pages // will be spooled so that the progress dialog can reflect an accurate page count. if (status == noErr) status = PMSetFirstPage(printSettings, firstPage, false); if (status == noErr) status = PMSetLastPage(printSettings, lastPage, false); // Note, we don't have to worry about the number of copies. The printing // manager handles this. So we just iterate through the document from the // first page to be printed, to the last. if (status == noErr) { // Now, tell the printing system that we promise never to use any Quickdraw calls: status = PMSessionBeginCGDocument(printSession, printSettings, pageFormat); check(status == noErr); if (status == noErr) { pageNumber = firstPage; // Note that we check PMSessionError immediately before beginning a new page. // This handles user cancelling appropriately. Also, if we got an error on // any previous iteration of the print loop, we break out of the loop. while ( (pageNumber <= lastPage) && (status == noErr) && (PMSessionError(printSession) == noErr) ) { status = PMSessionBeginPage(printSession, pageFormat, NULL); check(status == noErr); if (status == noErr) { status = PMSessionGetCGGraphicsContext(printSession, &printingCtx); check(status == noErr); if (status == noErr) { DrawThePage(printingCtx, docStP); } tempErr = PMSessionEndPage(printSession); if(status == noErr) status = tempErr; } pageNumber++; } // end while loop // Close the print job. This dismisses the progress dialog on Mac OS X. tempErr = PMSessionEndDocument(printSession); if (status == noErr) status = tempErr; } } // Only report a printing error once we have completed the print loop. This ensures // that every PMBeginXXX call that returns no error is followed by a matching PMEndXXX // call, so the Printing Manager can release all temporary memory and close properly. tempErr = PMSessionError(printSession); if(status == noErr) status = tempErr; /* if ((status != noErr) && (status != kPMCancel)) PostPrintingErrors(status); */ return status; } // DoPrintLoop