Code

Filters. New custom predefined filters (all ABCs, Neon draw, Color shilf, Silhouette...
[inkscape.git] / src / extension / internal / odf.h
index 01575b4914d4095bafa21210a302b468915f8ccf..9ad2610989b6da0dfa60856ba91084c2a9f5ecef 100644 (file)
@@ -11,6 +11,7 @@
  *
  * Authors:
  *   Bob Jamison
+ *   Abhishek Sharma
  *
  * Copyright (C) 2006 Bob Jamison
  *
@@ -36,7 +37,7 @@
 #include <dom/io/stringstream.h>
 #include <dom/uri.h>
 
-#include <glib.h>
+#include <glibmm.h>
 #include "extension/implementation/implementation.h"
 
 
@@ -47,7 +48,7 @@
 
 #include <dom/util/ziptool.h>
 #include <dom/io/domstream.h>
-
+#include "sp-item.h"
 
 namespace Inkscape
 {
@@ -123,14 +124,142 @@ public:
         return true;
         }
 
-    std::string name;
-    std::string stroke;
-    std::string strokeColor;
-    std::string strokeWidth;
-    std::string strokeOpacity;
-    std::string fill;
-    std::string fillColor;
-    std::string fillOpacity;
+    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 GradientStop
+{
+public:
+    GradientStop()
+        {}
+    GradientStop(unsigned long rgbArg, double opacityArg)
+        { rgb = rgbArg; opacity = opacityArg; }
+    virtual ~GradientStop()
+        {}
+    GradientStop(const GradientStop &other)
+        {  assign(other); }
+    virtual GradientStop operator=(const GradientStop &other)
+        {  assign(other); return *this; }
+    void assign(const GradientStop &other)
+        {
+        rgb = other.rgb;
+        opacity = other.opacity;
+        }
+    unsigned long rgb;
+    double opacity;
+};
+
+
+
+class GradientInfo
+{
+public:
+
+    GradientInfo()
+        {
+        init();
+        }
+
+    GradientInfo(const GradientInfo &other)
+        {
+        assign(other);
+        }
+
+    GradientInfo &operator=(const GradientInfo &other)
+        {
+        assign(other);
+        return *this;
+        }
+
+    void assign(const GradientInfo &other)
+        {
+        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;
+        stops         = other.stops;
+        }
+
+    void init()
+        {
+        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;
+        stops.clear();
+        }
+
+    virtual ~GradientInfo()
+        {}
+
+    //used for eliminating duplicates in the styleTable
+    bool equals(const GradientInfo &other)
+        {
+        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;
+        if (stops.size() != other.stops.size())
+            return false;
+        for (unsigned int i=0 ; i<stops.size() ; i++)
+            {
+            GradientStop g1 = stops[i];
+            GradientStop g2 = other.stops[i];
+            if (g1.rgb != g2.rgb)
+                return false;
+            if (g1.opacity != g2.opacity)
+                return false;
+            }
+        return true;
+        }
+
+    Glib::ustring name;
+    Glib::ustring style;
+    double cx;
+    double cy;
+    double fx;
+    double fy;
+    double r;
+    double x1;
+    double y1;
+    double x2;
+    double y2;
+    std::vector<GradientStop> stops;
 
 };
 
@@ -145,7 +274,7 @@ public:
 
     void save  (Inkscape::Extension::Output *mod,
                SPDocument *doc,
-               const gchar *uri);
+               gchar const *filename);
 
     static void   init  (void);
 
@@ -153,6 +282,11 @@ private:
 
     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:
@@ -160,12 +294,17 @@ private:
        but check for errors, of course
     */
     //element id -> style entry name
-    std::map<std::string, std::string> styleLookupTable;
+    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, Inkscape::XML::Node *node);
 
@@ -173,9 +312,22 @@ private:
 
     bool writeMeta(ZipFile &zf);
 
-    bool writeStyle(Writer &outs);
+    bool writeStyle(ZipFile &zf);
+
+    bool processStyle(Writer &outs, SPItem *item, const Glib::ustring &id);
+
+    bool processGradient(Writer &outs, SPItem *item,
+                    const Glib::ustring &id, Geom::Matrix &tf);
+
+    bool writeStyleHeader(Writer &outs);
+
+    bool writeStyleFooter(Writer &outs);
+
+    bool writeContentHeader(Writer &outs);
+
+    bool writeContentFooter(Writer &outs);
 
-    bool writeTree(Writer &outs, Inkscape::XML::Node *node);
+    bool writeTree(Writer &couts, Writer &souts, Inkscape::XML::Node *node);
 
     bool writeContent(ZipFile &zf, Inkscape::XML::Node *node);