#endif
#include <iostream>
+#include <cstring>
#include "svg_parser.h"
/* === U S I N G =========================================================== */
typeStroke=2; //gradient
}
- xmlpp::Element* child_layer = nodeStartBasicLayer(root->add_child("layer"));
- xmlpp::Element* child_fill = child_layer;
- xmlpp::Element* child_stroke = child_layer;
- if(typeFill==2){
- child_fill=nodeStartBasicLayer(child_fill->add_child("layer"));
- }
- if(typeStroke==2){
- child_stroke=nodeStartBasicLayer(child_stroke->add_child("layer"));
- }
+ xmlpp::Element* child_layer = root;
+ xmlpp::Element* child_fill;
+ xmlpp::Element* child_stroke;
//make simple fills
if(nodename.compare("rect")==0 && typeFill!=0){
+ if (mtx) child_layer = nodeStartBasicLayer(root->add_child("layer"), id);
+ child_fill=child_layer;
parser_rect(nodeElement,child_fill,fill,fill_opacity,opacity);
if(typeFill==2){
build_fill (child_fill,fill,NULL);
parser_effects(nodeElement,child_layer,parent_style,mtx);
return;
}
-
+ if ((!(SVG_RESOLVE_BLINE) && mtx) || typeFill==2 || typeStroke==2)
+ child_layer = nodeStartBasicLayer(root->add_child("layer"), id);
+ child_fill=child_layer;
+ child_stroke=child_layer;
//=======================================================================
//int n = k.size();
if(typeFill!=0){//region layer
+ /*if(typeFill==2){
+ child_fill=nodeStartBasicLayer(child_fill->add_child("layer"));
+ }*/
for (aux = k.begin(); aux!=k.end(); aux++){
xmlpp::Element *child_region=child_fill->add_child("layer");
child_region->set_attribute("type","region");
}
if(typeStroke!=0){//outline layer
+ if(typeStroke==2){
+ child_stroke=nodeStartBasicLayer(child_stroke->add_child("layer"),"stroke");
+ }
for (aux=k.begin(); aux!=k.end(); aux++){
xmlpp::Element *child_outline=child_stroke->add_child("layer");
child_outline->set_attribute("type","outline");
}
if(typeStroke==2){ //gradient in onto mode (stroke)
- if (SVG_RESOLVE_BLINE)
- build_fill(child_stroke,fill,mtx);
- else
- build_fill(child_stroke,fill,NULL);
- }
- if (SVG_RESOLVE_BLINE)
- parser_effects(nodeElement,child_layer,parent_style,NULL);
- else
- parser_effects(nodeElement,child_layer,parent_style,mtx);
-
+ if (SVG_RESOLVE_BLINE)
+ build_fill(child_stroke,stroke,mtx);
+ else
+ build_fill(child_stroke,stroke,NULL);
+ }
}
+
+ if (SVG_RESOLVE_BLINE)
+ parser_effects(nodeElement,child_layer,parent_style,NULL);
+ else
+ parser_effects(nodeElement,child_layer,parent_style,mtx);
}
}
/* === EFFECTS PARSERS ===================================================== */
void
-Svg_parser::parser_effects(const xmlpp::Element* nodeElement,xmlpp::Element* root,String parent_style,Matrix* mtx){
+Svg_parser::parser_effects(const xmlpp::Element* /*nodeElement*/,xmlpp::Element* root,String /*parent_style*/,Matrix* mtx){
build_transform(root, mtx);
}
gradient->set_attribute("type","linear_gradient");
gradient->set_attribute("active","true");
- gradient->set_attribute("desc","Gradient004");
+ gradient->set_attribute("desc",data->name);
build_param (gradient->add_child("param"),"z_depth","real","0");
build_param (gradient->add_child("param"),"amount","real","1");
//straight onto
//gradient link
xmlpp::Element *child_stops=gradient->add_child("param");
child_stops->set_attribute("name","gradient");
+ child_stops->set_attribute("guid",GUID::hasher(data->name).get_string());
build_stop_color (child_stops->add_child("gradient"),data->stops);
build_param (gradient->add_child("param"),"loop","bool","false");
build_param (gradient->add_child("param"),"zigzag","bool","false");
layer->set_attribute("type","PasteCanvas");
layer->set_attribute("active","true");
layer->set_attribute("version","0.1");
- layer->set_attribute("desc","Composite");
+ layer->set_attribute("desc",data->name);
build_param (layer->add_child("param"),"z_depth","real","0");
build_param (layer->add_child("param"),"amount","real","1");
build_param (layer->add_child("param"),"blend_method","integer","21"); //straight onto
xmlpp::Element* child_layer=child->add_child("canvas");
gradient=child_layer->add_child("layer");
+ gradient->set_attribute("desc",data->name);
build_param (gradient->add_child("param"),"blend_method","integer","0"); //composite
Matrix *mtx2=NULL;
if (mtx && data->transform){
}else {
gradient=root->add_child("layer");
+ gradient->set_attribute("desc",data->name);
build_param (gradient->add_child("param"),"blend_method","integer","21"); //straight onto
}
//gradient link
xmlpp::Element *child_stops=gradient->add_child("param");
child_stops->set_attribute("name","gradient");
+ child_stops->set_attribute("guid",GUID::hasher(data->name).get_string());
build_stop_color (child_stops->add_child("gradient"),data->stops);
//here the center point and radius
}
xmlpp::Element*
-Svg_parser::nodeStartBasicLayer(xmlpp::Element* root){
+Svg_parser::nodeStartBasicLayer(xmlpp::Element* root, String name){
root->set_attribute("type","PasteCanvas");
root->set_attribute("active","true");
root->set_attribute("version","0.1");
- root->set_attribute("desc","Composite");
+ root->set_attribute("desc",name);
build_param (root->add_child("param"),"z_depth","real","0");
build_param (root->add_child("param"),"amount","real","1");
build_param (root->add_child("param"),"blend_method","integer","0");
Matrix*
Svg_parser::newMatrix(const String mvector){
if(!mvector.empty()){
- Matrix* data=(Matrix*)malloc(sizeof(Matrix));
std::vector<String> tokens=tokenize(mvector,",");
if(tokens.size()!=6) return newMatrix(1,0,0,1,0,0);
+ Matrix* data=(Matrix*)malloc(sizeof(Matrix));
data->a=atof(tokens.at(0).data());
data->b=atof(tokens.at(1).data());
data->c=atof(tokens.at(2).data());
else if(a=='V'){ e=15; i++;}
else if(a=='H'){ e=16; i++;}
else if(a=='z' || a=='Z'){ e=17; i++;}
- else if(a=='-' ||a=='.'|| isdigit (a)){ e=18;}
+ else if(a=='-' || a=='.' || a=='e' || a=='E' || isdigit (a)){ e=18;}
else if(a==','){ e=19; i++;}
else if(a==' '){i++;}
break;
case 16: tokens.push_back("H"); e=0; break;
case 17: tokens.push_back("z"); e=0; break;//loop
- case 18: if(a=='-'||a=='.'|| isdigit (a)){
+ case 18: if(a=='-' || a=='.' || a=='e' || a=='E' || isdigit (a)){
buffer.append(path.substr(i,1));i++;
}else{
e=20;
int
Svg_parser::getRed(String hex){
if(hex.at(0)=='#'){
+ //allow for 3-digit hex codes (#rgb = #rrggbb)
+ if (hex.length()<7) return (16+1) * hextodec(hex.substr(1,1));
return hextodec(hex.substr(1,2));
}else if(hex.compare(0,3,"rgb")==0 || hex.compare(0,3,"RGB")==0){
int start=hex.find_first_of("(")+1;
String aux=tokenize(hex.substr(start,end-start),",").at(0);
return atoi(aux.data());
}
- return 0;
+ return getColor(hex,1);
}
int
Svg_parser::getGreen(String hex){
if(hex.at(0)=='#'){
+ if (hex.length()<7) return (16+1) * hextodec(hex.substr(2,1));
return hextodec(hex.substr(3,2));
}else if(hex.compare(0,3,"rgb")==0 || hex.compare(0,3,"RGB")==0){
int start=hex.find_first_of("(")+1;
String aux=tokenize(hex.substr(start,end-start),",").at(1);
return atoi(aux.data());
}
- return 0;
+ return getColor(hex,2);
}
int
Svg_parser::getBlue(String hex){
if(hex.at(0)=='#'){
+ if (hex.length()<7) return (16+1) * hextodec(hex.substr(3,1));
return hextodec(hex.substr(5,2));
}else if(hex.compare(0,3,"rgb")==0 || hex.compare(0,3,"RGB")==0){
int start=hex.find_first_of("(")+1;
String aux=tokenize(hex.substr(start,end-start),",").at(2);
return atoi(aux.data());
}
- return 0;
+ return getColor(hex,3);
}
int
Svg_parser::hextodec(String hex){
return GUID::hasher(uid).get_string();
}
+
+#define COLOR_NAME(color, r, g, b) else if(name.compare(0,strlen(color),color)==0) \
+ {switch(position) \
+ {case 1: return r; case 2: return g; case 3: return b;} }
+
+int
+Svg_parser::getColor(String name, int position){
+ if (position<1 || position>3) return 0;
+ COLOR_NAME("aliceblue",240, 248, 255)
+ COLOR_NAME("antiquewhite",250, 235, 215)
+ COLOR_NAME("aqua", 0, 255, 255)
+ COLOR_NAME("aquamarine",127, 255, 212)
+ COLOR_NAME("azure",240, 255, 255)
+ COLOR_NAME("beige",245, 245, 220)
+ COLOR_NAME("bisque",255, 228, 196)
+ COLOR_NAME("black", 0, 0, 0)
+ COLOR_NAME("blanchedalmond",255, 235, 205)
+ COLOR_NAME("blue", 0, 0, 255)
+ COLOR_NAME("blueviolet",138, 43, 226)
+ COLOR_NAME("brown",165, 42, 42)
+ COLOR_NAME("burlywood",222, 184, 135)
+ COLOR_NAME("cadetblue", 95, 158, 160)
+ COLOR_NAME("chartreuse",127, 255, 0)
+ COLOR_NAME("chocolate",210, 105, 30)
+ COLOR_NAME("coral",255, 127, 80)
+ COLOR_NAME("cornflowerblue",100, 149, 237)
+ COLOR_NAME("cornsilk",255, 248, 220)
+ COLOR_NAME("crimson",220, 20, 60)
+ COLOR_NAME("cyan", 0, 255, 255)
+ COLOR_NAME("darkblue", 0, 0, 139)
+ COLOR_NAME("darkcyan", 0, 139, 139)
+ COLOR_NAME("darkgoldenrod",184, 134, 11)
+ COLOR_NAME("darkgray",169, 169, 169)
+ COLOR_NAME("darkgreen", 0, 100, 0)
+ COLOR_NAME("darkgrey",169, 169, 169)
+ COLOR_NAME("darkkhaki",189, 183, 107)
+ COLOR_NAME("darkmagenta",139, 0, 139)
+ COLOR_NAME("darkolivegreen", 85, 107, 47)
+ COLOR_NAME("darkorange",255, 140, 0)
+ COLOR_NAME("darkorchid",153, 50, 204)
+ COLOR_NAME("darkred",139, 0, 0)
+ COLOR_NAME("darksalmon",233, 150, 122)
+ COLOR_NAME("darkseagreen",143, 188, 143)
+ COLOR_NAME("darkslateblue", 72, 61, 139)
+ COLOR_NAME("darkslategray", 47, 79, 79)
+ COLOR_NAME("darkslategrey", 47, 79, 79)
+ COLOR_NAME("darkturquoise", 0, 206, 209)
+ COLOR_NAME("darkviolet",148, 0, 211)
+ COLOR_NAME("deeppink",255, 20, 147)
+ COLOR_NAME("deepskyblue", 0, 191, 255)
+ COLOR_NAME("dimgray",105, 105, 105)
+ COLOR_NAME("dimgrey",105, 105, 105)
+ COLOR_NAME("dodgerblue", 30, 144, 255)
+ COLOR_NAME("firebrick",178, 34, 34)
+ COLOR_NAME("floralwhite",255, 250, 240)
+ COLOR_NAME("forestgreen", 34, 139, 34)
+ COLOR_NAME("fuchsia",255, 0, 255)
+ COLOR_NAME("gainsboro",220, 220, 220)
+ COLOR_NAME("ghostwhite",248, 248, 255)
+ COLOR_NAME("gold",255, 215, 0)
+ COLOR_NAME("goldenrod",218, 165, 32)
+ COLOR_NAME("gray",128, 128, 128)
+ COLOR_NAME("grey",128, 128, 128)
+ COLOR_NAME("green", 0, 128, 0)
+ COLOR_NAME("greenyellow",173, 255, 47)
+ COLOR_NAME("honeydew",240, 255, 240)
+ COLOR_NAME("hotpink",255, 105, 180)
+ COLOR_NAME("indianred",205, 92, 92)
+ COLOR_NAME("indigo", 75, 0, 130)
+ COLOR_NAME("ivory",255, 255, 240)
+ COLOR_NAME("khaki",240, 230, 140)
+ COLOR_NAME("lavender",230, 230, 250)
+ COLOR_NAME("lavenderblush",255, 240, 245)
+ COLOR_NAME("lawngreen",124, 252, 0)
+ COLOR_NAME("lemonchiffon",255, 250, 205)
+ COLOR_NAME("lightblue",173, 216, 230)
+ COLOR_NAME("lightcoral",240, 128, 128)
+ COLOR_NAME("lightcyan",224, 255, 255)
+ COLOR_NAME("lightgoldenrodyellow",250, 250, 210)
+ COLOR_NAME("lightgray",211, 211, 211)
+ COLOR_NAME("lightgreen",144, 238, 144)
+ COLOR_NAME("lightgrey",211, 211, 211)
+ COLOR_NAME("lightpink",255, 182, 193)
+ COLOR_NAME("lightsalmon",255, 160, 122)
+ COLOR_NAME("lightseagreen", 32, 178, 170)
+ COLOR_NAME("lightskyblue",135, 206, 250)
+ COLOR_NAME("lightslategray",119, 136, 153)
+ COLOR_NAME("lightslategrey",119, 136, 153)
+ COLOR_NAME("lightsteelblue",176, 196, 222)
+ COLOR_NAME("lightyellow",255, 255, 224)
+ COLOR_NAME("lime", 0, 255, 0)
+ COLOR_NAME("limegreen", 50, 205, 50)
+ COLOR_NAME("linen",250, 240, 230)
+ COLOR_NAME("magenta",255, 0, 255)
+ COLOR_NAME("maroon",128, 0, 0)
+ COLOR_NAME("mediumaquamarine",102, 205, 170)
+ COLOR_NAME("mediumblue", 0, 0, 205)
+ COLOR_NAME("mediumorchid",186, 85, 211)
+ COLOR_NAME("mediumpurple",147, 112, 219)
+ COLOR_NAME("mediumseagreen", 60, 179, 113)
+ COLOR_NAME("mediumslateblue",123, 104, 238)
+ COLOR_NAME("mediumspringgreen", 0, 250, 154)
+ COLOR_NAME("mediumturquoise", 72, 209, 204)
+ COLOR_NAME("mediumvioletred",199, 21, 133)
+ COLOR_NAME("midnightblue", 25, 25, 112)
+ COLOR_NAME("mintcream",245, 255, 250)
+ COLOR_NAME("mistyrose",255, 228, 225)
+ COLOR_NAME("moccasin",255, 228, 181)
+ COLOR_NAME("navajowhite",255, 222, 173)
+ COLOR_NAME("navy", 0, 0, 128)
+ COLOR_NAME("oldlace",253, 245, 230)
+ COLOR_NAME("olive",128, 128, 0)
+ COLOR_NAME("olivedrab",107, 142, 35)
+ COLOR_NAME("orange",255, 165, 0)
+ COLOR_NAME("orangered",255, 69, 0)
+ COLOR_NAME("orchid",218, 112, 214)
+ COLOR_NAME("palegoldenrod",238, 232, 170)
+ COLOR_NAME("palegreen",152, 251, 152)
+ COLOR_NAME("paleturquoise",175, 238, 238)
+ COLOR_NAME("palevioletred",219, 112, 147)
+ COLOR_NAME("papayawhip",255, 239, 213)
+ COLOR_NAME("peachpuff",255, 218, 185)
+ COLOR_NAME("peru",205, 133, 63)
+ COLOR_NAME("pink",255, 192, 203)
+ COLOR_NAME("plum",221, 160, 221)
+ COLOR_NAME("powderblue",176, 224, 230)
+ COLOR_NAME("purple",128, 0, 128)
+ COLOR_NAME("red",255, 0, 0)
+ COLOR_NAME("rosybrown",188, 143, 143)
+ COLOR_NAME("royalblue", 65, 105, 225)
+ COLOR_NAME("saddlebrown",139, 69, 19)
+ COLOR_NAME("salmon",250, 128, 114)
+ COLOR_NAME("sandybrown",244, 164, 96)
+ COLOR_NAME("seagreen", 46, 139, 87)
+ COLOR_NAME("seashell",255, 245, 238)
+ COLOR_NAME("sienna",160, 82, 45)
+ COLOR_NAME("silver",192, 192, 192)
+ COLOR_NAME("skyblue",135, 206, 235)
+ COLOR_NAME("slateblue",106, 90, 205)
+ COLOR_NAME("slategray",112, 128, 144)
+ COLOR_NAME("slategrey",112, 128, 144)
+ COLOR_NAME("snow",255, 250, 250)
+ COLOR_NAME("springgreen", 0, 255, 127)
+ COLOR_NAME("steelblue", 70, 130, 180)
+ COLOR_NAME("tan",210, 180, 140)
+ COLOR_NAME("teal", 0, 128, 128)
+ COLOR_NAME("thistle",216, 191, 216)
+ COLOR_NAME("tomato",255, 99, 71)
+ COLOR_NAME("turquoise", 64, 224, 208)
+ COLOR_NAME("violet",238, 130, 238)
+ COLOR_NAME("wheat",245, 222, 179)
+ COLOR_NAME("white",255, 255, 255)
+ COLOR_NAME("whitesmoke",245, 245, 245)
+ COLOR_NAME("yellow",255, 255, 0)
+ COLOR_NAME("yellowgreen",154, 205, 50)
+ return 0;
+}
+#undef COLOR_NAME