X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Fsrc%2Fmodules%2Fmod_svg%2Fsvg_parser.cpp;h=1a35849fca2840e8aa43d37c756e29f95881f21a;hb=16ad7837f0dd6c39091dbaa8f399b6f0b97e5f4f;hp=e10df9dfde0515bd5930658ae10c61238da04a70;hpb=e1af3a58b56295d50de07d98705bfc516556866d;p=synfig.git diff --git a/synfig-core/src/modules/mod_svg/svg_parser.cpp b/synfig-core/src/modules/mod_svg/svg_parser.cpp index e10df9d..1a35849 100644 --- a/synfig-core/src/modules/mod_svg/svg_parser.cpp +++ b/synfig-core/src/modules/mod_svg/svg_parser.cpp @@ -279,18 +279,14 @@ Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String 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); @@ -298,14 +294,17 @@ Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String 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 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); @@ -324,6 +323,9 @@ Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String //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"); @@ -353,6 +355,9 @@ Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String } 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"); @@ -390,17 +395,17 @@ Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String } 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); } } @@ -490,7 +495,7 @@ Svg_parser::parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx){ std::list k0; if(polygon_points.empty()) return k0; - std::list points; + std::list points; std::vector tokens=get_tokens_path (polygon_points); unsigned int i; float ax,ay; ax=ay=0; @@ -503,7 +508,7 @@ Svg_parser::parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx){ //adjust coor2vect(&ax,&ay); //save - points.push_back(newVertice(ax,ay)); + points.push_back(newVertex(ax,ay)); } k0.push_front(newBLine(&points, true)); return k0; @@ -512,7 +517,7 @@ Svg_parser::parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx){ std::list Svg_parser::parser_path_d(String path_d,Matrix* mtx){ std::list k; - std::list k1; + std::list k1; std::vector tokens=get_tokens_path(path_d); String command="M"; //the current command @@ -555,7 +560,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ //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." @@ -594,7 +599,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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); } @@ -621,7 +626,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ //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 @@ -640,7 +645,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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 @@ -659,7 +664,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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 @@ -677,7 +682,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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 @@ -731,7 +736,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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); } @@ -759,7 +764,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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); } @@ -806,7 +811,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ //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 @@ -814,7 +819,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ 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); } @@ -831,7 +836,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* mtx){ //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 @@ -848,7 +853,7 @@ Svg_parser::parser_path_d(String path_d,Matrix* 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); } @@ -979,7 +984,7 @@ Svg_parser::build_linearGradient(xmlpp::Element* root,LinearGradient* data,Matri 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 @@ -1038,6 +1043,7 @@ Svg_parser::build_linearGradient(xmlpp::Element* root,LinearGradient* data,Matri //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"); @@ -1054,7 +1060,7 @@ Svg_parser::build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matri 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 @@ -1064,6 +1070,7 @@ Svg_parser::build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matri 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){ @@ -1077,6 +1084,7 @@ Svg_parser::build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matri }else { gradient=root->add_child("layer"); + gradient->set_attribute("desc",data->name); build_param (gradient->add_child("param"),"blend_method","integer","21"); //straight onto } @@ -1087,6 +1095,7 @@ Svg_parser::build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matri //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 @@ -1252,11 +1261,11 @@ Svg_parser::newRadialGradient(String name,float cx,float cy,float r,std::list *points,bool loop){ +Svg_parser::newBLine(std::list *points,bool loop){ BLine* data; data=(BLine*)malloc(sizeof(BLine)); //sprintf(data->name,"%s",name.data()); - data->points=new std::list (*points); + data->points=new std::list (*points); data->loop=loop; data->bline_id=new String(new_guid()); data->offset_id=new String(new_guid()); @@ -1288,11 +1297,11 @@ Svg_parser::build_rotate(xmlpp::Element* root,float dx,float dy,float angle){ build_real (root->add_child("param"),"amount",angle); } void -Svg_parser::build_points(xmlpp::Element* root,std::list p){ +Svg_parser::build_points(xmlpp::Element* root,std::list p){ root->set_attribute("name","vector_list"); xmlpp::Element *child=root->add_child("dynamic_list"); child->set_attribute("type","vector"); - std::list::iterator aux = p.begin(); + std::list::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"); @@ -1302,7 +1311,7 @@ Svg_parser::build_points(xmlpp::Element* root,std::list p){ } } 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); @@ -1325,7 +1334,7 @@ Svg_parser::build_vertice(xmlpp::Element* root , Vertice *p){ } void -Svg_parser::build_bline(xmlpp::Element* root,std::list p,bool loop,String blineguid){ +Svg_parser::build_bline(xmlpp::Element* root,std::list p,bool loop,String blineguid){ root->set_attribute("name","bline"); xmlpp::Element *child=root->add_child("bline"); child->set_attribute("type","bline_point"); @@ -1334,9 +1343,9 @@ Svg_parser::build_bline(xmlpp::Element* root,std::list p,bool loop,Str else child->set_attribute("loop","false"); if(!blineguid.empty()) child->set_attribute("guid",blineguid); - std::list::iterator aux = p.begin(); + std::list::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++; } } @@ -1427,11 +1436,11 @@ Svg_parser::build_vector (xmlpp::Element* root,String name,float x,float y,Strin } 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"); @@ -1456,7 +1465,7 @@ Svg_parser::coor2vect(float *x,float *y){ } 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; @@ -1494,7 +1503,7 @@ Svg_parser::setTg1(Vertice *p,float p1x,float p1y,float p2x,float p2y){ 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; @@ -1539,22 +1548,22 @@ Svg_parser::setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y){ } 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; @@ -1632,9 +1641,9 @@ Svg_parser::newMatrix(float a,float b,float c,float d,float e,float f){ Matrix* Svg_parser::newMatrix(const String mvector){ if(!mvector.empty()){ - Matrix* data=(Matrix*)malloc(sizeof(Matrix)); std::vector 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()); @@ -1771,7 +1780,7 @@ Svg_parser::get_tokens_path(String path){ //mini path lexico-parser 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; @@ -1795,7 +1804,7 @@ Svg_parser::get_tokens_path(String path){ //mini path lexico-parser 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; @@ -1844,6 +1853,8 @@ Svg_parser::randomLetter(){ 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; @@ -1856,6 +1867,7 @@ Svg_parser::getRed(String hex){ 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; @@ -1868,6 +1880,7 @@ Svg_parser::getGreen(String hex){ 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;