Code

New placeholder code for gradients
[inkscape.git] / src / extension / internal / odf.h
index 083f571d62930918c7732e739b9b62f01f4dc6c9..d715c3702b8d8af2bbda5413478ec20d80f22c3a 100644 (file)
@@ -34,8 +34,9 @@
 
 #include <dom/dom.h>
 #include <dom/io/stringstream.h>
+#include <dom/uri.h>
 
-#include <glib.h>
+#include <glibmm.h>
 #include "extension/implementation/implementation.h"
 
 
@@ -47,7 +48,6 @@
 #include <dom/util/ziptool.h>
 #include <dom/io/domstream.h>
 
-typedef org::w3c::dom::io::Writer Writer;
 
 namespace Inkscape
 {
@@ -56,67 +56,169 @@ namespace Extension
 namespace Internal
 {
 
+typedef org::w3c::dom::URI URI;
+typedef org::w3c::dom::io::Writer Writer;
 
 
 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()
         {}
 
-    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;
 
 };
 
@@ -137,16 +239,38 @@ public:
 
 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
-    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);
 
+    bool writeMeta(ZipFile &zf);
+
     bool writeStyle(Writer &outs);
 
     bool writeTree(Writer &outs, Inkscape::XML::Node *node);