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;
//=======================================================================
- std::list<std::list<Vertice*> > k;
+
+ std::list<BLine*> k;
//if we are creating a bline
- //First, create the list of vertices
+ //First, create the list of Verteces
if (SVG_RESOLVE_BLINE) {
if(nodename.compare("path")==0){
k=parser_path_d (nodeElement->get_attribute_value("d"),mtx);
}
}
- int n = k.size();
- String bline_id[n];
- String offset_id[n];
- for (int i=0;i<n;i++){
- bline_id[i]=new_guid();
- offset_id[i]=new_guid();
- }
+ std::list<BLine *>::iterator aux;
+ //int n = k.size();
- std::list<std::list<Vertice*> >::iterator aux = k.begin();
if(typeFill!=0){//region layer
- for (int i=0; aux!=k.end(); aux++){
+ /*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");
child_region->set_attribute("active","true");
build_param (child_region->add_child("param"),"amount","real","1.0000000000");
build_param (child_region->add_child("param"),"blend_method","integer","0");
build_color (child_region->add_child("param"),getRed(fill),getGreen(fill),getBlue(fill),atof(fill_opacity.data())*atof(opacity.data()));
- build_vector (child_region->add_child("param"),"offset",0,0,offset_id[i]);
+ build_vector (child_region->add_child("param"),"offset",0,0, *(*aux)->offset_id );
build_param (child_region->add_child("param"),"invert","bool","false");
build_param (child_region->add_child("param"),"antialias","bool","true");
build_param (child_region->add_child("param"),"feather","real","0.0000000000");
if(fill_rule.compare("evenodd")==0) build_param (child_region->add_child("param"),"winding_style","integer","1");
else build_param (child_region->add_child("param"),"winding_style","integer","0");
- build_bline (child_region->add_child("param"),*aux,loop,bline_id[i]);
- i++;
+ build_bline (child_region->add_child("param"),*(*aux)->points,(*aux)->loop,*(*aux)->bline_id);
}
}
if(typeFill==2){ //gradient in onto mode (fill)
}
if(typeStroke!=0){//outline layer
- int i=0;
+ 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");
build_param (child_outline->add_child("param"),"amount","real","1.0000000000");
build_param (child_outline->add_child("param"),"blend_method","integer","0");
build_color (child_outline->add_child("param"),getRed(stroke),getGreen(stroke),getBlue(stroke),atof(stroke_opacity.data())*atof(opacity.data()));
- build_vector (child_outline->add_child("param"),"offset",0,0,offset_id[i]);
+ build_vector (child_outline->add_child("param"),"offset",0,0,*(*aux)->offset_id);
build_param (child_outline->add_child("param"),"invert","bool","false");
build_param (child_outline->add_child("param"),"antialias","bool","true");
build_param (child_outline->add_child("param"),"feather","real","0.0000000000");
//outline in nonzero
build_param (child_outline->add_child("param"),"winding_style","integer","0");
- build_bline (child_outline->add_child("param"),*aux,loop,bline_id[i]);
+ build_bline (child_outline->add_child("param"),*(*aux)->points,(*aux)->loop,*(*aux)->bline_id);
stroke_width=etl::strprintf("%f",getDimension(stroke_width)/kux);
build_param (child_outline->add_child("param"),"width","real",stroke_width);
}
build_param (child_outline->add_child("param"),"loopyness","real","1.0000000000");
build_param (child_outline->add_child("param"),"homogeneous_width","bool","true");
-
-
- i++;
}
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);
}
}
/* === CONVERT TO PATH PARSERS ============================================= */
-std::list<std::list<Vertice*> >
+std::list<BLine *>
Svg_parser::parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx){
- std::list<std::list<Vertice*> > k0;
+ std::list<BLine *> k0;
if(polygon_points.empty())
return k0;
- std::list<Vertice*> k;
+ std::list<Vertex*> points;
std::vector<String> tokens=get_tokens_path (polygon_points);
unsigned int i;
float ax,ay; ax=ay=0;
//adjust
coor2vect(&ax,&ay);
//save
- k.push_back(newVertice(ax,ay));
+ points.push_back(newVertex(ax,ay));
}
- k0.push_front(k);
+ k0.push_front(newBLine(&points, true));
return k0;
}
-std::list<std::list<Vertice*> >
+std::list<BLine *>
Svg_parser::parser_path_d(String path_d,Matrix* mtx){
- std::list<std::list<Vertice*> > k;
- std::list<Vertice*> k1;
+ std::list<BLine *> k;
+ std::list<Vertex*> k1;
+
std::vector<String> tokens=get_tokens_path(path_d);
String command="M"; //the current command
float ax,ay,tgx,tgy,tgx2,tgy2;//each method
float actual_x=0,actual_y=0; //in svg coordinate space
float old_x=0,old_y=0; //needed in rare cases
float init_x=0,init_y=0; //for closepath commands
- loop=false;
for(unsigned int i=0;i<tokens.size();i++){
//if the token is a command, change the current command
//now parse the commands
if(command.compare("M")==0 || command.compare("m")==0){ //move to
- if(!k1.empty())
- k.push_front(k1);
- k1.clear();
+ if(!k1.empty()) {
+ k.push_front(newBLine(&k1, false));
+ k1.clear();
+ }
//read
actual_x+=atof(tokens.at(i).data());
i++; if(tokens.at(i).compare(",")==0) i++;
//operate and save
if(mtx) transformPoint2D(mtx,&ax,&ay);
coor2vect(&ax,&ay);
- k1.push_back(newVertice (ax,ay)); //first element
+ k1.push_back(newVertex (ax,ay)); //first element
setSplit(k1.back(),TRUE);
//"If a moveto is followed by multiple pairs of coordinates,
// the subsequent pairs are treated as implicit lineto commands."
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy);
}else{
- k1.push_back(newVertice (ax,ay));
+ k1.push_back(newVertex (ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
setSplit(k1.back(),TRUE);
}
//save
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
setSplit(k1.back(),FALSE);
- k1.push_back(newVertice (ax,ay));
+ k1.push_back(newVertex (ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
}else if(command.compare("L")==0 || command.compare("l")==0){ //line to
//point
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,k1.front()->x,k1.front()->y);
}else{
- k1.push_back(newVertice(ax,ay));
+ k1.push_back(newVertex(ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y);
}
}else if(command.compare("H")==0 || command.compare("h")==0){// horizontal move
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,k1.front()->x,k1.front()->y);
}else{
- k1.push_back(newVertice(ax,ay));
+ k1.push_back(newVertex(ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y);
}
}else if(command.compare("V")==0 || command.compare("v")==0){//vertical
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,k1.front()->x,k1.front()->y);
}else{
- k1.push_back(newVertice(ax,ay));
+ k1.push_back(newVertex(ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y);
}
}else if(command.compare("T")==0 || command.compare("t")==0){// I don't know what does it
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy);
}else{
- k1.push_back(newVertice (ax,ay));
+ k1.push_back(newVertex (ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
setSplit(k1.back(),TRUE);
}
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy);
}else{
- k1.push_back(newVertice (ax,ay));
+ k1.push_back(newVertex (ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
setSplit(k1.back(),TRUE);
}
//save the last tg2
setTg2(k1.back(),k1.back()->x,k1.back()->y,tgx2,tgy2);
//save the intermediate point
- k1.push_back(newVertice (in_x,in_y));
+ k1.push_back(newVertex (in_x,in_y));
setTg1(k1.back(),k1.back()->x,k1.back()->y, in_tgx1 , in_tgy1);
setTg2(k1.back(),k1.back()->x,k1.back()->y, in_tgx2 , in_tgy2);
setSplit(k1.back(),TRUE); //this could be changed
if(isFirst(k1.front(),ax,ay)){
setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy);
}else{
- k1.push_back(newVertice (ax,ay));
+ k1.push_back(newVertex (ax,ay));
setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy);
setSplit(k1.back(),TRUE);
}
}
}else if(command.compare("z")==0){
- loop=true;
- if(!k1.empty())
- k.push_front(k1);
+ k.push_front(newBLine(&k1, true));
k1.clear();
if (i<tokens.size() && tokens.at(i).compare("M")!=0 && tokens.at(i).compare("m")!=0) {
//starting a new path, but not with a moveto
//operate and save
if(mtx) transformPoint2D(mtx,&ax,&ay);
coor2vect(&ax,&ay);
- k1.push_back(newVertice (ax,ay)); //first element
+ k1.push_back(newVertex (ax,ay)); //first element
setSplit(k1.back(),TRUE);
}
i--; //decrement i to balance "i++" at command change
std::cout<<"unsupported path token: "<<tokens.at(i)<<std::endl;
}
}
- if(!k1.empty())
- k.push_front(k1); //last element
+ if(!k1.empty()) {
+ k.push_front(newBLine(&k1, false)); //last element
+ }
return k;
}
/* === 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
return data;
}
+BLine*
+Svg_parser::newBLine(std::list<Vertex*> *points,bool loop){
+ BLine* data;
+ data=(BLine*)malloc(sizeof(BLine));
+ //sprintf(data->name,"%s",name.data());
+ data->points=new std::list<Vertex*> (*points);
+ data->loop=loop;
+ data->bline_id=new String(new_guid());
+ data->offset_id=new String(new_guid());
+ return data;
+}
+
void
Svg_parser::build_gamma(xmlpp::Element* root,float gamma){
root->set_attribute("type","colorcorrect");
build_real (root->add_child("param"),"amount",angle);
}
void
-Svg_parser::build_points(xmlpp::Element* root,std::list<Vertice*> p){
+Svg_parser::build_points(xmlpp::Element* root,std::list<Vertex*> p){
root->set_attribute("name","vector_list");
xmlpp::Element *child=root->add_child("dynamic_list");
child->set_attribute("type","vector");
- std::list<Vertice*>::iterator aux = p.begin();
+ std::list<Vertex*>::iterator aux = p.begin();
while(aux!=p.end()){
xmlpp::Element *child_entry=child->add_child("entry");
xmlpp::Element *child_vector=child_entry->add_child("vector");
}
}
void
-Svg_parser::build_vertice(xmlpp::Element* root , Vertice *p){
+Svg_parser::build_vertex(xmlpp::Element* root , Vertex *p){
xmlpp::Element *child_comp=root->add_child("composite");
child_comp->set_attribute("type","bline_point");
build_vector (child_comp->add_child("param"),"point",p->x,p->y);
}
void
-Svg_parser::build_bline(xmlpp::Element* root,std::list<Vertice*> p,bool loop,String blineguid){
+Svg_parser::build_bline(xmlpp::Element* root,std::list<Vertex*> p,bool loop,String blineguid){
root->set_attribute("name","bline");
xmlpp::Element *child=root->add_child("bline");
child->set_attribute("type","bline_point");
else
child->set_attribute("loop","false");
if(!blineguid.empty()) child->set_attribute("guid",blineguid);
- std::list<Vertice*>::iterator aux = p.begin();
+ std::list<Vertex*>::iterator aux = p.begin();
while(aux!=p.end()){
- if(*aux) build_vertice (child->add_child("entry"),*aux);
+ if(*aux) build_vertex (child->add_child("entry"),*aux);
aux++;
}
}
}
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");
}
void
-Svg_parser::setTg1(Vertice *p,float p1x,float p1y,float p2x,float p2y){
+Svg_parser::setTg1(Vertex *p,float p1x,float p1y,float p2x,float p2y){
float rd=0,ag=0;
float d1x,d1y,d2x,d2y,dx,dy;
d1x=p1x*60;
p->angle1=ag;
}
void
-Svg_parser::setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y){
+Svg_parser::setTg2(Vertex* p,float p1x,float p1y,float p2x,float p2y){
float rd=0,ag=0;
float d1x,d1y,d2x,d2y,dx,dy;
d1x=p1x*60;
}
void
-Svg_parser::setSplit(Vertice* p,bool val){
+Svg_parser::setSplit(Vertex* p,bool val){
if(p!=NULL){
p->split=val;
}
}
int
-Svg_parser::isFirst(Vertice* nodo,float a, float b){
+Svg_parser::isFirst(Vertex* nodo,float a, float b){
if(nodo->x==a && nodo->y==b)
return 1;
return 0;
}
-Vertice*
-Svg_parser::newVertice(float x,float y){
- Vertice* vert;
- vert=(Vertice*)malloc(sizeof(Vertice));
+Vertex*
+Svg_parser::newVertex(float x,float y){
+ Vertex* vert;
+ vert=(Vertex*)malloc(sizeof(Vertex));
vert->x=x;
vert->y=y;
vert->radius1=vert->radius2=vert->angle1=vert->angle2=0;