Subversion Repositories Scribus

Rev

Rev 17520 | Rev 20475 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 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
*/
68 Franz 7
#ifndef SVGPLUG_H
8
#define SVGPLUG_H
9
 
10223 cbradney 10
#include <QDomElement>
10638 jghali 11
#include <QFont>
12
#include <QList>
20005 jghali 13
#include <QRectF>
14
#include <QSizeF>
9922 fschmid 15
#include <QStack>
2986 craig 16
#include "pluginapi.h"
3487 craig 17
#include "loadsaveplugin.h"
14350 fschmid 18
#include "../../formatidlist.h"
68 Franz 19
#include "vgradient.h"
20
 
3696 craig 21
class ScrAction;
5243 cbradney 22
class ScribusMainWindow;
13371 jghali 23
class TransactionSettings;
3696 craig 24
 
4024 craig 25
/**
4645 subik 26
 * \brief A class providing the plugin interface implementation for this plugin
4024 craig 27
 */
3487 craig 28
class PLUGIN_API SVGImportPlugin : public LoadSavePlugin
3207 craig 29
{
30
        Q_OBJECT
68 Franz 31
 
3207 craig 32
        public:
33
                // Standard plugin implementation
34
                SVGImportPlugin();
35
                virtual ~SVGImportPlugin();
36
                virtual const QString fullTrName() const;
37
                virtual const AboutData* getAboutData() const;
38
                virtual void deleteAboutData(const AboutData* about) const;
39
                virtual void languageChange();
5642 cbradney 40
                virtual bool fileSupported(QIODevice* file, const QString & fileName=QString::null) const;
5539 mrdocs 41
                virtual bool loadFile(const QString & fileName, const FileFormat & fmt, int flags, int index = 0);
14692 fschmid 42
                virtual QImage readThumbnail(const QString& fileName);
12110 fschmid 43
                virtual void addToMainWindowMenu(ScribusMainWindow *) {};
1208 cbradney 44
 
3696 craig 45
        public slots:
4645 subik 46
                /*!
47
                \author Franz Schmid
48
                \brief Run the SVG import
49
                \param filename a file name to import
50
                \retval true for success
51
                 */
5539 mrdocs 52
                virtual bool import(QString filename = QString::null, int flags = lfUseCurrentPage|lfInteractive);
3686 craig 53
 
54
        private:
55
                void registerFormats();
3696 craig 56
                ScrAction* importAction;
3686 craig 57
 
3207 craig 58
};
59
 
60
extern "C" PLUGIN_API int svgimplugin_getPluginAPIVersion();
61
extern "C" PLUGIN_API ScPlugin* svgimplugin_getPlugin();
62
extern "C" PLUGIN_API void svgimplugin_freePlugin(ScPlugin* plugin);
63
 
64
class PageItem;
65
class ScribusDoc;
3210 craig 66
class PrefsManager;
67
class FPointArray;
3207 craig 68
 
68 Franz 69
class GradientHelper
70
{
71
public:
4024 craig 72
        GradientHelper() :
14289 jghali 73
                cspace(false),
4024 craig 74
                cspaceValid(true),
75
                gradient(VGradient::linear),
76
                gradientValid(false),
77
                matrix(),
78
                matrixValid(false),
79
                reference(""),
14289 jghali 80
                type(1),
4024 craig 81
                typeValid(false),
14289 jghali 82
                x1(0),
4024 craig 83
                x1Valid(true),
14289 jghali 84
                x2(1),
4024 craig 85
                x2Valid(true),
14289 jghali 86
                y1(0),
4024 craig 87
                y1Valid(true),
14289 jghali 88
                y2(0),
89
                y2Valid(true),
90
                fx(0),
91
                fxValid(true),
92
                fy(0),
93
                fyValid(true)
68 Franz 94
                {
95
                }
14289 jghali 96
        bool cspace;
4024 craig 97
        bool cspaceValid;
98
        VGradient gradient;
99
        bool gradientValid;
13951 fschmid 100
        QTransform matrix;
4024 craig 101
        bool matrixValid;
102
        QString reference;
14289 jghali 103
        int type;
943 fschmid 104
        bool typeValid;
14289 jghali 105
        double x1;
943 fschmid 106
        bool x1Valid;
14289 jghali 107
        double x2;
4024 craig 108
        bool x2Valid;
14289 jghali 109
        double y1;
943 fschmid 110
        bool y1Valid;
14289 jghali 111
        double y2;
943 fschmid 112
        bool y2Valid;
14289 jghali 113
        double fx;
114
        bool fxValid;
115
        double fy;
116
        bool fyValid;
68 Franz 117
        };
118
 
119
class SvgStyle
120
{
121
public:
4024 craig 122
        SvgStyle() :
6356 jghali 123
                Display(true),
14232 jghali 124
                FillCSpace(false),
125
                StrokeCSpace(false),
4024 craig 126
                CurCol("None"),
127
                dashOffset(0),
10638 jghali 128
                FontFamily(""),
129
                FontStyle("normal"),
130
                FontWeight("normal"),
131
                FontStretch("normal"),
132
                FontSize(12),
4024 craig 133
                FillCol("Black"),
12802 fschmid 134
                fillRule("nonzero"),
14232 jghali 135
                GFillCol1("Black"),
136
                GStrokeCol1("Black"),
137
                FillGradient(VGradient::linear),
138
                StrokeGradient(VGradient::linear),
139
                FillGradientType(0),
140
                StrokeGradientType(0),
141
                GradFillX1(0),
142
                GradFillX2(0),
143
                GradFillY1(0),
144
                GradFillY2(0),
14289 jghali 145
                GradFillFX(0),
146
                GradFillFY(0),
14232 jghali 147
                GradStrokeX1(0),
148
                GradStrokeX2(0),
149
                GradStrokeY1(0),
150
                GradStrokeY2(0),
14289 jghali 151
                GradStrokeFX(0),
152
                GradStrokeFY(0),
4024 craig 153
                InherCol(false),
154
                LWidth(1.0),
155
                matrix(),
14232 jghali 156
                matrixgf(),
157
                matrixgs(),
4024 craig 158
                PLineArt(Qt::SolidLine),
159
                PLineEnd(Qt::FlatCap),
160
                PLineJoin(Qt::MiterJoin),
161
                StrokeCol("None"),
6136 jghali 162
                Opacity(1.0),
163
                FillOpacity(1.0),
6575 jghali 164
                StrokeOpacity(1.0),
12802 fschmid 165
                textAnchor("start"),
16220 fschmid 166
                clipPath(),
17520 fschmid 167
                forGroup(false),
168
                endMarker(""),
169
                startMarker("")
68 Franz 170
                {
171
                }
6356 jghali 172
        bool Display;
14232 jghali 173
        bool FillCSpace;
174
        bool StrokeCSpace;
4024 craig 175
        QString CurCol;
12055 jghali 176
        QVector<double> dashArray;
4024 craig 177
        double dashOffset;
10638 jghali 178
        QString FontFamily;
179
        QString FontStyle;
180
        QString FontWeight;
181
        QString FontStretch;
17436 jghali 182
        double  FontSize;
68 Franz 183
        QString FillCol;
4926 avox 184
        QString fillRule;
14232 jghali 185
        QString GFillCol1;
186
        QString GStrokeCol1;
187
        VGradient FillGradient;
188
        VGradient StrokeGradient;
189
        int    FillGradientType;
190
        int    StrokeGradientType;
191
        double GradFillX1;
192
        double GradFillX2;
193
        double GradFillY1;
194
        double GradFillY2;
14289 jghali 195
        double GradFillFX;
196
        double GradFillFY;
14232 jghali 197
        double GradStrokeX1;
198
        double GradStrokeX2;
199
        double GradStrokeY1;
200
        double GradStrokeY2;
14289 jghali 201
        double GradStrokeFX;
202
        double GradStrokeFY;
4024 craig 203
        bool InherCol;
204
        double LWidth;
13951 fschmid 205
        QTransform matrix;
14232 jghali 206
        QTransform matrixgf;
207
        QTransform matrixgs;
4024 craig 208
        Qt::PenStyle PLineArt;
209
        Qt::PenCapStyle PLineEnd;
210
        Qt::PenJoinStyle PLineJoin;
211
        QString StrokeCol;
6127 jghali 212
        double Opacity;
213
        double FillOpacity;
214
        double StrokeOpacity;
6575 jghali 215
        QString textAnchor;
12887 jghali 216
        QString textDecoration;
12802 fschmid 217
        FPointArray clipPath;
16220 fschmid 218
        bool forGroup;
17520 fschmid 219
        QString endMarker;
220
        QString startMarker;
68 Franz 221
};
222
 
223
class SVGPlug : public QObject
1552 subik 224
{
68 Franz 225
        Q_OBJECT
226
 
227
public:
4645 subik 228
        /*!
229
        \author Franz Schmid
230
        \brief Create the SVG importer window
231
        \param fName QString
232
        \param isInteractive flag to use GUI
233
         */
14692 fschmid 234
        SVGPlug(ScribusDoc* doc, int flags);
68 Franz 235
        ~SVGPlug();
13371 jghali 236
        bool import(QString fname, const TransactionSettings& trSettings, int flags);
14692 fschmid 237
        QImage readThumbnail(QString fn);
8043 jghali 238
        bool loadData(QString fname);
13371 jghali 239
        void convert(const TransactionSettings& trSettings, int flags);
68 Franz 240
        void addGraphicContext();
7612 jghali 241
        void setupNode( const QDomElement &e );
68 Franz 242
        void setupTransform( const QDomElement &e );
10785 jghali 243
        void finishNode( const QDomNode &e, PageItem* item);
7605 jghali 244
        bool isIgnorableNode( const QDomElement &e );
10021 jghali 245
        bool isIgnorableNodeName( const QString &n );
12725 jghali 246
        FPoint parseTextPosition(const QDomElement &e, const FPoint* pos = NULL);
20005 jghali 247
        QSizeF  parseWidthHeight(const QDomElement &e);
248
        QRectF  parseViewBox(const QDomElement &e);
7556 jghali 249
        void parseDefs(const QDomElement &e);
7605 jghali 250
        void parseClipPath(const QDomElement &e);
251
        void parseClipPathAttr(const QDomElement &e, FPointArray& clipPath);
15172 jghali 252
        QList<PageItem*> parseA(const QDomElement &e);
9856 fschmid 253
        QList<PageItem*> parseGroup(const QDomElement &e);
16230 fschmid 254
        QList<PageItem*> parseDoc(const QDomElement &e);
9856 fschmid 255
        QList<PageItem*> parseElement(const QDomElement &e);
256
        QList<PageItem*> parseCircle(const QDomElement &e);
257
        QList<PageItem*> parseEllipse(const QDomElement &e);
258
        QList<PageItem*> parseImage(const QDomElement &e);
259
        QList<PageItem*> parseLine(const QDomElement &e);
260
        QList<PageItem*> parsePath(const QDomElement &e);
261
        QList<PageItem*> parsePolyline(const QDomElement &e);
262
        QList<PageItem*> parseRect(const QDomElement &e);
263
        QList<PageItem*> parseText(const QDomElement &e);
12725 jghali 264
        QList<PageItem*> parseTextSpan(const QDomElement& e, FPoint& currentPos, double chunkW);
265
        QList<PageItem*> parseTextNode(const QDomText& e, FPoint& currentPos, double chunkW);
9856 fschmid 266
        QList<PageItem*> parseSwitch(const QDomElement &e);
267
        QList<PageItem*> parseSymbol(const QDomElement &e);
268
        QList<PageItem*> parseUse(const QDomElement &e);
12725 jghali 269
        const char* getCoord( const char *ptr, double &number );
10638 jghali 270
        QFont       getFontFromStyle(SvgStyle& style);
8604 jghali 271
        QDomElement getReferencedNode(const QDomElement &e);
12725 jghali 272
        bool        getTextChunkWidth(const QDomElement &e, double& width);
273
        double  fromPercentage(const QString &s );
274
        double  parseFontSize(const QString& fsize);
275
        double  parseUnit(const QString &unit);
13951 fschmid 276
        QTransform parseTransform(const QString &transform);
12725 jghali 277
        bool    parseSVG( const QString &s, FPointArray *ite );
10638 jghali 278
        QColor  parseColorN( const QString &rgbColor );
68 Franz 279
        QString parseColor( const QString &s );
13391 jghali 280
        QString parseIccColor( const QString &s );
16888 jghali 281
        QString parseTagName( const QDomElement &e );
68 Franz 282
        void parsePA( SvgStyle *obj, const QString &command, const QString &params );
283
        void parseStyle( SvgStyle *obj, const QDomElement &e );
284
        void parseColorStops(GradientHelper *gradient, const QDomElement &e);
17520 fschmid 285
        void parseMarker(const QDomElement &b);
12737 fschmid 286
        void parsePattern(const QDomElement &b);
68 Franz 287
        void parseGradient( const QDomElement &e );
296 Franz 288
        FPoint GetMaxClipO(FPointArray Clip);
289
        FPoint GetMinClipO(FPointArray Clip);
68 Franz 290
        QDomDocument inpdoc;
7866 fschmid 291
        QString docDesc;
292
        QString docTitle;
293
        int groupLevel;
9922 fschmid 294
        QStack<SvgStyle*>       m_gc;
68 Franz 295
        QMap<QString, GradientHelper>   m_gradients;
7556 jghali 296
        QMap<QString, QDomElement>              m_nodeMap;
7605 jghali 297
        QMap<QString, FPointArray>              m_clipPaths;
13385 jghali 298
        QMap<QString, QString>                  m_unsupportedFeatures;
8237 avox 299
        bool PathClosed;
1013 fschmid 300
        double viewTransformX;
301
        double viewTransformY;
302
        double viewScaleX;
303
        double viewScaleY;
3207 craig 304
        bool interactive;
3800 subik 305
        //! \brief Indicator if there is any unsupported feature in imported svg.
306
        bool unsupported;
7794 fschmid 307
        bool importFailed;
7795 fschmid 308
        bool importCanceled;
5781 cbradney 309
        ScribusDoc* m_Doc;
7578 cbradney 310
        Selection* tmpSel;
7991 fschmid 311
        QStringList importedColors;
14151 fschmid 312
        QStringList importedGradients;
313
        QMap<QString, QString> importedGradTrans;
12737 fschmid 314
        QStringList importedPatterns;
12745 fschmid 315
        QMap<QString, QString> importedPattTrans;
316
        double inGroupXOrigin;
317
        double inGroupYOrigin;
14692 fschmid 318
        int importerFlags;
16230 fschmid 319
        bool firstLayer;
17520 fschmid 320
        struct markerDesc
321
        {
322
                double xref;
323
                double yref;
324
                double wpat;
325
                double hpat;
326
        };
327
        QMap<QString, markerDesc> markers;
328
        QList<PageItem*> Elements;
68 Franz 329
};
330
 
331
#endif