Q_GUI_EXPORT QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits) { // If the margins have the same units, or are all 0, then don't need to convert if (fromUnits == toUnits || margins.isNull()) return margins; // If converting to points then convert and round to 0 decimal places if (toUnits == QPageLayout::Point) { const qreal multiplier = qt_pointMultiplier(fromUnits); return QMarginsF(qRound(margins.left() * multiplier), qRound(margins.top() * multiplier), qRound(margins.right() * multiplier), qRound(margins.bottom() * multiplier)); } // If converting to other units, need to convert to unrounded points first QMarginsF pointMargins = fromUnits == QPageLayout::Point ? margins : margins * qt_pointMultiplier(fromUnits); // Then convert from points to required units rounded to 2 decimal places const qreal multiplier = qt_pointMultiplier(toUnits); return QMarginsF(qRound(pointMargins.left() * 100 / multiplier) / 100.0, qRound(pointMargins.top() * 100 / multiplier) / 100.0, qRound(pointMargins.right() * 100 / multiplier) / 100.0, qRound(pointMargins.bottom() * 100 / multiplier) / 100.0); }
QWindowsPrintDevice::QWindowsPrintDevice(const QString &id) : QPlatformPrintDevice(id), m_hPrinter(0) { // First do a fast lookup to see if printer exists, if it does then open it if (!id.isEmpty() && QWindowsPrintDevice::availablePrintDeviceIds().contains(id)) { if (OpenPrinter((LPWSTR)m_id.utf16(), &m_hPrinter, NULL)) { DWORD needed = 0; GetPrinter(m_hPrinter, 2, 0, 0, &needed); QScopedArrayPointer<BYTE> buffer(new BYTE[needed]); if (GetPrinter(m_hPrinter, 2, buffer.data(), needed, &needed)) { PPRINTER_INFO_2 info = reinterpret_cast<PPRINTER_INFO_2>(buffer.data()); m_name = QString::fromWCharArray(info->pPrinterName); m_location = QString::fromWCharArray(info->pLocation); m_makeAndModel = QString::fromWCharArray(info->pDriverName); // TODO Check is not available elsewhere m_isRemote = info->Attributes & PRINTER_ATTRIBUTE_NETWORK; } m_supportsMultipleCopies = (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_COPIES, NULL, NULL) > 1); m_supportsCollateCopies = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_COLLATE, NULL, NULL); // Min/Max custom size is in tenths of a millimeter const qreal multiplier = qt_pointMultiplier(QPageLayout::Millimeter); DWORD min = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_MINEXTENT, NULL, NULL); m_minimumPhysicalPageSize = QSize((LOWORD(min) / 10.0) * multiplier, (HIWORD(min) / 10.0) * multiplier); DWORD max = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_MAXEXTENT, NULL, NULL); m_maximumPhysicalPageSize = QSize((LOWORD(max) / 10.0) * multiplier, (HIWORD(max) / 10.0) * multiplier); m_supportsCustomPageSizes = (m_maximumPhysicalPageSize.width() > 0 && m_maximumPhysicalPageSize.height() > 0); } } }
void QWindowsPrintDevice::loadPageSizes() const { // Get the number of paper sizes and check all 3 attributes have same count DWORD paperCount = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERNAMES, NULL, NULL); if (int(paperCount) > 0 && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERSIZE, NULL, NULL) == paperCount && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERS, NULL, NULL) == paperCount) { QScopedArrayPointer<wchar_t> paperNames(new wchar_t[paperCount*64]); QScopedArrayPointer<POINT> winSizes(new POINT[paperCount*sizeof(POINT)]); QScopedArrayPointer<wchar_t> papers(new wchar_t[paperCount]); // Get the details and match the default paper size if (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERNAMES, paperNames.data(), NULL) == paperCount && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERSIZE, (wchar_t *)winSizes.data(), NULL) == paperCount && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERS, papers.data(), NULL) == paperCount) { // Returned size is in tenths of a millimeter const qreal multiplier = qt_pointMultiplier(QPageLayout::Millimeter); for (int i = 0; i < int(paperCount); ++i) { QSize size = QSize(qRound((winSizes[i].x / 10.0) * multiplier), qRound((winSizes[i].y / 10.0) * multiplier)); wchar_t *paper = paperNames.data() + (i * 64); QString name = QString::fromWCharArray(paper, qwcsnlen(paper, 64)); m_pageSizes.append(createPageSize(papers[i], size, name)); } } } m_havePageSizes = true; }
static QSizeF qt_convertPointsToUnits(const QSize &size, QPageSize::Unit units) { if (!size.isValid()) return QSizeF(); const qreal multiplier = qt_pointMultiplier(units); // Try force to 2 decimal places for consistency const int width = qRound(size.width() * 100 / multiplier); const int height = qRound(size.height() * 100 / multiplier); return QSizeF(width / 100.0, height / 100.0); }
QPointF qt_convertPoint(const QPointF &xy, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits) { // If the size have the same units, or are all 0, then don't need to convert if (fromUnits == toUnits || xy.isNull()) return xy; // If converting to points then convert and round to 0 decimal places if (toUnits == QPageLayout::Point) { const qreal multiplier = qt_pointMultiplier(fromUnits); return QPointF(qRound(xy.x() * multiplier), qRound(xy.y() * multiplier)); } // If converting to other units, need to convert to unrounded points first QPointF pointXy = (fromUnits == QPageLayout::Point) ? xy : xy * qt_pointMultiplier(fromUnits); // Then convert from points to required units rounded to 2 decimal places const qreal multiplier = qt_pointMultiplier(toUnits); return QPointF(qRound(pointXy.x() * 100 / multiplier) / 100.0, qRound(pointXy.y() * 100 / multiplier) / 100.0); }
static QSizeF qt_convertUnits(const QSizeF &size, QPageSize::Unit fromUnits, QPageSize::Unit toUnits) { if (!size.isValid()) return QSizeF(); // If the units are the same or the size is 0, then don't need to convert if (fromUnits == toUnits || (qFuzzyIsNull(size.width()) && qFuzzyIsNull(size.height()))) return size; QSizeF newSize = size; // First convert to points if (fromUnits != QPageSize::Point) { const qreal multiplier = qt_pointMultiplier(fromUnits); newSize = newSize * multiplier; } // Then convert from points to required units const qreal multiplier = qt_pointMultiplier(toUnits); // Try force to 2 decimal places for consistency const int width = qRound(newSize.width() * 100 / multiplier); const int height = qRound(newSize.height() * 100 / multiplier); return QSizeF(width / 100.0, height / 100.0); }
static QSize qt_convertUnitsToPoints(const QSizeF &size, QPageSize::Unit units) { if (!size.isValid()) return QSize(); return QSizeF(size * qt_pointMultiplier(units)).toSize(); }