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){
63 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::RECT), x(node[
"x"]), y(node[
"y"]), width(node[
"width"]), height(node[
"height"]){
66 NodeXML<image::svg::tag_t> & node;
79class DRAIN_SVG_ELEM_CLS(CIRCLE){
83 NodeXML<image::svg::tag_t> & node;
86 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::CIRCLE), cx(node[
"cx"]), cy(node[
"cy"]), r(node[
"r"] = 0.0){
100DRAIN_SVG_ELEM(CIRCLE)
106class DRAIN_SVG_ELEM_CLS(POLYGON){
111 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::POLYGON), points(node[
"points"]), writablePoints(node[
"points"]){
114 NodeXML<image::svg::tag_t> & node;
125 writablePoints.clear();
128 template <
typename T>
130 void append(
const T &x,
const T &y){
131 writablePoints << x <<
',' << y <<
' ';
134 template <
typename T>
137 writablePoints << p.x <<
',' << p.y <<
' ';
141DRAIN_SVG_ELEM(POLYGON)
147class DRAIN_SVG_ELEM_CLS(PATH){
151 Elem(image::NodeSVG & node) : node(node = image::svg::tag_t::PATH), d(node[
"d"]) {
161 NodeXML<image::svg::tag_t> & node;
185 template <Command C,
typename ...T>
186 void relative(
const T... args){
187 appendCmd<C,RELATIVE>();
188 appendArgs<C>(args...);
191 template <Command C,
typename ...T>
192 void absolute(
const T... args){
193 appendCmd<C,ABSOLUTE>();
194 appendArgs<C>(args...);
206 std::stringstream sstr;
212 node[
"d"].append(sstr.str());
216 node[
"d"] = sstr.str();
222 template <Command C, Coord R=RELATIVE>
225 sstr << char(
int(C) +
int(R)) <<
' ';
232 void appendArgs(
double x,
double y);
235 void appendArgs(
double x,
double y,
double x2,
double y2);
238 void appendArgs(
double x,
double y,
double x2,
double y2,
double x3,
double y3);
241 template <Command C,
typename T>
244 appendArgs<C>(p.x, p.y);
247 template <Command C,
typename T>
250 appendArgs<C>(p.x, p.y, p2.x, p2.y);
253 template <Command C,
typename T>
256 appendArgs<C>(p.x, p.y, p2.x, p2.y, p3.x, p3.y);
262 void appendPoint(
double x){
266 template <
typename T>
269 sstr << p.x <<
' ' << p.y <<
' ';
274 template <
typename ...TT>
276 void appendPoints(
double x,
double y,
const TT... args){
278 sstr << x <<
' ' << y;
279 appendMorePoints(args...);
283 template <
typename T,
typename ...TT>
286 sstr << p.x <<
' ' << p.y;
288 appendMorePoints(args...);
291 template <
typename ...TT>
293 void appendMorePoints(
const TT... args){
295 appendPoints(args...);
300 void appendMorePoints(){
313void svgPATH::appendArgs<svgPATH::CLOSE>(){
319void svgPATH::appendArgs<svgPATH::MOVE>(
double x,
double y){
325void svgPATH::appendArgs<svgPATH::LINE>(
double x,
double y){
331void svgPATH::appendArgs<svgPATH::CURVE_C>(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3){
332 appendPoints(x1,y1, x2,y2, x3,y3);
337void svgPATH::appendArgs<svgPATH::CURVE_C_SHORT>(
double x2,
double y2,
double x,
double y){
338 appendPoints(x2,y2, x,y);
VariableT< VariableInitializer< ReferenceT< VariableBase > > > FlexibleVariable
Value container supporting dynamic type with own memory and optional linking (referencing) of externa...
Definition FlexibleVariable.h:66