OSDN Git Service

first
[psychlops/cpp.git] / psychlops / core / graphic / psychlops_g_module.h
1 /*
2  *  psychlops_g_module.h
3  *  Psychlops Standard Library (Universal)
4  *
5  *  Last Modified 2005/10/18 by Kenchi HOSOKAWA
6  *  (C) 2005 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
7  */
8
9 #ifndef HEADER_PSYCHLOPS_GRAPHIC_MODULE
10 #define HEADER_PSYCHLOPS_GRAPHIC_MODULE
11
12 #include "psychlops_g_fundamental.h"
13
14
15 #include <vector>
16 #include <list>
17
18 namespace Psychlops {
19
20
21         class Figure;
22         class Group;
23         class Drawable;
24
25
26
27         class Shape;
28         class Line;
29         class Rectangle;
30         class Ellipse; typedef Ellipse Oval;
31         class Polygon;
32         class PolyLine;
33         class Image;
34         class Letters;
35
36         class Drawable {
37         public:
38                 static const Drawable *dummy;
39                 static Drawable *prime;
40                 static Group billboard;
41                 static const bool prime_is_a_canvas();
42
43                 Drawable();
44                 virtual ~Drawable() = 0;
45                 virtual int getWidth() const = 0;
46                 virtual int getHeight() const = 0;
47                 virtual const Point getCenter() const = 0;      //  means this Drawable's local center.
48
49                 virtual Drawable& clear(const Color &col) = 0;
50                 virtual Drawable& pix(const double x, const double y, const Color &col) = 0;
51
52
53                 virtual Drawable& line(const Line &drawee, const Color &col) = 0;
54                 virtual Drawable& line(const Line &drawee, const Stroke &strk) = 0;
55                 virtual Drawable& rect(const Rectangle &drawee, const Color &col) = 0;
56                 virtual Drawable& rect(const Rectangle &drawee, const Stroke &strk) = 0;
57                 //virtual Drawable& rect(const Rectangle[] drawee, const Color &col) = 0;
58                 //virtual Drawable& rect(const Rectangle[] drawee, const Stroke &strk) = 0;
59                 virtual Drawable& ellipse(const Ellipse &drawee) = 0;\r
60                 virtual Drawable& ellipse(const Ellipse &drawee, const Color &col) = 0;
61                 virtual Drawable& ellipse(const Ellipse &drawee, const Stroke &strk) = 0;
62                 virtual Drawable& polygon(const Polygon &drawee) = 0;
63                 virtual Drawable& polygon(const Polygon &drawee, const Color &col) = 0;
64                 virtual Drawable& polygon(const Polygon &drawee, const Stroke &strk) = 0;
65                 virtual Drawable& polyline(const PolyLine &drawee) = 0;
66                 virtual Drawable& polyline(const PolyLine &drawee, const Color &col) = 0;
67                 virtual Drawable& polyline(const PolyLine &drawee, const Stroke &strk) = 0;
68                 virtual Drawable& figures(const Group &drawee) = 0;
69
70                 virtual Drawable& image(const Image &img) = 0;
71                 virtual Drawable& image(Image &img, const Rectangle &target_area, const Rectangle &source_rect) = 0;
72                 virtual Drawable& image(const Image &img, const double x, const double y) = 0;
73                         virtual Drawable& image(const Image &img, const double alpha) = 0;
74                 //virtual Drawable& cacheImage(Image &img, bool on_off) = 0;
75                 virtual Drawable& letters(Letters &let, const Color &col) = 0;
76                 //virtual Drawable& letters(const Letters &let, const double x, const double y, const Color &col) = 0;
77                 //virtual LettersCache cacheLetters(Letters &let) = 0;
78         };
79
80         class DrawableWithCache : public Drawable {
81         public:
82                 static DrawableWithCache *prime;
83                 virtual void cacheImage(Image &img) = 0;
84                 virtual void uncacheImage(Image &img) = 0;
85                 virtual void cacheLetters(Letters &let) = 0;
86                 virtual void uncacheLetters(Letters &let) = 0;
87         };
88
89         class Drawable3D : public DrawableWithCache {
90         public:
91                 static Drawable3D *prime;
92                 virtual void camera() = 0;
93                 virtual void light() = 0;
94         };
95
96
97         class Figure {
98         public:
99                 virtual ~Figure() = 0;
100                 virtual const Point getDatum() const = 0;
101                 virtual Figure& setDatum(const Point &p) = 0;
102                 virtual Figure& centering(const Point &p) = 0;
103                 virtual Figure& draw(Drawable &drawable = *Drawable::prime) = 0;
104 //              virtual const Figure& draw(const double x, const double y, const double z = 0) const;
105
106
107                 inline Figure& centering(const Figure& fig) { return centering(fig.getDatum()); }
108                 inline Figure& centering(const Group& fig) { return centering(0,0); }
109                 inline Figure& centering(const Drawable &target = *Drawable::prime) { return centering(target.getCenter()); }
110                 inline Figure& centering(const double x, const double y, const double z = 0) { return centering(Point(x,y,z)); }
111                 inline Figure& shift(const Point p) { Point n=getDatum(); n=n+p; return setDatum(n); }
112                 inline Figure& shift(const double x, const double y, const double z = 0) { Point p(x,y,z);return shift(p); }
113                 Figure& join(Group &fg);
114         };
115
116         class FigureDatum : virtual public Figure {
117 /*              private:
118                 class DATUM_ {
119                         friend class Figure;
120                         private:
121                         class LENGTH_ {
122                                 friend class Figure;
123                                 friend class Group;
124                                 friend class DATUM_;
125                                 private:
126                                 double px_;
127                                 public:
128                                 operator double() const;
129                                 operator Length() const;
130                                 double operator =(double val);
131                                 Length operator =(Length &val);
132                         };
133                         public:
134                         LENGTH_ x, y, z;
135                         DATUM_();
136                         operator Point();
137                         void operator =(Point &p);
138                 };
139 */
140         protected:
141                 Point datum;
142
143         public:
144                 using Figure::centering;
145                 FigureDatum();
146                 ~FigureDatum();
147                 virtual const Point getDatum() const;
148                 virtual FigureDatum& setDatum(const Point& p);
149                 virtual FigureDatum& centering(const Point& p);
150                 /*
151                 FigureDatum& centering(const Figure& fig);
152                 FigureDatum& centering(const Drawable& target = *Drawable::prime);
153                 FigureDatum& centering(const double x, const double y, const double z = 0);
154                 FigureDatum& shift(const double x, const double y, const double z = 0);
155                 */
156         };
157
158
159         class Group : virtual public FigureDatum {
160                 friend class Canvas;
161         public:
162                 enum ClippngType { NONE, RECT, STENCIL, ALPHA };
163         protected:
164                 ClippngType clip_type;
165                 double scissor_top, scissor_left, scissor_width, scissor_height;
166                 Image *alpha_mask;
167         public:
168                 using FigureDatum::datum;
169
170                 std::vector<Figure *> contents;
171                 double rotation;
172                 Point axis, scaling;
173
174                 Group();
175                 Group& append(Figure &fig);
176                 Group& append(Figure *fig);
177                 Group& replace(int index, Figure *fig);
178                 Group& remove(int index);
179 //              inline Figure& operator [](int index) { return *(contents.at(index); }
180
181                 virtual Group& draw(Drawable &drawable = *Drawable::prime);
182
183                 virtual Group& clip(bool sw);
184                 virtual Group& clip(const Rectangle &rect);
185                 virtual Group& clip(Image *img);
186         };
187
188
189
190
191 }       /*      <- namespace Psycholops         */
192
193
194 #endif