From 47f69a82ac643621f53c7064b7a385d807a58622 Mon Sep 17 00:00:00 2001 From: Claudio Valerio Date: Fri, 12 Aug 2011 09:07:17 +0200 Subject: [PATCH] fixed pdf bug. When loading a already imported pdf the application crashes. --- src/pdf/XPDFRenderer.cpp | 122 +++++++++------------------------------ 1 file changed, 28 insertions(+), 94 deletions(-) diff --git a/src/pdf/XPDFRenderer.cpp b/src/pdf/XPDFRenderer.cpp index 9382f300..30717935 100644 --- a/src/pdf/XPDFRenderer.cpp +++ b/src/pdf/XPDFRenderer.cpp @@ -19,6 +19,13 @@ #include +#include +#include +#include +#include +#include + + #include "core/memcheck.h" QAtomicInt XPDFRenderer::sInstancesCount = 0; @@ -37,13 +44,7 @@ XPDFRenderer::XPDFRenderer(const QString &filename) mDocument = new PDFDoc(new GString(filename.toUtf8().data()), 0, 0, 0); // the filename GString is deleted on PDFDoc desctruction sInstancesCount.ref(); - bThumbGenerated = false; - bPagesGenerated = false; - mPagesMap.clear(); - mThumbs.clear(); - mThumbMap.clear(); - mScaleX = 0.0; - mScaleY = 0.0; + } XPDFRenderer::~XPDFRenderer() @@ -134,114 +135,47 @@ int XPDFRenderer::pageRotation(int pageNumber) const return 0; } -void XPDFRenderer::render(QPainter *p, int pageNumber, const QRectF &bounds) -{ - if (isValid()) - { - qreal xscale = p->worldTransform().m11(); - qreal yscale = p->worldTransform().m22(); - bool bZoomChanged = false; - bool bFirstThumbnail = false; - - if(fabs(mScaleX - xscale) > 0.1 || fabs(mScaleY - yscale) > 0.1) - { - mScaleX = xscale; - mScaleY = yscale; - bZoomChanged = true; - } - - // First verify if the thumbnails and the pages are generated - if(!bThumbGenerated) - { - if(pageNumber == 1) - { - bFirstThumbnail = true; - } - - if(!mThumbMap[pageNumber - 1]) - { - - // Generate the thumbnail - mThumbs << *createPDFImage(pageNumber, xscale, yscale, bounds); - mThumbMap[pageNumber - 1] = true; - if(pageNumber == mDocument->getNumPages()) - { - bThumbGenerated = true; - } - } - } - else if(!bPagesGenerated || bZoomChanged) - { - if(!mPagesMap[pageNumber - 1] || bZoomChanged) - { - // Generate the page - mNumPageToPageMap[pageNumber] = *createPDFImage(pageNumber, xscale, yscale, bounds); - mPagesMap[pageNumber - 1] = true; - if(mPagesMap.size() == mDocument->getNumPages()) - { - bPagesGenerated = true; - } - } - } - - QImage pdfImage; - if(!bThumbGenerated || bFirstThumbnail) - { - pdfImage = mThumbs.at(pageNumber - 1); - } - else - { - pdfImage = mNumPageToPageMap[pageNumber]; - } - - QTransform savedTransform = p->worldTransform(); - p->resetTransform(); - QTime t; - t.start(); - p->drawImage(QPointF(savedTransform.dx() + mSliceX, savedTransform.dy() + mSliceY), pdfImage); - //qDebug() << "XPDFRenderer::render(...) execution time: " << t.elapsed() << "ms"; - p->setWorldTransform(savedTransform); - } -} - -QImage* XPDFRenderer::createPDFImage(int pageNumber, const qreal xscale, const qreal yscale, const QRectF &bounds) +void XPDFRenderer::render(QPainter *p, int pageNumber, const QRectF &bounds) { - QImage* img = new QImage(); if (isValid()) { SplashColor paperColor = {0xFF, 0xFF, 0xFF}; // white - mSplash = new SplashOutputDev(splashModeRGB8, 1, gFalse, paperColor); - mSplash->startDoc(mDocument->getXRef()); + SplashOutputDev splash(splashModeRGB8, 1, gFalse, paperColor); + splash.startDoc(mDocument->getXRef()); int hResolution = 72; int vResolution = 72; int rotation = 0; // in degrees (get it from the worldTransform if we want to support rotation) GBool useMediaBox = gFalse; GBool crop = gTrue; GBool printing = gFalse; - const qreal xScale = xscale; - const qreal yScale = yscale; - mSliceX = 0.; - mSliceY = 0.; + const qreal xScale = p->worldTransform().m11(); + const qreal yScale = p->worldTransform().m22(); + qreal sliceX = 0.; + qreal sliceY = 0.; if (bounds.isNull()) { - mDocument->displayPage(mSplash, pageNumber, hResolution * xScale, vResolution * yScale, + mDocument->displayPage(&splash, pageNumber, hResolution * xScale, vResolution * yScale, rotation, useMediaBox, crop, printing); } else { - mSliceX = bounds.x() * xScale; - mSliceY = bounds.y() * yScale; + sliceX = bounds.x() * xScale; + sliceY = bounds.y() * yScale; qreal sliceW = bounds.width() * xScale; qreal sliceH = bounds.height() * yScale; - mDocument->displayPageSlice(mSplash, pageNumber, hResolution * xScale, vResolution * yScale, - rotation, useMediaBox, crop, printing, mSliceX, mSliceY, sliceW, sliceH); + mDocument->displayPageSlice(&splash, pageNumber, hResolution * xScale, vResolution * yScale, + rotation, useMediaBox, crop, printing, sliceX, sliceY, sliceW, sliceH); } - mpSplashBitmap = mSplash->getBitmap(); - img = new QImage(mpSplashBitmap->getDataPtr(), mpSplashBitmap->getWidth(), mpSplashBitmap->getHeight(), mpSplashBitmap->getWidth() * 3, QImage::Format_RGB888); + SplashBitmap *bitmap = splash.getBitmap(); + QImage pdfImage(bitmap->getDataPtr(), bitmap->getWidth(), bitmap->getHeight(), bitmap->getWidth() * 3, QImage::Format_RGB888); + + QTransform savedTransform = p->worldTransform(); + p->resetTransform(); + p->drawImage(QPointF(savedTransform.dx() + sliceX, savedTransform.dy() + sliceY), pdfImage); + p->setWorldTransform(savedTransform); } - return img; -} +} \ No newline at end of file