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; }
void QPpdPrintDevice::loadPageSizes() const { m_pageSizes.clear(); m_printableMargins.clear(); ppd_option_t *pageSizes = ppdFindOption(m_ppd, "PageSize"); if (pageSizes) { for (int i = 0; i < pageSizes->num_choices; ++i) { const ppd_size_t *ppdSize = ppdPageSize(m_ppd, pageSizes->choices[i].choice); if (ppdSize) { // Returned size is in points QString key = QString::fromUtf8(ppdSize->name); QSize size = QSize(qRound(ppdSize->width), qRound(ppdSize->length)); QString name = QString::fromUtf8(pageSizes->choices[i].text); if (!size.isEmpty()) { QPageSize ps = createPageSize(key, size, name); if (ps.isValid()) { m_pageSizes.append(ps); m_printableMargins.insert(key, QMarginsF(ppdSize->left, ppdSize->length - ppdSize->top, ppdSize->width - ppdSize->right, ppdSize->bottom)); } } } } m_havePageSizes = true; } }
QPageSize QPpdPrintDevice::defaultPageSize() const { ppd_choice_t *defaultChoice = ppdFindMarkedChoice(m_ppd, "PageSize"); if (defaultChoice) { ppd_size_t *ppdSize = ppdPageSize(m_ppd, defaultChoice->choice); if (ppdSize) { // Returned size is in points QString key = QString::fromUtf8(ppdSize->name); QSize size = QSize(qRound(ppdSize->width), qRound(ppdSize->length)); QString name = QString::fromUtf8(defaultChoice->text); return createPageSize(key, size, name); } } return QPageSize(); }