diff --git a/uppsrc/Core/Topt.h b/uppsrc/Core/Topt.h index b69a8f8d0..85fad3230 100644 --- a/uppsrc/Core/Topt.h +++ b/uppsrc/Core/Topt.h @@ -178,8 +178,6 @@ inline void AssertMoveable() {} template class Moveable : public B { -public: -// void operator=(const Moveable& b) { B::operator = (b); } // MSC 6.0 empty base class bug fix }; #define NTL_MOVEABLE(T) @@ -209,25 +207,67 @@ inline void AssertMoveable(T *t = 0) { if(t) AssertMoveable0(t); } #endif -NTL_MOVEABLE(bool); -NTL_MOVEABLE(char); -NTL_MOVEABLE(signed char); -NTL_MOVEABLE(unsigned char); -NTL_MOVEABLE(short); -NTL_MOVEABLE(unsigned short); -NTL_MOVEABLE(int); -NTL_MOVEABLE(unsigned int); -NTL_MOVEABLE(long); -NTL_MOVEABLE(unsigned long); -NTL_MOVEABLE(int64); -NTL_MOVEABLE(uint64); -NTL_MOVEABLE(float); -NTL_MOVEABLE(double); -NTL_MOVEABLE(void *); -NTL_MOVEABLE(const void *); +template +inline void Swap_(T& a, T& b) { T tmp = a; a = b; b = tmp; } + +template +inline void MoveableSwap(T& x, T& y) +{ + if(sizeof(T) == 1) + Swap_(*(byte *)&x, *(byte *)&y); + else + if(sizeof(T) == 2) + Swap_(*(uint16 *)&x, *(uint16 *)&y); + else + if(sizeof(T) == 4) + Swap_(*(uint32 *)&x, *(uint32 *)&y); + else + if(sizeof(T) == 8) + Swap_(*(uint64 *)&x, *(uint64 *)&y); + else + if(sizeof(T) == 12) { + Swap_(*(uint64 *)&x, *(uint64 *)&y); + Swap_(*((uint32 *)&x + 2), *((uint32 *)&y + 2)); + } + else + if(sizeof(T) == 16) { + Swap_(*(uint64 *)&x, *(uint64 *)&y); + Swap_(*((uint64 *)&x + 1), *((uint64 *)&y + 1)); + } + else + Swap_(x, y); +} + +template +class MoveableWithSwap : public Moveable { + friend void Swap(T& a, T& b) { MoveableSwap(a, b); } + friend void IterSwap(T *a, T *b) { Swap(*a, *b); } +}; + +#define NTL_MOVEABLE_WITH_SWAP(T) \ + inline void Swap(T& a, T& b) { MoveableSwap(a, b); } \ + inline void IterSwap(T *a, T *b) { MoveableSwap(*a, *b); } \ + NTL_MOVEABLE(T) + +NTL_MOVEABLE_WITH_SWAP(bool); +NTL_MOVEABLE_WITH_SWAP(char); +NTL_MOVEABLE_WITH_SWAP(signed char); +NTL_MOVEABLE_WITH_SWAP(unsigned char); +NTL_MOVEABLE_WITH_SWAP(short); +NTL_MOVEABLE_WITH_SWAP(unsigned short); +NTL_MOVEABLE_WITH_SWAP(int); +NTL_MOVEABLE_WITH_SWAP(unsigned int); +NTL_MOVEABLE_WITH_SWAP(long); +NTL_MOVEABLE_WITH_SWAP(unsigned long); +NTL_MOVEABLE_WITH_SWAP(int64); +NTL_MOVEABLE_WITH_SWAP(uint64); +NTL_MOVEABLE_WITH_SWAP(float); +NTL_MOVEABLE_WITH_SWAP(double); +NTL_MOVEABLE_WITH_SWAP(void *); +NTL_MOVEABLE_WITH_SWAP(const void *); #if defined(_NATIVE_WCHAR_T_DEFINED) || defined(COMPILER_GCC) -NTL_MOVEABLE(wchar_t); +NTL_MOVEABLE_WITH_SWAP(wchar_t); #endif template diff --git a/uppsrc/Painter/Painter.h b/uppsrc/Painter/Painter.h index 7efeea312..1fd503922 100644 --- a/uppsrc/Painter/Painter.h +++ b/uppsrc/Painter/Painter.h @@ -1,263 +1,263 @@ -#ifndef _SDraw_SDraw_h -#define _SDraw_SDraw_h - -#include - -#define PAINTER_TIMING(x) // RTIMING(x) - -#define AGGUPP 1 - -#include "agg_basics.h" -#include "agg_renderer_base.h" -#include "agg_renderer_scanline.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_scanline_u.h" -#include "agg_scanline_p.h" -#include "agg_path_storage.h" -#include "agg_conv_transform.h" -#include "agg_conv_stroke.h" -#include "agg_conv_curve.h" -#include "agg_conv_dash.h" -#include "agg_span_allocator.h" -#include "agg_span_interpolator_linear.h" -#include "agg_alpha_mask_u8.h" - -NAMESPACE_UPP - -struct Matrix2D : agg::trans_affine { - Matrix2D operator*(const Matrix2D& s) const { Matrix2D x = *this; x *= s; return x; } - - void Transform(double& x, double& y) const { transform(&x, &y); } - Pointf Transformed(double x, double y) const { Transform(x, y); return Pointf(x, y); } - Pointf Transformed(Pointf p) const { Transform(p.x, p.y); return p; } - Matrix2D Inverted() const { Matrix2D h = *this; h.invert(); return h; } -}; - -Matrix2D Translate2D(double x, double y); -Matrix2D Rotate2D(double angle); -Matrix2D Scale2D(double scalex, double scaley); -Matrix2D Scale2D(double scale); -Matrix2D Sheer2D(); - -enum { - LINECAP_BUTT = agg::butt_cap, - LINECAP_SQUARE = agg::square_cap, - LINECAP_ROUND = agg::round_cap, - - LINEJOIN_MITER = agg::miter_join, - LINEJOIN_ROUND = agg::round_join, - LINEJOIN_BEVEL = agg::bevel_join, - - FILL_EXACT = 0, - - FILL_HPAD = 1, - FILL_HREPEAT = 2, - FILL_HREFLECT = 3, - - FILL_VPAD = 4, - FILL_VREPEAT = 8, - FILL_VREFLECT = 12, - - FILL_PAD = FILL_HPAD|FILL_VPAD, - FILL_REPEAT = FILL_HREPEAT|FILL_VREPEAT, - FILL_REFLECT = FILL_HREFLECT|FILL_VREFLECT, - - FILL_FAST = 128, - - GRADIENT_PAD = 0, - GRADIENT_REPEAT = 1, - GRADIENT_REFLECT = 2, -}; - -class Painting; - -class Painter : public Draw { -protected: - virtual void OffsetOp(Point p); - virtual bool ClipOp(const Rect& r); - virtual bool ClipoffOp(const Rect& r); - virtual bool ExcludeClipOp(const Rect& r); - virtual bool IntersectClipOp(const Rect& r); - virtual Rect GetClipOp() const; - virtual bool IsPaintingOp(const Rect& r) const; - - virtual void DrawRectOp(int x, int y, int cx, int cy, Color color); - virtual void DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color); - virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color); - - virtual void DrawPolyPolylineOp(const Point *vertices, int vertex_count, - const int *counts, int count_count, - int width, Color color, Color doxor); - virtual void DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count, - const int *subpolygon_counts, int scc, - const int *disjunct_polygon_counts, int dpcc, - Color color, int width, Color outline, - uint64 pattern, Color doxor); - virtual void DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color); - - virtual void DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor); - virtual void DrawTextOp(int x, int y, int angle, const wchar *text, Font font, - Color ink, int n, const int *dx); - virtual void DrawPaintingOp(const Rect& target, const Painting& w); - -protected: - virtual void ClearOp(const RGBA& color) = 0; - - virtual void MoveOp(double x, double y, bool rel) = 0; - virtual void LineOp(double x, double y, bool rel) = 0; - virtual void QuadraticOp(double x1, double y1, double x, double y, bool rel) = 0; - virtual void QuadraticOp(double x, double y, bool rel) = 0; - virtual void CubicOp(double x1, double y1, double x2, double y2, double x, double y, bool rel) = 0; - virtual void CubicOp(double x2, double y2, double x, double y, bool rel) = 0; - virtual void CloseOp() = 0; - - virtual void FillOp(const RGBA& color) = 0; - virtual void FillOp(const Image& image, const Matrix2D& transsrc, dword flags) = 0; - virtual void FillOp(double x1, double y1, const RGBA& color1, - double x2, double y2, const RGBA& color2, - int style) = 0; - virtual void FillOp(double fx, double fy, const RGBA& color1, - double x1, double y1, double r, const RGBA& color2, - int style) = 0; - - virtual void StrokeOp(double width, const RGBA& rgba) = 0; - virtual void StrokeOp(double width, const Image& image, const Matrix2D& transsrc, - dword flags) = 0; - virtual void StrokeOp(double width, double x1, double y1, const RGBA& color1, - double x2, double y2, const RGBA& color2, - int style) = 0; - virtual void StrokeOp(double width, double fx, double fy, const RGBA& color1, - double x, double y, double r, const RGBA& color2, - int style) = 0; - - virtual void ClipOp() = 0; - - virtual void CharacterOp(double x, double y, int ch, Font fnt); - virtual void TextOp(double x, double y, const wchar *text, Font fnt, int n = -1, double *dx = NULL); - - virtual void ColorStopOp(double pos, const RGBA& color) = 0; - virtual void ClearStopsOp() = 0; - - virtual void OpacityOp(double o) = 0; - virtual void LineCapOp(int linecap) = 0; - virtual void LineJoinOp(int linejoin) = 0; - virtual void MiterLimitOp(double l) = 0; - virtual void EvenOddOp(bool evenodd) = 0; - virtual void DashOp(const Vector& dash, double start = 0) = 0; - virtual void NoAAOp(bool noaa) = 0; - - virtual void TransformOp(const Matrix2D& m) = 0; - - virtual void BeginOp() = 0; - virtual void EndOp() = 0; - - virtual void BeginMaskOp() = 0; - -private: - Pointf ReadPoint(CParser& p); - void RectPath(int x, int y, int cx, int cy); - void RectPath(const Rect& r); - - static RGBA GetRGBA(StringStream& ss); - -public: - void Clear(const RGBA& color); - - Painter& Move(double x, double y, bool rel); - Painter& Line(double x, double y, bool rel); - Painter& Quadratic(double x1, double y1, double x, double y, bool rel); - Painter& Quadratic(double x, double y, bool rel); - Painter& Cubic(double x1, double y1, double x2, double y2, double x, double y, bool rel); - Painter& Cubic(double x2, double y2, double x, double y, bool rel); - - Painter& Move(double x, double y); - Painter& Line(double x, double y); - Painter& Quadratic(double x1, double y1, double x, double y); - Painter& Quadratic(double x, double y); - Painter& Cubic(double x1, double y1, double x2, double y2, double x, double y); - Painter& Cubic(double x2, double y2, double x, double y); - - Painter& RelMove(double x, double y); - Painter& RelLine(double x, double y); - Painter& RelQuadratic(double x1, double y1, double x, double y); - Painter& RelQuadratic(double x, double y); - Painter& RelCubic(double x1, double y1, double x2, double y2, double x, double y); - Painter& RelCubic(double x2, double y2, double x, double y); - - Painter& Close(); - - Painter& Fill(const RGBA& color); - Painter& Fill(const Image& image, const Matrix2D& transsrc = Matrix2D(), dword flags = 0); - Painter& Fill(const Image& image, double x1, double y1, double x2, double y2, - dword flags = 0); - Painter& Fill(double x1, double y1, const RGBA& color1, - double x2, double y2, const RGBA& color2, int style = GRADIENT_PAD); - Painter& Fill(double fx, double fy, const RGBA& color1, - double x, double y, double r, const RGBA& color2, int style = GRADIENT_PAD); - Painter& Fill(double x, double y, const RGBA& color1, - double r, const RGBA& color2, int style = GRADIENT_PAD); - - Painter& Stroke(double width, const RGBA& color); - Painter& Stroke(double width, const Image& image, const Matrix2D& transsrc, dword flags = 0); - Painter& Stroke(double width, const Image& image, double x1, double y1, double x2, double y2, - dword flags = 0); - Painter& Stroke(double width, double x1, double y1, const RGBA& color1, - double x2, double y2, const RGBA& color2, - int style = GRADIENT_PAD); - Painter& Stroke(double width, double fx, double fy, const RGBA& color1, - double x1, double y1, double r, const RGBA& color2, int style = GRADIENT_PAD); - Painter& Stroke(double width, double x1, double y1, const RGBA& color1, - double r, const RGBA& color2, int style = GRADIENT_PAD); - - Painter& Clip(); - - Painter& Character(double x, double y, int ch, Font fnt); - Painter& Text(double x, double y, const wchar *text, Font fnt, int n = -1, double *dx = NULL); - Painter& Text(double x, double y, const WString& s, Font fnt, double *dx = NULL); - Painter& Text(double x, double y, const String& s, Font fnt, double *dx = NULL); - Painter& Text(double x, double y, const char *text, Font fnt, int n = -1, double *dx = NULL); - - Painter& Path(CParser& p); - Painter& Path(const char *path); - - Painter& ColorStop(double pos, const RGBA& color); - Painter& ClearStops(); - - Painter& Opacity(double o); - Painter& LineCap(int linecap); - Painter& LineJoin(int linejoin); - Painter& MiterLimit(double l); - Painter& EvenOdd(bool evenodd); - Painter& Dash(const Vector& dash, double start = 0); - Painter& Dash(const char *dash, double start = 0); - Painter& NoAA(bool noaa = true); - - void Transform(const Matrix2D& m); - - void Begin(); - void End(); - - void BeginMask(); - - void Translate(double x, double y); - void Rotate(double a); - void Scale(double scalex, double scaley); - void Scale(double scale); - - void Paint(const Painting& p); - - Painter& Arc(double x, double y, double rx, double ry, - double start_angle, double sweep_angle, bool startline = false); - Painter& Ellipse(double x, double y, double rx, double ry); - Painter& Circle(double x, double y, double r); - Painter& Rectangle(double x, double y, double cx, double cy); -}; - -#include "BufferPainter.h" -#include "Painting.h" - -END_UPP_NAMESPACE - -#include "Painter.hpp" - -#endif +#ifndef _SDraw_SDraw_h +#define _SDraw_SDraw_h + +#include + +#define PAINTER_TIMING(x) // RTIMING(x) + +#define AGGUPP 1 + +#include "agg_basics.h" +#include "agg_renderer_base.h" +#include "agg_renderer_scanline.h" +#include "agg_rasterizer_scanline_aa.h" +#include "agg_scanline_u.h" +#include "agg_scanline_p.h" +#include "agg_path_storage.h" +#include "agg_conv_transform.h" +#include "agg_conv_stroke.h" +#include "agg_conv_curve.h" +#include "agg_conv_dash.h" +#include "agg_span_allocator.h" +#include "agg_span_interpolator_linear.h" +#include "agg_alpha_mask_u8.h" + +NAMESPACE_UPP + +struct Matrix2D : agg::trans_affine { + Matrix2D operator*(const Matrix2D& s) const { Matrix2D x = *this; x *= s; return x; } + + void Transform(double& x, double& y) const { transform(&x, &y); } + Pointf Transformed(double x, double y) const { Transform(x, y); return Pointf(x, y); } + Pointf Transformed(Pointf p) const { Transform(p.x, p.y); return p; } + Matrix2D Inverted() const { Matrix2D h = *this; h.invert(); return h; } +}; + +Matrix2D Translate2D(double x, double y); +Matrix2D Rotate2D(double angle); +Matrix2D Scale2D(double scalex, double scaley); +Matrix2D Scale2D(double scale); +Matrix2D Sheer2D(); + +enum { + LINECAP_BUTT = agg::butt_cap, + LINECAP_SQUARE = agg::square_cap, + LINECAP_ROUND = agg::round_cap, + + LINEJOIN_MITER = agg::miter_join, + LINEJOIN_ROUND = agg::round_join, + LINEJOIN_BEVEL = agg::bevel_join, + + FILL_EXACT = 0, + + FILL_HPAD = 1, + FILL_HREPEAT = 2, + FILL_HREFLECT = 3, + + FILL_VPAD = 4, + FILL_VREPEAT = 8, + FILL_VREFLECT = 12, + + FILL_PAD = FILL_HPAD|FILL_VPAD, + FILL_REPEAT = FILL_HREPEAT|FILL_VREPEAT, + FILL_REFLECT = FILL_HREFLECT|FILL_VREFLECT, + + FILL_FAST = 128, + + GRADIENT_PAD = 0, + GRADIENT_REPEAT = 1, + GRADIENT_REFLECT = 2, +}; + +class Painting; + +class Painter : public Draw { +protected: + virtual void OffsetOp(Point p); + virtual bool ClipOp(const Rect& r); + virtual bool ClipoffOp(const Rect& r); + virtual bool ExcludeClipOp(const Rect& r); + virtual bool IntersectClipOp(const Rect& r); + virtual Rect GetClipOp() const; + virtual bool IsPaintingOp(const Rect& r) const; + + virtual void DrawRectOp(int x, int y, int cx, int cy, Color color); + virtual void DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color); + virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color); + + virtual void DrawPolyPolylineOp(const Point *vertices, int vertex_count, + const int *counts, int count_count, + int width, Color color, Color doxor); + virtual void DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count, + const int *subpolygon_counts, int scc, + const int *disjunct_polygon_counts, int dpcc, + Color color, int width, Color outline, + uint64 pattern, Color doxor); + virtual void DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color); + + virtual void DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor); + virtual void DrawTextOp(int x, int y, int angle, const wchar *text, Font font, + Color ink, int n, const int *dx); + virtual void DrawPaintingOp(const Rect& target, const Painting& w); + +protected: + virtual void ClearOp(const RGBA& color) = 0; + + virtual void MoveOp(double x, double y, bool rel) = 0; + virtual void LineOp(double x, double y, bool rel) = 0; + virtual void QuadraticOp(double x1, double y1, double x, double y, bool rel) = 0; + virtual void QuadraticOp(double x, double y, bool rel) = 0; + virtual void CubicOp(double x1, double y1, double x2, double y2, double x, double y, bool rel) = 0; + virtual void CubicOp(double x2, double y2, double x, double y, bool rel) = 0; + virtual void CloseOp() = 0; + + virtual void FillOp(const RGBA& color) = 0; + virtual void FillOp(const Image& image, const Matrix2D& transsrc, dword flags) = 0; + virtual void FillOp(double x1, double y1, const RGBA& color1, + double x2, double y2, const RGBA& color2, + int style) = 0; + virtual void FillOp(double fx, double fy, const RGBA& color1, + double x1, double y1, double r, const RGBA& color2, + int style) = 0; + + virtual void StrokeOp(double width, const RGBA& rgba) = 0; + virtual void StrokeOp(double width, const Image& image, const Matrix2D& transsrc, + dword flags) = 0; + virtual void StrokeOp(double width, double x1, double y1, const RGBA& color1, + double x2, double y2, const RGBA& color2, + int style) = 0; + virtual void StrokeOp(double width, double fx, double fy, const RGBA& color1, + double x, double y, double r, const RGBA& color2, + int style) = 0; + + virtual void ClipOp() = 0; + + virtual void CharacterOp(double x, double y, int ch, Font fnt); + virtual void TextOp(double x, double y, const wchar *text, Font fnt, int n = -1, double *dx = NULL); + + virtual void ColorStopOp(double pos, const RGBA& color) = 0; + virtual void ClearStopsOp() = 0; + + virtual void OpacityOp(double o) = 0; + virtual void LineCapOp(int linecap) = 0; + virtual void LineJoinOp(int linejoin) = 0; + virtual void MiterLimitOp(double l) = 0; + virtual void EvenOddOp(bool evenodd) = 0; + virtual void DashOp(const Vector& dash, double start = 0) = 0; + virtual void NoAAOp(bool noaa) = 0; + + virtual void TransformOp(const Matrix2D& m) = 0; + + virtual void BeginOp() = 0; + virtual void EndOp() = 0; + + virtual void BeginMaskOp() = 0; + +private: + Pointf ReadPoint(CParser& p); + void RectPath(int x, int y, int cx, int cy); + void RectPath(const Rect& r); + + static RGBA GetRGBA(StringStream& ss); + +public: + void Clear(const RGBA& color); + + Painter& Move(double x, double y, bool rel); + Painter& Line(double x, double y, bool rel); + Painter& Quadratic(double x1, double y1, double x, double y, bool rel); + Painter& Quadratic(double x, double y, bool rel); + Painter& Cubic(double x1, double y1, double x2, double y2, double x, double y, bool rel); + Painter& Cubic(double x2, double y2, double x, double y, bool rel); + + Painter& Move(double x, double y); + Painter& Line(double x, double y); + Painter& Quadratic(double x1, double y1, double x, double y); + Painter& Quadratic(double x, double y); + Painter& Cubic(double x1, double y1, double x2, double y2, double x, double y); + Painter& Cubic(double x2, double y2, double x, double y); + + Painter& RelMove(double x, double y); + Painter& RelLine(double x, double y); + Painter& RelQuadratic(double x1, double y1, double x, double y); + Painter& RelQuadratic(double x, double y); + Painter& RelCubic(double x1, double y1, double x2, double y2, double x, double y); + Painter& RelCubic(double x2, double y2, double x, double y); + + Painter& Close(); + + Painter& Fill(const RGBA& color); + Painter& Fill(const Image& image, const Matrix2D& transsrc = Matrix2D(), dword flags = 0); + Painter& Fill(const Image& image, double x1, double y1, double x2, double y2, + dword flags = 0); + Painter& Fill(double x1, double y1, const RGBA& color1, + double x2, double y2, const RGBA& color2, int style = GRADIENT_PAD); + Painter& Fill(double fx, double fy, const RGBA& color1, + double x, double y, double r, const RGBA& color2, int style = GRADIENT_PAD); + Painter& Fill(double x, double y, const RGBA& color1, + double r, const RGBA& color2, int style = GRADIENT_PAD); + + Painter& Stroke(double width, const RGBA& color); + Painter& Stroke(double width, const Image& image, const Matrix2D& transsrc, dword flags = 0); + Painter& Stroke(double width, const Image& image, double x1, double y1, double x2, double y2, + dword flags = 0); + Painter& Stroke(double width, double x1, double y1, const RGBA& color1, + double x2, double y2, const RGBA& color2, + int style = GRADIENT_PAD); + Painter& Stroke(double width, double fx, double fy, const RGBA& color1, + double x1, double y1, double r, const RGBA& color2, int style = GRADIENT_PAD); + Painter& Stroke(double width, double x1, double y1, const RGBA& color1, + double r, const RGBA& color2, int style = GRADIENT_PAD); + + Painter& Clip(); + + Painter& Character(double x, double y, int ch, Font fnt); + Painter& Text(double x, double y, const wchar *text, Font fnt, int n = -1, double *dx = NULL); + Painter& Text(double x, double y, const WString& s, Font fnt, double *dx = NULL); + Painter& Text(double x, double y, const String& s, Font fnt, double *dx = NULL); + Painter& Text(double x, double y, const char *text, Font fnt, int n = -1, double *dx = NULL); + + Painter& Path(CParser& p); + Painter& Path(const char *path); + + Painter& ColorStop(double pos, const RGBA& color); + Painter& ClearStops(); + + Painter& Opacity(double o); + Painter& LineCap(int linecap); + Painter& LineJoin(int linejoin); + Painter& MiterLimit(double l); + Painter& EvenOdd(bool evenodd); + Painter& Dash(const Vector& dash, double start = 0); + Painter& Dash(const char *dash, double start = 0); + Painter& NoAA(bool noaa = true); + + void Transform(const Matrix2D& m); + + void Begin(); + void End(); + + void BeginMask(); + + void Translate(double x, double y); + void Rotate(double a); + void Scale(double scalex, double scaley); + void Scale(double scale); + + void Paint(const Painting& p); + + Painter& Arc(double x, double y, double rx, double ry, + double start_angle, double sweep_angle, bool startline = false); + Painter& Ellipse(double x, double y, double rx, double ry); + Painter& Circle(double x, double y, double r); + Painter& Rectangle(double x, double y, double cx, double cy); +}; + +#include "BufferPainter.h" +#include "Painting.h" + +END_UPP_NAMESPACE + +#include "Painter.hpp" + +#endif