From: Diego Barrios Romero Date: Wed, 27 Jan 2010 17:33:26 +0000 (+0100) Subject: Merge branch 'eldruin_master' of ssh://synfig.git.sourceforge.net/gitroot/synfig... X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=dca591b6877a1bbe0639fbf206d6dd1ff9644c60;hp=5dcab4f32891574b830e5919a71e72b80a506641;p=synfig.git Merge branch 'eldruin_master' of ssh://synfig.git.sourceforge.net/gitroot/synfig/synfig --- diff --git a/synfig-core/po/ru.po b/synfig-core/po/ru.po index 883324d..4abcea2 100755 --- a/synfig-core/po/ru.po +++ b/synfig-core/po/ru.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: Synfig Backend\n" "Report-Msgid-Bugs-To: http://synfig.org/Bugs\n" "POT-Creation-Date: 2009-10-07 01:26+0400\n" -"PO-Revision-Date: 2009-10-09 21:14+0400\n" +"PO-Revision-Date: 2010-01-18 20:40+0600\n" "Last-Translator: Alexandre Prokoudine \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -64,7 +64,7 @@ msgstr "Оставлять фаску круглой" #: ../src/modules/example/metaballs.cpp:56 msgid "Metaballs" -msgstr "Меташары" +msgstr "Metaballs" #: ../src/modules/example/metaballs.cpp:132 #: ../src/modules/mod_gradient/conicalgradient.cpp:106 @@ -860,7 +860,7 @@ msgstr "Узор Исключающего ИЛИ" #: ../src/modules/lyr_std/zoom.cpp:51 ../src/synfig/layer_pastecanvas.cpp:136 msgid "Zoom" -msgstr "Увеличение" +msgstr "Масштабирование" #: ../src/modules/lyr_std/zoom.cpp:97 msgid "Amount to zoom in" @@ -1695,7 +1695,7 @@ msgstr "Вставляемый холст" #: ../src/synfig/layer_pastecanvas.cpp:137 msgid "Size of canvas" -msgstr "Размерхолста" +msgstr "Размер холста" #: ../src/synfig/layer_pastecanvas.cpp:145 msgid "Children Lock" @@ -1747,11 +1747,11 @@ msgstr "Используемый тип растушевки" #: ../src/synfig/layer_shape.cpp:1219 msgid "Winding Style" -msgstr "Стиль изгибов" +msgstr "Обработка взаимопересечений" #: ../src/synfig/layer_shape.cpp:1220 msgid "Winding style to use" -msgstr "Используемый стиль изгибов" +msgstr "Применяемая обработка взаимопересечений" #: ../src/synfig/layer_shape.cpp:1222 msgid "Non Zero" diff --git a/synfig-core/src/modules/mod_svg/layer_svg.cpp b/synfig-core/src/modules/mod_svg/layer_svg.cpp index 7e36990..ce3be00 100644 --- a/synfig-core/src/modules/mod_svg/layer_svg.cpp +++ b/synfig-core/src/modules/mod_svg/layer_svg.cpp @@ -51,7 +51,7 @@ using namespace synfig; SYNFIG_LAYER_INIT(svg_layer); SYNFIG_LAYER_SET_NAME(svg_layer,"svg_layer"); SYNFIG_LAYER_SET_LOCAL_NAME(svg_layer,N_("Import Svg")); -SYNFIG_LAYER_SET_CATEGORY(svg_layer,N_("Do Not Use"));//Hide this layer in the menu +SYNFIG_LAYER_SET_CATEGORY(svg_layer,CATEGORY_DO_NOT_USE);//Hide this layer in the menu SYNFIG_LAYER_SET_VERSION(svg_layer,"0.1"); SYNFIG_LAYER_SET_CVS_ID(svg_layer,"$Id: layer_svg.cpp 2240 2008-11-22 15:35:33Z dooglus $"); diff --git a/synfig-core/src/modules/mod_svg/svg_parser.cpp b/synfig-core/src/modules/mod_svg/svg_parser.cpp index 2897d64..680aa4f 100644 --- a/synfig-core/src/modules/mod_svg/svg_parser.cpp +++ b/synfig-core/src/modules/mod_svg/svg_parser.cpp @@ -10,6 +10,7 @@ ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** Copyright (c) 2008 Chris Moore ** Copyright (c) 2009 Carlos A. Sosa Navarro +** Copyright (c) 2009 Nikita Kitaev ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -39,6 +40,14 @@ using namespace synfig; /* === G L O B A L S ======================================================= */ +//PARSER PREFERENCES + +//Seperate transformations: apply transformations on a per-layer basis, rather than on canvases +#define SVG_SEP_TRANSFORMS 1 + +//Resolve BLine transformations: resolve transformations instead of creating transformation layers +#define SVG_RESOLVE_BLINE 1 + /* === P R O C E D U R E S ================================================= */ Canvas::Handle @@ -93,14 +102,14 @@ Svg_parser::Svg_parser(){ String Svg_parser::get_id(){ if(!id_name.empty()) return id_name; - return "id_arbitrario"; + return "random_id"; } void Svg_parser::set_id(String source){ const char bad_chars[]=" :#@$^&()*"; - int inicio= source.find_last_of('/')+1; - int fin= source.find_last_of('.'); - String x=source.substr(inicio,fin-inicio); + int start= source.find_last_of('/')+1; + int end= source.find_last_of('.'); + String x=source.substr(start,end-start); if(!x.empty()){ for(unsigned int i=0;i(node); @@ -134,19 +146,10 @@ Svg_parser::parser_node(const xmlpp::Node* node){ parser_canvas(node); }else if(nodename.compare("defs")==0){ parser_defs (node); - }else if(nodename.compare("g")==0){ - if(set_canvas==0) parser_canvas (node); - parser_layer (node,nodeRoot->add_child("layer"),"",NULL); - return; - }else if(nodename.compare("rect")==0){ - if(set_canvas==0) parser_canvas (node); - parser_rect(node,nodeRoot,"",NULL); - }else if(nodename.compare("polygon")==0){ - if(set_canvas==0) parser_canvas (node); - parser_polygon(node,nodeRoot,"",NULL); - }else if(nodename.compare("path")==0){ + }else{ if(set_canvas==0) parser_canvas (node); - parser_path (node,nodeRoot,"",NULL); + parser_graphics(node,nodeRoot,"",NULL); + if(nodename.compare("g")==0) return; } } if(!nodeContent){ @@ -160,7 +163,6 @@ Svg_parser::parser_node(const xmlpp::Node* node){ //parser elements void Svg_parser::parser_svg (const xmlpp::Node* node){ - //printf("un dia en algun lugar de la tierra media\n"); if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ width =etl::strprintf("%f",getDimension(nodeElement->get_attribute_value("width"))); height =etl::strprintf("%f",getDimension(nodeElement->get_attribute_value("height"))); @@ -169,7 +171,6 @@ Svg_parser::parser_svg (const xmlpp::Node* node){ } void Svg_parser::parser_canvas (const xmlpp::Node* node){ - //printf("el campo de batalla parecia un lienzo de pintura\n"); if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ if(width.compare("")==0){ width=nodeElement->get_attribute_value("width",""); @@ -210,236 +211,58 @@ Svg_parser::parser_canvas (const xmlpp::Node* node){ nodeRoot->set_attribute("begin-time","0f"); nodeRoot->set_attribute("end-time","5s"); nodeRoot->set_attribute("bgcolor","0.500000 0.500000 0.500000 1.000000"); - //nodeRoot->add_child("name")->set_child_text("Synfig Animation 1"); if(!id_name.empty()) nodeRoot->add_child("name")->set_child_text(id_name); else nodeRoot->add_child("name")->set_child_text("Synfig Animation 1"); } set_canvas=1; - AdjustPointUrl (); } void -Svg_parser::parser_rect(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent){ +Svg_parser::parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent){ if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ - Glib::ustring rect_id =nodeElement->get_attribute_value("id"); - Glib::ustring rect_style =nodeElement->get_attribute_value("style"); - Glib::ustring rect_x =nodeElement->get_attribute_value("x"); - Glib::ustring rect_y =nodeElement->get_attribute_value("y"); - Glib::ustring rect_width =nodeElement->get_attribute_value("width"); - Glib::ustring rect_height =nodeElement->get_attribute_value("height"); - //style - String fill =loadAttribute("fill",rect_style,parent_style,"none"); - String fill_opacity =loadAttribute("fill-opacity",rect_style,parent_style,"1"); - String opacity =loadAttribute("opacity",rect_style,parent_style,"1"); - //matrix - //it's some complicated - - //build + Glib::ustring nodename = node->get_name(); + if (nodename.compare("g")==0 || nodename.compare("path")==0 || nodename.compare("polygon")==0 || nodename.compare("rect")==0){} else return; - int typeFill=0; - if(fill.compare(0,3,"url")==0){ - typeFill=2; - root=nodeStartBasicLayer(root->add_child("layer")); - } - xmlpp::Element *child_rect=root->add_child("layer"); - child_rect->set_attribute("type","rectangle"); - child_rect->set_attribute("active","true"); - child_rect->set_attribute("version","0.2"); - child_rect->set_attribute("desc",rect_id); - - build_real(child_rect->add_child("param"),"z_depth",0.0); - build_real(child_rect->add_child("param"),"amount",1.0); - build_integer(child_rect->add_child("param"),"blend_method",0); - build_color (child_rect->add_child("param"),getRed (fill),getGreen (fill),getBlue(fill),atof(opacity.data())*atof(fill_opacity.data())); - - float auxx=atof(rect_x.c_str()); - float auxy=atof(rect_y.c_str()); - coor2vect(&auxx,&auxy); - build_vector (child_rect->add_child("param"),"point1",auxx,auxy); - auxx= atof(rect_x.c_str()) + atof(rect_width.c_str()); - auxy= atof(rect_y.c_str()) + atof(rect_height.c_str()); - coor2vect(&auxx,&auxy); - build_vector (child_rect->add_child("param"),"point2",auxx,auxy); - if(typeFill==2){ - build_url (root->add_child("layer"),fill,mtx_parent); - } - } -} -void -Svg_parser::parser_layer(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent){ - if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ - Glib::ustring label =nodeElement->get_attribute_value("label"); - Glib::ustring style =nodeElement->get_attribute_value("style"); - Glib::ustring fill =nodeElement->get_attribute_value("fill"); + //load sub-attributes + Glib::ustring id =nodeElement->get_attribute_value("id"); Glib::ustring transform =nodeElement->get_attribute_value("transform"); - String layer_style; - if(!style.empty()){ - layer_style=style; - }else if(!fill.empty()){ - layer_style.append("fill:"); - layer_style.append(fill); - }else if(!parent_style.empty()){ - layer_style=parent_style; - } + //resolve transformations Matrix* mtx=NULL; if(!transform.empty()) - mtx=build_transform (transform); - if(mtx_parent){ - if(mtx) - composeMatrix(&mtx,mtx_parent,mtx); - else - mtx=newMatrix (mtx_parent); - } - //build - root->set_attribute("type","PasteCanvas"); - root->set_attribute("active","true"); - root->set_attribute("version","0.1"); - if(!label.empty()) root->set_attribute("desc",label); - else root->set_attribute("desc","unknow layer"); - - build_real(root->add_child("param"),"z_depth",0.0); - build_real(root->add_child("param"),"amount",1.0); - build_integer(root->add_child("param"),"blend_method",0); - build_vector (root->add_child("param"),"origin",0,0); - - //printf(" atributos canvas "); - //canvas - xmlpp::Element *child_canvas=root->add_child("param"); - child_canvas->set_attribute("name","canvas"); - child_canvas=child_canvas->add_child("canvas"); - const xmlpp::ContentNode* nodeContent = dynamic_cast(node); - if(!nodeContent){ - xmlpp::Node::NodeList list = node->get_children(); - for(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter){ - Glib::ustring name =(*iter)->get_name(); - if(name.compare("g")==0){ - parser_layer (*iter,child_canvas->add_child("layer"),layer_style,mtx); - }else if(name.compare("path")==0){ - parser_path (*iter,child_canvas,layer_style,mtx); - }else if(name.compare("polygon")==0){ - parser_polygon (*iter,child_canvas,layer_style,mtx); - }else if(name.compare("rect")==0){ - parser_rect (*iter,child_canvas,layer_style,mtx); - } - } - } - } -} -void -Svg_parser::parser_polygon(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent){ - //printf("sus escudos parecian rombos y sus naves unos triangulos\n"); - if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ - //load sub-attributes - Glib::ustring polygon_style =nodeElement->get_attribute_value("style"); - Glib::ustring polygon_id =nodeElement->get_attribute_value("id"); - Glib::ustring polygon_points =nodeElement->get_attribute_value("points"); - Glib::ustring polygon_transform =nodeElement->get_attribute_value("transform"); - Glib::ustring polygon_fill =nodeElement->get_attribute_value("fill"); - String fill =loadAttribute("fill",polygon_style,parent_style,polygon_fill,"none"); - String fill_rule =loadAttribute("fill-rule",polygon_style,parent_style,"evenodd"); - String fill_opacity =loadAttribute("fill-opacity",polygon_style,parent_style,"1"); - String opacity =loadAttribute("opacity",polygon_style,parent_style,"1"); - - //transforms - Matrix* mtx=NULL; - if(!polygon_transform.empty()) - mtx=build_transform (polygon_transform); - if(mtx_parent){ - if(mtx) - composeMatrix(&mtx,mtx_parent,mtx); - else - mtx=newMatrix (mtx_parent); + mtx=parser_transform (transform); + if (SVG_SEP_TRANSFORMS) + { + if(mtx_parent){ + if(mtx) + composeMatrix(&mtx,mtx_parent,mtx); + else + mtx=newMatrix(mtx_parent); + } } - //points - if(polygon_points.empty()) + if(nodename.compare("g")==0){ + parser_layer (node,root->add_child("layer"),parent_style,mtx); return; - std::list k; - std::vector tokens=get_tokens_path (polygon_points); - unsigned int i; - float ax,ay; ax=ay=0; - for(i=0;iadd_child("layer")); - } - child_polygon=root->add_child("layer"); - child_polygon->set_attribute("type","polygon"); - child_polygon->set_attribute("active","true"); - child_polygon->set_attribute("version","0.1"); - child_polygon->set_attribute("desc",polygon_id); - build_param (child_polygon->add_child("param"),"z_depth","real","0.0000000000"); - build_param (child_polygon->add_child("param"),"amount","real","1.0000000000"); - build_param (child_polygon->add_child("param"),"blend_method","integer","0"); - build_color (child_polygon->add_child("param"),getRed(fill),getGreen(fill),getBlue(fill),atof(fill_opacity.data())*atof(opacity.data())); - build_vector(child_polygon->add_child("param"),"offset",0,0); - build_param (child_polygon->add_child("param"),"invert","bool","false"); - build_param (child_polygon->add_child("param"),"antialias","bool","true"); - build_param (child_polygon->add_child("param"),"feather","real","0.0000000000"); - build_param (child_polygon->add_child("param"),"blurtype","integer","1"); - if(fill_rule.compare("evenodd")==0) build_param (child_polygon->add_child("param"),"winding_style","integer","1"); - else build_param (child_polygon->add_child("param"),"winding_style","integer","0"); - build_points (child_polygon->add_child("param"),k); - - if(typeFill==2){ - build_url(root->add_child("layer"),fill,mtx); - } - } -} -void -Svg_parser::parser_path(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent){ - //printf("pensamos que atacarian de frente pero hicieron una curva\n"); - if(const xmlpp::Element* nodeElement = dynamic_cast(node)){ - //load sub-attributes - Glib::ustring path_style =nodeElement->get_attribute_value("style"); - Glib::ustring path_id =nodeElement->get_attribute_value("id"); - Glib::ustring path_d =nodeElement->get_attribute_value("d"); - Glib::ustring path_transform =nodeElement->get_attribute_value("transform"); - Glib::ustring path_fill =nodeElement->get_attribute_value("fill"); - - String fill =loadAttribute("fill",path_style,parent_style,path_fill,"none"); - String fill_rule =loadAttribute("fill-rule",path_style,parent_style,"evenodd"); - String stroke =loadAttribute("stroke",path_style,parent_style,"none"); - String stroke_width =loadAttribute("stroke-width",path_style,parent_style,"1px"); - String stroke_linecap =loadAttribute("stroke-linecap",path_style,parent_style,"butt"); - String stroke_linejoin =loadAttribute("stroke-linejoin",path_style,parent_style,"miter"); - String stroke_opacity =loadAttribute("stroke-opacity",path_style,parent_style,"1"); - String fill_opacity =loadAttribute("fill-opacity",path_style,parent_style,"1"); - String opacity =loadAttribute("opacity",path_style,parent_style,"1"); - //resolve transformations - Matrix* mtx=NULL; - if(!path_transform.empty()) - mtx=build_transform (path_transform); - if(mtx_parent){ - if(mtx) - composeMatrix(&mtx,mtx_parent,mtx); - else - mtx=newMatrix(mtx_parent); - } - //parser path_d attribute, this is obviously important - std::list > k; - k=parser_path_d (path_d,mtx); + Glib::ustring obj_style =nodeElement->get_attribute_value("style"); + Glib::ustring obj_fill =nodeElement->get_attribute_value("fill"); + + //style + String fill =loadAttribute("fill",obj_style,parent_style,obj_fill,"none"); + String fill_rule =loadAttribute("fill-rule",obj_style,parent_style,"evenodd"); + String stroke =loadAttribute("stroke",obj_style,parent_style,"none"); + String stroke_width =loadAttribute("stroke-width",obj_style,parent_style,"1px"); + String stroke_linecap =loadAttribute("stroke-linecap",obj_style,parent_style,"butt"); + String stroke_linejoin =loadAttribute("stroke-linejoin",obj_style,parent_style,"miter"); + String stroke_opacity =loadAttribute("stroke-opacity",obj_style,parent_style,"1"); + String fill_opacity =loadAttribute("fill-opacity",obj_style,parent_style,"1"); + String opacity =loadAttribute("opacity",obj_style,parent_style,"1"); + - //escribir - int typeFill=0; //nothing - int typeStroke=0;//nothing //Fill + int typeFill=0; //nothing + if(fill.compare("none")!=0){ typeFill=1; //simple } @@ -447,40 +270,73 @@ Svg_parser::parser_path(const xmlpp::Node* node,xmlpp::Element* root,String pare typeFill=2; //gradient } //Stroke + int typeStroke=0;//nothing + if(stroke.compare("none")!=0){ typeStroke=1; //simple } if(typeStroke==1 && stroke.compare(0,3,"url")==0){ typeStroke=2; //gradient } - String bline_id; - String offset_id; - int n=k.size(); - if(n!=1){ //if n is > than 1 then we must create a paste canvas for all paths - root=nodeStartBasicLayer(root->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; } - std::list >::iterator aux = k.begin(); - for (; aux!=k.end(); aux++){ - if(typeFill!=0 && typeStroke!=0){ - bline_id=new_guid(); - offset_id=new_guid(); + 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 Verteces + if (SVG_RESOLVE_BLINE) { + if(nodename.compare("path")==0){ + k=parser_path_d (nodeElement->get_attribute_value("d"),mtx); + } else if(nodename.compare("polygon")==0){ + k=parser_path_polygon (nodeElement->get_attribute_value("points"),mtx); } - if(typeFill==1 || typeFill==2){//region layer - xmlpp::Element *child_fill=root; - if(n==1 && typeFill==2){//open gradient or url (fill) - child_fill=nodeStartBasicLayer(root->add_child("layer")); - } + } else { + if(nodename.compare("path")==0){ + k=parser_path_d (nodeElement->get_attribute_value("d"),NULL); + } else if(nodename.compare("polygon")==0){ + k=parser_path_polygon (nodeElement->get_attribute_value("points"),NULL); + } + } + + std::list::iterator aux; + //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"); child_region->set_attribute("active","true"); child_region->set_attribute("version","0.1"); - child_region->set_attribute("desc",path_id); + child_region->set_attribute("desc",id); build_param (child_region->add_child("param"),"z_depth","real","0.0000000000"); 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())); - if(offset_id.empty()) build_vector (child_region->add_child("param"),"offset",0,0); - else build_vector (child_region->add_child("param"),"offset",0,0,offset_id); + 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"); @@ -488,29 +344,31 @@ Svg_parser::parser_path(const xmlpp::Node* node,xmlpp::Element* root,String pare 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); - - if(n==1 && typeFill==2){ //gradient in onto mode (fill) - build_url(child_fill->add_child("layer"),fill,mtx); - } + build_bline (child_region->add_child("param"),*(*aux)->points,(*aux)->loop,*(*aux)->bline_id); } + } + if(typeFill==2){ //gradient in onto mode (fill) + if (SVG_RESOLVE_BLINE) + build_fill(child_fill,fill,mtx); + else + build_fill(child_fill,fill,NULL); + } - if(typeStroke==1 || typeStroke==2){ //layer outline - xmlpp::Element *child_stroke=root; - if(n==1 && typeStroke==2){//open gradient in straigth onto (stroke) - child_stroke=nodeStartBasicLayer(root->add_child("layer")); - } + 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"); child_outline->set_attribute("active","true"); child_outline->set_attribute("version","0.2"); - child_outline->set_attribute("desc",path_id); + child_outline->set_attribute("desc",id); build_param (child_outline->add_child("param"),"z_depth","real","0.0000000000"); 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())); - if(offset_id.empty()) build_vector (child_outline->add_child("param"),"offset",0,0); - else build_vector (child_outline->add_child("param"),"offset",0,0,offset_id); + 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"); @@ -518,7 +376,7 @@ Svg_parser::parser_path(const xmlpp::Node* node,xmlpp::Element* root,String pare //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); + 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); @@ -534,158 +392,205 @@ Svg_parser::parser_path(const xmlpp::Node* node,xmlpp::Element* root,String pare } build_param (child_outline->add_child("param"),"loopyness","real","1.0000000000"); build_param (child_outline->add_child("param"),"homogeneous_width","bool","true"); - - if(n==1 && typeStroke==2){ //gradient in onto mode (stroke) - build_url(child_stroke->add_child("layer"),stroke,mtx); - } - } - } - if(n!=1){//only fill for several canvas in one path - if(typeFill==2){ - build_url(root->add_child("layer"),fill,mtx); } + + if(typeStroke==2){ //gradient in onto mode (stroke) + 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); } } -std::vector -Svg_parser::get_tokens_path(String path){ //mini path lexico-parser - std::vector tokens; - String buffer; - int e=0; - unsigned int i=0; - char a; - while(i(node)){ + Glib::ustring label =nodeElement->get_attribute_value("label"); + Glib::ustring style =nodeElement->get_attribute_value("style"); + Glib::ustring fill =nodeElement->get_attribute_value("fill"); + + String layer_style; + if(!style.empty()){ + layer_style=style; + }else if(!fill.empty()){ + layer_style.append("fill:"); + layer_style.append(fill); + }else if(!parent_style.empty()){ + layer_style=parent_style; } + //build + root->set_attribute("type","PasteCanvas"); + root->set_attribute("active","true"); + root->set_attribute("version","0.1"); + if(!label.empty()) root->set_attribute("desc",label); + else root->set_attribute("desc","Inline Canvas"); + + build_real(root->add_child("param"),"z_depth",0.0); + build_real(root->add_child("param"),"amount",1.0); + build_integer(root->add_child("param"),"blend_method",0); + build_vector (root->add_child("param"),"origin",0,0); + + //printf(" canvas attributes "); + //canvas + xmlpp::Element *child_canvas=root->add_child("param"); + child_canvas->set_attribute("name","canvas"); + child_canvas=child_canvas->add_child("canvas"); + const xmlpp::ContentNode* nodeContent = dynamic_cast(node); + if(!nodeContent){ + xmlpp::Node::NodeList list = node->get_children(); + for(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter){ + Glib::ustring name =(*iter)->get_name(); + parser_graphics (*iter,child_canvas,layer_style,mtx); + } + } + if (SVG_SEP_TRANSFORMS) parser_effects(nodeElement,child_canvas,parent_style,NULL); + else parser_effects(nodeElement,child_canvas,parent_style,mtx); } - switch(e){//last element - case 1 : tokens.push_back("m"); break; - case 2 : tokens.push_back("c"); break; - case 3 : tokens.push_back("q"); break; - case 4 : tokens.push_back("t"); break; - case 5 : tokens.push_back("a"); break; - case 6 : tokens.push_back("l"); break; - case 7 : tokens.push_back("v"); break; - case 8 : tokens.push_back("h"); break; - case 9 : tokens.push_back("M"); break; - case 10: tokens.push_back("C"); break; - case 11: tokens.push_back("Q"); break; - case 12: tokens.push_back("T"); break; - case 13: tokens.push_back("A"); break; - case 14: tokens.push_back("L"); break; - case 15: tokens.push_back("V"); break; - case 16: tokens.push_back("H"); break; - case 17: tokens.push_back("z"); break; - case 18: tokens.push_back(buffer); break; - case 19: tokens.push_back(","); break; - case 20: tokens.push_back(buffer); break; - default: break; +} + +void +Svg_parser::parser_rect(const xmlpp::Element* nodeElement,xmlpp::Element* root,String fill, String fill_opacity, String opacity){ + Glib::ustring rect_id =nodeElement->get_attribute_value("id"); + Glib::ustring rect_x =nodeElement->get_attribute_value("x"); + Glib::ustring rect_y =nodeElement->get_attribute_value("y"); + Glib::ustring rect_width =nodeElement->get_attribute_value("width"); + Glib::ustring rect_height =nodeElement->get_attribute_value("height"); + + xmlpp::Element *child_rect=root->add_child("layer"); + child_rect->set_attribute("type","rectangle"); + child_rect->set_attribute("active","true"); + child_rect->set_attribute("version","0.2"); + child_rect->set_attribute("desc",rect_id); + + build_real(child_rect->add_child("param"),"z_depth",0.0); + build_real(child_rect->add_child("param"),"amount",1.0); + build_integer(child_rect->add_child("param"),"blend_method",0); + build_color (child_rect->add_child("param"),getRed (fill),getGreen (fill),getBlue(fill),atof(opacity.data())*atof(fill_opacity.data())); + + float auxx=atof(rect_x.c_str()); + float auxy=atof(rect_y.c_str()); + coor2vect(&auxx,&auxy); + build_vector (child_rect->add_child("param"),"point1",auxx,auxy); + auxx= atof(rect_x.c_str()) + atof(rect_width.c_str()); + auxy= atof(rect_y.c_str()) + atof(rect_height.c_str()); + coor2vect(&auxx,&auxy); + build_vector (child_rect->add_child("param"),"point2",auxx,auxy); + + +} + +/* === CONVERT TO PATH PARSERS ============================================= */ + +std::list +Svg_parser::parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx){ + std::list k0; + if(polygon_points.empty()) + return k0; + std::list points; + std::vector tokens=get_tokens_path (polygon_points); + unsigned int i; + float ax,ay; ax=ay=0; + for(i=0;i > +std::list Svg_parser::parser_path_d(String path_d,Matrix* mtx){ - std::list > k; - std::list k1; - float ax,ay,tgx,tgy,tgx2,tgy2;//each method - float actual_x=0,actual_y=0;//for relative methods; - loop=false; - unsigned int i; + std::list k; + std::list k1; + std::vector tokens=get_tokens_path(path_d); - for(i=0;ix,k1.front()->y,tgx,tgy); }else{ - k1.push_back(nuevoVertice (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(tokens.at(i).compare("Q")==0){ //absolute quadractic curve + }else if(command.compare("Q")==0 || command.compare("q")==0){ //quadractic curve //tg1 and tg2 - i++; tgx=ax=atof(tokens.at(i).data()); + tgx=actual_x+atof(tokens.at(i).data()); i++; if(tokens.at(i).compare(",")==0) i++; - tgy=ay=atof(tokens.at(i).data()); + tgy=actual_y+atof(tokens.at(i).data()); //point - i++; ax=atof(tokens.at(i).data()); + i++; actual_x+=atof(tokens.at(i).data()); i++; if(tokens.at(i).compare(",")==0) i++; - ay=atof(tokens.at(i).data()); - actual_x=ax; - actual_y=ay; + actual_y+=atof(tokens.at(i).data()); + + ax=actual_x; + ay=actual_y; //mtx if(mtx){ transformPoint2D(mtx,&ax,&ay); @@ -720,74 +626,16 @@ 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(nuevoVertice (ax,ay)); + k1.push_back(newVertex (ax,ay)); setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy); - }else if(tokens.at(i).compare("L")==0){ //absolute line to + }else if(command.compare("L")==0 || command.compare("l")==0){ //line to //point - i++; ax=atof(tokens.at(i).data()); + actual_x+=atof(tokens.at(i).data()); i++; if(tokens.at(i).compare(",")==0) i++; - ay=atof(tokens.at(i).data()); - actual_x=ax; - actual_y=ay; - //mtx - if(mtx) transformPoint2D(mtx,&ax,&ay); - //adjust - coor2vect(&ax,&ay); - //save - setTg2(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - 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(nuevoVertice(ax,ay)); - setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - } - }else if(tokens.at(i).compare("l")==0){//relative line to - //point read - i++; ax=atof(tokens.at(i).data()); - i++; if(tokens.at(i).compare(",")==0) i++; - ay=atof(tokens.at(i).data()); - //relative - ax=actual_x+ax; - ay=actual_y+ay; - actual_x=ax; - actual_y=ay; - //mtx - if(mtx) transformPoint2D(mtx,&ax,&ay); - //adjust - coor2vect(&ax,&ay); - //save - setTg2(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - 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(nuevoVertice(ax,ay)); - setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - } - }else if(tokens.at(i).compare("H")==0){//absolute horizontal move - //the same that L but only Horizontal movement - //point - i++; ax=atof(tokens.at(i).data()); - ay=actual_y; - actual_x=ax; - actual_y=ay; - //mtx - if(mtx) transformPoint2D(mtx,&ax,&ay); - //adjust - coor2vect(&ax,&ay); - //save - setTg2(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - 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(nuevoVertice(ax,ay)); - setTg1(k1.back(),k1.back()->x,k1.back()->y,k1.back()->x,k1.back()->y); - } - }else if(tokens.at(i).compare("h")==0){//horizontal relative - i++; ax=atof(tokens.at(i).data()); - ax=actual_x+ax; + actual_y+=atof(tokens.at(i).data()); + + ax=actual_x; ay=actual_y; - actual_x=ax; - actual_y=ay; //mtx if(mtx) transformPoint2D(mtx,&ax,&ay); //adjust @@ -797,15 +645,16 @@ 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(nuevoVertice(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(tokens.at(i).compare("V")==0){//vertical absolute + }else if(command.compare("H")==0 || command.compare("h")==0){// horizontal move + //the same that L but only Horizontal movement //point - i++; ay=atof(tokens.at(i).data()); + actual_x+=atof(tokens.at(i).data()); + ax=actual_x; - actual_x=ax; - actual_y=ay; + ay=old_y; //mtx if(mtx) transformPoint2D(mtx,&ax,&ay); //adjust @@ -815,16 +664,15 @@ 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(nuevoVertice(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(tokens.at(i).compare("v")==0){//relative + }else if(command.compare("V")==0 || command.compare("v")==0){//vertical //point - i++; ay=atof(tokens.at(i).data()); - ax=actual_x; - ay=actual_y+ay; - actual_x=ax; - actual_y=ay; + actual_y+=atof(tokens.at(i).data()); + + ax=old_x; + ay=actual_y; //mtx if(mtx) transformPoint2D(mtx,&ax,&ay); //adjust @@ -834,41 +682,45 @@ 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(nuevoVertice(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(tokens.at(i).compare("T")==0){// I don't know what does it - }else if(tokens.at(i).compare("A")==0){//elliptic arc + }else if(command.compare("T")==0 || command.compare("t")==0){// I don't know what does it + actual_x+=atof(tokens.at(i).data()); + i++; if(tokens.at(i).compare(",")==0) i++; + actual_y+=atof(tokens.at(i).data()); + }else if(command.compare("A")==0 || command.compare("a")==0){//elliptic arc //isn't complete support, is only for circles //this curve have 6 parameters - //radio - float radio_x,radio_y; + //radius + float radius_x,radius_y; float angle; bool sweep,large; - //radio - i++; radio_x=atof(tokens.at(i).data()); + //radius + radius_x=atof(tokens.at(i).data()); i++; if(tokens.at(i).compare(",")==0) i++; - radio_y=atof(tokens.at(i).data()); + radius_y=atof(tokens.at(i).data()); //angle i++; angle=atof(tokens.at(i).data()); //flags i++; large=atoi(tokens.at(i).data()); i++; sweep=atoi(tokens.at(i).data()); //point - i++; ax=atof(tokens.at(i).data()); + i++; actual_x+=atof(tokens.at(i).data()); i++; if(tokens.at(i).compare(",")==0) i++; - ay=atof(tokens.at(i).data()); + actual_y+=atof(tokens.at(i).data()); //how to draw? if(!large && !sweep){ //points - tgx2 = actual_x + radio_x*0.5; - tgy2 = actual_y ; - tgx = ax; - tgy = ay + radio_y*0.5; - actual_x=ax; - actual_y=ay; + tgx2 = old_x + radius_x*0.5; + tgy2 = old_y ; + tgx = actual_x; + tgy = actual_y + radius_y*0.5; + + ax=actual_x; + ay=actual_y; //transformations if(mtx){ transformPoint2D(mtx,&tgx2,&tgy2); @@ -884,18 +736,19 @@ 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(nuevoVertice (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(!large && sweep){ //points - tgx2 = actual_x; - tgy2 = actual_y + radio_y*0.5; - tgx = ax + radio_x*0.5; - tgy = ay ; - actual_x=ax; - actual_y=ay; + tgx2 = old_x; + tgy2 = old_y + radius_y*0.5; + tgx = actual_x + radius_x*0.5; + tgy = actual_y ; + + ax=actual_x; + ay=actual_y; //transformations if(mtx){ transformPoint2D(mtx,&tgx2,&tgy2); @@ -911,79 +764,101 @@ 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(nuevoVertice (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( large && !sweep){//rare //this need more than one vertex }else if( large && sweep){//circles in inkscape are made with this kind of arc - if(actual_y==ay){//circles - //intermediate point - int sense=1; - if(actual_x>ax) sense =-1; - float in_x,in_y,in_tgx1,in_tgy1,in_tgx2,in_tgy2; - in_x = (actual_x+ax)/2; - in_y = actual_y - sense*radio_y; - in_tgx1 = in_x - sense*(radio_x*0.5); - in_tgx2 = in_x + sense*(radio_x*0.5); - in_tgy1 = in_y; - in_tgy2 = in_y; - //start/end points - tgx2=actual_x; - tgy2=ay - sense*(radio_y*0.5); - tgx =ax; - tgy =ay - sense*(radio_y*0.5); - - actual_x=ax; - actual_y=ay; - //transformations - if(mtx){ - transformPoint2D(mtx,&tgx2,&tgy2); - transformPoint2D(mtx,&tgx ,&tgy ); - transformPoint2D(mtx,&ax,&ay); - - transformPoint2D(mtx,&in_tgx2,&in_tgy2); - transformPoint2D(mtx,&in_tgx1,&in_tgy1); - transformPoint2D(mtx,&in_x,&in_y); - } - //adjust - coor2vect(&tgx2 , &tgy2); - coor2vect(&ax , &ay ); - coor2vect(&tgx , &tgy ); - - coor2vect(&in_tgx2 , &in_tgy2); - coor2vect(&in_tgx1 , &in_tgy1); - coor2vect(&in_x , &in_y ); - - //save the last tg2 - setTg2(k1.back(),k1.back()->x,k1.back()->y,tgx2,tgy2); - //save the intermediate point - k1.push_back(nuevoVertice (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 - //save the new point - if(isFirst(k1.front(),ax,ay)){ - setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy); - }else{ - k1.push_back(nuevoVertice (ax,ay)); - setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy); - setSplit(k1.back(),TRUE); - } + //intermediate point + int sense=1; + if(old_x>actual_x) sense =-1; + float in_x,in_y,in_tgx1,in_tgy1,in_tgx2,in_tgy2; + in_x = (old_x+actual_x)/2; + in_y = old_y - sense*radius_y; + in_tgx1 = in_x - sense*(radius_x*0.5); + in_tgx2 = in_x + sense*(radius_x*0.5); + in_tgy1 = in_y; + in_tgy2 = in_y; + //start/end points + tgx2=old_x; + tgy2=actual_y - sense*(radius_y*0.5); + tgx =actual_x; + tgy =actual_y - sense*(radius_y*0.5); + + ax=actual_x; + ay=actual_y; + //transformations + if(mtx){ + transformPoint2D(mtx,&tgx2,&tgy2); + transformPoint2D(mtx,&tgx ,&tgy ); + transformPoint2D(mtx,&ax,&ay); + + transformPoint2D(mtx,&in_tgx2,&in_tgy2); + transformPoint2D(mtx,&in_tgx1,&in_tgy1); + transformPoint2D(mtx,&in_x,&in_y); + } + //adjust + coor2vect(&tgx2 , &tgy2); + coor2vect(&ax , &ay ); + coor2vect(&tgx , &tgy ); + + coor2vect(&in_tgx2 , &in_tgy2); + coor2vect(&in_tgx1 , &in_tgy1); + coor2vect(&in_x , &in_y ); + + //save the last tg2 + setTg2(k1.back(),k1.back()->x,k1.back()->y,tgx2,tgy2); + //save the intermediate point + 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 + //save the new point + if(isFirst(k1.front(),ax,ay)){ + setTg1(k1.front(),k1.front()->x,k1.front()->y,tgx,tgy); + }else{ + k1.push_back(newVertex (ax,ay)); + setTg1(k1.back(),k1.back()->x,k1.back()->y,tgx,tgy); + setSplit(k1.back(),TRUE); } } - }else if(tokens.at(i).compare("z")==0){ - loop=true; + }else if(command.compare("z")==0){ + k.push_front(newBLine(&k1, true)); + k1.clear(); + if (i(node); @@ -999,41 +874,59 @@ Svg_parser::parser_defs(const xmlpp::Node* node){ } } } + +/* === BUILDS ============================================================== */ + void -Svg_parser::AdjustPointUrl(){ -/* - if(!lg.empty()){//linealgradient - std::list::iterator aux=lg.begin(); - while(aux!=lg.end()){ - LinearGradient* auxlg=*aux; - coor2vect (&auxlg->x1,&auxlg->y1); - coor2vect (&auxlg->x2,&auxlg->y2); - aux++; - } +Svg_parser::build_transform(xmlpp::Element* root,Matrix* mtx){ + if (mtx) { + xmlpp::Element *child_transform=root->add_child("layer"); + child_transform->set_attribute("type","warp"); + child_transform->set_attribute("active","true"); + child_transform->set_attribute("version","0.1"); + child_transform->set_attribute("desc","Transform"); + + float x,y; + x=100;y=100;coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"src_tl",x,y); + + x=200;y=200;coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"src_br",x,y); + + + x=100;y=100; + transformPoint2D(mtx,&x,&y);coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"dest_tl",x,y); + + x=200;y=100; + transformPoint2D(mtx,&x,&y);coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"dest_tr",x,y); + + x=200;y=200; + transformPoint2D(mtx,&x,&y);coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"dest_br",x,y); + + x=100;y=200; + transformPoint2D(mtx,&x,&y);coor2vect(&x,&y); + build_vector (child_transform->add_child("param"),"dest_bl",x,y); + + build_param (child_transform->add_child("param"),"clip","bool","false"); + build_param (child_transform->add_child("param"),"horizon","real","4.0"); } - if(!rg.empty()){//radialgradient - std::list::iterator aux=rg.begin(); - while(aux!=rg.end()){ - RadialGradient* auxrg=*aux; - coor2vect (&auxrg->cx,&auxrg->cy); - auxrg->r= auxrg->r/kux; - aux++; - } - } -*/ } + std::list* Svg_parser::find_colorStop(String name){ if(!name.empty()){ if(lg.empty()&& rg.empty()) return NULL; - String buscar= name; - if(buscar.at(0)=='#') buscar.erase(0,1); + String find= name; + if(find.at(0)=='#') find.erase(0,1); else return NULL; std::list::iterator aux=lg.begin(); while(aux!=lg.end()){//only find into linear gradients - if(buscar.compare((*aux)->name)==0){ + if(find.compare((*aux)->name)==0){ return (*aux)->stops; } aux++; @@ -1041,40 +934,34 @@ Svg_parser::find_colorStop(String name){ } return NULL; } + void -Svg_parser::build_url(xmlpp::Element* root, String name,Matrix *mtx){ +Svg_parser::build_fill(xmlpp::Element* root, String name,Matrix *mtx){ if(!name.empty()){ - if(lg.empty()&& rg.empty()) - root->get_parent()->remove_child(root); - - int inicio=name.find_first_of("#")+1; - int fin=name.find_first_of(")"); - String buscar= name.substr(inicio,fin-inicio); - bool encontro=false; + int start=name.find_first_of("#")+1; + int end=name.find_first_of(")"); + String find= name.substr(start,end-start); + bool encounter=false; if(!lg.empty()){ std::list::iterator aux=lg.begin(); while(aux!=lg.end()){ - if(buscar.compare((*aux)->name)==0){ + if(find.compare((*aux)->name)==0){ build_linearGradient (root,*aux,mtx); - encontro=true; + encounter=true; } aux++; } } - if(!encontro && !rg.empty()){ + if(!encounter && !rg.empty()){ std::list::iterator aux=rg.begin(); while(aux!=rg.end()){ - if(buscar.compare((*aux)->name)==0){ + if(find.compare((*aux)->name)==0){ build_radialGradient (root,*aux,mtx); - encontro=true; + encounter=true; } aux++; } } - if(!encontro) - root->get_parent()->remove_child(root); - }else{ - root->get_parent()->remove_child(root); } } void @@ -1093,65 +980,137 @@ Svg_parser::build_stop_color(xmlpp::Element* root, std::list *stops) void Svg_parser::build_linearGradient(xmlpp::Element* root,LinearGradient* data,Matrix* mtx){ if(data){ - root->set_attribute("type","linear_gradient"); - root->set_attribute("active","true"); - root->set_attribute("desc","Gradient004"); - build_param (root->add_child("param"),"z_depth","real","0"); - build_param (root->add_child("param"),"amount","real","1"); + xmlpp::Element* gradient=root->add_child("layer"); + + gradient->set_attribute("type","linear_gradient"); + gradient->set_attribute("active","true"); + 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 - build_param (root->add_child("param"),"blend_method","integer","21"); + build_param (gradient->add_child("param"),"blend_method","integer","21"); float x1,y1,x2,y2; x1=data->x1; y1=data->y1; x2=data->x2; y2=data->y2; - if(mtx){ - transformPoint2D(mtx,&x1,&y1); - transformPoint2D(mtx,&x2,&y2); + + + if (mtx || data->transform){ + Matrix *mtx2=NULL; + if (mtx && data->transform){ + composeMatrix(&mtx2,mtx,data->transform); + }else if (mtx){ + mtx2=mtx; + }else if (data->transform){ + mtx2=data->transform; + } + //matrix transforms the gradient as a whole + //it does not preserve angles, so we cant' simply transform both points + float x3, y3, k; + //set point (x3,y3) on the same gradient line as (x2,y2) + //the gradient line is perpendicular to (x1,y1)(x2,y2) + x3=x2+(y2-y1); + y3=y2-(x2-x1); + //transform everything + transformPoint2D(mtx2,&x1,&y1); + transformPoint2D(mtx2,&x2,&y2); + transformPoint2D(mtx2,&x3,&y3); + + if (x2!=x3 && y2!=y3) {//divide by zero check + + //set k as slope between (x2,y2) and (x3,y3) + //k is the slope of gradient lines post-transformation + k=(y3-y2)/(x3-x2); + //set point (x2,y2) on the gradient line passing through (x3,y3) + //so that the line (x1,y1)(x2,y2) is perpendicular to (x2,y2)(x3,y3) + x2= (x3*k+x1/k+y1-y3)/(k+(1/k)); + y2= k*(x2-x3)+y3; + } else if (x2==x3 && y2!=y3) { + y2=y1; + } else if (x2!=x3 && y2==y3) { + x2=x1; + } else { + std::cout<<"SVG Import warning: gradient points equal each other"<add_child("param"),"p1",x1,y1); - build_vector (root->add_child("param"),"p2",x2,y2); + build_vector (gradient->add_child("param"),"p1",x1,y1); + build_vector (gradient->add_child("param"),"p2",x2,y2); //gradient link - xmlpp::Element *child=root->add_child("param"); - child->set_attribute("name","gradient"); - build_stop_color (child->add_child("gradient"),data->stops); - build_param (root->add_child("param"),"loop","bool","false"); - build_param (root->add_child("param"),"zigzag","bool","false"); + 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"); } } void Svg_parser::build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matrix* mtx){ -//not completed if(data){ - root->set_attribute("type","radial_gradient"); - root->set_attribute("active","true"); - build_param (root->add_child("param"),"z_depth","real","0"); - build_param (root->add_child("param"),"amount","real","1"); - //straight onto - build_param (root->add_child("param"),"blend_method","integer","21"); + xmlpp::Element* gradient; + + if (mtx || data->transform) { + xmlpp::Element* layer=root->add_child("layer"); + + layer->set_attribute("type","PasteCanvas"); + layer->set_attribute("active","true"); + layer->set_attribute("version","0.1"); + 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 + build_vector (layer->add_child("param"),"origin",0,0); + xmlpp::Element *child=layer->add_child("param"); + child->set_attribute("name","canvas"); + 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){ + composeMatrix(&mtx2,mtx,data->transform); + }else if (mtx){ + mtx2=mtx; + }else if (data->transform){ + mtx2=data->transform; + } + build_transform(child_layer,mtx2); + + }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->set_attribute("type","radial_gradient"); + gradient->set_attribute("active","true"); + build_param (gradient->add_child("param"),"z_depth","real","0"); + build_param (gradient->add_child("param"),"amount","real","1"); //gradient link - xmlpp::Element *child=root->add_child("param"); - child->set_attribute("name","gradient"); - build_stop_color (child->add_child("gradient"),data->stops); - //here the center point and radio + 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 float cx=data->cx; float cy=data->cy; float r =data->r; - //transform - if(mtx){ - transformPoint2D(mtx,&cx,&cy); - } + //adjust coor2vect (&cx,&cy); r=r/kux; - build_vector (root->add_child("param"),"center",cx,cy); - build_param (root->add_child("param"),"radius","real",r); + build_vector (gradient->add_child("param"),"center",cx,cy); + build_param (gradient->add_child("param"),"radius","real",r); - build_param (root->add_child("param"),"loop","bool","false"); - build_param (root->add_child("param"),"zigzag","bool","false"); + build_param (gradient->add_child("param"),"loop","bool","false"); + build_param (gradient->add_child("param"),"zigzag","bool","false"); } } @@ -1164,6 +1123,12 @@ Svg_parser::parser_linearGradient(const xmlpp::Node* node){ float x2 =atof(nodeElement->get_attribute_value("x2").data()); float y2 =atof(nodeElement->get_attribute_value("y2").data()); Glib::ustring link =nodeElement->get_attribute_value("href"); + Glib::ustring transform =nodeElement->get_attribute_value("gradientTransform"); + + //resolve transformations + Matrix* mtx=NULL; + if(!transform.empty()) + mtx=parser_transform (transform); std::list *stops; if(!link.empty()){ @@ -1194,7 +1159,7 @@ Svg_parser::parser_linearGradient(const xmlpp::Node* node){ } } if(stops) - lg.push_back(newLinearGradient(id,x1,y1,x2,y2,stops)); + lg.push_back(newLinearGradient(id,x1,y1,x2,y2,stops,mtx)); } } @@ -1204,15 +1169,27 @@ Svg_parser::parser_radialGradient(const xmlpp::Node* node){ Glib::ustring id =nodeElement->get_attribute_value("id"); float cx =atof(nodeElement->get_attribute_value("cx").data()); float cy =atof(nodeElement->get_attribute_value("cy").data()); + float fx =atof(nodeElement->get_attribute_value("fx").data()); + float fy =atof(nodeElement->get_attribute_value("fy").data()); float r =atof(nodeElement->get_attribute_value("r").data()); Glib::ustring link =nodeElement->get_attribute_value("href");//basic + Glib::ustring transform =nodeElement->get_attribute_value("gradientTransform"); + + if (cx!=fx || cy!=fy) + std::cout<<"SVG Parser: ignoring focus attributes for radial gradient"; + + //resolve transformations + Matrix* mtx=NULL; + if(!transform.empty()) + mtx=parser_transform (transform); + std::list *stops=NULL; if(!link.empty()){ //inkscape always use link, i dont need parser stops here, but it's posible stops=find_colorStop (link); } if(stops) - rg.push_back(newRadialGradient(id,cx,cy,r,stops)); + rg.push_back(newRadialGradient(id,cx,cy,r,stops,mtx)); } } @@ -1257,7 +1234,7 @@ Svg_parser::adjustGamma(float r,float g,float b,float a){ } LinearGradient* -Svg_parser::newLinearGradient(String name,float x1,float y1, float x2,float y2,std::list *stops){ +Svg_parser::newLinearGradient(String name,float x1,float y1, float x2,float y2,std::list *stops, Matrix* transform){ LinearGradient* data; data=(LinearGradient*)malloc(sizeof(LinearGradient)); sprintf(data->name,"%s",name.data()); @@ -1266,11 +1243,12 @@ Svg_parser::newLinearGradient(String name,float x1,float y1, float x2,float y2,s data->x2=x2; data->y2=y2; data->stops=stops; + data->transform=transform; return data; } RadialGradient* -Svg_parser::newRadialGradient(String name,float cx,float cy,float r,std::list *stops){ +Svg_parser::newRadialGradient(String name,float cx,float cy,float r,std::list *stops, Matrix* transform){ RadialGradient* data; data=(RadialGradient*)malloc(sizeof(RadialGradient)); sprintf(data->name,"%s",name.data()); @@ -1278,10 +1256,22 @@ Svg_parser::newRadialGradient(String name,float cx,float cy,float r,std::listcy=cy; data->r=r; data->stops=stops; + data->transform=transform; + return data; +} + +BLine* +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->loop=loop; + data->bline_id=new String(new_guid()); + data->offset_id=new String(new_guid()); return data; } -//builds void Svg_parser::build_gamma(xmlpp::Element* root,float gamma){ root->set_attribute("type","colorcorrect"); @@ -1290,56 +1280,6 @@ Svg_parser::build_gamma(xmlpp::Element* root,float gamma){ root->set_attribute("desc","Gamma"); build_real (root->add_child("param"),"gamma",gamma); } -Matrix* -Svg_parser::build_transform(const String transform){ - Matrix* a=NULL; - String tf(transform); - removeIntoS(&tf); - std::vector tokens=tokenize(tf," "); - std::vector::iterator aux=tokens.begin(); - while(aux!=tokens.end()){ - if((*aux).compare(0,9,"translate")==0){ - float dx,dy; - int inicio,fin; - inicio =(*aux).find_first_of("(")+1; - fin =(*aux).find_first_of(","); - dx =atof((*aux).substr(inicio,fin-inicio).data()); - inicio =(*aux).find_first_of(",")+1; - fin =(*aux).size()-1; - dy =atof((*aux).substr(inicio,fin-inicio).data()); - if(matrixVacia(a)) - a=newMatrix(1,0,0,1,dx,dy); - else - multiplyMatrix(&a,newMatrix(1,0,0,1,dx,dy)); - }else if((*aux).compare(0,5,"scale")==0){ - if(matrixVacia(a)) - a=newMatrix(1,0,0,1,0,0); - }else if((*aux).compare(0,6,"rotate")==0){ - float angle,seno,coseno; - int inicio,fin; - inicio =(*aux).find_first_of("(")+1; - fin =(*aux).size()-1; - angle=getRadian (atof((*aux).substr(inicio,fin-inicio).data())); - seno =sin(angle); - coseno =cos(angle); - if(matrixVacia(a)) - a=newMatrix(coseno,seno,-1*seno,coseno,0,0); - else - multiplyMatrix(&a,newMatrix(coseno,seno,-1*seno,coseno,0,0)); - }else if((*aux).compare(0,6,"matrix")==0){ - int inicio =(*aux).find_first_of('(')+1; - int fin =(*aux).find_first_of(')'); - if(matrixVacia(a)) - a=newMatrix((*aux).substr(inicio,fin-inicio)); - else - multiplyMatrix(&a,newMatrix((*aux).substr(inicio,fin-inicio))); - }else{ - a=newMatrix(1,0,0,1,0,0); - } - aux++; - } - return a; -} void Svg_parser::build_translate(xmlpp::Element* root,float dx,float dy){ @@ -1357,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"); @@ -1371,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); @@ -1379,22 +1319,22 @@ Svg_parser::build_vertice(xmlpp::Element* root , Vertice *p){ build_param (child_comp->add_child("origin"),"","real","0.5000000000"); if(p->split) build_param (child_comp->add_child("split"),"","bool","true"); else build_param (child_comp->add_child("split"),"","bool","false"); - //tangente 1 + //tangent 1 xmlpp::Element *child_t1=child_comp->add_child("t1"); xmlpp::Element *child_rc=child_t1->add_child("radial_composite"); child_rc->set_attribute("type","vector"); - build_param (child_rc->add_child("radius"),"","real",p->radio1); + build_param (child_rc->add_child("radius"),"","real",p->radius1); build_param (child_rc->add_child("theta"),"","angle",p->angle1); - //tangente 2 + //tangent 2 xmlpp::Element *child_t2=child_comp->add_child("t2"); xmlpp::Element *child_rc2=child_t2->add_child("radial_composite"); child_rc2->set_attribute("type","vector"); - build_param (child_rc2->add_child("radius"),"","real",p->radio2); + build_param (child_rc2->add_child("radius"),"","real",p->radius2); build_param (child_rc2->add_child("theta"),"","angle",p->angle2); } 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"); @@ -1403,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++; } } @@ -1496,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"); @@ -1510,7 +1450,7 @@ Svg_parser::nodeStartBasicLayer(xmlpp::Element* root){ return child->add_child("canvas"); } -//metodos extras +/* === COORDINATES & TRANSFORMATIONS ======================================= */ void Svg_parser::coor2vect(float *x,float *y){ float sx, sy; @@ -1525,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; @@ -1559,11 +1499,11 @@ Svg_parser::setTg1(Vertice *p,float p1x,float p1y,float p2x,float p2y){ ag=PI; } ag= (ag*180)/PI; - p->radio1=rd; + p->radius1=rd; 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; @@ -1580,16 +1520,16 @@ Svg_parser::setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y){ rd=sqrt(dx*dx + dy*dy); if(dx>0 && dy>0){ ag=PI + atan(dy/dx); - // printf("caso 180-270\n"); + // printf("case 180-270\n"); }else if(dx>0 && dy<0){ ag=PI + atan(dy/dx); - // printf("caso 90-180\n"); + // printf("case 90-180\n"); }else if(dx<0 && dy<0){ ag=atan(dy/dx); - // printf("caso 0-90\n"); + // printf("case 0-90\n"); }else if(dx<0 && dy>0){ ag= 2*PI+atan(dy/dx); - // printf("caso 270-360\n"); + // printf("case 270-360\n"); }else if(dx==0 && dy>0){ ag=-1*PI/2; }else if(dx==0 && dy<0){ @@ -1603,52 +1543,183 @@ Svg_parser::setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y){ } ag= (ag*180)/PI; ag=ag-180; - p->radio2=rd; + p->radius2=rd; p->angle2=ag; } 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::nuevoVertice(float x,float y){ - Vertice* nuevo; - nuevo=(Vertice*)malloc(sizeof(Vertice)); - nuevo->x=x; - nuevo->y=y; - nuevo->radio1=nuevo->radio2=nuevo->angle1=nuevo->angle2=0; - return nuevo; +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; + return vert; +} + +//matrices +Matrix* +Svg_parser::parser_transform(const String transform){ + Matrix* a=NULL; + String tf(transform); + removeIntoS(&tf); + std::vector tokens=tokenize(tf," "); + std::vector::iterator aux=tokens.begin(); + while(aux!=tokens.end()){ + if((*aux).compare(0,9,"translate")==0){ + float dx,dy; + int start,end; + start =(*aux).find_first_of("(")+1; + end =(*aux).find_first_of(","); + dx =atof((*aux).substr(start,end-start).data()); + start =(*aux).find_first_of(",")+1; + end =(*aux).size()-1; + dy =atof((*aux).substr(start,end-start).data()); + if(matrixIsNull(a)) + a=newMatrix(1,0,0,1,dx,dy); + else + multiplyMatrix(&a,newMatrix(1,0,0,1,dx,dy)); + }else if((*aux).compare(0,5,"scale")==0){ + if(matrixIsNull(a)) + a=newMatrix(1,0,0,1,0,0); + }else if((*aux).compare(0,6,"rotate")==0){ + float angle,seno,coseno; + int start,end; + start =(*aux).find_first_of("(")+1; + end =(*aux).size()-1; + angle=getRadian (atof((*aux).substr(start,end-start).data())); + seno =sin(angle); + coseno =cos(angle); + if(matrixIsNull(a)) + a=newMatrix(coseno,seno,-1*seno,coseno,0,0); + else + multiplyMatrix(&a,newMatrix(coseno,seno,-1*seno,coseno,0,0)); + }else if((*aux).compare(0,6,"matrix")==0){ + int start =(*aux).find_first_of('(')+1; + int end =(*aux).find_first_of(')'); + if(matrixIsNull(a)) + a=newMatrix((*aux).substr(start,end-start)); + else + multiplyMatrix(&a,newMatrix((*aux).substr(start,end-start))); + }else{ + a=newMatrix(1,0,0,1,0,0); + } + aux++; + } + return a; +} + +Matrix* +Svg_parser::newMatrix(Matrix *a){ + Matrix* data; + data=(Matrix*)malloc(sizeof(Matrix)); + data->a=a->a; data->b=a->b; data->c=a->c; + data->d=a->d; data->e=a->e; data->f=a->f; + return data; +} +Matrix* +Svg_parser::newMatrix(float a,float b,float c,float d,float e,float f){ + Matrix* data; + data=(Matrix*)malloc(sizeof(Matrix)); + data->a=a; data->b=b; data->c=c; + data->d=d; data->e=e; data->f=f; + return data; +} +Matrix* +Svg_parser::newMatrix(const String mvector){ + if(!mvector.empty()){ + 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()); + data->d=atof(tokens.at(3).data()); + data->e=atof(tokens.at(4).data()); + data->f=atof(tokens.at(5).data()); + return data; + }else{ + return newMatrix(1,0,0,1,0,0); + } +} +void +Svg_parser::transformPoint2D(Matrix *mtx,float *a,float *b){ + float auxa,auxb; + auxa=0; + auxb=0; + auxa= (*a)*(mtx->a) + (*b)*(mtx->c) + (mtx->e); + auxb= (*a)*(mtx->b) + (*b)*(mtx->d) + (mtx->f); + *a=auxa; + *b=auxb; + return; +} +void +Svg_parser::composeMatrix(Matrix **mtx,Matrix* mtx1,Matrix* mtx2){ + Matrix* aux=newMatrix(0,0,0,0,0,0); + aux->a=(mtx1->a)*(mtx2->a)+(mtx1->c)*(mtx2->b); + aux->b=(mtx1->b)*(mtx2->a)+(mtx1->d)*(mtx2->b); + aux->c=(mtx1->a)*(mtx2->c)+(mtx1->c)*(mtx2->d); + aux->d=(mtx1->b)*(mtx2->c)+(mtx1->d)*(mtx2->d); + aux->e=(mtx1->a)*(mtx2->e)+(mtx1->c)*(mtx2->f)+(mtx1->e); + aux->f=(mtx1->b)*(mtx2->e)+(mtx1->d)*(mtx2->f)+(mtx1->f); + *mtx=aux; +} +void +Svg_parser::multiplyMatrix(Matrix **mtx1,Matrix *mtx2){ + Matrix* aux=newMatrix(0,0,0,0,0,0); + aux->a=((*mtx1)->a)*(mtx2->a)+((*mtx1)->c)*(mtx2->b); + aux->b=((*mtx1)->b)*(mtx2->a)+((*mtx1)->d)*(mtx2->b); + aux->c=((*mtx1)->a)*(mtx2->c)+((*mtx1)->c)*(mtx2->d); + aux->d=((*mtx1)->b)*(mtx2->c)+((*mtx1)->d)*(mtx2->d); + aux->e=((*mtx1)->a)*(mtx2->e)+((*mtx1)->c)*(mtx2->f)+((*mtx1)->e); + aux->f=((*mtx1)->b)*(mtx2->e)+((*mtx1)->d)*(mtx2->f)+((*mtx1)->f); + (*mtx1)->a=aux->a; + (*mtx1)->b=aux->b; + (*mtx1)->c=aux->c; + (*mtx1)->d=aux->d; + (*mtx1)->e=aux->e; + (*mtx1)->f=aux->f; +} +bool +Svg_parser::matrixIsNull(Matrix *mtx){ + if(mtx == NULL) return true; + return false; } +/* === EXTRA METHODS ======================================================= */ + int Svg_parser::extractSubAttribute(const String attribute, String name,String* value){ - int encontro=0; + int encounter=0; if(!attribute.empty()){ String str(attribute); removeS(&str); std::vector tokens=tokenize(str,";"); std::vector::iterator aux=tokens.begin(); while(aux!=tokens.end()){ - int medio= (*aux).find_first_of(":"); - if((*aux).substr(0,medio).compare(name)==0){ - int fin=(*aux).size(); - *value=(*aux).substr(medio+1,fin-medio); + int mid= (*aux).find_first_of(":"); + if((*aux).substr(0,mid).compare(name)==0){ + int end=(*aux).size(); + *value=(*aux).substr(mid+1,end-mid); return 1; } aux++; } } - return encontro; + return encounter; } String Svg_parser::loadAttribute(String name,const String path_style,const String master_style,const String defaultVal){ @@ -1681,6 +1752,97 @@ Svg_parser::loadAttribute(String name,const String path_style,const String maste return value; } +std::vector +Svg_parser::get_tokens_path(String path){ //mini path lexico-parser + std::vector tokens; + String buffer; + int e=0; + unsigned int i=0; + char a; + while(ia=a->a; data->b=a->b; data->c=a->c; - data->d=a->d; data->e=a->e; data->f=a->f; - return data; -} -Matrix* -Svg_parser::newMatrix(float a,float b,float c,float d,float e,float f){ - Matrix* data; - data=(Matrix*)malloc(sizeof(Matrix)); - data->a=a; data->b=b; data->c=c; - data->d=d; data->e=e; data->f=f; - return data; -} -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); - data->a=atof(tokens.at(0).data()); - data->b=atof(tokens.at(1).data()); - data->c=atof(tokens.at(2).data()); - data->d=atof(tokens.at(3).data()); - data->e=atof(tokens.at(4).data()); - data->f=atof(tokens.at(5).data()); - return data; - }else{ - return newMatrix(1,0,0,1,0,0); - } -} -void -Svg_parser::transformPoint2D(Matrix *mtx,float *a,float *b){ - float auxa,auxb; - auxa=0; - auxb=0; - auxa= (*a)*(mtx->a) + (*b)*(mtx->c) + (mtx->e); - auxb= (*a)*(mtx->b) + (*b)*(mtx->d) + (mtx->f); - *a=auxa; - *b=auxb; - return; -} -void -Svg_parser::composeMatrix(Matrix **mtx,Matrix* mtx1,Matrix* mtx2){ - Matrix* aux=newMatrix(0,0,0,0,0,0); - aux->a=(mtx1->a)*(mtx2->a)+(mtx1->c)*(mtx2->b); - aux->b=(mtx1->b)*(mtx2->a)+(mtx1->d)*(mtx2->b); - aux->c=(mtx1->a)*(mtx2->c)+(mtx1->c)*(mtx2->d); - aux->d=(mtx1->b)*(mtx2->c)+(mtx1->d)*(mtx2->d); - aux->e=(mtx1->a)*(mtx2->e)+(mtx1->c)*(mtx2->f)+(mtx1->e); - aux->f=(mtx1->b)*(mtx2->e)+(mtx1->d)*(mtx2->f)+(mtx1->f); - *mtx=aux; -} -void -Svg_parser::multiplyMatrix(Matrix **mtx1,Matrix *mtx2){ - Matrix* aux=newMatrix(0,0,0,0,0,0); - aux->a=((*mtx1)->a)*(mtx2->a)+((*mtx1)->c)*(mtx2->b); - aux->b=((*mtx1)->b)*(mtx2->a)+((*mtx1)->d)*(mtx2->b); - aux->c=((*mtx1)->a)*(mtx2->c)+((*mtx1)->c)*(mtx2->d); - aux->d=((*mtx1)->b)*(mtx2->c)+((*mtx1)->d)*(mtx2->d); - aux->e=((*mtx1)->a)*(mtx2->e)+((*mtx1)->c)*(mtx2->f)+((*mtx1)->e); - aux->f=((*mtx1)->b)*(mtx2->e)+((*mtx1)->d)*(mtx2->f)+((*mtx1)->f); - (*mtx1)->a=aux->a; - (*mtx1)->b=aux->b; - (*mtx1)->c=aux->c; - (*mtx1)->d=aux->d; - (*mtx1)->e=aux->e; - (*mtx1)->f=aux->f; -} -bool -Svg_parser::matrixVacia(Matrix *mtx){ - if(mtx == NULL) return true; - return false; -} float Svg_parser::getRadian(float sexa){ diff --git a/synfig-core/src/modules/mod_svg/svg_parser.h b/synfig-core/src/modules/mod_svg/svg_parser.h index 694add7..6402f69 100644 --- a/synfig-core/src/modules/mod_svg/svg_parser.h +++ b/synfig-core/src/modules/mod_svg/svg_parser.h @@ -10,6 +10,7 @@ ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** Copyright (c) 2007, 2008 Chris Moore ** Copyright (c) 2009 Carlos A. Sosa Navarro +** Copyright (c) 2009 Nikita Kitaev ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -66,16 +67,16 @@ typedef struct stop_t{ typedef struct linear_g{ char name[40]; float x1,x2,y1,y2; - std::list *stops; //paradas de color + std::list *stops; + Matrix *transform; }LinearGradient; typedef struct radial_g{ char name[40]; float cx,cy;//center point - //float fx,fy; - //focus, i dont see it in synfig - //if this value is omitted then will be = cx,cy - float r; //radio radius - std::list *stops; //paradas de color + //float fx,fy; //not supported by Synfig + float r; //radius + std::list *stops; + Matrix *transform; }RadialGradient; typedef struct url_t{ @@ -83,12 +84,20 @@ typedef struct url_t{ void* data; }URL; -typedef struct vertice_t{ +typedef struct Vertex_t{ float x,y; - float radio1,angle1; - float radio2,angle2; + float radius1,angle1; + float radius2,angle2; bool split; -}Vertice; +}Vertex; + +typedef struct bline_t{ + std::list *points; + bool loop; + String* bline_id; + String* offset_id; +}BLine; + class Svg_parser { //this is inkscape oriented in some cases @@ -107,7 +116,6 @@ private: int uid; int kux,set_canvas; float ox,oy; - bool loop;//aux :D //urls std::list lg; std::list rg; @@ -118,40 +126,49 @@ public: //String get_id(); //void set_id(String source); -private: //parser bucle +private: + /* === PARSERS ==================================== */ void parser_node(const xmlpp::Node* node); //parser headers void parser_svg(const xmlpp::Node* node); void parser_canvas(const xmlpp::Node* node); - //layers - void parser_layer(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent); - void parser_path(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent); - void parser_polygon(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent); - void parser_rect(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent); - //defs + void parser_graphics(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx_parent); + + /* === LAYER PARSERS ============================== */ + void parser_layer(const xmlpp::Node* node,xmlpp::Element* root,String parent_style,Matrix* mtx); + void parser_rect(const xmlpp::Element* nodeElement,xmlpp::Element* root,String fill, String fill_opacity, String opacity); + /* === CONVERT TO PATH PARSERS ==================== */ + std::list parser_path_polygon(Glib::ustring polygon_points, Matrix* mtx); + std::list parser_path_d(String path_d,Matrix* mtx); + + /* === EFFECTS PARSERS ============================ */ + void parser_effects(const xmlpp::Element* nodeElement,xmlpp::Element* root,String parent_style,Matrix* mtx); + + /* === DEFS PARSERS =============================== */ void parser_defs(const xmlpp::Node* node); void parser_linearGradient(const xmlpp::Node* node); void parser_radialGradient(const xmlpp::Node* node); ColorStop* newColorStop(String color,float opacity,float pos); - LinearGradient* newLinearGradient(String name,float x1,float y1, float x2,float y2,std::list *stops); - RadialGradient* newRadialGradient(String name,float cx,float cy,float r,std::list *stops); - //builds urls - void AdjustPointUrl(); + LinearGradient* newLinearGradient(String name,float x1,float y1, float x2,float y2,std::list *stops, Matrix* transform); + RadialGradient* newRadialGradient(String name,float cx,float cy,float r,std::list *stops, Matrix* transform); + BLine* newBLine(std::list *points,bool loop); + + /* === BUILDS ===================================== */ + void build_transform(xmlpp::Element* root,Matrix* mtx); std::list* find_colorStop(String name); - void build_url(xmlpp::Element* root, String name,Matrix *mtx); + void build_fill(xmlpp::Element* root, String name,Matrix *mtx); void build_linearGradient(xmlpp::Element* root,LinearGradient* data,Matrix* mtx); void build_radialGradient(xmlpp::Element* root,RadialGradient* data,Matrix* mtx); void build_stop_color(xmlpp::Element* root, std::list *stops); void build_stop_color(xmlpp::Element* root, std::list *stops,String name); Color adjustGamma(float r,float g,float b,float a); - //builds + void build_gamma(xmlpp::Element* root,float gamma); - Matrix* build_transform(const String transform); void build_rotate(xmlpp::Element* root,float dx,float dy,float angle); void build_translate(xmlpp::Element* root,float dx,float dy); - void build_points(xmlpp::Element* root,std::list p); - void build_vertice(xmlpp::Element* root , Vertice *p); - void build_bline(xmlpp::Element* root,std::list p,bool loop,String blinegui); + void build_points(xmlpp::Element* root,std::list p); + void build_vertex(xmlpp::Element* root , Vertex *p); + void build_bline(xmlpp::Element* root,std::list p,bool loop,String blineguid); void build_param (xmlpp::Element* root,String name,String type,String value); void build_param (xmlpp::Element* root,String name,String type,float value); void build_param (xmlpp::Element* root,String name,String type,int value); @@ -161,37 +178,43 @@ private: //parser bucle void build_vector (xmlpp::Element* root,String name,float x,float y,String guid); void build_color(xmlpp::Element* root,float r,float g,float b,float a); xmlpp::Element* nodeStartBasicLayer(xmlpp::Element* root); + xmlpp::Element* nodeStartBasicLayer(xmlpp::Element* root, String name); + + /* === COORDINATES & TRANSFORMATIONS ============== */ //points,etc void coor2vect(float *x,float *y); - void setTg2(Vertice* p,float p1x,float p1y,float p2x,float p2y); - void setTg1(Vertice *p,float p1x,float p1y,float p2x,float p2y); - void setSplit(Vertice* p,bool val); - int isFirst(Vertice* nodo,float a, float b); - Vertice* nuevoVertice(float x,float y); + void setTg2(Vertex* p,float p1x,float p1y,float p2x,float p2y); + void setTg1(Vertex *p,float p1x,float p1y,float p2x,float p2y); + void setSplit(Vertex* p,bool val); + int isFirst(Vertex* nodo,float a, float b); + Vertex* newVertex(float x,float y); //matrix operations + Matrix* parser_transform(const String transform); Matrix* newMatrix(float a,float b,float c,float d,float e,float f); Matrix* newMatrix(const String mvector); Matrix* newMatrix(Matrix *a); void transformPoint2D(Matrix *mtx,float *a,float *b); - bool matrixVacia(Matrix* mtx); + bool matrixIsNull(Matrix* mtx); void composeMatrix(Matrix **mtx,Matrix *mtx1,Matrix *mtx2); void multiplyMatrix(Matrix **mtx1,Matrix *mtx2); float getRadian(float sexa); + + /* === EXTRA METHODS ============================== */ + //attributes int extractSubAttribute(const String attribute, String name,String* value); String loadAttribute(String name,const String path_style,const String master_style,const String subattribute,const String defaultVal); String loadAttribute(String name,const String path_style,const String master_style,const String defaultVal); std::vector get_tokens_path(String path); - std::list > parser_path_d(String path_d,Matrix* mtx); int randomLetter(); int getRed(String hex); int getGreen(String hex); int getBlue(String hex); int hextodec(String hex); float getDimension(const String ac); - //funciones string + //string functions void removeS(String *input); void removeIntoS(String *input); std::vector tokenize(const String& str,const String& delimiters); diff --git a/synfig-studio/images/Makefile.am b/synfig-studio/images/Makefile.am index 412cfe1..0d703f3 100644 --- a/synfig-studio/images/Makefile.am +++ b/synfig-studio/images/Makefile.am @@ -41,7 +41,6 @@ EXTRA_DIST = \ mirror_icon.sif \ navigator_icon.sif \ normal_icon.sif \ - null_icon.sif \ pastecanvas_icon.sif \ polygon_icon.sif \ real_icon.sif \ @@ -110,6 +109,8 @@ IMAGES = \ keyframe_icon.$(EXT) \ reset_colors_icon.$(EXT) \ swap_colors_icon.$(EXT) \ + rotate_icon.$(EXT) \ + scale_icon.$(EXT) \ smooth_move_icon.$(EXT) \ width_icon.$(EXT) \ rectangle_icon.$(EXT) \ @@ -118,7 +119,6 @@ IMAGES = \ sketch_icon.$(EXT) \ fill_icon.$(EXT) \ normal_icon.$(EXT) \ - null_icon.$(EXT) \ select_all_child_layers_icon.$(EXT) \ sif_icon.$(EXT) \ synfig_icon.$(EXT) \ diff --git a/synfig-studio/images/null_icon.sif b/synfig-studio/images/null_icon.sif deleted file mode 100644 index 079b1d2..0000000 --- a/synfig-studio/images/null_icon.sif +++ /dev/null @@ -1,65 +0,0 @@ - - - Untitled0 - - - - - - - - - - - - - 0.0000000000 - 0.0500000007 - - - - - - - - - - - - - - - - - - - - - 0.000000 - 0.000000 - 0.000000 - 1.000000 - - - - - 0.1000000015 - -0.1000000015 - - - - - 0.2000000030 - 0.2000000030 - - - - - - - - - - diff --git a/synfig-studio/images/rotate_icon.sif b/synfig-studio/images/rotate_icon.sif new file mode 100644 index 0000000..7fab72e --- /dev/null +++ b/synfig-studio/images/rotate_icon.sif @@ -0,0 +1,2393 @@ + + + Synfig Studio Rotate Icon + Placed in the Public Domain in 2007 by Chris Norman (pixelgeek) + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + 0.300000 + 0.300000 + 0.300000 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 0.000000 + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + -2.5961599350 + 2.5961599350 + + + + + 2.6703450680 + -2.1673052311 + + + + + -3.2451999187 + 0.8112999797 + + + + + 1.7848598957 + 0.8112999797 + + + + + 2.2716398239 + -0.3245199919 + + + + + -2.9206800461 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + 0.300000 + 0.300000 + 0.300000 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 0.000000 + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + -2.5961599350 + 2.5961599350 + + + + + 2.6703450680 + -2.1673052311 + + + + + -2.2716398239 + -1.4603400230 + + + + + 2.7584199905 + -1.4603400230 + + + + + 3.2451999187 + -2.5961599350 + + + + + -1.9471199512 + -2.5961599350 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.4867799878 + 0.0000000000 + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -3.3425526619 + 0.0000000000 + + + + + 0.5516827703 + 3.1153881550 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -3.0829367638 + 0.2596156895 + + + + + 0.2920670807 + 2.8557724953 + + + + + + + + + + + + + + + + + + + + + + -1.7848598957 + 1.9471199512 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -1.0384613276 + -1.4278886318 + + + + + 1.8173112869 + 0.6490369439 + + + + + + + + + + + + + + + + + + + + + + -1.7848600149 + 1.9471199512 + + + + + 2.9206800461 + -4.0564999580 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -1.1146180630 + -2.0209679604 + + + + + 2.5569021702 + 0.9162484407 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -0.8734864593 + -1.7986452579 + + + + + 2.3052372932 + 0.6841450930 + + + + + + + + + + + + + + + + + + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -0.8288472295 + -1.2672259808 + + + + + 1.9548872709 + 0.7829568982 + + + + + + + + + + + + + + + + + + + + + + 2.0723481178 + -2.8204009533 + + + + + -2.8938808441 + 3.8485348225 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + 0.9735599756 + -0.1622599959 + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -4.0240430832 + -2.9855804443 + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 0.8437545300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.4927937984 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1033717394 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9471199512 + 2.7584199905 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.6226016283 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.2331780195 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.303279 + 0.295082 + 0.303279 + 0.333333 + + + + + -0.1894220859 + -0.1675494760 + + + + + 0.1000007167 + 0.1000007167 + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -4.0240430832 + -2.9855804443 + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 0.8437545300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.4927937984 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1033717394 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9471199512 + 2.7584199905 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.6226016283 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.2331780195 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + 1.1358199120 + 2.9206800461 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 2.4014453888 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.8233203888 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9795694351 + 1.1033670902 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848576307 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848598957 + 2.2716398239 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 2.5312533379 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247404 + 1.000000 + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + 1.1358199120 + 2.9206800461 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 2.4014453888 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.8233203888 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9795694351 + 1.1033670902 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848576307 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848598957 + 2.2716398239 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 2.5312533379 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/synfig-studio/images/scale_icon.sif b/synfig-studio/images/scale_icon.sif new file mode 100644 index 0000000..cd3c687 --- /dev/null +++ b/synfig-studio/images/scale_icon.sif @@ -0,0 +1,3494 @@ + + + Synfig Studio Scale Icon + Placed in the Public Domain in 2007 by Chris Norman (pixelgeek) + + + + + + + + + + + + + + + + + + + -0.6717824340 + 8.4043684006 + + + + + -0.4427109957 + -1.6098945141 + + + + + + 0.064115 + 0.064115 + 0.064115 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 0.000000 + + + + + + + + + + + + + + -1.1483865976 + 1.7675857544 + + + + + 2.6703450680 + -2.1673052311 + + + + + -1.6225999594 + -2.2716398239 + + + + + 2.7584199905 + -2.2716398239 + + + + + 3.4074599743 + -3.0829398632 + + + + + -1.1358199120 + -3.0829398632 + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + -1.8173098564 + -2.5961568356 + + + + + 3.1153881550 + 1.5576940775 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -1.5576940775 + -2.3365411758 + + + + + 2.8557724953 + 1.2980784178 + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -1.2980784178 + -2.0769255161 + + + + + 2.5961568356 + 1.0384627581 + + + + + + + + + + + + + + + + + + + + + + -1.7848600149 + 1.9471199512 + + + + + 2.9206800461 + -4.0564999580 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + -3.1153881550 + 0.2596156895 + + + + + 0.0000000000 + 2.8557724953 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -2.8557724953 + 0.5192313790 + + + + + -0.2596156895 + 2.5961568356 + + + + + + + + + + + + + + + + + + + + + + -1.7848598957 + 1.9471199512 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -0.8112969995 + -1.1682728529 + + + + + 1.2656285763 + 0.3894212246 + + + + + + + + + + + + + + + + + + + + + + -1.7848600149 + 1.9471199512 + + + + + 2.9206800461 + -4.0564999580 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -2.2769572735 + -1.7023979425 + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 0.6490399837 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 1.2980799675 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + -0.6490399837 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.9788787961 + -1.5747181177 + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 0.6490399837 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + 1.2980799675 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.9471199512 + -0.6490399837 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.2716398239 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.9471199512 + 1.9471199512 + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -0.0957598835 + -2.7983164787 + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 2.2716398239 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.7848598957 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.2980799675 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 0.8112999797 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 0.3245199919 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + -0.1622599959 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0286085363 + 0.0443108305 + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 2.2716398239 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.7848598957 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 1.2980799675 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 0.8112999797 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 0.3245199919 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + -0.1622599959 + 0.0000000000 + + + + + + + + + + + + + + + + + + + + + -1.9471199512 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1.6225999594 + 2.1093800068 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.064115 + 0.247404 + 1.000000 + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.7130378485 + 2.0215976238 + + + + + -2.0641574860 + 1.6385580301 + + + + + 0.7235190868 + -0.7979990244 + + + + + -0.0033114245 + -1.5410472155 + + + + + 1.8586863279 + -1.5304071903 + + + + + 1.8513576984 + 0.3191995919 + + + + + 1.0852786303 + -0.4468794465 + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + + -1.7236778736 + 1.7875177860 + + + + + -1.8407176733 + 1.6704779863 + + + + + 0.9682388306 + -0.7979990244 + + + + + 0.4222880602 + -1.3601673841 + + + + + 1.6990864277 + -1.3601673841 + + + + + 1.6704779863 + -0.1063998714 + + + + + 1.1065586805 + -0.6703191996 + + + + + + diff --git a/synfig-studio/po/POTFILES.in b/synfig-studio/po/POTFILES.in index e062169..cbd89f3 100644 --- a/synfig-studio/po/POTFILES.in +++ b/synfig-studio/po/POTFILES.in @@ -191,10 +191,6 @@ src/gtkmm/state_polygon.cpp src/gtkmm/state_polygon.h src/gtkmm/state_rectangle.cpp src/gtkmm/state_rectangle.h -src/gtkmm/state_rotate.cpp -src/gtkmm/state_rotate.h -src/gtkmm/state_scale.cpp -src/gtkmm/state_scale.h src/gtkmm/state_sketch.cpp src/gtkmm/state_sketch.h src/gtkmm/state_smoothmove.cpp diff --git a/synfig-studio/po/ru.po b/synfig-studio/po/ru.po index d612d11..f2e4605 100755 --- a/synfig-studio/po/ru.po +++ b/synfig-studio/po/ru.po @@ -1,9 +1,10 @@ +# msgid "" msgstr "" "Project-Id-Version: Synfig Studio\n" "Report-Msgid-Bugs-To: http://synfig.org/Bugs\n" "POT-Creation-Date: 2009-10-07 04:46+0400\n" -"PO-Revision-Date: 2009-10-09 21:06+0400\n" +"PO-Revision-Date: 2009-12-24 19:21+0500\n" "Last-Translator: Alexandre Prokoudine \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -14,7 +15,7 @@ msgstr "" #: ../synfigstudio.desktop.in.h:1 msgid "Create and edit 2D animations and compositions" -msgstr "Создание двухмерной векторной анимации" +msgstr "Создание 2D векторной анимации и графики" #: ../synfigstudio.desktop.in.h:2 ../src/gtkmm/app.cpp:1188 #: ../src/gtkmm/toolbox.cpp:360 @@ -54,7 +55,7 @@ msgstr "Участники проекта:" #. TRANSLATORS: change this to your name, separate multiple names with \n #: ../src/gtkmm/about.cpp:177 msgid "translator-credits" -msgstr "Александр Прокудин " +msgstr "Александр Прокудин \nКонстантин Дмитриев " #: ../src/gtkmm/about.cpp:204 #, c-format @@ -64,7 +65,7 @@ msgid "" "%s\n" msgstr "" "\n" -"Нестабильная версия:\n" +"Сборка:\n" "%s\n" #: ../src/gtkmm/about.cpp:209 @@ -103,7 +104,7 @@ msgstr "GNU G++ %d.%d.%d\n" #: ../src/gtkmm/about.cpp:224 msgid "Using:\n" -msgstr "Использование:\n" +msgstr "Используется:\n" #: ../src/gtkmm/about.cpp:225 #, c-format @@ -137,7 +138,7 @@ msgstr "Сло_й" #: ../src/gtkmm/app.cpp:738 msgid "Show/Hide Ducks" -msgstr "Показать/скрыть ручки" +msgstr "Показать/скрыть уТочки" #: ../src/gtkmm/app.cpp:739 msgid "Preview Quality" @@ -183,7 +184,7 @@ msgstr "Импортировать" #: ../src/gtkmm/app.cpp:774 ../src/gtkmm/canvasview.cpp:1461 msgid "Render" -msgstr "Отрисовка" +msgstr "Визуализация" #: ../src/gtkmm/app.cpp:775 ../src/gtkmm/canvasview.cpp:1464 #: ../src/gtkmm/dialog_preview.cpp:171 @@ -213,11 +214,11 @@ msgstr "Закрыть документ" #: ../src/gtkmm/app.cpp:789 ../src/gtkmm/canvasview.cpp:1491 msgid "Select All Ducks" -msgstr "Выбрать все ручки" +msgstr "Выделить все уТочки" #: ../src/gtkmm/app.cpp:790 ../src/gtkmm/canvasview.cpp:1495 msgid "Unselect All Ducks" -msgstr "Снять выделение с ручек" +msgstr "Снять выделение со всех уТочек" #: ../src/gtkmm/app.cpp:791 ../src/gtkmm/canvasview.cpp:1499 msgid "Select All Layers" @@ -233,27 +234,27 @@ msgstr "Свойства" #: ../src/gtkmm/app.cpp:795 ../src/gtkmm/canvasview.cpp:1669 msgid "Show Position Ducks" -msgstr "Показывать ручки положения" +msgstr "Показывать уТочки положения" #: ../src/gtkmm/app.cpp:796 ../src/gtkmm/canvasview.cpp:1671 msgid "Show Vertex Ducks" -msgstr "Показывать ручки вершин" +msgstr "Показывать уТочки вершин" #: ../src/gtkmm/app.cpp:797 ../src/gtkmm/canvasview.cpp:1670 msgid "Show Tangent Ducks" -msgstr "Показывать ручки касательных" +msgstr "Показывать уТочки касательных" #: ../src/gtkmm/app.cpp:798 ../src/gtkmm/canvasview.cpp:1672 msgid "Show Radius Ducks" -msgstr "Показывать ручки радиусов" +msgstr "Показывать уТочки радиусов" #: ../src/gtkmm/app.cpp:799 ../src/gtkmm/canvasview.cpp:1673 msgid "Show Width Ducks" -msgstr "Показывать ручки толщины" +msgstr "Показывать уТочки толщины" #: ../src/gtkmm/app.cpp:800 ../src/gtkmm/canvasview.cpp:1674 msgid "Show Angle Ducks" -msgstr "Показывать ручки углов" +msgstr "Показывать уТочки углов" #: ../src/gtkmm/app.cpp:801 ../src/gtkmm/canvasview.cpp:1522 msgid "Use Parametric Renderer" @@ -621,7 +622,7 @@ msgid "" "\n" "http://www.synfig.org/Documentation" msgstr "" -"Документация по Synfig Studio доступна на сайте:\n" +"Документация по Synfig Studio доступна по адресу:\n" "\n" "http://www.synfig.org/Documentation" @@ -926,7 +927,7 @@ msgstr "Отдалить временную шкалу" #: ../src/gtkmm/canvasview.cpp:2059 ../src/gtkmm/canvasview.cpp:2532 msgid "Select All Children" -msgstr "Выделить всех потомков" +msgstr "Выделить содержимое" #: ../src/gtkmm/canvasview.cpp:2345 msgid "-MODIFIED" @@ -951,7 +952,7 @@ msgstr "Не в режиме анимации" #: ../src/gtkmm/canvasview.cpp:2798 ../src/gtkmm/iconcontroller.cpp:185 #: ../src/gtkmm/keyframedial.cpp:59 msgid "All Keyframes Locked" -msgstr "Все ключевые кадры заперты" +msgstr "Все ключевые кадры заблокированы" #: ../src/gtkmm/canvasview.cpp:2808 ../src/gtkmm/iconcontroller.cpp:187 msgid "Future Keyframes Locked" @@ -963,7 +964,7 @@ msgstr "Прошлые ключевые кадры заперты" #: ../src/gtkmm/canvasview.cpp:2828 ../src/gtkmm/iconcontroller.cpp:188 msgid "No Keyframes Locked" -msgstr "Нет запертых ключевых кадров" +msgstr "Нет заблокированных ключевых кадров" #: ../src/gtkmm/canvasview.cpp:3587 msgid "Change Waypoint Group" @@ -1145,15 +1146,15 @@ msgstr "_Масштаб:" #: ../src/gtkmm/dialog_preview.cpp:129 ../src/gtkmm/renddesc.cpp:546 msgid "_Frames per second" -msgstr "_Кадров/с:" +msgstr "_Кадров в секунду:" #: ../src/gtkmm/dialog_preview.cpp:138 ../src/gtkmm/renddesc.cpp:532 msgid "Time Settings" -msgstr "Временные параметры" +msgstr "Параметры времени" #: ../src/gtkmm/dialog_preview.cpp:140 ../src/gtkmm/renddesc.cpp:534 msgid "Time Settings" -msgstr "Временные параметры" +msgstr "Параметры времени" #: ../src/gtkmm/dialog_setup.cpp:73 msgid "Synfig Studio Setup" @@ -1165,11 +1166,11 @@ msgstr "Визуально линейный выбор цвета" #: ../src/gtkmm/dialog_setup.cpp:81 msgid "Use Only a Single Thread" -msgstr "Использовать только одну нить" +msgstr "Использовать только один поток" #: ../src/gtkmm/dialog_setup.cpp:83 msgid "Restrict Real-Valued Ducks to Top Right Quadrant" -msgstr "Ограничить верхним правым квадрантом ручки с реальным значением" +msgstr "Ограничить верхним правым квадрантом уТочки, задающие числовое значением" #: ../src/gtkmm/dialog_setup.cpp:84 msgid "Scale New Imported Images to Fit Canvas" @@ -1209,7 +1210,7 @@ msgstr "Пиксел" #: ../src/gtkmm/dialog_setup.cpp:181 msgid "Points" -msgstr "Пункт" +msgstr "Точка" #: ../src/gtkmm/dialog_setup.cpp:182 msgid "Inches" @@ -1337,7 +1338,7 @@ msgstr "Количество кадров в секунду:" #: ../src/gtkmm/dialog_setup.cpp:289 msgid "New Document FPS" -msgstr "По умолчанию" +msgstr "Частота кадров" #: ../src/gtkmm/dialog_setup.cpp:291 msgid "Frames per second of the new created document" @@ -1345,11 +1346,11 @@ msgstr "Количество кадров в секунду в каждом но #: ../src/gtkmm/dialog_setup.h:51 msgid "Custom Size" -msgstr "Заказной размер" +msgstr "Другой размер" #: ../src/gtkmm/dialog_setup.h:54 msgid "Custom fps" -msgstr "Заказное количество" +msgstr "Другоая частота кадров" #: ../src/gtkmm/dialog_soundselect.cpp:60 msgid "Sound Select" @@ -1361,7 +1362,7 @@ msgstr "Параметры звука" #: ../src/gtkmm/dialog_soundselect.cpp:68 msgid "Sound Parameters" -msgstr "Параметры" +msgstr "Параметры звука" #: ../src/gtkmm/dialog_soundselect.cpp:76 msgid "_Sound File" @@ -1369,7 +1370,7 @@ msgstr "_Звуковой файл" #: ../src/gtkmm/dialog_soundselect.cpp:79 msgid "Time _Offset" -msgstr "_Смещение во времени" +msgstr "_Смещение времени" #: ../src/gtkmm/dialog_tooloptions.cpp:56 #: ../src/gtkmm/dialog_tooloptions.cpp:78 @@ -1458,7 +1459,7 @@ msgstr "Переход" #: ../src/gtkmm/dock_history.cpp:216 ../src/gtkmm/keyframetree.cpp:96 msgid "(JMP)" -msgstr "(ПХД)" +msgstr "(перейти)" #: ../src/gtkmm/dock_history.cpp:228 msgid "Action" @@ -1473,7 +1474,8 @@ msgstr "Очистить историю" msgid "" "You will not be able to undo any changes that you have made!\n" "Are you sure you want to clear the undo stack?" -msgstr "Вы не сможете " +msgstr "Вы не сможете отменить сделанные ранее изменения!\n" +"Уверены, что хотите очистить историю действий?" #: ../src/gtkmm/dock_history.cpp:284 msgid "" @@ -1682,7 +1684,7 @@ msgstr "Изолировать" #: ../src/gtkmm/iconcontroller.cpp:173 ../src/gtkmm/layeractionmanager.cpp:135 msgid "Select All Child Layers" -msgstr "Выбрать все слои-потомки" +msgstr "Выбрать все вложенные слои" #: ../src/gtkmm/iconcontroller.cpp:181 msgid "MetaData" @@ -1690,27 +1692,27 @@ msgstr "Метаданные" #: ../src/gtkmm/iconcontroller.cpp:198 ../src/gtkmm/toggleducksdial.cpp:55 msgid "Toggle position ducks" -msgstr "Переключить ручки положения" +msgstr "Переключить уТочки положения" #: ../src/gtkmm/iconcontroller.cpp:199 ../src/gtkmm/toggleducksdial.cpp:56 msgid "Toggle vertex ducks" -msgstr "Переключить ручки вершин" +msgstr "Переключить уТочки вершин" #: ../src/gtkmm/iconcontroller.cpp:200 ../src/gtkmm/toggleducksdial.cpp:57 msgid "Toggle tangent ducks" -msgstr "Переключить ручки касательных" +msgstr "Переключить уТочки касательных" #: ../src/gtkmm/iconcontroller.cpp:201 ../src/gtkmm/toggleducksdial.cpp:58 msgid "Toggle radius ducks" -msgstr "Переключить ручки радиусов" +msgstr "Переключить уТочки радиусов" #: ../src/gtkmm/iconcontroller.cpp:202 ../src/gtkmm/toggleducksdial.cpp:59 msgid "Toggle width ducks" -msgstr "Переключить ручки ширины" +msgstr "Переключить уТочки ширины" #: ../src/gtkmm/iconcontroller.cpp:203 ../src/gtkmm/toggleducksdial.cpp:60 msgid "Toggle angle ducks" -msgstr "Переключить ручки углов" +msgstr "Переключить уТочки углов" #: ../src/gtkmm/iconcontroller.cpp:205 msgid "Toggle show grid" @@ -1738,7 +1740,7 @@ msgstr "Параметры предпросмотра" #: ../src/gtkmm/iconcontroller.cpp:214 msgid "Render Options Dialog" -msgstr "Параметры отрисовки" +msgstr "Параметры визуализации" #: ../src/gtkmm/iconcontroller.cpp:216 msgid "CVS Add" @@ -1783,12 +1785,12 @@ msgstr "Векторный карандаш" #: ../src/gtkmm/iconcontroller.cpp:228 ../src/gtkmm/state_sketch.cpp:325 #: ../src/gtkmm/state_sketch.cpp:399 msgid "Sketch Tool" -msgstr "Растровый карандаш" +msgstr "Эскиз" #: ../src/gtkmm/iconcontroller.cpp:229 ../src/gtkmm/state_circle.cpp:432 #: ../src/gtkmm/state_circle.cpp:496 msgid "Circle Tool" -msgstr "Круги и эллипсы" +msgstr "Окружности" #: ../src/gtkmm/iconcontroller.cpp:230 ../src/gtkmm/state_rectangle.cpp:352 #: ../src/gtkmm/state_rectangle.cpp:408 @@ -1797,7 +1799,7 @@ msgstr "Прямоугольник" #: ../src/gtkmm/iconcontroller.cpp:231 ../src/gtkmm/state_smoothmove.cpp:177 msgid "SmoothMove Tool" -msgstr "Перемещение" +msgstr "Деформация" #: ../src/gtkmm/iconcontroller.cpp:232 ../src/gtkmm/state_scale.cpp:167 #: ../src/gtkmm/state_scale.cpp:193 @@ -2050,7 +2052,7 @@ msgstr "На этом холсте нет ключевых кадров" #: ../src/gtkmm/layeractionmanager.cpp:129 msgid "Amount" -msgstr "Число" +msgstr "Величина" #: ../src/gtkmm/layeractionmanager.cpp:365 msgid "Paste" @@ -2158,7 +2160,7 @@ msgstr "Остановить отрисовку" #: ../src/gtkmm/preview.cpp:382 msgid "Re-Preview" -msgstr "Открыть диалог параметров" +msgstr "Пересчитать" #: ../src/gtkmm/preview.cpp:388 msgid "Erase All" @@ -2262,11 +2264,11 @@ msgstr "_Время начала:" #: ../src/gtkmm/renddesc.cpp:574 msgid "Locks and Links" -msgstr "Запирание и связи" +msgstr "Блокировки и связи" #: ../src/gtkmm/renddesc.cpp:576 msgid "Locks and Links" -msgstr "Запирание и связи" +msgstr "Блокировки и связи" #: ../src/gtkmm/renddesc.cpp:597 msgid "Focus Point" @@ -2282,7 +2284,7 @@ msgstr "_Точка фокусировки" #: ../src/gtkmm/render.cpp:63 ../src/gtkmm/render.cpp:179 msgid "Render Settings" -msgstr "Параметры отрисовки" +msgstr "Параметры визуализации" #: ../src/gtkmm/render.cpp:69 msgid "Use _current frame" @@ -2354,7 +2356,7 @@ msgstr "" #: ../src/gtkmm/render.cpp:318 msgid "Rendering " -msgstr "Отрисовка" +msgstr "Визуализация" #: ../src/gtkmm/render.cpp:346 msgid "File rendered successfully" @@ -2366,7 +2368,7 @@ msgstr "Увеличить разрешение для просмотра" #: ../src/gtkmm/resolutiondial.cpp:57 msgid "Decrease Display Resolution" -msgstr "Уменьшить разрешение для просмотра" +msgstr "Уменьшить разрешение просмотра" #: ../src/gtkmm/resolutiondial.cpp:58 msgid "Low Res" @@ -2396,19 +2398,19 @@ msgstr "Создать кривую области" #: ../src/gtkmm/state_draw.cpp:414 ../src/gtkmm/state_polygon.cpp:326 #: ../src/gtkmm/state_rectangle.cpp:343 ../src/gtkmm/state_star.cpp:443 msgid "Create Outline BLine" -msgstr "Создать кривую абриса" +msgstr "Создать кривую контура" #: ../src/gtkmm/state_bline.cpp:363 ../src/gtkmm/state_circle.cpp:406 #: ../src/gtkmm/state_polygon.cpp:327 ../src/gtkmm/state_rectangle.cpp:344 #: ../src/gtkmm/state_star.cpp:444 msgid "Create Curve Gradient BLine" -msgstr "Создать градиентную кривую" +msgstr "Создать градиент по кривой" #: ../src/gtkmm/state_bline.cpp:364 ../src/gtkmm/state_circle.cpp:407 #: ../src/gtkmm/state_polygon.cpp:328 ../src/gtkmm/state_rectangle.cpp:345 #: ../src/gtkmm/state_star.cpp:445 msgid "Create Plant BLine" -msgstr "Создать кривую растения" +msgstr "Создать кривую с растениями" #: ../src/gtkmm/state_bline.cpp:365 ../src/gtkmm/state_circle.cpp:408 #: ../src/gtkmm/state_polygon.cpp:329 ../src/gtkmm/state_star.cpp:446 @@ -2554,7 +2556,7 @@ msgstr "" #: ../src/gtkmm/state_bline.cpp:1378 #: ../src/synfigapp/actions/blinepointtangentmerge.cpp:56 msgid "Merge Tangents" -msgstr "Объединить касательные" +msgstr "Связать касательные" #: ../src/gtkmm/state_bline.cpp:1385 #: ../src/synfigapp/actions/blinepointtangentsplit.cpp:56 @@ -2644,7 +2646,7 @@ msgstr "" #: ../src/gtkmm/state_draw.cpp:410 msgid "Auto Loop" -msgstr "Автоцикл" +msgstr "Замыкать автоматически" #: ../src/gtkmm/state_draw.cpp:411 msgid "Auto Extend" @@ -2704,7 +2706,7 @@ msgstr "" #: ../src/gtkmm/state_gradient.cpp:271 msgid "Gradient Type" -msgstr "Тип градиент" +msgstr "Тип градиента" #: ../src/gtkmm/state_gradient.cpp:272 msgid "Determines the type of Gradient used" @@ -2809,7 +2811,7 @@ msgstr "Отменить штрих" #: ../src/gtkmm/state_sketch.cpp:241 msgid "Show Sketch" -msgstr "Показывать эскиз" +msgstr "Отображать эскиз" #: ../src/gtkmm/state_sketch.cpp:256 ../src/gtkmm/state_sketch.cpp:257 msgid "Undo Last Stroke" @@ -2818,7 +2820,7 @@ msgstr "Отменить последний штрих" #: ../src/gtkmm/state_sketch.cpp:280 ../src/gtkmm/state_sketch.cpp:281 #: ../src/gtkmm/state_sketch.cpp:292 ../src/gtkmm/state_sketch.cpp:293 msgid "Save Sketch As..." -msgstr "Очистить эскиз как..." +msgstr "Сохранить эскиз как..." #: ../src/gtkmm/state_sketch.cpp:304 ../src/gtkmm/state_sketch.cpp:305 msgid "Open a Sketch" @@ -3019,7 +3021,7 @@ msgstr "/Contact" #. TRANSLATORS: Help menu entry #: ../src/gtkmm/toolbox.cpp:273 msgid "Keyboard Shortcuts" -msgstr "Клавиатурные комбинации" +msgstr "Комбинации клавиш" #. TRANSLATORS: a wiki page #: ../src/gtkmm/toolbox.cpp:273 @@ -3047,7 +3049,7 @@ msgstr "_Справка" #: ../src/gtkmm/toolbox.cpp:290 msgid "New..." -msgstr "Создать" +msgstr "Создать..." #: ../src/gtkmm/toolbox.cpp:291 msgid "Open..." @@ -3071,7 +3073,7 @@ msgstr "О Synfig Studio" #: ../src/gtkmm/widget_canvaschooser.cpp:115 msgid "Other..." -msgstr "Другое..." +msgstr "Другой..." #: ../src/gtkmm/widget_canvaschooser.cpp:136 msgid "Choose Canvas" @@ -3135,11 +3137,11 @@ msgstr "V" #: ../src/gtkmm/widget_coloredit.cpp:382 msgid "Alpha" -msgstr "Альфа" +msgstr "Прозрачность" #: ../src/gtkmm/widget_defaults.cpp:215 msgid "Outline Color" -msgstr "Цвет обводки" +msgstr "Цвет контура" #: ../src/gtkmm/widget_defaults.cpp:223 msgid "Fill Color" @@ -3271,11 +3273,11 @@ msgstr "Интерполяция на в_ыходе" #: ../src/gtkmm/widget_waypoint.cpp:175 msgid "TCB Parameters" -msgstr "Параметры TCB" +msgstr "TCB-параметры" #: ../src/gtkmm/widget_waypoint.cpp:177 msgid "TCB Parameter" -msgstr "Параметр TCB" +msgstr "TCB-параметр" #: ../src/gtkmm/widget_waypoint.cpp:189 msgid "T_ension" @@ -3327,16 +3329,16 @@ msgstr "" #: ../src/gtkmm/workarea.cpp:2339 msgid "Rendering..." -msgstr "Отрисовка..." +msgstr "Визуализация..." #: ../src/gtkmm/workarea.cpp:2366 ../src/gtkmm/workarea.cpp:2458 msgid "Render Failed" -msgstr "Не удалось отрисовать" +msgstr "Не удалось визуализировать" #: ../src/gtkmm/workarea.cpp:2440 #, c-format msgid "Rendering canvas %s..." -msgstr "Отрисовка холста %s..." +msgstr "Визуализация холста %s..." #: ../src/gtkmm/zoomdial.cpp:55 msgid "Zoom In" @@ -4201,8 +4203,7 @@ msgstr "" #: ../src/synfigapp/actions/valuedescset.cpp:542 msgid "You must be in Animate-Editing-Mode to directly manipulate this value" -msgstr "" -"Для прямого редактирования этого значения необходимо быть в режиме анимации" +msgstr "Для прямого редактирования этого значения необходимо быть в режиме анимации" #: ../src/synfigapp/actions/valuedescset.cpp:564 msgid "Unsupported ValueDesc type" @@ -4286,11 +4287,11 @@ msgstr "" #: ../src/synfigapp/actions/valuenodedynamiclistrotateorder.cpp:50 msgid "Rotate Order" -msgstr "Порядок вращения" +msgstr "Сменить порядок" #: ../src/synfigapp/actions/valuenodedynamiclistunloop.cpp:50 msgid "Unloop" -msgstr "Снять петлю" +msgstr "Разомкнуть" #: ../src/synfigapp/actions/valuenodelinkconnect.cpp:49 msgid "Connect ValueNode Link" @@ -4508,7 +4509,7 @@ msgstr "" #: ../src/synfigapp/action_system.cpp:148 #: ../src/synfigapp/action_system.cpp:159 msgid "Failed" -msgstr ". Неуспешно." +msgstr "Неуспешно." #: ../src/synfigapp/action_system.cpp:192 msgid "Successful" @@ -4601,7 +4602,7 @@ msgstr "" #: ../src/synfigapp/canvasinterface.cpp:641 msgid "I don't know how to open images of this type -- " -msgstr "Программа не умеет открывать файлы с расширением " +msgstr "Программа не умеет открывать файлы формата " #: ../src/synfigapp/canvasinterface.cpp:808 #, c-format diff --git a/synfig-studio/src/gtkmm/Makefile.am b/synfig-studio/src/gtkmm/Makefile.am index f7fd175..c5cc73d 100644 --- a/synfig-studio/src/gtkmm/Makefile.am +++ b/synfig-studio/src/gtkmm/Makefile.am @@ -170,9 +170,10 @@ STATE_HH = \ state_fill.h \ state_gradient.h \ state_normal.h \ - state_null.h \ state_polygon.h \ state_rectangle.h \ + state_rotate.h \ + state_scale.h \ state_sketch.h \ state_smoothmove.h \ state_star.h \ @@ -189,9 +190,10 @@ STATE_CC = \ state_fill.cpp \ state_gradient.cpp \ state_normal.cpp \ - state_null.cpp \ state_polygon.cpp \ state_rectangle.cpp \ + state_rotate.cpp \ + state_scale.cpp \ state_sketch.cpp \ state_smoothmove.cpp \ state_star.cpp \ diff --git a/synfig-studio/src/gtkmm/app.cpp b/synfig-studio/src/gtkmm/app.cpp index 7bffd2c..232a323 100644 --- a/synfig-studio/src/gtkmm/app.cpp +++ b/synfig-studio/src/gtkmm/app.cpp @@ -90,9 +90,11 @@ #include "state_circle.h" #include "state_rectangle.h" #include "state_smoothmove.h" +#include "state_scale.h" #include "state_star.h" #include "state_text.h" #include "state_width.h" +#include "state_rotate.h" #include "state_zoom.h" #include "devicetracker.h" @@ -1294,21 +1296,22 @@ App::App(int *argc, char ***argv): /* editing tools */ state_manager->add_state(&state_normal); state_manager->add_state(&state_smooth_move); + state_manager->add_state(&state_scale); + state_manager->add_state(&state_rotate); studio_init_cb.task(_("Init ModMirror...")); module_list_.push_back(new ModMirror()); module_list_.back()->start(); if(!getenv("SYNFIG_DISABLE_WIDTH" )) state_manager->add_state(&state_width); // Enabled since 0.61.09 /* new objects */ - state_manager->add_state(&state_bline); state_manager->add_state(&state_circle); state_manager->add_state(&state_rectangle); state_manager->add_state(&state_star); state_manager->add_state(&state_gradient); if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks state_manager->add_state(&state_text); + state_manager->add_state(&state_bline); if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet. /* other */ - state_manager->add_state(&state_fill); state_manager->add_state(&state_eyedrop); state_manager->add_state(&state_zoom); @@ -2098,7 +2101,8 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri { file_type_enum = manage(new Widget_Enum()); file_type_enum->set_param_desc(ParamDesc().set_hint("enum") - .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", strprintf("0.61.09 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_62_00, "0.62.00", strprintf("0.62.00 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", "0.61.09") .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", "0.61.08") .add_enum_value(synfig::RELEASE_VERSION_0_61_07, "0.61.07", "0.61.07") .add_enum_value(synfig::RELEASE_VERSION_0_61_06, "0.61.06", strprintf("0.61.06 %s", _("and older")))); diff --git a/synfig-studio/src/gtkmm/canvasview.cpp b/synfig-studio/src/gtkmm/canvasview.cpp index 6c7b38a..f520ced 100644 --- a/synfig-studio/src/gtkmm/canvasview.cpp +++ b/synfig-studio/src/gtkmm/canvasview.cpp @@ -83,7 +83,6 @@ #include "dialog_color.h" #include "eventkey.h" -#include "state_null.h" #include "state_polygon.h" #include "state_bline.h" #include "state_normal.h" @@ -721,8 +720,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handle instance,etl::handleattach(toggle_single_threaded, 0, 2, 9, 10, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, xpadding, ypadding); + misc_table->attach(toggle_single_threaded, 0, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, xpadding, ypadding); #endif // Misc - auto backup interval diff --git a/synfig-studio/src/gtkmm/dialog_tooloptions.cpp b/synfig-studio/src/gtkmm/dialog_tooloptions.cpp index 87ef6f9..b31fe6c 100644 --- a/synfig-studio/src/gtkmm/dialog_tooloptions.cpp +++ b/synfig-studio/src/gtkmm/dialog_tooloptions.cpp @@ -54,7 +54,7 @@ using namespace studio; /* === M E T H O D S ======================================================= */ Dialog_ToolOptions::Dialog_ToolOptions(): - Dockable("tool_options",_("Tool Options"),Gtk::StockID("synfig-null")), + Dockable("tool_options",_("Tool Options"),Gtk::StockID("synfig-about")), empty_label(_("This tool has no options")) { //scrolled_.add(sub_vbox_); @@ -81,7 +81,7 @@ Dialog_ToolOptions::clear() set_widget(empty_label); empty_label.show(); - set_stock_id(Gtk::StockID("synfig-null")); + set_stock_id(Gtk::StockID("synfig-about")); } void diff --git a/synfig-studio/src/gtkmm/iconcontroller.cpp b/synfig-studio/src/gtkmm/iconcontroller.cpp index 9217cc3..ea2a3a6 100644 --- a/synfig-studio/src/gtkmm/iconcontroller.cpp +++ b/synfig-studio/src/gtkmm/iconcontroller.cpp @@ -220,7 +220,6 @@ IconController::IconController(const synfig::String& /*basepath*/) INIT_STOCK_ICON_CLONE(cvs_revert,"gtk-revert",_("CVS Revert")); // Tools - INIT_STOCK_ICON(null,"null_icon."IMAGE_EXT,_("Null Tool")); INIT_STOCK_ICON(normal,"normal_icon."IMAGE_EXT,_("Normal Tool")); INIT_STOCK_ICON(transform,"transform_icon."IMAGE_EXT,_("Transform Tool")); INIT_STOCK_ICON(polygon,"polyline_icon."IMAGE_EXT,_("Polygon Tool")); @@ -232,7 +231,9 @@ IconController::IconController(const synfig::String& /*basepath*/) INIT_STOCK_ICON(circle,"circle_icon."IMAGE_EXT,_("Circle Tool")); INIT_STOCK_ICON(rectangle,"rectangle_icon."IMAGE_EXT,_("Rectangle Tool")); INIT_STOCK_ICON(smooth_move,"smooth_move_icon."IMAGE_EXT,_("SmoothMove Tool")); + INIT_STOCK_ICON(rotate,"rotate_icon."IMAGE_EXT,"Rotate Tool"); INIT_STOCK_ICON(width,"width_icon."IMAGE_EXT,_("Width Tool")); + INIT_STOCK_ICON(scale,"scale_icon."IMAGE_EXT,"Scale Tool"); INIT_STOCK_ICON(zoom,"zoom_icon."IMAGE_EXT,_("Zoom Tool")); INIT_STOCK_ICON(info,"info_icon."IMAGE_EXT,_("Info Tool")); INIT_STOCK_ICON(mirror,"mirror_icon."IMAGE_EXT,_("Mirror Tool")); diff --git a/synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp b/synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp index 5843a6a..bcb0a3a 100644 --- a/synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp +++ b/synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp @@ -37,6 +37,7 @@ #include #include "state_mirror.h" +#include "../state_normal.h" #include "../canvasview.h" #include "../workarea.h" #include "../app.h" @@ -92,6 +93,7 @@ public: class studio::StateMirror_Context : public sigc::trackable { etl::handle canvas_view_; + CanvasView::IsWorking is_working; synfigapp::Settings& settings; @@ -122,8 +124,10 @@ public: void update_axes() { duck_dragger_->axis=get_axis(); + get_work_area()->set_cursor(get_axis() == AXIS_X?Gdk::SB_H_DOUBLE_ARROW:Gdk::SB_V_DOUBLE_ARROW); } + Smach::event_result event_stop_handler(const Smach::event& x); Smach::event_result event_refresh_tool_options(const Smach::event& x); void refresh_tool_options(); @@ -149,6 +153,7 @@ StateMirror::StateMirror(): Smach::state("mirror") { insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateMirror_Context::event_refresh_tool_options)); + insert(event_def(EVENT_STOP,&StateMirror_Context::event_stop_handler)); } StateMirror::~StateMirror() @@ -172,6 +177,7 @@ StateMirror_Context::save_settings() StateMirror_Context::StateMirror_Context(CanvasView* canvas_view): canvas_view_(canvas_view), + is_working(*canvas_view), settings(synfigapp::Main::get_selected_input_device()->settings()), duck_dragger_(new DuckDrag_Mirror()), radiobutton_axis_x(radiobutton_group,_("Horizontal")), @@ -196,8 +202,8 @@ StateMirror_Context::StateMirror_Context(CanvasView* canvas_view): keypress_connect=get_work_area()->signal_key_press_event().connect(sigc::mem_fun(*this,&StateMirror_Context::key_event),false); keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateMirror_Context::key_event),false); -// get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->set_cursor(Gdk::SB_H_DOUBLE_ARROW); +// get_work_area()->reset_cursor(); App::toolbox->refresh(); @@ -209,7 +215,10 @@ bool StateMirror_Context::key_event(GdkEventKey *event) { if (event->keyval==GDK_Shift_L || event->keyval==GDK_Shift_R ) + { set_axis(get_axis()==AXIS_X ? AXIS_Y:AXIS_X); + get_work_area()->set_cursor(get_axis() == AXIS_X?Gdk::SB_H_DOUBLE_ARROW:Gdk::SB_V_DOUBLE_ARROW); + } return false; //Pass on the event to other handlers, just in case } @@ -230,13 +239,19 @@ StateMirror_Context::event_refresh_tool_options(const Smach::event& /*x*/) return Smach::RESULT_ACCEPT; } +Smach::event_result +StateMirror_Context::event_stop_handler(const Smach::event& /*x*/) +{ + throw &state_normal; + return Smach::RESULT_OK; +} StateMirror_Context::~StateMirror_Context() { save_settings(); get_work_area()->clear_duck_dragger(); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); keypress_connect.disconnect(); keyrelease_connect.disconnect(); diff --git a/synfig-studio/src/gtkmm/state_bline.cpp b/synfig-studio/src/gtkmm/state_bline.cpp index 7a27d84..ee0ca20 100644 --- a/synfig-studio/src/gtkmm/state_bline.cpp +++ b/synfig-studio/src/gtkmm/state_bline.cpp @@ -36,6 +36,7 @@ #include #include "state_bline.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -205,7 +206,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -408,7 +409,7 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateBLine_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::CROSSHAIR); App::toolbox->refresh(); } @@ -456,7 +457,7 @@ StateBLine_Context::~StateBLine_Context() save_settings(); App::dialog_tool_options->clear(); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); diff --git a/synfig-studio/src/gtkmm/state_circle.cpp b/synfig-studio/src/gtkmm/state_circle.cpp index fe82e21..ce155b0 100644 --- a/synfig-studio/src/gtkmm/state_circle.cpp +++ b/synfig-studio/src/gtkmm/state_circle.cpp @@ -38,6 +38,7 @@ #include #include "state_circle.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -208,7 +209,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -483,7 +484,7 @@ options_table.attach(*manage(new Gtk::Label(_("Point Angle Offset:"))), 0, 1, 14 // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateCircle_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::CROSSHAIR); App::toolbox->refresh(); } @@ -510,7 +511,7 @@ StateCircle_Context::~StateCircle_Context() // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -531,7 +532,9 @@ StateCircle_Context::~StateCircle_Context() Smach::event_result StateCircle_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_draw.cpp b/synfig-studio/src/gtkmm/state_draw.cpp index 4d058f2..4482045 100644 --- a/synfig-studio/src/gtkmm/state_draw.cpp +++ b/synfig-studio/src/gtkmm/state_draw.cpp @@ -38,6 +38,7 @@ #include "state_draw.h" #include "state_stroke.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -487,7 +488,7 @@ StateDraw_Context::StateDraw_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateDraw_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::PENCIL); + get_work_area()->set_cursor(Gdk::PENCIL); App::toolbox->refresh(); @@ -544,7 +545,7 @@ StateDraw_Context::~StateDraw_Context() get_work_area()->set_type_mask(old_duckmask); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); @@ -567,7 +568,9 @@ StateDraw_Context::~StateDraw_Context() Smach::event_result StateDraw_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_eyedrop.cpp b/synfig-studio/src/gtkmm/state_eyedrop.cpp index 6fb940d..dcd57a1 100644 --- a/synfig-studio/src/gtkmm/state_eyedrop.cpp +++ b/synfig-studio/src/gtkmm/state_eyedrop.cpp @@ -30,6 +30,7 @@ #endif #include "state_eyedrop.h" +#include "state_normal.h" #include "workarea.h" #include #include "app.h" @@ -113,8 +114,10 @@ StateEyedrop_Context::~StateEyedrop_Context() Smach::event_result StateEyedrop_Context::event_stop_handler(const Smach::event& /*x*/) { - synfig::info("STATE EYEDROP: Received Stop Event"); - throw Smach::egress_exception(); + //synfig::info("STATE EYEDROP: Received Stop Event"); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; // canvas_view->get_smach().pop_state(); // return Smach::RESULT_ACCEPT; } diff --git a/synfig-studio/src/gtkmm/state_fill.cpp b/synfig-studio/src/gtkmm/state_fill.cpp index 60c929a..f4df2ba 100644 --- a/synfig-studio/src/gtkmm/state_fill.cpp +++ b/synfig-studio/src/gtkmm/state_fill.cpp @@ -30,6 +30,7 @@ #endif #include "state_fill.h" +#include "state_normal.h" #include "workarea.h" #include #include "app.h" @@ -121,7 +122,9 @@ Smach::event_result StateFill_Context::event_stop_handler(const Smach::event& /*x*/) { synfig::info("STATE FILL: Received Stop Event"); - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; // canvas_view->get_smach().pop_state(); // return Smach::RESULT_ACCEPT; } diff --git a/synfig-studio/src/gtkmm/state_gradient.cpp b/synfig-studio/src/gtkmm/state_gradient.cpp index c8461b5..8e36214 100644 --- a/synfig-studio/src/gtkmm/state_gradient.cpp +++ b/synfig-studio/src/gtkmm/state_gradient.cpp @@ -37,6 +37,7 @@ #include #include "state_gradient.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -144,7 +145,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -297,7 +298,7 @@ StateGradient_Context::StateGradient_Context(CanvasView* canvas_view): // Turn off layer clicking get_work_area()->set_allow_layer_clicks(false); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::CROSSHAIR); // clear out the ducks get_work_area()->clear_ducks(); @@ -342,7 +343,7 @@ StateGradient_Context::~StateGradient_Context() // Restore layer clicking // get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); get_work_area()->set_allow_layer_clicks(true); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -367,7 +368,9 @@ StateGradient_Context::~StateGradient_Context() Smach::event_result StateGradient_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_normal.cpp b/synfig-studio/src/gtkmm/state_normal.cpp index 15a7b43..c763022 100644 --- a/synfig-studio/src/gtkmm/state_normal.cpp +++ b/synfig-studio/src/gtkmm/state_normal.cpp @@ -140,9 +140,6 @@ public: void set_constrain_flag(bool x) { checkbutton_constrain.set_active(x); refresh_constrain_flag(); } void refresh_constrain_flag() { if(duck_dragger_)duck_dragger_->constrain=get_constrain_flag(); } - Smach::event_result event_refresh_tool_options(const Smach::event& x); - void refresh_tool_options(); - StateNormal_Context(CanvasView* canvas_view); ~StateNormal_Context(); @@ -158,6 +155,18 @@ public: bool key_pressed(GdkEventKey *event); bool key_released(GdkEventKey *event); + Smach::event_result event_stop_handler(const Smach::event& x); + Smach::event_result event_refresh_handler(const Smach::event& x); + Smach::event_result event_refresh_ducks_handler(const Smach::event& x); + Smach::event_result event_undo_handler(const Smach::event& x); + Smach::event_result event_redo_handler(const Smach::event& x); + Smach::event_result event_mouse_button_down_handler(const Smach::event& x); + Smach::event_result event_multiple_ducks_clicked_handler(const Smach::event& x); + Smach::event_result event_refresh_tool_options(const Smach::event& x); + void refresh_tool_options(); + Smach::event_result event_layer_click(const Smach::event& x); + + }; // END of class StateNormal_Context /* === M E T H O D S ======================================================= */ @@ -165,7 +174,16 @@ public: StateNormal::StateNormal(): Smach::state("normal") { + insert(event_def(EVENT_STOP,&StateNormal_Context::event_stop_handler)); + insert(event_def(EVENT_REFRESH,&StateNormal_Context::event_refresh_handler)); + insert(event_def(EVENT_REFRESH_DUCKS,&StateNormal_Context::event_refresh_ducks_handler)); + insert(event_def(EVENT_UNDO,&StateNormal_Context::event_undo_handler)); + insert(event_def(EVENT_REDO,&StateNormal_Context::event_redo_handler)); + insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DOWN,&StateNormal_Context::event_mouse_button_down_handler)); + insert(event_def(EVENT_WORKAREA_MULTIPLE_DUCKS_CLICKED,&StateNormal_Context::event_multiple_ducks_clicked_handler)); insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateNormal_Context::event_refresh_tool_options)); + insert(event_def(EVENT_WORKAREA_LAYER_CLICKED,&StateNormal_Context::event_layer_click)); + } StateNormal::~StateNormal() @@ -226,7 +244,7 @@ StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): options_table.show_all(); refresh_tool_options(); //App::dialog_tool_options->set_widget(options_table); - App::dialog_tool_options->present(); + //App::dialog_tool_options->present(); get_work_area()->set_allow_layer_clicks(true); get_work_area()->set_duck_dragger(duck_dragger_); @@ -234,8 +252,9 @@ StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): keypress_connect=get_work_area()->signal_key_press_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_pressed),false); keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_released),false); -// get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); - get_canvas_view()->work_area->reset_cursor(); + //these will segfault +// get_work_area()->set_cursor(Gdk::CROSSHAIR); +// get_work_area()->reset_cursor(); App::toolbox->refresh(); @@ -305,7 +324,7 @@ StateNormal_Context::~StateNormal_Context() save_settings(); get_work_area()->clear_duck_dragger(); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); keypress_connect.disconnect(); keyrelease_connect.disconnect(); @@ -315,14 +334,6 @@ StateNormal_Context::~StateNormal_Context() App::toolbox->refresh(); } - -Smach::event_result -StateNormal_Context::event_refresh_tool_options(const Smach::event& /*x*/) -{ - refresh_tool_options(); - return Smach::RESULT_ACCEPT; -} - DuckDrag_Combo::DuckDrag_Combo(): scale(false), rotate(false), @@ -524,3 +535,290 @@ DuckDrag_Combo::end_duck_drag(Duckmatic* duckmatic) return false; } } + +Smach::event_result +StateNormal_Context::event_refresh_tool_options(const Smach::event& /*x*/) +{ + refresh_tool_options(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_stop_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received Stop Event"); + canvas_view_->stop(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_refresh_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received Refresh Event"); + canvas_view_->rebuild_tables(); + canvas_view_->work_area->queue_render_preview(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_refresh_ducks_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received Refresh Ducks"); + canvas_view_->queue_rebuild_ducks(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_undo_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received Undo Event"); + canvas_view_->get_instance()->undo(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_redo_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received Redo Event"); + canvas_view_->get_instance()->redo(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateNormal_Context::event_mouse_button_down_handler(const Smach::event& x) +{ + // synfig::info("STATE NORMAL: Received mouse button down Event"); + + const EventMouse& event(*reinterpret_cast(&x)); + + switch(event.button) + { + case BUTTON_RIGHT: + canvas_view_->popup_main_menu(); + return Smach::RESULT_ACCEPT; + default: + return Smach::RESULT_OK; + } +} + +Smach::event_result +StateNormal_Context::event_layer_click(const Smach::event& x) +{ + const EventLayerClick& event(*reinterpret_cast(&x)); + + if(event.layer) + { + // synfig::info("STATE NORMAL: Received layer click Event, \"%s\"",event.layer->get_name().c_str()); + } + else + { + // synfig::info("STATE NORMAL: Received layer click Event with an empty layer."); + } + + switch(event.button) + { + case BUTTON_LEFT: + if(!(event.modifier&Gdk::CONTROL_MASK)) + canvas_view_->get_selection_manager()->clear_selected_layers(); + if(event.layer) + { + std::list layer_list(canvas_view_->get_selection_manager()->get_selected_layers()); + std::set layers(layer_list.begin(),layer_list.end()); + if(layers.count(event.layer)) + { + layers.erase(event.layer); + layer_list=std::list(layers.begin(),layers.end()); + canvas_view_->get_selection_manager()->clear_selected_layers(); + canvas_view_->get_selection_manager()->set_selected_layers(layer_list); + } + else + { + canvas_view_->get_selection_manager()->set_selected_layer(event.layer); + } + } + return Smach::RESULT_ACCEPT; + case BUTTON_RIGHT: + canvas_view_->popup_layer_menu(event.layer); + return Smach::RESULT_ACCEPT; + default: + return Smach::RESULT_OK; + } +} + +/* +void +StateNormal_Context::edit_several_waypoints(std::list value_desc_list) +{ + Gtk::Dialog dialog( + "Edit Multiple Waypoints", // Title + true, // Modal + true // use_separator + ); + + Widget_WaypointModel widget_waypoint_model; + widget_waypoint_model.show(); + + dialog.get_vbox()->pack_start(widget_waypoint_model); + + + dialog.add_button(Gtk::StockID("gtk-apply"),1); + dialog.add_button(Gtk::StockID("gtk-cancel"),0); + dialog.show(); + + if(dialog.run()==0) + return; + synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Set Waypoints")); + + std::list::iterator iter; + for(iter=value_desc_list.begin();iter!=value_desc_list.end();++iter) + { + synfigapp::ValueDesc value_desc(*iter); + + if(!value_desc.is_valid()) + continue; + + ValueNode_Animated::Handle value_node; + + // If this value isn't a ValueNode_Animated, but + // it is somewhat constant, then go ahead and convert + // it to a ValueNode_Animated. + if(!value_desc.is_value_node() || ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())) + { + ValueBase value; + if(value_desc.is_value_node()) + value=ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())->get_value(); + else + value=value_desc.get_value(); + + value_node=ValueNode_Animated::create(value,get_canvas()->get_time()); + + synfigapp::Action::Handle action; + + if(!value_desc.is_value_node()) + { + action=synfigapp::Action::create("ValueDescConnect"); + action->set_param("dest",value_desc); + action->set_param("src",ValueNode::Handle(value_node)); + } + else + { + action=synfigapp::Action::create("ValueNodeReplace"); + action->set_param("dest",value_desc.get_value_node()); + action->set_param("src",ValueNode::Handle(value_node)); + } + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to convert to animated waypoint")); + group.cancel(); + return; + } + } + else + { + if(value_desc.is_value_node()) + value_node=ValueNode_Animated::Handle::cast_dynamic(value_desc.get_value_node()); + } + + + if(value_node) + { + + synfigapp::Action::Handle action(synfigapp::Action::create("WaypointSetSmart")); + + if(!action) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to find WaypointSetSmart action")); + group.cancel(); + return; + } + + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("value_node",ValueNode::Handle(value_node)); + action->set_param("time",get_canvas()->get_time()); + action->set_param("model",widget_waypoint_model.get_waypoint_model()); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to set a specific waypoint")); + group.cancel(); + return; + } + } + else + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to animate a specific valuedesc")); + //group.cancel(); + //return; + } + + } +} +*/ + +Smach::event_result +StateNormal_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE NORMAL: Received multiple duck click event"); + + //const EventMouse& event(*reinterpret_cast(&x)); + + std::list value_desc_list; + + // Create a list of value_descs associated with selection + const DuckList selected_ducks(get_work_area()->get_selected_ducks()); + DuckList::const_iterator iter; + for(iter=selected_ducks.begin();iter!=selected_ducks.end();++iter) + { + synfigapp::ValueDesc value_desc((*iter)->get_value_desc()); + + if(!value_desc.is_valid()) + continue; + + if(value_desc.get_value_type()==ValueBase::TYPE_BLINEPOINT && value_desc.is_value_node() && ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())) + { + value_desc_list.push_back( + synfigapp::ValueDesc( + ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) + ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) + ->get_link_index_from_name("point") + ) + ); + } + else + value_desc_list.push_back(value_desc); + } + + Gtk::Menu *menu=manage(new Gtk::Menu()); + menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), menu)); + + canvas_view_->get_instance()->make_param_menu(menu,canvas_view_->get_canvas(),value_desc_list); + + /* + synfigapp::Action::ParamList param_list; + param_list=get_canvas_interface()->generate_param_list(value_desc_list); + + canvas_view_->add_actions_to_menu(menu, param_list,synfigapp::Action::CATEGORY_VALUEDESC|synfigapp::Action::CATEGORY_VALUENODE); + + menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Edit Waypoints"), + sigc::bind( + sigc::mem_fun( + *this, + &studio::StateNormal_Context::edit_several_waypoints + ), + value_desc_list + ) + )); + */ + menu->popup(3,gtk_get_current_event_time()); + + return Smach::RESULT_ACCEPT; +} + + diff --git a/synfig-studio/src/gtkmm/state_null.cpp b/synfig-studio/src/gtkmm/state_null.cpp deleted file mode 100644 index 4bbf96b..0000000 --- a/synfig-studio/src/gtkmm/state_null.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_null.cpp -** \brief Null State File -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007, 2008 Chris Moore -** Copyright (c) 2009 Nikita Kitaev -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === H E A D E R S ======================================================= */ - -#ifdef USING_PCH -# include "pch.h" -#else -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "state_null.h" -#include "workarea.h" -#include "event_mouse.h" -#include "event_layerclick.h" -#include "toolbox.h" -#include "dialog_tooloptions.h" -#include -#include "widget_waypointmodel.h" -#include -#include -#include -#include "canvasview.h" -#include "general.h" - -#endif - -/* === U S I N G =========================================================== */ - -using namespace std; -using namespace etl; -using namespace synfig; -using namespace studio; - -/* === M A C R O S ========================================================= */ - -/* === G L O B A L S ======================================================= */ - -StateNull studio::state_null; - -/* === C L A S S E S & S T R U C T S ======================================= */ - -class studio::StateNull_Context : public sigc::trackable -{ - CanvasView *canvas_view; - - CanvasView* get_canvas_view() { return canvas_view; } - Canvas::Handle get_canvas() { return canvas_view->get_canvas(); } - WorkArea* get_work_area() { return canvas_view->get_work_area(); } - etl::handle get_canvas_interface() { return canvas_view->canvas_interface(); } - - Gtk::Table options_table; - -public: - StateNull_Context(CanvasView *canvas_view); - ~StateNull_Context(); - - Smach::event_result event_stop_handler(const Smach::event& x); - Smach::event_result event_refresh_handler(const Smach::event& x); - Smach::event_result event_refresh_ducks_handler(const Smach::event& x); - Smach::event_result event_undo_handler(const Smach::event& x); - Smach::event_result event_redo_handler(const Smach::event& x); - Smach::event_result event_mouse_button_down_handler(const Smach::event& x); - Smach::event_result event_multiple_ducks_clicked_handler(const Smach::event& x); - Smach::event_result event_refresh_tool_options(const Smach::event& x); - Smach::event_result event_layer_click(const Smach::event& x); - - void refresh_tool_options(); -}; // END of class StateNull_Context - -/* === P R O C E D U R E S ================================================= */ - -/* === M E T H O D S ======================================================= */ - -StateNull::StateNull(): - Smach::state("null") -{ - insert(event_def(EVENT_STOP,&StateNull_Context::event_stop_handler)); - insert(event_def(EVENT_REFRESH,&StateNull_Context::event_refresh_handler)); - insert(event_def(EVENT_REFRESH_DUCKS,&StateNull_Context::event_refresh_ducks_handler)); - insert(event_def(EVENT_UNDO,&StateNull_Context::event_undo_handler)); - insert(event_def(EVENT_REDO,&StateNull_Context::event_redo_handler)); - insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DOWN,&StateNull_Context::event_mouse_button_down_handler)); - insert(event_def(EVENT_WORKAREA_MULTIPLE_DUCKS_CLICKED,&StateNull_Context::event_multiple_ducks_clicked_handler)); - insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateNull_Context::event_refresh_tool_options)); - insert(event_def(EVENT_WORKAREA_LAYER_CLICKED,&StateNull_Context::event_layer_click)); -} - -StateNull::~StateNull() -{ -} - -StateNull_Context::StateNull_Context(CanvasView *canvas_view): - canvas_view(canvas_view) -{ - // Synfig Studio's default state is initialized in the canvas view constructor - // As a result, it cannot reference canvas view or workarea when created - // Other states need to reference the workarea, - // so a null state was created to be the default - - options_table.attach(*manage(new Gtk::Label(_("Welcome to Synfig Studio"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.show_all(); - refresh_tool_options(); -} - -StateNull_Context::~StateNull_Context() -{ -} - -void -StateNull_Context::refresh_tool_options() -{ - App::dialog_tool_options->clear(); - App::dialog_tool_options->set_widget(options_table); - App::dialog_tool_options->set_local_name(_("Welcome to Synfig Studio")); - App::dialog_tool_options->set_name("null"); -} - -Smach::event_result -StateNull_Context::event_refresh_tool_options(const Smach::event& /*x*/) -{ - refresh_tool_options(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_stop_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received Stop Event"); - canvas_view->stop(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_refresh_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received Refresh Event"); - canvas_view->rebuild_tables(); - canvas_view->work_area->queue_render_preview(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_refresh_ducks_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received Refresh Ducks"); - canvas_view->queue_rebuild_ducks(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_undo_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received Undo Event"); - canvas_view->get_instance()->undo(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_redo_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received Redo Event"); - canvas_view->get_instance()->redo(); - return Smach::RESULT_ACCEPT; -} - -Smach::event_result -StateNull_Context::event_mouse_button_down_handler(const Smach::event& x) -{ - // synfig::info("STATE NULL: Received mouse button down Event"); - - const EventMouse& event(*reinterpret_cast(&x)); - - switch(event.button) - { - case BUTTON_RIGHT: - canvas_view->popup_main_menu(); - return Smach::RESULT_ACCEPT; - default: - return Smach::RESULT_OK; - } -} - -Smach::event_result -StateNull_Context::event_layer_click(const Smach::event& x) -{ - const EventLayerClick& event(*reinterpret_cast(&x)); - - if(event.layer) - { - // synfig::info("STATE NULL: Received layer click Event, \"%s\"",event.layer->get_name().c_str()); - } - else - { - // synfig::info("STATE NULL: Received layer click Event with an empty layer."); - } - - switch(event.button) - { - case BUTTON_LEFT: - if(!(event.modifier&Gdk::CONTROL_MASK)) - canvas_view->get_selection_manager()->clear_selected_layers(); - if(event.layer) - { - std::list layer_list(canvas_view->get_selection_manager()->get_selected_layers()); - std::set layers(layer_list.begin(),layer_list.end()); - if(layers.count(event.layer)) - { - layers.erase(event.layer); - layer_list=std::list(layers.begin(),layers.end()); - canvas_view->get_selection_manager()->clear_selected_layers(); - canvas_view->get_selection_manager()->set_selected_layers(layer_list); - } - else - { - canvas_view->get_selection_manager()->set_selected_layer(event.layer); - } - } - return Smach::RESULT_ACCEPT; - case BUTTON_RIGHT: - canvas_view->popup_layer_menu(event.layer); - return Smach::RESULT_ACCEPT; - default: - return Smach::RESULT_OK; - } -} - -/* -void -StateNull_Context::edit_several_waypoints(std::list value_desc_list) -{ - Gtk::Dialog dialog( - "Edit Multiple Waypoints", // Title - true, // Modal - true // use_separator - ); - - Widget_WaypointModel widget_waypoint_model; - widget_waypoint_model.show(); - - dialog.get_vbox()->pack_start(widget_waypoint_model); - - - dialog.add_button(Gtk::StockID("gtk-apply"),1); - dialog.add_button(Gtk::StockID("gtk-cancel"),0); - dialog.show(); - - if(dialog.run()==0) - return; - synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Set Waypoints")); - - std::list::iterator iter; - for(iter=value_desc_list.begin();iter!=value_desc_list.end();++iter) - { - synfigapp::ValueDesc value_desc(*iter); - - if(!value_desc.is_valid()) - continue; - - ValueNode_Animated::Handle value_node; - - // If this value isn't a ValueNode_Animated, but - // it is somewhat constant, then go ahead and convert - // it to a ValueNode_Animated. - if(!value_desc.is_value_node() || ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())) - { - ValueBase value; - if(value_desc.is_value_node()) - value=ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())->get_value(); - else - value=value_desc.get_value(); - - value_node=ValueNode_Animated::create(value,get_canvas()->get_time()); - - synfigapp::Action::Handle action; - - if(!value_desc.is_value_node()) - { - action=synfigapp::Action::create("ValueDescConnect"); - action->set_param("dest",value_desc); - action->set_param("src",ValueNode::Handle(value_node)); - } - else - { - action=synfigapp::Action::create("ValueNodeReplace"); - action->set_param("dest",value_desc.get_value_node()); - action->set_param("src",ValueNode::Handle(value_node)); - } - - action->set_param("canvas",get_canvas()); - action->set_param("canvas_interface",get_canvas_interface()); - - - if(!get_canvas_interface()->get_instance()->perform_action(action)) - { - get_canvas_view()->get_ui_interface()->error(_("Unable to convert to animated waypoint")); - group.cancel(); - return; - } - } - else - { - if(value_desc.is_value_node()) - value_node=ValueNode_Animated::Handle::cast_dynamic(value_desc.get_value_node()); - } - - - if(value_node) - { - - synfigapp::Action::Handle action(synfigapp::Action::create("WaypointSetSmart")); - - if(!action) - { - get_canvas_view()->get_ui_interface()->error(_("Unable to find WaypointSetSmart action")); - group.cancel(); - return; - } - - - action->set_param("canvas",get_canvas()); - action->set_param("canvas_interface",get_canvas_interface()); - action->set_param("value_node",ValueNode::Handle(value_node)); - action->set_param("time",get_canvas()->get_time()); - action->set_param("model",widget_waypoint_model.get_waypoint_model()); - - if(!get_canvas_interface()->get_instance()->perform_action(action)) - { - get_canvas_view()->get_ui_interface()->error(_("Unable to set a specific waypoint")); - group.cancel(); - return; - } - } - else - { - //get_canvas_view()->get_ui_interface()->error(_("Unable to animate a specific valuedesc")); - //group.cancel(); - //return; - } - - } -} -*/ - -Smach::event_result -StateNull_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*x*/) -{ - // synfig::info("STATE NULL: Received multiple duck click event"); - - //const EventMouse& event(*reinterpret_cast(&x)); - - std::list value_desc_list; - - // Create a list of value_descs associated with selection - const DuckList selected_ducks(get_work_area()->get_selected_ducks()); - DuckList::const_iterator iter; - for(iter=selected_ducks.begin();iter!=selected_ducks.end();++iter) - { - synfigapp::ValueDesc value_desc((*iter)->get_value_desc()); - - if(!value_desc.is_valid()) - continue; - - if(value_desc.get_value_type()==ValueBase::TYPE_BLINEPOINT && value_desc.is_value_node() && ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())) - { - value_desc_list.push_back( - synfigapp::ValueDesc( - ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) - ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) - ->get_link_index_from_name("point") - ) - ); - } - else - value_desc_list.push_back(value_desc); - } - - Gtk::Menu *menu=manage(new Gtk::Menu()); - menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), menu)); - - canvas_view->get_instance()->make_param_menu(menu,canvas_view->get_canvas(),value_desc_list); - - /* - synfigapp::Action::ParamList param_list; - param_list=get_canvas_interface()->generate_param_list(value_desc_list); - - canvas_view->add_actions_to_menu(menu, param_list,synfigapp::Action::CATEGORY_VALUEDESC|synfigapp::Action::CATEGORY_VALUENODE); - - menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Edit Waypoints"), - sigc::bind( - sigc::mem_fun( - *this, - &studio::StateNull_Context::edit_several_waypoints - ), - value_desc_list - ) - )); - */ - menu->popup(3,gtk_get_current_event_time()); - - return Smach::RESULT_ACCEPT; -} - diff --git a/synfig-studio/src/gtkmm/state_null.h b/synfig-studio/src/gtkmm/state_null.h deleted file mode 100644 index 9923154..0000000 --- a/synfig-studio/src/gtkmm/state_null.h +++ /dev/null @@ -1,57 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_null.h -** \brief Null State Header -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2009 Nikita Kitaev -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === S T A R T =========================================================== */ - -#ifndef __SYNFIG_STATE_NULL_H -#define __SYNFIG_STATE_NULL_H - -/* === H E A D E R S ======================================================= */ - -#include "smach.h" - - -/* === M A C R O S ========================================================= */ - -/* === T Y P E D E F S ===================================================== */ - -/* === C L A S S E S & S T R U C T S ======================================= */ - -namespace studio { - -class StateNull_Context; - -class StateNull : public Smach::state -{ -public: - StateNull(); - ~StateNull(); -}; // END of class StateNull - -extern StateNull state_null; - -}; // END of namespace studio - -/* === E N D =============================================================== */ - -#endif diff --git a/synfig-studio/src/gtkmm/state_polygon.cpp b/synfig-studio/src/gtkmm/state_polygon.cpp index c016f1d..7c11c05 100644 --- a/synfig-studio/src/gtkmm/state_polygon.cpp +++ b/synfig-studio/src/gtkmm/state_polygon.cpp @@ -38,6 +38,7 @@ #include #include "state_polygon.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -171,7 +172,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -368,7 +369,7 @@ StatePolygon_Context::StatePolygon_Context(CanvasView* canvas_view): // Refresh the work area get_work_area()->queue_draw(); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::CROSSHAIR); // Hide the tables if they are showing prev_table_status=get_canvas_view()->tables_are_visible(); @@ -430,7 +431,7 @@ StatePolygon_Context::~StatePolygon_Context() App::dialog_tool_options->clear(); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); // Enable the time bar get_canvas_view()->set_sensitive_timebar(true); @@ -899,6 +900,7 @@ void StatePolygon_Context::refresh_ducks() { get_work_area()->clear_ducks(); + get_work_area()->queue_draw(); if(polygon_point_list.empty()) return; diff --git a/synfig-studio/src/gtkmm/state_rectangle.cpp b/synfig-studio/src/gtkmm/state_rectangle.cpp index aa21c23..4f3eccb 100644 --- a/synfig-studio/src/gtkmm/state_rectangle.cpp +++ b/synfig-studio/src/gtkmm/state_rectangle.cpp @@ -38,6 +38,7 @@ #include #include "state_rectangle.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -176,7 +177,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -385,7 +386,7 @@ StateRectangle_Context::StateRectangle_Context(CanvasView* canvas_view): // Refresh the work area get_work_area()->queue_draw(); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::DOTBOX); // Hide the tables if they are showing //prev_table_status=get_canvas_view()->tables_are_visible(); @@ -423,7 +424,7 @@ StateRectangle_Context::~StateRectangle_Context() // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -444,7 +445,9 @@ StateRectangle_Context::~StateRectangle_Context() Smach::event_result StateRectangle_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_rotate.cpp b/synfig-studio/src/gtkmm/state_rotate.cpp new file mode 100644 index 0000000..5463a41 --- /dev/null +++ b/synfig-studio/src/gtkmm/state_rotate.cpp @@ -0,0 +1,398 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_rotate.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2008 Chris Moore +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include + +#include "state_rotate.h" +#include "state_normal.h" +#include "canvasview.h" +#include "workarea.h" +#include "app.h" + +#include +#include "event_mouse.h" +#include "event_layerclick.h" +#include "toolbox.h" +#include "dialog_tooloptions.h" +#include +#include "duck.h" +#include +#include + +#include "general.h" + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace studio; + +/* === M A C R O S ========================================================= */ + +#ifndef EPSILON +#define EPSILON 0.0000001 +#endif + +/* === G L O B A L S ======================================================= */ + +StateRotate studio::state_rotate; + +/* === C L A S S E S & S T R U C T S ======================================= */ + +class DuckDrag_Rotate : public DuckDrag_Base +{ + + synfig::Vector last_rotate; + synfig::Vector drag_offset; + synfig::Vector center; + synfig::Vector snap; + + Angle original_angle; + Real original_mag; + + std::vector positions; + + + bool bad_drag; + bool move_only; + +public: + etl::handle canvas_view_; + bool use_magnitude; + DuckDrag_Rotate(); + void begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& begin); + bool end_duck_drag(Duckmatic* duckmatic); + void duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector); + + etl::handle get_canvas_interface()const{return canvas_view_->canvas_interface();} +}; + + +class studio::StateRotate_Context : public sigc::trackable +{ + etl::handle canvas_view_; + CanvasView::IsWorking is_working; + + synfigapp::Settings& settings; + + etl::handle duck_dragger_; + + Gtk::Table options_table; + + Gtk::CheckButton checkbutton_scale; + +public: + + bool get_scale_flag()const { return checkbutton_scale.get_active(); } + void set_scale_flag(bool x) { return checkbutton_scale.set_active(x); refresh_scale_flag(); } + + Smach::event_result event_stop_handler(const Smach::event& x); + Smach::event_result event_refresh_tool_options(const Smach::event& x); + + void refresh_tool_options(); + + void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->use_magnitude=get_scale_flag(); } + + StateRotate_Context(CanvasView* canvas_view); + + ~StateRotate_Context(); + + const etl::handle& get_canvas_view()const{return canvas_view_;} + etl::handle get_canvas_interface()const{return canvas_view_->canvas_interface();} + synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();} + WorkArea * get_work_area()const{return canvas_view_->get_work_area();} + + void load_settings(); + void save_settings(); +}; // END of class StateRotate_Context + +/* === M E T H O D S ======================================================= */ + +StateRotate::StateRotate(): + Smach::state("rotate") +{ + insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateRotate_Context::event_refresh_tool_options)); + insert(event_def(EVENT_STOP,&StateRotate_Context::event_stop_handler)); +} + +StateRotate::~StateRotate() +{ +} + +void +StateRotate_Context::load_settings() +{ + String value; + + if(settings.get_value("rotate.scale",value) && value=="0") + set_scale_flag(false); + else + set_scale_flag(true); +} + +void +StateRotate_Context::save_settings() +{ + settings.set_value("rotate.scale",get_scale_flag()?"1":"0"); +} + +StateRotate_Context::StateRotate_Context(CanvasView* canvas_view): + canvas_view_(canvas_view), + is_working(*canvas_view), + settings(synfigapp::Main::get_selected_input_device()->settings()), + duck_dragger_(new DuckDrag_Rotate()), + checkbutton_scale(_("Allow Scale")) +{ + duck_dragger_->canvas_view_=get_canvas_view(); + + // Set up the tool options dialog + options_table.attach(*manage(new Gtk::Label(_("Rotate Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_scale, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + + checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateRotate_Context::refresh_scale_flag)); + + options_table.show_all(); + refresh_tool_options(); + //App::dialog_tool_options->set_widget(options_table); + App::dialog_tool_options->present(); + + get_work_area()->set_allow_layer_clicks(true); + get_work_area()->set_duck_dragger(duck_dragger_); + + get_work_area()->set_cursor(Gdk::EXCHANGE); +// get_work_area()->reset_cursor(); + + App::toolbox->refresh(); + + load_settings(); + refresh_scale_flag(); +} + +void +StateRotate_Context::refresh_tool_options() +{ + App::dialog_tool_options->clear(); + App::dialog_tool_options->set_widget(options_table); + App::dialog_tool_options->set_local_name(_("Rotate Tool")); + App::dialog_tool_options->set_name("rotate"); +} + +Smach::event_result +StateRotate_Context::event_refresh_tool_options(const Smach::event& /*x*/) +{ + refresh_tool_options(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateRotate_Context::event_stop_handler(const Smach::event& /*x*/) +{ + throw &state_normal; + return Smach::RESULT_OK; +} + +StateRotate_Context::~StateRotate_Context() +{ + save_settings(); + + get_work_area()->clear_duck_dragger(); + get_work_area()->reset_cursor(); + + App::dialog_tool_options->clear(); + + App::toolbox->refresh(); +} + + + + +DuckDrag_Rotate::DuckDrag_Rotate() +{ + use_magnitude=true; +} + +void +DuckDrag_Rotate::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset) +{ + last_rotate=Vector(1,1); + + const DuckList selected_ducks(duckmatic->get_selected_ducks()); + DuckList::const_iterator iter; + +/* + if(duckmatic->get_selected_ducks().size()<2) + { + bad_drag=true; + return; + } +*/ + bad_drag=false; + + drag_offset=duckmatic->find_duck(offset)->get_trans_point(); + + //snap=drag_offset-duckmatic->snap_point_to_grid(drag_offset); + //snap=offset-drag_offset; + snap=Vector(0,0); + + // Calculate center + Point vmin(100000000,100000000); + Point vmax(-100000000,-100000000); + //std::set >::iterator iter; + positions.clear(); + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + Point p((*iter)->get_trans_point()); + vmin[0]=min(vmin[0],p[0]); + vmin[1]=min(vmin[1],p[1]); + vmax[0]=max(vmax[0],p[0]); + vmax[1]=max(vmax[1],p[1]); + positions.push_back(p); + } + center=(vmin+vmax)*0.5; + if((vmin-vmax).mag()<=EPSILON) + move_only=true; + else + move_only=false; + + + synfig::Vector vect(offset-center); + original_angle=Angle::tan(vect[1],vect[0]); + original_mag=vect.mag(); +} + + +void +DuckDrag_Rotate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector) +{ + if(bad_drag) + return; + + //std::set >::iterator iter; + synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center+snap); + + const DuckList selected_ducks(duckmatic->get_selected_ducks()); + DuckList::const_iterator iter; + + if(move_only) + { + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue; + + Vector p(positions[i]); + + p[0]+=vect[0]; + p[1]+=vect[1]; + (*iter)->set_trans_point(p); + } + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector p(positions[i]); + + p[0]+=vect[0]; + p[1]+=vect[1]; + (*iter)->set_trans_point(p); + } + return; + } + + Angle::tan angle(vect[1],vect[0]); + angle=original_angle-angle; + Real mag(vect.mag()/original_mag); + Real sine(Angle::sin(angle).get()); + Real cosine(Angle::cos(angle).get()); + + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue; + + Vector x(positions[i]-center),p; + + p[0]=cosine*x[0]+sine*x[1]; + p[1]=-sine*x[0]+cosine*x[1]; + if(use_magnitude)p*=mag; + p+=center; + (*iter)->set_trans_point(p); + } + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector x(positions[i]-center),p; + + p[0]=cosine*x[0]+sine*x[1]; + p[1]=-sine*x[0]+cosine*x[1]; + if(use_magnitude)p*=mag; + p+=center; + (*iter)->set_trans_point(p); + } + + last_rotate=vect; + //snap=Vector(0,0); +} + +bool +DuckDrag_Rotate::end_duck_drag(Duckmatic* duckmatic) +{ + if(bad_drag)return false; + if(move_only) + { + synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Move Duck")); + duckmatic->signal_edited_selected_ducks(); + return true; + } + + synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Rotate Ducks")); + + if((last_rotate-Vector(1,1)).mag()>0.0001) + { + duckmatic->signal_edited_selected_ducks(); + return true; + } + else + { + duckmatic->signal_user_click_selected_ducks(0); + return false; + } +} diff --git a/synfig-studio/src/gtkmm/state_rotate.h b/synfig-studio/src/gtkmm/state_rotate.h new file mode 100644 index 0000000..e2caafe --- /dev/null +++ b/synfig-studio/src/gtkmm/state_rotate.h @@ -0,0 +1,56 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_rotate.h +** \brief Template Header +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_STUDIO_STATE_ROTATE_H +#define __SYNFIG_STUDIO_STATE_ROTATE_H + +/* === H E A D E R S ======================================================= */ + +#include "smach.h" + + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace studio { + +class StateRotate_Context; + +class StateRotate : public Smach::state +{ +public: + StateRotate(); + ~StateRotate(); +}; // END of class StateRotate + +extern StateRotate state_rotate; + +}; // END of namespace studio + +/* === E N D =============================================================== */ + +#endif diff --git a/synfig-studio/src/gtkmm/state_scale.cpp b/synfig-studio/src/gtkmm/state_scale.cpp new file mode 100644 index 0000000..edfb89b --- /dev/null +++ b/synfig-studio/src/gtkmm/state_scale.cpp @@ -0,0 +1,389 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_scale.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2008 Chris Moore +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include + +#include "state_scale.h" +#include "state_normal.h" +#include "canvasview.h" +#include "workarea.h" +#include "app.h" + +#include +#include "event_mouse.h" +#include "event_layerclick.h" +#include "toolbox.h" +#include "dialog_tooloptions.h" +#include +#include "duck.h" +#include + +#include "general.h" + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace studio; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +StateScale studio::state_scale; + +/* === C L A S S E S & S T R U C T S ======================================= */ + +class DuckDrag_Scale : public DuckDrag_Base +{ + + synfig::Vector last_scale; + synfig::Vector drag_offset; + synfig::Vector center; + synfig::Vector snap; + + std::vector positions; + + bool move_only; + + bool bad_drag; +public: + bool lock_aspect; + DuckDrag_Scale(); + void begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& begin); + bool end_duck_drag(Duckmatic* duckmatic); + void duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector); +}; + + +class studio::StateScale_Context : public sigc::trackable +{ + etl::handle canvas_view_; + CanvasView::IsWorking is_working; + + synfigapp::Settings& settings; + + etl::handle duck_dragger_; + + Gtk::Table options_table; + + + Gtk::CheckButton checkbutton_aspect_lock; + +public: + + bool get_aspect_lock_flag()const { return checkbutton_aspect_lock.get_active(); } + void set_aspect_lock_flag(bool x) { return checkbutton_aspect_lock.set_active(x); refresh_aspect_lock_flag(); } + + void refresh_aspect_lock_flag() { if(duck_dragger_)duck_dragger_->lock_aspect=get_aspect_lock_flag(); } + + Smach::event_result event_stop_handler(const Smach::event& x); + Smach::event_result event_refresh_tool_options(const Smach::event& x); + + void refresh_tool_options(); + + StateScale_Context(CanvasView* canvas_view); + + ~StateScale_Context(); + + const etl::handle& get_canvas_view()const{return canvas_view_;} + etl::handle get_canvas_interface()const{return canvas_view_->canvas_interface();} + synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();} + WorkArea * get_work_area()const{return canvas_view_->get_work_area();} + + void load_settings(); + void save_settings(); +}; // END of class StateScale_Context + +/* === M E T H O D S ======================================================= */ + +StateScale::StateScale(): + Smach::state("scale") +{ + insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateScale_Context::event_refresh_tool_options)); + insert(event_def(EVENT_STOP,&StateScale_Context::event_stop_handler)); +} + +StateScale::~StateScale() +{ +} + +void +StateScale_Context::load_settings() +{ + String value; + + if(settings.get_value("scale.lock_aspect",value) && value=="0") + set_aspect_lock_flag(false); + else + set_aspect_lock_flag(true); +} + +void +StateScale_Context::save_settings() +{ + settings.set_value("scale.lock_aspect",get_aspect_lock_flag()?"1":"0"); +} + +StateScale_Context::StateScale_Context(CanvasView* canvas_view): + canvas_view_(canvas_view), + is_working(*canvas_view), + settings(synfigapp::Main::get_selected_input_device()->settings()), + duck_dragger_(new DuckDrag_Scale()), + checkbutton_aspect_lock(_("Lock Aspect Ratio")) +{ + // Set up the tool options dialog + options_table.attach(*manage(new Gtk::Label(_("Scale Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_aspect_lock, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + + checkbutton_aspect_lock.signal_toggled().connect(sigc::mem_fun(*this,&StateScale_Context::refresh_aspect_lock_flag)); + + options_table.show_all(); + refresh_tool_options(); + App::dialog_tool_options->present(); + + get_work_area()->set_allow_layer_clicks(true); + get_work_area()->set_duck_dragger(duck_dragger_); + + get_work_area()->set_cursor(Gdk::SIZING); +// get_work_area()->reset_cursor(); + + App::toolbox->refresh(); + + set_aspect_lock_flag(true); + load_settings(); +} + +void +StateScale_Context::refresh_tool_options() +{ + App::dialog_tool_options->clear(); + App::dialog_tool_options->set_widget(options_table); + App::dialog_tool_options->set_local_name(_("Scale Tool")); + App::dialog_tool_options->set_name("scale"); +} + +Smach::event_result +StateScale_Context::event_refresh_tool_options(const Smach::event& /*x*/) +{ + refresh_tool_options(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateScale_Context::event_stop_handler(const Smach::event& /*x*/) +{ + throw &state_normal; + return Smach::RESULT_OK; +} + +StateScale_Context::~StateScale_Context() +{ + save_settings(); + + get_work_area()->clear_duck_dragger(); + get_work_area()->reset_cursor(); + + App::dialog_tool_options->clear(); + + App::toolbox->refresh(); +} + + + + +DuckDrag_Scale::DuckDrag_Scale(): + lock_aspect(true) +{ +} + +#ifndef EPSILON +#define EPSILON 0.0000001 +#endif + +void +DuckDrag_Scale::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset) +{ + last_scale=Vector(1,1); + const DuckList selected_ducks(duckmatic->get_selected_ducks()); + DuckList::const_iterator iter; + + //if(duckmatic->get_selected_ducks().size()<2) + //{ + // bad_drag=true; +// return; +// } + bad_drag=false; + + drag_offset=duckmatic->find_duck(offset)->get_trans_point(); + + //snap=drag_offset-duckmatic->snap_point_to_grid(drag_offset); + //snap=offset-drag_offset; + snap=Vector(0,0); + + // Calculate center + Point vmin(100000000,100000000); + Point vmax(-100000000,-100000000); + //std::set >::iterator iter; + positions.clear(); + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + Point p((*iter)->get_trans_point()); + vmin[0]=min(vmin[0],p[0]); + vmin[1]=min(vmin[1],p[1]); + vmax[0]=max(vmax[0],p[0]); + vmax[1]=max(vmax[1],p[1]); + positions.push_back(p); + } + if((vmin-vmax).mag()<=EPSILON) + move_only=true; + else + move_only=false; + + center=(vmin+vmax)*0.5; +} + + +void +DuckDrag_Scale::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector) +{ + const DuckList selected_ducks(duckmatic->get_selected_ducks()); + DuckList::const_iterator iter; + + if(bad_drag) + return; + + //std::set >::iterator iter; + synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center); + last_scale=vect; + + if(move_only) + { + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector p(positions[i]); + + p[0]+=vect[0]; + p[1]+=vect[1]; + (*iter)->set_trans_point(p); + } + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector p(positions[i]); + + p[0]+=vect[0]; + p[1]+=vect[1]; + (*iter)->set_trans_point(p); + } + return; + } + + if(!lock_aspect) + { + if(abs(drag_offset[0]-center[0])>EPSILON) + vect[0]/=drag_offset[0]-center[0]; + else + vect[0]=1; + if(abs(drag_offset[1]-center[1])>EPSILON) + vect[1]/=drag_offset[1]-center[1]; + else + vect[1]=1; + } + else + { + //vect[0]=vect[1]=vect.mag()*0.707106781; + Real amount(vect.mag()/(drag_offset-center).mag()); + vect[0]=vect[1]=amount; + } + + if(vect[0]-EPSILON) + vect[0]=1; + if(vect[1]-EPSILON) + vect[1]=1; + + int i; + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector p(positions[i]-center); + + p[0]*=vect[0]; + p[1]*=vect[1]; + p+=center; + (*iter)->set_trans_point(p); + } + for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++) + { + if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue; + + Vector p(positions[i]-center); + + p[0]*=vect[0]; + p[1]*=vect[1]; + p+=center; + (*iter)->set_trans_point(p); + } + + last_scale=vect; + //snap=Vector(0,0); +} + +bool +DuckDrag_Scale::end_duck_drag(Duckmatic* duckmatic) +{ + if(bad_drag)return false; + + if((last_scale-Vector(1,1)).mag()>0.0001) + { + duckmatic->signal_edited_selected_ducks(); + return true; + } + else + { + duckmatic->signal_user_click_selected_ducks(0); + return false; + } +} diff --git a/synfig-studio/src/gtkmm/state_scale.h b/synfig-studio/src/gtkmm/state_scale.h new file mode 100644 index 0000000..f351c12 --- /dev/null +++ b/synfig-studio/src/gtkmm/state_scale.h @@ -0,0 +1,55 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_scale.h +** \brief Template Header +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_STUDIO_STATE_SCALE_H +#define __SYNFIG_STUDIO_STATE_SCALE_H + +/* === H E A D E R S ======================================================= */ + +#include "smach.h" + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace studio { + +class StateScale_Context; + +class StateScale : public Smach::state +{ +public: + StateScale(); + ~StateScale(); +}; // END of class StateScale + +extern StateScale state_scale; + +}; // END of namespace studio + +/* === E N D =============================================================== */ + +#endif diff --git a/synfig-studio/src/gtkmm/state_sketch.cpp b/synfig-studio/src/gtkmm/state_sketch.cpp index b0d78f0..f8b77a3 100644 --- a/synfig-studio/src/gtkmm/state_sketch.cpp +++ b/synfig-studio/src/gtkmm/state_sketch.cpp @@ -36,6 +36,7 @@ #include #include "state_sketch.h" +#include "state_normal.h" #include "state_stroke.h" #include "canvasview.h" #include "workarea.h" @@ -336,7 +337,7 @@ StateSketch_Context::StateSketch_Context(CanvasView* canvas_view): // Turn off layer clicking get_work_area()->set_allow_layer_clicks(false); - get_canvas_view()->work_area->set_cursor(Gdk::PENCIL); + get_work_area()->set_cursor(Gdk::PENCIL); // Turn off duck clicking get_work_area()->set_allow_duck_clicks(false); @@ -362,7 +363,7 @@ StateSketch_Context::StateSketch_Context(CanvasView* canvas_view): StateSketch_Context::~StateSketch_Context() { - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -465,7 +466,9 @@ StateSketch_Context::event_yield_tool_options(const Smach::event& /*x*/) Smach::event_result StateSketch_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_smoothmove.cpp b/synfig-studio/src/gtkmm/state_smoothmove.cpp index 85442cf..f42df35 100644 --- a/synfig-studio/src/gtkmm/state_smoothmove.cpp +++ b/synfig-studio/src/gtkmm/state_smoothmove.cpp @@ -40,6 +40,7 @@ #include #include "state_smoothmove.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -98,6 +99,7 @@ public: class studio::StateSmoothMove_Context : public sigc::trackable { etl::handle canvas_view_; + CanvasView::IsWorking is_working; //Duckmatic::Push duckmatic_push; @@ -143,6 +145,7 @@ StateSmoothMove::StateSmoothMove(): Smach::state("smooth_move") { insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateSmoothMove_Context::event_refresh_tool_options)); + insert(event_def(EVENT_STOP,&StateSmoothMove_Context::event_stop_handler)); } StateSmoothMove::~StateSmoothMove() @@ -168,6 +171,7 @@ StateSmoothMove_Context::save_settings() StateSmoothMove_Context::StateSmoothMove_Context(CanvasView* canvas_view): canvas_view_(canvas_view), + is_working(*canvas_view), // duckmatic_push(get_work_area()), settings(synfigapp::Main::get_selected_input_device()->settings()), duck_dragger_(new DuckDrag_SmoothMove()), @@ -193,8 +197,8 @@ StateSmoothMove_Context::StateSmoothMove_Context(CanvasView* canvas_view): App::toolbox->refresh(); -// get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->set_cursor(Gdk::FLEUR); + //get_work_area()->reset_cursor(); load_settings(); } @@ -215,12 +219,19 @@ StateSmoothMove_Context::event_refresh_tool_options(const Smach::event& /*x*/) return Smach::RESULT_ACCEPT; } +Smach::event_result +StateSmoothMove_Context::event_stop_handler(const Smach::event& /*x*/) +{ + throw &state_normal; + return Smach::RESULT_OK; +} + StateSmoothMove_Context::~StateSmoothMove_Context() { save_settings(); get_work_area()->clear_duck_dragger(); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); diff --git a/synfig-studio/src/gtkmm/state_star.cpp b/synfig-studio/src/gtkmm/state_star.cpp index e5b3ace..270571a 100644 --- a/synfig-studio/src/gtkmm/state_star.cpp +++ b/synfig-studio/src/gtkmm/state_star.cpp @@ -38,6 +38,7 @@ #include #include "state_star.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -215,7 +216,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -510,7 +511,7 @@ StateStar_Context::StateStar_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateStar_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::STAR); App::toolbox->refresh(); } @@ -537,7 +538,7 @@ StateStar_Context::~StateStar_Context() // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -558,7 +559,9 @@ StateStar_Context::~StateStar_Context() Smach::event_result StateStar_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_text.cpp b/synfig-studio/src/gtkmm/state_text.cpp index 8f7d0c9..f475420 100644 --- a/synfig-studio/src/gtkmm/state_text.cpp +++ b/synfig-studio/src/gtkmm/state_text.cpp @@ -34,6 +34,7 @@ #include #include "state_text.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -132,7 +133,7 @@ public: Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { if(egress_on_selection_change) - throw Smach::egress_exception(); + throw &state_normal; //throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -316,7 +317,7 @@ StateText_Context::StateText_Context(CanvasView *canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateText_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::XTERM); App::toolbox->refresh(); } @@ -343,7 +344,7 @@ StateText_Context::~StateText_Context() // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); App::dialog_tool_options->clear(); @@ -357,7 +358,9 @@ StateText_Context::~StateText_Context() Smach::event_result StateText_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_width.cpp b/synfig-studio/src/gtkmm/state_width.cpp index 1c7ef4f..8c74daa 100644 --- a/synfig-studio/src/gtkmm/state_width.cpp +++ b/synfig-studio/src/gtkmm/state_width.cpp @@ -39,6 +39,7 @@ #include #include "state_width.h" +#include "state_normal.h" #include "canvasview.h" #include "workarea.h" #include "app.h" @@ -356,7 +357,9 @@ StateWidth_Context::~StateWidth_Context() Smach::event_result StateWidth_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result diff --git a/synfig-studio/src/gtkmm/state_zoom.cpp b/synfig-studio/src/gtkmm/state_zoom.cpp index 57a2522..56363e6 100644 --- a/synfig-studio/src/gtkmm/state_zoom.cpp +++ b/synfig-studio/src/gtkmm/state_zoom.cpp @@ -38,6 +38,7 @@ #include "state_zoom.h" +#include "state_normal.h" #include "event_mouse.h" #include "canvasview.h" #include "workarea.h" @@ -136,7 +137,7 @@ StateZoom_Context::StateZoom_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateZoom_Context::on_user_click)); - get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_work_area()->set_cursor(Gdk::CROSSHAIR); App::toolbox->refresh(); } @@ -145,7 +146,7 @@ StateZoom_Context::~StateZoom_Context() { // Restore layer clicking get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); - get_canvas_view()->work_area->reset_cursor(); + get_work_area()->reset_cursor(); // Enable the time bar //get_canvas_view()->set_sensitive_timebar(true); @@ -164,7 +165,9 @@ StateZoom_Context::~StateZoom_Context() Smach::event_result StateZoom_Context::event_stop_handler(const Smach::event& /*x*/) { - throw Smach::egress_exception(); + //throw Smach::egress_exception(); + throw &state_normal; + return Smach::RESULT_OK; } Smach::event_result