Author: jghali
Date: Sat Aug 26 12:09:45 2017
New Revision: 22147

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22147
Log:
14964: Scribus hangs on "Adjusting Colors" when Exporting PDF with "Thumbnails"

Modified:
    trunk/Scribus/scribus/plugins/export/pixmapexport/export.cpp
    trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
    trunk/Scribus/scribus/plugins/scriptplugin/objimageexport.cpp
    trunk/Scribus/scribus/scribus.cpp
    trunk/Scribus/scribus/scribusstructs.h
    trunk/Scribus/scribus/scribusview.cpp
    trunk/Scribus/scribus/scribusview.h

Modified: trunk/Scribus/scribus/plugins/export/pixmapexport/export.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/plugins/export/pixmapexport/export.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/export/pixmapexport/export.cpp        
(original)
+++ trunk/Scribus/scribus/plugins/export/pixmapexport/export.cpp        Sat Aug 
26 12:09:45 2017
@@ -188,7 +188,10 @@
        * portrait and user defined sizes.
        */
        double pixmapSize = (page->height() > page->width()) ? page->height() : 
page->width();
-       QImage im(doc->view()->PageToPixmap(pageNr, qRound(pixmapSize * 
enlargement * (pageDPI / 72.0) / 100.0), false, background));
+       PageToPixmapFlags flags;
+       if (background)
+               flags |= Pixmap_DrawBackground;
+       QImage im(doc->view()->PageToPixmap(pageNr, qRound(pixmapSize * 
enlargement * (pageDPI / 72.0) / 100.0), flags));
        if (im.isNull())
        {
                ScMessageBox::warning(doc->scMW(), tr("Save as Image"), 
tr("Insufficient memory for this image size."));

Modified: trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp      
(original)
+++ trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp      Sat Aug 
26 12:09:45 2017
@@ -254,7 +254,7 @@
                writeCore();
                writeDocRels();
                // Write Thumbnail
-               QImage thumb = m_Doc->view()->PageToPixmap(0, 256, false);
+               QImage thumb = m_Doc->view()->PageToPixmap(0, 256, 
Pixmap_DrawBackground);
                thumb.save(baseDir + "/docProps/thumbnail.jpeg", "JPG");
                // Write required DocStructure.struct
                QFile fts(baseDir + 
"/Documents/1/Structure/DocStructure.struct");

Modified: trunk/Scribus/scribus/plugins/scriptplugin/objimageexport.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/plugins/scriptplugin/objimageexport.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/scriptplugin/objimageexport.cpp       
(original)
+++ trunk/Scribus/scribus/plugins/scriptplugin/objimageexport.cpp       Sat Aug 
26 12:09:45 2017
@@ -142,16 +142,15 @@
 {
        if(!checkHaveDocument())
                return NULL;
+       ScribusDoc*  doc = ScCore->primaryMainWindow()->doc;
+       ScribusView*view = ScCore->primaryMainWindow()->view;
 
        /* a little magic here - I need to compute the "maxGr" value...
        * We need to know the right size of the page for landscape,
        * portrait and user defined sizes.
        */
-       double pixmapSize;
-       (ScCore->primaryMainWindow()->doc->pageHeight() > 
ScCore->primaryMainWindow()->doc->pageWidth())
-                       ? pixmapSize = 
ScCore->primaryMainWindow()->doc->pageHeight()
-                       : pixmapSize = 
ScCore->primaryMainWindow()->doc->pageWidth();
-       QImage im = 
ScCore->primaryMainWindow()->view->PageToPixmap(ScCore->primaryMainWindow()->doc->currentPage()->pageNr(),
 qRound(pixmapSize * self->scale * (self->dpi / 72.0) / 100.0), false);
+       double pixmapSize = (doc->pageHeight() > doc->pageWidth()) ? 
doc->pageHeight() : doc->pageWidth();
+       QImage im = view->PageToPixmap(doc->currentPage()->pageNr(), 
qRound(pixmapSize * self->scale * (self->dpi / 72.0) / 100.0), 
Pixmap_DrawBackground);
        int dpi = qRound(100.0 / 2.54 * self->dpi);
        im.setDotsPerMeterY(dpi);
        im.setDotsPerMeterX(dpi);
@@ -174,15 +173,15 @@
        if (!PyArg_ParseTuple(args, const_cast<char*>("es"), "utf-8", &value))
                return NULL;
 
+       ScribusDoc*  doc = ScCore->primaryMainWindow()->doc;
+       ScribusView*view = ScCore->primaryMainWindow()->view;
+
        /* a little magic here - I need to compute the "maxGr" value...
        * We need to know the right size of the page for landscape,
        * portrait and user defined sizes.
        */
-       double pixmapSize;
-       (ScCore->primaryMainWindow()->doc->pageHeight() > 
ScCore->primaryMainWindow()->doc->pageWidth())
-                       ? pixmapSize = 
ScCore->primaryMainWindow()->doc->pageHeight()
-                       : pixmapSize = 
ScCore->primaryMainWindow()->doc->pageWidth();
-       QImage im = 
ScCore->primaryMainWindow()->view->PageToPixmap(ScCore->primaryMainWindow()->doc->currentPage()->pageNr(),
 qRound(pixmapSize * self->scale * (self->dpi / 72.0) / 100.0), false);
+       double pixmapSize = (doc->pageHeight() > doc->pageWidth()) ? 
doc->pageHeight() : doc->pageWidth();
+       QImage im = view->PageToPixmap(doc->currentPage()->pageNr(), 
qRound(pixmapSize * self->scale * (self->dpi / 72.0) / 100.0), 
Pixmap_DrawBackground);
        int dpi = qRound(100.0 / 2.54 * self->dpi);
        im.setDotsPerMeterY(dpi);
        im.setDotsPerMeterX(dpi);

Modified: trunk/Scribus/scribus/scribus.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/scribus.cpp
==============================================================================
--- trunk/Scribus/scribus/scribus.cpp   (original)
+++ trunk/Scribus/scribus/scribus.cpp   Sat Aug 26 12:09:45 2017
@@ -7200,14 +7200,44 @@
                QString pageString(dia.getPagesString());
                std::vector<int> pageNs;
                uint pageNumbersSize;
-               QMap<int,QPixmap> thumbs;
-               int components=dia.colorSpaceComponents();
+               QMap<int,QPixmap> allThumbs, thumbs;
+               int components = dia.colorSpaceComponents();
                QString nam(dia.cmsDescriptor());
                QString fileName = doc->pdfOptions().fileName;
                QString errorMsg;
                parsePagesString(pageString, &pageNs, doc->DocPages.count());
                if (doc->pdfOptions().useDocBleeds)
                        doc->pdfOptions().bleeds = *doc->bleeds();
+
+               // If necssary, generate thumbnails in one go : if color 
management is enabled
+               // we gain lots of time by avoiding multiple color management 
settings change
+               // and hence multiple reloading of images
+               bool cmsCorr = false;
+               if (doc->pdfOptions().Thumbnails &&
+                       doc->cmsSettings().CMSinUse &&
+                       doc->cmsSettings().GamutCheck)
+               {
+                       cmsCorr = true;
+                       doc->cmsSettings().GamutCheck = false;
+                       doc->enableCMS(true);
+               }
+               pageNumbersSize = pageNs.size();
+               for (uint i = 0; i < pageNumbersSize; ++i)
+               {
+                       QPixmap pm(10, 10);
+                       if (doc->pdfOptions().Thumbnails)
+                       {
+                               // No need to load full res images for drawing 
small thumbnail
+                               PageToPixmapFlags flags = 
Pixmap_DontReloadImages;
+                               pm = 
QPixmap::fromImage(view->PageToPixmap(pageNs[i] - 1, 100, flags));
+                       }
+                       allThumbs.insert(pageNs[i], pm);
+               }
+               if (cmsCorr)
+               {
+                       doc->cmsSettings().GamutCheck = true;
+                       doc->enableCMS(true);
+               }
 
                if (doc->pdfOptions().doMultiFile)
                {
@@ -7226,7 +7256,7 @@
                                pageNumbersSize = pageNs2.size();
                                QPixmap pm(10,10);
                                if (doc->pdfOptions().Thumbnails)
-                                       
pm=QPixmap::fromImage(view->PageToPixmap(pageNs[aa]-1, 100));
+                                       pm = allThumbs[pageNs[aa]];
                                thumbs.insert(1, pm);
                                QString realName = 
QDir::toNativeSeparators(path+"/"+name+ tr("-Page%1").arg(pageNs[aa], 3, 10, 
QChar('0'))+"."+ext);
                                if (!getPDFDriver(realName, nam, components, 
pageNs2, thumbs, errorMsg, &cancelled))
@@ -7243,15 +7273,7 @@
                }
                else
                {
-                       pageNumbersSize = pageNs.size();
-                       for (uint ap = 0; ap < pageNumbersSize; ++ap)
-                       {
-                               QPixmap pm(10,10);
-                               if (doc->pdfOptions().Thumbnails)
-                                       
pm=QPixmap::fromImage(view->PageToPixmap(pageNs[ap]-1, 100));
-                               thumbs.insert(pageNs[ap], pm);
-                       }
-                       if (!getPDFDriver(fileName, nam, components, pageNs, 
thumbs, errorMsg))
+                       if (!getPDFDriver(fileName, nam, components, pageNs, 
allThumbs, errorMsg))
                        {
                                
qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
                                QString message = tr("Cannot write the file: 
\n%1").arg(doc->pdfOptions().fileName);

Modified: trunk/Scribus/scribus/scribusstructs.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/scribusstructs.h
==============================================================================
--- trunk/Scribus/scribus/scribusstructs.h      (original)
+++ trunk/Scribus/scribus/scribusstructs.h      Sat Aug 26 12:09:45 2017
@@ -14,6 +14,7 @@
 #include <QAction>
 #include <QByteArray>
 #include <QDebug>
+#include <QFlags>
 #include <QKeySequence>
 #include <QList>
 #include <QPolygon>
@@ -305,6 +306,19 @@
        customPage = 30
 };
 
+/**
+* Flags for ScribusView PageToPixmap()
+*/
+enum PageToPixmapFlag {
+       Pixmap_NoFlags = 0,
+       Pixmap_DrawFrame = 1 << 0,
+       Pixmap_DrawBackground = 1 << 1,
+       Pixmap_DontReloadImages = 1 << 2,
+};
+
+Q_DECLARE_FLAGS(PageToPixmapFlags, PageToPixmapFlag);
+Q_DECLARE_OPERATORS_FOR_FLAGS(PageToPixmapFlags);
+
 enum UpdateRequests
 {
        reqColorsUpdate = 1,

Modified: trunk/Scribus/scribus/scribusview.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/scribusview.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusview.cpp       (original)
+++ trunk/Scribus/scribus/scribusview.cpp       Sat Aug 26 12:09:45 2017
@@ -2733,7 +2733,7 @@
        return im;
 }
 
-QImage ScribusView::PageToPixmap(int Nr, int maxGr, bool drawFrame, bool 
drawBackground)
+QImage ScribusView::PageToPixmap(int Nr, int maxGr, PageToPixmapFlags flags)
 {
        QImage im;
        double sx = maxGr / Doc->DocPages.at(Nr)->width();
@@ -2777,11 +2777,11 @@
        Doc->setLoading(true);
        Doc->setCurrentPage(Doc->DocPages.at(Nr));
        ScPainter *painter = new ScPainter(&im, im.width(), im.height(), 1.0, 
0);
-       if (drawBackground)
+       if (flags & Pixmap_DrawBackground)
                painter->clear(Doc->paperColor());
        painter->translate(-clipx, -clipy);
        painter->setFillMode(ScPainter::Solid);
-       if (drawFrame)
+       if (flags & Pixmap_DrawFrame)
        {
                painter->setPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, 
Qt::MiterJoin);
                painter->setBrush(Doc->paperColor());
@@ -2793,7 +2793,7 @@
        QList<QPair<PageItem*, int> > changedList;
        ScPage* page = Doc->DocPages.at(Nr);
        PageItem* currItem;
-       if (page->FromMaster.count() != 0)
+       if ((page->FromMaster.count() != 0) && 
!flags.testFlag(Pixmap_DontReloadImages))
        {
                QList<PageItem*> itemList = page->FromMaster;
                while (itemList.count() > 0)
@@ -2821,7 +2821,7 @@
                        currItem->setImageYOffset(imgY);
                }
        }
-       if (Doc->Items->count() != 0)
+       if ((Doc->Items->count() != 0) && 
!flags.testFlag(Pixmap_DontReloadImages))
        {
                FPoint orig = m_canvas->localToCanvas(QPoint(clipx, clipy));
                QRectF cullingArea = QRectF(orig.x(), orig.y(), qRound(clipw / 
sc + 0.5), qRound(cliph / sc + 0.5));

Modified: trunk/Scribus/scribus/scribusview.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22147&path=/trunk/Scribus/scribus/scribusview.h
==============================================================================
--- trunk/Scribus/scribus/scribusview.h (original)
+++ trunk/Scribus/scribus/scribusview.h Sat Aug 26 12:09:45 2017
@@ -161,7 +161,7 @@
        void hideSymbolPage();
        void showInlinePage(int id);
        void hideInlinePage();
-       QImage PageToPixmap(int Nr, int maxGr, bool drawFrame = true, bool 
drawBackground = true);
+       QImage PageToPixmap(int Nr, int maxGr, PageToPixmapFlags flags = 
Pixmap_DrawFrame | Pixmap_DrawBackground);
        QImage MPageToPixmap(QString name, int maxGr, bool drawFrame = true);
        void RecalcPicturesRes();
        /**


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to