1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 /***************************************************************************
8                           importxar.h  -  description
9                              -------------------
10     begin                : Wed Nov 25 2009
11     copyright            : (C) 2009 by Franz Schmid
12     email                : Franz.Schmid@altmuehlnet.de
13  ***************************************************************************/
14 
15 #ifndef IMPORTXAR_H
16 #define IMPORTXAR_H
17 
18 
19 #include "pluginapi.h"
20 #include "commonstrings.h"
21 #include "pageitem.h"
22 #include "sccolor.h"
23 #include "fpointarray.h"
24 #include <QList>
25 #include <QTransform>
26 #include <QMultiMap>
27 #include <QtGlobal>
28 #include <QObject>
29 #include <QString>
30 #include <QRect>
31 #include <QStack>
32 
33 class MultiProgressDialog;
34 class ScribusDoc;
35 class Selection;
36 class TransactionSettings;
37 
38 class XarStyle
39 {
40 public:
XarStyle()41 	XarStyle() :
42 		dashOffset(0),
43 		FontFamily(""),
44 		FontSize(16.0),
45 		LineHeight(15.0),
46 		LineWidth(0.0),
47 		LineWidth2(0.0),
48 		FontStretch(1.0),
49 		FontKerning(0.0),
50 		FontBold(false),
51 		FontUnderline(false),
52 		FontItalic(false),
53 		TextAlignment(0),
54 		TextLeftIndent(0),
55 		FillCol(CommonStrings::None),
56 		fillRule(true),
57 		FillGradient(VGradient::linear),
58 		StrokeGradient(VGradient::linear),
59 		MaskGradient(VGradient::linear),
60 		FillGradientType(0),
61 		StrokeGradientType(0),
62 		GradFillX1(0),
63 		GradFillX2(0),
64 		GradFillY1(0),
65 		GradFillY2(0),
66 		GrScale(1),
67 		GrSkew(0),
68 		GradStrokeX1(0),
69 		GradStrokeX2(0),
70 		GradStrokeY1(0),
71 		GradStrokeY2(0),
72 		GradMask(0),
73 		GradMaskX1(0),
74 		GradMaskX2(0),
75 		GradMaskY1(0),
76 		GradMaskY2(0),
77 		GradMaskScale(1),
78 		GradMaskSkew(0),
79 		LWidth(0.5),
80 		PLineArt(Qt::SolidLine),
81 		PLineEnd(Qt::FlatCap),
82 		PLineJoin(Qt::BevelJoin),
83 		StrokeCol("Black"),
84 		FillOpacity(0.0),
85 		FillBlend(0),
86 		StrokeOpacity(0.0),
87 		StrokeBlend(0),
88 		clipPath(),
89 		fillPattern(""),
90 		patternScaleX(1),
91 		patternScaleY(1),
92 		patternOffsetX(0),
93 		patternOffsetY(0),
94 		patternRotation(0),
95 		patternSkewX(0),
96 		patternSkewY(0),
97 		maskPattern(""),
98 		patternMaskScaleX(1),
99 		patternMaskScaleY(1),
100 		patternMaskOffsetX(0),
101 		patternMaskOffsetY(0),
102 		patternMaskRotation(0),
103 		patternMaskSkewX(0),
104 		patternMaskSkewY(0),
105 		strokePattern(""),
106 		patternScaleXS(1),
107 		patternScaleYS(1),
108 		patternOffsetXS(0),
109 		patternOffsetYS(0),
110 		patternRotationS(0),
111 		patternSkewXS(0),
112 		patternSkewYS(0),
113 		patternSpace(0),
114 		patternStrokePath(false),
115 		GrControl1(FPoint()),
116 		GrControl2(FPoint()),
117 		GrControl3(FPoint()),
118 		GrControl4(FPoint()),
119 		GrControl5(FPoint()),
120 		GrColorP1(""),
121 		GrColorP2(""),
122 		GrColorP3(""),
123 		GrColorP4(""),
124 		GrCol1transp(1.0),
125 		GrCol2transp(1.0),
126 		GrCol3transp(1.0),
127 		GrCol4transp(1.0),
128 		GrCol1Shade(100),
129 		GrCol2Shade(100),
130 		GrCol3Shade(100),
131 		GrCol4Shade(100),
132 		Elements()
133 		{
134 		}
135 	QVector<double> dashArray;
136 	double dashOffset;
137 	QString FontFamily;
138 	double FontSize;
139 	double LineHeight;
140 	double LineWidth;
141 	double LineWidth2;
142 	double FontStretch;
143 	double FontKerning;
144 	bool FontBold;
145 	bool FontUnderline;
146 	bool FontItalic;
147 	int TextAlignment;
148 	double TextLeftIndent;
149 	QString FillCol;
150 	bool fillRule;
151 	VGradient FillGradient;
152 	VGradient StrokeGradient;
153 	VGradient MaskGradient;
154 	int    FillGradientType;
155 	int    StrokeGradientType;
156 	double GradFillX1;
157 	double GradFillX2;
158 	double GradFillY1;
159 	double GradFillY2;
160 	double GrScale;
161 	double GrSkew;
162 	double GradStrokeX1;
163 	double GradStrokeX2;
164 	double GradStrokeY1;
165 	double GradStrokeY2;
166 	int    GradMask;
167 	double GradMaskX1;
168 	double GradMaskX2;
169 	double GradMaskY1;
170 	double GradMaskY2;
171 	double GradMaskScale;
172 	double GradMaskSkew;
173 	double LWidth;
174 	Qt::PenStyle PLineArt;
175 	Qt::PenCapStyle PLineEnd;
176 	Qt::PenJoinStyle PLineJoin;
177 	QString StrokeCol;
178 	double FillOpacity;
179 	int    FillBlend;
180 	double StrokeOpacity;
181 	int    StrokeBlend;
182 	FPointArray clipPath;
183 	QString fillPattern;
184 	double patternScaleX;
185 	double patternScaleY;
186 	double patternOffsetX;
187 	double patternOffsetY;
188 	double patternRotation;
189 	double patternSkewX;
190 	double patternSkewY;
191 	QString maskPattern;
192 	double patternMaskScaleX;
193 	double patternMaskScaleY;
194 	double patternMaskOffsetX;
195 	double patternMaskOffsetY;
196 	double patternMaskRotation;
197 	double patternMaskSkewX;
198 	double patternMaskSkewY;
199 	QString strokePattern;
200 	double patternScaleXS;
201 	double patternScaleYS;
202 	double patternOffsetXS;
203 	double patternOffsetYS;
204 	double patternRotationS;
205 	double patternSkewXS;
206 	double patternSkewYS;
207 	double patternSpace;
208 	bool   patternStrokePath;
209 	FPoint GrControl1;
210 	FPoint GrControl2;
211 	FPoint GrControl3;
212 	FPoint GrControl4;
213 	FPoint GrControl5;
214 	QString GrColorP1;
215 	QString GrColorP2;
216 	QString GrColorP3;
217 	QString GrColorP4;
218 	double GrCol1transp;
219 	double GrCol2transp;
220 	double GrCol3transp;
221 	double GrCol4transp;
222 	int GrCol1Shade;
223 	int GrCol2Shade;
224 	int GrCol3Shade;
225 	int GrCol4Shade;
226 	QList<PageItem*> Elements;
227 };
228 
229 //! \brief Xar (Xara) importer plugin
230 class XarPlug : public QObject
231 {
232 	Q_OBJECT
233 
234 public:
235 	/*!
236 	\author Franz Schmid
237 	\date
238 	\brief Create the Xar importer window.
239 	\param fName QString
240 	\param flags combination of loadFlags
241 	\param showProgress if progress must be displayed
242 	\retval EPSPlug plugin
243 	*/
244 	XarPlug( ScribusDoc* doc, int flags );
245 	~XarPlug();
246 
247 	/*!
248 	\author Franz Schmid
249 	\date
250 	\brief Perform import.
251 	\param fn QString
252 	\param trSettings undo transaction settings
253 	\param flags combination of loadFlags
254 	\param showProgress if progress must be displayed
255 	\retval bool true if import was ok
256 	 */
257 	bool import(const QString& fn, const TransactionSettings& trSettings, int flags, bool showProgress = true);
258 	QImage readThumbnail(const QString& fn);
259 	bool readColors(const QString& fileName, ColorList & colors);
260 
261 private:
262 	void parseHeader(const QString& fName, double &x, double &y, double &b, double &h);
263 	bool convert(const QString& fn);
264 	void parseXar(QDataStream &ts);
265 	void handleTags(quint32 tag, quint32 dataLen, QDataStream &ts);
266 	void createGuideLine(QDataStream &ts);
267 	void handleTextFontSize(QDataStream &ts);
268 	void defineTextFontFace(QDataStream &ts, quint32 dataLen);
269 	void handleTextFont(QDataStream &ts);
270 	void handleTextString(QDataStream &ts, quint32 dataLen);
271 	void handleTextChar(QDataStream &ts);
272 	void handleTextWrap(QDataStream &ts);
273 	void handleTextIndent(QDataStream &ts);
274 	void handleLineInfo(QDataStream &ts);
275 	void handleTextAlignment(quint32 tag);
276 	void handleTextTracking(QDataStream &ts);
277 	void handleTextKerning(QDataStream &ts);
278 	void handleTextAspectRatio(QDataStream &ts);
279 	void handleTextBaseline(QDataStream &ts);
280 	void startTextLine();
281 	void endTextLine();
282 	void startSimpleText(QDataStream &ts, quint32 dataLen);
283 	void startComplexText(QDataStream &ts, quint32 dataLen);
284 	void startSimplePathText(QDataStream &ts, quint32 dataLen, int type);
285 	void startComplexPathText(QDataStream &ts, quint32 dataLen, int type);
286 	void handleFillRule(QDataStream &ts);
287 	void handleLineEnd(QDataStream &ts);
288 	void handleLineJoin(QDataStream &ts);
289 	void handleQuickShapeSimple(QDataStream &ts, quint32 dataLen);
290 	void handleFlatFillTransparency(QDataStream &ts);
291 	void handleSimpleGradientTransparency(QDataStream &ts, quint32 dataLen, bool linear);
292 	void handleSimpleGradientTransparencySkewed(QDataStream &ts, quint32 dataLen);
293 	void handleEllipticalGradientTransparency(QDataStream &ts, quint32 dataLen);
294 	void handleBitmapTransparency(QDataStream &ts, quint32 dataLen);
295 	int  convertBlendMode(int val);
296 	void handleSimpleGradientElliptical(QDataStream &ts, quint32 dataLen);
297 	void handleMultiGradientElliptical(QDataStream &ts);
298 	void handleMultiGradientSkewed(QDataStream &ts);
299 	void handleMultiGradient(QDataStream &ts, bool linear);
300 	void handleSimpleGradientSkewed(QDataStream &ts, quint32 dataLen);
301 	void handleSimpleGradient(QDataStream &ts, quint32 dataLen, bool linear);
302 	void handleMultiDiamondGradient(QDataStream &ts);
303 	void handleSimpleDiamondGradient(QDataStream &ts, quint32 dataLen);
304 	void handleFourColorGradient(QDataStream &ts);
305 	void handleBitmapFill(QDataStream &ts, quint32 dataLen);
306 	void handleContoneBitmapFill(QDataStream &ts, quint32 dataLen);
307 	void handleBitmap(QDataStream &ts);
308 	void defineBitmap(QDataStream &ts, quint32 dataLen, quint32 tag);
309 	void handleLineColor(QDataStream &ts);
310 	void handleLineWidth(QDataStream &ts);
311 	void handleFlatLineTransparency(QDataStream &ts);
312 	void handleFlatFill(QDataStream &ts);
313 	void createRectangleItem(QDataStream &ts, bool ellipse = false);
314 	void createSimilarItem(QDataStream &ts);
315 	void createPolylineItem(int type);
316 	void createPolygonItem(int type);
317 	void handleBrushItem(QDataStream &ts);
318 	void createBrushItem(QDataStream &ts);
319 	void createGroupItem();
320 	void createClipItem();
321 	void finishClip();
322 	void finishItem(int z);
323 	bool handlePathRel(QDataStream &ts, quint32 len);
324 	void handleLayerInfo(QDataStream &ts);
325 	void handleSpreadInfo(QDataStream &ts);
326 	void handleFirstPage(QDataStream &ts);
327 	void handlePage(QDataStream &ts);
328 	void handleComplexColor(QDataStream &ts);
329 	void handleColorRGB(QDataStream &ts);
330 	double decodeColorComponent(quint32 data);
331 	double decodeFixed16(quint32 data);
332 	void readCoords(QDataStream &ts, double &x, double &y);
333 	void addToAtomic(quint32 dataLen, QDataStream &ts);
334 	void addGraphicContext();
335 	void popGraphicContext();
336 
337 	int importerFlags;
338 	int recordCounter;
339 	int currentLayer;
340 	int pathTextType;
341 	int pathGcStackIndex;
342 	double baseX, baseY;
343 	double docWidth;
344 	double docHeight;
345 	int pagecount;
346 	double TextX;
347 	double TextY;
348 	double textRotation;
349 	double textSkew;
350 	bool firstLayer;
351 	bool interactive;
352 	bool cancel;
353 	bool inTextLine;
354 	bool inTextBlock;
355 	bool isPathText;
356 	bool recordPath;
357 	QTransform textMatrix;
358 	struct XarColor
359 	{
360 		quint32 colorType;
361 		quint32 colorModel;
362 		quint32 colorRef;
363 		double component1;
364 		double component2;
365 		double component3;
366 		double component4;
367 		QString name;
368 	};
369 	struct XarGroup
370 	{
371 		int index;
372 		int gcStackDepth;
373 		bool clipping;
374 		bool isBrush;
375 		quint32 idNr;
376 		PageItem* groupItem;
377 	};
378 	struct XarText
379 	{
380 		QString FontFamily;
381 		QString itemText;
382 		double FontSize;
383 		double FontStretch;
384 		double FontKerning;
385 		bool FontBold;
386 		bool FontUnderline;
387 		bool FontItalic;
388 		QString FillCol;
389 		VGradient FillGradient;
390 		VGradient StrokeGradient;
391 		VGradient MaskGradient;
392 		int    FillGradientType;
393 		int    StrokeGradientType;
394 		double GradFillX1;
395 		double GradFillX2;
396 		double GradFillY1;
397 		double GradFillY2;
398 		double GrScale;
399 		double GrSkew;
400 		FPoint GrControl1;
401 		FPoint GrControl2;
402 		FPoint GrControl3;
403 		FPoint GrControl4;
404 		FPoint GrControl5;
405 		QString GrColorP1;
406 		QString GrColorP2;
407 		QString GrColorP3;
408 		QString GrColorP4;
409 		double GrCol1transp;
410 		double GrCol2transp;
411 		double GrCol3transp;
412 		double GrCol4transp;
413 		int GrCol1Shade;
414 		int GrCol2Shade;
415 		int GrCol3Shade;
416 		int GrCol4Shade;
417 		double GradStrokeX1;
418 		double GradStrokeX2;
419 		double GradStrokeY1;
420 		double GradStrokeY2;
421 		int    GradMask;
422 		double GradMaskX1;
423 		double GradMaskX2;
424 		double GradMaskY1;
425 		double GradMaskY2;
426 		double GradMaskScale;
427 		double GradMaskSkew;
428 		double LWidth;
429 		Qt::PenStyle PLineArt;
430 		Qt::PenCapStyle PLineEnd;
431 		Qt::PenJoinStyle PLineJoin;
432 		QString StrokeCol;
433 		double FillOpacity;
434 		int    FillBlend;
435 		double StrokeOpacity;
436 		int    StrokeBlend;
437 		QString fillPattern;
438 		double patternScaleX;
439 		double patternScaleY;
440 		double patternOffsetX;
441 		double patternOffsetY;
442 		double patternRotation;
443 		double patternSkewX;
444 		double patternSkewY;
445 		QString maskPattern;
446 		double patternMaskScaleX;
447 		double patternMaskScaleY;
448 		double patternMaskOffsetX;
449 		double patternMaskOffsetY;
450 		double patternMaskRotation;
451 		double patternMaskSkewX;
452 		double patternMaskSkewY;
453 	};
454 	struct XarTextLine
455 	{
456 		QList<XarText> textData;
457 	};
458 
459 	QByteArray imageData;
460 	QList<PageItem*> Elements;
461 	QList<quint32> atomicTags;
462 	QList<quint32> ignoreableTags;
463 	QList<XarText> textData;
464 	QList<XarTextLine> textLines;
465 	QMap<qint32, XarColor> XarColorMap;
466 	QMap<qint32, PageItem*> pathMap;
467 	QMap<quint32, QString> brushRef;
468 	QMap<QString, QString> patternMap;
469 	QMap<quint32, QString> patternRef;
470 	QMap<quint32, QString> fontRef;
471 	QStack<XarGroup> groupStack;
472 	QStack<XarStyle*>	m_gc;
473 	QString activeLayer;
474 	QStringList importedColors;
475 	QStringList importedPatterns;
476 	FPointArray clipCoords;
477 	FPointArray Coords;
478 	FPointArray textPath;
479 	MultiProgressDialog * progressDialog;
480 	ScribusDoc* m_Doc;
481 	Selection* tmpSel;
482 
483 public slots:
cancelRequested()484 	void cancelRequested() { cancel = true; }
485 };
486 
487 #endif
488