Subversion Repositories Scribus

Rev

Rev 24734 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
16682 jghali 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
#include <QByteArray>
9
#include <QCursor>
22405 jghali 10
#include <QDataStream>
16682 jghali 11
#include <QDrag>
12
#include <QFile>
13
#include <QList>
14
#include <QMimeData>
15
#include <QRegExp>
24744 jghali 16
#include <QScopedPointer>
16682 jghali 17
#include <QStack>
18
#include <QTemporaryFile>
19
#include <QDebug>
20
 
21
#include <cstdlib>
22
#include <tiffio.h>
23
#include <zlib.h>
24
 
19093 craig 25
#include "importai.h"
26
 
16682 jghali 27
#include "commonstrings.h"
28
#include "loadsaveplugin.h"
29
#include "prefscontext.h"
30
#include "prefsfile.h"
31
#include "prefsmanager.h"
32
#include "prefstable.h"
22405 jghali 33
#include "qtiocompressor.h"
16682 jghali 34
#include "rawimage.h"
19093 craig 35
#include "scclocale.h"
16682 jghali 36
#include "sccolorengine.h"
37
#include "scconfig.h"
38
#include "scmimedata.h"
39
#include "scpaths.h"
40
#include "scpattern.h"
41
#include "scribusXml.h"
42
#include "scribuscore.h"
43
#include "scribusdoc.h"
19093 craig 44
#include "scribusview.h"
16682 jghali 45
#include "sctextstream.h"
46
#include "selection.h"
47
#include "text/specialchars.h"
48
#include "ui/customfdialog.h"
49
#include "ui/missing.h"
50
#include "ui/multiprogressdialog.h"
51
#include "ui/propertiespalette.h"
52
#include "undomanager.h"
53
#include "util.h"
54
#include "util_color.h"
55
#include "util_file.h"
56
#include "util_formats.h"
19093 craig 57
#include "util_ghostscript.h"
16682 jghali 58
#include "util_math.h"
59
 
60
#include <cairo.h>
61
 
62
#ifdef HAVE_PODOFO
63
        #include <podofo/podofo.h>
64
#endif
65
 
23733 jghali 66
AIPlug::AIPlug(ScribusDoc* doc, int flags)
24744 jghali 67
      : m_Doc(doc),
68
        importerFlags(flags)
16682 jghali 69
{
23733 jghali 70
        tmpSel = new Selection(this, false);
16682 jghali 71
        interactive = (flags & LoadSavePlugin::lfInteractive);
72
}
73
 
22635 craig 74
QImage AIPlug::readThumbnail(const QString& fNameIn)
16682 jghali 75
{
76
        QString fName = fNameIn;
77
        double x, y, b, h;
78
        CustColors.clear();
79
        importedColors.clear();
80
        importedGradients.clear();
81
        importedPatterns.clear();
24744 jghali 82
        QFileInfo fi(fName);
16682 jghali 83
/* Check if the file is an old style AI or one of the newer PDF wrapped ones */
84
        QFile fT(fName);
85
        if (fT.open(QIODevice::ReadOnly))
86
        {
87
                QByteArray tempBuf(9, ' ');
88
                fT.read(tempBuf.data(), 8);
89
                fT.close();
90
                if (tempBuf.startsWith("%PDF"))
91
                {
21951 craig 92
                        QString tmp;
16682 jghali 93
                        QString pdfFile = QDir::toNativeSeparators(fName);
21526 craig 94
                        QString tmpFile = QDir::toNativeSeparators(ScPaths::tempFileDir() + "sc.png");
16682 jghali 95
                        int ret = -1;
96
                        tmp.setNum(1);
97
                        QStringList args;
98
                        args.append("-r72");
99
                        args.append("-sOutputFile="+tmpFile);
100
                        args.append("-dFirstPage="+tmp);
101
                        args.append("-dLastPage="+tmp);
102
                        args.append(pdfFile);
103
                        ret = callGS(args);
104
                        if (ret == 0)
105
                        {
106
                                QImage image;
107
                                image.load(tmpFile);
108
                                QFile::remove(tmpFile);
109
                                image.setText("XSize", QString("%1").arg(image.width()));
110
                                image.setText("YSize", QString("%1").arg(image.height()));
111
                                return image;
112
                        }
22609 craig 113
                        return QImage();
16682 jghali 114
                }
115
        }
116
        QFile fT2(fName);
117
        if (fT2.open(QIODevice::ReadOnly))
118
        {
119
                QByteArray tempBuf(25, ' ');
120
                fT2.read(tempBuf.data(), 20);
121
                fT2.close();
122
                /* Illustrator CS files might be compressed
123
                        the compressed Data starts right after the "%AI12_CompressedData" comment
124
                        Compression is a simple zlib compression */
125
                if (tempBuf.startsWith("%AI12_CompressedData"))
126
                        decompressAIData(fName);
127
        }
22527 craig 128
        progressDialog = nullptr;
16682 jghali 129
/* Set default Page to size defined in Preferences */
130
        x = 0.0;
131
        y = 0.0;
23060 craig 132
        b = PrefsManager::instance().appPrefs.docSetupPrefs.pageWidth;
133
        h = PrefsManager::instance().appPrefs.docSetupPrefs.pageHeight;
16682 jghali 134
        parseHeader(fName, x, y, b, h);
135
        if (b == 0)
23060 craig 136
                b = PrefsManager::instance().appPrefs.docSetupPrefs.pageWidth;
16682 jghali 137
        if (h == 0)
23060 craig 138
                h = PrefsManager::instance().appPrefs.docSetupPrefs.pageHeight;
16682 jghali 139
        docX = x;
140
        docY = y;
141
        docWidth = b - x;
142
        docHeight = h - y;
143
        baseX = 0;
144
        baseY = 0;
145
        m_Doc = new ScribusDoc();
146
        m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
147
        m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
148
        m_Doc->addPage(0);
22609 craig 149
        m_Doc->setGUI(false, ScCore->primaryMainWindow(), nullptr);
16682 jghali 150
        baseX = m_Doc->currentPage()->xOffset();
151
        baseY = m_Doc->currentPage()->yOffset();
152
        ColorList::Iterator it;
153
        for (it = CustColors.begin(); it != CustColors.end(); ++it)
154
        {
155
                if (!m_Doc->PageColors.contains(it.key()))
156
                {
157
                        m_Doc->PageColors.insert(it.key(), it.value());
158
                        importedColors.append(it.key());
159
                }
160
        }
161
        Elements.clear();
162
        m_Doc->setLoading(true);
163
        m_Doc->DoDrawing = false;
164
        m_Doc->scMW()->setScriptRunning(true);
165
        QString CurDirP = QDir::currentPath();
166
        QDir::setCurrent(fi.path());
167
        QImage tmpImage;
168
        if (convert(fName))
169
        {
170
                tmpSel->clear();
171
                QDir::setCurrent(CurDirP);
172
                if (Elements.count() > 1)
173
                        m_Doc->groupObjectsList(Elements);
174
                m_Doc->DoDrawing = true;
175
                m_Doc->m_Selection->delaySignalsOn();
176
                for (int dre=0; dre<Elements.count(); ++dre)
177
                {
178
                        tmpSel->addItem(Elements.at(dre), true);
179
                }
180
                tmpSel->setGroupRect();
181
                double xs = tmpSel->width();
182
                double ys = tmpSel->height();
18679 fschmid 183
                if (Elements.count() > 0)
184
                        tmpImage = Elements.at(0)->DrawObj_toImage(500);
16682 jghali 185
                tmpImage.setText("XSize", QString("%1").arg(xs));
186
                tmpImage.setText("YSize", QString("%1").arg(ys));
187
                m_Doc->m_Selection->delaySignalsOff();
188
        }
189
        else
190
                tmpImage = QImage();
191
        m_Doc->scMW()->setScriptRunning(false);
192
        m_Doc->setLoading(false);
193
        delete m_Doc;
194
        QDir::setCurrent(CurDirP);
195
        return tmpImage;
196
}
197
 
23705 craig 198
bool AIPlug::readColors(const QString& fileName, ColorList & colors)
16682 jghali 199
{
23705 craig 200
        QString fName(fileName);
16682 jghali 201
        bool success = false;
202
        cancel = false;
203
        double x, y, b, h;
204
        convertedPDF = false;
205
        CustColors.clear();
206
        importedColors.clear();
207
        importedGradients.clear();
208
        importedPatterns.clear();
24744 jghali 209
        QFileInfo fi(fName);
16682 jghali 210
/* Check if the file is an old style AI or one of the newer PDF wrapped ones */
211
        QFile fT(fName);
212
        if (fT.open(QIODevice::ReadOnly))
213
        {
214
                QByteArray tempBuf(9, ' ');
215
                fT.read(tempBuf.data(), 8);
216
                fT.close();
217
                if (tempBuf.startsWith("%PDF"))
218
                {
219
                        QFileInfo bF2(fName);
21526 craig 220
                        QString tmpFile = ScPaths::tempFileDir()+ "/"+bF2.baseName()+"_tmp.ai";
16682 jghali 221
                        if (!extractFromPDF(fName, tmpFile))
222
                                return false;
223
                        convertedPDF = true;
224
                        fName = tmpFile;
225
                }
226
        }
227
        QFile fT2(fName);
228
        if (fT2.open(QIODevice::ReadOnly))
229
        {
230
                QByteArray tempBuf(25, ' ');
231
                fT2.read(tempBuf.data(), 20);
232
                fT2.close();
233
                /* Illustrator CS files might be compressed
234
                        the compressed Data starts right after the "%AI12_CompressedData" comment
235
                        Compression is a simple zlib compression */
236
                if (tempBuf.startsWith("%AI12_CompressedData"))
237
                        decompressAIData(fName);
238
        }
22527 craig 239
        progressDialog = nullptr;
16682 jghali 240
/* Set default Page to size defined in Preferences */
241
        x = 0.0;
242
        y = 0.0;
23060 craig 243
        b = PrefsManager::instance().appPrefs.docSetupPrefs.pageWidth;
244
        h = PrefsManager::instance().appPrefs.docSetupPrefs.pageHeight;
16682 jghali 245
        parseHeader(fName, x, y, b, h);
246
        docX = x;
247
        docY = y;
248
        docWidth = b - x;
249
        docHeight = h - y;
250
        m_Doc = new ScribusDoc();
251
        m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
252
        m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
253
        m_Doc->addPage(0);
22609 craig 254
        m_Doc->setGUI(false, ScCore->primaryMainWindow(), nullptr);
16682 jghali 255
        baseX = m_Doc->currentPage()->xOffset();
256
        baseY = m_Doc->currentPage()->yOffset();
257
        ColorList::Iterator it;
258
        for (it = CustColors.begin(); it != CustColors.end(); ++it)
259
        {
260
                if (!m_Doc->PageColors.contains(it.key()))
261
                {
262
                        m_Doc->PageColors.insert(it.key(), it.value());
263
                        importedColors.append(it.key());
264
                }
265
        }
266
        Elements.clear();
267
        m_Doc->setLoading(true);
268
        m_Doc->DoDrawing = false;
269
        m_Doc->scMW()->setScriptRunning(true);
270
        QString CurDirP = QDir::currentPath();
271
        QDir::setCurrent(fi.path());
272
        convert(fName);
273
        if (importedColors.count() != 0)
274
        {
275
                colors = m_Doc->PageColors;
276
                success = true;
277
        }
278
        m_Doc->scMW()->setScriptRunning(false);
279
        m_Doc->setLoading(false);
280
        delete m_Doc;
281
        QDir::setCurrent(CurDirP);
282
        if (convertedPDF)
283
                QFile::remove(fName);
284
        return success;
285
}
286
 
22635 craig 287
bool AIPlug::import(const QString& fNameIn, const TransactionSettings& trSettings, int flags, bool showProgress)
16682 jghali 288
{
289
        QString fName = fNameIn;
290
        bool success = false;
291
        interactive = (flags & LoadSavePlugin::lfInteractive);
292
        importerFlags = flags;
293
        cancel = false;
294
        double x, y, b, h;
295
        bool ret = false;
296
        convertedPDF = false;
297
        CustColors.clear();
298
        importedColors.clear();
299
        importedGradients.clear();
300
        importedPatterns.clear();
24744 jghali 301
        QFileInfo fi(fName);
16682 jghali 302
        if ( !ScCore->usingGUI() )
303
        {
304
                interactive = false;
305
                showProgress = false;
306
        }
307
 
308
/* Check if the file is an old style AI or one of the newer PDF wrapped ones */
309
        QFile fT(fName);
310
        if (fT.open(QIODevice::ReadOnly))
311
        {
312
                QByteArray tempBuf(9, ' ');
313
                fT.read(tempBuf.data(), 8);
314
                fT.close();
315
                if (tempBuf.startsWith("%PDF"))
316
                {
317
                        QFileInfo bF2(fName);
21526 craig 318
                        QString tmpFile = ScPaths::tempFileDir()+ "/"+bF2.baseName()+"_tmp.ai";
16682 jghali 319
                        if (!extractFromPDF(fName, tmpFile))
320
                                return false;
321
                        convertedPDF = true;
322
                        fName = tmpFile;
323
                }
324
        }
325
        QFile fT2(fName);
326
        if (fT2.open(QIODevice::ReadOnly))
327
        {
328
                QByteArray tempBuf(25, ' ');
329
                fT2.read(tempBuf.data(), 20);
330
                fT2.close();
331
                /* Illustrator CS files might be compressed
332
                        the compressed Data starts right after the "%AI12_CompressedData" comment
333
                        Compression is a simple zlib compression */
334
                if (tempBuf.startsWith("%AI12_CompressedData"))
335
                        decompressAIData(fName);
336
        }
337
        if ( showProgress )
338
        {
22609 craig 339
                ScribusMainWindow* mw=(m_Doc==nullptr) ? ScCore->primaryMainWindow() : m_Doc->scMW();
16682 jghali 340
                progressDialog = new MultiProgressDialog( tr("Importing: %1").arg(fi.fileName()), CommonStrings::tr_Cancel, mw );
341
                QStringList barNames, barTexts;
342
                barNames << "GI";
343
                barTexts << tr("Analyzing File:");
344
                QList<bool> barsNumeric;
345
                barsNumeric << false;
346
                progressDialog->addExtraProgressBars(barNames, barTexts, barsNumeric);
347
                progressDialog->setOverallTotalSteps(3);
348
                progressDialog->setOverallProgress(0);
349
                progressDialog->setProgress("GI", 0);
350
                progressDialog->show();
351
                connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelRequested()));
24744 jghali 352
                QCoreApplication::processEvents();
16682 jghali 353
        }
354
        else
22527 craig 355
                progressDialog = nullptr;
16682 jghali 356
/* Set default Page to size defined in Preferences */
357
        x = 0.0;
358
        y = 0.0;
23060 craig 359
        b = PrefsManager::instance().appPrefs.docSetupPrefs.pageWidth;
360
        h = PrefsManager::instance().appPrefs.docSetupPrefs.pageHeight;
16682 jghali 361
        if (progressDialog)
362
        {
363
                progressDialog->setOverallProgress(1);
24744 jghali 364
                QCoreApplication::processEvents();
16682 jghali 365
        }
366
        parseHeader(fName, x, y, b, h);
367
        if (b == 0)
23060 craig 368
                b = PrefsManager::instance().appPrefs.docSetupPrefs.pageWidth;
16682 jghali 369
        if (h == 0)
23060 craig 370
                h = PrefsManager::instance().appPrefs.docSetupPrefs.pageHeight;
16682 jghali 371
        docX = x;
372
        docY = y;
373
        docWidth = b - x;
374
        docHeight = h - y;
375
        baseX = 0;
376
        baseY = 0;
377
        if (!interactive || (flags & LoadSavePlugin::lfInsertPage))
378
        {
379
                m_Doc->setPage(b-x, h-y, 0, 0, 0, 0, 0, 0, false, false);
380
                m_Doc->addPage(0);
381
                m_Doc->view()->addPage(0, true);
382
                baseX = 0;
383
                baseY = 0;
384
        }
385
        else
386
        {
387
                if (!m_Doc || (flags & LoadSavePlugin::lfCreateDoc))
388
                {
389
                        m_Doc=ScCore->primaryMainWindow()->doFileNew(b-x, h-y, 0, 0, 0, 0, 0, 0, false, false, 0, false, 0, 1, "Custom", true);
390
                        ScCore->primaryMainWindow()->HaveNewDoc();
391
                        ret = true;
392
                        baseX = 0;
393
                        baseY = 0;
394
                }
395
        }
396
        if (flags & LoadSavePlugin::lfCreateDoc)
397
        {
398
                m_Doc->documentInfo().setAuthor(docCreator);
399
                m_Doc->documentInfo().setPublisher(docOrganisation);
400
                m_Doc->documentInfo().setTitle(docTitle);
401
                m_Doc->documentInfo().setDate(docDate+" "+docTime);
402
        }
24744 jghali 403
        if (!ret && interactive)
16682 jghali 404
        {
405
                baseX = m_Doc->currentPage()->xOffset();
406
                baseY = m_Doc->currentPage()->yOffset();
407
        }
24744 jghali 408
        if (ret || !interactive)
16682 jghali 409
        {
410
                if (b-x > h-y)
411
                        m_Doc->setPageOrientation(1);
412
                else
413
                        m_Doc->setPageOrientation(0);
414
                m_Doc->setPageSize("Custom");
415
        }
24744 jghali 416
        for (auto it = CustColors.begin(); it != CustColors.end(); ++it)
16682 jghali 417
        {
418
                if (!m_Doc->PageColors.contains(it.key()))
419
                {
420
                        m_Doc->PageColors.insert(it.key(), it.value());
421
                        importedColors.append(it.key());
422
                }
423
        }
22527 craig 424
        if ((!(flags & LoadSavePlugin::lfLoadAsPattern)) && (m_Doc->view() != nullptr))
23390 craig 425
                m_Doc->view()->deselectItems();
16682 jghali 426
        Elements.clear();
427
        m_Doc->setLoading(true);
428
        m_Doc->DoDrawing = false;
22527 craig 429
        if ((!(flags & LoadSavePlugin::lfLoadAsPattern)) && (m_Doc->view() != nullptr))
16682 jghali 430
                m_Doc->view()->updatesOn(false);
431
        m_Doc->scMW()->setScriptRunning(true);
24744 jghali 432
        QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
16682 jghali 433
        QString CurDirP = QDir::currentPath();
434
        QDir::setCurrent(fi.path());
435
        if (convert(fName))
436
        {
437
                if (Elements.count() == 0)
438
                {
439
                        if ((importedColors.count() != 0) && (!((flags & LoadSavePlugin::lfKeepGradients) || (flags & LoadSavePlugin::lfKeepColors) || (flags & LoadSavePlugin::lfKeepPatterns))))
440
                        {
441
                                for (int cd = 0; cd < importedColors.count(); cd++)
442
                                {
443
                                        m_Doc->PageColors.remove(importedColors[cd]);
444
                                }
445
                        }
446
                        if ((importedGradients.count() != 0) && (!((flags & LoadSavePlugin::lfKeepGradients || (flags & LoadSavePlugin::lfKeepPatterns)))))
447
                        {
448
                                for (int cd = 0; cd < importedGradients.count(); cd++)
449
                                {
450
                                        m_Doc->docGradients.remove(importedGradients[cd]);
451
                                }
452
                        }
453
                        if ((importedPatterns.count() != 0) && (!(flags & LoadSavePlugin::lfKeepPatterns)))
454
                        {
455
                                for (int cd = 0; cd < importedPatterns.count(); cd++)
456
                                {
457
                                        m_Doc->docPatterns.remove(importedPatterns[cd]);
458
                                }
459
                        }
460
                }
461
                tmpSel->clear();
462
                QDir::setCurrent(CurDirP);
463
                if ((Elements.count() > 1) && (!(importerFlags & LoadSavePlugin::lfCreateDoc)))
464
                        m_Doc->groupObjectsList(Elements);
465
                m_Doc->DoDrawing = true;
466
                m_Doc->scMW()->setScriptRunning(false);
467
                m_Doc->setLoading(false);
24744 jghali 468
                QGuiApplication::changeOverrideCursor(QCursor(Qt::ArrowCursor));
16682 jghali 469
                if ((Elements.count() > 0) && (!ret) && (interactive))
470
                {
471
                        if (flags & LoadSavePlugin::lfScripted)
472
                        {
473
                                bool loadF = m_Doc->isLoading();
474
                                m_Doc->setLoading(false);
475
                                m_Doc->changed();
476
                                m_Doc->setLoading(loadF);
477
                                if (!(flags & LoadSavePlugin::lfLoadAsPattern))
478
                                {
479
                                        m_Doc->m_Selection->delaySignalsOn();
480
                                        for (int dre=0; dre<Elements.count(); ++dre)
481
                                        {
482
                                                m_Doc->m_Selection->addItem(Elements.at(dre), true);
483
                                        }
484
                                        m_Doc->m_Selection->delaySignalsOff();
485
                                        m_Doc->m_Selection->setGroupRect();
22527 craig 486
                                        if (m_Doc->view() != nullptr)
19856 fschmid 487
                                                m_Doc->view()->updatesOn(true);
16682 jghali 488
                                }
489
                        }
490
                        else
491
                        {
492
                                m_Doc->DragP = true;
22609 craig 493
                                m_Doc->DraggedElem = nullptr;
16682 jghali 494
                                m_Doc->DragElements.clear();
495
                                m_Doc->m_Selection->delaySignalsOn();
496
                                for (int dre=0; dre<Elements.count(); ++dre)
497
                                {
498
                                        tmpSel->addItem(Elements.at(dre), true);
499
                                }
500
                                tmpSel->setGroupRect();
22686 jghali 501
                                ScElemMimeData* md = ScriXmlDoc::writeToMimeData(m_Doc, tmpSel);
16682 jghali 502
                                m_Doc->itemSelection_DeleteItem(tmpSel);
503
                                m_Doc->view()->updatesOn(true);
504
                                if ((importedColors.count() != 0) && (!((flags & LoadSavePlugin::lfKeepGradients) || (flags & LoadSavePlugin::lfKeepColors) || (flags & LoadSavePlugin::lfKeepPatterns))))
505
                                {
506
                                        for (int cd = 0; cd < importedColors.count(); cd++)
507
                                        {
508
                                                m_Doc->PageColors.remove(importedColors[cd]);
509
                                        }
510
                                }
511
                                if ((importedGradients.count() != 0) && (!((flags & LoadSavePlugin::lfKeepGradients || (flags & LoadSavePlugin::lfKeepPatterns)))))
512
                                {
513
                                        for (int cd = 0; cd < importedGradients.count(); cd++)
514
                                        {
515
                                                m_Doc->docGradients.remove(importedGradients[cd]);
516
                                        }
517
                                }
518
                                if ((importedPatterns.count() != 0) && (!(flags & LoadSavePlugin::lfKeepPatterns)))
519
                                {
520
                                        for (int cd = 0; cd < importedPatterns.count(); cd++)
521
                                        {
522
                                                m_Doc->docPatterns.remove(importedPatterns[cd]);
523
                                        }
524
                                }
525
                                m_Doc->m_Selection->delaySignalsOff();
526
                                // We must copy the TransationSettings object as it is owned
527
                                // by handleObjectImport method afterwards
528
                                TransactionSettings* transacSettings = new TransactionSettings(trSettings);
529
                                m_Doc->view()->handleObjectImport(md, transacSettings);
530
                                m_Doc->DragP = false;
22609 craig 531
                                m_Doc->DraggedElem = nullptr;
16682 jghali 532
                                m_Doc->DragElements.clear();
533
                        }
534
                }
535
                else
536
                {
537
                        m_Doc->changed();
538
                        m_Doc->reformPages();
539
                        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
540
                                m_Doc->view()->updatesOn(true);
541
                }
542
                success = true;
543
        }
544
        else
545
        {
546
                QDir::setCurrent(CurDirP);
547
                m_Doc->DoDrawing = true;
548
                m_Doc->scMW()->setScriptRunning(false);
549
                m_Doc->view()->updatesOn(true);
24744 jghali 550
                QGuiApplication::changeOverrideCursor(QCursor(Qt::ArrowCursor));
16682 jghali 551
        }
552
        if (interactive)
553
                m_Doc->setLoading(false);
554
        //CB If we have a gui we must refresh it if we have used the progressbar
555
        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
556
        {
24744 jghali 557
                if (showProgress && !interactive)
16682 jghali 558
                        m_Doc->view()->DrawNew();
559
        }
560
        if (convertedPDF)
561
                QFile::remove(fName);
24744 jghali 562
        QGuiApplication::restoreOverrideCursor();
16682 jghali 563
        return success;
564
}
565
 
566
AIPlug::~AIPlug()
567
{
22609 craig 568
        delete progressDialog;
16682 jghali 569
        delete tmpSel;
570
}
571
 
22609 craig 572
bool AIPlug::extractFromPDF(const QString& infile, const QString& outfile)
16682 jghali 573
{
574
        bool ret = false;
575
#ifdef HAVE_PODOFO
576
        QFile outf(outfile);
21982 craig 577
        if (!outf.open(QIODevice::WriteOnly))
578
        {
24744 jghali 579
                qDebug() << "Failed to open QFile outf in AIPlug::extractFromPDF";
21982 craig 580
                return false;
581
        }
16682 jghali 582
        try
583
        {
584
                PoDoFo::PdfError::EnableDebug( false );
585
                PoDoFo::PdfError::EnableLogging( false );
586
                PoDoFo::PdfMemDocument doc( infile.toLocal8Bit().data() );
587
                PoDoFo::PdfPage *curPage = doc.GetPage(0);
22527 craig 588
                if (curPage != nullptr)
16682 jghali 589
                {
590
                        PoDoFo::PdfObject *piece = curPage->GetObject()->GetIndirectKey("PieceInfo");
22527 craig 591
                        if (piece != nullptr)
16682 jghali 592
                        {
593
                                PoDoFo::PdfObject *illy = piece->GetIndirectKey("Illustrator");
22527 craig 594
                                if (illy != nullptr)
16682 jghali 595
                                {
596
                                        PoDoFo::PdfObject *priv = illy->GetIndirectKey("Private");
22527 craig 597
                                        if (priv == nullptr)
16682 jghali 598
                                                priv = illy;
599
                                        int num = 0;
600
                                        PoDoFo::PdfObject *numBl = priv->GetIndirectKey("NumBlock");
22527 craig 601
                                        if (numBl != nullptr)
16682 jghali 602
                                                num = numBl->GetNumber() + 1;
603
                                        if (num == 0)
604
                                                num = 99999;
605
                                        QString name = "AIPrivateData%1";
606
                                        QString Key = name.arg(1);
607
                                        PoDoFo::PdfObject *data = priv->GetIndirectKey(PoDoFo::PdfName(Key.toUtf8().data()));
22527 craig 608
                                        if (data == nullptr)
16682 jghali 609
                                        {
610
                                                name = "AIPDFPrivateData%1";
611
                                                Key = name.arg(1);
612
                                                data = priv->GetIndirectKey(PoDoFo::PdfName(Key.toUtf8().data()));
613
                                        }
22527 craig 614
                                        if (data != nullptr)
16682 jghali 615
                                        {
616
                                                if (num == 2)
617
                                                {
618
                                                        Key = name.arg(1);
619
                                                        data = priv->GetIndirectKey(PoDoFo::PdfName(Key.toUtf8().data()));
620
                                                        PoDoFo::PdfStream const *stream = data->GetStream();
621
                                                        PoDoFo::PdfMemoryOutputStream oStream(1);
622
                                                        stream->GetFilteredCopy(&oStream);
623
                                                        oStream.Close();
624
                                                        long bLen = oStream.GetLength();
625
                                                        char *Buffer = oStream.TakeBuffer();
626
                                                        outf.write(Buffer, bLen);
627
                                                        free( Buffer );
628
                                                }
629
                                                else
630
                                                {
631
                                                        for (int a = 2; a < num; a++)
632
                                                        {
633
                                                                Key = name.arg(a);
634
                                                                data = priv->GetIndirectKey(PoDoFo::PdfName(Key.toUtf8().data()));
22527 craig 635
                                                                if (data == nullptr)
16682 jghali 636
                                                                        break;
637
                                                                PoDoFo::PdfStream const *stream = data->GetStream();
638
                                                                PoDoFo::PdfMemoryOutputStream oStream(1);
639
                                                                stream->GetFilteredCopy(&oStream);
640
                                                                oStream.Close();
641
                                                                long bLen = oStream.GetLength();
642
                                                                char *Buffer = oStream.TakeBuffer();
643
                                                                outf.write(Buffer, bLen);
644
                                                                free( Buffer );
645
                                                        }
646
                                                }
647
                                        }
648
                                        ret = true;
649
                                }
650
                        }
651
                }
652
                outf.close();
653
        }
654
        catch (PoDoFo::PdfError& e)
655
        {
656
                outf.close();
657
                qDebug("Scribus caught and handled the following exception from PoDoFo while processing a PDF format ai file:\n----\n");
658
                e.PrintErrorMsg();
659
                qDebug("----\nThe ai file could not be imported.\n");
660
                QFile::remove(outfile);
661
                return false;
662
        }
663
#endif
664
        return ret;
665
}
666
 
667
bool AIPlug::decompressAIData(QString &fName)
668
{
24744 jghali 669
        QString f2 = fName + "_decom.ai";
17526 jghali 670
 
22405 jghali 671
        QFile source(fName);
672
        if (!source.open(QFile::ReadOnly))
17526 jghali 673
                return false;
22405 jghali 674
        if (!source.seek(20))
21983 craig 675
        {
22405 jghali 676
                source.close();
21983 craig 677
                return false;
678
        }
22405 jghali 679
 
680
        QtIOCompressor compressor(&source);
681
        compressor.setStreamFormat(QtIOCompressor::ZlibFormat);
682
        if (!compressor.open(QIODevice::ReadOnly))
17526 jghali 683
        {
22405 jghali 684
                source.close();
17526 jghali 685
                return false;
686
        }
687
 
22405 jghali 688
        QFile dest(f2);
689
        if (!dest.open(QFile::WriteOnly))
17526 jghali 690
        {
22405 jghali 691
                source.close();
16682 jghali 692
                return false;
17526 jghali 693
        }
22405 jghali 694
        QDataStream destStream(&dest);
20746 jghali 695
 
22405 jghali 696
        qint64 bytesRead = -1;
697
        qint64 bytesWritten = -1;
24744 jghali 698
        char buffer[4096];
22405 jghali 699
 
700
        bytesRead = compressor.read(buffer, 4096);
701
        while (bytesRead > 0)
16682 jghali 702
        {
22405 jghali 703
                bytesWritten = destStream.writeRawData(buffer, (int) bytesRead);
704
                if (bytesWritten < 0)
16682 jghali 705
                        break;
22405 jghali 706
                bytesRead = compressor.read(buffer, 4096);
16682 jghali 707
        }
22405 jghali 708
 
709
        compressor.close();
710
        source.close();
711
        dest.close();
712
 
713
        if (bytesRead < 0 || bytesWritten < 0)
714
                return false;
715
 
16682 jghali 716
        if (!convertedPDF)
717
        {
718
                QFileInfo bF2(fName);
24744 jghali 719
                QString tmpFile = ScPaths::tempFileDir() +  "/" + bF2.baseName() + "_tmp.ai";
16682 jghali 720
                moveFile(f2, tmpFile);
721
                fName = tmpFile;
722
                convertedPDF = true;
723
        }
724
        else
725
        {
726
                QFile::remove(fName);
727
                fName = f2;
728
        }
729
        return true;
730
}
731
 
22609 craig 732
bool AIPlug::parseHeader(const QString& fName, double &x, double &y, double &b, double &h)
16682 jghali 733
{
21951 craig 734
        QString tmp, BBox, FarNam;
16682 jghali 735
        ScColor cc;
736
        double c, m, yc, k;
737
        bool found = false;
738
        QFile f(fName);
739
        if (f.open(QIODevice::ReadOnly))
740
        {
741
/* Try to find Bounding Box */
742
                bool isAtend = false;
743
                QDataStream ts(&f);
744
                while (!ts.atEnd())
745
                {
22408 jghali 746
                        tmp = readLineFromDataStream(ts);
16682 jghali 747
                        if (tmp.startsWith("%%BoundingBox:"))
748
                        {
749
                                found = true;
750
                                BBox = tmp.remove("%%BoundingBox:");
751
                        }
752
                        if (!found)
753
                        {
754
                                if (tmp.startsWith("%%BoundingBox"))
755
                                {
756
                                        found = true;
757
                                        BBox = tmp.remove("%%BoundingBox");
758
                                }
759
                        }
760
                        if (tmp.startsWith("%%HiResBoundingBox:"))
761
                        {
762
                                found = true;
763
                                BBox = tmp.remove("%%HiResBoundingBox:");
764
                        }
765
                //      if (tmp.startsWith("%AI3_TileBox:"))
766
                //      {
767
                //              found = true;
768
                //              BBox = tmp.remove("%AI3_TileBox:");
769
                //      }
770
                        if (tmp.startsWith("%%For"))
771
                        {
772
                                QStringList res = getStrings(tmp);
773
                                if (res.count() > 1)
774
                                {
775
                                        docCreator = res[0];
776
                                        docOrganisation = res[1];
777
                                }
778
                        }
779
                        if (tmp.startsWith("%%CreationDate:"))
780
                        {
781
                                QStringList res = getStrings(tmp);
782
                                if (res.count() > 1)
783
                                {
784
                                        docDate = res[0];
785
                                        docTime = res[1];
786
                                }
787
                                else
788
                                {
789
                                        docDate = tmp.remove("%%CreationDate: ");
790
                                        docTime = "";
791
                                }
792
                        }
793
                        if (tmp.startsWith("%%Title"))
794
                        {
795
                                QStringList res = getStrings(tmp);
796
                                if (res.count() > 0)
797
                                        docTitle = res[0];
798
                        }
799
                        if ((tmp.startsWith("%%CMYKCustomColor")) || (tmp.startsWith("%%CMYKProcessColor")))
800
                        {
801
                                if (tmp.contains("(atend)"))
802
                                        isAtend = true;
803
                                else
804
                                {
805
                                        if (tmp.startsWith("%%CMYKCustomColor"))
806
                                                tmp = tmp.remove(0,18);
807
                                        else if (tmp.startsWith("%%CMYKProcessColor"))
808
                                                tmp = tmp.remove(0,19);
809
                                        ScTextStream ts2(&tmp, QIODevice::ReadOnly);
810
                                        ts2 >> c >> m >> yc >> k;
811
                                        FarNam = ts2.readAll();
812
                                        FarNam = FarNam.trimmed();
813
                                        FarNam = FarNam.remove(0,1);
814
                                        FarNam = FarNam.remove(FarNam.length()-1,1);
815
                                        FarNam = FarNam.simplified();
816
                                        QByteArray farN;
817
                                        for (int a = 0; a < FarNam.length(); a++)
818
                                        {
819
                                                QChar ch = FarNam.at(a);
820
                                                uint chc = ch.unicode();
821
                                                if (chc > 255)
822
                                                        farN.append(chc >> 8);
823
                                                farN.append(chc & 0x00FF);
824
                                        }
825
                                        FarNam = QString::fromUtf8(farN.constData());
826
                                        cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * yc), qRound(255 * k));
827
                                        cc.setSpotColor(true);
828
                                        if (!FarNam.isEmpty())
829
                                                CustColors.tryAddColor(FarNam, cc);
830
                                        while (!ts.atEnd())
831
                                        {
832
                                                quint64 oldPos = ts.device()->pos();
22408 jghali 833
                                                tmp = readLineFromDataStream(ts);
16682 jghali 834
                                                if (!tmp.startsWith("%%+"))
835
                                                {
836
                                                        ts.device()->seek(oldPos);
837
                                                        break;
838
                                                }
839
                                                tmp = tmp.remove(0,3);
840
                                                ScTextStream ts2(&tmp, QIODevice::ReadOnly);
841
                                                ts2 >> c >> m >> yc >> k;
842
                                                FarNam = ts2.readAll();
843
                                                FarNam = FarNam.trimmed();
844
                                                FarNam = FarNam.remove(0,1);
845
                                                FarNam = FarNam.remove(FarNam.length()-1,1);
846
                                                FarNam = FarNam.simplified();
847
                                                QByteArray farN;
848
                                                for (int a = 0; a < FarNam.length(); a++)
849
                                                {
850
                                                        QChar ch = FarNam.at(a);
851
                                                        uint chc = ch.unicode();
852
                                                        if (chc > 255)
853
                                                                farN.append(chc >> 8);
854
                                                        farN.append(chc & 0x00FF);
855
                                                }
856
                                                FarNam = QString::fromUtf8(farN.constData());
857
                                                cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * yc), qRound(255 * k));
858
                                                cc.setSpotColor(true);
859
                                                if (!FarNam.isEmpty())
860
                                                        CustColors.tryAddColor(FarNam, cc);
861
                                        }
862
                                }
863
                        }
864
                        if ((tmp.startsWith("%%RGBCustomColor")) || (tmp.startsWith("%%RGBProcessColor")))
865
                        {
866
                                if (tmp.contains("(atend)"))
867
                                        isAtend = true;
868
                                else
869
                                {
870
                                        if (tmp.startsWith("%%RGBCustomColor"))
871
                                                tmp = tmp.remove(0,17);
872
                                        else if (tmp.startsWith("%%RGBProcessColor"))
873
                                                tmp = tmp.remove(0,18);
874
                                        ScTextStream ts2(&tmp, QIODevice::ReadOnly);
875
                                        ts2 >> c >> m >> yc;
876
                                        FarNam = ts2.readAll();
877
                                        FarNam = FarNam.trimmed();
878
                                        FarNam = FarNam.remove(0,1);
879
                                        FarNam = FarNam.remove(FarNam.length()-1,1);
880
                                        FarNam = FarNam.simplified();
881
                                        QByteArray farN;
882
                                        for (int a = 0; a < FarNam.length(); a++)
883
                                        {
884
                                                QChar ch = FarNam.at(a);
885
                                                uint chc = ch.unicode();
886
                                                if (chc > 255)
887
                                                        farN.append(chc >> 8);
888
                                                farN.append(chc & 0x00FF);
889
                                        }
890
                                        FarNam = QString::fromUtf8(farN.constData());
891
                                        cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * yc));
892
                                        if (!FarNam.isEmpty())
893
                                                CustColors.tryAddColor(FarNam, cc);
894
                                        while (!ts.atEnd())
895
                                        {
896
                                                quint64 oldPos = ts.device()->pos();
22408 jghali 897
                                                tmp = readLineFromDataStream(ts);
16682 jghali 898
                                                if (!tmp.startsWith("%%+"))
899
                                                {
900
                                                        ts.device()->seek(oldPos);
901
                                                        break;
902
                                                }
903
                                                tmp = tmp.remove(0,3);
904
                                                ScTextStream ts2(&tmp, QIODevice::ReadOnly);
905
                                                ts2 >> c >> m >> yc;
906
                                                FarNam = ts2.readAll();
907
                                                FarNam = FarNam.trimmed();
908
                                                FarNam = FarNam.remove(0,1);
909
                                                FarNam = FarNam.remove(FarNam.length()-1,1);
910
                                                FarNam = FarNam.simplified();
911
                                                QByteArray farN;
912
                                                for (int a = 0; a < FarNam.length(); a++)
913
                                                {
914
                                                        QChar ch = FarNam.at(a);
915
                                                        uint chc = ch.unicode();
916
                                                        if (chc > 255)
917
                                                                farN.append(chc >> 8);
918
                                                        farN.append(chc & 0x00FF);
919
                                                }
920
                                                FarNam = QString::fromUtf8(farN.constData());
921
                                                cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * yc));
922
                                                if (!FarNam.isEmpty())
923
                                                        CustColors.tryAddColor(FarNam, cc);
924
                                        }
925
                                }
926
                        }
927
                        if (tmp.startsWith("%%EndComments"))
928
                        {
929
                                while (!ts.atEnd())
930
                                {
931
                                        bool isX = false;
22408 jghali 932
                                        tmp = readLineFromDataStream(ts);
16682 jghali 933
                                        if ((tmp.endsWith("Xa") || tmp.endsWith(" k") || tmp.endsWith(" x")) && (tmp.length() > 4))
934
                                        {
935
                                                ScTextStream ts2(&tmp, QIODevice::ReadOnly);
936
                                                ts2 >> c >> m >> yc >> k;
937
                                                if (tmp.endsWith(" x"))
938
                                                {
939
                                                        isX = true;
940
                                                        int an = tmp.indexOf("(");
941
                                                        int en = tmp.lastIndexOf(")");
942
                                                        FarNam = tmp.mid(an+1, en-an-1);
943
                                                        FarNam = FarNam.simplified();
944
                                                        QByteArray farN;
945
                                                        for (int a = 0; a < FarNam.length(); a++)
946
                                                        {
947
                                                                QChar ch = FarNam.at(a);
948
                                                                uint chc = ch.unicode();
949
                                                                if (chc > 255)
950
                                                                        farN.append(chc >> 8);
951
                                                                farN.append(chc & 0x00FF);
952
                                                        }
953
                                                        FarNam = QString::fromUtf8(farN.constData());
954
                                                }
22408 jghali 955
                                                tmp = readLineFromDataStream(ts);
16682 jghali 956
                                                if (tmp.endsWith("Pc"))
957
                                                {
958
                                                        if (!isX)
959
                                                        {
960
                                                                tmp = tmp.trimmed();
961
                                                                tmp = tmp.remove(0,1);
962
                                                                int en = tmp.indexOf(")");
963
                                                                FarNam = tmp.mid(0, en);
964
                                                                FarNam = FarNam.simplified();
965
                                                                QByteArray farN;
966
                                                                for (int a = 0; a < FarNam.length(); a++)
967
                                                                {
968
                                                                        QChar ch = FarNam.at(a);
969
                                                                        uint chc = ch.unicode();
970
                                                                        if (chc > 255)
971
                                                                                farN.append(chc >> 8);
972
                                                                        farN.append(chc & 0x00FF);
973
                                                                }
974
                                                                FarNam = QString::fromUtf8(farN.constData());
975
                                                        }
976
                                                        cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * yc), qRound(255 * k));
977
                                                        cc.setSpotColor(true);
978
                                                        CustColors.tryAddColor(FarNam, cc);
979
                                                }
980
                                        }
981
                                }
982
                                if (!isAtend)
983
                                        break;
984
                        }
985
                }
986
                f.close();
987
                if (found)
988
                {
24202 craig 989
                        QStringList bb = BBox.split(" ", Qt::SkipEmptyParts);
16682 jghali 990
                        if (bb.count() == 4)
991
                        {
992
                                x = ScCLocale::toDoubleC(bb[0]);
993
                                y = ScCLocale::toDoubleC(bb[1]);
994
                                b = ScCLocale::toDoubleC(bb[2]);
995
                                h = ScCLocale::toDoubleC(bb[3]);
996
                        }
997
                }
998
        }
999
        return found;
1000
}
1001
 
1002
QString AIPlug::removeAIPrefix(QString comment)
1003
{
1004
        QString tmp;
1005
        if (comment.startsWith("%AI"))
1006
        {
1007
                int an = comment.indexOf("_");
1008
                tmp = comment.remove(0, an+1);
1009
        }
1010
        else
1011
                tmp = comment;
1012
        return tmp;
1013
}
1014
 
1015
QString AIPlug::parseColor(QString data)
1016
{
1017
        QString ret = CommonStrings::None;
1018
        if (data.isEmpty())
1019
                return ret;
1020
        double c, m, y, k;
1021
        ScColor tmp;
1022
        ScTextStream Code(&data, QIODevice::ReadOnly);
1023
        Code >> c;
1024
        Code >> m;
1025
        Code >> y;
1026
        Code >> k;
22212 jghali 1027
        tmp.setColorF(c, m, y, k);
16682 jghali 1028
        tmp.setSpotColor(false);
1029
        tmp.setRegistrationColor(false);
1030
        QString namPrefix = "FromAI";
1031
        QString fNam = m_Doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
1032
        if (fNam == namPrefix+tmp.name())
1033
                importedColors.append(fNam);
1034
        ret = fNam;
1035
        meshColorMode = 0;
1036
        return ret;
1037
}
1038
 
1039
QString AIPlug::parseColorGray(QString data)
1040
{
1041
        QString ret = CommonStrings::None;
1042
        if (data.isEmpty())
1043
                return ret;
1044
        double k;
1045
        ScColor tmp;
1046
        ColorList::Iterator it;
1047
        ScTextStream Code(&data, QIODevice::ReadOnly);
1048
        Code >> k;
22212 jghali 1049
        tmp.setColorF(0, 0, 0, 1.0 - k);
16682 jghali 1050
        tmp.setSpotColor(false);
1051
        tmp.setRegistrationColor(false);
1052
        QString namPrefix = "FromAI";
1053
        QString fNam = m_Doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
1054
        if (fNam == namPrefix+tmp.name())
1055
                importedColors.append(fNam);
1056
        ret = fNam;
1057
        meshColorMode = 2;
1058
        return ret;
1059
}
1060
 
1061
QString AIPlug::parseColorRGB(QString data)
1062
{
1063
        QString ret = CommonStrings::None;
1064
        if (data.isEmpty())
1065
                return ret;
1066
        double r, g, b;
1067
        ScColor tmp;
1068
        ScTextStream Code(&data, QIODevice::ReadOnly);
1069
        Code >> r;
1070
        Code >> g;
1071
        Code >> b;
22212 jghali 1072
        tmp.setRgbColorF(r, g, b);
16682 jghali 1073
        tmp.setSpotColor(false);
1074
        tmp.setRegistrationColor(false);
1075
        QString namPrefix = "FromAI";
1076
        QString fNam = m_Doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
1077
        if (fNam == namPrefix+tmp.name())
1078
                importedColors.append(fNam);
1079
        ret = fNam;
1080
        meshColorMode = 1;
1081
        return ret;
1082
}
1083
 
1084
QString AIPlug::parseCustomColor(QString data, double &shade)
1085
{
1086
        QString ret = CommonStrings::None;
1087
        if (data.isEmpty())
1088
                return ret;
1089
        double c, m, y, k, sh;
1090
        ScColor tmp;
1091
        ScTextStream Code(&data, QIODevice::ReadOnly);
1092
        Code >> c;
1093
        Code >> m;
1094
        Code >> y;
1095
        Code >> k;
1096
        int an = data.indexOf("(");
1097
        int en = data.lastIndexOf(")");
1098
        QString FarNam = data.mid(an+1, en-an-1);
1099
        FarNam.remove("\\");
1100
        QString FarSha = data.mid(en+1, data.size() - en);
1101
        ScTextStream Val(&FarSha, QIODevice::ReadOnly);
1102
        Val >> sh;
1103
        shade = (1.0 - sh) * 100.0;
22212 jghali 1104
        tmp.setColorF(c, m, y, k);
16682 jghali 1105
        tmp.setSpotColor(true);
1106
        tmp.setRegistrationColor(false);
1107
        QString fNam = m_Doc->PageColors.tryAddColor(FarNam, tmp);
1108
        if (fNam == FarNam)
1109
                importedColors.append(FarNam);
1110
        ret = fNam;
1111
        meshColorMode = 0;
1112
        return ret;
1113
}
1114
 
22609 craig 1115
QString AIPlug::parseCustomColorX(QString data, double &shade, const QString& type)
16682 jghali 1116
{
1117
        QString ret = CommonStrings::None;
1118
        if (data.isEmpty())
1119
                return ret;
1120
        double c, m, y, k, sh, r, g, b;
1121
        ScColor tmp;
1122
        ScTextStream Code(&data, QIODevice::ReadOnly);
1123
        if (type == "1")
1124
        {
1125
                Code >> r;
1126
                Code >> g;
1127
                Code >> b;
22212 jghali 1128
                tmp.setRgbColorF(r, g, b);
16682 jghali 1129
                meshColorMode = 1;
1130
        }
1131
        else
1132
        {
1133
                Code >> c;
1134
                Code >> m;
1135
                Code >> y;
1136
                Code >> k;
22212 jghali 1137
                tmp.setColorF(c, m, y, k);
16682 jghali 1138
                meshColorMode = 0;
1139
        }
1140
        int an = data.indexOf("(");
1141
        int en = data.lastIndexOf(")");
1142
        QString FarNam = data.mid(an+1, en-an-1);
1143
        FarNam.remove("\\");
1144
        QString FarSha = data.mid(en+1, data.size() - en);
1145
        ScTextStream Val(&FarSha, QIODevice::ReadOnly);
1146
        Val >> sh;
1147
        shade = (1.0 - sh) * 100.0;
1148
        if (type == "0")
1149
                tmp.setSpotColor(true);
1150
        tmp.setRegistrationColor(false);
1151
        QString fNam = m_Doc->PageColors.tryAddColor(FarNam, tmp);
1152
        if (fNam == FarNam)
1153
                importedColors.append(FarNam);
1154
        ret = fNam;
1155
        return ret;
1156
}
1157
 
22635 craig 1158
QStringList AIPlug::getStrings(const QString& data)
16682 jghali 1159
{
1160
        QStringList result;
1161
        result.clear();
1162
        QChar tmp;
22635 craig 1163
        QString tmp2;
1164
        QString tmp3;
16682 jghali 1165
        bool paran = false;
1166
        bool skip = false;
1167
        int digitCount = 0;
22635 craig 1168
        for (int i = 0; i < data.count(); i++)
16682 jghali 1169
        {
22635 craig 1170
                tmp = data[i];
16682 jghali 1171
                if (skip)
1172
                {
1173
                        if (paran)
1174
                        {
1175
                                if (tmp.isDigit())
1176
                                {
1177
                                        tmp3 += tmp;
1178
                                        digitCount++;
1179
                                        if (digitCount == 3)
1180
                                        {
1181
                                                bool ok = false;
1182
                                                int code = tmp3.toInt(&ok, 8);
1183
                                                if (ok)
1184
                                                        tmp2 += QChar(code);
1185
                                                digitCount = 0;
1186
                                                tmp3 = "";
1187
                                                skip = false;
1188
                                        }
1189
                                }
1190
                                else
1191
                                {
1192
                                        if (tmp == 'r')
1193
                                                tmp = SpecialChars::PARSEP;
1194
                                        tmp2 += tmp;
1195
                                        skip = false;
1196
                                }
1197
                        }
1198
                        continue;
1199
                }
1200
                if (tmp == '(')
1201
                {
1202
                        paran = true;
1203
                        continue;
1204
                }
1205
                if (tmp == ')')
1206
                {
1207
                        paran = false;
1208
                        result.append(tmp2);
1209
                        tmp2 = "";
1210
                        continue;
1211
                }
1212
                if (tmp == '\\')
1213
                {
1214
                        skip = true;
1215
                        continue;
1216
                }
1217
                if (paran)
1218
                        tmp2 += tmp;
1219
        }
1220
        return result;
1221
}
1222
 
22635 craig 1223
void AIPlug::getCommands(const QString& data, QStringList &commands)
16682 jghali 1224
{
1225
        QString tmp;
1226
        QString tmp2;
1227
        QString tmp3;
1228
        bool paran = false;
19728 fschmid 1229
        //bool arra = false;
16682 jghali 1230
        bool skip = false;
1231
        for (int a = 0; a < data.count(); a++)
1232
        {
1233
                tmp = data[a];
1234
                if (skip)
1235
                {
1236
                        tmp2 += tmp;
1237
                        skip = false;
1238
                        continue;
1239
                }
1240
                if (tmp == "(")
1241
                {
1242
                        paran = true;
1243
                        tmp2 += tmp;
1244
                        continue;
1245
                }
1246
                if (tmp == ")")
1247
                {
1248
                        paran = false;
1249
                        tmp2 += tmp;
1250
                        continue;
1251
                }
1252
                if (tmp == "[")
1253
                {
19728 fschmid 1254
                //      arra = true;
16682 jghali 1255
                        tmp2 += tmp;
1256
                        continue;
1257
                }
1258
                if (tmp == "]")
1259
                {
19728 fschmid 1260
                //      arra = false;
16682 jghali 1261
                        tmp2 += tmp;
1262
                        continue;
1263
                }
1264
//              if (tmp == "\\")
1265
//              {
1266
//                      skip = true;
1267
//                      continue;
1268
//              }
1269
                if (!paran)
1270
                {
1271
                        if (tmp == " ")
1272
                        {
1273
                                tmp3 += " " + tmp2;
1274
                                if (commandList.contains(tmp2))
1275
                                {
1276
                                        commands.append(tmp3);
1277
                                        tmp3 = "";
1278
                                }
1279
                                tmp2 = "";
1280
                                continue;
1281
                        }
1282
                }
1283
                tmp2 += tmp;
1284
        }
1285
        if (!tmp2.isEmpty())
1286
        {
1287
                tmp3 += " " + tmp2;
1288
                commands.append(tmp3);
1289
        }
1290
}
1291
 
22635 craig 1292
void AIPlug::decodeA85(QByteArray &psdata, const QString& tmp)
16682 jghali 1293
{
1294
        uchar byte;
1295
        ushort data;
1296
        unsigned long sum = 0;
1297
        int quintet = 0;
1298
        for (int c = 0; c < tmp.length(); c++)
1299
        {
1300
                byte = QChar(tmp.at(c)).cell();
1301
                if (byte >= '!' && byte <= 'u')
1302
                {
1303
                        sum = sum * 85 + ((unsigned long)byte - '!');
1304
                        quintet++;
1305
                        if (quintet == 5)
1306
                        {
1307
                                psdata.resize(psdata.size()+4);
1308
                                data = (sum >> 24) & 0xFF;
1309
                                psdata[psdata.size()-4] = data;
1310
                                data = (sum >> 16) & 0xFF;
1311
                                psdata[psdata.size()-3] = data;
1312
                                data = (sum >> 8) & 0xFF;
1313
                                psdata[psdata.size()-2] = data;
1314
                                data = sum & 0xFF;
1315
                                psdata[psdata.size()-1] = data;
1316
                                quintet = 0;
1317
                                sum = 0;
1318
                        }
1319
                }
1320
                else if (byte == 'z')
1321
                {
1322
                        psdata.resize(psdata.size()+4);
1323
                        psdata[psdata.size()-4] = 0;
1324
                        psdata[psdata.size()-3] = 0;
1325
                        psdata[psdata.size()-2] = 0;
1326
                        psdata[psdata.size()-1] = 0;
1327
                }
1328
                else if (byte == '~')
1329
                {
1330
                        if (quintet)
1331
                        {
1332
                                int i;
1333
                                for (i = 0; i < 5 - quintet; i++)
1334
                                        sum *= 85;
1335
                                if (quintet > 1)
1336
                                        sum += (0xFFFFFF >> ((quintet - 2) * 8));
1337
                                for (i = 0; i < quintet - 1; i++)
1338
                                {
1339
                                        data = (sum >> (24 - 8 * i)) & 0xFF;
1340
                                        psdata.resize(psdata.size()+1);
1341
                                        psdata[psdata.size()-1] = data;
1342
                                }
1343
                                quintet = 0;
1344
                        }
1345
                        break;
1346
                }
1347
        }
1348
}
1349
 
22635 craig 1350
void AIPlug::processData(const QString& data)
16682 jghali 1351
{
1352
        double x, y, x1, y1, x2, y2;
1353
        int z, tmpInt;
1354
        PageItem *ite;
24725 craig 1355
        QString command;
1356
        QString Cdata;
16682 jghali 1357
        QStringList da;
1358
        if (dataMode && fObjectMode)
1359
        {
1360
                if (data.contains("~>"))
1361
                {
24734 craig 1362
                        dataString += data.midRef(1);
16682 jghali 1363
                        dataMode = false;
1364
                        QByteArray fData;
1365
                        decodeA85(fData, dataString);
1366
                        dataString = "";
1367
                        if (fObjectMode)
1368
                        {
23038 jghali 1369
                                FPoint wh = currentSpecialPath.widthHeight();
16682 jghali 1370
                                if ((currentSpecialPath.size() > 3) && (wh.x() != 0.0) && (wh.y() != 0.0))
1371
                                {
20561 jghali 1372
                                        z = m_Doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, baseX, baseY, 10, 10, 0, CommonStrings::None, CommonStrings::None);
16682 jghali 1373
                                        ite = m_Doc->Items->at(z);
1374
                                        ite->PoLine = currentSpecialPath.copy();
1375
                                        ite->PoLine.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
1376
                                        ite->ClipEdited = true;
1377
                                        ite->FrameType = 3;
1378
                                        ite->setFillShade(CurrFillShade);
1379
                                        ite->setLineShade(CurrStrokeShade);
1380
                                        ite->setFillEvenOdd(fillRule);
1381
                                        ite->setFillTransparency(1.0 - Opacity);
1382
                                        ite->setLineTransparency(1.0 - Opacity);
1383
                                        ite->setFillBlendmode(blendMode);
1384
                                        ite->setLineBlendmode(blendMode);
1385
                                        ite->setLineEnd(CapStyle);
1386
                                        ite->setLineJoin(JoinStyle);
1387
                                        wh = getMaxClipF(&ite->PoLine);
1388
                                        ite->setWidthHeight(wh.x(),wh.y());
1389
                                        ite->setTextFlowMode(PageItem::TextFlowDisabled);
20694 craig 1390
                                        m_Doc->adjustItemSize(ite);
18203 fschmid 1391
                                        QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + "/scribus_temp_ai_XXXXXX.pdf");
1392
                                        tempFile->setAutoRemove(false);
1393
                                        tempFile->open();
1394
                                        tempFile->write(fData);
1395
                                        QString imgName = getLongPathName(tempFile->fileName());
1396
                                        tempFile->close();
16682 jghali 1397
                                        ite->isInlineImage = true;
18203 fschmid 1398
                                        ite->isTempFile = true;
16943 fschmid 1399
                                        m_Doc->loadPict(imgName, ite);
18203 fschmid 1400
                                        delete tempFile;
19834 craig 1401
                                        if (ite->imageIsAvailable)
16682 jghali 1402
                                                ite->setImageXYScale(ite->width() / ite->pixm.width(), ite->height() / ite->pixm.height());
1403
                                        ite->setImageFlippedV(true);
23040 jghali 1404
                                        ite->Clip = flattenPath(ite->PoLine, ite->Segments);
16682 jghali 1405
                                        ite->setRedrawBounding();
1406
                                        if (importerFlags & LoadSavePlugin::lfCreateDoc)
1407
                                                ite->setLocked(itemLocked);
1408
                                        if (patternMode)
1409
                                                PatternElements.append(ite);
1410
                                        else
1411
                                                Elements.append(ite);
1412
                                        if (groupStack.count() != 0)
1413
                                                groupStack.top().append(ite);
1414
                                }
1415
                        }
1416
                        fObjectMode = false;
1417
                        currentSpecialPath.resize(0);
1418
                        currentSpecialPath.svgInit();
1419
                }
1420
                else
24734 craig 1421
                        dataString += data.midRef(1);
16682 jghali 1422
                return;
1423
        }
1424
        getCommands(data, da);
1425
        for (int a = 0; a < da.count(); a++)
1426
        {
1427
                Cdata = da[a];
1428
                if (((Cdata.startsWith("%")) || (Cdata.startsWith(" %"))) && (!meshMode))
1429
                        continue;
1430
                if (Cdata.contains("SymbolInstance"))
1431
                {
1432
                        symbolMode = true;
1433
                        return;
1434
                }
1435
                if (symbolMode)
1436
                {
1437
                        if (Cdata.contains("SymbolRef"))
1438
                        {
1439
                                int an = Cdata.indexOf("(");
1440
                                int en = Cdata.lastIndexOf(")");
1441
                                if ((an != -1) && (en != -1))
1442
                                {
1443
                                        currentSymbolName = Cdata.mid(an+1, en-an-1);
1444
                                        currentSymbolName.remove("\\");
1445
                                        currentSymbolName = "S_"+currentSymbolName.trimmed().simplified().replace(" ", "_");
1446
                                }
1447
                        }
1448
                        else if (Cdata.contains("TransformMatrix"))
1449
                        {
1450
                                ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1451
                                ts2 >> x >> y >> x1 >> y1 >> x2 >> y2;
24744 jghali 1452
                                QTransform symTrans(x, y, x1, y1, x2, y2);
16682 jghali 1453
                                double rotation = getRotationFromMatrix(symTrans, 0.0);
1454
                                QTransform symT;
1455
                                symT.translate(x2, y2);
1456
                                QPointF pos1 = importedSymbols[currentSymbolName];
1457
                                pos1 = symT.map(pos1);
1458
                                double xp = pos1.x();
1459
                                double yp = pos1.y();
1460
                        //      xp += m_Doc->currentPage()->xOffset();
1461
                        //      yp += m_Doc->currentPage()->yOffset();
20561 jghali 1462
                                int z = m_Doc->itemAdd(PageItem::Symbol, PageItem::Unspecified, baseX + xp, baseY + yp, 1, 1, 0, CommonStrings::None, CommonStrings::None);
16682 jghali 1463
                                PageItem *b = m_Doc->Items->at(z);
22832 craig 1464
                                b->m_layerID = m_Doc->activeLayer();
16682 jghali 1465
                                ScPattern pat = m_Doc->docPatterns[currentSymbolName];
1466
                                b->setWidth(pat.width * symTrans.m11());
1467
                                b->setHeight(pat.height * symTrans.m22());
1468
                                b->OldB2 = b->width();
1469
                                b->OldH2 = b->height();
1470
                                b->setPattern(currentSymbolName);
1471
                                double xoffset = 0.0, yoffset = 0.0;
1472
                        //      if (rotation != 0.0)
1473
                        //      {
1474
                        //              double temp = -b->height();
1475
                        //              xoffset = sin(-rotation) * temp;
1476
                        //              yoffset = cos(-rotation) * temp;
1477
                        //      }
1478
                                b->setXPos(xp + xoffset);
1479
                                b->setYPos(yp + yoffset);
21392 craig 1480
                                m_Doc->setRotationMode(3);
20694 craig 1481
                                m_Doc->rotateItem(rotation * 180 / M_PI, b);
21392 craig 1482
                                m_Doc->setRotationMode(0);
16682 jghali 1483
//                              b->setRotation(rotation * 180 / M_PI);
1484
                                b->setTextFlowMode(PageItem::TextFlowDisabled);
1485
                                b->setFillTransparency(1.0 - Opacity);
1486
                                b->setLineTransparency(1.0 - Opacity);
1487
                                b->setFillBlendmode(blendMode);
1488
                                b->setLineBlendmode(blendMode);
1489
                                b->updateClip();
1490
                                if (patternMode)
1491
                                        PatternElements.append(b);
1492
                                else
1493
                                        Elements.append(b);
1494
                                if (groupStack.count() != 0)
1495
                                        groupStack.top().append(b);
1496
                                symbolMode = false;
1497
                        }
1498
                }
24202 craig 1499
                QStringList da2 = Cdata.split(" ", Qt::SkipEmptyParts);
16682 jghali 1500
                if (da2.count() == 0)
1501
                        return;
17295 jghali 1502
                command = da2.last();
16682 jghali 1503
/* Start Path construction commands */
1504
                if (command == "m")
1505
                {
1506
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1507
                        ts2 >> x >> y;
1508
                        Coords.svgMoveTo(x - docX, docHeight - (y - docY));
1509
                        currentPoint = FPoint(x - docX, docHeight - (y - docY));
1510
                }
1511
                else if ((command == "L") || (command == "l"))
1512
                {
1513
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1514
                        ts2 >> x >> y;
1515
                        Coords.svgLineTo(x - docX, docHeight - (y - docY));
1516
                        currentPoint = FPoint(x - docX, docHeight - (y - docY));
1517
                }
1518
                else if ((command == "C") || (command == "c"))
1519
                {
1520
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1521
                        ts2 >> x >> y >> x1 >> y1 >> x2 >> y2;
1522
                        Coords.svgCurveToCubic(x - docX, docHeight - (y - docY),
1523
                                                                   x1 - docX, docHeight - (y1 - docY),
1524
                                                                   x2 - docX, docHeight - (y2 - docY));
1525
                        currentPoint = FPoint(x2 - docX, docHeight - (y2 - docY));
1526
                }
1527
                else if ((command == "Y") || (command == "y"))
1528
                {
1529
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1530
                        ts2 >> x1 >> y1 >> x2 >> y2;
1531
                        Coords.svgCurveToCubic(x1 - docX, docHeight - (y1 - docY), x2 - docX, docHeight - (y2 - docY), x2 - docX, docHeight - (y2 - docY));
1532
                        currentPoint = FPoint(x2 - docX, docHeight - (y2 - docY));
1533
                }
1534
                else if ((command == "V") || (command == "v"))
1535
                {
1536
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1537
                        ts2 >> x >> y >> x2 >> y2;
1538
                        Coords.svgCurveToCubic(currentPoint.x(), currentPoint.y(), x - docX, docHeight - (y - docY), x2 - docX, docHeight - (y2 - docY));
1539
                        currentPoint = FPoint(x2 - docX, docHeight - (y2 - docY));
1540
                }
1541
/* End Path construction commands */
1542
/* Start Object creation commands */
1543
                else if ((command == "b") || (command == "B") || (command == "f") || (command == "F") || (command == "s") || (command == "S"))
1544
                {
23038 jghali 1545
                        FPoint wh = Coords.widthHeight();
16682 jghali 1546
                        if ((Coords.size() > 3) && (wh.x() != 0.0) && (wh.y() != 0.0))
1547
                        {
1548
                                if ((!WasU) || ((WasU) && (FirstU)))
1549
                                {
1550
                                        if ((command == "B") || (command == "F") || (command == "S"))
1551
                                        {
1552
                                                if (command == "F")
20561 jghali 1553
                                                        z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CommonStrings::None);
16682 jghali 1554
                                                else if (command == "B")
20561 jghali 1555
                                                        z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke);
16682 jghali 1556
                                                else
20561 jghali 1557
                                                        z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CommonStrings::None, CurrColorStroke);
16682 jghali 1558
                                        }
1559
                                        else
1560
                                        {
1561
                                                if (command == "f")
20561 jghali 1562
                                                        z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CommonStrings::None);
16682 jghali 1563
                                                else if (command == "b")
20561 jghali 1564
                                                        z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke);
16682 jghali 1565
                                                else
20561 jghali 1566
                                                        z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CommonStrings::None, CurrColorStroke);
16682 jghali 1567
                                        }
1568
                                        ite = m_Doc->Items->at(z);
1569
                                        ite->PoLine = Coords.copy();
1570
                                        ite->PoLine.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
1571
                                        ite->ClipEdited = true;
1572
                                        ite->FrameType = 3;
1573
                                        ite->setFillShade(CurrFillShade);
1574
                                        ite->setLineShade(CurrStrokeShade);
1575
                                        ite->setFillEvenOdd(fillRule);
1576
                                        ite->setFillTransparency(1.0 - Opacity);
1577
                                        ite->setLineTransparency(1.0 - Opacity);
1578
                                        ite->setFillBlendmode(blendMode);
1579
                                        ite->setLineBlendmode(blendMode);
1580
                                        if (!currentPatternName.isEmpty())
1581
                                        {
1582
                                                ite->setPattern(currentPatternName);
1583
                                                ite->setPatternTransform(currentPatternXScale * 100, currentPatternYScale * 100, currentPatternX, currentPatternY, currentPatternRotation, 0.0, 0.0);
23904 jghali 1584
                                                ite->GrType = Gradient_Pattern;
1585
                                                currentPatternName.clear();
16682 jghali 1586
                                        }
1587
                                        if (!currentStrokePatternName.isEmpty())
1588
                                        {
1589
                                                ite->setStrokePattern(currentStrokePatternName);
1590
                                                ite->setStrokePatternTransform(currentStrokePatternXScale * 100, currentStrokePatternYScale * 100, currentStrokePatternX, currentStrokePatternY, currentStrokePatternRotation, 0.0, 0.0, 1.0);
23904 jghali 1591
                                                currentStrokePatternName.clear();
16682 jghali 1592
                                        }
1593
                                        ite->setLineEnd(CapStyle);
1594
                                        ite->setLineJoin(JoinStyle);
1595
                                        if (!WasU)
1596
                                        {
1597
                                                FPoint wh = getMaxClipF(&ite->PoLine);
1598
                                                ite->setWidthHeight(wh.x(),wh.y());
1599
                                                ite->setTextFlowMode(PageItem::TextFlowDisabled);
20694 craig 1600
                                                m_Doc->adjustItemSize(ite);
16682 jghali 1601
                                        }
1602
                                        if (patternMode)
1603
                                                PatternElements.append(ite);
1604
                                        else
1605
                                                Elements.append(ite);
1606
                                        if (groupStack.count() != 0)
1607
                                                groupStack.top().append(ite);
1608
                                        if (importerFlags & LoadSavePlugin::lfCreateDoc)
1609
                                                ite->setLocked(itemLocked);
1610
 
1611
                                }
21904 jghali 1612
                                else if (m_Doc->Items->count() > 0)
16682 jghali 1613
                                {
17295 jghali 1614
                                        ite = m_Doc->Items->last();
16682 jghali 1615
                                        ite->PoLine.setMarker();
1616
                                        Coords.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
1617
                                        ite->PoLine.putPoints(ite->PoLine.size(), Coords.size(), Coords);
1618
                                }
1619
                                FirstU = false;
1620
                                itemRendered = true;
1621
                                CurrFillShade = 100.0;
1622
                                CurrStrokeShade = 100.0;
1623
                        }
1624
                        Coords.resize(0);
1625
                        Coords.svgInit();
1626
                }
1627
                else if (command == "*u")
1628
                {
1629
                        FirstU = true;
1630
                        WasU = true;
1631
                }
1632
                else if (command == "*U")
1633
                {
16903 fschmid 1634
                        if (m_Doc->Items->count() > 0)
1635
                        {
1636
                                WasU = false;
17295 jghali 1637
                                ite = m_Doc->Items->last();
16903 fschmid 1638
                                FPoint wh = getMaxClipF(&ite->PoLine);
1639
                                ite->setWidthHeight(wh.x(),wh.y());
20694 craig 1640
                                m_Doc->adjustItemSize(ite);
16903 fschmid 1641
                        }
16682 jghali 1642
                }
1643
                else if ((command == "u") || (command == "q"))
1644
                {
1645
                        QList<PageItem*> gElements;
1646
                        groupStack.push(gElements);
1647
                        clipStack.push(clipCoords);
1648
                }
1649
                else if ((command == "U") || (command == "Q"))
1650
                {
1651
                        if (groupStack.count() != 0)
1652
                        {
1653
                                QList<PageItem*> gElements = groupStack.pop();
1654
                                clipCoords = clipStack.pop();
1655
                                tmpSel->clear();
1656
                                if (gElements.count() > 0)
1657
                                {
1658
                                        for (int dre = 0; dre < gElements.count(); ++dre)
1659
                                        {
1660
                                                tmpSel->addItem(gElements.at(dre), true);
1661
                                                if (patternMode)
1662
                                                        PatternElements.removeAll(gElements.at(dre));
1663
                                                else
1664
                                                        Elements.removeAll(gElements.at(dre));
1665
                                        }
1666
                                        ite = m_Doc->groupObjectsSelection(tmpSel);
1667
                                        if ((clipCoords.size() > 4) && (command == "Q"))
1668
                                        {
1669
                                                clipCoords.translate(m_Doc->currentPage()->xOffset()-ite->xPos(), m_Doc->currentPage()->yOffset()-ite->yPos());
1670
                                                ite->PoLine = clipCoords.copy();
1671
                                                ite->PoLine.translate(baseX, baseY);
1672
                                        }
1673
                                        for (int as = 0; as < tmpSel->count(); ++as)
1674
                                        {
1675
                                                if (patternMode)
1676
                                                        PatternElements.append(tmpSel->itemAt(as));
1677
                                                else
1678
                                                        Elements.append(tmpSel->itemAt(as));
1679
                                        }
1680
                                }
1681
                                if (groupStack.count() != 0)
1682
                                {
1683
                                        for (int as = 0; as < tmpSel->count(); ++as)
1684
                                        {
1685
                                                groupStack.top().append(tmpSel->itemAt(as));
1686
                                        }
1687
                                }
1688
                                tmpSel->clear();
1689
                        }
1690
                        if (command == "Q")
1691
                        {
1692
                                clipCoords.resize(0);
1693
                                clipCoords.svgInit();
1694
                        }
1695
                }
1696
                else if (command == "W")
1697
                {
1698
                        if (clipStack.count() != 0)
1699
                        {
1700
                                if (clipStack.top().size() > 3)
1701
                                {
1702
                                        clipStack.top().setMarker();
1703
                                        clipStack.top().putPoints(clipStack.top().size(), Coords.size(), Coords);
1704
                                }
1705
                                else
1706
                                        clipStack.top() = Coords.copy();
1707
                        }
1708
                }
1709
                else if ((command == "N") || (command == "n"))
1710
                {
1711
                        if (command == "n")
1712
                                Coords.svgClosePath();
1713
                        currentSpecialPath = Coords.copy();
1714
                        Coords.resize(0);
1715
                        Coords.svgInit();
1716
                }
1717
/* End Object construction commands */
1718
/* Start Graphics state commands */
1719
                else if (command == "A")
1720
                {
1721
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1722
                        ts2 >> tmpInt;
1723
                        if (tmpInt == 1)
1724
                                itemLocked = true;
1725
                        else
1726
                                itemLocked = false;
1727
                }
1728
                else if (command == "w")
1729
                {
1730
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1731
                        ts2 >> LineW;
1732
                }
1733
                else if (command == "j")
1734
                {
1735
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1736
                        ts2 >> tmpInt;
1737
                        if (tmpInt == 0)
1738
                                JoinStyle = Qt::MiterJoin;
1739
                        else if (tmpInt == 1)
1740
                                JoinStyle = Qt::RoundJoin;
21959 craig 1741
                        else if (tmpInt == 2)
16682 jghali 1742
                                JoinStyle = Qt::BevelJoin;
1743
                }
1744
                else if (command == "J")
1745
                {
1746
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1747
                        ts2 >> tmpInt;
1748
                        if (tmpInt == 0)
1749
                                CapStyle = Qt::FlatCap;
1750
                        else if (tmpInt == 1)
1751
                                CapStyle = Qt::RoundCap;
21959 craig 1752
                        else if (tmpInt == 2)
16682 jghali 1753
                                CapStyle = Qt::SquareCap;
1754
                }
1755
                /* undocumented Command Xy
1756
                        - has up to 5 Parameters
1757
                        - first Parameter might be the Blendmode
1758
                        - second Parameter is the Opacity
1759
                */
1760
                else if (command == "Xy")
1761
                {
1762
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
16773 fschmid 1763
                        int mode = 0;
1764
                        ts2 >> mode >> Opacity;
1765
                        // Adjusting blendmodes, taken from the PDF importer
1766
                        switch (mode)
1767
                        {
1768
                                default:
1769
                                case 0:
1770
                                        blendMode = 0;
1771
                                        break;
1772
                                case 4:
1773
                                        blendMode = 1;
1774
                                        break;
1775
                                case 5:
1776
                                        blendMode = 2;
1777
                                        break;
1778
                                case 1:
1779
                                        blendMode = 3;
1780
                                        break;
1781
                                case 2:
1782
                                        blendMode = 4;
1783
                                        break;
1784
                                case 3:
1785
                                        blendMode = 5;
1786
                                        break;
1787
                                case 8:
1788
                                        blendMode = 6;
1789
                                        break;
1790
                                case 9:
1791
                                        blendMode = 7;
1792
                                        break;
1793
                                case 10:
1794
                                        blendMode = 8;
1795
                                        break;
1796
                                case 11:
1797
                                        blendMode = 9;
1798
                                        break;
1799
                                case 6:
1800
                                        blendMode = 10;
1801
                                        break;
1802
                                case 7:
1803
                                        blendMode = 11;
1804
                                        break;
1805
                                case 12:
1806
                                        blendMode = 12;
1807
                                        break;
1808
                                case 13:
1809
                                        blendMode = 13;
1810
                                        break;
1811
                                case 14:
1812
                                        blendMode = 14;
1813
                                        break;
1814
                                case 15:
1815
                                        blendMode = 15;
1816
                                        break;
1817
                        }
16682 jghali 1818
                }
1819
                else if (command == "XR")
1820
                {
1821
                        ScTextStream ts2(&Cdata, QIODevice::ReadOnly);
1822
                        ts2 >> tmpInt;
1823
                        if (tmpInt == 1)
1824
                                fillRule = true;
1825
                        else
1826
                                fillRule = false;
1827
                }
1828
                else if (command == "Bb")
1829
                {
1830
                        gradientMode = true;
1831
                        wasBC = false;
1832
                        itemRendered = false;
1833
                        startMatrix = QTransform();
1834
                        endMatrix = QTransform();
1835
                }
1836
                else if (command == "Xm")
1837
                {
1838
                        ScTextStream gVals(&Cdata, QIODevice::ReadOnly);
1839
                        double m1, m2, m3, m4, m5, m6;
1840
                        gVals >> m1 >> m2 >> m3 >> m4 >> m5 >> m6;
1841
                        startMatrix.translate(m5, -m6);
1842
                        endMatrix.scale(m1, m4);
1843
                        wasBC = true;
1844
                }
1845
                else if (command == "Bm")
1846
                {
1847
                        if (m_gradients[currentGradientName].type() == 1)
1848
                        {
1849
                                ScTextStream gVals(&Cdata, QIODevice::ReadOnly);
1850
                                double m1, m2, m3, m4, m5, m6;
1851
                                gVals >> m1 >> m2 >> m3 >> m4 >> m5 >> m6;
1852
                                startMatrix.translate(m5, -m6);
1853
//                              endMatrix.scale(m1, m4);
1854
                                endMatrix *= QTransform(m1, m2, m3, m4, 0, 0);
1855
//                              endMatrix = QTransform(m1, m2, m3, m4, m5, m6);
1856
                                wasBC = true;
1857
                        }
1858
                }
1859
                else if (command == "BB")
1860
                {
1861
                        if (itemRendered)
1862
                        {
1863
                                gradientMode = false;
17295 jghali 1864
                                ite = m_Doc->Items->last();
16682 jghali 1865
                                ite->fill_gradient = m_gradients[currentGradientName];
1866
                                ite->setGradient(currentGradientName);
1867
                                if (ite->fill_gradient.type() == 0)
23904 jghali 1868
                                        ite->GrType = Gradient_Linear;
16682 jghali 1869
                                else
23904 jghali 1870
                                        ite->GrType = Gradient_Radial;
16682 jghali 1871
                                QTransform m1;
1872
                                m1.translate(currentGradientOrigin.x() - ite->xPos(), currentGradientOrigin.y() - ite->yPos());
1873
                                m1.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
1874
                                m1.rotate(-currentGradientAngle);
1875
                                ite->GrStartX = currentGradientOrigin.x() - ite->xPos() + m_Doc->currentPage()->xOffset();
1876
                                ite->GrStartY = currentGradientOrigin.y() - ite->yPos() + m_Doc->currentPage()->yOffset();
23733 jghali 1877
                                QPointF target = m1.map(QPointF(currentGradientLength, 0.0));
16682 jghali 1878
                                ite->GrEndX = target.x();
1879
                                ite->GrEndY = target.y();
1880
                                if (wasBC)
1881
                                {
1882
                                        QPointF newS = startMatrix.map(QPointF(ite->GrStartX, ite->GrStartY));
1883
                                        ite->GrStartX = newS.x();
1884
                                        ite->GrStartY = newS.y();
1885
                                        QTransform m2;
1886
                                        m2.rotate(-currentGradientAngle);
1887
                                        m2 *= endMatrix;
23733 jghali 1888
                                        QPointF target = m2.map(QPointF(currentGradientLength, 0.0));
16682 jghali 1889
                                        ite->GrEndX = target.x();
1890
                                        ite->GrEndY = target.y();
1891
                                }
1892
                        }
1893
                        wasBC = false;
1894
                        currentGradientMatrix = QTransform();
1895
                        currentGradientOrigin = QPointF(0.0, 0.0);
1896
                        currentGradientAngle = 0.0;
23733 jghali 1897
                        currentGradientLength = 1.0;
16682 jghali 1898
                        itemRendered = false;
1899
                }
1900
                else if (command == "Bg")
1901
                {
1902
                        int an = Cdata.indexOf("(");
1903
                        int en = Cdata.lastIndexOf(")");
1904
                        currentGradientName = Cdata.mid(an+1, en-an-1);
1905
                        currentGradientName.remove("\\");
1906
                        QString tmpS = Cdata.mid(en+1, Cdata.size() - en);
1907
                        ScTextStream gVals(&tmpS, QIODevice::ReadOnly);
1908
                        double xOrig, yOrig, m1, m2, m3, m4, m5, m6;
23733 jghali 1909
                        gVals >> xOrig >> yOrig >> currentGradientAngle >> currentGradientLength >> m1 >> m2 >> m3 >> m4 >> m5 >> m6;
16682 jghali 1910
                        currentGradientOrigin = QPointF(xOrig - docX, docHeight - (yOrig - docY));
1911
                        currentGradientMatrix = QTransform(m1, m2, m3, m4, m5, m6);
1912
                }
1913
/* End Graphics state commands */
1914
/* Start Color commands */
1915
                else if ((command == "G") || (command == "g"))
1916
                {
1917
                        if (command == "G")
1918
                                CurrColorStroke = parseColorGray(Cdata);
1919
                        else
1920
                                CurrColorFill = parseColorGray(Cdata);
1921
                        meshColorMode = 2;
1922
                }
1923
                else if ((command == "K") || (command == "k"))
1924
                {
1925
                        if (command == "K")
1926
                                CurrColorStroke = parseColor(Cdata);
1927
                        else
1928
                                CurrColorFill = parseColor(Cdata);
1929
                }
1930
                else if ((command == "XA") || (command == "Xa"))
1931
                {
1932
                        QString Xdata = da2[da2.count()-4] + " " + da2[da2.count()-3] + " " + da2[da2.count()-2];
1933
                        if (command == "XA")
1934
                                CurrColorStroke = parseColorRGB(Xdata);
1935
                        else
1936
                                CurrColorFill = parseColorRGB(Xdata);
1937
                        meshColorMode = 1;
1938
                }
1939
                else if ((command == "XX") || (command == "Xx") || (command == "Xk"))
1940
                {
1941
                        if (command == "XX")
1942
                                CurrColorStroke = parseCustomColorX(Cdata, CurrStrokeShade, da2[da2.count()-2]);
1943
                        else
1944
                                CurrColorFill = parseCustomColorX(Cdata, CurrFillShade, da2[da2.count()-2]);
1945
                }
1946
                else if ((command == "X") || (command == "x"))
1947
                {
1948
                        if (command == "X")
1949
                                CurrColorStroke = parseCustomColor(Cdata, CurrStrokeShade);
1950
                        else
1951
                                CurrColorFill = parseCustomColor(Cdata, CurrFillShade);
1952
                }
1953
                else if (command == "p")
1954
                {
1955
                        int an = Cdata.indexOf("(");
1956
                        int en = Cdata.lastIndexOf(")");
1957
                        currentPatternName = Cdata.mid(an+1, en-an-1);
1958
                        currentPatternName.remove("\\");
1959
                        currentPatternName = currentPatternName.trimmed().simplified().replace(" ", "_");
1960
                        QString tmpS = Cdata.mid(en+1, Cdata.size() - en);
1961
                        ScTextStream gVals(&tmpS, QIODevice::ReadOnly);
1962
                        gVals >> currentPatternX >> currentPatternY >> currentPatternXScale >> currentPatternYScale >> currentPatternRotation;
1963
                }
1964
                else if (command == "P")
1965
                {
1966
                        int an = Cdata.indexOf("(");
1967
                        int en = Cdata.lastIndexOf(")");
1968
                        currentStrokePatternName = Cdata.mid(an+1, en-an-1);
1969
                        currentStrokePatternName.remove("\\");
1970
                        currentStrokePatternName = currentPatternName.trimmed().simplified().replace(" ", "_");
1971
                        QString tmpS = Cdata.mid(en+1, Cdata.size() - en);
1972
                        ScTextStream gVals(&tmpS, QIODevice::ReadOnly);
1973
                        gVals >> currentStrokePatternX >> currentStrokePatternY >> currentStrokePatternXScale >> currentStrokePatternYScale >> currentStrokePatternRotation;
1974
                }
1975
                else if (command == "X!")
1976
                {
1977
                        if (Cdata.contains("/Mesh"))
1978
                        {
1979
                                meshMode = true;
1980
                                meshNodeCounter = 0;
1981
//                              meshColorMode = 0;
1982
                                meshGradientArray.clear();
1983
                        }
1984
                        if (Cdata.contains("/End"))
1985
                        {
1986
                                meshMode = false;
1987
                                if (meshGradientArray.count() != 0)
1988
                                {
20561 jghali 1989
                                        z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, 0, CommonStrings::None, CommonStrings::None);
16682 jghali 1990
                                        ite = m_Doc->Items->at(z);
1991
                                        for (int x = 0; x < meshGradientArray.count(); x++)
1992
                                        {
1993
                                                for (int y = 0; y < meshGradientArray[x].count(); y++)
1994
                                                {
1995
                                                        meshGradientArray[x][y].moveRel(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
1996
                                                }
1997
                                        }
1998
                                        ite->meshGradientArray = meshGradientArray;
23904 jghali 1999
                                        ite->GrType = Gradient_Mesh;
16682 jghali 2000
                                        ite->meshToShape();
2001
                                        for (int grow = 0; grow < ite->meshGradientArray.count(); grow++)
2002
                                        {
2003
                                                for (int gcol = 0; gcol < ite->meshGradientArray[grow].count(); gcol++)
2004
                                                {
22296 craig 2005
                                                        MeshPoint mp = ite->meshGradientArray[grow][gcol];
16682 jghali 2006
                                                        ite->setMeshPointColor(grow, gcol, mp.colorName, mp.shade, mp.transparency);
2007
                                                }
2008
                                        }
2009
                                        ite->setFillShade(CurrFillShade);
2010
                                        ite->setLineShade(CurrFillShade);
2011
                                        ite->setFillEvenOdd(fillRule);
2012
                                        ite->setFillTransparency(1.0 - Opacity);
2013
                                        ite->setLineTransparency(1.0 - Opacity);
2014
                                        ite->setFillBlendmode(blendMode);
2015
                                        ite->setLineBlendmode(blendMode);
2016
                                        ite->setLineEnd(CapStyle);
2017
                                        ite->setLineJoin(JoinStyle);
2018
                                        if (importerFlags & LoadSavePlugin::lfCreateDoc)
2019
                                                ite->setLocked(itemLocked);
2020
                                        if (patternMode)
2021
                                                PatternElements.append(ite);
2022
                                        else
2023
                                                Elements.append(ite);
2024
                                        if (groupStack.count() != 0)
2025
                                                groupStack.top().append(ite);
2026
                                }
2027
                        }
2028
                }
2029
                else if (command == "X#")
2030
                {
2031
                        int an = Cdata.indexOf("_");
2032
                        QString cmdLine = Cdata.remove(0, an+1);
2033
                        an = cmdLine.lastIndexOf("/");
2034
                        QString tmpS = cmdLine.mid(an+1, Cdata.size());
2035
                        ScTextStream mVals(&tmpS, QIODevice::ReadOnly);
2036
                        QString mKey;
2037
                        mVals >> mKey;
2038
                        if (mKey == "Size")
2039
                        {
2040
                                meshGradientArray.clear();
2041
                                int ans = cmdLine.indexOf("[");
2042
                                int ens = cmdLine.lastIndexOf("]");
2043
                                QString sizeVals = cmdLine.mid(ans+1, ens-ans-1);
2044
                                ScTextStream mVals2(&sizeVals, QIODevice::ReadOnly);
2045
                                mVals2 >> meshXSize >> meshYSize;
2046
                                for (int mgr = 0; mgr < meshYSize+1; mgr++)
2047
                                {
22296 craig 2048
                                        QList<MeshPoint> ml;
16682 jghali 2049
                                        for (int mgc = 0; mgc < meshXSize+1; mgc++)
2050
                                        {
22296 craig 2051
                                                MeshPoint mp;
16682 jghali 2052
                                                ml.append(mp);
2053
                                        }
2054
                                        meshGradientArray.append(ml);
2055
                                }
2056
                        }
2057
                        if (mKey == "P")
2058
                        {
2059
                                int ans = cmdLine.indexOf("[");
2060
                                int ens = cmdLine.lastIndexOf("]");
2061
                                QString posVals = cmdLine.mid(ans+1, ens-ans-1);
2062
                                ScTextStream mVals3(&posVals, QIODevice::ReadOnly);
2063
                                mVals3 >> currentMeshXPos >> currentMeshYPos;
2064
                        }
2065
                        if (mKey == "CS")
2066
                        {
2067
                                if (Cdata.contains("CMYK"))
2068
                                        meshColorMode = 0;
2069
                                else if (Cdata.contains("RGB"))
2070
                                        meshColorMode = 1;
2071
                                else if (Cdata.contains("Gray"))
2072
                                        meshColorMode = 2;
2073
                        }
2074
                        if (mKey == "E")
2075
                        {
2076
                                int indY = meshYSize - currentMeshYPos - 1;
2077
                                int indX = currentMeshXPos;
2078
                                meshGradientArray[indY+1][indX+1].gridPoint   = FPoint(meshNode2PointX, meshNode2PointY);
2079
                                meshGradientArray[indY+1][indX+1].controlTop  = FPoint(meshNode2Control2X, meshNode2Control2Y);
2080
                                meshGradientArray[indY+1][indX+1].controlLeft = FPoint(meshNode2Control1X, meshNode2Control1Y);
2081
                                meshGradientArray[indY+1][indX+1].colorName = meshColor2;
2082
                                meshGradientArray[indY+1][indX+1].shade = 100;
2083
                                meshGradientArray[indY+1][indX+1].transparency = 1.0;
2084
                                meshGradientArray[indY+1][indX].gridPoint    = FPoint(meshNode1PointX, meshNode1PointY);
2085
                                meshGradientArray[indY+1][indX].controlRight = FPoint(meshNode1Control2X, meshNode1Control2Y);
2086
                                meshGradientArray[indY+1][indX].controlTop   = FPoint(meshNode1Control1X, meshNode1Control1Y);
2087
                                meshGradientArray[indY+1][indX].colorName = meshColor1;
2088
                                meshGradientArray[indY+1][indX].shade = 100;
2089
                                meshGradientArray[indY+1][indX].transparency = 1.0;
2090
                                meshGradientArray[indY][indX].gridPoint     = FPoint(meshNode4PointX, meshNode4PointY);
2091
                                meshGradientArray[indY][indX].controlBottom = FPoint(meshNode4Control2X, meshNode4Control2Y);
2092
                                meshGradientArray[indY][indX].controlRight  = FPoint(meshNode4Control1X, meshNode4Control1Y);
2093
                                meshGradientArray[indY][indX].colorName = meshColor4;
2094
                                meshGradientArray[indY][indX].shade = 100;
2095
                                meshGradientArray[indY][indX].transparency = 1.0;
2096
                                meshGradientArray[indY][indX+1].gridPoint     = FPoint(meshNode3PointX, meshNode3PointY);
2097
                                meshGradientArray[indY][indX+1].controlLeft   = FPoint(meshNode3Control2X, meshNode3Control2Y);
2098
                                meshGradientArray[indY][indX+1].controlBottom = FPoint(meshNode3Control1X, meshNode3Control1Y);
2099
                                meshGradientArray[indY][indX+1].colorName = meshColor3;
2100
                                meshGradientArray[indY][indX+1].shade = 100;
2101
                                meshGradientArray[indY][indX+1].transparency = 1.0;
2102
                                meshNodeCounter = 0;
2103
                        }
2104
                        if (mKey == "N")
2105
                        {
23652 craig 2106
                                double cVal {0.0}, mVal {0.0}, yVal {0.0}, kVal {0.0}, coorX1 {0.0}, coorY1 {0.0}, coorX2 {0.0}, coorY2 {0.0}, coorX3 {0.0}, coorY3 {0.0};
2107
                                int dummy {0};
16682 jghali 2108
                                meshNodeCounter++;
2109
                                int ans = cmdLine.indexOf("[");