Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-core / trunk / src / modules / mod_svg / svg_parser.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file svg_parser.h
3 **      \brief Implementation of the Svg parser
4 **      \brief Based on SVG XML specification 1.1
5 **      \brief See: http://www.w3.org/TR/xml11/ for deatils
6 **
7 **      $Id$
8 **
9 **      \legal
10 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
11 **      Copyright (c) 2007, 2008 Chris Moore
12 **      Copyright (c) 2009 Carlos A. Sosa Navarro
13 **
14 **      This package is free software; you can redistribute it and/or
15 **      modify it under the terms of the GNU General Public License as
16 **      published by the Free Software Foundation; either version 2 of
17 **      the License, or (at your option) any later version.
18 **
19 **      This package is distributed in the hope that it will be useful,
20 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
21 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 **      General Public License for more details.
23 **      \endlegal
24 */
25 /* ========================================================================= */
26
27 /* === S T A R T =========================================================== */
28
29 #ifndef __SVG_PARSER_H
30 #define __SVG_PARSER_H
31
32 /* === H E A D E R S ======================================================= */
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <math.h>
37 #include <string.h>
38
39 #include <libxml++/libxml++.h>
40 #include <ETL/angle>
41 #include <ETL/stringf>
42 #include <synfig/canvas.h>
43 #include <synfig/loadcanvas.h>
44 #include <synfig/color.h>
45 #include <synfig/gamma.h>
46 #include <synfig/guid.h>
47
48 /* === M A C R O S ========================================================= */
49
50 /* === T Y P E D E F S ===================================================== */
51
52 /* === C L A S S E S & S T R U C T S ======================================= */
53
54 namespace synfig{
55
56 typedef struct matrix_t{
57         float a,c,e;
58         float b,d,f;
59 }Matrix;
60
61 typedef struct stop_t{
62          float r,g,b;
63          float a;
64          float pos;
65 }ColorStop;
66 typedef struct linear_g{
67         char name[40];
68         float x1,x2,y1,y2;
69         std::list<ColorStop*> *stops; //paradas de color
70 }LinearGradient;
71 typedef struct radial_g{
72         char name[40];
73         float cx,cy;//center point
74         //float fx,fy;
75         //focus, i dont see it in synfig
76         //if this value is omitted then will be = cx,cy
77         float r; //radio radius
78         std::list<ColorStop*> *stops; //paradas de color
79 }RadialGradient;
80
81 typedef struct url_t{
82         int type;
83         void* data;
84 }URL;
85
86 typedef struct vertice_t{
87         float x,y;
88         float radio1,angle1;
89         float radio2,angle2;
90         bool split;
91 }Vertice;
92 class Svg_parser
93 {
94                 //this is inkscape oriented in some cases
95 public:
96
97 private:
98                 Gamma gamma;
99                 String filepath;
100                 String id_name;
101                 xmlpp::DomParser parser;
102                 xmlpp::Document document;
103                 xmlpp::Element* nodeRoot;//output
104                 Glib::ustring width;
105                 Glib::ustring height;
106                 Glib::ustring docname;
107                 int uid;
108                 int kux,set_canvas;
109                 float ox,oy;
110                 bool loop;//aux :D
111                 //urls
112                 std::list<LinearGradient*> lg;
113                 std::list<RadialGradient*> rg;
114
115 public:
116                 Svg_parser();
117                 Canvas::Handle load_svg_canvas(std::string _filepath,String &errors, String &warnings);
118                 //String get_id();
119                 //void set_id(String source);
120
121 private:        //parser bucle
122                 void parser_node(const xmlpp::Node* node);
123                 //parser headers
124                 void parser_svg(const xmlpp::Node* node);
125                 void parser_canvas(const xmlpp::Node* node);
126                 //layers
127                 void parser_layer(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent);
128                 void parser_path(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent);
129                 void parser_polygon(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent);
130                 void parser_rect(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent);
131                 //defs
132                 void parser_defs(const xmlpp::Node* node);
133                 void parser_linearGradient(const xmlpp::Node* node);
134                 void parser_radialGradient(const xmlpp::Node* node);
135                 ColorStop* newColorStop(String color,float opacity,float pos);
136                 LinearGradient* newLinearGradient(String name,float x1,float y1, float x2,float y2,std::list<ColorStop*> *stops);
137                 RadialGradient* newRadialGradient(String name,float cx,float cy,float r,std::list<ColorStop*> *stops);
138                 //builds urls
139                 void AdjustPointUrl();
140                 std::list<ColorStop*>* find_colorStop(String name);
141                 void build_url(xmlpp::Element* root, String name,Matrix *mtx);
142                 void build_linearGradient(xmlpp::Element* root,LinearGradient* data,Matrix* mtx);
143                 void build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matrix* mtx);
144                 void build_stop_color(xmlpp::Element* root, std::list<ColorStop*> *stops);
145                 void build_stop_color(xmlpp::Element* root, std::list<ColorStop*> *stops,String name);
146                 Color adjustGamma(float r,float g,float b,float a);
147                 //builds
148                 void build_gamma(xmlpp::Element* root,float gamma);
149                 Matrix* build_transform(const String transform);
150                 void build_rotate(xmlpp::Element* root,float dx,float dy,float angle);
151                 void build_translate(xmlpp::Element* root,float dx,float dy);
152                 void build_points(xmlpp::Element* root,std::list<Vertice*> p);
153                 void build_vertice(xmlpp::Element* root , Vertice *p);
154                 void build_bline(xmlpp::Element* root,std::list<Vertice*> p,bool loop,String blinegui);
155                 void build_param (xmlpp::Element* root,String name,String type,String value);
156                 void build_param (xmlpp::Element* root,String name,String type,float value);
157                 void build_param (xmlpp::Element* root,String name,String type,int value);
158                 void build_integer (xmlpp::Element* root,String name, int value);
159                 void build_real (xmlpp::Element* root,String name,float value);
160                 void build_vector (xmlpp::Element* root,String name,float x,float y);
161                 void build_vector (xmlpp::Element* root,String name,float x,float y,String guid);
162                 void build_color(xmlpp::Element* root,float r,float g,float b,float a);
163                 xmlpp::Element* nodeStartBasicLayer(xmlpp::Element* root);
164
165                 //points,etc
166                 void coor2vect(float *x,float *y);
167                 void setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y);
168                 void setTg1(Vertice *p,float p1x,float p1y,float p2x,float p2y);
169                 void setSplit(Vertice* p,bool val);
170                 int isFirst(Vertice* nodo,float a, float b);
171                 Vertice* nuevoVertice(float x,float y);
172
173                 //matrix operations
174                 Matrix* newMatrix(float a,float b,float c,float d,float e,float f);
175                 Matrix* newMatrix(const String mvector);
176                 Matrix* newMatrix(Matrix *a);
177                 void transformPoint2D(Matrix *mtx,float *a,float *b);
178                 bool matrixVacia(Matrix* mtx);
179                 void composeMatrix(Matrix **mtx,Matrix *mtx1,Matrix *mtx2);
180                 void multiplyMatrix(Matrix **mtx1,Matrix *mtx2);
181                 float getRadian(float sexa);
182                 //attributes
183                 int extractSubAttribute(const String attribute, String name,String* value);
184                 String loadAttribute(String name,const String path_style,const String master_style,const String subattribute,const String defaultVal);
185                 String loadAttribute(String name,const String path_style,const String master_style,const String defaultVal);
186                 std::vector<String> get_tokens_path(String path);
187                 std::list<std::list<Vertice*> > parser_path_d(String path_d,Matrix* mtx);
188                 int randomLetter();
189                 int getRed(String hex);
190                 int getGreen(String hex);
191                 int getBlue(String hex);
192                 int hextodec(String hex);
193                 float getDimension(const String ac);
194                 //funciones string
195                 void removeS(String *input);
196                 void removeIntoS(String *input);
197                 std::vector<String> tokenize(const String& str,const String& delimiters);
198                 void get_canvas_name(String _filepath);
199                 String new_guid();
200 };
201 // END of Svg_parser class
202
203 /* === E X T E R N S ======================================================= */
204
205 extern Canvas::Handle open_svg(std::string _filepath,String &errors, String &warnings);
206
207 }; // END of namespace synfig
208
209 /* === E N D =============================================================== */
210
211 #endif