1 /// 2 module plot2d.backend.base; 3 4 public import plot2d.types; 5 6 /// 7 interface Ctx 8 { 9 /// 10 void save(); 11 /// 12 void restore(); 13 /// 14 void stroke(); 15 /// 16 void fill(); 17 /// 18 void moveTo(double x, double y); 19 /// 20 void lineTo(double x, double y); 21 /// 22 void setLineWidth(double lw); 23 /// 24 void showText(string str); 25 /// 26 void setDash(double[] dash, double offset); 27 /// 28 void setColor(double r, double g, double b, double a=1); 29 /// 30 void getTextSize(string str, out double w, out double h); 31 /// 32 void setFont(string name, double size); 33 /// 34 void clipViewport(Viewport vp); 35 36 final: 37 /// 38 void moveToP(P)(P p) { moveTo(p.x, p.y); } 39 /// 40 void lineToP(P)(P p) { lineTo(p.x, p.y); } 41 /// 42 void lineP2P()(auto ref const Point p0, Point[] ps...) 43 { 44 moveToP(p0); 45 foreach (p; ps) lineToP(p); 46 } 47 /// 48 void lineP2P()(double x1, double y1, double x2, double y2) 49 { lineP2P(Point(x1, y1), Point(x2, y2)); } 50 /// 51 void setColor(C)(C c) { setColor(c.r, c.g, c.b, c.a); } 52 /// 53 void setColor(C)(C c, double a) { setColor(c.r, c.g, c.b, a); } 54 } 55 56 /++ mixin string for saving Context 57 and restore on exit from scope 58 +/ 59 string scopeSave(alias cr)() 60 if (is(typeof(cr) == Ctx)) 61 { 62 import std..string : format; 63 return format(q{ 64 %1$s.save(); 65 scope(exit) 66 %1$s.restore(); 67 }, __traits(identifier, cr)); 68 }