summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFridrich Strba <fridrich.strba@bluewin.ch>2014-10-17 02:38:20 +0000
committer~suv <suv-sf@users.sourceforge.net>2014-10-17 02:38:20 +0000
commitce59a1f6e746f40805550bdfffa8501776e824de (patch)
tree86c0d97bfc286ecb00a8225720ab7190caadd6fd
parentMerge in osx-packaging-update branch. OS X packaging now works correctly for ... (diff)
parentupdate to trunk (r13560) (diff)
downloadinkscape-ce59a1f6e746f40805550bdfffa8501776e824de.tar.gz
inkscape-ce59a1f6e746f40805550bdfffa8501776e824de.zip
Port inkscape to librevenge framework for WPG, CDR and VSD imports
Fixed bugs: - https://launchpad.net/bugs/1323592 Original authors: - Fridrich Strba <fridrich.strba@bluewin.ch> - Alex Valavanis <valavanisalex@gmail.com> (bzr r13621)
-rw-r--r--configure.ac83
-rw-r--r--src/extension/internal/cdr-input.cpp36
-rw-r--r--src/extension/internal/vsd-input.cpp37
-rw-r--r--src/extension/internal/wpg-input.cpp57
-rw-r--r--src/ui/dialog/symbols.cpp26
5 files changed, 178 insertions, 61 deletions
diff --git a/configure.ac b/configure.ac
index 7d59ebd97..5526317e9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -529,27 +529,32 @@ AC_ARG_ENABLE(wpg,
with_libwpg=no
if test "x$enable_wpg" = "xyes"; then
- PKG_CHECK_MODULES(LIBWPG01, libwpg-0.1 libwpg-stream-0.1, with_libwpg01=yes, with_libwpg01=no)
- if test "x$with_libwpg01" = "xyes"; then
- AC_DEFINE(WITH_LIBWPG01,1,[Build in libwpg 0.1.x])
+ dnl **************************************************************
+ dnl Try using librevenge framework first. Fall back to old libs
+ dnl if unavailable.
+ dnl TODO: Drop subsequent tests once this is widespread in distros
+ dnl **************************************************************
+ PKG_CHECK_MODULES(LIBWPG03, libwpg-0.3 librevenge-0.0 librevenge-stream-0.0, with_libwpg03=yes, with_libwpg03=no)
+ if test "x$with_libwpg03" = "xyes"; then
+ AC_DEFINE(WITH_LIBWPG03,1,[Build using libwpg 0.3.x])
with_libwpg=yes
- AC_SUBST(LIBWPG_LIBS, $LIBWPG01_LIBS)
- AC_SUBST(LIBWPG_CFLAGS, $LIBWPG01_CFLAGS)
- fi
-
- PKG_CHECK_MODULES(LIBWPG02, libwpg-0.2 libwpd-0.9 libwpd-stream-0.9, with_libwpg02=yes, with_libwpg02=no)
- if test "x$with_libwpg02" = "xyes"; then
- AC_DEFINE(WITH_LIBWPG02,1,[Build in libwpg 0.2.x])
- with_libwpg=yes
- AC_SUBST(LIBWPG_LIBS, $LIBWPG02_LIBS)
- AC_SUBST(LIBWPG_CFLAGS, $LIBWPG02_CFLAGS)
+ AC_SUBST(LIBWPG_LIBS, $LIBWPG03_LIBS)
+ AC_SUBST(LIBWPG_CFLAGS, $LIBWPG03_CFLAGS)
+ else
+ PKG_CHECK_MODULES(LIBWPG02, libwpg-0.2 libwpd-0.9 libwpd-stream-0.9, with_libwpg02=yes, with_libwpg02=no)
+ if test "x$with_libwpg02" = "xyes"; then
+ AC_DEFINE(WITH_LIBWPG02,1,[Build using libwpg 0.2.x])
+ with_libwpg=yes
+ AC_SUBST(LIBWPG_LIBS, $LIBWPG02_LIBS)
+ AC_SUBST(LIBWPG_CFLAGS, $LIBWPG02_CFLAGS)
+ fi
fi
if test "x$with_libwpg" = "xyes"; then
AC_DEFINE(WITH_LIBWPG,1,[Build in libwpg])
fi
fi
-AM_CONDITIONAL(WITH_LIBWPG01, test "x$with_libwpg01" = "xyes")
+AM_CONDITIONAL(WITH_LIBWPG03, test "x$with_libwpg03" = "xyes")
AM_CONDITIONAL(WITH_LIBWPG02, test "x$with_libwpg02" = "xyes")
AM_CONDITIONAL(WITH_LIBWPG, test "x$with_libwpg" = "xyes")
@@ -564,14 +569,33 @@ AC_ARG_ENABLE(visio,
with_libvisio=no
if test "x$enable_visio" = "xyes"; then
- PKG_CHECK_MODULES(LIBVISIO, libvisio-0.0 >= 0.0.20 libwpd-0.9 libwpd-stream-0.9 libwpg-0.2, with_libvisio=yes, with_libvisio=no)
+ dnl **************************************************************
+ dnl Try using librevenge framework first. Fall back to old libs
+ dnl if unavailable.
+ dnl TODO: Drop subsequent tests once this is widespread in distros
+ dnl **************************************************************
+ PKG_CHECK_MODULES(LIBVISIO01, libvisio-0.1 librevenge-0.0 librevenge-stream-0.0, with_libvisio01=yes, with_libvisio01=no)
+ if test "x$with_libvisio01" = "xyes"; then
+ AC_DEFINE(WITH_LIBVISIO01,1,[Build using libvisio 0.1.x])
+ with_libvisio=yes
+ AC_SUBST(LIBVISIO_LIBS, $LIBVISIO01_LIBS)
+ AC_SUBST(LIBVISIO_CFLAGS, $LIBVISIO01_CFLAGS)
+ else
+ PKG_CHECK_MODULES(LIBVISIO00, libvisio-0.0 >= 0.0.20 libwpd-0.9 libwpd-stream-0.9 libwpg-0.2, with_libvisio00=yes, with_libvisio00=no)
+ if test "x$with_libvisio00" = "xyes"; then
+ AC_DEFINE(WITH_LIBVISIO00,1,[Build using libvisio 0.0.x])
+ with_libvisio=yes
+ AC_SUBST(LIBVISIO_LIBS, $LIBVISIO00_LIBS)
+ AC_SUBST(LIBVISIO_CFLAGS, $LIBVISIO00_CFLAGS)
+ fi
+ fi
if test "x$with_libvisio" = "xyes"; then
AC_DEFINE(WITH_LIBVISIO,1,[Build in libvisio])
fi
fi
-AC_SUBST(LIBVISIO_LIBS)
-AC_SUBST(LIBVISIO_CFLAGS)
+AM_CONDITIONAL(WITH_LIBVISIO01, test "x$with_libvisio01" = "xyes")
+AM_CONDITIONAL(WITH_LIBVISIO00, test "x$with_libvisio00" = "xyes")
AM_CONDITIONAL(WITH_LIBVISIO, test "x$with_libvisio" = "xyes")
dnl ********************************
@@ -585,14 +609,33 @@ AC_ARG_ENABLE(cdr,
with_libcdr=no
if test "x$enable_cdr" = "xyes"; then
- PKG_CHECK_MODULES(LIBCDR, libcdr-0.0 >= 0.0.3 libwpd-0.9 libwpd-stream-0.9 libwpg-0.2, with_libcdr=yes, with_libcdr=no)
+ dnl **************************************************************
+ dnl Try using librevenge framework first. Fall back to old libs
+ dnl if unavailable.
+ dnl TODO: Drop subsequent tests once this is widespread in distros
+ dnl **************************************************************
+ PKG_CHECK_MODULES(LIBCDR01, libcdr-0.1 librevenge-0.0 librevenge-stream-0.0, with_libcdr01=yes, with_libcdr01=no)
+ if test "x$with_libcdr01" = "xyes"; then
+ AC_DEFINE(WITH_LIBCDR01,1,[Build using libcdr 0.1.x])
+ with_libcdr=yes
+ AC_SUBST(LIBCDR_LIBS, $LIBCDR01_LIBS)
+ AC_SUBST(LIBCDR_CFLAGS, $LIBCDR01_CFLAGS)
+ else
+ PKG_CHECK_MODULES(LIBCDR00, libcdr-0.0 >= 0.0.3 libwpd-0.9 libwpd-stream-0.9 libwpg-0.2, with_libcdr00=yes, with_libcdr00=no)
+ if test "x$with_libcdr00" = "xyes"; then
+ AC_DEFINE(WITH_LIBCDR00,1,[Build using libcdr 0.0.x])
+ with_libcdr=yes
+ AC_SUBST(LIBCDR_LIBS, $LIBCDR00_LIBS)
+ AC_SUBST(LIBCDR_CFLAGS, $LIBCDR00_CFLAGS)
+ fi
+ fi
if test "x$with_libcdr" = "xyes"; then
AC_DEFINE(WITH_LIBCDR,1,[Build in libcdr])
fi
fi
-AC_SUBST(LIBCDR_LIBS)
-AC_SUBST(LIBCDR_CFLAGS)
+AM_CONDITIONAL(WITH_LIBCDR01, test "x$with_libcdr01" = "xyes")
+AM_CONDITIONAL(WITH_LIBCDR00, test "x$with_libcdr00" = "xyes")
AM_CONDITIONAL(WITH_LIBCDR, test "x$with_libcdr" = "xyes")
dnl ******************************
diff --git a/src/extension/internal/cdr-input.cpp b/src/extension/internal/cdr-input.cpp
index 0111ed626..748bf4477 100644
--- a/src/extension/internal/cdr-input.cpp
+++ b/src/extension/internal/cdr-input.cpp
@@ -24,7 +24,21 @@
#include <cstring>
#include <libcdr/libcdr.h>
-#include <libwpd-stream/libwpd-stream.h>
+
+// TODO: Drop this check when librevenge is widespread.
+#if WITH_LIBCDR01
+ #include <librevenge-stream/librevenge-stream.h>
+
+ using librevenge::RVNGString;
+ using librevenge::RVNGFileStream;
+ using librevenge::RVNGStringVector;
+#else
+ #include <libwpd-stream/libwpd-stream.h>
+
+ typedef WPXString RVNGString;
+ typedef WPXFileStream RVNGFileStream;
+ typedef libcdr::CDRStringVector RVNGStringVector;
+#endif
#include <gtkmm/alignment.h>
#include <gtkmm/comboboxtext.h>
@@ -60,7 +74,7 @@ namespace Internal {
class CdrImportDialog : public Gtk::Dialog {
public:
- CdrImportDialog(const std::vector<WPXString> &vec);
+ CdrImportDialog(const std::vector<RVNGString> &vec);
virtual ~CdrImportDialog();
bool showDialog();
@@ -86,12 +100,12 @@ private:
class Gtk::VBox * vbox2;
class Gtk::Widget * _previewArea;
- const std::vector<WPXString> &_vec; // Document to be imported
+ const std::vector<RVNGString> &_vec; // Document to be imported
unsigned _current_page; // Current selected page
int _preview_width, _preview_height; // Size of the preview area
};
-CdrImportDialog::CdrImportDialog(const std::vector<WPXString> &vec)
+CdrImportDialog::CdrImportDialog(const std::vector<RVNGString> &vec)
: _vec(vec), _current_page(1)
{
int num_pages = _vec.size();
@@ -210,14 +224,20 @@ void CdrImportDialog::_setPreviewPage(unsigned page)
SPDocument *CdrInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * uri)
{
- WPXFileStream input(uri);
+ RVNGFileStream input(uri);
if (!libcdr::CDRDocument::isSupported(&input)) {
return NULL;
}
- libcdr::CDRStringVector output;
+ RVNGStringVector output;
+#if WITH_LIBCDR01
+ librevenge::RVNGSVGDrawingGenerator generator(output, "svg");
+
+ if (!libcdr::CDRDocument::parse(&input, &generator)) {
+#else
if (!libcdr::CDRDocument::generateSVG(&input, output)) {
+#endif
return NULL;
}
@@ -225,9 +245,9 @@ SPDocument *CdrInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * u
return NULL;
}
- std::vector<WPXString> tmpSVGOutput;
+ std::vector<RVNGString> tmpSVGOutput;
for (unsigned i=0; i<output.size(); ++i) {
- WPXString tmpString("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
+ RVNGString tmpString("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
tmpString.append(output[i]);
tmpSVGOutput.push_back(tmpString);
}
diff --git a/src/extension/internal/vsd-input.cpp b/src/extension/internal/vsd-input.cpp
index 6fc79237b..674997d54 100644
--- a/src/extension/internal/vsd-input.cpp
+++ b/src/extension/internal/vsd-input.cpp
@@ -24,7 +24,22 @@
#include <cstring>
#include <libvisio/libvisio.h>
-#include <libwpd-stream/libwpd-stream.h>
+
+// TODO: Drop this check when librevenge is widespread.
+#if WITH_LIBVISIO01
+ #include <librevenge-stream/librevenge-stream.h>
+
+ using librevenge::RVNGString;
+ using librevenge::RVNGFileStream;
+ using librevenge::RVNGStringVector;
+#else
+ #include <libwpd-stream/libwpd-stream.h>
+
+ typedef WPXString RVNGString;
+ typedef WPXFileStream RVNGFileStream;
+ typedef libvisio::VSDStringVector RVNGStringVector;
+#endif
+
#include <gtkmm/alignment.h>
#include <gtkmm/comboboxtext.h>
@@ -59,7 +74,7 @@ namespace Internal {
class VsdImportDialog : public Gtk::Dialog {
public:
- VsdImportDialog(const std::vector<WPXString> &vec);
+ VsdImportDialog(const std::vector<RVNGString> &vec);
virtual ~VsdImportDialog();
bool showDialog();
@@ -85,12 +100,12 @@ private:
class Gtk::VBox * vbox2;
class Gtk::Widget * _previewArea;
- const std::vector<WPXString> &_vec; // Document to be imported
+ const std::vector<RVNGString> &_vec; // Document to be imported
unsigned _current_page; // Current selected page
int _preview_width, _preview_height; // Size of the preview area
};
-VsdImportDialog::VsdImportDialog(const std::vector<WPXString> &vec)
+VsdImportDialog::VsdImportDialog(const std::vector<RVNGString> &vec)
: _vec(vec), _current_page(1)
{
int num_pages = _vec.size();
@@ -209,14 +224,20 @@ void VsdImportDialog::_setPreviewPage(unsigned page)
SPDocument *VsdInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * uri)
{
- WPXFileStream input(uri);
+ RVNGFileStream input(uri);
if (!libvisio::VisioDocument::isSupported(&input)) {
return NULL;
}
- libvisio::VSDStringVector output;
+ RVNGStringVector output;
+#if WITH_LIBVISIO01
+ librevenge::RVNGSVGDrawingGenerator generator(output, "svg");
+
+ if (!libvisio::VisioDocument::parse(&input, &generator)) {
+#else
if (!libvisio::VisioDocument::generateSVG(&input, output)) {
+#endif
return NULL;
}
@@ -224,9 +245,9 @@ SPDocument *VsdInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * u
return NULL;
}
- std::vector<WPXString> tmpSVGOutput;
+ std::vector<RVNGString> tmpSVGOutput;
for (unsigned i=0; i<output.size(); ++i) {
- WPXString tmpString("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
+ RVNGString tmpString("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
tmpString.append(output[i]);
tmpSVGOutput.push_back(tmpString);
}
diff --git a/src/extension/internal/wpg-input.cpp b/src/extension/internal/wpg-input.cpp
index 14ff3ec77..12d86a99a 100644
--- a/src/extension/internal/wpg-input.cpp
+++ b/src/extension/internal/wpg-input.cpp
@@ -52,16 +52,24 @@
#include "util/units.h"
#include <cstring>
-// Take a guess and fallback to 0.1.x if no configure has run
-#if !defined(WITH_LIBWPG01) && !defined(WITH_LIBWPG02)
-#define WITH_LIBWPG01 1
+// Take a guess and fallback to 0.2.x if no configure has run
+#if !defined(WITH_LIBWPG03) && !defined(WITH_LIBWPG02)
+#define WITH_LIBWPG02 1
#endif
#include "libwpg/libwpg.h"
-#if WITH_LIBWPG01
-#include "libwpg/WPGStreamImplementation.h"
-#elif WITH_LIBWPG02
-#include "libwpd-stream/libwpd-stream.h"
+#if WITH_LIBWPG03
+ #include <librevenge-stream/librevenge-stream.h>
+
+ using librevenge::RVNGString;
+ using librevenge::RVNGFileStream;
+ using librevenge::RVNGInputStream;
+#else
+ #include "libwpd-stream/libwpd-stream.h"
+
+ typedef WPXString RVNGString;
+ typedef WPXFileStream RVNGFileStream;
+ typedef WPXInputStream RVNGInputStream;
#endif
using namespace libwpg;
@@ -73,17 +81,15 @@ namespace Internal {
SPDocument *WpgInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * uri)
{
-#if WITH_LIBWPG01
- WPXInputStream* input = new libwpg::WPGFileStream(uri);
-#elif WITH_LIBWPG02
- WPXInputStream* input = new WPXFileStream(uri);
-#endif
+ RVNGInputStream* input = new RVNGFileStream(uri);
+#if WITH_LIBWPG03
+ if (input->isStructured()) {
+ RVNGInputStream* olestream = input->getSubStreamByName("PerfectOffice_MAIN");
+#else
if (input->isOLEStream()) {
-#if WITH_LIBWPG01
- WPXInputStream* olestream = input->getDocumentOLEStream();
-#elif WITH_LIBWPG02
- WPXInputStream* olestream = input->getDocumentOLEStream("PerfectOffice_MAIN");
+ RVNGInputStream* olestream = input->getDocumentOLEStream("PerfectOffice_MAIN");
#endif
+
if (olestream) {
delete input;
input = olestream;
@@ -98,15 +104,24 @@ SPDocument *WpgInput::open(Inkscape::Extension::Input * /*mod*/, const gchar * u
return NULL;
}
-#if WITH_LIBWPG01
- libwpg::WPGString output;
-#elif WITH_LIBWPG02
- WPXString output;
-#endif
+#if WITH_LIBWPG03
+ librevenge::RVNGStringVector vec;
+ librevenge::RVNGSVGDrawingGenerator generator(vec, "");
+
+ if (!libwpg::WPGraphics::parse(input, &generator) || vec.empty() || vec[0].empty()) {
+ delete input;
+ return NULL;
+ }
+
+ RVNGString output("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
+ output.append(vec[0]);
+#else
+ RVNGString output;
if (!libwpg::WPGraphics::generateSVG(input, output)) {
delete input;
return NULL;
}
+#endif
//printf("I've got a doc: \n%s", painter.document.c_str());
diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp
index c58df864c..a9cf8d068 100644
--- a/src/ui/dialog/symbols.cpp
+++ b/src/ui/dialog/symbols.cpp
@@ -62,8 +62,20 @@
#include "widgets/icon.h"
#ifdef WITH_LIBVISIO
-#include <libvisio/libvisio.h>
-#include <libwpd-stream/libwpd-stream.h>
+ #include <libvisio/libvisio.h>
+
+ // TODO: Drop this check when librevenge is widespread.
+ #if WITH_LIBVISIO01
+ #include <librevenge-stream/librevenge-stream.h>
+
+ using librevenge::RVNGFileStream;
+ using librevenge::RVNGStringVector;
+ #else
+ #include <libwpd-stream/libwpd-stream.h>
+
+ typedef WPXFileStream RVNGFileStream;
+ typedef libvisio::VSDStringVector RVNGStringVector;
+ #endif
#endif
#include "verbs.h"
@@ -495,14 +507,20 @@ void SymbolsDialog::iconChanged() {
// Read Visio stencil files
SPDocument* read_vss( gchar* fullname, gchar* filename ) {
- WPXFileStream input(fullname);
+ RVNGFileStream input(fullname);
if (!libvisio::VisioDocument::isSupported(&input)) {
return NULL;
}
- libvisio::VSDStringVector output;
+ RVNGStringVector output;
+#if WITH_LIBVISIO01
+ librevenge::RVNGSVGDrawingGenerator generator(output, "svg");
+
+ if (!libvisio::VisioDocument::parseStencils(&input, &generator)) {
+#else
if (!libvisio::VisioDocument::generateSVGStencils(&input, output)) {
+#endif
return NULL;
}