From 48402c08b2f737b68bc151eb2308940f6184d580 Mon Sep 17 00:00:00 2001 From: cxl Date: Sat, 18 Jul 2009 06:37:44 +0000 Subject: [PATCH] Developing ImageAnyDraw git-svn-id: svn://ultimatepp.org/upp/trunk@1433 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppdev/AnyImageDraw/AnyImageDraw.cpp | 160 +++++++++++++++++++++++++++ uppdev/AnyImageDraw/AnyImageDraw.h | 67 +++++++++++ uppdev/AnyImageDraw/AnyImageDraw.lay | 3 + uppdev/AnyImageDraw/AnyImageDraw.upp | 13 +++ uppdev/AnyImageDraw/init | 5 + uppdev/AnyImageDraw/main.cpp | 48 ++++++++ 6 files changed, 296 insertions(+) create mode 100644 uppdev/AnyImageDraw/AnyImageDraw.cpp create mode 100644 uppdev/AnyImageDraw/AnyImageDraw.h create mode 100644 uppdev/AnyImageDraw/AnyImageDraw.lay create mode 100644 uppdev/AnyImageDraw/AnyImageDraw.upp create mode 100644 uppdev/AnyImageDraw/init create mode 100644 uppdev/AnyImageDraw/main.cpp diff --git a/uppdev/AnyImageDraw/AnyImageDraw.cpp b/uppdev/AnyImageDraw/AnyImageDraw.cpp new file mode 100644 index 000000000..c31ca64ba --- /dev/null +++ b/uppdev/AnyImageDraw/AnyImageDraw.cpp @@ -0,0 +1,160 @@ +#include "AnyImageDraw.h" + +dword ImageAnyDraw::GetInfo() const +{ + return draw->GetInfo(); +} + +Size ImageAnyDraw::GetPageSize() const +{ + return draw->GetPageSize(); +} + +void ImageAnyDraw::BeginOp() +{ + return draw->BeginOp(); +} + +void ImageAnyDraw::EndOp() +{ + return draw->EndOp(); +} + +void ImageAnyDraw::OffsetOp(Point p) +{ + return draw->OffsetOp(p); +} + +bool ImageAnyDraw::ClipOp(const Rect& r) +{ + return draw->ClipOp(r); +} + +bool ImageAnyDraw::ClipoffOp(const Rect& r) +{ + return draw->ClipoffOp(r); +} + +bool ImageAnyDraw::ExcludeClipOp(const Rect& r) +{ + return draw->ExcludeClipOp(r); +} + +bool ImageAnyDraw::IntersectClipOp(const Rect& r) +{ + return draw->IntersectClipOp(r); +} + +bool ImageAnyDraw::IsPaintingOp(const Rect& r) const +{ + return draw->IsPaintingOp(r); +} + +Rect ImageAnyDraw::GetPaintRect() const +{ + return draw->GetPaintRect(); +} + +void ImageAnyDraw::DrawRectOp(int x, int y, int cx, int cy, Color color) +{ + draw->DrawRectOp(x, y, cx, cy, color); +} + +void ImageAnyDraw::DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color) +{ + draw->DrawImageOp(x, y, cx, cy, img, src, color); +} + +void ImageAnyDraw::DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id) +{ + draw->DrawDataOp(x, y, cx, cy, data, id); +} + +void ImageAnyDraw::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color) +{ + draw->DrawLineOp(x1, y1, x2, y2, width, color); +} + +void ImageAnyDraw::DrawPolyPolylineOp(const Point *vertices, int vertex_count, + const int *counts, int count_count, int width, + Color color, Color doxor) +{ + draw->DrawPolyPolylineOp(vertices, vertex_count, counts, count_count, width, color, doxor); +} + +void ImageAnyDraw::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) +{ + draw->DrawPolyPolyPolygonOp(vertices, vertex_count, subpolygon_counts, scc, + disjunct_polygon_counts, dpcc, color, width, outline, + pattern, doxor); +} + +void ImageAnyDraw::DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color) +{ + draw->DrawArcOp(rc, start, end, width, color); +} + +void ImageAnyDraw::DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor) +{ + draw->DrawEllipseOp(r, color, pen, pencolor); +} + +void ImageAnyDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, + int n, const int *dx) +{ + draw->DrawTextOp(x, y, angle, text, font, ink, n, dx); +} + +void ImageAnyDraw::DrawDrawingOp(const Rect& target, const Drawing& w) +{ + draw->DrawDrawingOp(target, w); +} + +void ImageAnyDraw::DrawPaintingOp(const Rect& target, const Painting& w) +{ + draw->DrawPaintingOp(target, w); +} + +Draw *(*sCreateImageDraw)(Size sz); +Image (*sExtractImageDraw)(Draw *w); + +void ImageAnyDrawPainter(Draw *(*f)(Size sz), Image (*e)(Draw *w)) +{ + sCreateImageDraw = f; + sExtractImageDraw = e; +} + +void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w)) +{ + if(!sCreateImageDraw) { + sCreateImageDraw = f; + sExtractImageDraw = e; + } +} + +void ImageAnyDraw::Init(Size sz) +{ + ASSERT(sCreateImageDraw); + draw = (*sCreateImageDraw)(sz); + ASSERT(draw); +} + +ImageAnyDraw::operator Image() const +{ + return (*sExtractImageDraw)(draw); +} + +ImageAnyDraw::ImageAnyDraw(Size sz) +{ + Init(sz); +} + +ImageAnyDraw::ImageAnyDraw(int cx, int cy) +{ + Init(Size(cx, cy)); +} + +ImageAnyDraw::~ImageAnyDraw() +{ + delete draw; +} diff --git a/uppdev/AnyImageDraw/AnyImageDraw.h b/uppdev/AnyImageDraw/AnyImageDraw.h new file mode 100644 index 000000000..2d544f785 --- /dev/null +++ b/uppdev/AnyImageDraw/AnyImageDraw.h @@ -0,0 +1,67 @@ +#ifndef _AnyImageDraw_AnyImageDraw_h +#define _AnyImageDraw_AnyImageDraw_h + +#include +#include + +using namespace Upp; + +#define LAYOUTFILE +#include + +class ImageAnyDraw : public Draw { + Draw *draw; + + void Init(Size sz); + +public: + virtual dword GetInfo() const; + virtual Size GetPageSize() const; + virtual void BeginOp(); + virtual void EndOp(); + 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 bool IsPaintingOp(const Rect& r) const; + virtual Rect GetPaintRect() 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 DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id); + 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 DrawDrawingOp(const Rect& target, const Drawing& w); + virtual void DrawPaintingOp(const Rect& target, const Painting& w); + +public: + operator Image() const; + + ImageAnyDraw(Size sz); + ImageAnyDraw(int cx, int cy); + + ~ImageAnyDraw(); +}; + +class AnyImageDraw : public TopWindow { + virtual void Paint(Draw& w); + +public: + typedef AnyImageDraw CLASSNAME; + AnyImageDraw(); +}; + +#endif + diff --git a/uppdev/AnyImageDraw/AnyImageDraw.lay b/uppdev/AnyImageDraw/AnyImageDraw.lay new file mode 100644 index 000000000..13c9ae1cd --- /dev/null +++ b/uppdev/AnyImageDraw/AnyImageDraw.lay @@ -0,0 +1,3 @@ +LAYOUT(AnyImageDrawLayout, 200, 100) +END_LAYOUT + diff --git a/uppdev/AnyImageDraw/AnyImageDraw.upp b/uppdev/AnyImageDraw/AnyImageDraw.upp new file mode 100644 index 000000000..2df0399a7 --- /dev/null +++ b/uppdev/AnyImageDraw/AnyImageDraw.upp @@ -0,0 +1,13 @@ +uses + CtrlLib, + Painter; + +file + AnyImageDraw.h, + AnyImageDraw.cpp, + main.cpp, + AnyImageDraw.lay; + +mainconfig + "" = "GUI"; + diff --git a/uppdev/AnyImageDraw/init b/uppdev/AnyImageDraw/init new file mode 100644 index 000000000..722ba3f40 --- /dev/null +++ b/uppdev/AnyImageDraw/init @@ -0,0 +1,5 @@ +#ifndef _AnyImageDraw_icpp_init_stub +#define _AnyImageDraw_icpp_init_stub +#include "CtrlLib/init" +#include "Painter/init" +#endif diff --git a/uppdev/AnyImageDraw/main.cpp b/uppdev/AnyImageDraw/main.cpp new file mode 100644 index 000000000..a5c923625 --- /dev/null +++ b/uppdev/AnyImageDraw/main.cpp @@ -0,0 +1,48 @@ +#include "AnyImageDraw.h" + +void ImageAnyDrawPainter(Draw *(*f)(Size sz), Image (*e)(Draw *w)); +void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w)); + +static Draw *sCP(Size sz) +{ + return new ImagePainter(sz); +} + +static Image sEP(Draw *w) +{ + ImagePainter *ip = dynamic_cast(w); + return ip ? (Image)(*ip) : Image(); +} + +static Draw *sCD(Size sz) +{ + return new ImageDraw(sz); +} + +static Image sED(Draw *w) +{ + ImageDraw *ip = dynamic_cast(w); + return ip ? (Image)(*ip) : Image(); +} + +INITBLOCK { + ImageAnyDrawPainter(sCP, sEP); + ImageAnyDrawSystem(sCD, sED); +} + +void AnyImageDraw::Paint(Draw& w) +{ + ImageAnyDraw iw(200, 200); + iw.DrawRect(0, 0, 200, 200, White()); + iw.DrawText(0, 0, "X", Roman(200)); + w.DrawImage(0, 0, iw); +} + +AnyImageDraw::AnyImageDraw() +{ +} + +GUI_APP_MAIN +{ + AnyImageDraw().Run(); +}