bool QMacPrintEnginePrivate::newPage_helper() { Q_Q(QMacPrintEngine); Q_ASSERT(state == QPrinter::Active); if (PMSessionError(session) != noErr) { q->abort(); return false; } OSStatus status = shouldSuppressStatus() ? PMSessionBeginPageNoDialog(session, format, 0) : PMSessionBeginPage(session, format, 0); if(status != noErr) { state = QPrinter::Error; return false; } QRect page = q->property(QPrintEngine::PPK_PageRect).toRect(); QRect paper = q->property(QPrintEngine::PPK_PaperRect).toRect(); CGContextRef cgContext; OSStatus err = noErr; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) { err = PMSessionGetCGGraphicsContext(session, &cgContext); } else #endif { #ifndef Q_OS_MAC64 err = PMSessionGetGraphicsContext(session, kPMGraphicsContextCoreGraphics, reinterpret_cast<void **>(&cgContext)); #endif } if(err != noErr) { qWarning("QMacPrintEngine::newPage: Cannot retrieve CoreGraphics context: %ld", long(err)); state = QPrinter::Error; return false; } QCoreGraphicsPaintEngine *cgEngine = static_cast<QCoreGraphicsPaintEngine*>(paintEngine); cgEngine->d_func()->hd = cgContext; // Set the resolution as a scaling ration of 72 (the default). CGContextScaleCTM(cgContext, 72 / resolution.hRes, 72 / resolution.vRes); CGContextScaleCTM(cgContext, 1, -1); CGContextTranslateCTM(cgContext, 0, -paper.height()); if (!fullPage) CGContextTranslateCTM(cgContext, page.x() - paper.x(), page.y() - paper.y()); cgEngine->d_func()->orig_xform = CGContextGetCTM(cgContext); cgEngine->d_func()->setClip(0); cgEngine->state->dirtyFlags = QPaintEngine::AllDirty; cgEngine->syncState(); return true; }
void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc ) { if ( m_err ) return ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; m_err = PMSessionBeginPageNoDialog(native->GetPrintSession(), native->GetPageFormat(), NULL); CGContextRef pageContext; if ( m_err == noErr ) { m_err = PMSessionGetCGGraphicsContext(native->GetPrintSession(), &pageContext ); } if ( m_err != noErr ) { PMSessionEndPageNoDialog(native->GetPrintSession()); PMSessionEndDocumentNoDialog(native->GetPrintSession()); } else { 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 ) CGContextTranslateCTM( pageContext , (CGFloat) -paperRect.left , (CGFloat) paperRect.bottom ) ; // 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 ) ); } }