Author: jghali
Date: Sun May 13 12:34:10 2018
New Revision: 22539

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22539
Log:
#15318: Page number glyphs partially render as boxes/blank during PDF export in 
certain circumstances

Modified:
    trunk/Scribus/scribus/scribusdoc.cpp

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22539&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp        (original)
+++ trunk/Scribus/scribus/scribusdoc.cpp        Sun May 13 12:34:10 2018
@@ -4505,106 +4505,36 @@
        UsedGlyphsPainter p(Really);
        it->textLayout.render(&p);
 
-       // Process page numbers and page count special characters
-       int start = it->isTextFrame() ? it->firstInFrame() : 0;
-       int stop  = it->isTextFrame() ? it->lastInFrame() + 1 : 
it->itemText.length();
-       for (int e = start; e < stop; ++e)
-       {
-               const ScFace& font = it->itemText.charStyle(e).font();
-               double fontSize = it->itemText.charStyle(e).fontSize();
-               QString fontName = font.replacementName();
-               if (!Really.contains(fontName) )
-               {
-                       if (!fontName.isEmpty())
-                               Really.insert(fontName, QMap<uint, 
FPointArray>());
-               }
-               uint chr = it->itemText.text(e).unicode();
-               if ((chr != SpecialChars::PAGENUMBER ) && (chr != 
SpecialChars::PAGECOUNT))
-                       continue;
-
-               QStringList txtList;
-               QString pageNumberText; //Our page number collection string
-               if (chr == SpecialChars::PAGENUMBER)
-               {
-                       if (e > 0 && it->itemText.text(e-1) == 
SpecialChars::PAGENUMBER)
-                               pageNumberText = SpecialChars::ZWNBSPACE;
-                       else if (lc!=0) //If not on a master page just get the 
page number for the page and the text
-                       {
-                               pageNumberText = 
QString("%1").arg(getSectionPageNumberForPageIndex(it->OwnPage),
-                                                               
getSectionPageNumberWidthForPageIndex(it->OwnPage),
-                                                               
getSectionPageNumberFillCharForPageIndex(it->OwnPage));
-                               txtList.append(pageNumberText);
-                       }
-                       else
-                       {
-                               //Else, for a page number in a text frame on a 
master page we must scan
-                               //all pages to see which ones use this page and 
get their page numbers.
-                               //We only add each character of the pages' page 
number text if its nothing
-                               //already in the pageNumberText variable. No 
need to add glyphs twice.
-                               QString newText;
-                               uint docPageCount = DocPages.count();
-                               for (uint a = 0; a < docPageCount; ++a)
-                               {
-                                       if (DocPages.at(a)->MPageNam == 
it->OnMasterPage)
-                                       {
-                                               newText = 
QString("%1").arg(getSectionPageNumberForPageIndex(a),
-                                                                               
getSectionPageNumberWidthForPageIndex(a),
-                                                                               
getSectionPageNumberFillCharForPageIndex(a));
-                                               txtList.append(newText);
-                                       }
-                               }
-                       }
-               }
-               else //ch == SpecialChars::PAGECOUNT
-               {
-                       if (lc != 0)
-                       {
-                               int key = 
getSectionKeyForPageIndex(it->OwnPage);
-                               if (key == -1)
-                                       pageNumberText = "";
-                               else
-                                       pageNumberText = 
QString("%1").arg(getStringFromSequence(m_docPrefsData.docSectionMap[key].type, 
m_docPrefsData.docSectionMap[key].toindex - 
m_docPrefsData.docSectionMap[key].fromindex + 1));
-                               txtList.append(pageNumberText);
-                       }
-                       else
-                       {
-                               QString newText;
-                               int docPageCount = DocPages.count();
-                               for (int a = 0; a < docPageCount; ++a)
-                               {
-                                       if (DocPages.at(a)->MPageNam == 
it->OnMasterPage)
-                                       {
-                                               int key = 
getSectionKeyForPageIndex(a);
-                                               if (key == -1)
-                                                       newText = "";
-                                               else
-                                                       newText = 
QString("%1").arg(getStringFromSequence(m_docPrefsData.docSectionMap[key].type, 
m_docPrefsData.docSectionMap[key].toindex - 
m_docPrefsData.docSectionMap[key].fromindex + 1));
-                                               txtList.append(newText);
-                                       }
-                               }
-                       }
-               }
-
-               //Now scan and add any glyphs used in page numbers
-               for (int a = 0; a < txtList.count(); ++a)
-               {
-                       CharStyle style(font, fontSize);
-                       StoryText story;
-                       story.insertChars(txtList[a]);
-                       story.setCharStyle(0, txtList[a].count(), style);
-
-                       TextShaper textShaper(story, 0);
-                       const QList<GlyphCluster> glyphRuns = 
textShaper.shape(0, story.length()).glyphs();
-
-                       for (const GlyphCluster &run : glyphRuns)
-                       {
-                               for (const GlyphLayout &gl : run.glyphs())
-                               {
-                                       FPointArray 
outline(font.glyphOutline(gl.glyph));
-                                       if (!fontName.isEmpty())
-                                               
Really[fontName].insert(gl.glyph, outline);
-                               }
-                       }
+       // Process page numbers and page count special characters on master 
pages
+       if (!it->OnMasterPage.isEmpty())
+       {
+               bool hasPageNumbers = false;
+
+               int start = it->isTextFrame() ? it->firstInFrame() : 0;
+               int stop = it->isTextFrame() ? it->lastInFrame() + 1 : 
it->itemText.length();
+               for (int e = start; e < stop; ++e)
+               {
+                       uint chr = it->itemText.text(e).unicode();
+                       if ((chr == SpecialChars::PAGENUMBER) || (chr == 
SpecialChars::PAGECOUNT))
+                       {
+                               hasPageNumbers = true;
+                               break;
+                       }
+               }
+
+               if (hasPageNumbers)
+               {
+                       it->savedOwnPage = it->OwnPage;
+                       int docPageCount = DocPages.count();
+                       for (int i = 0; i < docPageCount; ++i)
+                       {
+                               it->OwnPage = i;
+                               it->invalid = true;
+                               it->layout();
+                               it->textLayout.render(&p);
+                       }
+                       it->OwnPage = it->savedOwnPage;
+                       it->invalid = true;
                }
        }
 


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

Reply via email to