38#ifndef DRAIN_TREE_ELEM_UTILS_SVG
39#define DRAIN_TREE_ELEM_UTILS_SVG
42#include <drain/util/XML.h>
43#include <drain/util/TreeXML.h>
49#define DRAIN_SVG_ELEM_CLS(E) drain::NodeXML<drain::image::svg::tag_t>::Elem<drain::image::svg::tag_t::E>
50#define DRAIN_SVG_ELEM(E) typedef drain::NodeXML<drain::image::svg::tag_t>::Elem<drain::image::svg::tag_t::E> svg##E;
59template <>
template <>
60class DRAIN_SVG_ELEM_CLS(RECT){
65 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::RECT), x(node[
"x"]), y(node[
"y"]), width(node[
"width"]), height(node[
"height"]){
68 NodeXML<image::svg::tag_t> & node;
81class DRAIN_SVG_ELEM_CLS(CIRCLE){
85 NodeXML<image::svg::tag_t> & node;
88 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::CIRCLE), cx(node[
"cx"]), cy(node[
"cy"]), r(node[
"r"] = 0.0){
102DRAIN_SVG_ELEM(CIRCLE)
108class DRAIN_SVG_ELEM_CLS(POLYGON){
113 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::POLYGON), points(node[
"points"]), writablePoints(node[
"points"]){
116 NodeXML<image::svg::tag_t> & node;
127 writablePoints.clear();
130 template <
typename T>
132 void append(
const T &x,
const T &y){
133 writablePoints << x <<
',' << y <<
' ';
136 template <
typename T>
139 writablePoints << p.x <<
',' << p.y <<
' ';
143DRAIN_SVG_ELEM(POLYGON)
149class DRAIN_SVG_ELEM_CLS(PATH){
154 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::PATH), d(node[
"d"]) {
165 NodeXML<image::svg::tag_t> & node;
189 template <Command C,
typename ...T>
190 void relative(
const T... args){
191 appendCmd<C,RELATIVE>();
192 appendArgs<C>(args...);
195 template <Command C,
typename ...T>
196 void absolute(
const T... args){
197 appendCmd<C,ABSOLUTE>();
198 appendArgs<C>(args...);
210 std::stringstream sstr;
217 node[
"d"].append(sstr.str());
221 node[
"d"] = sstr.str();
227 template <Command C, Coord R=RELATIVE>
230 sstr << char(
int(C) +
int(R)) <<
' ';
237 void appendArgs(
double x,
double y);
240 void appendArgs(
double x,
double y,
double x2,
double y2);
243 void appendArgs(
double x,
double y,
double x2,
double y2,
double x3,
double y3);
246 template <Command C,
typename T>
249 appendArgs<C>(p.x, p.y);
252 template <Command C,
typename T>
255 appendArgs<C>(p.x, p.y, p2.x, p2.y);
258 template <Command C,
typename T>
261 appendArgs<C>(p.x, p.y, p2.x, p2.y, p3.x, p3.y);
267 void appendPoint(
double x){
271 template <
typename T>
274 sstr << p.x <<
' ' << p.y <<
' ';
279 template <
typename ...TT>
281 void appendPoints(
double x,
double y,
const TT... args){
283 sstr << x <<
' ' << y;
284 appendMorePoints(args...);
288 template <
typename T,
typename ...TT>
291 sstr << p.x <<
' ' << p.y;
293 appendMorePoints(args...);
296 template <
typename ...TT>
298 void appendMorePoints(
const TT... args){
300 appendPoints(args...);
305 void appendMorePoints(){
318void svgPATH::appendArgs<svgPATH::CLOSE>(){
324void svgPATH::appendArgs<svgPATH::MOVE>(
double x,
double y){
330void svgPATH::appendArgs<svgPATH::LINE>(
double x,
double y){
336void svgPATH::appendArgs<svgPATH::CURVE_C>(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3){
337 appendPoints(x1,y1, x2,y2, x3,y3);
342void svgPATH::appendArgs<svgPATH::CURVE_C_SHORT>(
double x2,
double y2,
double x,
double y){
343 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:67