diff options
Diffstat (limited to 'rotord/src/nodes_drawing.h')
| -rw-r--r-- | rotord/src/nodes_drawing.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/rotord/src/nodes_drawing.h b/rotord/src/nodes_drawing.h index 79082cc..b26841e 100644 --- a/rotord/src/nodes_drawing.h +++ b/rotord/src/nodes_drawing.h @@ -232,16 +232,28 @@ namespace Rotor { Svg(map<string,string> &settings):Svg() { base_settings(settings); rsvg=rsvg_handle_new_from_file((settings["media_path"]+attributes["filename"]->value).c_str(),nullptr); + if (rsvg) { + rsvg_handle_get_dimensions(rsvg,&dims); + cerr<<"Rotor: SVG loaded "<<attributes["filename"]->value<<" , "<<dims.width<<"x"<<dims.height<<endl; + } + else cerr<<"Rotor: SVG failed to load "<<attributes["filename"]->value<<endl; }; ~Svg(){}; Svg* clone(map<string,string> &_settings) { return new Svg(_settings);}; void vector_output(cairo_t * cr,const Frame_spec &frame){ + //to make it resolution independent + //translate the difference between screen and drawing + if (rsvg){ + float scale=frame.w/dims.width; + cairo_save(cr); //not really even necessary? cairo_translate(cr, frame.w/2, frame.h/2); cairo_translate(cr, parameters["x"]->value * frame.w, parameters["y"]->value * frame.h); - cairo_scale(cr, parameters["scale"]->value , parameters["scale"]->value ); + cairo_scale(cr, parameters["scale"]->value*scale, parameters["scale"]->value*scale); cairo_rotate(cr,(parameters["rotation"]->value/180.0f)*M_PI); + cairo_translate(cr, -frame.w/2, -frame.h/2); + cairo_translate(cr, frame.w/2-(dims.width/2), frame.h/2-(dims.height/2)); rsvg_handle_render_cairo(rsvg,cr); @@ -251,6 +263,7 @@ namespace Rotor { } private: RsvgHandle * rsvg; + RsvgDimensionData dims; }; } |
