r14918 by fschmid - First part of #8958, backported the "Calamus CVG" import plugin from 1.5.0svn.

scribus-commit scribus-commit at lists.scribus.net
Sun Mar 21 11:30:27 CET 2010


Revision: 14918
Author: fschmid
Date: 2010-03-21T10:26:31.784311Z
Commit message: First part of #8958, backported the "Calamus CVG" import plugin from 1.5.0svn.

Changeset: 
M  /branches/Version135/Scribus/scribus/util_formats.cpp
A  /branches/Version135/Scribus/scribus/plugins/cvg/importcvgplugin.cpp
A  /branches/Version135/Scribus/scribus/plugins/cvg/importcvg.cpp
A  /branches/Version135/Scribus/scribus/plugins/cvg/CMakeLists.txt
M  /branches/Version135/Scribus/scribus/plugins/CMakeLists.txt
M  /branches/Version135/Scribus/scribus/util_formats.h
A  /branches/Version135/Scribus/scribus/plugins/cvg/importcvgplugin.h
A  /branches/Version135/Scribus/scribus/plugins/cvg
A  /branches/Version135/Scribus/scribus/plugins/cvg/importcvg.h
M  /branches/Version135/Scribus/scribus/plugins/formatidlist.h

Diffs:
Index: scribus/util_formats.cpp
===================================================================
--- scribus/util_formats.cpp	(revision 14917)
+++ scribus/util_formats.cpp	(revision 14918)
@@ -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 14917)
+++ scribus/util_formats.h	(revision 14918)
@@ -38,7 +38,7 @@
 		{
 			ALLIMAGES 		= 1|2|4|8|16|32|64|128|256|512|1024|2048|4096|8192,
 			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/cvg/importcvgplugin.h
===================================================================
--- scribus/plugins/cvg/importcvgplugin.h	(revision 0)
+++ scribus/plugins/cvg/importcvgplugin.h	(revision 14918)
@@ -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/cvg/importcvg.h
===================================================================
--- scribus/plugins/cvg/importcvg.h	(revision 0)
+++ scribus/plugins/cvg/importcvg.h	(revision 14918)
@@ -0,0 +1,92 @@
+/*
+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 "pluginapi.h"
+#include "pageitem.h"
+#include "sccolor.h"
+#include "fpointarray.h"
+#include <QList>
+#include <QTransform>
+#include <QMultiMap>
+#include <QtGlobal>
+#include <QObject>
+#include <QString>
+
+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/cvg/importcvgplugin.cpp
===================================================================
--- scribus/plugins/cvg/importcvgplugin.cpp	(revision 0)
+++ scribus/plugins/cvg/importcvgplugin.cpp	(revision 14918)
@@ -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 "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/cvg/importcvg.cpp
===================================================================
--- scribus/plugins/cvg/importcvg.cpp	(revision 0)
+++ scribus/plugins/cvg/importcvg.cpp	(revision 14918)
@@ -0,0 +1,560 @@
+/*
+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 <cstdlib>
+
+#include "commonstrings.h"
+#include "customfdialog.h"
+#include "importcvg.h"
+#include "loadsaveplugin.h"
+#include "missing.h"
+#include "multiprogressdialog.h"
+#include "pagesize.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "prefstable.h"
+#include "propertiespalette.h"
+#include "rawimage.h"
+#include "scclocale.h"
+#include "sccolorengine.h"
+#include "scconfig.h"
+#include "scmimedata.h"
+#include "scpaths.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;
+	importerFlags = flags;
+	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()->setScriptRunning(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()->setScriptRunning(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()->setScriptRunning(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();
+	}
+}
+
+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);
+			if (progressDialog)
+			{
+				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->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/cvg/CMakeLists.txt
===================================================================
--- scribus/plugins/cvg/CMakeLists.txt	(revision 0)
+++ scribus/plugins/cvg/CMakeLists.txt	(revision 14918)
@@ -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 14917)
+++ scribus/plugins/formatidlist.h	(revision 14918)
@@ -21,6 +21,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 14917)
+++ scribus/plugins/CMakeLists.txt	(revision 14918)
@@ -1,6 +1,7 @@
 ADD_SUBDIRECTORY(aiimplugin)
 ADD_SUBDIRECTORY(barcodegenerator)
 ADD_SUBDIRECTORY(colorwheel)
+ADD_SUBDIRECTORY(cvg)
 ADD_SUBDIRECTORY(fileloader)
 ADD_SUBDIRECTORY(fontpreview)
 ADD_SUBDIRECTORY(gettext)




More information about the scribus-commit mailing list