Scribus
Open source desktop publishing at your fingertips
importemf.h
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  -------------------
9  begin : Sun Jan 11 2015
10  copyright : (C) 2015 by Franz Schmid
11  email : Franz.Schmid@altmuehlnet.de
12  ***************************************************************************/
13 #ifndef IMPORTEMF_H
14 #define IMPORTEMF_H
15 
16 
17 #include "pluginapi.h"
18 #include "pageitem.h"
19 #include "sccolor.h"
20 #include "fpointarray.h"
21 #include "commonstrings.h"
22 #include <QList>
23 #include <QTransform>
24 #include <QMultiMap>
25 #include <QtGlobal>
26 #include <QObject>
27 #include <QStack>
28 #include <QString>
29 #include <QRect>
30 
31 class MultiProgressDialog;
32 class ScribusDoc;
33 class Selection;
35 
36 class emfStyle
37 {
38 public:
39  emfStyle() :
40  styType(0),
41  penStyle(Qt::SolidLine),
42  penCap(Qt::RoundCap),
43  penJoin(Qt::RoundJoin),
44  penWidth(0.0),
45  dashArray(),
46  dashOffset(0.0),
47  brushStyle(0),
48  hatchStyle(0),
49  gradientStart(),
50  gradientEnd(),
51  gradientAngle(0),
52  gradient(VGradient::linear),
53  gradientPath(),
54  hAlign(0),
55  vAlign(0),
56  fontUnit(0),
57  verticalText(false),
58  fontRotation(0.0),
59  fontSize(12.0),
60  fontName(""),
61  penColor(CommonStrings::None),
62  brushColor(CommonStrings::None),
63  patternName(""),
64  patternMode(0),
65  fillTrans(0.0),
66  penTrans(0.0),
67  Coords(),
68  MetaFile(false),
69  imageType(0),
70  imageWidth(0),
71  imageHeight(0),
72  imagePixelFormat(0),
73  imageData()
74  {
75  gradientPath.resize(0);
76  gradientPath.svgInit();
77  imageData.resize(0);
78  Coords.resize(0);
79  Coords.svgInit();
80  }
81  quint32 styType;
82  Qt::PenStyle penStyle;
83  Qt::PenCapStyle penCap;
84  Qt::PenJoinStyle penJoin;
85  double penWidth;
86  QVector<double> dashArray;
87  double dashOffset;
88  quint32 brushStyle;
89  quint32 hatchStyle;
90  QPointF gradientStart;
91  QPointF gradientEnd;
92  double gradientAngle;
93  VGradient gradient;
94  FPointArray gradientPath;
95  quint32 hAlign;
96  quint32 vAlign;
97  quint32 fontUnit;
98  bool verticalText;
99  double fontRotation;
100  double fontSize;
101  QString fontName;
102  QString penColor;
103  QString brushColor;
104  QString patternName;
105  quint32 patternMode;
106  double fillTrans;
107  double penTrans;
108  FPointArray Coords;
109  bool MetaFile;
110  quint32 imageType;
111  qint32 imageWidth;
112  qint32 imageHeight;
113  quint32 imagePixelFormat;
114  QByteArray imageData;
115 };
116 
117 class EmfPlug : public QObject
118 {
119  Q_OBJECT
120 
121 public:
131  EmfPlug( ScribusDoc* doc, int flags );
132  ~EmfPlug();
133 
144  bool import(QString fn, const TransactionSettings& trSettings, int flags, bool showProgress = true);
145  QImage readThumbnail(QString fn);
146 
147 private:
148  void parseHeader(QString fName, double &x, double &y, double &b, double &h);
149  bool convert(QString fn);
150  // Common functions
151  bool checkClip(FPointArray &clip);
152  void aligntoQuadWord(QDataStream &ds);
153  double convertDevice2Pts(double in);
154  QPointF convertDevice2Pts(QPointF in);
155  double convertLogical2Pts(double in);
156  QPointF convertLogical2Pts(QPointF in);
157  void createPatternFromDIB(QImage img, quint32 brID);
158  void getPolyInfo(QDataStream &ds, QRectF &bounds, quint32 &count);
159  FPointArray getPolyPoints(QDataStream &ds, quint32 count, bool length, bool closed);
160  QPointF getPoint(QDataStream &ds, bool size);
161  quint32 getColor(QDataStream &ds);
162  void setWTransform(QTransform mm, quint32 how);
163  QPointF intersectBoundingRect(PageItem *item, QLineF gradientVector);
164  void finishItem(PageItem* ite, bool fill = true);
165  void invalidateClipGroup();
166  void createClipGroup();
167  // Functions for normal EMF Files
168  void handleComment(QDataStream &ds);
169  void handleEllipse(QDataStream &ds);
170  void handleRectangle(QDataStream &ds);
171  void handleRoundRect(QDataStream &ds);
172  void handlePolyBezierTo(QDataStream &ds, bool size);
173  void handlePolylineTo(QDataStream &ds, bool size);
174  void handleLineTo(QDataStream &ds);
175  void handleArc(QDataStream &ds);
176  void handleArcTo(QDataStream &ds);
177  void handleChord(QDataStream &ds);
178  void handlePie(QDataStream &ds);
179  void handleSmallText(QDataStream &ds);
180  void handleText(QDataStream &ds, qint64 posi, bool size);
181  void handleImage(qint32 dstX, qint32 dstY, qint32 dstW, qint32 dstH, QImage img);
182  void handlePatternFill(qint32 dstX, qint32 dstY, qint32 dstW, qint32 dstH);
183  QImage handleDIB(QDataStream &ds, qint64 filePos, quint32 offBitH, quint32 sizeBitH, quint32 offBits, quint32 sizeBits);
184  void handleBezier(QDataStream &ds, bool size);
185  void handlePolygon(QDataStream &ds, bool size, bool fill);
186  void handlePolyPolygon(QDataStream &ds, bool size, bool fill);
187  void handlePenDef(quint32 penID, quint32 penStyle, quint32 penWidth, quint32 penColor);
188  QString handleColor(QColor col);
189  void handleFillRegion(QDataStream &ds);
190  void handleFrameRegion(QDataStream &ds);
191  void handleSetClipRegion(QDataStream &ds);
192  // Functions for EMF+ Files
193  void handleEMFPlus(QDataStream &ds, quint32 dtaSize);
194  void handleEMPObject(QDataStream &ds, quint8 flagsH, quint8 flagsL, quint32 dataSize);
195  quint32 handleEMPBrush(QDataStream &ds, quint16 id, bool first, bool cont, quint32 dataSize);
196  void handleEMPPen(QDataStream &ds, quint16 id);
197  void handleEMPPath(QDataStream &ds, quint16 id);
198  void handleEMPRegion(QDataStream &ds, quint16 id);
199  quint32 handleEMPImage(QDataStream &ds, quint16 id, bool first, bool cont, quint32 dataSize);
200  quint32 getImageData(QDataStream &ds, quint16 id, bool first, bool cont, quint32 dataSize, emfStyle &sty);
201  void handleEMPFont(QDataStream &ds, quint16 id);
202  void handleEMPSFormat(QDataStream &ds, quint16 id);
203  void handleEMPLineCap(QDataStream &ds, quint16 id);
204  void handleEMFPFillClosedCurve(QDataStream &ds, quint8 flagsL);
205  void handleEMFPFillEllipse(QDataStream &ds, quint8 flagsL);
206  void handleEMFPFillPath(QDataStream &ds, quint8 flagsL, quint8 flagsH);
207  void handleEMFPFillPie(QDataStream &ds, quint8 flagsL);
208  void handleEMFPFillPolygon(QDataStream &ds, quint8 flagsL);
209  void handleEMFPFillRects(QDataStream &ds, quint8 flagsL);
210  void handleEMFPFillRegion(QDataStream &ds, quint8 flagsL, quint8 flagsH);
211  void handleEMFPDrawArc(QDataStream &ds, quint8 flagsL, quint8 flagsH);
212  void handleEMFPDrawBezier(QDataStream &ds, quint8 flagsL, quint8 flagsH);
213  void handleEMFPDrawClosedCurve(QDataStream &ds, quint8 flagsL, quint8 flagsH);
214  void handleEMFPDrawCurve(QDataStream &ds, quint8 flagsL, quint8 flagsH);
215  void handleEMFPDrawEllipse(QDataStream &ds, quint8 flagsL, quint8 flagsH);
216  void handleEMFPDrawImage(QDataStream &ds, quint8 flagsL, quint8 flagsH);
217  void handleEMFPDrawImagePoints(QDataStream &ds, quint8 flagsL, quint8 flagsH);
218  void handleEMFPDrawLines(QDataStream &ds, quint8 flagsL, quint8 flagsH);
219  void handleEMFPDrawPath(QDataStream &ds, quint8 flagsH);
220  void handleEMFPDrawPie(QDataStream &ds, quint8 flagsL, quint8 flagsH);
221  void handleEMFPDrawRects(QDataStream &ds, quint8 flagsL, quint8 flagsH);
222  void handleEMFPDrawDriverString(QDataStream &ds, quint8 flagsL, quint8 flagsH);
223  void handleEMFPDrawString(QDataStream &ds, quint8 flagsL, quint8 flagsH);
224  void handleEMFPSetClipRect(QDataStream &ds, quint8 flagsL);
225  void handleEMFPSetClipRegion(QDataStream &ds, quint8 flagsL, quint8 flagsH);
226  void handleEMFPSetClipPath(QDataStream &ds, quint8 flagsL, quint8 flagsH);
227  void handleEMFPSerializableObject(QDataStream &ds);
228  void getEMFPBrush(quint32 brushID, bool directBrush);
229  void getEMFPPen(quint32 penID);
230  void getEMFPFont(quint32 fontID);
231  void getEMFPStringFormat(quint32 fontID);
232  FPointArray getEMPPathData(QDataStream &ds);
233  QPolygonF getEMFPCurvePoints(QDataStream &ds, quint8 flagsL, quint32 count);
234  QPolygonF getEMFPRect(QDataStream &ds, bool size);
235  QPointF getEMFPPoint(QDataStream &ds, bool size);
236  double getEMFPDistance(QDataStream &ds, bool size);
237  QPointF convertEMFPLogical2Pts(QPointF in, quint16 unit);
238  double convertEMFPLogical2Pts(double in, quint16 unit);
239  QPolygonF gdip_open_curve_tangents(QPolygonF &points, double tension);
240  QPolygonF gdip_closed_curve_tangents(QPolygonF &points, double tension);
241  void append_curve(QPainterPath &path, QPolygonF &points, QPolygonF &tangents, bool type);
242  void GdipAddPathCurve(QPainterPath &path, QPolygonF &points, float tension);
243  void GdipAddPathClosedCurve(QPainterPath &path, QPolygonF &points, float tension);
244  void handleEMFPDrawImageData(QPointF p1, QPointF p2, QPointF p3, quint8 flagsH);
245  QImage getImageDataFromStyle(quint8 flagsH);
246  struct dcState
247  {
248  quint32 m_mapMode;
249  quint16 emfPlusUnit;
250  quint32 textAlignment;
251  quint32 hatchStyle;
252  quint32 brushStyle;
253  QPointF gradientStart;
254  QPointF gradientEnd;
255  double gradientAngle;
256  VGradient gradient;
257  QTransform m_WorldMap;
258  QTransform m_WorldMapEMFP;
259  bool fillRule;
260  bool backgroundMode;
261  bool arcDirection;
262  bool alphaOn;
263  double LineW;
264  QVector<double> dashArray;
265  double dashOffset;
266  Qt::PenStyle penStyle;
267  Qt::PenCapStyle penCap;
268  Qt::PenJoinStyle penJoin;
269  QString CurrColorFill;
270  QString CurrColorStroke;
271  QString CurrColorText;
272  QString backColor;
273  QString fontName;
274  QString patternName;
275  quint32 patternMode;
276  double fontSize;
277  double fontRotation;
278  double CurrStrokeTrans;
279  double CurrFillTrans;
280  FPointArray Coords;
281  FPointArray clipPath;
282  FPointArray gradientPath;
283  QPointF viewOrigin;
284  QPointF winOrigin;
285  QPointF currentPoint;
286  QPointF originEMFP;
287  quint32 hAlign;
288  quint32 vAlign;
289  quint32 fontUnit;
290  bool verticalText;
291  bool clipValid;
292  };
293  QStack<dcState> dcStack;
294  QHash<quint32, dcState> dcStackEMP;
295  dcState currentDC;
296  QHash<quint32, emfStyle> emfStyleMap;
297  QHash<quint32, emfStyle> emfStyleMapEMP;
298  QList<PageItem*> Elements;
299  PageItem* clipGroup;
300  double docWidth;
301  double docHeight;
302  double baseX, baseY;
303  double docX;
304  double docY;
305  double dpiX;
306  double dpiY;
307  quint32 EmfPdpiX, EmfPdpiY;
308  quint32 m_records;
309  int recordCount;
310  qint32 viewPextendX, viewPextendY;
311  qint32 winPextendX, winPextendY;
312  qint32 winOrigX, winOrigY;
313  QRectF bBoxDev;
314  QRectF bBoxMM;
315  QStringList importedColors;
316  QStringList importedPatterns;
317  bool interactive;
318  MultiProgressDialog * progressDialog;
319  bool cancel;
320  ScribusDoc* m_Doc;
321  Selection* tmpSel;
322  int importerFlags;
323  QString baseFile;
324  bool inPath;
325  bool inEMFPlus;
326  bool emfPlusDual;
327  bool emfMixed;
328  float emfPlusScale;
329  bool SerializableObject_Valid;
330  QList<ImageEffect> m_Effects;
331  quint32 m_ObjSize;
332  quint32 m_currObjSize;
333  quint16 m_objID;
334 public slots:
335  void cancelRequested() { cancel = true; }
336 };
337 
338 #endif
Definition: importemf.h:36
Definition: vgradient.h:78
EmfPlug(ScribusDoc *doc, int flags)
Create the EMF importer window.
Definition: importemf.cpp:430
the Document Class
Definition: scribusdoc.h:90
Definition: importemf.h:117
Definition: undomanager.h:52
Definition: pageitem.h:92
Definition: fpointarray.h:42
Definition: selection.h:34