Author: jghali Date: Sun Jun 3 16:00:57 2018 New Revision: 22566 URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22566 Log: exit early in PSLib::ProcessItem() when possible instead of having a big "if" block
Modified: trunk/Scribus/scribus/pslib.cpp Modified: trunk/Scribus/scribus/pslib.cpp URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22566&path=/trunk/Scribus/scribus/pslib.cpp ============================================================================== --- trunk/Scribus/scribus/pslib.cpp (original) +++ trunk/Scribus/scribus/pslib.cpp Sun Jun 3 16:00:57 2018 @@ -1774,260 +1774,209 @@ { double h, s, v, k; QVector<double> dum; - if (c->printEnabled()) - { - fillRule = true; + + if (!c->printEnabled()) + return true; + + fillRule = true; + PS_save(); + if (c->doOverprint) + { + PutStream("true setoverprint\n"); + PutStream("true setoverprintmode\n"); + } + if (c->fillColor() != CommonStrings::None) + { + SetColor(c->fillColor(), c->fillShade(), &h, &s, &v, &k); + PS_setcmykcolor_fill(h, s, v, k); + } + if (c->lineColor() != CommonStrings::None) + { + SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); + PS_setcmykcolor_stroke(h, s, v, k); + } + PS_setlinewidth(c->lineWidth()); + PS_setcapjoin(c->PLineEnd, c->PLineJoin); + PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); + if (!embedded) + { + PS_translate(c->xPos() - a->xOffset(), a->height() - (c->yPos() - a->yOffset())); + } + if (c->rotation() != 0) + PS_rotate(-c->rotation()); + switch (c->itemType()) + { + case PageItem::ImageFrame: + case PageItem::LatexFrame: + if (master) + break; + if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) + { + SetClipPath(&c->PoLine); + PS_closepath(); + if (c->GrType == 14) + PS_HatchFill(c); + else if ((c->GrType != 0) && (master == false)) + HandleGradientFillStroke(c, false); + else + putColor(c->fillColor(), c->fillShade(), true); + PS_newpath(); + } PS_save(); - if (c->doOverprint) - { - PutStream("true setoverprint\n"); - PutStream("true setoverprintmode\n"); - } - if (c->fillColor() != CommonStrings::None) - { - SetColor(c->fillColor(), c->fillShade(), &h, &s, &v, &k); - PS_setcmykcolor_fill(h, s, v, k); - } - if (c->lineColor() != CommonStrings::None) - { - SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); - PS_setcmykcolor_stroke(h, s, v, k); - } - PS_setlinewidth(c->lineWidth()); - PS_setcapjoin(c->PLineEnd, c->PLineJoin); - PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); - if (!embedded) - { - PS_translate(c->xPos() - a->xOffset(), a->height() - (c->yPos() - a->yOffset())); - } - if (c->rotation() != 0) - PS_rotate(-c->rotation()); - switch (c->itemType()) - { - case PageItem::ImageFrame: - case PageItem::LatexFrame: - if (master) - break; - if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) - { - SetClipPath(&c->PoLine); - PS_closepath(); - if (c->GrType == 14) - PS_HatchFill(c); - else if ((c->GrType != 0) && (master == false)) - HandleGradientFillStroke(c, false); + SetPathAndClip(c->PoLine, true); + if (c->imageFlippedH()) + { + PS_translate(c->width(), 0); + PS_scale(-1, 1); + } + if (c->imageFlippedV()) + { + PS_translate(0, -c->height()); + PS_scale(1, -1); + } + if (c->imageClip.size() != 0) + SetPathAndClip(c->imageClip, true); + if ((c->imageIsAvailable) && (!c->Pfile.isEmpty())) + { + bool imageOk = false; + PS_translate(0, -c->BBoxH*c->imageYScale()); + if ((optimization == OptimizeSize) && (((!a->pageName().isEmpty()) && !sep && farb) || useTemplate)) + imageOk = PS_image(c, c->imageXOffset(), -c->imageYOffset(), c->Pfile, c->imageXScale(), c->imageYScale(), c->IProfile, c->UseEmbedded, c->itemName()); + else + imageOk = PS_image(c, c->imageXOffset(), -c->imageYOffset(), c->Pfile, c->imageXScale(), c->imageYScale(), c->IProfile, c->UseEmbedded); + if (!imageOk) return false; + } + PS_restore(); + if (((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0))) + { + if (c->NamedLStyle.isEmpty()) // && (c->lineWidth() != 0.0)) + { + ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); + if ((strokePattern) && (c->patternStrokePath)) + { + QPainterPath path = c->PoLine.toQPainterPath(false); + HandleBrushPattern(c, path, a, PNr, sep, farb, master); + } else - putColor(c->fillColor(), c->fillShade(), true); - PS_newpath(); - } - PS_save(); - SetPathAndClip(c->PoLine, true); - if (c->imageFlippedH()) - { - PS_translate(c->width(), 0); - PS_scale(-1, 1); - } - if (c->imageFlippedV()) - { - PS_translate(0, -c->height()); - PS_scale(1, -1); - } - if (c->imageClip.size() != 0) - SetPathAndClip(c->imageClip, true); - if ((c->imageIsAvailable) && (!c->Pfile.isEmpty())) - { - bool imageOk = false; - PS_translate(0, -c->BBoxH*c->imageYScale()); - if ((optimization == OptimizeSize) && (((!a->pageName().isEmpty()) && !sep && farb) || useTemplate)) - imageOk = PS_image(c, c->imageXOffset(), -c->imageYOffset(), c->Pfile, c->imageXScale(), c->imageYScale(), c->IProfile, c->UseEmbedded, c->itemName()); - else - imageOk = PS_image(c, c->imageXOffset(), -c->imageYOffset(), c->Pfile, c->imageXScale(), c->imageYScale(), c->IProfile, c->UseEmbedded); - if (!imageOk) return false; - } - PS_restore(); - if (((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0))) - { - if (c->NamedLStyle.isEmpty()) // && (c->lineWidth() != 0.0)) - { - ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); - if ((strokePattern) && (c->patternStrokePath)) + { + PS_setlinewidth(c->lineWidth()); + PS_setcapjoin(c->PLineEnd, c->PLineJoin); + PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); + SetClipPath(&c->PoLine); + PS_closepath(); + if (strokePattern) + HandleStrokePattern(c); + else if (c->GrTypeStroke > 0) + HandleGradientFillStroke(c); + else if (c->lineColor() != CommonStrings::None) { - QPainterPath path = c->PoLine.toQPainterPath(false); - HandleBrushPattern(c, path, a, PNr, sep, farb, master); + SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); + PS_setcmykcolor_stroke(h, s, v, k); + putColor(c->lineColor(), c->lineShade(), false); } - else + } + } + else + { + multiLine ml = Doc->MLineStyles[c->NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + if (ml[it].Color != CommonStrings::None) // && (ml[it].Width != 0)) { - PS_setlinewidth(c->lineWidth()); - PS_setcapjoin(c->PLineEnd, c->PLineJoin); - PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); + 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(&c->PoLine); PS_closepath(); - if (strokePattern) - HandleStrokePattern(c); - else if (c->GrTypeStroke > 0) - HandleGradientFillStroke(c); - else if (c->lineColor() != CommonStrings::None) - { - SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); - PS_setcmykcolor_stroke(h, s, v, k); - putColor(c->lineColor(), c->lineShade(), false); - } + putColor(ml[it].Color, ml[it].Shade, false); } } - else - { - multiLine ml = Doc->MLineStyles[c->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(&c->PoLine); - PS_closepath(); - putColor(ml[it].Color, ml[it].Shade, false); - } - } - } - } + } + } + break; + case PageItem::TextFrame: + if (master) break; - case PageItem::TextFrame: - if (master) - break; - if ((c->isBookmark || c->isAnnotation()) && (!isPDF)) - break; - if (c->isBookmark) + if ((c->isBookmark || c->isAnnotation()) && (!isPDF)) + break; + if (c->isBookmark) + { + QString bm = ""; + QString cc; + for (int d = 0; d < c->itemText.length(); ++d) + { + if ((c->itemText.text(d) == QChar(13)) || (c->itemText.text(d) == QChar(10)) || (c->itemText.text(d) == QChar(28))) + break; + bm += "\\"+cc.setNum(qMax(c->itemText.text(d).unicode(), (ushort) 32), 8); + } + PDF_Bookmark(bm, a->pageNr()+1); + } + if (c->isAnnotation()) + { + if ((c->annotation().Type() == 0) || (c->annotation().Type() == 1) || (c->annotation().Type() == Annotation::Text) || (c->annotation().Type() == Annotation::Link)) { QString bm = ""; QString cc; for (int d = 0; d < c->itemText.length(); ++d) { - if ((c->itemText.text(d) == QChar(13)) || (c->itemText.text(d) == QChar(10)) || (c->itemText.text(d) == QChar(28))) - break; bm += "\\"+cc.setNum(qMax(c->itemText.text(d).unicode(), (ushort) 32), 8); } - PDF_Bookmark(bm, a->pageNr()+1); - } - if (c->isAnnotation()) - { - if ((c->annotation().Type() == 0) || (c->annotation().Type() == 1) || (c->annotation().Type() == Annotation::Text) || (c->annotation().Type() == Annotation::Link)) - { - QString bm = ""; - QString cc; - for (int d = 0; d < c->itemText.length(); ++d) + PDF_Annotation(c, bm, 0, 0, c->width(), -c->height()); + } + break; + } + if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) + { + SetClipPath(&c->PoLine); + PS_closepath(); + if (c->GrType == 14) + PS_HatchFill(c); + else if ((c->GrType != 0) && (master == false)) + HandleGradientFillStroke(c, false); + else + putColor(c->fillColor(), c->fillShade(), true); + } + if (c->imageFlippedH()) + { + PS_translate(c->width(), 0); + PS_scale(-1, 1); + } + if (c->imageFlippedV()) + { + PS_translate(0, -c->height()); + PS_scale(1, -1); + } + if (c->itemText.length() != 0) + setTextSt(Doc, c, PNr-1, a, sep, farb, master); + if (((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0))) + { + PS_setlinewidth(c->lineWidth()); + PS_setcapjoin(c->PLineEnd, c->PLineJoin); + PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); + if ((c->NamedLStyle.isEmpty()) && (c->lineWidth() != 0.0)) + { + ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); + if ((strokePattern) && (c->patternStrokePath)) + { + QPainterPath path = c->PoLine.toQPainterPath(false); + HandleBrushPattern(c, path, a, PNr, sep, farb, master); + } + else + { + SetClipPath(&c->PoLine); + PS_closepath(); + if (strokePattern) + HandleStrokePattern(c); + else if (c->GrTypeStroke > 0) + HandleGradientFillStroke(c); + else if (c->lineColor() != CommonStrings::None) { - bm += "\\"+cc.setNum(qMax(c->itemText.text(d).unicode(), (ushort) 32), 8); + SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); + PS_setcmykcolor_stroke(h, s, v, k); + putColor(c->lineColor(), c->lineShade(), false); } - PDF_Annotation(c, bm, 0, 0, c->width(), -c->height()); - } - break; - } - if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) - { - SetClipPath(&c->PoLine); - PS_closepath(); - if (c->GrType == 14) - PS_HatchFill(c); - else if ((c->GrType != 0) && (master == false)) - HandleGradientFillStroke(c, false); - else - putColor(c->fillColor(), c->fillShade(), true); - } - if (c->imageFlippedH()) - { - PS_translate(c->width(), 0); - PS_scale(-1, 1); - } - if (c->imageFlippedV()) - { - PS_translate(0, -c->height()); - PS_scale(1, -1); - } - if (c->itemText.length() != 0) - setTextSt(Doc, c, PNr-1, a, sep, farb, master); - if (((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0))) - { - PS_setlinewidth(c->lineWidth()); - PS_setcapjoin(c->PLineEnd, c->PLineJoin); - PS_setdash(c->PLineArt, c->DashOffset, c->DashValues); - if ((c->NamedLStyle.isEmpty()) && (c->lineWidth() != 0.0)) - { - ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); - if ((strokePattern) && (c->patternStrokePath)) - { - QPainterPath path = c->PoLine.toQPainterPath(false); - HandleBrushPattern(c, path, a, PNr, sep, farb, master); - } - else - { - SetClipPath(&c->PoLine); - PS_closepath(); - if (strokePattern) - HandleStrokePattern(c); - else if (c->GrTypeStroke > 0) - HandleGradientFillStroke(c); - else if (c->lineColor() != CommonStrings::None) - { - SetColor(c->lineColor(), c->lineShade(), &h, &s, &v, &k); - PS_setcmykcolor_stroke(h, s, v, k); - putColor(c->lineColor(), c->lineShade(), false); - } - } - } - else - { - multiLine ml = Doc->MLineStyles[c->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(&c->PoLine); - PS_closepath(); - putColor(ml[it].Color, ml[it].Shade, false); - } - } - } - } - break; - case PageItem::Line: - if (c->NamedLStyle.isEmpty()) // && (c->lineWidth() != 0.0)) - { - ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); - if (strokePattern) - { - if (c->patternStrokePath) - { - QPainterPath guidePath; - guidePath.moveTo(0, 0); - guidePath.lineTo(c->width(), 0); - HandleBrushPattern(c, guidePath, a, PNr, sep, farb, master); - } - else - { - PS_moveto(0, 0); - PS_lineto(c->width(), 0); - HandleStrokePattern(c); - } - } - else if (c->GrTypeStroke > 0) - { - PS_moveto(0, 0); - PS_lineto(c->width(), 0); - HandleGradientFillStroke(c); - } - else if (c->lineColor() != CommonStrings::None) - { - PS_moveto(0, 0); - PS_lineto(c->width(), 0); - putColor(c->lineColor(), c->lineShade(), false); } } else @@ -2042,107 +1991,242 @@ 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); - PS_moveto(0, 0); - PS_lineto(c->width(), 0); + SetClipPath(&c->PoLine); + PS_closepath(); putColor(ml[it].Color, ml[it].Shade, false); } } } - if (c->startArrowIndex() != 0) - { - QTransform arrowTrans; - arrowTrans.scale(-1,1); - arrowTrans.scale(c->startArrowScale() / 100.0, c->startArrowScale() / 100.0); - drawArrow(c, arrowTrans, c->startArrowIndex()); - } - if (c->endArrowIndex() != 0) - { - QTransform arrowTrans; - arrowTrans.translate(c->width(), 0); - arrowTrans.scale(c->endArrowScale() / 100.0, c->endArrowScale() / 100.0); - drawArrow(c, arrowTrans, c->endArrowIndex()); - } - break; - /* OBSOLETE CR 2005-02-06 - case 1: - case 3: - */ - case PageItem::ItemType1: - case PageItem::ItemType3: - case PageItem::Polygon: - case PageItem::RegularPolygon: - case PageItem::Arc: - if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) - { - SetClipPath(&c->PoLine); - PS_closepath(); - fillRule = c->fillRule; - if (c->GrType == 14) - PS_HatchFill(c); - else if (c->GrType != 0) - HandleGradientFillStroke(c, false); + } + break; + case PageItem::Line: + if (c->NamedLStyle.isEmpty()) // && (c->lineWidth() != 0.0)) + { + ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); + if (strokePattern) + { + if (c->patternStrokePath) + { + QPainterPath guidePath; + guidePath.moveTo(0, 0); + guidePath.lineTo(c->width(), 0); + HandleBrushPattern(c, guidePath, a, PNr, sep, farb, master); + } else - putColor(c->fillColor(), c->fillShade(), true); - } - if ((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0)) - { - if (c->NamedLStyle.isEmpty()) //&& (c->lineWidth() != 0.0)) - { - ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); - if (strokePattern && (c->patternStrokePath)) + { + PS_moveto(0, 0); + PS_lineto(c->width(), 0); + HandleStrokePattern(c); + } + } + else if (c->GrTypeStroke > 0) + { + PS_moveto(0, 0); + PS_lineto(c->width(), 0); + HandleGradientFillStroke(c); + } + else if (c->lineColor() != CommonStrings::None) + { + PS_moveto(0, 0); + PS_lineto(c->width(), 0); + putColor(c->lineColor(), c->lineShade(), false); + } + } + else + { + multiLine ml = Doc->MLineStyles[c->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); + PS_moveto(0, 0); + PS_lineto(c->width(), 0); + putColor(ml[it].Color, ml[it].Shade, false); + } + } + } + if (c->startArrowIndex() != 0) + { + QTransform arrowTrans; + arrowTrans.scale(-1,1); + arrowTrans.scale(c->startArrowScale() / 100.0, c->startArrowScale() / 100.0); + drawArrow(c, arrowTrans, c->startArrowIndex()); + } + if (c->endArrowIndex() != 0) + { + QTransform arrowTrans; + arrowTrans.translate(c->width(), 0); + arrowTrans.scale(c->endArrowScale() / 100.0, c->endArrowScale() / 100.0); + drawArrow(c, arrowTrans, c->endArrowIndex()); + } + break; + /* OBSOLETE CR 2005-02-06 + case 1: + case 3: + */ + case PageItem::ItemType1: + case PageItem::ItemType3: + case PageItem::Polygon: + case PageItem::RegularPolygon: + case PageItem::Arc: + if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) + { + SetClipPath(&c->PoLine); + PS_closepath(); + fillRule = c->fillRule; + if (c->GrType == 14) + PS_HatchFill(c); + else if (c->GrType != 0) + HandleGradientFillStroke(c, false); + else + putColor(c->fillColor(), c->fillShade(), true); + } + if ((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0)) + { + if (c->NamedLStyle.isEmpty()) //&& (c->lineWidth() != 0.0)) + { + ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); + if (strokePattern && (c->patternStrokePath)) + { + QPainterPath path = c->PoLine.toQPainterPath(false); + HandleBrushPattern(c, path, a, PNr, sep, farb, master); + } + else + { + SetClipPath(&c->PoLine); + PS_closepath(); + if (strokePattern) + HandleStrokePattern(c); + else if (c->GrTypeStroke > 0) + HandleGradientFillStroke(c); + else if (c->lineColor() != CommonStrings::None) + putColor(c->lineColor(), c->lineShade(), false); + } + } + else + { + multiLine ml = Doc->MLineStyles[c->NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + if (ml[it].Color != CommonStrings::None) //&& (ml[it].Width != 0)) { - QPainterPath path = c->PoLine.toQPainterPath(false); - HandleBrushPattern(c, path, a, PNr, sep, farb, master); - } - else - { + 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(&c->PoLine); PS_closepath(); - if (strokePattern) - HandleStrokePattern(c); - else if (c->GrTypeStroke > 0) - HandleGradientFillStroke(c); - else if (c->lineColor() != CommonStrings::None) - putColor(c->lineColor(), c->lineShade(), false); + putColor(ml[it].Color, ml[it].Shade, false); } } + } + } + break; + case PageItem::PolyLine: + case PageItem::Spiral: + if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) + { + SetClipPath(&c->PoLine); + PS_closepath(); + fillRule = c->fillRule; + if (c->GrType == 14) + PS_HatchFill(c); + else if (c->GrType != 0) + HandleGradientFillStroke(c, false); + else + putColor(c->fillColor(), c->fillShade(), true); + PS_newpath(); + } + if ((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0)) + { + if (c->NamedLStyle.isEmpty()) //&& (c->lineWidth() != 0.0)) + { + ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); + if (strokePattern && (c->patternStrokePath)) + { + QPainterPath path = c->PoLine.toQPainterPath(false); + HandleBrushPattern(c, path, a, PNr, sep, farb, master); + } else { - multiLine ml = Doc->MLineStyles[c->NamedLStyle]; - for (int it = ml.size()-1; it > -1; it--) + SetClipPath(&c->PoLine, false); + if (strokePattern) + HandleStrokePattern(c); + else if (c->GrTypeStroke > 0) + HandleGradientFillStroke(c); + else if (c->lineColor() != CommonStrings::None) + putColor(c->lineColor(), c->lineShade(), false); + } + } + else + { + multiLine ml = Doc->MLineStyles[c->NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + if (ml[it].Color != CommonStrings::None) //&& (ml[it].Width != 0)) { - 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(&c->PoLine); - PS_closepath(); - putColor(ml[it].Color, ml[it].Shade, false); - } + 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(&c->PoLine, false); + putColor(ml[it].Color, ml[it].Shade, false); } } } + } + if (c->startArrowIndex() != 0) + { + FPoint Start = c->PoLine.point(0); + for (int xx = 1; xx < c->PoLine.size(); xx += 2) + { + FPoint Vector = c->PoLine.point(xx); + if ((Start.x() != Vector.x()) || (Start.y() != Vector.y())) + { + double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI); + QTransform arrowTrans; + arrowTrans.translate(Start.x(), Start.y()); + arrowTrans.rotate(r); + arrowTrans.scale(c->startArrowScale() / 100.0, c->startArrowScale() / 100.0); + drawArrow(c, arrowTrans, c->startArrowIndex()); + break; + } + } + } + if (c->endArrowIndex() != 0) + { + FPoint End = c->PoLine.point(c->PoLine.size()-2); + for (uint xx = c->PoLine.size()-1; xx > 0; xx -= 2) + { + FPoint Vector = c->PoLine.point(xx); + if ((End.x() != Vector.x()) || (End.y() != Vector.y())) + { + double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI); + QTransform arrowTrans; + arrowTrans.translate(End.x(), End.y()); + arrowTrans.rotate(r); + arrowTrans.scale(c->endArrowScale() / 100.0, c->endArrowScale() / 100.0); + drawArrow(c, arrowTrans, c->endArrowIndex()); + break; + } + } + } + break; + case PageItem::PathText: + if (master) break; - case PageItem::PolyLine: - case PageItem::Spiral: - if ((c->fillColor() != CommonStrings::None) || (c->GrType != 0)) - { - SetClipPath(&c->PoLine); - PS_closepath(); - fillRule = c->fillRule; - if (c->GrType == 14) - PS_HatchFill(c); - else if (c->GrType != 0) - HandleGradientFillStroke(c, false); - else - putColor(c->fillColor(), c->fillShade(), true); - PS_newpath(); - } - if ((c->lineColor() != CommonStrings::None) || (!c->NamedLStyle.isEmpty()) || (!c->strokePattern().isEmpty()) || (c->GrTypeStroke > 0)) - { + if (c->PoShow) + { + if (c->PoLine.size() > 3) + { + PS_save(); if (c->NamedLStyle.isEmpty()) //&& (c->lineWidth() != 0.0)) { ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); @@ -2179,128 +2263,18 @@ } } } - } - if (c->startArrowIndex() != 0) - { - FPoint Start = c->PoLine.point(0); - for (int xx = 1; xx < c->PoLine.size(); xx += 2) - { - FPoint Vector = c->PoLine.point(xx); - if ((Start.x() != Vector.x()) || (Start.y() != Vector.y())) - { - double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI); - QTransform arrowTrans; - arrowTrans.translate(Start.x(), Start.y()); - arrowTrans.rotate(r); - arrowTrans.scale(c->startArrowScale() / 100.0, c->startArrowScale() / 100.0); - drawArrow(c, arrowTrans, c->startArrowIndex()); - break; - } - } - } - if (c->endArrowIndex() != 0) - { - FPoint End = c->PoLine.point(c->PoLine.size()-2); - for (uint xx = c->PoLine.size()-1; xx > 0; xx -= 2) - { - FPoint Vector = c->PoLine.point(xx); - if ((End.x() != Vector.x()) || (End.y() != Vector.y())) - { - double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI); - QTransform arrowTrans; - arrowTrans.translate(End.x(), End.y()); - arrowTrans.rotate(r); - arrowTrans.scale(c->endArrowScale() / 100.0, c->endArrowScale() / 100.0); - drawArrow(c, arrowTrans, c->endArrowIndex()); - break; - } - } - } - break; - case PageItem::PathText: - if (master) - break; - if (c->PoShow) - { - if (c->PoLine.size() > 3) - { - PS_save(); - if (c->NamedLStyle.isEmpty()) //&& (c->lineWidth() != 0.0)) - { - ScPattern* strokePattern = Doc->checkedPattern(c->strokePattern()); - if (strokePattern && (c->patternStrokePath)) - { - QPainterPath path = c->PoLine.toQPainterPath(false); - HandleBrushPattern(c, path, a, PNr, sep, farb, master); - } - else - { - SetClipPath(&c->PoLine, false); - if (strokePattern) - HandleStrokePattern(c); - else if (c->GrTypeStroke > 0) - HandleGradientFillStroke(c); - else if (c->lineColor() != CommonStrings::None) - putColor(c->lineColor(), c->lineShade(), false); - } - } - else - { - multiLine ml = Doc->MLineStyles[c->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(&c->PoLine, false); - putColor(ml[it].Color, ml[it].Shade, false); - } - } - } - PS_restore(); - } - } - if (c->itemText.length() != 0) - setTextSt(Doc, c, PNr-1, a, sep, farb, master); - break; - case PageItem::Symbol: - if (m_Doc->docPatterns.contains(c->pattern())) - { - ScPattern pat = m_Doc->docPatterns[c->pattern()]; - PS_save(); - SetPathAndClip(c->PoLine, c->fillRule); - if (c->imageFlippedH()) - { - PS_translate(c->width(), 0); - PS_scale(-1, 1); - } - if (c->imageFlippedV()) - { - PS_translate(0, -c->height()); - PS_scale(1, -1); - } - PS_scale(c->width() / pat.width, c->height() / pat.height); - PS_translate(0, -c->height()); - // PS_translate(pat.items.at(0)->gXpos, -pat.items.at(0)->gYpos); - for (int em = 0; em < pat.items.count(); ++em) - { - PageItem* embed = pat.items.at(em); - PS_save(); - PS_translate(embed->gXpos, c->height() - embed->gYpos); - ProcessItem(m_Doc, a, embed, PNr, sep, farb, master, true); - PS_restore(); - } PS_restore(); } - break; - case PageItem::Group: + } + if (c->itemText.length() != 0) + setTextSt(Doc, c, PNr-1, a, sep, farb, master); + break; + case PageItem::Symbol: + if (m_Doc->docPatterns.contains(c->pattern())) + { + ScPattern pat = m_Doc->docPatterns[c->pattern()]; PS_save(); - if (c->groupClipping()) - SetPathAndClip(c->PoLine, c->fillRule); + SetPathAndClip(c->PoLine, c->fillRule); if (c->imageFlippedH()) { PS_translate(c->width(), 0); @@ -2311,91 +2285,147 @@ PS_translate(0, -c->height()); PS_scale(1, -1); } - PS_scale(c->width() / c->groupWidth, c->height() / c->groupHeight); + PS_scale(c->width() / pat.width, c->height() / pat.height); PS_translate(0, -c->height()); - for (int em = 0; em < c->groupItemList.count(); ++em) - { - PageItem* embed = c->groupItemList.at(em); +// PS_translate(pat.items.at(0)->gXpos, -pat.items.at(0)->gYpos); + for (int em = 0; em < pat.items.count(); ++em) + { + PageItem* embed = pat.items.at(em); PS_save(); PS_translate(embed->gXpos, c->height() - embed->gYpos); ProcessItem(m_Doc, a, embed, PNr, sep, farb, master, true); PS_restore(); } PS_restore(); + } + break; + case PageItem::Group: + PS_save(); + if (c->groupClipping()) + SetPathAndClip(c->PoLine, c->fillRule); + if (c->imageFlippedH()) + { + PS_translate(c->width(), 0); + PS_scale(-1, 1); + } + if (c->imageFlippedV()) + { + PS_translate(0, -c->height()); + PS_scale(1, -1); + } + PS_scale(c->width() / c->groupWidth, c->height() / c->groupHeight); + PS_translate(0, -c->height()); + for (int em = 0; em < c->groupItemList.count(); ++em) + { + PageItem* embed = c->groupItemList.at(em); + PS_save(); + PS_translate(embed->gXpos, c->height() - embed->gYpos); + ProcessItem(m_Doc, a, embed, PNr, sep, farb, master, true); + PS_restore(); + } + PS_restore(); + break; + case PageItem::Table: + if (master) break; - case PageItem::Table: - if (master) - break; - PS_save(); - PS_translate(c->asTable()->gridOffset().x(), -c->asTable()->gridOffset().y()); - // Paint table fill. - if (c->asTable()->fillColor() != CommonStrings::None) - { - int lastCol = c->asTable()->columns() - 1; - int lastRow = c->asTable()->rows() - 1; - double x = c->asTable()->columnPosition(0); - double y = c->asTable()->rowPosition(0); - double width = c->asTable()->columnPosition(lastCol) + c->asTable()->columnWidth(lastCol) - x; - double height = c->asTable()->rowPosition(lastRow) + c->asTable()->rowHeight(lastRow) - y; - putColorNoDraw(c->asTable()->fillColor(), c->asTable()->fillShade()); - PutStream("0 0 "+ToStr(width)+" "+ToStr(-height)+" rectfill\n"); - } - // Pass 1: Paint cell fills. - for (int row = 0; row < c->asTable()->rows(); ++row) - { - int colSpan = 0; - for (int col = 0; col < c->asTable()->columns(); col += colSpan) - { - TableCell cell = c->asTable()->cellAt(row, col); - if (row == cell.row()) + PS_save(); + PS_translate(c->asTable()->gridOffset().x(), -c->asTable()->gridOffset().y()); + // Paint table fill. + if (c->asTable()->fillColor() != CommonStrings::None) + { + int lastCol = c->asTable()->columns() - 1; + int lastRow = c->asTable()->rows() - 1; + double x = c->asTable()->columnPosition(0); + double y = c->asTable()->rowPosition(0); + double width = c->asTable()->columnPosition(lastCol) + c->asTable()->columnWidth(lastCol) - x; + double height = c->asTable()->rowPosition(lastRow) + c->asTable()->rowHeight(lastRow) - y; + putColorNoDraw(c->asTable()->fillColor(), c->asTable()->fillShade()); + PutStream("0 0 "+ToStr(width)+" "+ToStr(-height)+" rectfill\n"); + } + // Pass 1: Paint cell fills. + for (int row = 0; row < c->asTable()->rows(); ++row) + { + int colSpan = 0; + for (int col = 0; col < c->asTable()->columns(); col += colSpan) + { + TableCell cell = c->asTable()->cellAt(row, col); + if (row == cell.row()) + { + QString colorName = cell.fillColor(); + if (colorName != CommonStrings::None) { - 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 = c->asTable()->columnPosition(col); - double y = c->asTable()->rowPosition(row); - double width = c->asTable()->columnPosition(lastCol) + c->asTable()->columnWidth(lastCol) - x; - double height = c->asTable()->rowPosition(lastRow) + c->asTable()->rowHeight(lastRow) - y; - PutStream(ToStr(x)+" "+ToStr(-y)+" "+ToStr(width)+" "+ToStr(-height)+" rectfill\n"); - PS_restore(); - } + 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 = c->asTable()->columnPosition(col); + double y = c->asTable()->rowPosition(row); + double width = c->asTable()->columnPosition(lastCol) + c->asTable()->columnWidth(lastCol) - x; + double height = c->asTable()->rowPosition(lastRow) + c->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 < c->asTable()->rows(); ++row) - { - int colSpan = 0; - for (int col = 0; col < c->asTable()->columns(); col += colSpan) - { - TableCell cell = c->asTable()->cellAt(row, col); - if (row == cell.row()) + } + colSpan = cell.columnSpan(); + } + } + // Pass 2: Paint vertical borders. + for (int row = 0; row < c->asTable()->rows(); ++row) + { + int colSpan = 0; + for (int col = 0; col < c->asTable()->columns(); col += colSpan) + { + TableCell cell = c->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 = c->asTable()->columnPosition(lastCol) + c->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 = c->asTable()->cellAt(row, lastCol + 1); + startRow = qMax(cell.row(), rightCell.row()); + endRow = qMin(lastRow, rightCell.isValid() ? rightCell.row() + rightCell.rowSpan() - 1 : lastRow); + TableCell topLeftCell = c->asTable()->cellAt(startRow - 1, lastCol); + TableCell topRightCell = c->asTable()->cellAt(startRow - 1, lastCol + 1); + TableCell bottomRightCell = c->asTable()->cellAt(endRow + 1, lastCol + 1); + TableCell bottomLeftCell = c->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, c->asTable()); + if (border.isNull()) + continue; // Quit early if the border to paint is null. + start.setY(c->asTable()->rowPosition(startRow)); + end.setY((c->asTable()->rowPosition(endRow) + c->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 lastCol = cell.column() + cell.columnSpan() - 1; - const double borderX = c->asTable()->columnPosition(lastCol) + c->asTable()->columnWidth(lastCol); + const int firstCol = cell.column(); + const double borderX = c->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 rightCell = c->asTable()->cellAt(row, lastCol + 1); - startRow = qMax(cell.row(), rightCell.row()); - endRow = qMin(lastRow, rightCell.isValid() ? rightCell.row() + rightCell.rowSpan() - 1 : lastRow); - TableCell topLeftCell = c->asTable()->cellAt(startRow - 1, lastCol); - TableCell topRightCell = c->asTable()->cellAt(startRow - 1, lastCol + 1); - TableCell bottomRightCell = c->asTable()->cellAt(endRow + 1, lastCol + 1); - TableCell bottomLeftCell = c->asTable()->cellAt(endRow + 1, lastCol); + TableCell leftCell = c->asTable()->cellAt(row, firstCol - 1); + startRow = qMax(cell.row(), leftCell.row()); + endRow = qMin(lastRow, leftCell.isValid() ? leftCell.row() + leftCell.rowSpan() - 1 : lastRow); + TableCell topLeftCell = c->asTable()->cellAt(startRow - 1, firstCol - 1); + TableCell topRightCell = c->asTable()->cellAt(startRow - 1, firstCol); + TableCell bottomRightCell = c->asTable()->cellAt(lastRow + 1, firstCol); + TableCell bottomLeftCell = c->asTable()->cellAt(lastRow + 1, firstCol - 1); TableBorder topLeft, top, topRight, border, bottomLeft, bottom, bottomRight; - resolveBordersVertical(topLeftCell, topRightCell, cell, rightCell, bottomLeftCell, bottomRightCell, + resolveBordersVertical(topLeftCell, topRightCell, leftCell, cell, bottomLeftCell, bottomRightCell, &topLeft, &top, &topRight, &border, &bottomLeft, &bottom, &bottomRight, c->asTable()); if (border.isNull()) continue; // Quit early if the border to paint is null. @@ -2404,67 +2434,67 @@ 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 = c->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 = c->asTable()->cellAt(row, firstCol - 1); - startRow = qMax(cell.row(), leftCell.row()); - endRow = qMin(lastRow, leftCell.isValid() ? leftCell.row() + leftCell.rowSpan() - 1 : lastRow); - TableCell topLeftCell = c->asTable()->cellAt(startRow - 1, firstCol - 1); - TableCell topRightCell = c->asTable()->cellAt(startRow - 1, firstCol); - TableCell bottomRightCell = c->asTable()->cellAt(lastRow + 1, firstCol); - TableCell bottomLeftCell = c->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, c->asTable()); - if (border.isNull()) - continue; // Quit early if the border to paint is null. - start.setY(c->asTable()->rowPosition(startRow)); - end.setY((c->asTable()->rowPosition(endRow) + c->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 < c->asTable()->rows(); ++row) - { - int colSpan = 0; - for (int col = 0; col < c->asTable()->columns(); col += colSpan) - { - TableCell cell = c->asTable()->cellAt(row, col); - if (row == cell.row()) + } + colSpan = cell.columnSpan(); + } + } + // Pass 3: Paint horizontal borders. + for (int row = 0; row < c->asTable()->rows(); ++row) + { + int colSpan = 0; + for (int col = 0; col < c->asTable()->columns(); col += colSpan) + { + TableCell cell = c->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 = (c->asTable()->rowPosition(lastRow) + c->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) { - const int lastRow = cell.row() + cell.rowSpan() - 1; + TableCell bottomCell = c->asTable()->cellAt(lastRow + 1, col); + startCol = qMax(cell.column(), bottomCell.column()); + endCol = qMin(lastCol, bottomCell.isValid() ? bottomCell.column() + bottomCell.columnSpan() - 1 : lastCol); + TableCell topLeftCell = c->asTable()->cellAt(lastRow, startCol - 1); + TableCell topRightCell = c->asTable()->cellAt(lastRow, endCol + 1); + TableCell bottomRightCell = c->asTable()->cellAt(lastRow + 1, endCol + 1); + TableCell bottomLeftCell = c->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, c->asTable()); + if (border.isNull()) + continue; // Quit early if the border is null. + start.setX(c->asTable()->columnPosition(startCol)); + end.setX(c->asTable()->columnPosition(endCol) + c->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 = (c->asTable()->rowPosition(lastRow) + c->asTable()->rowHeight(lastRow)); + const double borderY = c->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 bottomCell = c->asTable()->cellAt(lastRow + 1, col); - startCol = qMax(cell.column(), bottomCell.column()); - endCol = qMin(lastCol, bottomCell.isValid() ? bottomCell.column() + bottomCell.columnSpan() - 1 : lastCol); - TableCell topLeftCell = c->asTable()->cellAt(lastRow, startCol - 1); - TableCell topRightCell = c->asTable()->cellAt(lastRow, endCol + 1); - TableCell bottomRightCell = c->asTable()->cellAt(lastRow + 1, endCol + 1); - TableCell bottomLeftCell = c->asTable()->cellAt(lastRow + 1, startCol - 1); + TableCell topCell = c->asTable()->cellAt(firstRow - 1, col); + startCol = qMax(cell.column(), topCell.column()); + endCol = qMin(lastCol, topCell.isValid() ? topCell.column() + topCell.columnSpan() - 1 : lastCol); + TableCell topLeftCell = c->asTable()->cellAt(firstRow - 1, startCol - 1); + TableCell topRightCell = c->asTable()->cellAt(firstRow - 1, endCol + 1); + TableCell bottomRightCell = c->asTable()->cellAt(firstRow, endCol + 1); + TableCell bottomLeftCell = c->asTable()->cellAt(firstRow, startCol - 1); TableBorder topLeft, left, bottomLeft, border, topRight, right, bottomRight; - resolveBordersHorizontal(topLeftCell, cell, topRightCell, bottomLeftCell, bottomCell, - bottomRightCell, &topLeft, &left, &bottomLeft, &border, &topRight, &right, &bottomRight, c->asTable()); + resolveBordersHorizontal(topLeftCell, topCell, topRightCell, bottomLeftCell, cell, + bottomRightCell, &topLeft, &left, &bottomLeft, &border, &topRight, &right, &bottomRight, c->asTable()); if (border.isNull()) continue; // Quit early if the border is null. start.setX(c->asTable()->columnPosition(startCol)); @@ -2472,62 +2502,34 @@ 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 = c->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 = c->asTable()->cellAt(firstRow - 1, col); - startCol = qMax(cell.column(), topCell.column()); - endCol = qMin(lastCol, topCell.isValid() ? topCell.column() + topCell.columnSpan() - 1 : lastCol); - TableCell topLeftCell = c->asTable()->cellAt(firstRow - 1, startCol - 1); - TableCell topRightCell = c->asTable()->cellAt(firstRow - 1, endCol + 1); - TableCell bottomRightCell = c->asTable()->cellAt(firstRow, endCol + 1); - TableCell bottomLeftCell = c->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, c->asTable()); - if (border.isNull()) - continue; // Quit early if the border is null. - start.setX(c->asTable()->columnPosition(startCol)); - end.setX(c->asTable()->columnPosition(endCol) + c->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 < c->asTable()->rows(); ++row) - { - for (int col = 0; col < c->asTable()->columns(); col ++) - { - TableCell cell = c->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(m_Doc, a, textFrame, PNr, sep, farb, master, true); - PS_restore(); - } - } - } - PS_restore(); - break; - default: - break; + } + colSpan = cell.columnSpan(); + } + } + // Pass 4: Paint cell content. + for (int row = 0; row < c->asTable()->rows(); ++row) + { + for (int col = 0; col < c->asTable()->columns(); col ++) + { + TableCell cell = c->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(m_Doc, a, textFrame, PNr, sep, farb, master, true); + PS_restore(); + } + } } PS_restore(); - } + break; + default: + break; + } + PS_restore(); + return true; } _______________________________________________ scribus-commit mailing list scribus-commit@lists.scribus.net http://lists.scribus.net/mailman/listinfo/scribus-commit