2 * psychlops_g_module.cpp
3 * Psychlops Standard Library (Universal)
5 * Last Modified 2005/10/05 by Kenchi HOSOKAWA
6 * (C) 2005 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
10 #include "../math/psychlops_math.h"
11 #include "psychlops_g_module.h"
12 #include "psychlops_g_canvas.h"
16 class DrawableDummy : virtual public Drawable {
18 void NoDrawableError() const { throw new Exception("Canvas-dependent function was called before the instantiation of Canvas."); }
20 virtual ~DrawableDummy() {}
21 virtual int getWidth() const { NoDrawableError(); return 0; }
22 virtual int getHeight() const { NoDrawableError(); return 0; }
23 virtual const Point getCenter() const { NoDrawableError(); return Point(); } // means this Drawable's local center.
25 virtual Drawable& clear(const Color &col) { NoDrawableError(); return *this; }
26 virtual Drawable& pix(const double x, const double y, const Color &col) { NoDrawableError(); return *this; }
28 virtual Drawable& line(const Line &drawee, const Color &col) { NoDrawableError(); return *this; }
29 virtual Drawable& line(const Line &drawee, const Stroke &strk) { NoDrawableError(); return *this; }
30 virtual Drawable& rect(const Rectangle &drawee, const Color &col) { NoDrawableError(); return *this; }
31 virtual Drawable& rect(const Rectangle &drawee, const Stroke &strk) { NoDrawableError(); return *this; }
32 virtual Drawable& ellipse(const Ellipse &drawee) { NoDrawableError(); return *this; }
33 virtual Drawable& ellipse(const Ellipse &drawee, const Color &col) { NoDrawableError(); return *this; }
34 virtual Drawable& ellipse(const Ellipse &drawee, const Stroke &strk) { NoDrawableError(); return *this; }
35 virtual Drawable& polygon(const Polygon &drawee) { NoDrawableError(); return *this; }
36 virtual Drawable& polygon(const Polygon &drawee, const Color &col) { NoDrawableError(); return *this; }
37 virtual Drawable& polygon(const Polygon &drawee, const Stroke &strk) { NoDrawableError(); return *this; }
38 virtual Drawable& polyline(const PolyLine &drawee) { NoDrawableError(); return *this; }
39 virtual Drawable& polyline(const PolyLine &drawee, const Color &col) { NoDrawableError(); return *this; }
40 virtual Drawable& polyline(const PolyLine &drawee, const Stroke &strk) { NoDrawableError(); return *this; }
41 virtual Drawable& figures(const Group &drawee) { NoDrawableError(); return *this; }
42 virtual Drawable& figures(const Group &drawee, const Color &col) { NoDrawableError(); return *this; }
44 virtual Drawable& image(const Image &img) { NoDrawableError(); return *this; }
45 virtual Drawable& image(const Image &img, const double x, const double y) { NoDrawableError(); return *this; }
46 virtual Drawable& image(Image &img, const Rectangle &target_rect, const Rectangle &source_rect) { NoDrawableError(); return *this; }
47 virtual Drawable& image(const Image &img, const double) { NoDrawableError(); return *this; }
48 virtual Drawable& letters(Letters &let, const Color &col) { NoDrawableError(); return *this; }
51 const Drawable *Drawable::dummy = &drawableDummy;
52 Drawable *Drawable::prime = &drawableDummy;
53 DrawableWithCache *DrawableWithCache::prime = 0;
54 Group Drawable::billboard;
55 const bool Drawable::prime_is_a_canvas() {
56 if(prime==dummy) return false;
57 if(dynamic_cast<Canvas*>(prime)) return true;
61 Drawable::Drawable() {}
62 Drawable::~Drawable() {}
68 Figure::DATUM_::DATUM_() {
74 Figure::DATUM_::LENGTH_::operator double() const {
77 Figure::DATUM_::LENGTH_::operator Length() const {
80 double Figure::DATUM_::LENGTH_::operator =(double val) {
84 Length Figure::DATUM_::LENGTH_::operator =(Length &val) {
92 Figure& Figure::join(Group &fg){ fg.append(this); return *this; }
94 FigureDatum::FigureDatum() : datum(0,0,0) {}
95 FigureDatum::~FigureDatum() {}
96 const Point FigureDatum::getDatum() const {
99 FigureDatum& FigureDatum::setDatum(const Point& p) {
103 FigureDatum& FigureDatum::centering(const Point & p) {
107 /* FigureDatum& FigureDatum::centering(const Figure& fig) {
108 centering(fig.getDatum());
111 FigureDatum& FigureDatum::centering(const Drawable& target) {
112 centering(target.getCenter());
115 FigureDatum& FigureDatum::centering(const double x, const double y, const double z) {
116 centering(Point(x,y,z));
119 FigureDatum& FigureDatum::shift(const double x, const double y, const double z) {
120 centering(datum.x+x, datum.y+y, datum.z+z);
121 // centering(datum.x.px_+x, datum.y.px_+y, datum.z.px_+z);
125 // see Specific/Graphic/psychlops_g_module_XX.cpp
126 // const Figure& Figure::draw(const double x, const double y, const double z) const {
131 Group::Group() : axis(0,0,1), scaling(1,1,1), rotation(0), clip_type(NONE), alpha_mask(0) {
133 Group& Group::append(Figure &fig) {
134 contents.push_back(&fig);
137 Group& Group::append(Figure *fig) {
138 contents.push_back(fig);
141 Group& Group::replace(int index, Figure *fig) {
142 contents.at(index) = fig;
145 Group& Group::remove(int index) {
146 if(index>=contents.size()) return *this;
147 std::vector<Figure*>::iterator it = contents.begin();
148 for(int i=0;i<index; i++) it++;
154 Group& Group::draw(Drawable &drawable) {
155 drawable.figures(*this);
159 Group& Group::draw(const Color &col, Drawable &drawable) {
160 drawable.figures(*this, col);
165 Group& Group::clip(bool sw) {
169 Group& Group::clip(const Rectangle &rect) {
171 scissor_top = rect.getTop();
172 scissor_left = rect.getLeft();
173 scissor_width = rect.getWidth();
174 scissor_height = rect.getHeight();
177 Group& Group::clip(Image *img) {
186 } /* <- namespace Psycholops */