// Copyright (C) 2019 Jakub Melka // // This file is part of PdfForQt. // // PdfForQt is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // PdfForQt is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with PDFForQt. If not, see . #include "pdfrenderer.h" #include "pdfpainter.h" #include "pdfdocument.h" namespace pdf { PDFRenderer::PDFRenderer(const PDFDocument* document, const PDFFontCache* fontCache, const PDFOptionalContentActivity* optionalContentActivity, Features features) : m_document(document), m_fontCache(fontCache), m_optionalContentActivity(optionalContentActivity), m_features(features) { Q_ASSERT(document); } // TODO: Clipovani na stranku QList PDFRenderer::render(QPainter* painter, const QRectF& rectangle, size_t pageIndex) const { Q_UNUSED(painter); Q_UNUSED(rectangle); const PDFCatalog* catalog = m_document->getCatalog(); if (pageIndex >= catalog->getPageCount() || !catalog->getPage(pageIndex)) { // Invalid page index return { PDFRenderError(RenderErrorType::Error, PDFTranslationContext::tr("Page %1 doesn't exist.").arg(pageIndex + 1)) }; } const PDFPage* page = catalog->getPage(pageIndex); Q_ASSERT(page); QRectF mediaBox = page->getRotatedMediaBox(); QMatrix matrix; switch (page->getPageRotation()) { case PageRotation::None: { matrix.translate(rectangle.left(), rectangle.bottom()); matrix.scale(rectangle.width() / mediaBox.width(), -rectangle.height() / mediaBox.height()); break; } case PageRotation::Rotate90: { matrix.translate(rectangle.left(), rectangle.top()); matrix.rotate(90); matrix.scale(rectangle.width() / mediaBox.width(), -rectangle.height() / mediaBox.height()); break; } case PageRotation::Rotate270: { matrix.translate(rectangle.right(), rectangle.top()); matrix.rotate(-90); matrix.scale(rectangle.width() / mediaBox.width(), -rectangle.height() / mediaBox.height()); break; } case PageRotation::Rotate180: { matrix.translate(rectangle.left(), rectangle.top()); matrix.scale(rectangle.width() / mediaBox.width(), rectangle.height() / mediaBox.height()); break; } default: { Q_ASSERT(false); break; } } PDFPainter processor(painter, m_features, matrix, page, m_document, m_fontCache, m_optionalContentActivity); return processor.processContents(); } QList PDFRenderer::render(QPainter* painter, const QMatrix& matrix, size_t pageIndex) const { Q_UNUSED(painter); const PDFCatalog* catalog = m_document->getCatalog(); if (pageIndex >= catalog->getPageCount() || !catalog->getPage(pageIndex)) { // Invalid page index return { PDFRenderError(RenderErrorType::Error, PDFTranslationContext::tr("Page %1 doesn't exist.").arg(pageIndex + 1)) }; } const PDFPage* page = catalog->getPage(pageIndex); Q_ASSERT(page); PDFPainter processor(painter, m_features, matrix, page, m_document, m_fontCache, m_optionalContentActivity); return processor.processContents(); } } // namespace pdf