r13838 by fschmid - Plugin for loading Calamus CVG vector graphics
scribus-commit
scribus-commit at lists.scribus.net
Wed Aug 26 05:29:37 CEST 2009
Revision: 13838
Author: fschmid
Date: 2009-08-10T21:31:28.112361Z
Commit message: Plugin for loading Calamus CVG vector graphics
Changeset:
M /trunk/Scribus/scribus/util_formats.cpp
M /trunk/Scribus/scribus/plugins/CMakeLists.txt
M /trunk/Scribus/scribus/util_formats.h
A /trunk/Scribus/scribus/plugins/cvgimplugin/importcvgplugin.cpp
A /trunk/Scribus/scribus/plugins/cvgimplugin/importcvg.cpp
A /trunk/Scribus/scribus/plugins/cvgimplugin/CMakeLists.txt
A /trunk/Scribus/scribus/plugins/cvgimplugin/importcvgplugin.h
A /trunk/Scribus/scribus/plugins/cvgimplugin
A /trunk/Scribus/scribus/plugins/cvgimplugin/importcvg.h
M /trunk/Scribus/scribus/plugins/formatidlist.h
Diffs:
Index: scribus/util_formats.cpp
===================================================================
--- scribus/util_formats.cpp (revision 13837)
+++ scribus/util_formats.cpp (revision 13838)
@@ -30,6 +30,7 @@
m_fmts.insert(FormatsManager::SVG, QStringList() << "svg" << "svgz");
m_fmts.insert(FormatsManager::AI, QStringList() << "ai");
m_fmts.insert(FormatsManager::XFIG, QStringList() << "fig");
+ m_fmts.insert(FormatsManager::CVG, QStringList() << "cvg");
m_fmtNames[FormatsManager::EPS] = QObject::tr("Encapsulated PostScript");
m_fmtNames[FormatsManager::GIF] = QObject::tr("GIF");
@@ -45,6 +46,7 @@
m_fmtNames[FormatsManager::SVG] = QObject::tr("Scalable Vector Graphics");
m_fmtNames[FormatsManager::AI] = QObject::tr("Adobe Illustrator");
m_fmtNames[FormatsManager::XFIG] = QObject::tr("Xfig File");
+ m_fmtNames[FormatsManager::CVG] = QObject::tr("Calamus Cvg File");
m_fmtMimeTypes.insert(FormatsManager::EPS, QStringList() << "application/postscript");
m_fmtMimeTypes.insert(FormatsManager::GIF, QStringList() << "image/gif");
@@ -60,6 +62,7 @@
m_fmtMimeTypes.insert(FormatsManager::SVG, QStringList() << "image/svg+xml");
m_fmtMimeTypes.insert(FormatsManager::AI, QStringList() << "application/illustrator");
m_fmtMimeTypes.insert(FormatsManager::XFIG, QStringList() << "image/x-xfig");
+ m_fmtMimeTypes.insert(FormatsManager::CVG, QStringList() << "");
QMapIterator<int, QStringList> i(m_fmts);
while (i.hasNext())
Index: scribus/util_formats.h
===================================================================
--- scribus/util_formats.h (revision 13837)
+++ scribus/util_formats.h (revision 13838)
@@ -36,9 +36,9 @@
enum ScImageFormatType
{
- ALLIMAGES = 1|2|4|8|16|32|64|128|256|512|1024|2048|4096|8192,
+ ALLIMAGES = 1|2|4|8|16|32|64|128|256|512|1024|2048|4096|8192|16384,
IMAGESIMGFRAME = 1|2|4|16|32|64|128|256|512, // all Types suitable for Image Frames
- VECTORIMAGES = 1|64|1024|2048, // All pure vector image types
+ VECTORIMAGES = 1|64|1024|2048|16384, // All pure vector image types
RASTORIMAGES = 2|4|8|32|512, // All pure rastor image types
EPS = 1, // Encapsulated PostScript
GIF = 2, // GIF files
@@ -54,6 +54,7 @@
SVG = 2048, // WMF files
AI = 4096, // Adobe Illustrator files
XFIG = 8192, // Xfig files
+ CVG = 16384, // Calamus Cvg files
};
/*
Index: scribus/plugins/cvgimplugin/importcvgplugin.h
===================================================================
--- scribus/plugins/cvgimplugin/importcvgplugin.h (revision 0)
+++ scribus/plugins/cvgimplugin/importcvgplugin.h (revision 13838)
@@ -0,0 +1,57 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#ifndef IMPORTCVGPLUGIN_H
+#define IMPORTCVGPLUGIN_H
+
+#include "pluginapi.h"
+#include "loadsaveplugin.h"
+#include "../formatidlist.h"
+
+class ScrAction;
+
+class PLUGIN_API ImportCvgPlugin : public LoadSavePlugin
+{
+ Q_OBJECT
+
+ public:
+ // Standard plugin implementation
+ ImportCvgPlugin();
+ virtual ~ImportCvgPlugin();
+ /*!
+ \author Franz Schmid
+ \date
+ \brief Returns name of plugin
+ \retval QString containing name of plugin: Import EPS/PDF/PS...
+ */
+ virtual const QString fullTrName() const;
+ virtual const AboutData* getAboutData() const;
+ virtual void deleteAboutData(const AboutData* about) const;
+ virtual void languageChange();
+ virtual bool fileSupported(QIODevice* file, const QString & fileName=QString::null) const;
+ virtual bool loadFile(const QString & fileName, const FileFormat & fmt, int flags, int index = 0);
+ virtual void addToMainWindowMenu(ScribusMainWindow *) {};
+
+ public slots:
+ /*!
+ \author Franz Schmid
+ \date
+ \brief Run the EPS import
+ \param fileName input filename, or QString::null to prompt.
+ \retval bool always true
+ */
+ virtual bool import(QString fileName = QString::null, int flags = lfUseCurrentPage|lfInteractive);
+
+ private:
+ void registerFormats();
+ ScrAction* importAction;
+};
+
+extern "C" PLUGIN_API int importcvg_getPluginAPIVersion();
+extern "C" PLUGIN_API ScPlugin* importcvg_getPlugin();
+extern "C" PLUGIN_API void importcvg_freePlugin(ScPlugin* plugin);
+
+#endif
Index: scribus/plugins/cvgimplugin/importcvg.h
===================================================================
--- scribus/plugins/cvgimplugin/importcvg.h (revision 0)
+++ scribus/plugins/cvgimplugin/importcvg.h (revision 13838)
@@ -0,0 +1,93 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#ifndef IMPORTCVG_H
+#define IMPORTCVG_H
+
+#include "qglobal.h"
+#include "qobject.h"
+#include "qstring.h"
+
+#include "pluginapi.h"
+#include "pageitem.h"
+#include "sccolor.h"
+#include "fpointarray.h"
+#include <QList>
+#include <QMatrix>
+#include <QMultiMap>
+
+class MultiProgressDialog;
+class ScribusDoc;
+class Selection;
+class TransactionSettings;
+
+//! \brief Cvg importer plugin
+class CvgPlug : public QObject
+{
+ Q_OBJECT
+
+public:
+ /*!
+ \author Franz Schmid
+ \date
+ \brief Create the Cvg importer window.
+ \param fName QString
+ \param flags combination of loadFlags
+ \param showProgress if progress must be displayed
+ \retval EPSPlug plugin
+ */
+ CvgPlug( ScribusDoc* doc, int flags );
+ ~CvgPlug();
+
+ /*!
+ \author Franz Schmid
+ \date
+ \brief Perform import.
+ \param fn QString
+ \param trSettings undo transaction settings
+ \param flags combination of loadFlags
+ \param showProgress if progress must be displayed
+ \retval bool true if import was ok
+ */
+ bool import(QString fn, const TransactionSettings& trSettings, int flags, bool showProgress = true);
+
+private:
+ void parseHeader(QString fName, double &b, double &h);
+ bool convert(QString fn);
+ void getObjects(QDataStream &ts, bool colorFlag, quint32 lenData);
+ void parseColor(quint32 dataF, quint32 dataS, bool color, quint16 flag);
+
+ QList<PageItem*> Elements;
+ int currentItemNr;
+ QStack<QList<PageItem*> > groupStack;
+ ColorList CustColors;
+ double baseX, baseY;
+ double docWidth;
+ double docHeight;
+ qreal scPg;
+
+ double LineW;
+ QString CurrColorFill;
+ QString CurrColorStroke;
+ double CurrStrokeShade;
+ double CurrFillShade;
+ QStringList importedColors;
+
+ FPointArray Coords;
+ bool interactive;
+ MultiProgressDialog * progressDialog;
+ bool cancel;
+ ScribusDoc* m_Doc;
+ Selection* tmpSel;
+ int importerFlags;
+ int oldDocItemCount;
+ QString baseFile;
+
+public slots:
+ void cancelRequested() { cancel = true; }
+};
+
+#endif
Index: scribus/plugins/cvgimplugin/importcvgplugin.cpp
===================================================================
--- scribus/plugins/cvgimplugin/importcvgplugin.cpp (revision 0)
+++ scribus/plugins/cvgimplugin/importcvgplugin.cpp (revision 13838)
@@ -0,0 +1,162 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "commonstrings.h"
+#include "ui/customfdialog.h"
+#include "importcvg.h"
+#include "importcvgplugin.h"
+#include "menumanager.h"
+#include "page.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "scraction.h"
+#include "scribuscore.h"
+#include "undomanager.h"
+#include "util_formats.h"
+
+
+int importcvg_getPluginAPIVersion()
+{
+ return PLUGIN_API_VERSION;
+}
+
+ScPlugin* importcvg_getPlugin()
+{
+ ImportCvgPlugin* plug = new ImportCvgPlugin();
+ Q_CHECK_PTR(plug);
+ return plug;
+}
+
+void importcvg_freePlugin(ScPlugin* plugin)
+{
+ ImportCvgPlugin* plug = dynamic_cast<ImportCvgPlugin*>(plugin);
+ Q_ASSERT(plug);
+ delete plug;
+}
+
+ImportCvgPlugin::ImportCvgPlugin() : LoadSavePlugin(),
+ importAction(new ScrAction(ScrAction::DLL, QPixmap(), QPixmap(), "", QKeySequence(), this))
+{
+ // Set action info in languageChange, so we only have to do it in one
+ // place. This includes registering file format support.
+ languageChange();
+}
+/*
+void ImportXfigPlugin::addToMainWindowMenu(ScribusMainWindow *mw)
+{
+ importAction->setEnabled(true);
+ connect( importAction, SIGNAL(triggered()), SLOT(import()) );
+ mw->scrMenuMgr->addMenuItem(importAction, "FileImport");
+}
+*/
+void ImportCvgPlugin::languageChange()
+{
+ importAction->setText( tr("Import Cvg..."));
+ // (Re)register file format support
+ unregisterAll();
+ registerFormats();
+}
+
+ImportCvgPlugin::~ImportCvgPlugin()
+{
+ unregisterAll();
+};
+
+const QString ImportCvgPlugin::fullTrName() const
+{
+ return QObject::tr("Cvg Importer");
+}
+
+
+const ScActionPlugin::AboutData* ImportCvgPlugin::getAboutData() const
+{
+ AboutData* about = new AboutData;
+ about->authors = "Franz Schmid <franz at scribus.info>";
+ about->shortDescription = tr("Imports Cvg Files");
+ about->description = tr("Imports most Cvg files into the current document,\nconverting their vector data into Scribus objects.");
+ about->license = "GPL";
+ Q_CHECK_PTR(about);
+ return about;
+}
+
+void ImportCvgPlugin::deleteAboutData(const AboutData* about) const
+{
+ Q_ASSERT(about);
+ delete about;
+}
+
+void ImportCvgPlugin::registerFormats()
+{
+ FileFormat fmt(this);
+ fmt.trName = FormatsManager::instance()->nameOfFormat(FormatsManager::CVG); // Human readable name
+ fmt.formatId = FORMATID_CVGIMPORT;
+ fmt.filter = FormatsManager::instance()->extensionsForFormat(FormatsManager::CVG); // QFileDialog filter
+ fmt.nameMatch = QRegExp("\\."+FormatsManager::instance()->extensionListForFormat(FormatsManager::CVG, 1)+"$", Qt::CaseInsensitive);
+ fmt.load = true;
+ fmt.save = false;
+ fmt.mimeTypes = FormatsManager::instance()->mimetypeOfFormat(FormatsManager::CVG); // MIME types
+ fmt.priority = 64; // Priority
+ registerFormat(fmt);
+}
+
+bool ImportCvgPlugin::fileSupported(QIODevice* /* file */, const QString & fileName) const
+{
+ return true;
+}
+
+bool ImportCvgPlugin::loadFile(const QString & fileName, const FileFormat &, int flags, int /*index*/)
+{
+ // There's only one format to handle, so we just call import(...)
+ return import(fileName, flags);
+}
+
+bool ImportCvgPlugin::import(QString fileName, int flags)
+{
+ if (!checkFlags(flags))
+ return false;
+ if( fileName.isEmpty() )
+ {
+ flags |= lfInteractive;
+ PrefsContext* prefs = PrefsManager::instance()->prefsFile->getPluginContext("importcvg");
+ QString wdir = prefs->get("wdir", ".");
+ CustomFDialog diaf(ScCore->primaryMainWindow(), wdir, QObject::tr("Open"), tr("All Supported Formats")+" (*.cvg *.CVG);;All Files (*)");
+ if (diaf.exec())
+ {
+ fileName = diaf.selectedFile();
+ prefs->set("wdir", fileName.left(fileName.lastIndexOf("/")));
+ }
+ else
+ return true;
+ }
+ m_Doc=ScCore->primaryMainWindow()->doc;
+ UndoTransaction* activeTransaction = NULL;
+ bool emptyDoc = (m_Doc == NULL);
+ bool hasCurrentPage = (m_Doc && m_Doc->currentPage());
+ TransactionSettings trSettings;
+ trSettings.targetName = hasCurrentPage ? m_Doc->currentPage()->getUName() : "";
+ trSettings.targetPixmap = Um::IImageFrame;
+ trSettings.actionName = Um::ImportXfig;
+ trSettings.description = fileName;
+ trSettings.actionPixmap = Um::IXFIG;
+ if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
+ UndoManager::instance()->setUndoEnabled(false);
+ if (UndoManager::undoEnabled())
+ activeTransaction = new UndoTransaction(UndoManager::instance()->beginTransaction(trSettings));
+ CvgPlug *dia = new CvgPlug(m_Doc, flags);
+ Q_CHECK_PTR(dia);
+ dia->import(fileName, trSettings, flags);
+ if (activeTransaction)
+ {
+ activeTransaction->commit();
+ delete activeTransaction;
+ activeTransaction = NULL;
+ }
+ if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
+ UndoManager::instance()->setUndoEnabled(true);
+ delete dia;
+ return true;
+}
Index: scribus/plugins/cvgimplugin/importcvg.cpp
===================================================================
--- scribus/plugins/cvgimplugin/importcvg.cpp (revision 0)
+++ scribus/plugins/cvgimplugin/importcvg.cpp (revision 13838)
@@ -0,0 +1,562 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+
+#include <QByteArray>
+#include <QCursor>
+#include <QDrag>
+#include <QFile>
+#include <QList>
+#include <QMimeData>
+#include <QRegExp>
+#include <QStack>
+#include <QDebug>
+
+#include <cmath>
+#include <cstdlib>
+
+#include "commonstrings.h"
+#include "ui/customfdialog.h"
+#include "importcvg.h"
+#include "loadsaveplugin.h"
+#include "ui/missing.h"
+#include "ui/multiprogressdialog.h"
+#include "pagesize.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "prefsmanager.h"
+#include "prefstable.h"
+#include "ui/propertiespalette.h"
+#include "rawimage.h"
+#include "scclocale.h"
+#include "sccolorengine.h"
+#include "scconfig.h"
+#include "scmimedata.h"
+#include "scpaths.h"
+#include "scpattern.h"
+#include "scpattern.h"
+#include "scribus.h"
+#include "scribusXml.h"
+#include "scribuscore.h"
+#include "sctextstream.h"
+#include "selection.h"
+#include "undomanager.h"
+#include "util.h"
+#include "util_formats.h"
+#include "util_icon.h"
+#include "util_math.h"
+
+extern SCRIBUS_API ScribusQApp * ScQApp;
+
+CvgPlug::CvgPlug(ScribusDoc* doc, int flags)
+{
+ tmpSel=new Selection(this, false);
+ m_Doc=doc;
+ interactive = (flags & LoadSavePlugin::lfInteractive);
+}
+
+bool CvgPlug::import(QString fNameIn, const TransactionSettings& trSettings, int flags, bool showProgress)
+{
+ QString fName = fNameIn;
+ bool success = false;
+ interactive = (flags & LoadSavePlugin::lfInteractive);
+ importerFlags = flags;
+ cancel = false;
+ double x, y, b, h;
+ bool ret = false;
+ CustColors.clear();
+ QFileInfo fi = QFileInfo(fName);
+ if ( !ScCore->usingGUI() )
+ {
+ interactive = false;
+ showProgress = false;
+ }
+ baseFile = QDir::cleanPath(QDir::toNativeSeparators(fi.absolutePath()+"/"));
+ if ( showProgress )
+ {
+ ScribusMainWindow* mw=(m_Doc==0) ? ScCore->primaryMainWindow() : m_Doc->scMW();
+ progressDialog = new MultiProgressDialog( tr("Importing: %1").arg(fi.fileName()), CommonStrings::tr_Cancel, mw );
+ QStringList barNames, barTexts;
+ barNames << "GI";
+ barTexts << tr("Analyzing File:");
+ QList<bool> barsNumeric;
+ barsNumeric << false;
+ progressDialog->addExtraProgressBars(barNames, barTexts, barsNumeric);
+ progressDialog->setOverallTotalSteps(3);
+ progressDialog->setOverallProgress(0);
+ progressDialog->setProgress("GI", 0);
+ progressDialog->show();
+ connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelRequested()));
+ qApp->processEvents();
+ }
+ else
+ progressDialog = NULL;
+/* Set default Page to size defined in Preferences */
+ x = 0.0;
+ y = 0.0;
+ b = 0.0;
+ h = 0.0;
+ if (progressDialog)
+ {
+ progressDialog->setOverallProgress(1);
+ qApp->processEvents();
+ }
+ parseHeader(fName, b, h);
+ if (b == 0.0)
+ b = PrefsManager::instance()->appPrefs.PageWidth;
+ if (h == 0.0)
+ h = PrefsManager::instance()->appPrefs.PageHeight;
+ docWidth = b;
+ docHeight = h;
+ baseX = 0;
+ baseY = 0;
+ if (!interactive || (flags & LoadSavePlugin::lfInsertPage))
+ {
+ m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
+ m_Doc->addPage(0);
+ m_Doc->view()->addPage(0, true);
+ baseX = 0;
+ baseY = 0;
+ }
+ else
+ {
+ if (!m_Doc || (flags & LoadSavePlugin::lfCreateDoc))
+ {
+ m_Doc=ScCore->primaryMainWindow()->doFileNew(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false, 0, false, 0, 1, "Custom", true);
+ ScCore->primaryMainWindow()->HaveNewDoc();
+ ret = true;
+ baseX = 0;
+ baseY = 0;
+ baseX = m_Doc->currentPage()->xOffset();
+ baseY = m_Doc->currentPage()->yOffset();
+ }
+ }
+ if ((!ret) && (interactive))
+ {
+ baseX = m_Doc->currentPage()->xOffset();
+ baseY = m_Doc->currentPage()->yOffset();
+ }
+ if ((ret) || (!interactive))
+ {
+ if (docWidth > docHeight)
+ m_Doc->PageOri = 1;
+ else
+ m_Doc->PageOri = 0;
+ m_Doc->m_pageSize = "Custom";
+ }
+ Elements.clear();
+ FPoint minSize = m_Doc->minCanvasCoordinate;
+ FPoint maxSize = m_Doc->maxCanvasCoordinate;
+ FPoint cOrigin = m_Doc->view()->canvasOrigin();
+ m_Doc->setLoading(true);
+ m_Doc->DoDrawing = false;
+ m_Doc->view()->updatesOn(false);
+ m_Doc->scMW()->ScriptRunning = true;
+ qApp->changeOverrideCursor(QCursor(Qt::WaitCursor));
+ QString CurDirP = QDir::currentPath();
+ QDir::setCurrent(fi.path());
+ if (convert(fName))
+ {
+ tmpSel->clear();
+ QDir::setCurrent(CurDirP);
+ if ((Elements.count() > 1) && (!(importerFlags & LoadSavePlugin::lfCreateDoc)))
+ {
+ bool isGroup = true;
+ int firstElem = -1;
+ if (Elements.at(0)->Groups.count() != 0)
+ firstElem = Elements.at(0)->Groups.top();
+ for (int bx = 0; bx < Elements.count(); ++bx)
+ {
+ PageItem* bxi = Elements.at(bx);
+ if (bxi->Groups.count() != 0)
+ {
+ if (bxi->Groups.top() != firstElem)
+ isGroup = false;
+ }
+ else
+ isGroup = false;
+ }
+ if (!isGroup)
+ {
+ double minx = 99999.9;
+ double miny = 99999.9;
+ double maxx = -99999.9;
+ double maxy = -99999.9;
+ uint lowestItem = 999999;
+ uint highestItem = 0;
+ for (int a = 0; a < Elements.count(); ++a)
+ {
+ Elements.at(a)->Groups.push(m_Doc->GroupCounter);
+ PageItem* currItem = Elements.at(a);
+ lowestItem = qMin(lowestItem, currItem->ItemNr);
+ highestItem = qMax(highestItem, currItem->ItemNr);
+ double x1, x2, y1, y2;
+ currItem->getVisualBoundingRect(&x1, &y1, &x2, &y2);
+ minx = qMin(minx, x1);
+ miny = qMin(miny, y1);
+ maxx = qMax(maxx, x2);
+ maxy = qMax(maxy, y2);
+ }
+ double gx = minx;
+ double gy = miny;
+ double gw = maxx - minx;
+ double gh = maxy - miny;
+ PageItem *high = m_Doc->Items->at(highestItem);
+ int z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, gx, gy, gw, gh, 0, m_Doc->toolSettings.dBrush, m_Doc->toolSettings.dPen, true);
+ PageItem *neu = m_Doc->Items->takeAt(z);
+ m_Doc->Items->insert(lowestItem, neu);
+ neu->Groups.push(m_Doc->GroupCounter);
+ neu->setItemName( tr("Group%1").arg(neu->Groups.top()));
+ neu->AutoName = false;
+ neu->isGroupControl = true;
+ neu->groupsLastItem = high;
+ neu->setTextFlowMode(PageItem::TextFlowDisabled);
+ for (int a = 0; a < m_Doc->Items->count(); ++a)
+ {
+ m_Doc->Items->at(a)->ItemNr = a;
+ }
+ Elements.prepend(neu);
+ m_Doc->GroupCounter++;
+ }
+ }
+ m_Doc->DoDrawing = true;
+ m_Doc->scMW()->ScriptRunning = false;
+ m_Doc->setLoading(false);
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ if ((Elements.count() > 0) && (!ret) && (interactive))
+ {
+ if (flags & LoadSavePlugin::lfScripted)
+ {
+ bool loadF = m_Doc->isLoading();
+ m_Doc->setLoading(false);
+ m_Doc->changed();
+ m_Doc->setLoading(loadF);
+ m_Doc->m_Selection->delaySignalsOn();
+ for (int dre=0; dre<Elements.count(); ++dre)
+ {
+ m_Doc->m_Selection->addItem(Elements.at(dre), true);
+ }
+ m_Doc->m_Selection->delaySignalsOff();
+ m_Doc->m_Selection->setGroupRect();
+ m_Doc->view()->updatesOn(true);
+ }
+ else
+ {
+ m_Doc->DragP = true;
+ m_Doc->DraggedElem = 0;
+ m_Doc->DragElements.clear();
+ m_Doc->m_Selection->delaySignalsOn();
+ for (int dre=0; dre<Elements.count(); ++dre)
+ {
+ m_Doc->DragElements.append(Elements.at(dre)->ItemNr);
+ tmpSel->addItem(Elements.at(dre), true);
+ }
+ tmpSel->setGroupRect();
+ ScriXmlDoc *ss = new ScriXmlDoc();
+ ScElemMimeData* md = new ScElemMimeData();
+ md->setScribusElem(ss->WriteElem(m_Doc, m_Doc->view(), tmpSel));
+ delete ss;
+ m_Doc->itemSelection_DeleteItem(tmpSel);
+ m_Doc->view()->updatesOn(true);
+ m_Doc->m_Selection->delaySignalsOff();
+ // We must copy the TransationSettings object as it is owned
+ // by handleObjectImport method afterwards
+ TransactionSettings* transacSettings = new TransactionSettings(trSettings);
+ m_Doc->view()->handleObjectImport(md, transacSettings);
+ m_Doc->DragP = false;
+ m_Doc->DraggedElem = 0;
+ m_Doc->DragElements.clear();
+ }
+ }
+ else
+ {
+ m_Doc->changed();
+ m_Doc->reformPages();
+ m_Doc->view()->updatesOn(true);
+ }
+ success = true;
+ }
+ else
+ {
+ QDir::setCurrent(CurDirP);
+ m_Doc->DoDrawing = true;
+ m_Doc->scMW()->ScriptRunning = false;
+ m_Doc->view()->updatesOn(true);
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+ if (interactive)
+ m_Doc->setLoading(false);
+ //CB If we have a gui we must refresh it if we have used the progressbar
+ if ((showProgress) && (!interactive))
+ m_Doc->view()->DrawNew();
+ return success;
+}
+
+CvgPlug::~CvgPlug()
+{
+ if (progressDialog)
+ delete progressDialog;
+ delete tmpSel;
+}
+
+void CvgPlug::parseHeader(QString fName, double &b, double &h)
+{
+ QFile f(fName);
+ if (f.open(QIODevice::ReadOnly))
+ {
+ QDataStream ts(&f);
+ ts.device()->seek(16);
+ quint16 pgY, pgW, pgH;
+ ts >> pgY >> pgW >> pgH;
+ b = pgW / 72.0;
+ h = pgH / 72.0;
+ scPg = h / b;
+ b = pgY / 72.0;
+ h = pgY / 72.0 * scPg;
+ f.close();
+ qDebug() << "Y" << pgY << "W" << pgW << "H" << pgH << "Scale" << scPg;
+ }
+}
+
+bool CvgPlug::convert(QString fn)
+{
+ QString tmp;
+ CurrColorFill = "White";
+ CurrFillShade = 100.0;
+ CurrColorStroke = "Black";
+ CurrStrokeShade = 100.0;
+ Coords.resize(0);
+ Coords.svgInit();
+ importedColors.clear();
+ QList<PageItem*> gElements;
+ groupStack.push(gElements);
+ currentItemNr = 0;
+ if(progressDialog)
+ {
+ progressDialog->setOverallProgress(2);
+ progressDialog->setLabel("GI", tr("Generating Items"));
+ qApp->processEvents();
+ }
+ QFile f(fn);
+ if (f.open(QIODevice::ReadOnly))
+ {
+ oldDocItemCount = m_Doc->Items->count();
+ int fSize = (int) f.size();
+ if (progressDialog)
+ {
+ progressDialog->setTotalSteps("GI", fSize);
+ qApp->processEvents();
+ }
+ QDataStream ts(&f);
+ ts.device()->seek(10);
+ quint16 pgX, pgY, pgW, pgH, colorF, dummy;
+ bool colorFlag = false;
+ ts >> colorF >> dummy;
+ if (colorF == 0x044c)
+ colorFlag = true;
+ ts >> pgX >> pgY >> pgW >> pgH;
+ quint32 currentFilePos = 14;
+ while (!ts.atEnd())
+ {
+ quint16 data;
+ quint32 lenData;
+ ts >> data;
+ ts >> lenData;
+ currentFilePos = ts.device()->pos();
+ if (data == 0x0020)
+ qDebug() << "Group" << "Len" << lenData;
+ if (data == 0x0004)
+ {
+ getObjects(ts, colorFlag, lenData - 26);
+ }
+ ts.device()->seek(currentFilePos + lenData - 6);
+ progressDialog->setProgress("GI", ts.device()->pos());
+ qApp->processEvents();
+ }
+ if (Elements.count() == 0)
+ {
+ if (importedColors.count() != 0)
+ {
+ for (int cd = 0; cd < importedColors.count(); cd++)
+ {
+ m_Doc->PageColors.remove(importedColors[cd]);
+ }
+ }
+ }
+ f.close();
+ }
+ if (progressDialog)
+ progressDialog->close();
+ return true;
+}
+
+void CvgPlug::getObjects(QDataStream &ts, bool color, quint32 lenData)
+{
+ quint16 obX, obY, obW, obH, fillFlag, lineWidth;
+ quint32 counter = 0;
+ quint32 colorFill, colorLine;
+ int z;
+ PageItem *ite;
+ Coords.resize(0);
+ Coords.svgInit();
+ ts >> obX >> obY >> obW >> obH;
+ ts >> colorFill >> colorLine;
+ ts >> fillFlag >> lineWidth;
+ qreal scX = obW / 16384.0;
+ qreal scY = obH / 16384.0;
+ parseColor(colorFill, colorLine, color, fillFlag);
+ while (counter < lenData)
+ {
+ quint16 opCode, x1, y1, cx1, cy1, cx2, cy2;
+ ts >> opCode;
+ counter += 2;
+ if (opCode == 0x0000) // moveTo
+ {
+ ts >> x1 >> y1;
+ counter += 4;
+ Coords.svgMoveTo(x1 / 72.0 * scX, y1 / 72.0 * scY * scPg);
+ }
+ else if (opCode == 0x0001) // lineTo
+ {
+ ts >> x1 >> y1;
+ counter += 4;
+ Coords.svgLineTo(x1 / 72.0 * scX, y1 / 72.0 * scY * scPg);
+ }
+ else if (opCode == 0x0002) // curveTo
+ {
+ ts >> cx1 >> cy1 >> cx2 >> cy2 >> x1 >> y1;
+ counter += 12;
+ Coords.svgCurveToCubic(cx1 / 72.0 * scX, cy1 / 72.0 * scY * scPg, cx2 / 72.0 * scX, cy2 / 72.0 * scY * scPg, x1 / 72.0 * scX, y1 / 72.0 * scY * scPg);
+ }
+ else if (opCode == 0x000f)
+ break;
+ }
+ if (Coords.size() > 0)
+ {
+ Coords.svgClosePath();
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX + obX / 72.0, baseY + obY / 72.0 * scPg, 10, 10, lineWidth / 72.0, CurrColorFill, CurrColorStroke, true);
+ ite = m_Doc->Items->at(z);
+ ite->PoLine = Coords.copy();
+ ite->PoLine.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
+ ite->ClipEdited = true;
+ ite->Frame = false;
+ ite->FrameType = 3;
+ ite->setFillShade(CurrFillShade);
+ ite->setLineShade(CurrStrokeShade);
+ FPoint wh = getMaxClipF(&ite->PoLine);
+ ite->setWidthHeight(wh.x(),wh.y());
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(ite);
+ ite->OldB2 = ite->width();
+ ite->OldH2 = ite->height();
+ ite->updateClip();
+ Elements.append(ite);
+ if (groupStack.count() != 0)
+ groupStack.top().append(ite);
+ }
+}
+
+void CvgPlug::parseColor(quint32 dataF, quint32 dataS, bool color, quint16 flag)
+{
+ ScColor tmp;
+ ColorList::Iterator it;
+ CurrColorFill = CommonStrings::None;
+ CurrFillShade = 100.0;
+ CurrColorStroke = CommonStrings::None;
+ CurrStrokeShade = 100.0;
+ QColor c;
+ int Rc, Gc, Bc, hR, hG, hB;
+ if (color)
+ {
+ bool found = false;
+ if ((flag == 0x0080) || (flag == 0x0200))
+ {
+ c.setRgb(dataF);
+ Rc = c.red();
+ Gc = c.green();
+ Bc = c.blue();
+ for (it = m_Doc->PageColors.begin(); it != m_Doc->PageColors.end(); ++it)
+ {
+ if (it.value().getColorModel() == colorModelRGB)
+ {
+ it.value().getRGB(&hR, &hG, &hB);
+ if ((Rc == hR) && (Gc == hG) && (Bc == hB))
+ {
+ CurrColorFill = it.key();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ {
+ tmp.fromQColor(c);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ QString newColorName = "FromCVG"+c.name();
+ m_Doc->PageColors.insert(newColorName, tmp);
+ importedColors.append(newColorName);
+ CurrColorFill = newColorName;
+ }
+ }
+ if ((flag == 0x0080) || (flag == 0x0100))
+ {
+ found = false;
+ c.setRgb(dataS);
+ Rc = c.red();
+ Gc = c.green();
+ Bc = c.blue();
+ for (it = m_Doc->PageColors.begin(); it != m_Doc->PageColors.end(); ++it)
+ {
+ if (it.value().getColorModel() == colorModelRGB)
+ {
+ it.value().getRGB(&hR, &hG, &hB);
+ if ((Rc == hR) && (Gc == hG) && (Bc == hB))
+ {
+ CurrColorStroke = it.key();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ {
+ tmp.fromQColor(c);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ QString newColorName = "FromCVG"+c.name();
+ m_Doc->PageColors.insert(newColorName, tmp);
+ importedColors.append(newColorName);
+ CurrColorStroke = newColorName;
+ }
+ }
+ }
+ else
+ {
+ if (flag == 0x0080)
+ {
+ CurrColorFill = "Black";
+ CurrFillShade = dataF & 0x000000FF;
+ CurrColorStroke = "Black";
+ CurrStrokeShade = dataS & 0x000000FF;
+ }
+ else if (flag == 0x0100)
+ {
+ CurrColorFill = CommonStrings::None;
+ CurrFillShade = dataF & 0x000000FF;
+ CurrColorStroke = "Black";
+ CurrStrokeShade = dataS & 0x000000FF;
+ }
+ else
+ {
+ CurrColorFill = "Black";
+ CurrFillShade = dataF & 0x000000FF;
+ CurrColorStroke = CommonStrings::None;
+ CurrStrokeShade = dataS & 0x000000FF;
+ }
+ }
+}
Index: scribus/plugins/cvgimplugin/CMakeLists.txt
===================================================================
--- scribus/plugins/cvgimplugin/CMakeLists.txt (revision 0)
+++ scribus/plugins/cvgimplugin/CMakeLists.txt (revision 13838)
@@ -0,0 +1,32 @@
+INCLUDE_DIRECTORIES(
+${CMAKE_SOURCE_DIR}
+${CMAKE_SOURCE_DIR}/scribus
+)
+
+SET(IMPORTCVG_PLUGIN_MOC_CLASSES
+ importcvg.h
+ importcvgplugin.h
+)
+
+SET(IMPORTCVG_PLUGIN_SOURCES
+ importcvg.cpp
+ importcvgplugin.cpp
+)
+
+SET(SCRIBUS_IMPORTCVG_PLUGIN "importcvg")
+
+QT4_WRAP_CPP(IMPORTCVG_PLUGIN_MOC_SOURCES ${IMPORTCVG_PLUGIN_MOC_CLASSES})
+
+ADD_LIBRARY(${SCRIBUS_IMPORTCVG_PLUGIN} MODULE ${IMPORTCVG_PLUGIN_SOURCES} ${IMPORTCVG_PLUGIN_MOC_SOURCES})
+
+TARGET_LINK_LIBRARIES(${SCRIBUS_IMPORTCVG_PLUGIN} ${PLUGIN_LIBRARIES})
+
+INSTALL(TARGETS ${SCRIBUS_IMPORTCVG_PLUGIN}
+ LIBRARY
+ DESTINATION ${PLUGINDIR}
+ PERMISSIONS ${PLUGIN_PERMISSIONS}
+)
+
+ADD_DEPENDENCIES(${SCRIBUS_IMPORTCVG_PLUGIN} ${EXE_NAME})
+
+# SET_TARGET_PROPERTIES(${SCRIBUS_FONTPREVIEW_PLUGIN} PROPERTIES VERSION "0.0.0")
Index: scribus/plugins/formatidlist.h
===================================================================
--- scribus/plugins/formatidlist.h (revision 13837)
+++ scribus/plugins/formatidlist.h (revision 13838)
@@ -22,6 +22,7 @@
#define FORMATID_WMFIMPORT 104
#define FORMATID_AIIMPORT 105
#define FORMATID_XFIGIMPORT 106
+#define FORMATID_CVGIMPORT 107
#define FORMATID_PDFIMPORT 120
// EXPORT
Index: scribus/plugins/CMakeLists.txt
===================================================================
--- scribus/plugins/CMakeLists.txt (revision 13837)
+++ scribus/plugins/CMakeLists.txt (revision 13838)
@@ -16,7 +16,7 @@
ADD_SUBDIRECTORY(svgimplugin)
ADD_SUBDIRECTORY(wmfimplugin)
ADD_SUBDIRECTORY(xfigimplugin)
-# ADD_SUBDIRECTORY(imposition)
+ADD_SUBDIRECTORY(cvgimplugin)
ADD_SUBDIRECTORY(tools)
#ADD_SUBDIRECTORY(picbrowser)
More information about the scribus-commit
mailing list