static PMResolution *GetSupportedResolutions(PMPrinter printer, UInt32 *count) { PMResolution res, *resolutions = NULL; OSStatus status = PMPrinterGetPrinterResolutionCount(printer, count); if (status == kPMNotImplemented) { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 resolutions = (PMResolution *)malloc(sizeof(PMResolution) * 4); *count = 0; if (PMPrinterGetPrinterResolution(printer, kPMMinRange, &res) == noErr) resolutions[(*count)++] = res; if (PMPrinterGetPrinterResolution(printer, kPMMinSquareResolution, &res) == noErr) resolutions[(*count)++] = res; if (PMPrinterGetPrinterResolution(printer, kPMMaxSquareResolution, &res) == noErr) resolutions[(*count)++] = res; if (PMPrinterGetPrinterResolution(printer, kPMMaxRange, &res) == noErr) resolutions[(*count)++] = res; if (*count == 0) { if (PMPrinterGetPrinterResolution(printer, kPMDefaultResolution, &res) == noErr) resolutions[(*count)++] = res; } #endif } else if (status == noErr) { resolutions = (PMResolution *)malloc(sizeof(PMResolution) * (*count)); UInt32 realCount = 0; for (UInt32 i = 0; i < *count; i++) { if (PMPrinterGetIndexedPrinterResolution(printer, i + 1, &res) == noErr) resolutions[realCount++] = res; } qsort(resolutions, realCount, sizeof(PMResolution), ResolutionSorter); *count = realCount; } if ((*count == 0) && (resolutions)) { free(resolutions); resolutions = NULL; } return 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; }
static PMResolution *GetSupportedResolutions(PMPrinter printer, UInt32 *count) { PMResolution res, *resolutions = NULL; OSStatus status = PMPrinterGetPrinterResolutionCount(printer, count); if (status == noErr) { resolutions = (PMResolution *)malloc(sizeof(PMResolution) * (*count)); UInt32 realCount = 0; for (UInt32 i = 0; i < *count; i++) { if (PMPrinterGetIndexedPrinterResolution(printer, i + 1, &res) == noErr) resolutions[realCount++] = res; } qsort(resolutions, realCount, sizeof(PMResolution), ResolutionSorter); *count = realCount; } if ((*count == 0) && (resolutions)) { free(resolutions); resolutions = NULL; } return resolutions; }
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); }
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; } }