r16655 by jghali - #5761: Text vertically misaligned if first character is page number
scribus-commit
scribus-commit at lists.scribus.net
Sat Jun 11 23:22:52 UTC 2011
Author: jghali
Date: Sat Jun 11 23:22:52 2011
New Revision: 16655
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=16655
Log:
#5761: Text vertically misaligned if first character is page number
Modified:
trunk/Scribus/scribus/plugins/import/xfig/importxfig.cpp
Modified: trunk/Scribus/scribus/plugins/import/xfig/importxfig.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=16655&path=/trunk/Scribus/scribus/plugins/import/xfig/importxfig.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/import/xfig/importxfig.cpp (original)
+++ trunk/Scribus/scribus/plugins/import/xfig/importxfig.cpp Sat Jun 11 23:22:52 2011
@@ -1,1671 +1,1671 @@
-/*
-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 "importxfig.h"
-#include "loadsaveplugin.h"
-#include "pagesize.h"
-#include "pageitem.h"
-#include "prefscontext.h"
-#include "prefsfile.h"
-#include "prefsmanager.h"
-#include "prefstable.h"
-#include "rawimage.h"
-#include "scclocale.h"
-#include "sccolorengine.h"
-#include "scconfig.h"
-#include "scmimedata.h"
-#include "scpaths.h"
-#include "scpattern.h"
-#include "scribus.h"
-#include "scribusXml.h"
-#include "scribuscore.h"
-#include "sctextstream.h"
-#include "selection.h"
-#include "ui/customfdialog.h"
-#include "ui/missing.h"
-#include "ui/multiprogressdialog.h"
-#include "ui/propertiespalette.h"
-#include "undomanager.h"
-#include "util.h"
-#include "util_formats.h"
-#include "util_icon.h"
-#include "util_math.h"
-
-extern SCRIBUS_API ScribusQApp * ScQApp;
-
-XfigPlug::XfigPlug(ScribusDoc* doc, int flags)
-{
- tmpSel=new Selection(this, false);
- m_Doc=doc;
- importerFlags = flags;
- interactive = (flags & LoadSavePlugin::lfInteractive);
-}
-
-QImage XfigPlug::readThumbnail(QString fName)
-{
- QFileInfo fi = QFileInfo(fName);
- baseFile = QDir::cleanPath(QDir::toNativeSeparators(fi.absolutePath()+"/"));
- double b, h, x, y;
- parseHeader(fName, x, y, b, h);
- docX = x;
- docY = y;
- if (b == 0.0)
- b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
- if (h == 0.0)
- h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
- docWidth = b - x;
- docHeight = h - y;
- progressDialog = NULL;
- m_Doc = new ScribusDoc();
- m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
- m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
- m_Doc->addPage(0);
- m_Doc->setGUI(false, ScCore->primaryMainWindow(), 0);
- baseX = m_Doc->currentPage()->xOffset();
- baseY = m_Doc->currentPage()->yOffset();
- Elements.clear();
- CustColors.clear();
- importedColors.insert(0, "Black");
- importedColors.insert(1, "Blue");
- importedColors.insert(2, "Green");
- importedColors.insert(3, "Cyan");
- importedColors.insert(4, "Red");
- importedColors.insert(5, "Magenta");
- importedColors.insert(6, "Yellow");
- importedColors.insert(7, "White");
- importedColors.insert(8, "Blue4");
- importedColors.insert(9, "Blue3");
- importedColors.insert(10, "Blue2");
- importedColors.insert(11, "LtBlue");
- importedColors.insert(12, "Green4");
- importedColors.insert(13, "Green3");
- importedColors.insert(14, "Green2");
- importedColors.insert(15, "Cyan4");
- importedColors.insert(16, "Cyan3");
- importedColors.insert(17, "Cyan2");
- importedColors.insert(18, "Red4");
- importedColors.insert(19, "Red3");
- importedColors.insert(20, "Red2");
- importedColors.insert(21, "Magenta4");
- importedColors.insert(22, "Magenta3");
- importedColors.insert(23, "Magenta2");
- importedColors.insert(24, "Brown4");
- importedColors.insert(25, "Brown3");
- importedColors.insert(26, "Brown2");
- importedColors.insert(27, "Pink4");
- importedColors.insert(28, "Pink3");
- importedColors.insert(29, "Pink2");
- importedColors.insert(30, "Pink");
- importedColors.insert(31, "Gold");
- CustColors.insert("Blue", ScColor(0, 0, 255));
- CustColors.insert("Blue4", ScColor(0, 0, 144));
- CustColors.insert("Blue3", ScColor(0, 0, 176));
- CustColors.insert("Blue2", ScColor(0, 0, 208));
- CustColors.insert("LtBlue", ScColor(135, 206, 255));
- CustColors.insert("Cyan", ScColor(255, 0, 0, 0));
- CustColors.insert("Cyan4", ScColor(0, 144, 144));
- CustColors.insert("Cyan3", ScColor(0, 176, 176));
- CustColors.insert("Cyan2", ScColor(0, 208, 208));
- CustColors.insert("Green", ScColor(255, 0, 255, 0));
- CustColors.insert("Green4", ScColor(0, 144, 0));
- CustColors.insert("Green3", ScColor(0, 176, 0));
- CustColors.insert("Green2", ScColor(0, 208, 0));
- CustColors.insert("Red", ScColor(0, 255, 255, 0));
- CustColors.insert("Red4", ScColor(144, 0, 0));
- CustColors.insert("Red3", ScColor(176, 0, 0));
- CustColors.insert("Red2", ScColor(208, 0, 0));
- CustColors.insert("Yellow", ScColor(0, 0, 255, 0));
- CustColors.insert("Magenta", ScColor(0, 255, 0, 0));
- CustColors.insert("Magenta4", ScColor(144, 0, 144));
- CustColors.insert("Magenta3", ScColor(176, 0, 176));
- CustColors.insert("Magenta2", ScColor(208, 0, 208));
- CustColors.insert("Brown4", ScColor(128, 48, 0));
- CustColors.insert("Brown3", ScColor(160, 64, 0));
- CustColors.insert("Brown2", ScColor(192, 96, 0));
- CustColors.insert("Pink4", ScColor(255, 128, 128));
- CustColors.insert("Pink3", ScColor(255, 160, 160));
- CustColors.insert("Pink2", ScColor(255, 192, 192));
- CustColors.insert("Pink", ScColor(255, 224, 224));
- CustColors.insert("Gold", ScColor(255, 215, 0));
- m_Doc->setLoading(true);
- m_Doc->DoDrawing = false;
- m_Doc->scMW()->setScriptRunning(true);
- QString CurDirP = QDir::currentPath();
- QDir::setCurrent(fi.path());
- if (convert(fName))
- {
- tmpSel->clear();
- QDir::setCurrent(CurDirP);
- if (Elements.count() > 1)
- m_Doc->groupObjectsList(Elements);
- m_Doc->DoDrawing = true;
- m_Doc->m_Selection->delaySignalsOn();
- QImage tmpImage;
- if (Elements.count() > 0)
- {
- for (int dre=0; dre<Elements.count(); ++dre)
- {
- tmpSel->addItem(Elements.at(dre), true);
- }
- tmpSel->setGroupRect();
- double xs = tmpSel->width();
- double ys = tmpSel->height();
- tmpImage = Elements.at(0)->DrawObj_toImage(500);
- tmpImage.setText("XSize", QString("%1").arg(xs));
- tmpImage.setText("YSize", QString("%1").arg(ys));
- }
- m_Doc->scMW()->setScriptRunning(false);
- m_Doc->setLoading(false);
- m_Doc->m_Selection->delaySignalsOff();
- delete m_Doc;
- return tmpImage;
- }
- else
- {
- QDir::setCurrent(CurDirP);
- m_Doc->DoDrawing = true;
- m_Doc->scMW()->setScriptRunning(false);
- delete m_Doc;
- }
- return QImage();
-}
-
-bool XfigPlug::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();
- importedColors.insert(0, "Black");
- importedColors.insert(1, "Blue");
- importedColors.insert(2, "Green");
- importedColors.insert(3, "Cyan");
- importedColors.insert(4, "Red");
- importedColors.insert(5, "Magenta");
- importedColors.insert(6, "Yellow");
- importedColors.insert(7, "White");
- importedColors.insert(8, "Blue4");
- importedColors.insert(9, "Blue3");
- importedColors.insert(10, "Blue2");
- importedColors.insert(11, "LtBlue");
- importedColors.insert(12, "Green4");
- importedColors.insert(13, "Green3");
- importedColors.insert(14, "Green2");
- importedColors.insert(15, "Cyan4");
- importedColors.insert(16, "Cyan3");
- importedColors.insert(17, "Cyan2");
- importedColors.insert(18, "Red4");
- importedColors.insert(19, "Red3");
- importedColors.insert(20, "Red2");
- importedColors.insert(21, "Magenta4");
- importedColors.insert(22, "Magenta3");
- importedColors.insert(23, "Magenta2");
- importedColors.insert(24, "Brown4");
- importedColors.insert(25, "Brown3");
- importedColors.insert(26, "Brown2");
- importedColors.insert(27, "Pink4");
- importedColors.insert(28, "Pink3");
- importedColors.insert(29, "Pink2");
- importedColors.insert(30, "Pink");
- importedColors.insert(31, "Gold");
- CustColors.insert("Blue", ScColor(0, 0, 255));
- CustColors.insert("Blue4", ScColor(0, 0, 144));
- CustColors.insert("Blue3", ScColor(0, 0, 176));
- CustColors.insert("Blue2", ScColor(0, 0, 208));
- CustColors.insert("LtBlue", ScColor(135, 206, 255));
- CustColors.insert("Cyan", ScColor(255, 0, 0, 0));
- CustColors.insert("Cyan4", ScColor(0, 144, 144));
- CustColors.insert("Cyan3", ScColor(0, 176, 176));
- CustColors.insert("Cyan2", ScColor(0, 208, 208));
- CustColors.insert("Green", ScColor(255, 0, 255, 0));
- CustColors.insert("Green4", ScColor(0, 144, 0));
- CustColors.insert("Green3", ScColor(0, 176, 0));
- CustColors.insert("Green2", ScColor(0, 208, 0));
- CustColors.insert("Red", ScColor(0, 255, 255, 0));
- CustColors.insert("Red4", ScColor(144, 0, 0));
- CustColors.insert("Red3", ScColor(176, 0, 0));
- CustColors.insert("Red2", ScColor(208, 0, 0));
- CustColors.insert("Yellow", ScColor(0, 0, 255, 0));
- CustColors.insert("Magenta", ScColor(0, 255, 0, 0));
- CustColors.insert("Magenta4", ScColor(144, 0, 144));
- CustColors.insert("Magenta3", ScColor(176, 0, 176));
- CustColors.insert("Magenta2", ScColor(208, 0, 208));
- CustColors.insert("Brown4", ScColor(128, 48, 0));
- CustColors.insert("Brown3", ScColor(160, 64, 0));
- CustColors.insert("Brown2", ScColor(192, 96, 0));
- CustColors.insert("Pink4", ScColor(255, 128, 128));
- CustColors.insert("Pink3", ScColor(255, 160, 160));
- CustColors.insert("Pink2", ScColor(255, 192, 192));
- CustColors.insert("Pink", ScColor(255, 224, 224));
- CustColors.insert("Gold", ScColor(255, 215, 0));
- 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, x, y, b, h);
- docX = x;
- docY = y;
- if (b == 0.0)
- b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
- if (h == 0.0)
- h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
- docWidth = b - x;
- docHeight = h - y;
- baseX = 0;
- baseY = 0;
- if (!interactive || (flags & LoadSavePlugin::lfInsertPage))
- {
- m_Doc->setPage(b-x, h-y, 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(b-x, h-y, 0, 0, 0, 0, 0, 0, false, false, 0, false, 0, 1, "Custom", true);
- ScCore->primaryMainWindow()->HaveNewDoc();
- ret = true;
- baseX = 0;
- baseY = 0;
- }
- }
- if (flags & LoadSavePlugin::lfCreateDoc)
- {
- m_Doc->documentInfo().setAuthor(docCreator);
- m_Doc->documentInfo().setPublisher(docOrganisation);
- m_Doc->documentInfo().setTitle(docTitle);
- m_Doc->documentInfo().setDate(docDate+" "+docTime);
- }
- if ((!ret) && (interactive))
- {
- baseX = m_Doc->currentPage()->xOffset();
- baseY = m_Doc->currentPage()->yOffset();
- }
- if ((ret) || (!interactive))
- {
- if (b-x > h-y)
- m_Doc->setPageOrientation(1);
- else
- m_Doc->setPageOrientation(0);
- m_Doc->setPageSize("Custom");
- }
+/*
+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 "importxfig.h"
+#include "loadsaveplugin.h"
+#include "pagesize.h"
+#include "pageitem.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "prefstable.h"
+#include "rawimage.h"
+#include "scclocale.h"
+#include "sccolorengine.h"
+#include "scconfig.h"
+#include "scmimedata.h"
+#include "scpaths.h"
+#include "scpattern.h"
+#include "scribus.h"
+#include "scribusXml.h"
+#include "scribuscore.h"
+#include "sctextstream.h"
+#include "selection.h"
+#include "ui/customfdialog.h"
+#include "ui/missing.h"
+#include "ui/multiprogressdialog.h"
+#include "ui/propertiespalette.h"
+#include "undomanager.h"
+#include "util.h"
+#include "util_formats.h"
+#include "util_icon.h"
+#include "util_math.h"
+
+extern SCRIBUS_API ScribusQApp * ScQApp;
+
+XfigPlug::XfigPlug(ScribusDoc* doc, int flags)
+{
+ tmpSel=new Selection(this, false);
+ m_Doc=doc;
+ importerFlags = flags;
+ interactive = (flags & LoadSavePlugin::lfInteractive);
+}
+
+QImage XfigPlug::readThumbnail(QString fName)
+{
+ QFileInfo fi = QFileInfo(fName);
+ baseFile = QDir::cleanPath(QDir::toNativeSeparators(fi.absolutePath()+"/"));
+ double b, h, x, y;
+ parseHeader(fName, x, y, b, h);
+ docX = x;
+ docY = y;
+ if (b == 0.0)
+ b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
+ if (h == 0.0)
+ h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
+ docWidth = b - x;
+ docHeight = h - y;
+ progressDialog = NULL;
+ m_Doc = new ScribusDoc();
+ m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
+ m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
+ m_Doc->addPage(0);
+ m_Doc->setGUI(false, ScCore->primaryMainWindow(), 0);
+ baseX = m_Doc->currentPage()->xOffset();
+ baseY = m_Doc->currentPage()->yOffset();
+ Elements.clear();
+ CustColors.clear();
+ importedColors.insert(0, "Black");
+ importedColors.insert(1, "Blue");
+ importedColors.insert(2, "Green");
+ importedColors.insert(3, "Cyan");
+ importedColors.insert(4, "Red");
+ importedColors.insert(5, "Magenta");
+ importedColors.insert(6, "Yellow");
+ importedColors.insert(7, "White");
+ importedColors.insert(8, "Blue4");
+ importedColors.insert(9, "Blue3");
+ importedColors.insert(10, "Blue2");
+ importedColors.insert(11, "LtBlue");
+ importedColors.insert(12, "Green4");
+ importedColors.insert(13, "Green3");
+ importedColors.insert(14, "Green2");
+ importedColors.insert(15, "Cyan4");
+ importedColors.insert(16, "Cyan3");
+ importedColors.insert(17, "Cyan2");
+ importedColors.insert(18, "Red4");
+ importedColors.insert(19, "Red3");
+ importedColors.insert(20, "Red2");
+ importedColors.insert(21, "Magenta4");
+ importedColors.insert(22, "Magenta3");
+ importedColors.insert(23, "Magenta2");
+ importedColors.insert(24, "Brown4");
+ importedColors.insert(25, "Brown3");
+ importedColors.insert(26, "Brown2");
+ importedColors.insert(27, "Pink4");
+ importedColors.insert(28, "Pink3");
+ importedColors.insert(29, "Pink2");
+ importedColors.insert(30, "Pink");
+ importedColors.insert(31, "Gold");
+ CustColors.insert("Blue", ScColor(0, 0, 255));
+ CustColors.insert("Blue4", ScColor(0, 0, 144));
+ CustColors.insert("Blue3", ScColor(0, 0, 176));
+ CustColors.insert("Blue2", ScColor(0, 0, 208));
+ CustColors.insert("LtBlue", ScColor(135, 206, 255));
+ CustColors.insert("Cyan", ScColor(255, 0, 0, 0));
+ CustColors.insert("Cyan4", ScColor(0, 144, 144));
+ CustColors.insert("Cyan3", ScColor(0, 176, 176));
+ CustColors.insert("Cyan2", ScColor(0, 208, 208));
+ CustColors.insert("Green", ScColor(255, 0, 255, 0));
+ CustColors.insert("Green4", ScColor(0, 144, 0));
+ CustColors.insert("Green3", ScColor(0, 176, 0));
+ CustColors.insert("Green2", ScColor(0, 208, 0));
+ CustColors.insert("Red", ScColor(0, 255, 255, 0));
+ CustColors.insert("Red4", ScColor(144, 0, 0));
+ CustColors.insert("Red3", ScColor(176, 0, 0));
+ CustColors.insert("Red2", ScColor(208, 0, 0));
+ CustColors.insert("Yellow", ScColor(0, 0, 255, 0));
+ CustColors.insert("Magenta", ScColor(0, 255, 0, 0));
+ CustColors.insert("Magenta4", ScColor(144, 0, 144));
+ CustColors.insert("Magenta3", ScColor(176, 0, 176));
+ CustColors.insert("Magenta2", ScColor(208, 0, 208));
+ CustColors.insert("Brown4", ScColor(128, 48, 0));
+ CustColors.insert("Brown3", ScColor(160, 64, 0));
+ CustColors.insert("Brown2", ScColor(192, 96, 0));
+ CustColors.insert("Pink4", ScColor(255, 128, 128));
+ CustColors.insert("Pink3", ScColor(255, 160, 160));
+ CustColors.insert("Pink2", ScColor(255, 192, 192));
+ CustColors.insert("Pink", ScColor(255, 224, 224));
+ CustColors.insert("Gold", ScColor(255, 215, 0));
+ m_Doc->setLoading(true);
+ m_Doc->DoDrawing = false;
+ m_Doc->scMW()->setScriptRunning(true);
+ QString CurDirP = QDir::currentPath();
+ QDir::setCurrent(fi.path());
+ if (convert(fName))
+ {
+ tmpSel->clear();
+ QDir::setCurrent(CurDirP);
+ if (Elements.count() > 1)
+ m_Doc->groupObjectsList(Elements);
+ m_Doc->DoDrawing = true;
+ m_Doc->m_Selection->delaySignalsOn();
+ QImage tmpImage;
+ if (Elements.count() > 0)
+ {
+ for (int dre=0; dre<Elements.count(); ++dre)
+ {
+ tmpSel->addItem(Elements.at(dre), true);
+ }
+ tmpSel->setGroupRect();
+ double xs = tmpSel->width();
+ double ys = tmpSel->height();
+ tmpImage = Elements.at(0)->DrawObj_toImage(500);
+ tmpImage.setText("XSize", QString("%1").arg(xs));
+ tmpImage.setText("YSize", QString("%1").arg(ys));
+ }
+ m_Doc->scMW()->setScriptRunning(false);
+ m_Doc->setLoading(false);
+ m_Doc->m_Selection->delaySignalsOff();
+ delete m_Doc;
+ return tmpImage;
+ }
+ else
+ {
+ QDir::setCurrent(CurDirP);
+ m_Doc->DoDrawing = true;
+ m_Doc->scMW()->setScriptRunning(false);
+ delete m_Doc;
+ }
+ return QImage();
+}
+
+bool XfigPlug::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();
+ importedColors.insert(0, "Black");
+ importedColors.insert(1, "Blue");
+ importedColors.insert(2, "Green");
+ importedColors.insert(3, "Cyan");
+ importedColors.insert(4, "Red");
+ importedColors.insert(5, "Magenta");
+ importedColors.insert(6, "Yellow");
+ importedColors.insert(7, "White");
+ importedColors.insert(8, "Blue4");
+ importedColors.insert(9, "Blue3");
+ importedColors.insert(10, "Blue2");
+ importedColors.insert(11, "LtBlue");
+ importedColors.insert(12, "Green4");
+ importedColors.insert(13, "Green3");
+ importedColors.insert(14, "Green2");
+ importedColors.insert(15, "Cyan4");
+ importedColors.insert(16, "Cyan3");
+ importedColors.insert(17, "Cyan2");
+ importedColors.insert(18, "Red4");
+ importedColors.insert(19, "Red3");
+ importedColors.insert(20, "Red2");
+ importedColors.insert(21, "Magenta4");
+ importedColors.insert(22, "Magenta3");
+ importedColors.insert(23, "Magenta2");
+ importedColors.insert(24, "Brown4");
+ importedColors.insert(25, "Brown3");
+ importedColors.insert(26, "Brown2");
+ importedColors.insert(27, "Pink4");
+ importedColors.insert(28, "Pink3");
+ importedColors.insert(29, "Pink2");
+ importedColors.insert(30, "Pink");
+ importedColors.insert(31, "Gold");
+ CustColors.insert("Blue", ScColor(0, 0, 255));
+ CustColors.insert("Blue4", ScColor(0, 0, 144));
+ CustColors.insert("Blue3", ScColor(0, 0, 176));
+ CustColors.insert("Blue2", ScColor(0, 0, 208));
+ CustColors.insert("LtBlue", ScColor(135, 206, 255));
+ CustColors.insert("Cyan", ScColor(255, 0, 0, 0));
+ CustColors.insert("Cyan4", ScColor(0, 144, 144));
+ CustColors.insert("Cyan3", ScColor(0, 176, 176));
+ CustColors.insert("Cyan2", ScColor(0, 208, 208));
+ CustColors.insert("Green", ScColor(255, 0, 255, 0));
+ CustColors.insert("Green4", ScColor(0, 144, 0));
+ CustColors.insert("Green3", ScColor(0, 176, 0));
+ CustColors.insert("Green2", ScColor(0, 208, 0));
+ CustColors.insert("Red", ScColor(0, 255, 255, 0));
+ CustColors.insert("Red4", ScColor(144, 0, 0));
+ CustColors.insert("Red3", ScColor(176, 0, 0));
+ CustColors.insert("Red2", ScColor(208, 0, 0));
+ CustColors.insert("Yellow", ScColor(0, 0, 255, 0));
+ CustColors.insert("Magenta", ScColor(0, 255, 0, 0));
+ CustColors.insert("Magenta4", ScColor(144, 0, 144));
+ CustColors.insert("Magenta3", ScColor(176, 0, 176));
+ CustColors.insert("Magenta2", ScColor(208, 0, 208));
+ CustColors.insert("Brown4", ScColor(128, 48, 0));
+ CustColors.insert("Brown3", ScColor(160, 64, 0));
+ CustColors.insert("Brown2", ScColor(192, 96, 0));
+ CustColors.insert("Pink4", ScColor(255, 128, 128));
+ CustColors.insert("Pink3", ScColor(255, 160, 160));
+ CustColors.insert("Pink2", ScColor(255, 192, 192));
+ CustColors.insert("Pink", ScColor(255, 224, 224));
+ CustColors.insert("Gold", ScColor(255, 215, 0));
+ 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, x, y, b, h);
+ docX = x;
+ docY = y;
+ if (b == 0.0)
+ b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
+ if (h == 0.0)
+ h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
+ docWidth = b - x;
+ docHeight = h - y;
+ baseX = 0;
+ baseY = 0;
+ if (!interactive || (flags & LoadSavePlugin::lfInsertPage))
+ {
+ m_Doc->setPage(b-x, h-y, 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(b-x, h-y, 0, 0, 0, 0, 0, 0, false, false, 0, false, 0, 1, "Custom", true);
+ ScCore->primaryMainWindow()->HaveNewDoc();
+ ret = true;
+ baseX = 0;
+ baseY = 0;
+ }
+ }
+ if (flags & LoadSavePlugin::lfCreateDoc)
+ {
+ m_Doc->documentInfo().setAuthor(docCreator);
+ m_Doc->documentInfo().setPublisher(docOrganisation);
+ m_Doc->documentInfo().setTitle(docTitle);
+ m_Doc->documentInfo().setDate(docDate+" "+docTime);
+ }
+ if ((!ret) && (interactive))
+ {
+ baseX = m_Doc->currentPage()->xOffset();
+ baseY = m_Doc->currentPage()->yOffset();
+ }
+ if ((ret) || (!interactive))
+ {
+ if (b-x > h-y)
+ m_Doc->setPageOrientation(1);
+ else
+ m_Doc->setPageOrientation(0);
+ m_Doc->setPageSize("Custom");
+ }
if (!(flags & LoadSavePlugin::lfLoadAsPattern))
- m_Doc->view()->Deselect();
- Elements.clear();
- m_Doc->setLoading(true);
- m_Doc->DoDrawing = false;
- if (!(flags & LoadSavePlugin::lfLoadAsPattern))
- 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)))
- m_Doc->groupObjectsList(Elements);
- 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);
- if (!(flags & LoadSavePlugin::lfLoadAsPattern))
- {
- 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, tmpSel));
- delete ss;
-/*#ifndef Q_WS_MAC*/
-// see #2196
- m_Doc->itemSelection_DeleteItem(tmpSel);
-/*#else
- qDebug("xfigimport: leaving items on page");
-#endif*/
- 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();
- if (!(flags & LoadSavePlugin::lfLoadAsPattern))
- 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 (!(flags & LoadSavePlugin::lfLoadAsPattern))
- {
- if ((showProgress) && (!interactive))
- m_Doc->view()->DrawNew();
- }
- return success;
-}
-
-XfigPlug::~XfigPlug()
-{
- if (progressDialog)
- delete progressDialog;
- delete tmpSel;
-}
-
-bool XfigPlug::parseHeader(QString fName, double &x, double &y, double &b, double &h)
-{
- QString tmp, BBox, tmp2, FarNam;
- ScColor cc;
- bool found = false;
- QFile f(fName);
- if (f.open(QIODevice::ReadOnly))
- {
- QDataStream ts(&f);
- QString version = readLinefromDataStream(ts);
- if (!version.startsWith("#FIG 3"))
- {
- f.close();
- return false;
- }
- QString orientation = readLinefromDataStream(ts);
- QString justification = readLinefromDataStream(ts);
- QString units = readLinefromDataStream(ts);
- QString papersize = readLinefromDataStream(ts);
- PageSize ps(papersize);
- if (orientation.startsWith("Landscape"))
- {
- h = ps.width();
- b = ps.height();
- }
- else
- {
- b = ps.width();
- h = ps.height();
- }
- f.close();
- found = true;
- }
- return found;
-}
-
-void XfigPlug::parseColor(QString data)
-{
- if (data.isEmpty())
- return;
- int colorNum, dummy;
- QString colorValues;
- ScColor tmp;
- ScTextStream Code(&data, QIODevice::ReadOnly);
- Code >> dummy >> colorNum >> colorValues;
- tmp.setNamedColor(colorValues);
- tmp.setSpotColor(false);
- tmp.setRegistrationColor(false);
- QString namPrefix = "FromXfig%1-"+colorValues;
- CustColors.insert(namPrefix.arg(colorNum), tmp);
- importedColors.insert(colorNum, namPrefix.arg(colorNum));
-}
-
-void XfigPlug::useColor(int colorNum, int area_fill, bool forFill)
-{
- QString color = CommonStrings::None;
- int shade = 100;
- if (forFill)
- {
- if (area_fill == -1)
- color = CommonStrings::None;
- else
- {
- if ((colorNum == -1) || (colorNum == 0))
- {
- if (area_fill == 0)
- {
- color = "White";
- shade = 100;
- }
- else if (area_fill == 20)
- {
- color = "Black";
- shade = 100;
- }
- else if ((area_fill > 0) && (area_fill < 20))
- {
- color = "Black";
- shade = qRound(100.0 / 19.0 * area_fill);
- }
- }
- else if (colorNum == 7)
- {
- if (area_fill == 0)
- {
- color = "Black";
- shade = 100;
- }
- else if (area_fill == 20)
- {
- color = "White";
- shade = 100;
- }
- else if ((area_fill > 0) && (area_fill < 20))
- {
- color = "Black";
- shade = qRound(100.0 / 19.0 * (20 - area_fill));
- }
- }
- else
- {
- if (importedColors.contains(colorNum))
- {
- color = importedColors[colorNum];
- if (!m_Doc->PageColors.contains(color))
- m_Doc->PageColors.insert(color, CustColors[color]);
- int sat = area_fill - 20;
- if ((sat > 0) && (sat < 20))
- shade = qRound(100.0 / 19.0 * sat);
- }
- else
- color = CommonStrings::None;
- }
- }
- CurrColorFill = color;
- CurrFillShade = shade;
- }
- else
- {
- if (area_fill == -1)
- CurrColorStroke = CommonStrings::None;
- else
- {
- if ((colorNum == -1) || (colorNum == 0))
- CurrColorStroke = "Black";
- else
- {
- if (importedColors.contains(colorNum))
- {
- CurrColorStroke = importedColors[colorNum];
- if (!m_Doc->PageColors.contains(CurrColorStroke))
- m_Doc->PageColors.insert(CurrColorStroke, CustColors[CurrColorStroke]);
- }
- else
- CurrColorStroke = CommonStrings::None;
- }
- }
- }
-}
-
-QVector<double> XfigPlug::getDashValues(double linewidth, int code)
-{
- QVector<double> tmp;
- if (code == 1)
- {
- tmp << qMax(4.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- }
- else if (code == 2)
- {
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- }
- else if (code == 3)
- {
- tmp << qMax(4.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- }
- else if (code == 4)
- {
- tmp << qMax(4.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- }
- else if (code == 5)
- {
- tmp << qMax(4.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- tmp << qMax(1.0 * linewidth, 0.1);
- tmp << qMax(2.0 * linewidth, 0.1);
- }
- return tmp;
-}
-
-void XfigPlug::processArrows(int forward_arrow, QString fArrowData, int backward_arrow, QString bArrowData, int depth, PageItem *ite)
-{
- int arrow_typeAF; // (enumeration type)
- int arrow_styleAF; // (enumeration type)
- float arrow_thicknessAF; // (1/80 inch)
- float arrow_widthAF; // (Fig units)
- float arrow_heightAF; // (Fig units)
- int arrow_typeAB; // (enumeration type)
- int arrow_styleAB; // (enumeration type)
- float arrow_thicknessAB; // (1/80 inch)
- float arrow_widthAB; // (Fig units)
- float arrow_heightAB; // (Fig units)
- FPointArray arrow;
- int z = -1;
- PageItem::ItemType iteType;
- if (forward_arrow == 1)
- {
- arrow.resize(0);
- ScTextStream CodeAF(&fArrowData, QIODevice::ReadOnly);
- CodeAF >> arrow_typeAF >> arrow_styleAF >> arrow_thicknessAF >> arrow_widthAF >> arrow_heightAF;
- arrow_widthAF = fig2Pts(arrow_widthAF);
- arrow_heightAF = fig2Pts(arrow_heightAF);
- arrow_thicknessAF = arrow_thicknessAF / 80.0 * 72.0;
- FPoint End = ite->PoLine.point(ite->PoLine.size()-2);
- for (uint xx = ite->PoLine.size()-1; xx > 0; xx -= 2)
- {
- FPoint Vector = ite->PoLine.point(xx);
- if ((End.x() != Vector.x()) || (End.y() != Vector.y()))
- {
- double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI);
- QTransform arrowTrans;
- if (arrow_typeAF == 0)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5");
- else if (arrow_typeAF == 1)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 z");
- else if (arrow_typeAF == 2)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 L -0.7 0 z");
- else if (arrow_typeAF == 3)
- arrow.parseSVG("M -0.7, -0.5 L 0, 0 L -0.7, 0.5 L -1 0 z");
- arrowTrans.translate(End.x(), End.y());
- arrowTrans.rotate(r);
- arrowTrans.scale(arrow_heightAF, arrow_widthAF);
- arrow.map(arrowTrans);
- break;
- }
- }
- QString fillC = "White";
- if (arrow_styleAF == 1)
- fillC = CurrColorStroke;
- if (arrow_typeAF == 0)
- {
- fillC = CommonStrings::None;
- iteType = PageItem::PolyLine;
- }
- else
- iteType = PageItem::Polygon;
- z = m_Doc->itemAdd(iteType, PageItem::Unspecified, ite->xPos(), ite->yPos(), 10, 10, arrow_thicknessAF, fillC, CurrColorStroke, true);
- if (z >= 0)
- {
- PageItem *item = m_Doc->Items->at(z);
- item->PoLine = arrow.copy();
- item->ClipEdited = true;
- item->FrameType = 3;
- item->setFillShade(CurrFillShade);
- item->setLineShade(CurrStrokeShade);
- FPoint wh = getMaxClipF(&item->PoLine);
- item->setWidthHeight(wh.x(),wh.y());
- item->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(item);
- item->setWidthHeight(qMax(item->width(), 1.0), qMax(item->height(), 1.0));
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- }
- }
- if (backward_arrow == 1)
- {
- arrow.resize(0);
- ScTextStream CodeAB(&bArrowData, QIODevice::ReadOnly);
- CodeAB >> arrow_typeAB >> arrow_styleAB >> arrow_thicknessAB >> arrow_widthAB >> arrow_heightAB;
- arrow_widthAB = fig2Pts(arrow_widthAB);
- arrow_heightAB = fig2Pts(arrow_heightAB);
- arrow_thicknessAB = arrow_thicknessAB / 80.0 * 72.0;
- FPointArray arrow;
- FPoint Start = ite->PoLine.point(0);
- for (uint xx = 1; xx < ite->PoLine.size(); xx += 2)
- {
- FPoint Vector = ite->PoLine.point(xx);
- if ((Start.x() != Vector.x()) || (Start.y() != Vector.y()))
- {
- double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI);
- QTransform arrowTrans;
- if (arrow_typeAB == 0)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5");
- else if (arrow_typeAB == 1)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 z");
- else if (arrow_typeAB == 2)
- arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 L -0.7 0 z");
- else if (arrow_typeAB == 3)
- arrow.parseSVG("M -0.7, -0.5 L 0, 0 L -0.7, 0.5 L -1 0 z");
- arrowTrans.translate(Start.x(), Start.y());
- arrowTrans.rotate(r);
- arrowTrans.scale(arrow_heightAB, arrow_widthAB);
- arrow.map(arrowTrans);
- break;
- }
- }
- QString fillC = "White";
- if (arrow_styleAB == 1)
- fillC = CurrColorStroke;
- if (arrow_typeAB == 0)
- {
- fillC = CommonStrings::None;
- iteType = PageItem::PolyLine;
- }
- else
- iteType = PageItem::Polygon;
- z = m_Doc->itemAdd(iteType, PageItem::Unspecified, ite->xPos(), ite->yPos(), 10, 10, arrow_thicknessAB, fillC, CurrColorStroke, true);
- if (z >= 0)
- {
- PageItem *item = m_Doc->Items->at(z);
- item->PoLine = arrow.copy();
- item->ClipEdited = true;
- item->FrameType = 3;
- item->setFillShade(CurrFillShade);
- item->setLineShade(CurrStrokeShade);
- FPoint wh = getMaxClipF(&item->PoLine);
- item->setWidthHeight(wh.x(),wh.y());
- item->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(item);
- item->setWidthHeight(qMax(item->width(), 1.0), qMax(item->height(), 1.0));
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- }
- }
-}
-
-void XfigPlug::processPolyline(QDataStream &ts, QString data)
-{
- QString tmp = data;
- QString fArrowData = "";
- QString bArrowData = "";
- int command;
- int subtype; // (1: polyline, 2: box, 3: polygon, 4: arc-box, 5: imported-picture bounding-box)
- int line_style; // (enumeration type)
- int thickness; // (1/80 inch)
- int pen_color; // (enumeration type, pen color)
- int fill_color; // (enumeration type, fill color)
- int depth; // (enumeration type)
- int pen_style; // (pen style, not used)
- int area_fill; // (enumeration type, -1 = no fill)
- double style_val; // (1/80 inch)
- int join_style; // (enumeration type)
- int cap_style; // (enumeration type, only used for POLYLINE)
- int radius; // (1/80 inch, radius of arc-boxes)
- int forward_arrow; // (0: off, 1: on)
- int backward_arrow; // (0: off, 1: on)
- int npoints; // (number of points in line)
- int pointsRead = 0;
- int imgFlipped;
- QString imgFile;
- double x, y;
- Coords.resize(0);
- Coords.svgInit();
- bool first = true;
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
- Code >> area_fill >> style_val >> join_style >> cap_style >> radius >> forward_arrow >> backward_arrow >> npoints;
- if (forward_arrow == 1)
- fArrowData = readLinefromDataStream(ts);
- if (backward_arrow == 1)
- bArrowData = readLinefromDataStream(ts);
- if (subtype == 5)
- {
- tmp = readLinefromDataStream(ts);
- ScTextStream imf(&tmp, QIODevice::ReadOnly);
- imf >> imgFlipped >> imgFile;
- }
- while (!ts.atEnd())
- {
- tmp = readLinefromDataStream(ts);
- ScTextStream pts(&tmp, QIODevice::ReadOnly);
- while (!pts.atEnd())
- {
- pts >> x >> y;
- x = fig2Pts(x) - docX;
- y = fig2Pts(y) - docY;
- if (first)
- {
- Coords.svgMoveTo(x, y);
- first = false;
- }
- else
- Coords.svgLineTo(x, y);
- pointsRead++;
- }
- if (pointsRead == npoints)
- {
- if (npoints == 1)
- Coords.svgLineTo(x, y);
- break;
- }
- }
- useColor(pen_color, 0, false);
- useColor(fill_color, area_fill, true);
- LineW = thickness / 80.0 * 72.0;
- int z = -1;
- PageItem *ite;
- if (subtype == 1)
- z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- else if ((subtype == 2) || (subtype == 3) || (subtype == 4))
- {
- z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- Coords.svgClosePath();
- }
- else if (subtype == 5)
- {
- z = m_Doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- Coords.svgClosePath();
- }
- else
- z = -1;
- if (z >= 0)
- {
- 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);
- if (line_style > 0)
- ite->setDashes(getDashValues(LineW, line_style));
- if (subtype == 1)
- {
- if (join_style == 0)
- ite->setLineJoin(Qt::MiterJoin);
- else if (join_style == 1)
- ite->setLineJoin(Qt::RoundJoin);
- else if (join_style == 2)
- ite->setLineJoin(Qt::BevelJoin);
- if (cap_style == 0)
- ite->setLineEnd(Qt::FlatCap);
- else if (cap_style == 1)
- ite->setLineEnd(Qt::RoundCap);
- else if (cap_style == 2)
- ite->setLineEnd(Qt::SquareCap);
- }
- FPoint wh = getMaxClipF(&ite->PoLine);
- ite->setWidthHeight(wh.x(),wh.y());
- ite->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(ite);
- ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
- if (subtype == 4)
- {
- ite->setCornerRadius(radius / 80.0 * 72.0);
- ite->FrameType = 2;
- ite->ClipEdited = false;
- ite->updateClip();
- }
- if (subtype == 5)
- {
- ite->Pfile = baseFile + "/" + imgFile;
- m_Doc->loadPict(ite->Pfile, ite, false);
- ite->setImageXYScale(72.0 / 80.0, 72.0 / 80.0);
- ite->setImageXYOffset(0, 0);
- }
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
- processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
- }
-}
-
-void XfigPlug::processSpline(QDataStream &ts, QString data)
-{
- QString tmp = data;
- QString fArrowData = "";
- QString bArrowData = "";
- int command;
- int subtype; // 0: open approximated spline
- // 1: closed approximated spline
- // 2: open interpolated spline
- // 3: closed interpolated spline
- // 4: open x-spline
- // 5: closed x-spline
- int line_style; // (enumeration type)
- int thickness; // (1/80 inch)
- int pen_color; // (enumeration type, pen color)
- int fill_color; // (enumeration type, fill color)
- int depth; // (enumeration type)
- int pen_style; // (pen style, not used)
- int area_fill; // (enumeration type, -1 = no fill)
- double style_val; // (1/80 inch)
- int cap_style; // (enumeration type, only used for POLYLINE)
- int forward_arrow; // (0: off, 1: on)
- int backward_arrow; // (0: off, 1: on)
- int npoints; // (number of points in line)
- int pointsRead = 0;
- double x, y;
- Coords.resize(0);
- Coords.svgInit();
- bool first = true;
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
- Code >> area_fill >> style_val >> cap_style >> forward_arrow >> backward_arrow >> npoints;
- if (forward_arrow == 1)
- fArrowData = readLinefromDataStream(ts);
- if (backward_arrow == 1)
- bArrowData = readLinefromDataStream(ts);
- while (!ts.atEnd())
- {
- tmp = readLinefromDataStream(ts);
- ScTextStream pts(&tmp, QIODevice::ReadOnly);
- while (!pts.atEnd())
- {
- pts >> x >> y;
- x = fig2Pts(x) - docX;
- y = fig2Pts(y) - docY;
- if (first)
- {
- Coords.svgMoveTo(x, y);
- first = false;
- }
- else
- Coords.svgLineTo(x, y);
- pointsRead++;
- }
- if (pointsRead == npoints)
- {
- if (npoints == 1)
- Coords.svgLineTo(x, y);
- break;
- }
- }
- pointsRead = 0;
- while (!ts.atEnd())
- {
- tmp = readLinefromDataStream(ts);
- ScTextStream pts(&tmp, QIODevice::ReadOnly);
- while (!pts.atEnd())
- {
- pts >> x;
- pointsRead++;
- }
- if (pointsRead == npoints)
- break;
- }
- useColor(pen_color, 0, false);
- useColor(fill_color, area_fill, true);
- LineW = thickness / 80.0 * 72.0;
- int z = -1;
- PageItem *ite;
- if ((subtype == 0) || (subtype == 2) || (subtype == 4))
- z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- else if ((subtype == 1) || (subtype == 3) || (subtype == 5))
- {
- z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- Coords.svgClosePath();
- }
- if (z >= 0)
- {
- 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);
- if (line_style > 0)
- ite->setDashes(getDashValues(LineW, line_style));
- if ((subtype == 0) || (subtype == 2) || (subtype == 4))
- {
- if (cap_style == 0)
- ite->setLineEnd(Qt::FlatCap);
- else if (cap_style == 1)
- ite->setLineEnd(Qt::RoundCap);
- else if (cap_style == 2)
- ite->setLineEnd(Qt::SquareCap);
- }
- FPoint wh = getMaxClipF(&ite->PoLine);
- ite->setWidthHeight(wh.x(),wh.y());
- ite->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(ite);
- ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
- processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
- }
-}
-
-void XfigPlug::processArc(QDataStream &ts, QString data)
-{
- QString tmp = data;
- QString fArrowData = "";
- QString bArrowData = "";
- int command;
- int subtype; // (1: open ended arc, 2: pie-wedge (closed))
- int line_style; // (enumeration type)
- int thickness; // (1/80 inch)
- int pen_color; // (enumeration type, pen color)
- int fill_color; // (enumeration type, fill color)
- int depth; // (enumeration type)
- int pen_style; // (pen style, not used)
- int area_fill; // (enumeration type, -1 = no fill)
- double style_val; // (1/80 inch)
- int cap_style; // (enumeration type, only used for POLYLINE)
- int direction; // (always 1)
- int forward_arrow; // (0: off, 1: on)
- int backward_arrow; // (0: off, 1: on)
- double center_x, center_y; // (center of the arc)
- int x1, y1; // (Fig units, the 1st point the user entered)
- int x2, y2; // (Fig units, the 2nd point)
- int x3, y3; // (Fig units, the last point)
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
- Code >> area_fill >> style_val >> cap_style >> direction >> forward_arrow >> backward_arrow;
- Code >> center_x >> center_y >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
- if (forward_arrow == 1)
- fArrowData = readLinefromDataStream(ts);
- if (backward_arrow == 1)
- bArrowData = readLinefromDataStream(ts);
- useColor(pen_color, 0, false);
- useColor(fill_color, area_fill, true);
- LineW = thickness / 80.0 * 72.0;
- int z = -1;
- PageItem *ite;
- if (subtype == 1)
- z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- else if (subtype == 2)
- z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
- else
- z = -1;
- center_x = fig2Pts(center_x) - docX;
- center_y = fig2Pts(center_y) - docY;
- double x1R = fig2Pts(x1) - docX;
- double y1R = fig2Pts(y1) - docY;
- double x3R = fig2Pts(x3) - docX;
- double y3R = fig2Pts(y3) - docY;
- double r1 = distance(x1R - center_x, y1R - center_y);
- double x0 = center_x - r1;
- double y0 = center_y - r1;
- QRectF bBox = QRectF(x0, y0, r1 * 2.0, r1 * 2.0);
- double angle1 = -xy2Deg(x1R - center_x, y1R - center_y);
- double angle2 = -xy2Deg(x3R - center_x, y3R - center_y);
- double sweep;
- if (direction == 0)
- {
- sweep = angle1 - angle2;
- if (sweep < 0.0)
- sweep = 360.0 + sweep;
- }
- else
- {
- sweep = angle2 - angle1;
- if (sweep < 0.0)
- sweep = 360.0 + sweep;
- double an = angle1;
- angle1 = angle2;
- angle2 = an;
- }
- QPainterPath aPath;
- if (subtype == 1)
- {
- aPath.arcMoveTo(bBox, angle2);
- aPath.arcTo(bBox, angle2, sweep);
- }
- else
- {
- aPath.moveTo(center_x, center_y);
- aPath.arcTo(bBox, angle2, sweep);
- aPath.lineTo(center_x, center_y);
- }
- FPointArray points;
- points.fromQPainterPath(aPath);
-
- if (z >= 0)
- {
- ite = m_Doc->Items->at(z);
- ite->PoLine = points.copy();
- ite->PoLine.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
- ite->ClipEdited = true;
- ite->FrameType = 3;
- ite->setFillShade(CurrFillShade);
- ite->setLineShade(CurrStrokeShade);
- if (line_style > 0)
- ite->setDashes(getDashValues(LineW, line_style));
- if (subtype == 1)
- {
- if (cap_style == 0)
- ite->setLineEnd(Qt::FlatCap);
- else if (cap_style == 1)
- ite->setLineEnd(Qt::RoundCap);
- else if (cap_style == 2)
- ite->setLineEnd(Qt::SquareCap);
- }
- FPoint wh = getMaxClipF(&ite->PoLine);
- ite->setWidthHeight(wh.x(),wh.y());
- ite->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(ite);
- ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
- {
- if (direction == 1)
- processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
- else
- processArrows(backward_arrow, bArrowData, forward_arrow, fArrowData, depth, ite);
- }
- }
-}
-
-void XfigPlug::processEllipse(QString data)
-{
- QString tmp = data;
- int command; // (always 1)
- int subtype; // (1: ellipse defined by radii
- // 2: ellipse defined by diameters
- // 3: circle defined by radius
- // 4: circle defined by diameter)
- int line_style; // (enumeration type)
- int thickness; // (1/80 inch)
- int pen_color; // (enumeration type, pen color)
- int fill_color; // (enumeration type, fill color)
- int depth; // (enumeration type)
- int pen_style; // (pen style, not used)
- int area_fill; // (enumeration type, -1 = no fill)
- double style_val; // (1/80 inch)
- int direction; // (always 1)
- double angle; // (radians, the angle of the x-axis)
- int center_x, center_y; // (Fig units)
- int radius_x, radius_y; // (Fig units)
- int start_x, start_y; // (Fig units; the 1st point entered)
- int end_x, end_y; // (Fig units; the last point entered)
- double x, y, w, h;
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
- Code >> area_fill >> style_val >> direction >> angle >> center_x >> center_y >> radius_x >> radius_y;
- Code >> start_x >> start_y >> end_x >> end_y;
- useColor(pen_color, 0, false);
- useColor(fill_color, area_fill, true);
- LineW = thickness / 80.0 * 72.0;
- w = fig2Pts(radius_x);
- h = fig2Pts(radius_y);
- x = fig2Pts(center_x) - w;
- y = fig2Pts(center_y) - h;
- w *= 2.0;
- h *= 2.0;
- x -= docX;
- x += m_Doc->currentPage()->xOffset();
- y -= docY;
- y += m_Doc->currentPage()->yOffset();
- int z = -1;
- PageItem *ite;
- z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Ellipse, baseX + x, baseY + y, w, h, LineW, CurrColorFill, CurrColorStroke, true);
- if (z >= 0)
- {
- ite = m_Doc->Items->at(z);
- ite->setFillShade(CurrFillShade);
- ite->setLineShade(CurrStrokeShade);
- if (line_style > 0)
- ite->setDashes(getDashValues(LineW, line_style));
- ite->setTextFlowMode(PageItem::TextFlowDisabled);
- int rot = m_Doc->RotMode();
- m_Doc->RotMode ( 2);
- m_Doc->RotateItem(-angle * 180.0 / M_PI, ite);
- m_Doc->RotMode( rot);
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- }
-}
-
-QString XfigPlug::cleanText(QString text)
-{
- QString ret = "";
- QString tmp = "";
- bool sep = false;
- int sepcount = 0;
- for (int a = 1; a < text.count(); ++a)
- {
- QString ch = text.mid(a,1);
- if (sep)
- {
- if (ch == "\\")
- {
- ret += ch;
- sep = false;
- }
- else
- {
- tmp += ch;
- sepcount++;
- if (sepcount == 3)
- {
- sep = false;
- bool ok = false;
- if (tmp != "001")
- {
- int code = tmp.toInt(&ok, 8);
- if (ok)
- ret += QChar(code);
- }
- tmp = "";
- }
- }
- }
- else
- {
- if (ch == "\\")
- {
- sep = true;
- sepcount = 0;
- }
- else
- ret += ch;
- }
- }
- return ret;
-}
-
-void XfigPlug::processText(QString data)
-{
- QString tmp = data;
- int command; // (always 4)
- int subtype; // (0: Left justified
- // 1: Center justified
- // 2: Right justified)
- int color; // (enumeration type)
- int depth; // (enumeration type)
- int pen_style; // (enumeration , not used)
- int font; // (enumeration type)
- float font_size; // (font size in points)
- float angle; // (radians, the angle of the text)
- int font_flags; // (bit vector)
- float height; // (Fig units)
- float length; // (Fig units)
- int xT, yT; // (Fig units, coordinate of the origin
- // of the string. If sub_type = 0, it is
- // the lower left corner of the string.
- // If sub_type = 1, it is the lower
- // center. Otherwise it is the lower
- // right corner of the string.)
- QString text;
- double x, y, w, h;
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype >> color >> depth >> pen_style >> font >> font_size >> angle;
- Code >> font_flags >> height >> length >> xT >> yT;
- text = Code.readAll();
- text = cleanText(text);
- FPointArray textPath;
- QPainterPath painterPath;
- QString TFont(m_Doc->itemToolPrefs().textFont);
- QFont::Weight weight = QFont::Normal;
- bool isItalic = false;
- if (font_flags & 4)
- {
- switch (font)
- {
- case 0:
- TFont = "Times Roman";
- weight = QFont::Normal;
- break;
- case 1:
- TFont = "Times Italic";
- weight = QFont::Normal;
- isItalic = true;
- break;
- case 2:
- TFont = "Times Bold";
- weight = QFont::Bold;
- break;
- case 3:
- TFont = "Times Bold Italic";
- weight = QFont::Bold;
- isItalic = true;
- break;
- case 4:
- TFont = "AvantGarde Book";
- weight = QFont::Normal;
- break;
- case 5:
- TFont = "AvantGarde Book Oblique";
- weight = QFont::Normal;
- break;
- case 6:
- TFont = "AvantGarde Demi";
- weight = QFont::DemiBold;
- break;
- case 7:
- TFont = "AvantGarde Demi Oblique";
- weight = QFont::DemiBold;
- break;
- case 8:
- TFont = "Bookman Light";
- weight = QFont::Light;
- break;
- case 9:
- TFont = "Bookman Light Italic";
- weight = QFont::Light;
- isItalic = true;
- break;
- case 10:
- TFont = "Bookman Demi";
- weight = QFont::DemiBold;
- break;
- case 11:
- TFont = "Bookman Demi Italic";
- weight = QFont::DemiBold;
- isItalic = true;
- break;
- case 12:
- TFont = "Courier";
- weight = QFont::Normal;
- break;
- case 13:
- TFont = "Courier Oblique";
- weight = QFont::Normal;
- break;
- case 14:
- TFont = "Courier Bold";
- weight = QFont::Bold;
- break;
- case 15:
- TFont = "Courier Bold Oblique";
- weight = QFont::Bold;
- break;
- case 16:
- TFont = "Helvetica";
- weight = QFont::Normal;
- break;
- case 17:
- TFont = "Helvetica Oblique";
- weight = QFont::Normal;
- break;
- case 18:
- TFont = "Helvetica Bold";
- weight = QFont::Bold;
- break;
- case 19:
- TFont = "Helvetica Bold Oblique";
- weight = QFont::Bold;
- break;
- case 20:
- TFont = "Helvetica Narrow";
- weight = QFont::Normal;
- break;
- case 21:
- TFont = "Helvetica Narrow Oblique";
- weight = QFont::Normal;
- break;
- case 22:
- TFont = "Helvetica Narrow Bold";
- weight = QFont::Bold;
- break;
- case 23:
- TFont = "Helvetica Narrow Bold Oblique";
- weight = QFont::Bold;
- break;
- case 24:
- TFont = "New Century Schoolbook Roman";
- weight = QFont::Normal;
- break;
- case 25:
- TFont = "New Century Schoolbook Italic";
- weight = QFont::Normal;
- isItalic = true;
- break;
- case 26:
- TFont = "New Century Schoolbook Bold";
- weight = QFont::Bold;
- break;
- case 27:
- TFont = "New Century Schoolbook Bold Italic";
- weight = QFont::Bold;
- isItalic = true;
- break;
- case 28:
- TFont = "Palatino Roman";
- weight = QFont::Normal;
- break;
- case 29:
- TFont = "Palatino Italic";
- weight = QFont::Normal;
- isItalic = true;
- break;
- case 30:
- TFont = "Palatino Bold";
- weight = QFont::Bold;
- break;
- case 31:
- TFont = "Palatino Bold Italic";
- weight = QFont::Bold;
- isItalic = true;
- break;
- case 32:
- TFont = "Symbol";
- weight = QFont::Normal;
- break;
- case 33:
- TFont = "Zapf Chancery Medium Italic";
- weight = QFont::Normal;
- isItalic = true;
- break;
- case 34:
- TFont = "Zapf Dingbats";
- weight = QFont::Normal;
- break;
- default:
- TFont = m_Doc->itemToolPrefs().textFont;
- weight = QFont::Normal;
- break;
- }
- }
- else
- {
- switch (font)
- {
- case 1: // Roman
- TFont = "Times";
- weight = QFont::Normal;
- break;
- case 2: // Bold
- TFont = "Times";
- weight = QFont::Bold;
- break;
- case 3: // Italic
- TFont = "Times";
- weight = QFont::Normal;
- isItalic = true;
- break;
- case 4: // Sans Serif
- TFont = "Helvetica";
- weight = QFont::Normal;
- break;
- case 5: // Typewriter
- TFont = "Courier";
- weight = QFont::Normal;
- break;
- default:
- TFont = m_Doc->itemToolPrefs().textFont;
- weight = QFont::Normal;
- break;
- }
- }
- w = fig2Pts(length);
- h = fig2Pts(height);
- x = fig2Pts(xT);
- y = fig2Pts(yT);
- x -= docX;
- x += m_Doc->currentPage()->xOffset();
- y -= docY;
- y += m_Doc->currentPage()->yOffset();
- QFont tf = QFont(TFont, 10, weight, isItalic);
- tf.setPointSizeF(font_size / 80.0 * 72.0);
- painterPath.addText( 0, 0, tf, text );
- QRectF br = painterPath.boundingRect();
- if ((angle == 0) && (br.width() > w))
- {
- QTransform m;
- m.scale(w / br.width(), w / br.width());
- painterPath = m.map(painterPath);
- }
- textPath.fromQPainterPath(painterPath);
- useColor(color, 0, false);
- int z = -1;
- PageItem *ite;
- z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX + x, baseY + y, w, h, 0, CurrColorStroke, CommonStrings::None, true);
- if (z >= 0)
- {
- ite = m_Doc->Items->at(z);
- ite->setRotation(-angle * 180.0 / M_PI);
- ite->PoLine = textPath.copy();
- ite->ClipEdited = true;
- ite->FrameType = 3;
- FPoint wh = getMaxClipF(&ite->PoLine);
- ite->setWidthHeight(wh.x(),wh.y());
- ite->setTextFlowMode(PageItem::TextFlowDisabled);
- m_Doc->AdjustItemSize(ite);
- ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
- if (subtype == 1)
- m_Doc->MoveRotated(ite, FPoint(-br.width() / 2.0, 0.0));
- else if (subtype == 2)
- m_Doc->MoveRotated(ite, FPoint(-br.width(), 0.0));
- depthMap.insert(999 - depth, currentItemNr);
- currentItemNr++;
- }
-}
-
-void XfigPlug::processData(QDataStream &ts, QString data)
-{
- QString tmp = data;
- int command, subtype;
- ScTextStream Code(&tmp, QIODevice::ReadOnly);
- Code >> command >> subtype;
- switch (command)
- {
- case 0:
- parseColor(data);
- break;
- case 1:
- processEllipse(data);
- break;
- case 2:
- processPolyline(ts, data);
- break;
- case 3:
- processSpline(ts, data);
- break;
- case 4:
- processText(data);
- break;
- case 5:
- processArc(ts, data);
- break;
- case 6:
-// qDebug() << "Xfig-Import:: Unsupported Compound object";
- break;
- case -6:
-// qDebug() << "Xfig-Import:: Unsupported End of Compound object";
- break;
- }
-}
-
-void XfigPlug::resortItems()
-{
- int ac = m_Doc->Items->count();
- QList<PageItem*> itemList;
- for (int as = oldDocItemCount; as < ac; ++as)
- {
- itemList.append(m_Doc->Items->takeAt(oldDocItemCount));
- }
- QList<int> keylist = depthMap.uniqueKeys();
- int keysCount = keylist.count();
- int currentLayer = 0;
- for (int it = 0; it < keysCount; ++it)
- {
- if ((importerFlags & LoadSavePlugin::lfCreateDoc) && (it > 0))
- currentLayer = m_Doc->addLayer(QString("Layer %1").arg(it), true);
- QList<int> elems = depthMap.values(keylist.at(it));
- qSort(elems);
- int itemsCount = elems.count();
- for (int i = 0; i < itemsCount; ++i)
- {
- PageItem* ite = itemList.at(elems.at(i));
- Elements.append(ite);
- m_Doc->Items->append(ite);
- ite->ItemNr = m_Doc->Items->count()-1;
- if ((importerFlags & LoadSavePlugin::lfCreateDoc) && (it > 0))
- ite->LayerID = currentLayer;
- }
- }
-}
-
-
-double XfigPlug::fig2Pts(double in)
-{
- return in / 1200.0 * 72.0;
-}
-
-bool XfigPlug::convert(QString fn)
-{
- QString tmp;
- CurrColorFill = "White";
- CurrFillShade = 100.0;
- CurrColorStroke = "Black";
- CurrStrokeShade = 100.0;
- patternMode = false;
- patternX1 = 0.0;
- patternY1 = 0.0;
- patternX2 = 0.0;
- patternY2 = 0.0;
- Coords.resize(0);
- Coords.svgInit();
- clipCoords.resize(0);
- clipCoords.svgInit();
- currentPatternName = "";
- currentPatternX = 0.0;
- currentPatternY = 0.0;
- currentPatternXScale = 1.0;
- currentPatternYScale = 1.0;
- currentPatternRotation = 0.0;
- 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);
- QString version = readLinefromDataStream(ts);
- QString orientation = readLinefromDataStream(ts);
- QString justification = readLinefromDataStream(ts);
- QString units = readLinefromDataStream(ts);
- QString papersize = readLinefromDataStream(ts);
- QString magnification = readLinefromDataStream(ts);
- QString multiple = readLinefromDataStream(ts);
- QString transparent = readLinefromDataStream(ts);
- tmp = readLinefromDataStream(ts);
- if (tmp.startsWith("#"))
- tmp = readLinefromDataStream(ts);
- QString resolution = tmp;
- while (!ts.atEnd())
- {
- tmp = readLinefromDataStream(ts);
- if (tmp.startsWith("#"))
- continue;
- processData(ts, tmp);
- if (progressDialog)
- {
- progressDialog->setProgress("GI", ts.device()->pos());
- qApp->processEvents();
- }
- }
- resortItems();
- }
- if (progressDialog)
- progressDialog->close();
- return true;
-}
+ m_Doc->view()->Deselect();
+ Elements.clear();
+ m_Doc->setLoading(true);
+ m_Doc->DoDrawing = false;
+ if (!(flags & LoadSavePlugin::lfLoadAsPattern))
+ 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)))
+ m_Doc->groupObjectsList(Elements);
+ 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);
+ if (!(flags & LoadSavePlugin::lfLoadAsPattern))
+ {
+ 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, tmpSel));
+ delete ss;
+/*#ifndef Q_WS_MAC*/
+// see #2196
+ m_Doc->itemSelection_DeleteItem(tmpSel);
+/*#else
+ qDebug("xfigimport: leaving items on page");
+#endif*/
+ 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();
+ if (!(flags & LoadSavePlugin::lfLoadAsPattern))
+ 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 (!(flags & LoadSavePlugin::lfLoadAsPattern))
+ {
+ if ((showProgress) && (!interactive))
+ m_Doc->view()->DrawNew();
+ }
+ return success;
+}
+
+XfigPlug::~XfigPlug()
+{
+ if (progressDialog)
+ delete progressDialog;
+ delete tmpSel;
+}
+
+bool XfigPlug::parseHeader(QString fName, double &x, double &y, double &b, double &h)
+{
+ QString tmp, BBox, tmp2, FarNam;
+ ScColor cc;
+ bool found = false;
+ QFile f(fName);
+ if (f.open(QIODevice::ReadOnly))
+ {
+ QDataStream ts(&f);
+ QString version = readLinefromDataStream(ts);
+ if (!version.startsWith("#FIG 3"))
+ {
+ f.close();
+ return false;
+ }
+ QString orientation = readLinefromDataStream(ts);
+ QString justification = readLinefromDataStream(ts);
+ QString units = readLinefromDataStream(ts);
+ QString papersize = readLinefromDataStream(ts);
+ PageSize ps(papersize);
+ if (orientation.startsWith("Landscape"))
+ {
+ h = ps.width();
+ b = ps.height();
+ }
+ else
+ {
+ b = ps.width();
+ h = ps.height();
+ }
+ f.close();
+ found = true;
+ }
+ return found;
+}
+
+void XfigPlug::parseColor(QString data)
+{
+ if (data.isEmpty())
+ return;
+ int colorNum, dummy;
+ QString colorValues;
+ ScColor tmp;
+ ScTextStream Code(&data, QIODevice::ReadOnly);
+ Code >> dummy >> colorNum >> colorValues;
+ tmp.setNamedColor(colorValues);
+ tmp.setSpotColor(false);
+ tmp.setRegistrationColor(false);
+ QString namPrefix = "FromXfig%1-"+colorValues;
+ CustColors.insert(namPrefix.arg(colorNum), tmp);
+ importedColors.insert(colorNum, namPrefix.arg(colorNum));
+}
+
+void XfigPlug::useColor(int colorNum, int area_fill, bool forFill)
+{
+ QString color = CommonStrings::None;
+ int shade = 100;
+ if (forFill)
+ {
+ if (area_fill == -1)
+ color = CommonStrings::None;
+ else
+ {
+ if ((colorNum == -1) || (colorNum == 0))
+ {
+ if (area_fill == 0)
+ {
+ color = "White";
+ shade = 100;
+ }
+ else if (area_fill == 20)
+ {
+ color = "Black";
+ shade = 100;
+ }
+ else if ((area_fill > 0) && (area_fill < 20))
+ {
+ color = "Black";
+ shade = qRound(100.0 / 19.0 * area_fill);
+ }
+ }
+ else if (colorNum == 7)
+ {
+ if (area_fill == 0)
+ {
+ color = "Black";
+ shade = 100;
+ }
+ else if (area_fill == 20)
+ {
+ color = "White";
+ shade = 100;
+ }
+ else if ((area_fill > 0) && (area_fill < 20))
+ {
+ color = "Black";
+ shade = qRound(100.0 / 19.0 * (20 - area_fill));
+ }
+ }
+ else
+ {
+ if (importedColors.contains(colorNum))
+ {
+ color = importedColors[colorNum];
+ if (!m_Doc->PageColors.contains(color))
+ m_Doc->PageColors.insert(color, CustColors[color]);
+ int sat = area_fill - 20;
+ if ((sat > 0) && (sat < 20))
+ shade = qRound(100.0 / 19.0 * sat);
+ }
+ else
+ color = CommonStrings::None;
+ }
+ }
+ CurrColorFill = color;
+ CurrFillShade = shade;
+ }
+ else
+ {
+ if (area_fill == -1)
+ CurrColorStroke = CommonStrings::None;
+ else
+ {
+ if ((colorNum == -1) || (colorNum == 0))
+ CurrColorStroke = "Black";
+ else
+ {
+ if (importedColors.contains(colorNum))
+ {
+ CurrColorStroke = importedColors[colorNum];
+ if (!m_Doc->PageColors.contains(CurrColorStroke))
+ m_Doc->PageColors.insert(CurrColorStroke, CustColors[CurrColorStroke]);
+ }
+ else
+ CurrColorStroke = CommonStrings::None;
+ }
+ }
+ }
+}
+
+QVector<double> XfigPlug::getDashValues(double linewidth, int code)
+{
+ QVector<double> tmp;
+ if (code == 1)
+ {
+ tmp << qMax(4.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ }
+ else if (code == 2)
+ {
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ }
+ else if (code == 3)
+ {
+ tmp << qMax(4.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ }
+ else if (code == 4)
+ {
+ tmp << qMax(4.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ }
+ else if (code == 5)
+ {
+ tmp << qMax(4.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ tmp << qMax(1.0 * linewidth, 0.1);
+ tmp << qMax(2.0 * linewidth, 0.1);
+ }
+ return tmp;
+}
+
+void XfigPlug::processArrows(int forward_arrow, QString fArrowData, int backward_arrow, QString bArrowData, int depth, PageItem *ite)
+{
+ int arrow_typeAF; // (enumeration type)
+ int arrow_styleAF; // (enumeration type)
+ float arrow_thicknessAF; // (1/80 inch)
+ float arrow_widthAF; // (Fig units)
+ float arrow_heightAF; // (Fig units)
+ int arrow_typeAB; // (enumeration type)
+ int arrow_styleAB; // (enumeration type)
+ float arrow_thicknessAB; // (1/80 inch)
+ float arrow_widthAB; // (Fig units)
+ float arrow_heightAB; // (Fig units)
+ FPointArray arrow;
+ int z = -1;
+ PageItem::ItemType iteType;
+ if (forward_arrow == 1)
+ {
+ arrow.resize(0);
+ ScTextStream CodeAF(&fArrowData, QIODevice::ReadOnly);
+ CodeAF >> arrow_typeAF >> arrow_styleAF >> arrow_thicknessAF >> arrow_widthAF >> arrow_heightAF;
+ arrow_widthAF = fig2Pts(arrow_widthAF);
+ arrow_heightAF = fig2Pts(arrow_heightAF);
+ arrow_thicknessAF = arrow_thicknessAF / 80.0 * 72.0;
+ FPoint End = ite->PoLine.point(ite->PoLine.size()-2);
+ for (uint xx = ite->PoLine.size()-1; xx > 0; xx -= 2)
+ {
+ FPoint Vector = ite->PoLine.point(xx);
+ if ((End.x() != Vector.x()) || (End.y() != Vector.y()))
+ {
+ double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI);
+ QTransform arrowTrans;
+ if (arrow_typeAF == 0)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5");
+ else if (arrow_typeAF == 1)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 z");
+ else if (arrow_typeAF == 2)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 L -0.7 0 z");
+ else if (arrow_typeAF == 3)
+ arrow.parseSVG("M -0.7, -0.5 L 0, 0 L -0.7, 0.5 L -1 0 z");
+ arrowTrans.translate(End.x(), End.y());
+ arrowTrans.rotate(r);
+ arrowTrans.scale(arrow_heightAF, arrow_widthAF);
+ arrow.map(arrowTrans);
+ break;
+ }
+ }
+ QString fillC = "White";
+ if (arrow_styleAF == 1)
+ fillC = CurrColorStroke;
+ if (arrow_typeAF == 0)
+ {
+ fillC = CommonStrings::None;
+ iteType = PageItem::PolyLine;
+ }
+ else
+ iteType = PageItem::Polygon;
+ z = m_Doc->itemAdd(iteType, PageItem::Unspecified, ite->xPos(), ite->yPos(), 10, 10, arrow_thicknessAF, fillC, CurrColorStroke, true);
+ if (z >= 0)
+ {
+ PageItem *item = m_Doc->Items->at(z);
+ item->PoLine = arrow.copy();
+ item->ClipEdited = true;
+ item->FrameType = 3;
+ item->setFillShade(CurrFillShade);
+ item->setLineShade(CurrStrokeShade);
+ FPoint wh = getMaxClipF(&item->PoLine);
+ item->setWidthHeight(wh.x(),wh.y());
+ item->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(item);
+ item->setWidthHeight(qMax(item->width(), 1.0), qMax(item->height(), 1.0));
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ }
+ }
+ if (backward_arrow == 1)
+ {
+ arrow.resize(0);
+ ScTextStream CodeAB(&bArrowData, QIODevice::ReadOnly);
+ CodeAB >> arrow_typeAB >> arrow_styleAB >> arrow_thicknessAB >> arrow_widthAB >> arrow_heightAB;
+ arrow_widthAB = fig2Pts(arrow_widthAB);
+ arrow_heightAB = fig2Pts(arrow_heightAB);
+ arrow_thicknessAB = arrow_thicknessAB / 80.0 * 72.0;
+ FPointArray arrow;
+ FPoint Start = ite->PoLine.point(0);
+ for (uint xx = 1; xx < ite->PoLine.size(); xx += 2)
+ {
+ FPoint Vector = ite->PoLine.point(xx);
+ if ((Start.x() != Vector.x()) || (Start.y() != Vector.y()))
+ {
+ double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI);
+ QTransform arrowTrans;
+ if (arrow_typeAB == 0)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5");
+ else if (arrow_typeAB == 1)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 z");
+ else if (arrow_typeAB == 2)
+ arrow.parseSVG("M -1, -0.5 L 0, 0 L -1, 0.5 L -0.7 0 z");
+ else if (arrow_typeAB == 3)
+ arrow.parseSVG("M -0.7, -0.5 L 0, 0 L -0.7, 0.5 L -1 0 z");
+ arrowTrans.translate(Start.x(), Start.y());
+ arrowTrans.rotate(r);
+ arrowTrans.scale(arrow_heightAB, arrow_widthAB);
+ arrow.map(arrowTrans);
+ break;
+ }
+ }
+ QString fillC = "White";
+ if (arrow_styleAB == 1)
+ fillC = CurrColorStroke;
+ if (arrow_typeAB == 0)
+ {
+ fillC = CommonStrings::None;
+ iteType = PageItem::PolyLine;
+ }
+ else
+ iteType = PageItem::Polygon;
+ z = m_Doc->itemAdd(iteType, PageItem::Unspecified, ite->xPos(), ite->yPos(), 10, 10, arrow_thicknessAB, fillC, CurrColorStroke, true);
+ if (z >= 0)
+ {
+ PageItem *item = m_Doc->Items->at(z);
+ item->PoLine = arrow.copy();
+ item->ClipEdited = true;
+ item->FrameType = 3;
+ item->setFillShade(CurrFillShade);
+ item->setLineShade(CurrStrokeShade);
+ FPoint wh = getMaxClipF(&item->PoLine);
+ item->setWidthHeight(wh.x(),wh.y());
+ item->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(item);
+ item->setWidthHeight(qMax(item->width(), 1.0), qMax(item->height(), 1.0));
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ }
+ }
+}
+
+void XfigPlug::processPolyline(QDataStream &ts, QString data)
+{
+ QString tmp = data;
+ QString fArrowData = "";
+ QString bArrowData = "";
+ int command;
+ int subtype; // (1: polyline, 2: box, 3: polygon, 4: arc-box, 5: imported-picture bounding-box)
+ int line_style; // (enumeration type)
+ int thickness; // (1/80 inch)
+ int pen_color; // (enumeration type, pen color)
+ int fill_color; // (enumeration type, fill color)
+ int depth; // (enumeration type)
+ int pen_style; // (pen style, not used)
+ int area_fill; // (enumeration type, -1 = no fill)
+ double style_val; // (1/80 inch)
+ int join_style; // (enumeration type)
+ int cap_style; // (enumeration type, only used for POLYLINE)
+ int radius; // (1/80 inch, radius of arc-boxes)
+ int forward_arrow; // (0: off, 1: on)
+ int backward_arrow; // (0: off, 1: on)
+ int npoints; // (number of points in line)
+ int pointsRead = 0;
+ int imgFlipped;
+ QString imgFile;
+ double x, y;
+ Coords.resize(0);
+ Coords.svgInit();
+ bool first = true;
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
+ Code >> area_fill >> style_val >> join_style >> cap_style >> radius >> forward_arrow >> backward_arrow >> npoints;
+ if (forward_arrow == 1)
+ fArrowData = readLinefromDataStream(ts);
+ if (backward_arrow == 1)
+ bArrowData = readLinefromDataStream(ts);
+ if (subtype == 5)
+ {
+ tmp = readLinefromDataStream(ts);
+ ScTextStream imf(&tmp, QIODevice::ReadOnly);
+ imf >> imgFlipped >> imgFile;
+ }
+ while (!ts.atEnd())
+ {
+ tmp = readLinefromDataStream(ts);
+ ScTextStream pts(&tmp, QIODevice::ReadOnly);
+ while (!pts.atEnd())
+ {
+ pts >> x >> y;
+ x = fig2Pts(x) - docX;
+ y = fig2Pts(y) - docY;
+ if (first)
+ {
+ Coords.svgMoveTo(x, y);
+ first = false;
+ }
+ else
+ Coords.svgLineTo(x, y);
+ pointsRead++;
+ }
+ if (pointsRead == npoints)
+ {
+ if (npoints == 1)
+ Coords.svgLineTo(x, y);
+ break;
+ }
+ }
+ useColor(pen_color, 0, false);
+ useColor(fill_color, area_fill, true);
+ LineW = thickness / 80.0 * 72.0;
+ int z = -1;
+ PageItem *ite;
+ if (subtype == 1)
+ z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ else if ((subtype == 2) || (subtype == 3) || (subtype == 4))
+ {
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ Coords.svgClosePath();
+ }
+ else if (subtype == 5)
+ {
+ z = m_Doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ Coords.svgClosePath();
+ }
+ else
+ z = -1;
+ if (z >= 0)
+ {
+ 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);
+ if (line_style > 0)
+ ite->setDashes(getDashValues(LineW, line_style));
+ if (subtype == 1)
+ {
+ if (join_style == 0)
+ ite->setLineJoin(Qt::MiterJoin);
+ else if (join_style == 1)
+ ite->setLineJoin(Qt::RoundJoin);
+ else if (join_style == 2)
+ ite->setLineJoin(Qt::BevelJoin);
+ if (cap_style == 0)
+ ite->setLineEnd(Qt::FlatCap);
+ else if (cap_style == 1)
+ ite->setLineEnd(Qt::RoundCap);
+ else if (cap_style == 2)
+ ite->setLineEnd(Qt::SquareCap);
+ }
+ FPoint wh = getMaxClipF(&ite->PoLine);
+ ite->setWidthHeight(wh.x(),wh.y());
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(ite);
+ ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
+ if (subtype == 4)
+ {
+ ite->setCornerRadius(radius / 80.0 * 72.0);
+ ite->FrameType = 2;
+ ite->ClipEdited = false;
+ ite->updateClip();
+ }
+ if (subtype == 5)
+ {
+ ite->Pfile = baseFile + "/" + imgFile;
+ m_Doc->loadPict(ite->Pfile, ite, false);
+ ite->setImageXYScale(72.0 / 80.0, 72.0 / 80.0);
+ ite->setImageXYOffset(0, 0);
+ }
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
+ processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
+ }
+}
+
+void XfigPlug::processSpline(QDataStream &ts, QString data)
+{
+ QString tmp = data;
+ QString fArrowData = "";
+ QString bArrowData = "";
+ int command;
+ int subtype; // 0: open approximated spline
+ // 1: closed approximated spline
+ // 2: open interpolated spline
+ // 3: closed interpolated spline
+ // 4: open x-spline
+ // 5: closed x-spline
+ int line_style; // (enumeration type)
+ int thickness; // (1/80 inch)
+ int pen_color; // (enumeration type, pen color)
+ int fill_color; // (enumeration type, fill color)
+ int depth; // (enumeration type)
+ int pen_style; // (pen style, not used)
+ int area_fill; // (enumeration type, -1 = no fill)
+ double style_val; // (1/80 inch)
+ int cap_style; // (enumeration type, only used for POLYLINE)
+ int forward_arrow; // (0: off, 1: on)
+ int backward_arrow; // (0: off, 1: on)
+ int npoints; // (number of points in line)
+ int pointsRead = 0;
+ double x, y;
+ Coords.resize(0);
+ Coords.svgInit();
+ bool first = true;
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
+ Code >> area_fill >> style_val >> cap_style >> forward_arrow >> backward_arrow >> npoints;
+ if (forward_arrow == 1)
+ fArrowData = readLinefromDataStream(ts);
+ if (backward_arrow == 1)
+ bArrowData = readLinefromDataStream(ts);
+ while (!ts.atEnd())
+ {
+ tmp = readLinefromDataStream(ts);
+ ScTextStream pts(&tmp, QIODevice::ReadOnly);
+ while (!pts.atEnd())
+ {
+ pts >> x >> y;
+ x = fig2Pts(x) - docX;
+ y = fig2Pts(y) - docY;
+ if (first)
+ {
+ Coords.svgMoveTo(x, y);
+ first = false;
+ }
+ else
+ Coords.svgLineTo(x, y);
+ pointsRead++;
+ }
+ if (pointsRead == npoints)
+ {
+ if (npoints == 1)
+ Coords.svgLineTo(x, y);
+ break;
+ }
+ }
+ pointsRead = 0;
+ while (!ts.atEnd())
+ {
+ tmp = readLinefromDataStream(ts);
+ ScTextStream pts(&tmp, QIODevice::ReadOnly);
+ while (!pts.atEnd())
+ {
+ pts >> x;
+ pointsRead++;
+ }
+ if (pointsRead == npoints)
+ break;
+ }
+ useColor(pen_color, 0, false);
+ useColor(fill_color, area_fill, true);
+ LineW = thickness / 80.0 * 72.0;
+ int z = -1;
+ PageItem *ite;
+ if ((subtype == 0) || (subtype == 2) || (subtype == 4))
+ z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ else if ((subtype == 1) || (subtype == 3) || (subtype == 5))
+ {
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ Coords.svgClosePath();
+ }
+ if (z >= 0)
+ {
+ 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);
+ if (line_style > 0)
+ ite->setDashes(getDashValues(LineW, line_style));
+ if ((subtype == 0) || (subtype == 2) || (subtype == 4))
+ {
+ if (cap_style == 0)
+ ite->setLineEnd(Qt::FlatCap);
+ else if (cap_style == 1)
+ ite->setLineEnd(Qt::RoundCap);
+ else if (cap_style == 2)
+ ite->setLineEnd(Qt::SquareCap);
+ }
+ FPoint wh = getMaxClipF(&ite->PoLine);
+ ite->setWidthHeight(wh.x(),wh.y());
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(ite);
+ ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
+ processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
+ }
+}
+
+void XfigPlug::processArc(QDataStream &ts, QString data)
+{
+ QString tmp = data;
+ QString fArrowData = "";
+ QString bArrowData = "";
+ int command;
+ int subtype; // (1: open ended arc, 2: pie-wedge (closed))
+ int line_style; // (enumeration type)
+ int thickness; // (1/80 inch)
+ int pen_color; // (enumeration type, pen color)
+ int fill_color; // (enumeration type, fill color)
+ int depth; // (enumeration type)
+ int pen_style; // (pen style, not used)
+ int area_fill; // (enumeration type, -1 = no fill)
+ double style_val; // (1/80 inch)
+ int cap_style; // (enumeration type, only used for POLYLINE)
+ int direction; // (always 1)
+ int forward_arrow; // (0: off, 1: on)
+ int backward_arrow; // (0: off, 1: on)
+ double center_x, center_y; // (center of the arc)
+ int x1, y1; // (Fig units, the 1st point the user entered)
+ int x2, y2; // (Fig units, the 2nd point)
+ int x3, y3; // (Fig units, the last point)
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
+ Code >> area_fill >> style_val >> cap_style >> direction >> forward_arrow >> backward_arrow;
+ Code >> center_x >> center_y >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
+ if (forward_arrow == 1)
+ fArrowData = readLinefromDataStream(ts);
+ if (backward_arrow == 1)
+ bArrowData = readLinefromDataStream(ts);
+ useColor(pen_color, 0, false);
+ useColor(fill_color, area_fill, true);
+ LineW = thickness / 80.0 * 72.0;
+ int z = -1;
+ PageItem *ite;
+ if (subtype == 1)
+ z = m_Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ else if (subtype == 2)
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX, baseY, 10, 10, LineW, CurrColorFill, CurrColorStroke, true);
+ else
+ z = -1;
+ center_x = fig2Pts(center_x) - docX;
+ center_y = fig2Pts(center_y) - docY;
+ double x1R = fig2Pts(x1) - docX;
+ double y1R = fig2Pts(y1) - docY;
+ double x3R = fig2Pts(x3) - docX;
+ double y3R = fig2Pts(y3) - docY;
+ double r1 = distance(x1R - center_x, y1R - center_y);
+ double x0 = center_x - r1;
+ double y0 = center_y - r1;
+ QRectF bBox = QRectF(x0, y0, r1 * 2.0, r1 * 2.0);
+ double angle1 = -xy2Deg(x1R - center_x, y1R - center_y);
+ double angle2 = -xy2Deg(x3R - center_x, y3R - center_y);
+ double sweep;
+ if (direction == 0)
+ {
+ sweep = angle1 - angle2;
+ if (sweep < 0.0)
+ sweep = 360.0 + sweep;
+ }
+ else
+ {
+ sweep = angle2 - angle1;
+ if (sweep < 0.0)
+ sweep = 360.0 + sweep;
+ double an = angle1;
+ angle1 = angle2;
+ angle2 = an;
+ }
+ QPainterPath aPath;
+ if (subtype == 1)
+ {
+ aPath.arcMoveTo(bBox, angle2);
+ aPath.arcTo(bBox, angle2, sweep);
+ }
+ else
+ {
+ aPath.moveTo(center_x, center_y);
+ aPath.arcTo(bBox, angle2, sweep);
+ aPath.lineTo(center_x, center_y);
+ }
+ FPointArray points;
+ points.fromQPainterPath(aPath);
+
+ if (z >= 0)
+ {
+ ite = m_Doc->Items->at(z);
+ ite->PoLine = points.copy();
+ ite->PoLine.translate(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
+ ite->ClipEdited = true;
+ ite->FrameType = 3;
+ ite->setFillShade(CurrFillShade);
+ ite->setLineShade(CurrStrokeShade);
+ if (line_style > 0)
+ ite->setDashes(getDashValues(LineW, line_style));
+ if (subtype == 1)
+ {
+ if (cap_style == 0)
+ ite->setLineEnd(Qt::FlatCap);
+ else if (cap_style == 1)
+ ite->setLineEnd(Qt::RoundCap);
+ else if (cap_style == 2)
+ ite->setLineEnd(Qt::SquareCap);
+ }
+ FPoint wh = getMaxClipF(&ite->PoLine);
+ ite->setWidthHeight(wh.x(),wh.y());
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(ite);
+ ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ if ((ite->itemType() == PageItem::PolyLine) && ((forward_arrow == 1) || (backward_arrow == 1)))
+ {
+ if (direction == 1)
+ processArrows(forward_arrow, fArrowData, backward_arrow, bArrowData, depth, ite);
+ else
+ processArrows(backward_arrow, bArrowData, forward_arrow, fArrowData, depth, ite);
+ }
+ }
+}
+
+void XfigPlug::processEllipse(QString data)
+{
+ QString tmp = data;
+ int command; // (always 1)
+ int subtype; // (1: ellipse defined by radii
+ // 2: ellipse defined by diameters
+ // 3: circle defined by radius
+ // 4: circle defined by diameter)
+ int line_style; // (enumeration type)
+ int thickness; // (1/80 inch)
+ int pen_color; // (enumeration type, pen color)
+ int fill_color; // (enumeration type, fill color)
+ int depth; // (enumeration type)
+ int pen_style; // (pen style, not used)
+ int area_fill; // (enumeration type, -1 = no fill)
+ double style_val; // (1/80 inch)
+ int direction; // (always 1)
+ double angle; // (radians, the angle of the x-axis)
+ int center_x, center_y; // (Fig units)
+ int radius_x, radius_y; // (Fig units)
+ int start_x, start_y; // (Fig units; the 1st point entered)
+ int end_x, end_y; // (Fig units; the last point entered)
+ double x, y, w, h;
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype >> line_style >> thickness >> pen_color >> fill_color >> depth >> pen_style;
+ Code >> area_fill >> style_val >> direction >> angle >> center_x >> center_y >> radius_x >> radius_y;
+ Code >> start_x >> start_y >> end_x >> end_y;
+ useColor(pen_color, 0, false);
+ useColor(fill_color, area_fill, true);
+ LineW = thickness / 80.0 * 72.0;
+ w = fig2Pts(radius_x);
+ h = fig2Pts(radius_y);
+ x = fig2Pts(center_x) - w;
+ y = fig2Pts(center_y) - h;
+ w *= 2.0;
+ h *= 2.0;
+ x -= docX;
+ x += m_Doc->currentPage()->xOffset();
+ y -= docY;
+ y += m_Doc->currentPage()->yOffset();
+ int z = -1;
+ PageItem *ite;
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Ellipse, baseX + x, baseY + y, w, h, LineW, CurrColorFill, CurrColorStroke, true);
+ if (z >= 0)
+ {
+ ite = m_Doc->Items->at(z);
+ ite->setFillShade(CurrFillShade);
+ ite->setLineShade(CurrStrokeShade);
+ if (line_style > 0)
+ ite->setDashes(getDashValues(LineW, line_style));
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ int rot = m_Doc->RotMode();
+ m_Doc->RotMode ( 2);
+ m_Doc->RotateItem(-angle * 180.0 / M_PI, ite);
+ m_Doc->RotMode( rot);
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ }
+}
+
+QString XfigPlug::cleanText(QString text)
+{
+ QString ret = "";
+ QString tmp = "";
+ bool sep = false;
+ int sepcount = 0;
+ for (int a = 1; a < text.count(); ++a)
+ {
+ QString ch = text.mid(a,1);
+ if (sep)
+ {
+ if (ch == "\\")
+ {
+ ret += ch;
+ sep = false;
+ }
+ else
+ {
+ tmp += ch;
+ sepcount++;
+ if (sepcount == 3)
+ {
+ sep = false;
+ bool ok = false;
+ if (tmp != "001")
+ {
+ int code = tmp.toInt(&ok, 8);
+ if (ok)
+ ret += QChar(code);
+ }
+ tmp = "";
+ }
+ }
+ }
+ else
+ {
+ if (ch == "\\")
+ {
+ sep = true;
+ sepcount = 0;
+ }
+ else
+ ret += ch;
+ }
+ }
+ return ret;
+}
+
+void XfigPlug::processText(QString data)
+{
+ QString tmp = data;
+ int command; // (always 4)
+ int subtype; // (0: Left justified
+ // 1: Center justified
+ // 2: Right justified)
+ int color; // (enumeration type)
+ int depth; // (enumeration type)
+ int pen_style; // (enumeration , not used)
+ int font; // (enumeration type)
+ float font_size; // (font size in points)
+ float angle; // (radians, the angle of the text)
+ int font_flags; // (bit vector)
+ float height; // (Fig units)
+ float length; // (Fig units)
+ int xT, yT; // (Fig units, coordinate of the origin
+ // of the string. If sub_type = 0, it is
+ // the lower left corner of the string.
+ // If sub_type = 1, it is the lower
+ // center. Otherwise it is the lower
+ // right corner of the string.)
+ QString text;
+ double x, y, w, h;
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype >> color >> depth >> pen_style >> font >> font_size >> angle;
+ Code >> font_flags >> height >> length >> xT >> yT;
+ text = Code.readAll();
+ text = cleanText(text);
+ FPointArray textPath;
+ QPainterPath painterPath;
+ QString TFont(m_Doc->itemToolPrefs().textFont);
+ QFont::Weight weight = QFont::Normal;
+ bool isItalic = false;
+ if (font_flags & 4)
+ {
+ switch (font)
+ {
+ case 0:
+ TFont = "Times Roman";
+ weight = QFont::Normal;
+ break;
+ case 1:
+ TFont = "Times Italic";
+ weight = QFont::Normal;
+ isItalic = true;
+ break;
+ case 2:
+ TFont = "Times Bold";
+ weight = QFont::Bold;
+ break;
+ case 3:
+ TFont = "Times Bold Italic";
+ weight = QFont::Bold;
+ isItalic = true;
+ break;
+ case 4:
+ TFont = "AvantGarde Book";
+ weight = QFont::Normal;
+ break;
+ case 5:
+ TFont = "AvantGarde Book Oblique";
+ weight = QFont::Normal;
+ break;
+ case 6:
+ TFont = "AvantGarde Demi";
+ weight = QFont::DemiBold;
+ break;
+ case 7:
+ TFont = "AvantGarde Demi Oblique";
+ weight = QFont::DemiBold;
+ break;
+ case 8:
+ TFont = "Bookman Light";
+ weight = QFont::Light;
+ break;
+ case 9:
+ TFont = "Bookman Light Italic";
+ weight = QFont::Light;
+ isItalic = true;
+ break;
+ case 10:
+ TFont = "Bookman Demi";
+ weight = QFont::DemiBold;
+ break;
+ case 11:
+ TFont = "Bookman Demi Italic";
+ weight = QFont::DemiBold;
+ isItalic = true;
+ break;
+ case 12:
+ TFont = "Courier";
+ weight = QFont::Normal;
+ break;
+ case 13:
+ TFont = "Courier Oblique";
+ weight = QFont::Normal;
+ break;
+ case 14:
+ TFont = "Courier Bold";
+ weight = QFont::Bold;
+ break;
+ case 15:
+ TFont = "Courier Bold Oblique";
+ weight = QFont::Bold;
+ break;
+ case 16:
+ TFont = "Helvetica";
+ weight = QFont::Normal;
+ break;
+ case 17:
+ TFont = "Helvetica Oblique";
+ weight = QFont::Normal;
+ break;
+ case 18:
+ TFont = "Helvetica Bold";
+ weight = QFont::Bold;
+ break;
+ case 19:
+ TFont = "Helvetica Bold Oblique";
+ weight = QFont::Bold;
+ break;
+ case 20:
+ TFont = "Helvetica Narrow";
+ weight = QFont::Normal;
+ break;
+ case 21:
+ TFont = "Helvetica Narrow Oblique";
+ weight = QFont::Normal;
+ break;
+ case 22:
+ TFont = "Helvetica Narrow Bold";
+ weight = QFont::Bold;
+ break;
+ case 23:
+ TFont = "Helvetica Narrow Bold Oblique";
+ weight = QFont::Bold;
+ break;
+ case 24:
+ TFont = "New Century Schoolbook Roman";
+ weight = QFont::Normal;
+ break;
+ case 25:
+ TFont = "New Century Schoolbook Italic";
+ weight = QFont::Normal;
+ isItalic = true;
+ break;
+ case 26:
+ TFont = "New Century Schoolbook Bold";
+ weight = QFont::Bold;
+ break;
+ case 27:
+ TFont = "New Century Schoolbook Bold Italic";
+ weight = QFont::Bold;
+ isItalic = true;
+ break;
+ case 28:
+ TFont = "Palatino Roman";
+ weight = QFont::Normal;
+ break;
+ case 29:
+ TFont = "Palatino Italic";
+ weight = QFont::Normal;
+ isItalic = true;
+ break;
+ case 30:
+ TFont = "Palatino Bold";
+ weight = QFont::Bold;
+ break;
+ case 31:
+ TFont = "Palatino Bold Italic";
+ weight = QFont::Bold;
+ isItalic = true;
+ break;
+ case 32:
+ TFont = "Symbol";
+ weight = QFont::Normal;
+ break;
+ case 33:
+ TFont = "Zapf Chancery Medium Italic";
+ weight = QFont::Normal;
+ isItalic = true;
+ break;
+ case 34:
+ TFont = "Zapf Dingbats";
+ weight = QFont::Normal;
+ break;
+ default:
+ TFont = m_Doc->itemToolPrefs().textFont;
+ weight = QFont::Normal;
+ break;
+ }
+ }
+ else
+ {
+ switch (font)
+ {
+ case 1: // Roman
+ TFont = "Times";
+ weight = QFont::Normal;
+ break;
+ case 2: // Bold
+ TFont = "Times";
+ weight = QFont::Bold;
+ break;
+ case 3: // Italic
+ TFont = "Times";
+ weight = QFont::Normal;
+ isItalic = true;
+ break;
+ case 4: // Sans Serif
+ TFont = "Helvetica";
+ weight = QFont::Normal;
+ break;
+ case 5: // Typewriter
+ TFont = "Courier";
+ weight = QFont::Normal;
+ break;
+ default:
+ TFont = m_Doc->itemToolPrefs().textFont;
+ weight = QFont::Normal;
+ break;
+ }
+ }
+ w = fig2Pts(length);
+ h = fig2Pts(height);
+ x = fig2Pts(xT);
+ y = fig2Pts(yT);
+ x -= docX;
+ x += m_Doc->currentPage()->xOffset();
+ y -= docY;
+ y += m_Doc->currentPage()->yOffset();
+ QFont tf = QFont(TFont, 10, weight, isItalic);
+ tf.setPointSizeF(font_size / 80.0 * 72.0);
+ painterPath.addText( 0, 0, tf, text );
+ QRectF br = painterPath.boundingRect();
+ if ((angle == 0) && (br.width() > w))
+ {
+ QTransform m;
+ m.scale(w / br.width(), w / br.width());
+ painterPath = m.map(painterPath);
+ }
+ textPath.fromQPainterPath(painterPath);
+ useColor(color, 0, false);
+ int z = -1;
+ PageItem *ite;
+ z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, baseX + x, baseY + y, w, h, 0, CurrColorStroke, CommonStrings::None, true);
+ if (z >= 0)
+ {
+ ite = m_Doc->Items->at(z);
+ ite->setRotation(-angle * 180.0 / M_PI);
+ ite->PoLine = textPath.copy();
+ ite->ClipEdited = true;
+ ite->FrameType = 3;
+ FPoint wh = getMaxClipF(&ite->PoLine);
+ ite->setWidthHeight(wh.x(),wh.y());
+ ite->setTextFlowMode(PageItem::TextFlowDisabled);
+ m_Doc->AdjustItemSize(ite);
+ ite->setWidthHeight(qMax(ite->width(), 1.0), qMax(ite->height(), 1.0));
+ if (subtype == 1)
+ m_Doc->MoveRotated(ite, FPoint(-br.width() / 2.0, 0.0));
+ else if (subtype == 2)
+ m_Doc->MoveRotated(ite, FPoint(-br.width(), 0.0));
+ depthMap.insert(999 - depth, currentItemNr);
+ currentItemNr++;
+ }
+}
+
+void XfigPlug::processData(QDataStream &ts, QString data)
+{
+ QString tmp = data;
+ int command, subtype;
+ ScTextStream Code(&tmp, QIODevice::ReadOnly);
+ Code >> command >> subtype;
+ switch (command)
+ {
+ case 0:
+ parseColor(data);
+ break;
+ case 1:
+ processEllipse(data);
+ break;
+ case 2:
+ processPolyline(ts, data);
+ break;
+ case 3:
+ processSpline(ts, data);
+ break;
+ case 4:
+ processText(data);
+ break;
+ case 5:
+ processArc(ts, data);
+ break;
+ case 6:
+// qDebug() << "Xfig-Import:: Unsupported Compound object";
+ break;
+ case -6:
+// qDebug() << "Xfig-Import:: Unsupported End of Compound object";
+ break;
+ }
+}
+
+void XfigPlug::resortItems()
+{
+ int ac = m_Doc->Items->count();
+ QList<PageItem*> itemList;
+ for (int as = oldDocItemCount; as < ac; ++as)
+ {
+ itemList.append(m_Doc->Items->takeAt(oldDocItemCount));
+ }
+ QList<int> keylist = depthMap.uniqueKeys();
+ int keysCount = keylist.count();
+ int currentLayer = 0;
+ for (int it = 0; it < keysCount; ++it)
+ {
+ if ((importerFlags & LoadSavePlugin::lfCreateDoc) && (it > 0))
+ currentLayer = m_Doc->addLayer(QString("Layer %1").arg(it), true);
+ QList<int> elems = depthMap.values(keylist.at(it));
+ qSort(elems);
+ int itemsCount = elems.count();
+ for (int i = 0; i < itemsCount; ++i)
+ {
+ PageItem* ite = itemList.at(elems.at(i));
+ Elements.append(ite);
+ m_Doc->Items->append(ite);
+ ite->ItemNr = m_Doc->Items->count()-1;
+ if ((importerFlags & LoadSavePlugin::lfCreateDoc) && (it > 0))
+ ite->LayerID = currentLayer;
+ }
+ }
+}
+
+
+double XfigPlug::fig2Pts(double in)
+{
+ return in / 1200.0 * 72.0;
+}
+
+bool XfigPlug::convert(QString fn)
+{
+ QString tmp;
+ CurrColorFill = "White";
+ CurrFillShade = 100.0;
+ CurrColorStroke = "Black";
+ CurrStrokeShade = 100.0;
+ patternMode = false;
+ patternX1 = 0.0;
+ patternY1 = 0.0;
+ patternX2 = 0.0;
+ patternY2 = 0.0;
+ Coords.resize(0);
+ Coords.svgInit();
+ clipCoords.resize(0);
+ clipCoords.svgInit();
+ currentPatternName = "";
+ currentPatternX = 0.0;
+ currentPatternY = 0.0;
+ currentPatternXScale = 1.0;
+ currentPatternYScale = 1.0;
+ currentPatternRotation = 0.0;
+ 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);
+ QString version = readLinefromDataStream(ts);
+ QString orientation = readLinefromDataStream(ts);
+ QString justification = readLinefromDataStream(ts);
+ QString units = readLinefromDataStream(ts);
+ QString papersize = readLinefromDataStream(ts);
+ QString magnification = readLinefromDataStream(ts);
+ QString multiple = readLinefromDataStream(ts);
+ QString transparent = readLinefromDataStream(ts);
+ tmp = readLinefromDataStream(ts);
+ if (tmp.startsWith("#"))
+ tmp = readLinefromDataStream(ts);
+ QString resolution = tmp;
+ while (!ts.atEnd())
+ {
+ tmp = readLinefromDataStream(ts);
+ if (tmp.startsWith("#"))
+ continue;
+ processData(ts, tmp);
+ if (progressDialog)
+ {
+ progressDialog->setProgress("GI", ts.device()->pos());
+ qApp->processEvents();
+ }
+ }
+ resortItems();
+ }
+ if (progressDialog)
+ progressDialog->close();
+ return true;
+}
More information about the scribus-commit
mailing list