summaryrefslogtreecommitdiffstats
path: root/scribus/stencilreader.cpp
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
commit7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch)
tree4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/stencilreader.cpp
downloadscribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/stencilreader.cpp')
-rw-r--r--scribus/stencilreader.cpp1865
1 files changed, 1865 insertions, 0 deletions
diff --git a/scribus/stencilreader.cpp b/scribus/stencilreader.cpp
new file mode 100644
index 0000000..f62d07c
--- /dev/null
+++ b/scribus/stencilreader.cpp
@@ -0,0 +1,1865 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "stencilreader.h"
+
+#include <QPixmap>
+#include <QRegExp>
+#include "commonstrings.h"
+#include "pageitem.h"
+#include "prefsmanager.h"
+#include "scclocale.h"
+#include "sccolor.h"
+#include "scpainter.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "splash.h"
+#include "units.h"
+#include "util_math.h"
+
+
+StencilReader::StencilReader()
+{
+}
+
+QString StencilReader::createShape(QString datain)
+{
+ QString tmp = "";
+ double GrW = 50.0;
+ double GrH = 50.0;
+ double Dx = 0.0;
+ double Dy = 0.0;
+ QDomDocument docu("scridoc");
+ docu.setContent(datain);
+ QDomElement elem=docu.documentElement();
+ if (elem.tagName() != "shape")
+ return tmp;
+ QDomNodeList list = elem.elementsByTagName("name");
+ if (list.count() == 0)
+ return tmp;
+ QString name = list.item(0).toElement().text();
+ QDomDocument data("scribus");
+ QString st="<SCRIBUSELEMUTF8></SCRIBUSELEMUTF8>";
+ data.setContent(st);
+ QDomElement group = data.documentElement();
+ QDomNodeList list2 = elem.elementsByTagName("svg:svg");
+ if (list2.count() == 0)
+ return tmp;
+ QDomElement svg = list2.item(0).toElement();
+ Conversion = 1.0;
+
+ group.setAttribute("XP", 0.0);
+ group.setAttribute("YP", 0.0);
+ group.setAttribute("Version", QString(VERSION));
+ PageColors.insert("Black", ScColor(0, 0, 0, 255));
+ QDomElement co = data.createElement("COLOR");
+ co.setAttribute("NAME","Black");
+ co.setAttribute("CMYK", "#000000FF");
+ co.setAttribute("Spot","0");
+ co.setAttribute("Register","0");
+ group.appendChild(co);
+ PageColors.insert("White", ScColor(0, 0, 0, 0));
+ QDomElement co2 = data.createElement("COLOR");
+ co2.setAttribute("NAME","White");
+ co2.setAttribute("CMYK", "#00000000");
+ co2.setAttribute("Spot","0");
+ co2.setAttribute("Register","0");
+ group.appendChild(co2);
+ QDomNode DOC = svg.firstChild();
+ double minXCoor = 0.0;
+ double minYCoor = 0.0;
+ double maxXCoor = 0.0;
+ double maxYCoor = 0.0;
+ int groupElemCounter = 0;
+ Conversion = 1.0;
+ bool firstCheck = true;
+ parseGroupProperties(data, group, DOC, groupElemCounter, minXCoor, minYCoor, maxXCoor, maxYCoor, firstCheck);
+ GrW = maxXCoor - minXCoor;
+ GrH = maxYCoor - minYCoor;
+ Conversion = 100.0 / qMax(GrW, GrH);
+ GrW *= Conversion;
+ GrH *= Conversion;
+ Dx = minXCoor * Conversion;
+ Dy = minYCoor* Conversion;
+ QDomElement obGroup;
+ if (groupElemCounter != 1)
+ {
+ group.setAttribute("COUNT", groupElemCounter+1);
+ obGroup = data.createElement("ITEM");
+ writeDefaults(obGroup);
+ obGroup.setAttribute("PWIDTH", 0);
+ obGroup.setAttribute("PCOLOR", "None");
+ obGroup.setAttribute("PCOLOR2", "None");
+ obGroup.setAttribute("PLINEART", Qt::SolidLine);
+ obGroup.setAttribute("PLINEEND", Qt::FlatCap);
+ obGroup.setAttribute("PLINEJOIN", Qt::MiterJoin);
+ obGroup.setAttribute("ANNAME", name.simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" ));
+ obGroup.setAttribute("GROUPS", 1);
+ obGroup.setAttribute("NUMGROUP", 1);
+ obGroup.setAttribute("isGroupControl", 1);
+ obGroup.setAttribute("PTYPE", PageItem::Polygon);
+ group.appendChild(obGroup);
+ }
+ else
+ group.setAttribute("COUNT", groupElemCounter);
+ int groupElemCounter2 = 0;
+ DOC = svg.firstChild();
+ parseGroup(data, group, DOC, groupElemCounter, groupElemCounter2, Dx, Dy);
+ if (groupElemCounter > 1)
+ {
+ obGroup.setAttribute("groupsLastItem", groupElemCounter2);
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ FPointArray PoLine;
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = GrW * rect[a];
+ double ya = GrH * rect[a+1];
+ double xb = GrW * rect[a+2];
+ double yb = GrH * rect[a+3];
+ PoLine.addPoint(0+xa, 0+ya);
+ PoLine.addPoint(0+xb, 0+yb);
+ }
+ obGroup.setAttribute("XPOS", 0);
+ obGroup.setAttribute("YPOS",0);
+ obGroup.setAttribute("WIDTH",GrW);
+ obGroup.setAttribute("HEIGHT",GrH);
+ obGroup.setAttribute("NUMPO", PoLine.size());
+ QString polp = "";
+ double xf, yf;
+ QString tmpSt, tmpSt2;
+ for (uint nxx=0; nxx<PoLine.size(); ++nxx)
+ {
+ PoLine.point(nxx, &xf, &yf);
+ polp += tmpSt.setNum(xf) + " " + tmpSt2.setNum(yf) + " ";
+ }
+ obGroup.setAttribute("POCOOR", polp);
+ }
+ group.setAttribute("W", GrW);
+ group.setAttribute("H", GrH);
+ return data.toString();
+}
+
+void StencilReader::parseGroup(QDomDocument &data, QDomElement &group, QDomNode &DOC, int groupElemCounter, int &groupElemCounter2, double Dx, double Dy)
+{
+ QString tmp = "";
+ QString FillCol = "White";
+ QString StrokeCol = "Black";
+ QString defFillCol = "White";
+ QString defStrokeCol = "Black";
+ QColor stroke = Qt::black;
+ QColor fill = Qt::white;
+ Qt::PenStyle Dash = Qt::SolidLine;
+ Qt::PenCapStyle LineEnd = Qt::FlatCap;
+ Qt::PenJoinStyle LineJoin = Qt::MiterJoin;
+ int fillStyle = 1;
+ double strokewidth = 0.1;
+ bool poly = false;
+ while(!DOC.isNull())
+ {
+ double x1, y1, x2, y2;
+ StrokeCol = defStrokeCol;
+ FillCol = defFillCol;
+ stroke = Qt::black;
+ fill = Qt::white;
+ fillStyle = 1;
+ strokewidth = 1.0;
+ Dash = Qt::SolidLine;
+ LineEnd = Qt::FlatCap;
+ LineJoin = Qt::MiterJoin;
+ FPointArray PoLine;
+ PoLine.resize(0);
+ QDomElement pg=DOC.toElement();
+ QString STag = pg.tagName();
+ QString style = pg.attribute( "style", "" ).simplified();
+ if (style.isEmpty())
+ style = pg.attribute( "svg:style", "" ).simplified();
+ if (!style.isEmpty())
+ {
+ FillCol = "None";
+ strokewidth = 0.1;
+ QStringList substyles = style.split(';', QString::SkipEmptyParts);
+ for( QStringList::Iterator it = substyles.begin(); it != substyles.end(); ++it )
+ {
+ QStringList substyle = (*it).split(':', QString::SkipEmptyParts);
+ QString command(substyle[0].trimmed());
+ QString params(substyle[1].trimmed());
+ if (command == "fill")
+ {
+ if ((params == "foreground") || (params == "fg") || (params == "inverse"))
+ FillCol = defStrokeCol;
+ else if ((params == "background") || (params == "bg"))
+ FillCol = defFillCol;
+ else if (params == "default")
+ FillCol = "None";
+ else if (params == "none")
+ FillCol = "None";
+ else
+ {
+ fill.setNamedColor( params );
+ if (fill == Qt::white)
+ FillCol = "White";
+ else if (fill == Qt::black)
+ FillCol = "Black";
+ else
+ FillCol = "FromDia"+fill.name();
+ }
+ }
+ else if (command == "stroke")
+ {
+ if ((params == "foreground") || (params == "fg"))
+ StrokeCol = defStrokeCol;
+ else if ((params == "background") || (params == "bg") || (params == "inverse"))
+ StrokeCol = defFillCol;
+ else if (params == "default")
+ StrokeCol = defStrokeCol;
+ else if (params == "none")
+ StrokeCol = "None";
+ else
+ {
+ stroke.setNamedColor( params );
+ if (stroke == Qt::white)
+ StrokeCol = "White";
+ else if (stroke == Qt::black)
+ StrokeCol = "Black";
+ else
+ StrokeCol = "FromDia"+stroke.name();
+ }
+ }
+ else if (command == "stroke-width")
+ strokewidth = ScCLocale::toDoubleC(params);
+ else if( command == "stroke-linejoin" )
+ {
+ if( params == "miter" )
+ LineJoin = Qt::MiterJoin;
+ else if( params == "round" )
+ LineJoin = Qt::RoundJoin;
+ else if( params == "bevel" )
+ LineJoin = Qt::BevelJoin;
+ }
+ else if( command == "stroke-linecap" )
+ {
+ if( params == "butt" )
+ LineEnd = Qt::FlatCap;
+ else if( params == "round" )
+ LineEnd = Qt::RoundCap;
+ else if( params == "square" )
+ LineEnd = Qt::SquareCap;
+ }
+ }
+ }
+ if (STag == "svg:line")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("x1")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("y1")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("x2")) * Conversion;
+ y2 = ScCLocale::toDoubleC(pg.attribute("y2")) * Conversion;
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x2, y2);
+ PoLine.addPoint(x2, y2);
+ }
+ else if (STag == "svg:rect")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("x")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("y")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("width")) * Conversion;
+ y2 = ScCLocale::toDoubleC(pg.attribute("height")) * Conversion;
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x2 * rect[a];
+ double ya = y2 * rect[a+1];
+ double xb = x2 * rect[a+2];
+ double yb = y2 * rect[a+3];
+ PoLine.addPoint(x1+xa, y1+ya);
+ PoLine.addPoint(x1+xb, y1+yb);
+ }
+ }
+ else if ((STag == "svg:polygon") || (STag == "svg:polyline"))
+ {
+ bool bFirst = true;
+ double x = 0.0;
+ double y = 0.0;
+ QString points = pg.attribute( "points" ).simplified().replace(',', " ");
+ QStringList pointList = points.split(' ', QString::SkipEmptyParts);
+ FirstM = true;
+ for( QStringList::Iterator it = pointList.begin(); it != pointList.end(); it++ )
+ {
+ if( bFirst )
+ {
+ x = ScCLocale::toDoubleC(*(it++));
+ y = ScCLocale::toDoubleC(*it);
+ svgMoveTo(x * Conversion, y * Conversion);
+ bFirst = false;
+ WasM = true;
+ }
+ else
+ {
+ x = ScCLocale::toDoubleC(*(it++));
+ y = ScCLocale::toDoubleC(*it);
+ svgLineTo(&PoLine, x * Conversion, y * Conversion);
+ }
+ }
+ if (STag == "svg:polygon")
+ svgClosePath(&PoLine);
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ }
+ else if (STag == "svg:circle")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("r")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("r")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("cx")) * Conversion - x1;
+ y2 = ScCLocale::toDoubleC(pg.attribute("cy")) * Conversion - y1;
+ x1 *= 2.0;
+ y1 *= 2.0;
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x2+xa, y2+ya);
+ PoLine.addPoint(x2+xb, y2+yb);
+ }
+ }
+ else if (STag == "svg:ellipse")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("rx")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("ry")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("cx")) * Conversion - x1;
+ y2 = ScCLocale::toDoubleC(pg.attribute("cy")) * Conversion - y1;
+ x1 *= 2.0;
+ y1 *= 2.0;
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x2+xa, y2+ya);
+ PoLine.addPoint(x2+xb, y2+yb);
+ }
+ }
+ else if (STag == "svg:path")
+ {
+ poly = parseSVG( pg.attribute( "d" ), &PoLine );
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ }
+ else if (STag == "svg:g")
+ {
+ QDomNode child = DOC.firstChild();
+ parseGroup(data, group, child, groupElemCounter, groupElemCounter2, Dx, Dy);
+ }
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ QDomElement ob = data.createElement("ITEM");
+ ob.setAttribute("PWIDTH", strokewidth);
+ ob.setAttribute("PCOLOR2", StrokeCol);
+ writeDefaults(ob);
+ ob.setAttribute("PLINEART", Dash);
+ ob.setAttribute("PLINEEND", LineEnd);
+ ob.setAttribute("PLINEJOIN", LineJoin);
+ if (groupElemCounter != 1)
+ {
+ ob.setAttribute("GROUPS", 1);
+ ob.setAttribute("NUMGROUP", 1);
+ }
+ else
+ {
+ ob.setAttribute("GROUPS", "");
+ ob.setAttribute("NUMGROUP", 0);
+ }
+ if ((STag == "svg:rect") || (STag == "svg:polygon") || (STag == "svg:circle") || (STag == "svg:ellipse"))
+ {
+ ob.setAttribute("PTYPE", PageItem::Polygon);
+ ob.setAttribute("PCOLOR", FillCol);
+ }
+ else if ((STag == "svg:line") || (STag == "svg:polyline"))
+ {
+ ob.setAttribute("PTYPE", PageItem::PolyLine);
+ ob.setAttribute("PCOLOR", "None");
+ }
+ else if (STag == "svg:path")
+ {
+ if (poly)
+ {
+ ob.setAttribute("PTYPE", PageItem::PolyLine);
+ ob.setAttribute("PCOLOR", "None");
+ }
+ else
+ {
+ ob.setAttribute("PTYPE", PageItem::Polygon);
+ ob.setAttribute("PCOLOR", FillCol);
+ }
+ }
+ FPoint tp2(getMinClipF(&PoLine));
+ PoLine.translate(-tp2.x(), -tp2.y());
+ FPoint wh = getMaxClipF(&PoLine);
+ ob.setAttribute("XPOS", tp2.x() - Dx);
+ ob.setAttribute("YPOS",tp2.y() - Dy);
+ ob.setAttribute("WIDTH",wh.x());
+ ob.setAttribute("HEIGHT",wh.y());
+ ob.setAttribute("NUMPO", PoLine.size());
+ QString polp = "";
+ double xf, yf;
+ QString tmpSt, tmpSt2;
+ for (uint nxx=0; nxx<PoLine.size(); ++nxx)
+ {
+ PoLine.point(nxx, &xf, &yf);
+ polp += tmpSt.setNum(xf) + " " + tmpSt2.setNum(yf) + " ";
+ }
+ ob.setAttribute("POCOOR", polp);
+ group.appendChild(ob);
+ groupElemCounter2++;
+ DOC = DOC.nextSibling();
+ }
+}
+
+void StencilReader::parseGroupProperties(QDomDocument &data, QDomElement &group, QDomNode &DOC, int &groupElemCounter, double &minXCoor, double &minYCoor, double &maxXCoor, double &maxYCoor, bool &firstCheck)
+{
+ QString FillCol = "White";
+ QString StrokeCol = "Black";
+ QColor stroke = Qt::black;
+ QColor fill = Qt::white;
+ while(!DOC.isNull())
+ {
+ double x1, y1, x2, y2;
+ FPointArray PoLine;
+ PoLine.resize(0);
+ QDomElement pg = DOC.toElement();
+ QString STag = pg.tagName();
+ QString style = pg.attribute( "style", "" ).simplified();
+ if (style.isEmpty())
+ style = pg.attribute( "svg:style", "" ).simplified();
+ QStringList substyles = style.split(';', QString::SkipEmptyParts);
+ for( QStringList::Iterator it = substyles.begin(); it != substyles.end(); ++it )
+ {
+ QStringList substyle = (*it).split(':', QString::SkipEmptyParts);
+ QString command(substyle[0].trimmed());
+ QString params(substyle[1].trimmed());
+ if (command == "fill")
+ {
+ if (!((params == "foreground") || (params == "background") || (params == "fg") || (params == "bg") || (params == "none") || (params == "default") || (params == "inverse")))
+ {
+ fill.setNamedColor( params );
+ FillCol = "FromDia"+fill.name();
+ }
+ }
+ else if (command == "stroke")
+ {
+ if (!((params == "foreground") || (params == "background") || (params == "fg") || (params == "bg") || (params == "none") || (params == "default")) || (params == "inverse"))
+ {
+ fill.setNamedColor( params );
+ FillCol = "FromDia"+fill.name();
+ }
+ }
+ ColorList::Iterator itc;
+ bool found = false;
+ int r, g, b;
+ QColor tmpR;
+ if ((fill == Qt::white) || (fill == Qt::black))
+ continue;
+ for (itc = PageColors.begin(); itc != PageColors.end(); ++itc)
+ {
+ if (itc.value().getColorModel() == colorModelRGB)
+ {
+ itc.value().getRGB(&r, &g, &b);
+ tmpR.setRgb(r, g, b);
+ if (fill == tmpR)
+ {
+ FillCol = itc.key();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ {
+ ScColor tmp;
+ tmp.fromQColor(fill);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ PageColors.insert(FillCol, tmp);
+ QDomElement co = data.createElement("COLOR");
+ co.setAttribute("NAME",FillCol);
+ co.setAttribute("RGB",fill.name());
+ co.setAttribute("Spot","0");
+ co.setAttribute("Register","0");
+ group.appendChild(co);
+ }
+ }
+ if (STag == "svg:line")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("x1")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("y1")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("x2")) * Conversion;
+ y2 = ScCLocale::toDoubleC(pg.attribute("y2")) * Conversion;
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x2, y2);
+ PoLine.addPoint(x2, y2);
+ }
+ else if (STag == "svg:rect")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("x")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("y")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("width")) * Conversion;
+ y2 = ScCLocale::toDoubleC(pg.attribute("height")) * Conversion;
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x2 * rect[a];
+ double ya = y2 * rect[a+1];
+ double xb = x2 * rect[a+2];
+ double yb = y2 * rect[a+3];
+ PoLine.addPoint(x1+xa, y1+ya);
+ PoLine.addPoint(x1+xb, y1+yb);
+ }
+ }
+ else if ((STag == "svg:polygon") || (STag == "svg:polyline"))
+ {
+ bool bFirst = true;
+ double x = 0.0;
+ double y = 0.0;
+ QString points = pg.attribute( "points" ).simplified().replace(',', " ");
+ QStringList pointList = points.split(' ', QString::SkipEmptyParts);
+ FirstM = true;
+ for( QStringList::Iterator it1 = pointList.begin(); it1 != pointList.end(); it1++ )
+ {
+ if( bFirst )
+ {
+ x = ScCLocale::toDoubleC(*(it1++));
+ y = ScCLocale::toDoubleC(*it1);
+ svgMoveTo(x * Conversion, y * Conversion);
+ bFirst = false;
+ WasM = true;
+ }
+ else
+ {
+ x = ScCLocale::toDoubleC(*(it1++));
+ y = ScCLocale::toDoubleC(*it1);
+ svgLineTo(&PoLine, x * Conversion, y * Conversion);
+ }
+ }
+ if (STag == "svg:polygon")
+ svgClosePath(&PoLine);
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ }
+ else if (STag == "svg:circle")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("r")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("r")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("cx")) * Conversion - x1;
+ y2 = ScCLocale::toDoubleC(pg.attribute("cy")) * Conversion - y1;
+ x1 *= 2.0;
+ y1 *= 2.0;
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x2+xa, y2+ya);
+ PoLine.addPoint(x2+xb, y2+yb);
+ }
+ }
+ else if (STag == "svg:ellipse")
+ {
+ x1 = ScCLocale::toDoubleC(pg.attribute("rx")) * Conversion;
+ y1 = ScCLocale::toDoubleC(pg.attribute("ry")) * Conversion;
+ x2 = ScCLocale::toDoubleC(pg.attribute("cx")) * Conversion - x1;
+ y2 = ScCLocale::toDoubleC(pg.attribute("cy")) * Conversion - y1;
+ x1 *= 2.0;
+ y1 *= 2.0;
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x2+xa, y2+ya);
+ PoLine.addPoint(x2+xb, y2+yb);
+ }
+ }
+ else if (STag == "svg:path")
+ {
+ parseSVG( pg.attribute( "d" ), &PoLine );
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ }
+ else if (STag == "svg:g")
+ {
+ QDomNode child = DOC.firstChild();
+ parseGroupProperties(data, group, child, groupElemCounter, minXCoor, minYCoor, maxXCoor, maxYCoor, firstCheck);
+ }
+ if (PoLine.size() < 4)
+ {
+ DOC = DOC.nextSibling();
+ continue;
+ }
+ groupElemCounter++;
+ FPoint tp2(getMinClipF(&PoLine));
+ PoLine.translate(-tp2.x(), -tp2.y());
+ FPoint wh(getMaxClipF(&PoLine));
+ if (firstCheck)
+ {
+ minXCoor = tp2.x();
+ minYCoor = tp2.y();
+ maxXCoor = tp2.x() + wh.x();
+ maxYCoor = tp2.y() + wh.y();
+ firstCheck = false;
+ }
+ else
+ {
+ minXCoor = qMin(minXCoor, tp2.x());
+ minYCoor = qMin(minYCoor, tp2.y());
+ maxXCoor = qMax(maxXCoor, tp2.x() + wh.x());
+ maxYCoor = qMax(maxYCoor, tp2.y() + wh.y());
+ }
+ DOC = DOC.nextSibling();
+ }
+}
+
+double StencilReader::parseUnit(const QString &unit)
+{
+ QString sCM(unitGetUntranslatedStrFromIndex(SC_CM));
+ QString sMM(unitGetUntranslatedStrFromIndex(SC_MM));
+ QString sIN(unitGetUntranslatedStrFromIndex(SC_IN));
+ QString sPT(unitGetUntranslatedStrFromIndex(SC_PT));
+ QString sPX("px");
+
+ bool noUnit = false;
+ QString unitval(unit);
+ if( unit.right( 2 ) == sPT )
+ unitval.replace( sPT, "" );
+ else if( unit.right( 2 ) == sCM )
+ unitval.replace( sCM, "" );
+ else if( unit.right( 2 ) == sMM )
+ unitval.replace( sMM , "" );
+ else if( unit.right( 2 ) == sIN )
+ unitval.replace( sIN, "" );
+ else if( unit.right( 2 ) == sPX )
+ unitval.replace( sPX, "" );
+ if (unitval == unit)
+ noUnit = true;
+ double value = ScCLocale::toDoubleC(unitval);
+ if( unit.right( 2 ) == sPT )
+ value = value;
+ else if( unit.right( 2 ) == sCM )
+ {
+ value = cm2pts(value);
+ Conversion = 1/unitGetRatioFromIndex(SC_CM);
+ }
+ else if( unit.right( 2 ) == sMM )
+ {
+ value = mm2pts(value);
+ Conversion = 1/unitGetRatioFromIndex(SC_MM);
+ }
+ else if( unit.right( 2 ) == sIN )
+ {
+ value = in2pts(value);
+ Conversion = 1/unitGetRatioFromIndex(SC_IN);
+ }
+ else if( unit.right( 2 ) == sPX )
+ {
+ value = value * 0.8;
+ Conversion = 0.8;
+ }
+ else if(noUnit)
+ value = value;
+ return value;
+}
+
+const char * StencilReader::getCoord( const char *ptr, double &number )
+{
+ int integer, exponent;
+ double decimal, frac;
+ int sign, expsign;
+
+ exponent = 0;
+ integer = 0;
+ frac = 1.0;
+ decimal = 0;
+ sign = 1;
+ expsign = 1;
+
+ // read the sign
+ if(*ptr == '+')
+ ptr++;
+ else if(*ptr == '-')
+ {
+ ptr++;
+ sign = -1;
+ }
+
+ // read the integer part
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ integer = (integer * 10) + *(ptr++) - '0';
+ if(*ptr == '.') // read the decimals
+ {
+ ptr++;
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ decimal += (*(ptr++) - '0') * (frac *= 0.1);
+ }
+
+ if(*ptr == 'e' || *ptr == 'E') // read the exponent part
+ {
+ ptr++;
+
+ // read the sign of the exponent
+ if(*ptr == '+')
+ ptr++;
+ else if(*ptr == '-')
+ {
+ ptr++;
+ expsign = -1;
+ }
+
+ exponent = 0;
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ {
+ exponent *= 10;
+ exponent += *ptr - '0';
+ ptr++;
+ }
+ }
+ number = integer + decimal;
+ number *= sign * pow( static_cast<double>(10), static_cast<double>( expsign * exponent ) );
+ // skip the following space
+ if(*ptr == ' ')
+ ptr++;
+
+ return ptr;
+}
+
+bool StencilReader::parseSVG( const QString &s, FPointArray *ite )
+{
+ QString d = s;
+ d = d.replace( QRegExp( "," ), " ");
+ bool ret = false;
+ if( !d.isEmpty() )
+ {
+ d = d.simplified();
+ QByteArray pathData = d.toLatin1();
+ const char *ptr = pathData.constData();
+ const char *end = pathData.constData() + pathData.length() + 1;
+ double contrlx, contrly, curx, cury, subpathx, subpathy, tox, toy, x1, y1, x2, y2, xc, yc;
+ double px1, py1, px2, py2, px3, py3;
+ bool relative;
+ FirstM = true;
+ char command = *(ptr++), lastCommand = ' ';
+ subpathx = subpathy = curx = cury = contrlx = contrly = 0.0;
+ while( ptr < end )
+ {
+ if( *ptr == ' ' )
+ ptr++;
+ relative = false;
+ switch( command )
+ {
+ case 'm':
+ relative = true;
+ case 'M':
+ {
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+ tox *= Conversion;
+ toy *= Conversion;
+ WasM = true;
+ subpathx = curx = relative ? curx + tox : tox;
+ subpathy = cury = relative ? cury + toy : toy;
+ svgMoveTo(curx, cury );
+ break;
+ }
+ case 'l':
+ relative = true;
+ case 'L':
+ {
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+ tox *= Conversion;
+ toy *= Conversion;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ svgLineTo(ite, curx, cury );
+ break;
+ }
+ case 'h':
+ {
+ ptr = getCoord( ptr, tox );
+ tox *= Conversion;
+ curx = curx + tox;
+ svgLineTo(ite, curx, cury );
+ break;
+ }
+ case 'H':
+ {
+ ptr = getCoord( ptr, tox );
+ tox *= Conversion;
+ curx = tox;
+ svgLineTo(ite, curx, cury );
+ break;
+ }
+ case 'v':
+ {
+ ptr = getCoord( ptr, toy );
+ toy *= Conversion;
+ cury = cury + toy;
+ svgLineTo(ite, curx, cury );
+ break;
+ }
+ case 'V':
+ {
+ ptr = getCoord( ptr, toy );
+ toy *= Conversion;
+ cury = toy;
+ svgLineTo(ite, curx, cury );
+ break;
+ }
+ case 'z':
+ case 'Z':
+ {
+ curx = subpathx;
+ cury = subpathy;
+ svgClosePath(ite);
+ break;
+ }
+ case 'c':
+ relative = true;
+ case 'C':
+ {
+ ptr = getCoord( ptr, x1 );
+ ptr = getCoord( ptr, y1 );
+ ptr = getCoord( ptr, x2 );
+ ptr = getCoord( ptr, y2 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+ tox *= Conversion;
+ toy *= Conversion;
+ x1 *= Conversion;
+ y1 *= Conversion;
+ x2 *= Conversion;
+ y2 *= Conversion;
+ px1 = relative ? curx + x1 : x1;
+ py1 = relative ? cury + y1 : y1;
+ px2 = relative ? curx + x2 : x2;
+ py2 = relative ? cury + y2 : y2;
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+ svgCurveToCubic(ite, px1, py1, px2, py2, px3, py3 );
+ contrlx = relative ? curx + x2 : x2;
+ contrly = relative ? cury + y2 : y2;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ break;
+ }
+ case 's':
+ relative = true;
+ case 'S':
+ {
+ ptr = getCoord( ptr, x2 );
+ ptr = getCoord( ptr, y2 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+ tox *= Conversion;
+ toy *= Conversion;
+ x2 *= Conversion;
+ y2 *= Conversion;
+ px1 = 2 * curx - contrlx;
+ py1 = 2 * cury - contrly;
+ px2 = relative ? curx + x2 : x2;
+ py2 = relative ? cury + y2 : y2;
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+ svgCurveToCubic(ite, px1, py1, px2, py2, px3, py3 );
+ contrlx = relative ? curx + x2 : x2;
+ contrly = relative ? cury + y2 : y2;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ break;
+ }
+ case 'q':
+ relative = true;
+ case 'Q':
+ {
+ ptr = getCoord( ptr, x1 );
+ ptr = getCoord( ptr, y1 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+ tox *= Conversion;
+ toy *= Conversion;
+ x1 *= Conversion;
+ y1 *= Conversion;
+ px1 = relative ? (curx + 2 * (x1 + curx)) * (1.0 / 3.0) : (curx + 2 * x1) * (1.0 / 3.0);
+ py1 = relative ? (cury + 2 * (y1 + cury)) * (1.0 / 3.0) : (cury + 2 * y1) * (1.0 / 3.0);
+ px2 = relative ? ((curx + tox) + 2 * (x1 + curx)) * (1.0 / 3.0) : (tox + 2 * x1) * (1.0 / 3.0);
+ py2 = relative ? ((cury + toy) + 2 * (y1 + cury)) * (1.0 / 3.0) : (toy + 2 * y1) * (1.0 / 3.0);
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+ svgCurveToCubic(ite, px1, py1, px2, py2, px3, py3 );
+ contrlx = relative ? curx + x1 : (tox + 2 * x1) * (1.0 / 3.0);
+ contrly = relative ? cury + y1 : (toy + 2 * y1) * (1.0 / 3.0);
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ break;
+ }
+ case 't':
+ relative = true;
+ case 'T':
+ {
+ ptr = getCoord(ptr, tox);
+ ptr = getCoord(ptr, toy);
+ tox *= Conversion;
+ toy *= Conversion;
+ xc = 2 * curx - contrlx;
+ yc = 2 * cury - contrly;
+ px1 = relative ? (curx + 2 * xc) * (1.0 / 3.0) : (curx + 2 * xc) * (1.0 / 3.0);
+ py1 = relative ? (cury + 2 * yc) * (1.0 / 3.0) : (cury + 2 * yc) * (1.0 / 3.0);
+ px2 = relative ? ((curx + tox) + 2 * xc) * (1.0 / 3.0) : (tox + 2 * xc) * (1.0 / 3.0);
+ py2 = relative ? ((cury + toy) + 2 * yc) * (1.0 / 3.0) : (toy + 2 * yc) * (1.0 / 3.0);
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+ svgCurveToCubic(ite, px1, py1, px2, py2, px3, py3 );
+ contrlx = xc;
+ contrly = yc;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ break;
+ }
+ }
+ lastCommand = command;
+ if(*ptr == '+' || *ptr == '-' || (*ptr >= '0' && *ptr <= '9'))
+ {
+ // there are still coords in this command
+ if(command == 'M')
+ command = 'L';
+ else if(command == 'm')
+ command = 'l';
+ }
+ else
+ command = *(ptr++);
+
+ if( lastCommand != 'C' && lastCommand != 'c' &&
+ lastCommand != 'S' && lastCommand != 's' &&
+ lastCommand != 'Q' && lastCommand != 'q' &&
+ lastCommand != 'T' && lastCommand != 't')
+ {
+ contrlx = curx;
+ contrly = cury;
+ }
+ }
+ if ((lastCommand != 'z') && (lastCommand != 'Z'))
+ ret = true;
+ if (ite->size() > 2)
+ {
+ if ((ite->point(0).x() == ite->point(ite->size()-2).x()) && (ite->point(0).y() == ite->point(ite->size()-2).y()))
+ ret = false;
+ }
+ }
+ return ret;
+}
+
+void StencilReader::svgMoveTo(double x1, double y1)
+{
+ CurrX = x1;
+ CurrY = y1;
+ StartX = x1;
+ StartY = y1;
+ PathLen = 0;
+}
+
+void StencilReader::svgLineTo(FPointArray *i, double x1, double y1)
+{
+ if ((!FirstM) && (WasM))
+ {
+ i->setMarker();
+ PathLen += 4;
+ }
+ FirstM = false;
+ WasM = false;
+ if (i->size() > 3)
+ {
+ FPoint b1 = i->point(i->size()-4);
+ FPoint b2 = i->point(i->size()-3);
+ FPoint b3 = i->point(i->size()-2);
+ FPoint b4 = i->point(i->size()-1);
+ FPoint n1 = FPoint(CurrX, CurrY);
+ FPoint n2 = FPoint(x1, y1);
+ if ((b1 == n1) && (b2 == n1) && (b3 == n2) && (b4 == n2))
+ return;
+ }
+ i->addPoint(FPoint(CurrX, CurrY));
+ i->addPoint(FPoint(CurrX, CurrY));
+ i->addPoint(FPoint(x1, y1));
+ i->addPoint(FPoint(x1, y1));
+ CurrX = x1;
+ CurrY = y1;
+ PathLen += 4;
+}
+
+void StencilReader::svgCurveToCubic(FPointArray *i, double x1, double y1, double x2, double y2, double x3, double y3)
+{
+ if ((!FirstM) && (WasM))
+ {
+ i->setMarker();
+ PathLen += 4;
+ }
+ FirstM = false;
+ WasM = false;
+ if (PathLen > 3)
+ {
+ FPoint b1 = i->point(i->size()-4);
+ FPoint b2 = i->point(i->size()-3);
+ FPoint b3 = i->point(i->size()-2);
+ FPoint b4 = i->point(i->size()-1);
+ FPoint n1 = FPoint(CurrX, CurrY);
+ FPoint n2 = FPoint(x1, y1);
+ FPoint n3 = FPoint(x3, y3);
+ FPoint n4 = FPoint(x2, y2);
+ if ((b1 == n1) && (b2 == n2) && (b3 == n3) && (b4 == n4))
+ return;
+ }
+ i->addPoint(FPoint(CurrX, CurrY));
+ i->addPoint(FPoint(x1, y1));
+ i->addPoint(FPoint(x3, y3));
+ i->addPoint(FPoint(x2, y2));
+ CurrX = x3;
+ CurrY = y3;
+ PathLen += 4;
+}
+
+void StencilReader::svgClosePath(FPointArray *i)
+{
+ if (PathLen > 2)
+ {
+ if ((PathLen == 4) || (i->point(i->size()-2).x() != StartX) || (i->point(i->size()-2).y() != StartY))
+ {
+ i->addPoint(i->point(i->size()-2));
+ i->addPoint(i->point(i->size()-3));
+ i->addPoint(FPoint(StartX, StartY));
+ i->addPoint(FPoint(StartX, StartY));
+ }
+ }
+}
+
+QPixmap StencilReader::createPreview(QString data)
+{
+ double pmmax;
+ double GrW = 50.0;
+ double GrH = 50.0;
+ QImage tmp = QImage(0, 0);
+ QColor stroke = Qt::black;
+ QColor fill = Qt::white;
+ Qt::PenStyle Dash = Qt::SolidLine;
+ Qt::PenCapStyle LineEnd = Qt::FlatCap;
+ Qt::PenJoinStyle LineJoin = Qt::MiterJoin;
+ int fillStyle = 1;
+ ScPainter *pS = NULL;
+ double strokewidth = 1.0;
+ QDomDocument docu("scridoc");
+ docu.setContent(data);
+ QDomElement elem=docu.documentElement();
+ if (elem.tagName() != "KivioShapeStencil")
+ return QPixmap();
+ QDomNodeList list = elem.elementsByTagName("Dimensions");
+ if (list.count() == 0)
+ return QPixmap();
+ QDomElement dims = list.item(0).toElement();
+ GrW = ScCLocale::toDoubleC(dims.attribute("w"), 50.0) + 10;
+ GrH = ScCLocale::toDoubleC(dims.attribute("h"), 50.0) + 10;
+ pmmax = 60 / qMax(GrW, GrH);
+ tmp = QImage(static_cast<int>(GrW), static_cast<int>(GrH), QImage::Format_ARGB32);
+ pS = new ScPainter(&tmp, tmp.width(), tmp.height());
+ pS->clear();
+ pS->translate(5, 5);
+ QDomNode DOC=elem.firstChild();
+ while(!DOC.isNull())
+ {
+ QDomElement pg=DOC.toElement();
+ if(pg.tagName()=="KivioShape")
+ {
+ stroke = Qt::black;
+ fill = Qt::white;
+ fillStyle = 1;
+ strokewidth = 1.0;
+ Dash = Qt::SolidLine;
+ LineEnd = Qt::FlatCap;
+ LineJoin = Qt::MiterJoin;
+ FPointArray PoLine;
+ PoLine.resize(0);
+ double x = 0.0;
+ double y = 0.0;
+ double x1 = 0.0;
+ double y1 = 0.0;
+ double currx = 0.0;
+ double curry = 0.0;
+ double startx = 0.0;
+ double starty = 0.0;
+ QString typ = pg.attribute("type");
+ QDomNode point = DOC.firstChild();
+ bool first = true;
+ int count = 0;
+ while(!point.isNull())
+ {
+ QDomElement pt = point.toElement();
+ if(pt.tagName()=="KivioFillStyle")
+ {
+ QString colnam = pt.attribute("color","#000000");
+ fill.setNamedColor("#"+colnam.right(6));
+ fillStyle = pt.attribute("colorStyle","1").toInt();
+ }
+ if(pt.tagName()=="KivioLineStyle")
+ {
+ QString colnam = pt.attribute("color","#FFFFFF");
+ stroke.setNamedColor("#"+colnam.right(6));
+ strokewidth = ScCLocale::toDoubleC(pt.attribute("width"), 1.0);
+ LineJoin = Qt::PenJoinStyle(pt.attribute("joinStyle", "0").toInt());
+ Dash = Qt::PenStyle(pt.attribute("pattern", "1").toInt());
+ LineEnd = Qt::PenCapStyle(pt.attribute("capStyle", "0").toInt());
+ }
+ if(pt.tagName()=="KivioPoint")
+ {
+ x = ScCLocale::toDoubleC(pt.attribute("x"));
+ y = ScCLocale::toDoubleC(pt.attribute("y"));
+ if (first)
+ {
+ currx = x;
+ curry = y;
+ startx = x;
+ starty = y;
+ first = false;
+ if (pt.attribute("type") == "bezier")
+ count = 0;
+ else
+ count = -1;
+ }
+ else
+ {
+ if (pt.attribute("type") != "bezier")
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ currx = x;
+ curry = y;
+ }
+ else
+ {
+ if (count == -1)
+ {
+ if (FPoint(currx, curry) != FPoint(x, y))
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ }
+ currx = x;
+ curry = y;
+ count++;
+ }
+ else if (count == 0)
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ count++;
+ }
+ else if (count == 1)
+ {
+ currx = x;
+ curry = y;
+ count++;
+ }
+ else if (count == 2)
+ {
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(currx, curry);
+ currx = x;
+ curry = y;
+ count = -1;
+ }
+ }
+ }
+ }
+ if(pt.tagName()=="Line")
+ {
+ if (!first)
+ PoLine.setMarker();
+ x = ScCLocale::toDoubleC(pt.attribute("x1"));
+ y = ScCLocale::toDoubleC(pt.attribute("y1"));
+ x1 = ScCLocale::toDoubleC(pt.attribute("x2"));
+ y1 = ScCLocale::toDoubleC(pt.attribute("y2"));
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x1, y1);
+ first = false;
+ }
+ point = point.nextSibling();
+ }
+ if ((typ == "Polygon") || (typ == "ClosedPath"))
+ {
+ pS->setBrush(fill);
+ pS->setFillMode(fillStyle);
+ pS->setLineWidth(strokewidth);
+ pS->setPen(stroke);
+ pS->setupPolygon(&PoLine);
+ pS->drawPolygon();
+ pS->drawPolyLine();
+ }
+ else if ((typ == "Bezier") || (typ == "OpenPath") || (typ == "LineArray") || (typ == "Polyline"))
+ {
+ pS->setPen(stroke, strokewidth, Dash, LineEnd, LineJoin);
+ pS->setupPolygon(&PoLine, false);
+ pS->drawPolyLine();
+ }
+ if (typ == "Rectangle")
+ {
+ pS->setBrush(fill);
+ pS->setFillMode(fillStyle);
+ pS->setPen(stroke, strokewidth, Dash, LineEnd, LineJoin);
+ x = ScCLocale::toDoubleC(pg.attribute("x"));
+ y = ScCLocale::toDoubleC(pg.attribute("y"));
+ x1 = ScCLocale::toDoubleC(pg.attribute("w"));
+ y1 = ScCLocale::toDoubleC(pg.attribute("h"));
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x+xa, y+ya);
+ PoLine.addPoint(x+xb, y+yb);
+ }
+ pS->setupPolygon(&PoLine);
+ pS->drawPolygon();
+ pS->drawPolyLine();
+ }
+ if (typ == "Ellipse")
+ {
+ pS->setBrush(fill);
+ pS->setFillMode(fillStyle);
+ pS->setPen(stroke, strokewidth, Dash, LineEnd, LineJoin);
+ x = ScCLocale::toDoubleC(pg.attribute("x"));
+ y = ScCLocale::toDoubleC(pg.attribute("y"));
+ x1 = ScCLocale::toDoubleC(pg.attribute("w"));
+ y1 = ScCLocale::toDoubleC(pg.attribute("h"));
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x+xa, y+ya);
+ PoLine.addPoint(x+xb, y+yb);
+ }
+ pS->setupPolygon(&PoLine);
+ pS->drawPolygon();
+ pS->drawPolyLine();
+ }
+ }
+ DOC = DOC.nextSibling();
+ }
+ if (pS)
+ {
+ pS->end();
+ delete pS;
+ }
+ QImage tmpi = tmp.scaled(static_cast<int>(tmp.width()*pmmax), static_cast<int>(tmp.height()*pmmax), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ QPixmap tmpil;
+ tmpil=QPixmap::fromImage(tmpi);
+ return tmpil;
+}
+
+void StencilReader::writeDefaults(QDomElement &ob)
+{
+ PrefsManager* prefsManager = PrefsManager::instance();
+ ob.setAttribute("OwnPage", 0);
+ ob.setAttribute("RADRECT", 0);
+ ob.setAttribute("FRTYPE", 3);
+ ob.setAttribute("CLIPEDIT", 1);
+ ob.setAttribute("TXTFILL", prefsManager->appPrefs.toolSettings.dPenText);
+ ob.setAttribute("TXTSTROKE", prefsManager->appPrefs.toolSettings.dStrokeText);
+ ob.setAttribute("TXTSTRSH", 100);
+ ob.setAttribute("TXTFILLSH", 100);
+ ob.setAttribute("TXTSCALE", 100);
+ ob.setAttribute("TXTSCALEV", 100);
+ ob.setAttribute("TXTBASE", 0);
+ ob.setAttribute("TXTSHX", 0);
+ ob.setAttribute("TXTSHY", 0);
+ ob.setAttribute("TXTOUT", 0);
+ ob.setAttribute("TXTULP", 0);
+ ob.setAttribute("TXTULW", 0);
+ ob.setAttribute("TXTSTP", 0);
+ ob.setAttribute("TXTSTW", 0);
+ ob.setAttribute("TXTSTYLE", 0);
+ ob.setAttribute("COLUMNS", 1);
+ ob.setAttribute("COLGAP", 0);
+ ob.setAttribute("NAMEDLST", "");
+ ob.setAttribute("SHADE", 100);
+ ob.setAttribute("SHADE2", 100);
+ ob.setAttribute("GRTYP", 0);
+ ob.setAttribute("ROT", 0);
+ ob.setAttribute("LINESP", 12);
+ ob.setAttribute("LINESPMode", 0);
+ ob.setAttribute("TXTKERN", 0);
+ ob.setAttribute("LOCALSCX", 100);
+ ob.setAttribute("LOCALSCY", 100);
+ ob.setAttribute("LOCALX", 0);
+ ob.setAttribute("LOCALY", 0);
+ ob.setAttribute("PICART", 1);
+ ob.setAttribute("PLTSHOW", 0);
+ ob.setAttribute("BASEOF", 0);
+ ob.setAttribute("FLIPPEDH", 0);
+ ob.setAttribute("FLIPPEDV", 0);
+ ob.setAttribute("IFONT", prefsManager->appPrefs.toolSettings.defFont);
+ ob.setAttribute("ISIZE", prefsManager->appPrefs.toolSettings.defSize / 10.0);
+ ob.setAttribute("SCALETYPE", 1);
+ ob.setAttribute("RATIO", 0);
+ ob.setAttribute("PRINTABLE", 1);
+ ob.setAttribute("ALIGN", "0");
+ ob.setAttribute("BOOKMARK", "0");
+ ob.setAttribute("fillRule", "1");
+ ob.setAttribute("TEXTFLOW", 0);
+ ob.setAttribute("TEXTFLOW2", 0);
+ ob.setAttribute("TEXTFLOW3", 0);
+ ob.setAttribute("AUTOTEXT", 0);
+ ob.setAttribute("EXTRA", 1);
+ ob.setAttribute("TEXTRA", 1);
+ ob.setAttribute("BEXTRA", 1);
+ ob.setAttribute("REXTRA", 1);
+ ob.setAttribute("PFILE","");
+ ob.setAttribute("PFILE2","");
+ ob.setAttribute("PFILE3","");
+ ob.setAttribute("PRFILE", "");
+ ob.setAttribute("EPROF", "");
+ ob.setAttribute("IRENDER", 1);
+ ob.setAttribute("EMBEDDED", 1);
+ ob.setAttribute("LOCK", 0);
+ ob.setAttribute("LOCKR", 0);
+ ob.setAttribute("REVERS", 0);
+ ob.setAttribute("TransValue", 0);
+ ob.setAttribute("TransValueS", 0);
+ ob.setAttribute("isTableItem", 0);
+ ob.setAttribute("TopLine", 0);
+ ob.setAttribute("LeftLine", 0);
+ ob.setAttribute("RightLine", 0);
+ ob.setAttribute("BottomLine", 0);
+ ob.setAttribute("LANGUAGE", prefsManager->appPrefs.Language);
+ ob.setAttribute("startArrowIndex", 0);
+ ob.setAttribute("endArrowIndex", 0);
+ ob.setAttribute("NUMDASH", 0);
+ ob.setAttribute("DASHS", "");
+ ob.setAttribute("DASHOFF", 0);
+ ob.setAttribute("NUMTEXT", 0);
+ ob.setAttribute("TEXTCOOR", "");
+ ob.setAttribute("BACKITEM", -1);
+ ob.setAttribute("BACKPAGE", -1);
+ ob.setAttribute("NEXTITEM", -1);
+ ob.setAttribute("NEXTPAGE", -1);
+ ob.setAttribute("NUMCO", 0);
+ ob.setAttribute("COCOOR", "");
+}
+
+QString StencilReader::createObjects(QString datain)
+{
+ double GrW = 50.0;
+ double GrH = 50.0;
+ QString tmp = "";
+ QColor stroke = Qt::black;
+ QColor fill = Qt::white;
+ Qt::PenStyle Dash = Qt::SolidLine;
+ Qt::PenCapStyle LineEnd = Qt::FlatCap;
+ Qt::PenJoinStyle LineJoin = Qt::MiterJoin;
+ int fillStyle = 1;
+ double strokewidth = 1.0;
+ QString FillCol = "White";
+ QString StrokeCol = "Black";
+ QDomDocument docu("scridoc");
+ docu.setContent(datain);
+ QDomElement elem=docu.documentElement();
+ if (elem.tagName() != "KivioShapeStencil")
+ return "";
+ QDomNodeList list = elem.elementsByTagName("Dimensions");
+ if (list.count() == 0)
+ return tmp;
+ QString name = "KivioGroup";
+ QDomNodeList descList = elem.elementsByTagName("Title");
+ if (descList.count() != 0)
+ {
+ QDomElement namElem = descList.item(0).toElement();
+ name = namElem.attribute("data", "");
+ }
+ QDomDocument data("scribus");
+ QString st="<SCRIBUSELEMUTF8></SCRIBUSELEMUTF8>";
+ data.setContent(st);
+ QDomElement group = data.documentElement();
+ QDomNodeList listItems = elem.elementsByTagName("KivioShape");
+ QDomElement dims = list.item(0).toElement();
+ GrW = ScCLocale::toDoubleC(dims.attribute("w"), 50.0);
+ GrH = ScCLocale::toDoubleC(dims.attribute("h"), 50.0);
+ group.setAttribute("W", GrW);
+ group.setAttribute("H", GrH);
+ group.setAttribute("XP", 0.0);
+ group.setAttribute("YP", 0.0);
+ group.setAttribute("Version", QString(VERSION));
+
+ PageColors.insert("Black", ScColor(0, 0, 0, 255));
+ QDomElement co = data.createElement("COLOR");
+ co.setAttribute("NAME","Black");
+ co.setAttribute("CMYK", "#000000FF");
+ co.setAttribute("Spot","0");
+ co.setAttribute("Register","0");
+ group.appendChild(co);
+ PageColors.insert("White", ScColor(0, 0, 0, 0));
+ QDomElement co2 = data.createElement("COLOR");
+ co2.setAttribute("NAME","White");
+ co2.setAttribute("CMYK", "#00000000");
+ co2.setAttribute("Spot","0");
+ co2.setAttribute("Register","0");
+ group.appendChild(co2);
+ QDomNodeList listStrokes = elem.elementsByTagName("KivioLineStyle");
+ for (int st = 0; st < listStrokes.count(); st++)
+ {
+ QDomElement str = listStrokes.item(st).toElement();
+ QString colnam = str.attribute("color","#ffffff");
+ stroke.setNamedColor("#"+colnam.right(6));
+ if ((stroke == Qt::white) || (stroke == Qt::black))
+ continue;
+ ColorList::Iterator it;
+ bool found = false;
+ int r, g, b;
+ QColor tmpR;
+ for (it = PageColors.begin(); it != PageColors.end(); ++it)
+ {
+ if (it.value().getColorModel() == colorModelRGB)
+ {
+ it.value().getRGB(&r, &g, &b);
+ tmpR.setRgb(r, g, b);
+ if (stroke == tmpR)
+ {
+ StrokeCol = it.key();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ {
+ ScColor tmp;
+ tmp.fromQColor(stroke);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ PageColors.insert("FromKivio"+stroke.name(), tmp);
+ StrokeCol = "FromKivio"+stroke.name();
+ QDomElement co = data.createElement("COLOR");
+ co.setAttribute("NAME",StrokeCol);
+ co.setAttribute("RGB",stroke.name());
+ co.setAttribute("Spot","0");
+ co.setAttribute("Register","0");
+ group.appendChild(co);
+ }
+ }
+ QDomNodeList listFills = elem.elementsByTagName("KivioFillStyle");
+ for (int st = 0; st < listFills.count(); st++)
+ {
+ QDomElement fil = listFills.item(st).toElement();
+ QString colnam = fil.attribute("color","#ffffff");
+ fill.setNamedColor("#"+colnam.right(6));
+ ColorList::Iterator it;
+ bool found = false;
+ int r, g, b;
+ QColor tmpR;
+ if ((fill == Qt::white) || (fill == Qt::black))
+ continue;
+ for (it = PageColors.begin(); it != PageColors.end(); ++it)
+ {
+ if (it.value().getColorModel() == colorModelRGB)
+ {
+ it.value().getRGB(&r, &g, &b);
+ tmpR.setRgb(r, g, b);
+ if (fill == tmpR)
+ {
+ FillCol = it.key();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ {
+ ScColor tmp;
+ tmp.fromQColor(fill);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ PageColors.insert("FromKivio"+fill.name(), tmp);
+ FillCol = "FromKivio"+fill.name();
+ QDomElement co = data.createElement("COLOR");
+ co.setAttribute("NAME",FillCol);
+ co.setAttribute("RGB",fill.name());
+ co.setAttribute("Spot","0");
+ co.setAttribute("Register","0");
+ group.appendChild(co);
+ }
+ }
+ QDomElement obGroup;
+ int groupElemCounter = 0;
+ if (listItems.count() != 1)
+ {
+ group.setAttribute("COUNT", listItems.count()+1);
+ obGroup = data.createElement("ITEM");
+ writeDefaults(obGroup);
+ obGroup.setAttribute("PWIDTH", 0);
+ obGroup.setAttribute("PCOLOR", "None");
+ obGroup.setAttribute("PCOLOR2", "None");
+ obGroup.setAttribute("PLINEART", Dash);
+ obGroup.setAttribute("PLINEEND", LineEnd);
+ obGroup.setAttribute("PLINEJOIN", LineJoin);
+ obGroup.setAttribute("ANNAME", name.simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" ));
+ obGroup.setAttribute("GROUPS", 1);
+ obGroup.setAttribute("NUMGROUP", 1);
+ obGroup.setAttribute("isGroupControl", 1);
+ obGroup.setAttribute("PTYPE", PageItem::Polygon);
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ FPointArray PoLine;
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = GrW * rect[a];
+ double ya = GrH * rect[a+1];
+ double xb = GrW * rect[a+2];
+ double yb = GrH * rect[a+3];
+ PoLine.addPoint(0+xa, 0+ya);
+ PoLine.addPoint(0+xb, 0+yb);
+ }
+ obGroup.setAttribute("XPOS", 0);
+ obGroup.setAttribute("YPOS",0);
+ obGroup.setAttribute("WIDTH",GrW);
+ obGroup.setAttribute("HEIGHT",GrH);
+ obGroup.setAttribute("NUMPO", PoLine.size());
+ QString polp = "";
+ double xf, yf;
+ QString tmpSt, tmpSt2;
+ for (uint nxx=0; nxx<PoLine.size(); ++nxx)
+ {
+ PoLine.point(nxx, &xf, &yf);
+ polp += tmpSt.setNum(xf) + " " + tmpSt2.setNum(yf) + " ";
+ }
+ obGroup.setAttribute("POCOOR", polp);
+ group.appendChild(obGroup);
+ }
+ else
+ group.setAttribute("COUNT", listItems.count());
+ QDomNode DOC=elem.firstChild();
+ while(!DOC.isNull())
+ {
+ QDomElement pg=DOC.toElement();
+ if(pg.tagName()=="KivioShape")
+ {
+ FillCol = "White";
+ StrokeCol = "Black";
+ fillStyle = 1;
+ strokewidth = 1.0;
+ Dash = Qt::SolidLine;
+ LineEnd = Qt::FlatCap;
+ LineJoin = Qt::MiterJoin;
+ FPointArray PoLine;
+ PoLine.resize(0);
+ double x = 0.0;
+ double y = 0.0;
+ double x1 = 0.0;
+ double y1 = 0.0;
+ double currx = 0.0;
+ double curry = 0.0;
+ double startx = 0.0;
+ double starty = 0.0;
+ QString typ = pg.attribute("type");
+ QDomNode point = DOC.firstChild();
+ bool first = true;
+ int count = 0;
+ while(!point.isNull())
+ {
+ QDomElement pt = point.toElement();
+ if(pt.tagName()=="KivioFillStyle")
+ {
+ fillStyle = pt.attribute("colorStyle","1").toInt();
+ QString colnam = pt.attribute("color","#000000");
+ fill.setNamedColor("#"+colnam.right(6));
+ if (fillStyle == 0)
+ FillCol = CommonStrings::None;
+ else
+ {
+ if (fill == Qt::white)
+ FillCol = "White";
+ else if (fill == Qt::black)
+ FillCol = "Black";
+ else
+ FillCol = "FromKivio"+fill.name();
+ }
+ }
+ if(pt.tagName()=="KivioLineStyle")
+ {
+ QString colnam = pt.attribute("color","#ffffff");
+ stroke.setNamedColor("#"+colnam.right(6));
+ if (stroke == Qt::white)
+ StrokeCol = "White";
+ else if (stroke == Qt::black)
+ StrokeCol = "Black";
+ else
+ StrokeCol = "FromKivio"+stroke.name();
+ strokewidth = ScCLocale::toDoubleC(pt.attribute("width"), 1.0);
+ LineJoin = Qt::PenJoinStyle(pt.attribute("joinStyle", "0").toInt());
+ Dash = Qt::PenStyle(pt.attribute("pattern", "1").toInt());
+ LineEnd = Qt::PenCapStyle(pt.attribute("capStyle", "0").toInt());
+ }
+ if(pt.tagName()=="KivioPoint")
+ {
+ x = ScCLocale::toDoubleC(pt.attribute("x"));
+ y = ScCLocale::toDoubleC(pt.attribute("y"));
+ if (first)
+ {
+ currx = x;
+ curry = y;
+ startx = x;
+ starty = y;
+ first = false;
+ if (pt.attribute("type") == "bezier")
+ count = 0;
+ else
+ count = -1;
+ }
+ else
+ {
+ if (pt.attribute("type") != "bezier")
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ currx = x;
+ curry = y;
+ }
+ else
+ {
+ if (count == -1)
+ {
+ if (FPoint(currx, curry) != FPoint(x, y))
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ }
+ currx = x;
+ curry = y;
+ count++;
+ }
+ else if (count == 0)
+ {
+ PoLine.addPoint(currx, curry);
+ PoLine.addPoint(x, y);
+ count++;
+ }
+ else if (count == 1)
+ {
+ currx = x;
+ curry = y;
+ count++;
+ }
+ else if (count == 2)
+ {
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(currx, curry);
+ currx = x;
+ curry = y;
+ count = -1;
+ }
+ }
+ }
+ }
+ if(pt.tagName()=="Line")
+ {
+ if (!first)
+ PoLine.setMarker();
+ x = ScCLocale::toDoubleC(pt.attribute("x1"));
+ y = ScCLocale::toDoubleC(pt.attribute("y1"));
+ x1 = ScCLocale::toDoubleC(pt.attribute("x2"));
+ y1 = ScCLocale::toDoubleC(pt.attribute("y2"));
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x, y);
+ PoLine.addPoint(x1, y1);
+ PoLine.addPoint(x1, y1);
+ first = false;
+ }
+ point = point.nextSibling();
+ }
+ QDomElement ob = data.createElement("ITEM");
+ writeDefaults(ob);
+ ob.setAttribute("PWIDTH", strokewidth);
+ if (typ == "TextBox")
+ {
+ ob.setAttribute("PCOLOR", CommonStrings::None);
+ ob.setAttribute("PCOLOR2", CommonStrings::None);
+ }
+ else
+ {
+ ob.setAttribute("PCOLOR", FillCol);
+ ob.setAttribute("PCOLOR2", StrokeCol);
+ }
+ ob.setAttribute("PLINEART", Dash);
+ ob.setAttribute("PLINEEND", LineEnd);
+ ob.setAttribute("PLINEJOIN", LineJoin);
+ ob.setAttribute("ANNAME", pg.attribute("name"));
+ if (listItems.count() != 1)
+ {
+ ob.setAttribute("GROUPS", 1);
+ ob.setAttribute("NUMGROUP", 1);
+ }
+ else
+ {
+ ob.setAttribute("GROUPS", "");
+ ob.setAttribute("NUMGROUP", 0);
+ }
+ bool valid = false;
+ if ((typ == "Polygon") || (typ == "ClosedPath"))
+ {
+ ob.setAttribute("PTYPE", PageItem::Polygon);
+ valid = true;
+ }
+ else if ((typ == "Bezier") || (typ == "OpenPath") || (typ == "LineArray") || (typ == "Polyline"))
+ {
+ ob.setAttribute("PTYPE", PageItem::PolyLine);
+ valid = true;
+ }
+ else if ((typ == "Rectangle") || (typ == "TextBox"))
+ {
+ if (typ == "Rectangle")
+ ob.setAttribute("PTYPE", PageItem::Polygon);
+ else
+ ob.setAttribute("PTYPE", PageItem::TextFrame);
+ x = ScCLocale::toDoubleC(pg.attribute("x"));
+ y = ScCLocale::toDoubleC(pg.attribute("y"));
+ x1 = ScCLocale::toDoubleC(pg.attribute("w"));
+ y1 = ScCLocale::toDoubleC(pg.attribute("h"));
+ static double rect[] = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0};
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x+xa, y+ya);
+ PoLine.addPoint(x+xb, y+yb);
+ }
+ valid = true;
+ }
+ else if (typ == "Ellipse")
+ {
+ ob.setAttribute("PTYPE", PageItem::Polygon);
+ x = ScCLocale::toDoubleC(pg.attribute("x"));
+ y = ScCLocale::toDoubleC(pg.attribute("y"));
+ x1 = ScCLocale::toDoubleC(pg.attribute("w"));
+ y1 = ScCLocale::toDoubleC(pg.attribute("h"));
+ static double rect[] = {1.0, 0.5, 1.0, 0.77615235,0.5, 1.0, 0.77615235, 1.0,
+ 0.5, 1.0, 0.22385765, 1.0, 0.0, 0.5, 0.0, 0.77615235,
+ 0.0, 0.5, 0.0, 0.22385765, 0.5, 0.0, 0.22385765, 0.0,
+ 0.5, 0.0, 0.77615235, 0.0, 1.0, 0.5, 1.0, 0.22385765};
+ PoLine.resize(0);
+ for (int a = 0; a < 29; a += 4)
+ {
+ double xa = x1 * rect[a];
+ double ya = y1 * rect[a+1];
+ double xb = x1 * rect[a+2];
+ double yb = y1 * rect[a+3];
+ PoLine.addPoint(x+xa, y+ya);
+ PoLine.addPoint(x+xb, y+yb);
+ }
+ valid = true;
+ }
+ FPoint tp2(getMinClipF(&PoLine));
+ PoLine.translate(-tp2.x(), -tp2.y());
+ FPoint wh = getMaxClipF(&PoLine);
+ ob.setAttribute("XPOS", tp2.x());
+ ob.setAttribute("YPOS",tp2.y());
+ ob.setAttribute("WIDTH",wh.x());
+ ob.setAttribute("HEIGHT",wh.y());
+ ob.setAttribute("NUMPO", PoLine.size());
+ QString polp = "";
+ double xf, yf;
+ QString tmpSt, tmpSt2;
+ for (uint nxx=0; nxx<PoLine.size(); ++nxx)
+ {
+ PoLine.point(nxx, &xf, &yf);
+ polp += tmpSt.setNum(xf) + " " + tmpSt2.setNum(yf) + " ";
+ }
+ ob.setAttribute("POCOOR", polp);
+ if (valid)
+ {
+ group.appendChild(ob);
+ groupElemCounter++;
+ }
+ }
+ DOC = DOC.nextSibling();
+ }
+ if (listItems.count() != 1)
+ obGroup.setAttribute("groupsLastItem", groupElemCounter);
+ return data.toString();
+}