index 083f571d62930918c7732e739b9b62f01f4dc6c9..d715c3702b8d8af2bbda5413478ec20d80f22c3a 100644 (file)
#include <dom/dom.h>
#include <dom/io/stringstream.h>
#include <dom/dom.h>
#include <dom/io/stringstream.h>
+#include <dom/uri.h>
-#include <glib.h>
+#include <glibmm.h>
#include "extension/implementation/implementation.h"
#include "extension/implementation/implementation.h"
#include <dom/util/ziptool.h>
#include <dom/io/domstream.h>
#include <dom/util/ziptool.h>
#include <dom/io/domstream.h>
-typedef org::w3c::dom::io::Writer Writer;
namespace Inkscape
{
namespace Inkscape
{
namespace Internal
{
namespace Internal
{
+typedef org::w3c::dom::URI URI;
+typedef org::w3c::dom::io::Writer Writer;
class StyleInfo
{
public:
class StyleInfo
{
public:
- StyleInfo(const std::string &nameArg, const std::string &styleArg)
+ StyleInfo()
+ {
+ init();
+ }
+
+ StyleInfo(const StyleInfo &other)
+ {
+ assign(other);
+ }
+
+ StyleInfo &operator=(const StyleInfo &other)
{
{
- name = nameArg;
- style = styleArg;
- fill = "none";
- stroke = "none";
+ assign(other);
+ return *this;
+ }
+
+ void assign(const StyleInfo &other)
+ {
+ name = other.name;
+ stroke = other.stroke;
+ strokeColor = other.strokeColor;
+ strokeWidth = other.strokeWidth;
+ strokeOpacity = other.strokeOpacity;
+ fill = other.fill;
+ fillColor = other.fillColor;
+ fillOpacity = other.fillOpacity;
+ }
+
+ void init()
+ {
+ name = "none";
+ stroke = "none";
+ strokeColor = "none";
+ strokeWidth = "none";
+ strokeOpacity = "none";
+ fill = "none";
+ fillColor = "none";
+ fillOpacity = "none";
}
virtual ~StyleInfo()
{}
}
virtual ~StyleInfo()
{}
- std::string getName()
+ //used for eliminating duplicates in the styleTable
+ bool equals(const StyleInfo &other)
{
{
- return name;
+ if (
+ stroke != other.stroke ||
+ strokeColor != other.strokeColor ||
+ strokeWidth != other.strokeWidth ||
+ strokeOpacity != other.strokeOpacity ||
+ fill != other.fill ||
+ fillColor != other.fillColor ||
+ fillOpacity != other.fillOpacity
+ )
+ return false;
+ return true;
}
}
- std::string getCssStyle()
+ Glib::ustring name;
+ Glib::ustring stroke;
+ Glib::ustring strokeColor;
+ Glib::ustring strokeWidth;
+ Glib::ustring strokeOpacity;
+ Glib::ustring fill;
+ Glib::ustring fillColor;
+ Glib::ustring fillOpacity;
+
+};
+
+
+class GradientInfo
+{
+public:
+
+ GradientInfo()
{
{
- return cssStyle;
+ init();
}
}
- std::string getStroke()
+ GradientInfo(const GradientInfo &other)
{
{
- return stroke;
+ assign(other);
}
}
- std::string getStrokeColor()
+ GradientInfo &operator=(const GradientInfo &other)
{
{
- return strokeColor;
+ assign(other);
+ return *this;
}
}
- std::string getStrokeWidth()
+ void assign(const GradientInfo &other)
{
{
- return strokeWidth;
+ name = other.name;
+ style = other.style;
+ cx = other.cx;
+ cy = other.cy;
+ fx = other.fx;
+ fy = other.fy;
+ r = other.r;
+ x1 = other.x1;
+ y1 = other.y1;
+ x2 = other.x2;
+ y2 = other.y2;
}
}
-
- std::string getFill()
+ void init()
{
{
- return fill;
+ name = "none";
+ style = "none";
+ cx = 0.0;
+ cy = 0.0;
+ fx = 0.0;
+ fy = 0.0;
+ r = 0.0;
+ x1 = 0.0;
+ y1 = 0.0;
+ x2 = 0.0;
+ y2 = 0.0;
}
}
- std::string getFillColor()
+ virtual ~GradientInfo()
+ {}
+
+ //used for eliminating duplicates in the styleTable
+ bool equals(const GradientInfo &other)
{
{
- return fillColor;
+ if (
+ name != other.name ||
+ style != other.style ||
+ cx != other.cx ||
+ cy != other.cy ||
+ fx != other.fx ||
+ fy != other.fy ||
+ r != other.r ||
+ x1 != other.x1 ||
+ y1 != other.y1 ||
+ x2 != other.x2 ||
+ y2 != other.y2
+ )
+ return false;
+ return true;
}
}
- std::string name;
- std::string style;
- std::string cssStyle;
- std::string stroke;
- std::string strokeColor;
- std::string strokeWidth;
- std::string fill;
- std::string fillColor;
+ Glib::ustring name;
+ Glib::ustring style;
+ double cx;
+ double cy;
+ double fx;
+ double fy;
+ double r;
+ double x1;
+ double y1;
+ double x2;
+ double y2;
};
};
private:
private:
- std::map<std::string, StyleInfo> styleTable;
+ URI documentUri;
+
+ void reset();
+
+ //cc or dc metadata name/value pairs
+ std::map<Glib::ustring, Glib::ustring> metadata;
+
+ /* Style table
+ Uses a two-stage lookup to avoid style duplication.
+ Use like:
+ StyleInfo si = styleTable[styleLookupTable[id]];
+ but check for errors, of course
+ */
+ //element id -> style entry name
+ std::map<Glib::ustring, Glib::ustring> styleLookupTable;
+ //style entry name -> style info
+ std::vector<StyleInfo> styleTable;
+
+ //element id -> gradient entry name
+ std::map<Glib::ustring, Glib::ustring> gradientLookupTable;
+ //gradient entry name -> gradient info
+ std::vector<GradientInfo> gradientTable;
//for renaming image file names
//for renaming image file names
- std::map<std::string, std::string> imageTable;
+ std::map<Glib::ustring, Glib::ustring> imageTable;
- void preprocess(ZipFile &zf, SPDocument *doc);
void preprocess(ZipFile &zf, Inkscape::XML::Node *node);
bool writeManifest(ZipFile &zf);
void preprocess(ZipFile &zf, Inkscape::XML::Node *node);
bool writeManifest(ZipFile &zf);
+ bool writeMeta(ZipFile &zf);
+
bool writeStyle(Writer &outs);
bool writeTree(Writer &outs, Inkscape::XML::Node *node);
bool writeStyle(Writer &outs);
bool writeTree(Writer &outs, Inkscape::XML::Node *node);