38#ifndef DRAIN_TREE_ELEM_UTILS_SVG
39#define DRAIN_TREE_ELEM_UTILS_SVG
42#include <drain/util/TreeXML.h>
48#define DRAIN_SVG_ELEM_CLS(E) drain::NodeXML<drain::image::svg::tag_t>::Elem<drain::image::svg::tag_t::E>
49#define DRAIN_SVG_ELEM(E) typedef drain::NodeXML<drain::image::svg::tag_t>::Elem<drain::image::svg::tag_t::E> svg##E;
58template <>
template <>
59class DRAIN_SVG_ELEM_CLS(RECT){
64 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::RECT), x(node[
"x"]), y(node[
"y"]), width(node[
"width"]), height(node[
"height"]){
67 NodeXML<image::svg::tag_t> & node;
80class DRAIN_SVG_ELEM_CLS(CIRCLE){
84 NodeXML<image::svg::tag_t> & node;
87 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::CIRCLE), cx(node[
"cx"]), cy(node[
"cy"]), r(node[
"r"] = 0.0){
101DRAIN_SVG_ELEM(CIRCLE)
107class DRAIN_SVG_ELEM_CLS(POLYGON){
112 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::POLYGON), points(node[
"points"]), writablePoints(node[
"points"]){
115 NodeXML<image::svg::tag_t> & node;
126 writablePoints.clear();
129 template <
typename T>
131 void append(
const T &x,
const T &y){
132 writablePoints << x <<
',' << y <<
' ';
135 template <
typename T>
138 writablePoints << p.x <<
',' << p.y <<
' ';
142DRAIN_SVG_ELEM(POLYGON)
148class DRAIN_SVG_ELEM_CLS(PATH){
153 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::PATH), d(node[
"d"]) {
164 NodeXML<image::svg::tag_t> & node;
188 template <Command C,
typename ...T>
189 void relative(
const T... args){
190 appendCmd<C,RELATIVE>();
191 appendArgs<C>(args...);
194 template <Command C,
typename ...T>
195 void absolute(
const T... args){
196 appendCmd<C,ABSOLUTE>();
197 appendArgs<C>(args...);
209 std::stringstream sstr;
216 node[
"d"].append(sstr.str());
220 node[
"d"] = sstr.str();
226 template <Command C, Coord R=RELATIVE>
229 sstr << char(
int(C) +
int(R)) <<
' ';
236 void appendArgs(
double x,
double y);
239 void appendArgs(
double x,
double y,
double x2,
double y2);
242 void appendArgs(
double x,
double y,
double x2,
double y2,
double x3,
double y3);
245 template <Command C,
typename T>
248 appendArgs<C>(p.x, p.y);
251 template <Command C,
typename T>
254 appendArgs<C>(p.x, p.y, p2.x, p2.y);
257 template <Command C,
typename T>
260 appendArgs<C>(p.x, p.y, p2.x, p2.y, p3.x, p3.y);
266 void appendPoint(
double x){
270 template <
typename T>
273 sstr << p.x <<
' ' << p.y <<
' ';
278 template <
typename ...TT>
280 void appendPoints(
double x,
double y,
const TT... args){
282 sstr << x <<
' ' << y;
283 appendMorePoints(args...);
287 template <
typename T,
typename ...TT>
290 sstr << p.x <<
' ' << p.y;
292 appendMorePoints(args...);
295 template <
typename ...TT>
297 void appendMorePoints(
const TT... args){
299 appendPoints(args...);
304 void appendMorePoints(){
317void svgPATH::appendArgs<svgPATH::CLOSE>(){
323void svgPATH::appendArgs<svgPATH::MOVE>(
double x,
double y){
329void svgPATH::appendArgs<svgPATH::LINE>(
double x,
double y){
335void svgPATH::appendArgs<svgPATH::CURVE_C>(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3){
336 appendPoints(x1,y1, x2,y2, x3,y3);
341void svgPATH::appendArgs<svgPATH::CURVE_C_SHORT>(
double x2,
double y2,
double x,
double y){
342 appendPoints(x2,y2, x,y);
Definition DataSelector.cpp:1277
VariableT< VariableInitializer< ReferenceT< VariableBase > > > FlexibleVariable
Value container supporting dynamic type with own memory and optional linking (referencing) of externa...
Definition FlexibleVariable.h:66