From 7138cb9c000831244b463ec0de237e7ef9203a76 Mon Sep 17 00:00:00 2001 From: shibakaneki Date: Fri, 24 Jun 2011 14:59:44 +0200 Subject: [PATCH 1/3] Resolved bad performance when drawing on top of a PDF --- src/domain/UBGraphicsScene.cpp | 1 + src/pdf/XPDFRenderer.cpp | 103 ++++++++++++++++++++++++--------- src/pdf/XPDFRenderer.h | 20 ++++++- 3 files changed, 96 insertions(+), 28 deletions(-) diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 31bd2934..318b0449 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "frameworks/UBGeometryUtils.h" #include "frameworks/UBPlatformUtils.h" diff --git a/src/pdf/XPDFRenderer.cpp b/src/pdf/XPDFRenderer.cpp index 893a8d0d..e95acacb 100644 --- a/src/pdf/XPDFRenderer.cpp +++ b/src/pdf/XPDFRenderer.cpp @@ -5,12 +5,6 @@ #include -#include -#include -#include -#include -#include - QAtomicInt XPDFRenderer::sInstancesCount = 0; XPDFRenderer::XPDFRenderer(const QString &filename) @@ -27,7 +21,11 @@ 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(); } XPDFRenderer::~XPDFRenderer() @@ -118,47 +116,100 @@ int XPDFRenderer::pageRotation(int pageNumber) const return 0; } - void XPDFRenderer::render(QPainter *p, int pageNumber, const QRectF &bounds) { + if (isValid()) + { + // First verify if the thumbnails and the pages are generated + if(!bThumbGenerated) + { + qreal xscale = p->worldTransform().m11(); + qreal yscale = p->worldTransform().m22(); + 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) + { + qreal xscale = p->worldTransform().m11(); + qreal yscale = p->worldTransform().m22(); + if(!mPagesMap[pageNumber - 1]) + { + // Generate the page + mNumPageToPageMap[pageNumber] = *createPDFImage(pageNumber, xscale, yscale, bounds); + mPagesMap[pageNumber - 1] = true; + if(mPagesMap.size() == mDocument->getNumPages()) + { + bPagesGenerated = true; + } + } + } + + // Warning: verify pagenumber + QImage pdfImage; + + if(!bThumbGenerated) + { + pdfImage = mThumbs.at(pageNumber - 1); + } + else + { + pdfImage = mNumPageToPageMap[pageNumber]; + } + + pdfImage.rect(); + + QTransform savedTransform = p->worldTransform(); + p->resetTransform(); + p->drawImage(QPointF(savedTransform.dx() + mSliceX, savedTransform.dy() + mSliceY), pdfImage); + p->setWorldTransform(savedTransform); + } +} + +QImage* XPDFRenderer::createPDFImage(int pageNumber, const qreal xscale, const qreal yscale, const QRectF &bounds) +{ + QImage* img = new QImage(); if (isValid()) { SplashColor paperColor = {0xFF, 0xFF, 0xFF}; // white - SplashOutputDev splash(splashModeRGB8, 1, gFalse, paperColor); - splash.startDoc(mDocument->getXRef()); + mSplash = new SplashOutputDev(splashModeRGB8, 1, gFalse, paperColor); + mSplash->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 = p->worldTransform().m11(); - const qreal yScale = p->worldTransform().m22(); - qreal sliceX = 0.; - qreal sliceY = 0.; + const qreal xScale = xscale; + const qreal yScale = yscale; + mSliceX = 0.; + mSliceY = 0.; if (bounds.isNull()) { - mDocument->displayPage(&splash, pageNumber, hResolution * xScale, vResolution * yScale, + mDocument->displayPage(mSplash, pageNumber, hResolution * xScale, vResolution * yScale, rotation, useMediaBox, crop, printing); } else { - sliceX = bounds.x() * xScale; - sliceY = bounds.y() * yScale; + mSliceX = bounds.x() * xScale; + mSliceY = bounds.y() * yScale; qreal sliceW = bounds.width() * xScale; qreal sliceH = bounds.height() * yScale; - mDocument->displayPageSlice(&splash, pageNumber, hResolution * xScale, vResolution * yScale, - rotation, useMediaBox, crop, printing, sliceX, sliceY, sliceW, sliceH); + mDocument->displayPageSlice(mSplash, pageNumber, hResolution * xScale, vResolution * yScale, + rotation, useMediaBox, crop, printing, mSliceX, mSliceY, sliceW, sliceH); } - 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); + mpSplashBitmap = mSplash->getBitmap(); + img = new QImage(mpSplashBitmap->getDataPtr(), mpSplashBitmap->getWidth(), mpSplashBitmap->getHeight(), mpSplashBitmap->getWidth() * 3, QImage::Format_RGB888); } + return img; } diff --git a/src/pdf/XPDFRenderer.h b/src/pdf/XPDFRenderer.h index a06d5a04..0782f9fd 100644 --- a/src/pdf/XPDFRenderer.h +++ b/src/pdf/XPDFRenderer.h @@ -1,8 +1,13 @@ #ifndef XPDFRENDERER_H #define XPDFRENDERER_H - +#include #include "PDFRenderer.h" +#include +#include +#include +#include +#include class PDFDoc; @@ -29,10 +34,21 @@ class XPDFRenderer : public PDFRenderer private: void init(); + QImage* createPDFImage(int pageNumber, const qreal xscale = 0.5, const qreal yscale = 0.5, const QRectF &bounds = QRectF()); PDFDoc *mDocument; - + QList mThumbs; + QMap mPagesMap; + QMap mThumbMap; + QMap mNumPageToPageMap; static QAtomicInt sInstancesCount; + qreal mSliceX; + qreal mSliceY; + int bPD; + bool bThumbGenerated; + bool bPagesGenerated; + SplashBitmap* mpSplashBitmap; + SplashOutputDev* mSplash; }; #endif // XPDFRENDERER_H From 7d461a6d71b380e6d09ea4a9ec2fc89aab1a414e Mon Sep 17 00:00:00 2001 From: shibakaneki Date: Mon, 27 Jun 2011 09:06:00 +0200 Subject: [PATCH 2/3] Fixed a zoom factor issue related to the PDF display on the board --- src/pdf/XPDFRenderer.cpp | 22 ++++++++++++++++------ src/pdf/XPDFRenderer.h | 2 ++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/pdf/XPDFRenderer.cpp b/src/pdf/XPDFRenderer.cpp index e90f71ed..86ad687c 100644 --- a/src/pdf/XPDFRenderer.cpp +++ b/src/pdf/XPDFRenderer.cpp @@ -28,6 +28,8 @@ XPDFRenderer::XPDFRenderer(const QString &filename) mPagesMap.clear(); mThumbs.clear(); mThumbMap.clear(); + mScaleX = 0.0; + mScaleY = 0.0; } XPDFRenderer::~XPDFRenderer() @@ -122,11 +124,21 @@ 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; + + if(mScaleX != xscale || mScaleY != yscale) + { + mScaleX = xscale; + mScaleY = yscale; + bZoomChanged = true; + } + // First verify if the thumbnails and the pages are generated if(!bThumbGenerated) { - qreal xscale = p->worldTransform().m11(); - qreal yscale = p->worldTransform().m22(); + if(!mThumbMap[pageNumber - 1]) { // Generate the thumbnail @@ -138,11 +150,9 @@ void XPDFRenderer::render(QPainter *p, int pageNumber, const QRectF &bounds) } } } - else if(!bPagesGenerated) + else if(!bPagesGenerated || bZoomChanged) { - qreal xscale = p->worldTransform().m11(); - qreal yscale = p->worldTransform().m22(); - if(!mPagesMap[pageNumber - 1]) + if(!mPagesMap[pageNumber - 1] || bZoomChanged) { // Generate the page mNumPageToPageMap[pageNumber] = *createPDFImage(pageNumber, xscale, yscale, bounds); diff --git a/src/pdf/XPDFRenderer.h b/src/pdf/XPDFRenderer.h index 0782f9fd..8c10ea49 100644 --- a/src/pdf/XPDFRenderer.h +++ b/src/pdf/XPDFRenderer.h @@ -49,6 +49,8 @@ class XPDFRenderer : public PDFRenderer bool bPagesGenerated; SplashBitmap* mpSplashBitmap; SplashOutputDev* mSplash; + qreal mScaleX; + qreal mScaleY; }; #endif // XPDFRENDERER_H From ed5b1906d0fb824cf04798000499359c77bd8787 Mon Sep 17 00:00:00 2001 From: Claudio Valerio Date: Wed, 29 Jun 2011 15:13:50 +0200 Subject: [PATCH 3/3] fixed sankore issue 160 on windows --- src/board/UBLibraryController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/board/UBLibraryController.cpp b/src/board/UBLibraryController.cpp index adb0108d..ba603e3f 100644 --- a/src/board/UBLibraryController.cpp +++ b/src/board/UBLibraryController.cpp @@ -724,7 +724,7 @@ UBLibElement* UBLibElement::trashElement() if (trashElement) return trashElement; - trashElement = new UBLibElement(eUBLibElementType_Folder, UBSettings::trashLibraryPaletteDirPath(), QObject::tr("Trash", "Pictures category element")); + trashElement = new UBLibElement(eUBLibElementType_Folder, QUrl::fromLocalFile(UBSettings::trashLibraryPaletteDirPath()), QObject::tr("Trash", "Pictures category element")); QImage *categoryImage = new QImage(":images/libpalette/TrashCategory.svg"); trashElement->setThumbnail(categoryImage); trashElement->setMoveable(false);