Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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;
    }
}