Minor changes
[synfig.git] / synfig-core / src / modules / mod_svg / svg_parser.cpp
index e10df9d..680aa4f 100644 (file)
@@ -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<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);
@@ -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<BLine *> k0;
        if(polygon_points.empty())
                return k0;
-       std::list<Vertice*> points;
+       std::list<Vertex*> points;
        std::vector<String> 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<BLine *>
 Svg_parser::parser_path_d(String path_d,Matrix* mtx){
        std::list<BLine *> k;
-       std::list<Vertice*> k1;
+       std::list<Vertex*> k1;
 
        std::vector<String> 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<Co
 }
 
 BLine*
-Svg_parser::newBLine(std::list<Vertice*> *points,bool loop){
+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<Vertice*> (*points);
+       data->points=new std::list<Vertex*> (*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<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");
@@ -1302,7 +1311,7 @@ Svg_parser::build_points(xmlpp::Element* root,std::list<Vertice*> 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<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");
@@ -1334,9 +1343,9 @@ Svg_parser::build_bline(xmlpp::Element* root,std::list<Vertice*> p,bool loop,Str
        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++;
        }
 }
@@ -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<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());