Author: jghali
Date: Thu Jan 21 22:09:20 2021
New Revision: 24417

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=24417
Log:
#16431: Page numbers placed in masterpages not displayed correctly when objects 
are grouped

Modified:
    trunk/Scribus/scribus/canvas.cpp
    trunk/Scribus/scribus/pageitem.cpp
    trunk/Scribus/scribus/pageitem.h
    trunk/Scribus/scribus/pageitem_group.cpp
    trunk/Scribus/scribus/pageitem_group.h
    trunk/Scribus/scribus/pageitem_noteframe.h
    trunk/Scribus/scribus/pageitem_pathtext.h
    trunk/Scribus/scribus/pageitem_table.h
    trunk/Scribus/scribus/pageitem_textframe.h
    trunk/Scribus/scribus/pdflib_core.cpp
    trunk/Scribus/scribus/pslib.cpp
    trunk/Scribus/scribus/scpageoutput.cpp

Modified: trunk/Scribus/scribus/canvas.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/canvas.cpp
==============================================================================
--- trunk/Scribus/scribus/canvas.cpp    (original)
+++ trunk/Scribus/scribus/canvas.cpp    Thu Jan 21 22:09:20 2021
@@ -27,6 +27,7 @@
 #include "canvasmode.h"
 #include "pageitem_textframe.h"
 #include "pageitem_group.h"
+#include "pageitemiterator.h"
 #include "prefsmanager.h"
 #include "scpage.h"
 #include "scpainter.h"
@@ -1373,7 +1374,7 @@
        int layerCount = m_doc->layerCount();
        if ((layerCount > 1) && ((layer.blendMode != 0) || (layer.transparency 
!= 1.0)) && (!layer.outlineMode))
                painter->beginLayer(layer.transparency, layer.blendMode);
-       int pageFromMasterCount=page->FromMaster.count();
+       int pageFromMasterCount = page->FromMaster.count();
        for (int a = 0; a < pageFromMasterCount; ++a)
        {
                currItem = page->FromMaster.at(a);
@@ -1396,10 +1397,22 @@
                        currItem->BoundingX = oldBX - Mp->xOffset() + 
page->xOffset();
                        currItem->BoundingY = oldBY - Mp->yOffset() + 
page->yOffset();
                }
+               // Save PageItem's OwnPage and set its value to page number
+               // so that page number placed in text frames can work, also 
modify
+               // OwnPage of items embeded inside groups for same reason
                currItem->savedOwnPage = currItem->OwnPage;
                currItem->OwnPage = page->pageNr();
-//FIXME                                                if (!evSpon || 
forceRedraw)
-//                                     currItem->invalid = true;
+               if (currItem->isGroup())
+               {
+                       PageItem_Group *groupItem = currItem->asGroupFrame();
+                       PageItemIterator itemIt(groupItem->groupItemList, 
PageItemIterator::IterateInGroups);
+                       for ( ; *itemIt; ++itemIt)
+                       {
+                               PageItem* item = *itemIt;
+                               item->savedOwnPage = currItem->OwnPage;
+                               item->OwnPage = page->pageNr();
+                       }
+               }
                if 
(cullingArea.intersects(currItem->getBoundingRect().adjusted(0.0, 0.0, 1.0, 
1.0)))
                {
                        if (!((m_viewMode.operItemMoving) && 
(currItem->isSelected())))
@@ -1409,8 +1422,19 @@
                                currItem->DrawObj(painter, cullingArea);
                                currItem->DrawObj_Decoration(painter);
                        }
-//                                                     else 
-//                                                             qDebug() << 
"skip masterpage item (move/resizeEdit/selected)" << m_viewMode.operItemMoving 
<< currItem->isSelected();
+//                     else 
+//                             qDebug() << "skip masterpage item 
(move/resizeEdit/selected)" << m_viewMode.operItemMoving << 
currItem->isSelected();
+               }
+               // Restore items' OwnPage including those of item embedded 
inside groups 
+               if (currItem->isGroup())
+               {
+                       PageItem_Group *groupItem = currItem->asGroupFrame();
+                       PageItemIterator itemIt(groupItem->groupItemList, 
PageItemIterator::IterateInGroups);
+                       for ( ; *itemIt; ++itemIt)
+                       {
+                               PageItem* item = *itemIt;
+                               item->OwnPage = item->savedOwnPage;
+                       }
                }
                currItem->OwnPage = currItem->savedOwnPage;
                if (!currItem->ChangedMasterItem)

Modified: trunk/Scribus/scribus/pageitem.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem.cpp  (original)
+++ trunk/Scribus/scribus/pageitem.cpp  Thu Jan 21 22:09:20 2021
@@ -734,6 +734,17 @@
 //                     unWeldFromMaster(true);
 //             if (isWelded())
 //                     unWeldChild();
+}
+
+bool PageItem::isMasterItem() const
+{
+       if (Parent == nullptr)
+               return !OnMasterPage.isEmpty();
+
+       PageItem* parentItem = Parent;
+       while (parentItem && parentItem->Parent)
+               parentItem = parentItem->Parent;
+       return !parentItem->OnMasterPage.isEmpty();
 }
 
 bool PageItem::isGroupChild() const

Modified: trunk/Scribus/scribus/pageitem.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem.h
==============================================================================
--- trunk/Scribus/scribus/pageitem.h    (original)
+++ trunk/Scribus/scribus/pageitem.h    Thu Jan 21 22:09:20 2021
@@ -270,8 +270,10 @@
        virtual bool isTable()                  const { return false; } ///< 
Return true if Table item, otherwise false
        virtual bool isTextFrame()              const { return false; } ///< 
Return true if Text item, otherwise false
 
+       virtual bool isMasterItem() const; ///< Return true if item is placed 
on a master page
        virtual bool isGroupChild() const;
        virtual bool isTableCell() const;
+       virtual bool isTextContainer() const { return false; } ///< Return true 
if item is susceptible to display text in a way or another
 
        PageItem_Group* parentGroup() const { return (Parent ? 
Parent->asGroupFrame() : nullptr); }
        PageItem_Table* parentTable() const { return (Parent ? 
Parent->asTable() : nullptr); }

Modified: trunk/Scribus/scribus/pageitem_group.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_group.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem_group.cpp    (original)
+++ trunk/Scribus/scribus/pageitem_group.cpp    Thu Jan 21 22:09:20 2021
@@ -29,6 +29,7 @@
 
 #include "commonstrings.h"
 #include "pageitem_group.h"
+#include "pageitemiterator.h"
 #include "prefsmanager.h"
 #include "scpainter.h"
 #include "scpage.h"
@@ -57,6 +58,21 @@
 //     {
 //             delete groupItemList.takeFirst();
 //     }
+}
+
+bool PageItem_Group::isTextContainer() const
+{
+       PageItemIterator it(groupItemList, PageItemIterator::IterateInGroups);
+       for (; *it; ++it)
+       {
+               PageItem* item = *it;
+               if (item->isGroup())
+                       continue;
+               if (item->isTextContainer())
+                       return true;
+       }
+
+       return false;
 }
 
 void PageItem_Group::adjustXYPosition()

Modified: trunk/Scribus/scribus/pageitem_group.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_group.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_group.h      (original)
+++ trunk/Scribus/scribus/pageitem_group.h      Thu Jan 21 22:09:20 2021
@@ -42,7 +42,9 @@
 
        PageItem_Group * asGroupFrame() override { return this; }
        bool isGroup() const override { return true; }
+       bool isTextContainer() const override;
        ItemType realItemType() const override { return PageItem::Group; }
+
        void adjustXYPosition();
        void setLayer(int layerId) override;
        void setMasterPage(int page, const QString& mpName) override;

Modified: trunk/Scribus/scribus/pageitem_noteframe.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_noteframe.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_noteframe.h  (original)
+++ trunk/Scribus/scribus/pageitem_noteframe.h  Thu Jan 21 22:09:20 2021
@@ -20,6 +20,7 @@
        PageItem_NoteFrame * asNoteFrame() override { return this; }
        bool isNoteFrame() const override { return true; }
        bool isAutoNoteFrame() const override { return 
m_nstyle->isAutoRemoveEmptyNotesFrames(); }
+       bool isTextContainer() const override { return true; }
 
        //overloaded text frame layouting
        void layout() override;

Modified: trunk/Scribus/scribus/pageitem_pathtext.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_pathtext.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_pathtext.h   (original)
+++ trunk/Scribus/scribus/pageitem_pathtext.h   Thu Jan 21 22:09:20 2021
@@ -41,6 +41,7 @@
        
        PageItem_PathText * asPathText() override { return this; }
        bool isPathText() const override { return true; }
+       bool isTextContainer() const override { return true; }
 
        void layout() override;
        bool createInfoGroup(QFrame *, QGridLayout *) override;

Modified: trunk/Scribus/scribus/pageitem_table.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_table.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_table.h      (original)
+++ trunk/Scribus/scribus/pageitem_table.h      Thu Jan 21 22:09:20 2021
@@ -494,6 +494,9 @@
        /// Returns PageItem::Table.
        ItemType realItemType() const override { return PageItem::Table; }
 
+       /// Return true if item is susceptible to contain text in a way or 
another
+       bool isTextContainer() const override { return true; }
+
        /// Adds the applicable actions for this table to @a actionList.
        void applicableActions(QStringList& actionList) override;
 

Modified: trunk/Scribus/scribus/pageitem_textframe.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pageitem_textframe.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_textframe.h  (original)
+++ trunk/Scribus/scribus/pageitem_textframe.h  Thu Jan 21 22:09:20 2021
@@ -55,6 +55,7 @@
 
        PageItem_TextFrame * asTextFrame() override { return this; }
        bool isTextFrame() const override { return true; }
+       bool isTextContainer() const override { return true; }
 
        void clearContents() override;
        void truncateContents() override;

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Thu Jan 21 22:09:20 2021
@@ -2680,10 +2680,10 @@
                                                                                
                "/OPM 1\n");
                                PutPage(Pdf::toName(ShName) + " gs\n");
                        }
-/* Bookmarks on Master Pages do not make any sense */
+                       /* Bookmarks on Master Pages do not make any sense */
 //                     if ((ite->isBookmark) && (Options.Bookmarks))
 //                             PDF_Bookmark(ite, pag->height() - (ite->yPos() 
- pag->yOffset()));
-                       if (!ite->printEnabled() || ((ite->itemType() == 
PageItem::TextFrame) && (!pag->pageNameEmpty())))
+                       if (!ite->printEnabled() || (ite->isTextContainer() && 
!pag->pageNameEmpty()))
                        {
                                PutPage("Q\n");
                                continue;
@@ -3853,43 +3853,43 @@
 
        if (Options.exportsLayers())
                PutPage("/OC /" + OCGEntries[layer.Name].Name + " BDC\n");
-       for (int am = 0; am < pag->FromMaster.count() && !abortExport; ++am)
-       {
-               ite = pag->FromMaster.at(am);
+       for (int i = 0; i < pag->FromMaster.count() && !abortExport; ++i)
+       {
+               ite = pag->FromMaster.at(i);
                if (usingGUI)
                        qApp->processEvents();
                if ((ite->m_layerID != layer.ID) || (!ite->printEnabled()))
                        continue;
                if ((!pag->pageNameEmpty()) && (ite->OwnPage != pag->pageNr()) 
&& (ite->OwnPage != -1))
                        continue;
+
                QByteArray name = QByteArray("/master_page_obj_%1_%2")
                                                    .replace("%1", 
Pdf::toPdf(mPageIndex))
                                                    .replace("%2", 
Pdf::toPdf(qHash(ite)));
-               if ((!ite->isTextFrame()) && (!ite->isPathText()) && 
(!ite->isTable()))
+               if (!ite->isTextContainer())
                {
                        if (((layer.transparency != 1) || (layer.blendMode != 
0)) && Options.supportsTransparency())
                                content += (name + " Do\n");
                        else
                                PutPage(name + " Do\n");
-               }
+                       continue;
+               }
+
+               double oldX = ite->xPos();
+               double oldY = ite->yPos();
+               double oldBX = ite->BoundingX;
+               double oldBY = ite->BoundingY;
+               ite->setXPos(ite->xPos() - mPage->xOffset() + pag->xOffset(), 
true);
+               ite->setYPos(ite->yPos() - mPage->yOffset() + pag->yOffset(), 
true);
+               if (!PDF_ProcessItem(output, ite, pag, pag->pageNr()))
+                       return false;
+               if (((layer.transparency != 1) || (layer.blendMode != 0)) && 
Options.supportsTransparency())
+                       content += output;
                else
-               {
-                       double oldX = ite->xPos();
-                       double oldY = ite->yPos();
-                       double OldBX = ite->BoundingX;
-                       double OldBY = ite->BoundingY;
-                       ite->setXPos(ite->xPos() - mPage->xOffset() + 
pag->xOffset(), true);
-                       ite->setYPos(ite->yPos() - mPage->yOffset() + 
pag->yOffset(), true);
-                       if (!PDF_ProcessItem(output, ite, pag, pag->pageNr()))
-                               return false;
-                       if (((layer.transparency != 1) || (layer.blendMode != 
0)) && Options.supportsTransparency())
-                               content += output;
-                       else
-                               PutPage(output);
-                       ite->setXYPos(oldX, oldY, true);
-                       ite->BoundingX = OldBX;
-                       ite->BoundingY = OldBY;
-               }
+                       PutPage(output);
+               ite->setXYPos(oldX, oldY, true);
+               ite->BoundingX = oldBX;
+               ite->BoundingY = oldBY;
        }
        // Couldn't we use Write_TransparencyGroup() here?
        if (((layer.transparency != 1) || (layer.blendMode != 0)) && 
Options.supportsTransparency())

Modified: trunk/Scribus/scribus/pslib.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/pslib.cpp
==============================================================================
--- trunk/Scribus/scribus/pslib.cpp     (original)
+++ trunk/Scribus/scribus/pslib.cpp     Thu Jan 21 22:09:20 2021
@@ -1763,7 +1763,7 @@
                                continue;
                        if (!page->masterPageNameEmpty() && !abortExport && 
!errorOccured)
                        {
-                               errorOccured |= !ProcessMasterPageLayer(page, 
ll, a);
+                               errorOccured |= !ProcessMasterPageLayer(page, 
ll, a + 1);
                        }
                        if (!abortExport && !errorOccured)
                        {
@@ -1979,7 +1979,7 @@
                        PS_scale(1, -1);
                }
                if (item->itemText.length() != 0)
-                       setTextSt(item, PNr-1, page, master);
+                       setTextSt(item, PNr - 1, page, master);
                if (((item->lineColor() != CommonStrings::None) || 
(!item->NamedLStyle.isEmpty()) || (!item->strokePattern().isEmpty()) || 
(item->GrTypeStroke > 0)))
                {
                        PS_setlinewidth(item->lineWidth());
@@ -2330,6 +2330,8 @@
                }
                break;
        case PageItem::Group:
+               if (master)
+                       break;
                PS_save();
                if (item->groupClipping())
                        SetPathAndClip(item->PoLine, item->fillRule);
@@ -2612,11 +2614,7 @@
                                ScQApp->processEvents();
                        if (item->m_layerID != ll.ID)
                                continue;
-                       if ((!page->pageNameEmpty()) && (item->isTextFrame()))
-                               continue;
-                       if ((!page->pageNameEmpty()) && (item->isPathText()))
-                               continue;
-                       if ((!page->pageNameEmpty()) && (item->isTable()))
+                       if ((!page->pageNameEmpty()) && 
(item->isTextContainer()))
                                continue;
                        if ((!page->pageNameEmpty()) && (item->isImageFrame()) 
&& ((Options.outputSeparations) || (!Options.useColor)))
                                continue;
@@ -2660,219 +2658,19 @@
                                ScQApp->processEvents();
                        if ((ite->m_layerID != layer.ID) || 
(!ite->printEnabled()))
                                continue;
-                       if (!(ite->isTextFrame()) && !(ite->isImageFrame()) && 
!(ite->isPathText()) && !(ite->isTable()))
+                       if (!ite->isTextContainer())
                        {
                                int mpIndex = 
m_Doc->MasterNames[page->masterPageName()];
                                
PS_UseTemplate(QString("mp_obj_%1_%2").arg(mpIndex).arg(qHash(ite)));
                        }
-                       else if (ite->isImageFrame())
+                       else if (!ite->isTextFrame())
                        {
                                PS_save();
                                // JG : replace what seems mostly duplicate 
code by corresponding function call (#3936)
                                success &= ProcessItem(mPage, ite, PNr, false, 
false, true);
                                PS_restore();
                        }
-                       else if (ite->isTable())
-                       {
-                               PS_save();
-                               PS_translate(ite->xPos() - mPage->xOffset(), 
mPage->height() - (ite->yPos() - mPage->yOffset()));
-                               PS_translate(ite->asTable()->gridOffset().x(), 
-ite->asTable()->gridOffset().y());
-                               // Paint table fill.
-                               if (ite->asTable()->fillColor() != 
CommonStrings::None)
-                               {
-                                       int lastCol = ite->asTable()->columns() 
- 1;
-                                       int lastRow = ite->asTable()->rows() - 
1;
-                                       double x = 
ite->asTable()->columnPosition(0);
-                                       double y = 
ite->asTable()->rowPosition(0);
-                                       double width = 
ite->asTable()->columnPosition(lastCol) + ite->asTable()->columnWidth(lastCol) 
- x;
-                                       double height = 
ite->asTable()->rowPosition(lastRow) + ite->asTable()->rowHeight(lastRow) - y;
-                                       
putColorNoDraw(ite->asTable()->fillColor(), ite->asTable()->fillShade());
-                                       PutStream("0 0 " + ToStr(width) + " " + 
ToStr(-height) + " rectfill\n");
-                               }
-                               // Pass 1: Paint cell fills.
-                               for (int row = 0; row < ite->asTable()->rows(); 
++row)
-                               {
-                                       int colSpan = 0;
-                                       for (int col = 0; col < 
ite->asTable()->columns(); col += colSpan)
-                                       {
-                                               TableCell cell = 
ite->asTable()->cellAt(row, col);
-                                               if (row == cell.row())
-                                               {
-                                                       QString colorName = 
cell.fillColor();
-                                                       if (colorName != 
CommonStrings::None)
-                                                       {
-                                                               PS_save();
-                                                               
putColorNoDraw(colorName, cell.fillShade());
-                                                               int row = 
cell.row();
-                                                               int col = 
cell.column();
-                                                               int lastRow = 
row + cell.rowSpan() - 1;
-                                                               int lastCol = 
col + cell.columnSpan() - 1;
-                                                               double x = 
ite->asTable()->columnPosition(col);
-                                                               double y = 
ite->asTable()->rowPosition(row);
-                                                               double width = 
ite->asTable()->columnPosition(lastCol) + ite->asTable()->columnWidth(lastCol) 
- x;
-                                                               double height = 
ite->asTable()->rowPosition(lastRow) + ite->asTable()->rowHeight(lastRow) - y;
-                                                               
PutStream(ToStr(x) + " " + ToStr(-y) + " " + ToStr(width) + " " + 
ToStr(-height) + " rectfill\n");
-                                                               PS_restore();
-                                                       }
-                                               }
-                                               colSpan = cell.columnSpan();
-                                       }
-                               }
-                               // Pass 2: Paint vertical borders.
-                               for (int row = 0; row < ite->asTable()->rows(); 
++row)
-                               {
-                                       int colSpan = 0;
-                                       for (int col = 0; col < 
ite->asTable()->columns(); col += colSpan)
-                                       {
-                                               TableCell cell = 
ite->asTable()->cellAt(row, col);
-                                               if (row == cell.row())
-                                               {
-                                                       const int lastRow = 
cell.row() + cell.rowSpan() - 1;
-                                                       const int lastCol = 
cell.column() + cell.columnSpan() - 1;
-                                                       const double borderX = 
ite->asTable()->columnPosition(lastCol) + ite->asTable()->columnWidth(lastCol);
-                                                       QPointF start(borderX, 
0.0);
-                                                       QPointF end(borderX, 
0.0);
-                                                       QPointF 
startOffsetFactors, endOffsetFactors;
-                                                       int startRow, endRow;
-                                                       for (int row = 
cell.row(); row <= lastRow; row += endRow - startRow + 1)
-                                                       {
-                                                               TableCell 
rightCell = ite->asTable()->cellAt(row, lastCol + 1);
-                                                               startRow = 
qMax(cell.row(), rightCell.row());
-                                                               endRow = 
qMin(lastRow, rightCell.isValid() ? rightCell.row() + rightCell.rowSpan() - 1 : 
lastRow);
-                                                               TableCell 
topLeftCell = ite->asTable()->cellAt(startRow - 1, lastCol);
-                                                               TableCell 
topRightCell = ite->asTable()->cellAt(startRow - 1, lastCol + 1);
-                                                               TableCell 
bottomRightCell = ite->asTable()->cellAt(endRow + 1, lastCol + 1);
-                                                               TableCell 
bottomLeftCell = ite->asTable()->cellAt(endRow + 1, lastCol);
-                                                               TableBorder 
topLeft, top, topRight, border, bottomLeft, bottom, bottomRight;
-                                                               
resolveBordersVertical(topLeftCell, topRightCell, cell, rightCell, 
bottomLeftCell, bottomRightCell,
-                                                                       
&topLeft, &top, &topRight, &border, &bottomLeft, &bottom, &bottomRight, 
ite->asTable());
-                                                               if 
(border.isNull())
-                                                                       
continue; // Quit early if the border to paint is null.
-                                                               
start.setY(ite->asTable()->rowPosition(startRow));
-                                                               
end.setY((ite->asTable()->rowPosition(endRow) + 
ite->asTable()->rowHeight(endRow)));
-                                                               
joinVertical(border, topLeft, top, topRight, bottomLeft, bottom, bottomRight, 
&start, &end, &startOffsetFactors, &endOffsetFactors);
-                                                               
paintBorder(border, start, end, startOffsetFactors, endOffsetFactors);
-                                                       }
-                                                       if (col == 0)
-                                                       {
-                                                               const int 
lastRow = cell.row() + cell.rowSpan() - 1;
-                                                               const int 
firstCol = cell.column();
-                                                               const double 
borderX = ite->asTable()->columnPosition(firstCol);
-                                                               QPointF 
start(borderX, 0.0);
-                                                               QPointF 
end(borderX, 0.0);
-                                                               QPointF 
startOffsetFactors, endOffsetFactors;
-                                                               int startRow, 
endRow;
-                                                               for (int row = 
cell.row(); row <= lastRow; row += endRow - startRow + 1)
-                                                               {
-                                                                       
TableCell leftCell = ite->asTable()->cellAt(row, firstCol - 1);
-                                                                       
startRow = qMax(cell.row(), leftCell.row());
-                                                                       endRow 
= qMin(lastRow, leftCell.isValid() ? leftCell.row() + leftCell.rowSpan() - 1 : 
lastRow);
-                                                                       
TableCell topLeftCell = ite->asTable()->cellAt(startRow - 1, firstCol - 1);
-                                                                       
TableCell topRightCell = ite->asTable()->cellAt(startRow - 1, firstCol);
-                                                                       
TableCell bottomRightCell = ite->asTable()->cellAt(lastRow + 1, firstCol);
-                                                                       
TableCell bottomLeftCell = ite->asTable()->cellAt(lastRow + 1, firstCol - 1);
-                                                                       
TableBorder topLeft, top, topRight, border, bottomLeft, bottom, bottomRight;
-                                                                       
resolveBordersVertical(topLeftCell, topRightCell, leftCell, cell, 
bottomLeftCell, bottomRightCell,
-                                                                               
&topLeft, &top, &topRight, &border, &bottomLeft, &bottom, &bottomRight, 
ite->asTable());
-                                                                       if 
(border.isNull())
-                                                                               
continue; // Quit early if the border to paint is null.
-                                                                       
start.setY(ite->asTable()->rowPosition(startRow));
-                                                                       
end.setY((ite->asTable()->rowPosition(endRow) + 
ite->asTable()->rowHeight(endRow)));
-                                                                       
joinVertical(border, topLeft, top, topRight, bottomLeft, bottom, bottomRight, 
&start, &end, &startOffsetFactors, &endOffsetFactors);
-                                                                       
paintBorder(border, start, end, startOffsetFactors, endOffsetFactors);
-                                                               }
-                                                       }
-                                               }
-                                               colSpan = cell.columnSpan();
-                                       }
-                               }
-                               // Pass 3: Paint horizontal borders.
-                               for (int row = 0; row < ite->asTable()->rows(); 
++row)
-                               {
-                                       int colSpan = 0;
-                                       for (int col = 0; col < 
ite->asTable()->columns(); col += colSpan)
-                                       {
-                                               TableCell cell = 
ite->asTable()->cellAt(row, col);
-                                               if (row == cell.row())
-                                               {
-                                                       const int lastRow = 
cell.row() + cell.rowSpan() - 1;
-                                                       const int lastCol = 
cell.column() + cell.columnSpan() - 1;
-                                                       const double borderY = 
(ite->asTable()->rowPosition(lastRow) + ite->asTable()->rowHeight(lastRow));
-                                                       QPointF start(0.0, 
borderY);
-                                                       QPointF end(0.0, 
borderY);
-                                                       QPointF 
startOffsetFactors, endOffsetFactors;
-                                                       int startCol, endCol;
-                                                       for (int col = 
cell.column(); col <= lastCol; col += endCol - startCol + 1)
-                                                       {
-                                                               TableCell 
bottomCell = ite->asTable()->cellAt(lastRow + 1, col);
-                                                               startCol = 
qMax(cell.column(), bottomCell.column());
-                                                               endCol = 
qMin(lastCol, bottomCell.isValid() ? bottomCell.column() + 
bottomCell.columnSpan() - 1 : lastCol);
-                                                               TableCell 
topLeftCell = ite->asTable()->cellAt(lastRow, startCol - 1);
-                                                               TableCell 
topRightCell = ite->asTable()->cellAt(lastRow, endCol + 1);
-                                                               TableCell 
bottomRightCell = ite->asTable()->cellAt(lastRow + 1, endCol + 1);
-                                                               TableCell 
bottomLeftCell = ite->asTable()->cellAt(lastRow + 1, startCol - 1);
-                                                               TableBorder 
topLeft, left, bottomLeft, border, topRight, right, bottomRight;
-                                                               
resolveBordersHorizontal(topLeftCell, cell, topRightCell, bottomLeftCell, 
bottomCell,
-                                                                               
                  bottomRightCell, &topLeft, &left, &bottomLeft, &border, 
&topRight, &right, &bottomRight, ite->asTable());
-                                                               if 
(border.isNull())
-                                                                       
continue; // Quit early if the border is null.
-                                                               
start.setX(ite->asTable()->columnPosition(startCol));
-                                                               
end.setX(ite->asTable()->columnPosition(endCol) + 
ite->asTable()->columnWidth(endCol));
-                                                               
joinHorizontal(border, topLeft, left, bottomLeft, topRight, right, bottomRight, 
&start, &end, &startOffsetFactors, &endOffsetFactors);
-                                                               
paintBorder(border, start, end, startOffsetFactors, endOffsetFactors);
-                                                       }
-                                                       if (row == 0)
-                                                       {
-                                                               const int 
firstRow = cell.row();
-                                                               const int 
lastCol = cell.column() + cell.columnSpan() - 1;
-                                                               const double 
borderY = ite->asTable()->rowPosition(firstRow);
-                                                               QPointF 
start(0.0, borderY);
-                                                               QPointF 
end(0.0, borderY);
-                                                               QPointF 
startOffsetFactors, endOffsetFactors;
-                                                               int startCol, 
endCol;
-                                                               for (int col = 
cell.column(); col <= lastCol; col += endCol - startCol + 1)
-                                                               {
-                                                                       
TableCell topCell = ite->asTable()->cellAt(firstRow - 1, col);
-                                                                       
startCol = qMax(cell.column(), topCell.column());
-                                                                       endCol 
= qMin(lastCol, topCell.isValid() ? topCell.column() + topCell.columnSpan() - 1 
: lastCol);
-                                                                       
TableCell topLeftCell = ite->asTable()->cellAt(firstRow - 1, startCol - 1);
-                                                                       
TableCell topRightCell = ite->asTable()->cellAt(firstRow - 1, endCol + 1);
-                                                                       
TableCell bottomRightCell = ite->asTable()->cellAt(firstRow, endCol + 1);
-                                                                       
TableCell bottomLeftCell = ite->asTable()->cellAt(firstRow, startCol - 1);
-                                                                       
TableBorder topLeft, left, bottomLeft, border, topRight, right, bottomRight;
-                                                                       
resolveBordersHorizontal(topLeftCell, topCell, topRightCell, bottomLeftCell, 
cell,
-                                                                               
                                         bottomRightCell, &topLeft, &left, 
&bottomLeft, &border, &topRight, &right, &bottomRight, ite->asTable());
-                                                                       if 
(border.isNull())
-                                                                               
continue; // Quit early if the border is null.
-                                                                       
start.setX(ite->asTable()->columnPosition(startCol));
-                                                                       
end.setX(ite->asTable()->columnPosition(endCol) + 
ite->asTable()->columnWidth(endCol));
-                                                                       
joinHorizontal(border, topLeft, left, bottomLeft, topRight, right, bottomRight, 
&start, &end, &startOffsetFactors, &endOffsetFactors);
-                                                                       
paintBorder(border, start, end, startOffsetFactors, endOffsetFactors);
-                                                               }
-                                                       }
-                                               }
-                                               colSpan = cell.columnSpan();
-                                       }
-                               }
-                               // Pass 4: Paint cell content.
-                               for (int row = 0; row < ite->asTable()->rows(); 
++row)
-                               {
-                                       for (int col = 0; col < 
ite->asTable()->columns(); col ++)
-                                       {
-                                               TableCell cell = 
ite->asTable()->cellAt(row, col);
-                                               if (cell.row() == row && 
cell.column() == col)
-                                               {
-                                                       PageItem* textFrame = 
cell.textFrame();
-                                                       PS_save();
-                                                       
PS_translate(cell.contentRect().x(), -cell.contentRect().y());
-                                                       ProcessItem(mPage, 
textFrame, PNr, false, false, true);
-                                                       PS_restore();
-                                               }
-                                       }
-                               }
-                               PS_restore();
-                       }
-                       else if (ite->isTextFrame())
+                       else // if (ite->isTextFrame())
                        {
                                PS_save();
                                if (ite->doOverprint)
@@ -2910,9 +2708,12 @@
                                        PS_scale(1, -1);
                                }
                                if (ite->itemText.length() != 0)
-                                       setTextSt(ite, PNr, mPage, true);
+                                       setTextSt(ite, PNr - 1, mPage, true);
                                if (((ite->lineColor() != CommonStrings::None) 
|| (!ite->NamedLStyle.isEmpty()) || (!ite->strokePattern().isEmpty()) || 
(ite->GrTypeStroke > 0)))
                                {
+                                       PS_setlinewidth(ite->lineWidth());
+                                       PS_setcapjoin(ite->PLineEnd, 
ite->PLineJoin);
+                                       PS_setdash(ite->PLineArt, 
ite->DashOffset, ite->DashValues);
                                        if (ite->NamedLStyle.isEmpty()) // && 
(ite->lineWidth() != 0.0))
                                        {
                                                ScPattern* strokePattern = 
m_Doc->checkedPattern(ite->strokePattern());
@@ -2923,9 +2724,6 @@
                                                }
                                                else
                                                {
-                                                       
PS_setlinewidth(ite->lineWidth());
-                                                       
PS_setcapjoin(ite->PLineEnd, ite->PLineJoin);
-                                                       
PS_setdash(ite->PLineArt, ite->DashOffset, ite->DashValues);
                                                        
SetClipPath(ite->PoLine);
                                                        PS_closepath();
                                                        if (strokePattern)
@@ -2961,58 +2759,6 @@
                                }
                                PS_restore();
                        }
-                       else if (ite->asPathText())
-                       {
-                               PS_save();
-                               PS_translate(ite->xPos() - mPage->xOffset(), 
mPage->height() - (ite->yPos() - mPage->yOffset()));
-                               if (ite->PoShow)
-                               {
-                                       if (ite->PoLine.size() > 3)
-                                       {
-                                               PS_save();
-                                               if (ite->NamedLStyle.isEmpty()) 
//&& (item->lineWidth() != 0.0))
-                                               {
-                                                       ScPattern* 
strokePattern = m_Doc->checkedPattern(ite->strokePattern());
-                                                       if (strokePattern && 
(ite->patternStrokePath))
-                                                       {
-                                                               QPainterPath 
path = ite->PoLine.toQPainterPath(false);
-                                                               
HandleBrushPattern(ite, path, mPage, PNr, true);
-                                                       }
-                                                       else
-                                                       {
-                                                               
SetClipPath(ite->PoLine, false);
-                                                               if 
(strokePattern)
-                                                                       
HandleStrokePattern(ite);
-                                                               else if 
(ite->GrTypeStroke > 0)
-                                                                       
HandleGradientFillStroke(ite);
-                                                               else if 
(ite->lineColor() != CommonStrings::None)
-                                                                       
putColor(ite->lineColor(), ite->lineShade(), false);
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       multiLine ml = 
m_Doc->docLineStyles[ite->NamedLStyle];
-                                                       for (int it = ml.size() 
- 1; it > -1; it--)
-                                                       {
-                                                               if 
(ml[it].Color != CommonStrings::None) //&& (ml[it].Width != 0))
-                                                               {
-                                                                       
SetColor(ml[it].Color, ml[it].Shade, &h, &s, &v, &k);
-                                                                       
PS_setcmykcolor_stroke(h, s, v, k);
-                                                                       
PS_setlinewidth(ml[it].Width);
-                                                                       
PS_setcapjoin(static_cast<Qt::PenCapStyle>(ml[it].LineEnd), 
static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
-                                                                       
PS_setdash(static_cast<Qt::PenStyle>(ml[it].Dash), 0, dum);
-                                                                       
SetClipPath(ite->PoLine, false);
-                                                                       
putColor(ml[it].Color, ml[it].Shade, false);
-                                                               }
-                                                       }
-                                               }
-                                               PS_restore();
-                                       }
-                               }
-                               if (ite->itemText.length() != 0)
-                                       setTextSt(ite, PNr, mPage, true);
-                               PS_restore();
-                       }
                        if (!success)
                                break;
                }
@@ -3036,11 +2782,7 @@
                        ScQApp->processEvents();
                if (item->m_layerID != layer.ID)
                        continue;
-               if ((!page->pageNameEmpty()) && (item->isTextFrame()))
-                       continue;
-               if ((!page->pageNameEmpty()) && (item->isPathText()))
-                       continue;
-               if ((!page->pageNameEmpty()) && (item->isTable()))
+               if ((!page->pageNameEmpty()) && (item->isTextContainer()))
                        continue;
                if ((!page->pageNameEmpty()) && (item->isImageFrame()) && 
((Options.outputSeparations) || (!Options.useColor)))
                        continue;

Modified: trunk/Scribus/scribus/scpageoutput.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=24417&path=/trunk/Scribus/scribus/scpageoutput.cpp
==============================================================================
--- trunk/Scribus/scribus/scpageoutput.cpp      (original)
+++ trunk/Scribus/scribus/scpageoutput.cpp      Thu Jan 21 22:09:20 2021
@@ -141,12 +141,7 @@
                }
                QRectF oldR(currItem->getBoundingRect().adjusted(0.0, 0.0, 1.0, 
1.0));
                if (clip.intersects(oldR.toRect()))
-               {
-                       // relayout necessary to get page number ok
-                       currItem->invalidateLayout();
-                       currItem->layout();
                        drawItem(currItem, painter, clip);
-               }
                currItem->OwnPage = savedOwnPage;
                if (!currItem->ChangedMasterItem)
                {
@@ -723,10 +718,13 @@
                PageItem* embedded = item->groupItemList.at(em);
                painter->save();
                painter->translate(embedded->gXpos, embedded->gYpos);
+               embedded->savedOwnPage = embedded->OwnPage;
+               embedded->OwnPage = item->OwnPage;
                embedded->isEmbedded = true;
                embedded->invalidateLayout();
                drawItem(embedded, painter, QRect());
                embedded->isEmbedded = false;
+               embedded->OwnPage = embedded->savedOwnPage;
                painter->restore();
        }
        //painter->endLayer();
@@ -1505,6 +1503,13 @@
                if (!item->pixm.qImage().isNull())
                        painter->drawImage(&item->pixm, 
ScPainterExBase::rgbImages);
                painter->restore();
+       }
+
+       if (item->isMasterItem())
+       {
+               // relayout necessary to get page number ok
+               item->invalidateLayout();
+               item->layout();
        }
 
        ScPageOutputPainter p(item, painter, this);


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

Reply via email to