#ifndef VIEW_HH #define VIEW_HH #include #ifdef HAVE_X11_DOUBLE_BUFFERING # include #endif #include "point.hh" #include class Grafix; class View { protected: Grafix *_grafix; Display *_display; Window _window; int _window_width; int _window_height; #ifdef HAVE_X11_DOUBLE_BUFFERING XdbeSwapInfo _db_swap_info; #endif Drawable _buffer; Drawable _drawable; bool _cleared; Point _offset; double _x_scale; double _y_scale; bool _trails; XPoint x_transform(const Point &) const; GC xgc(int) const; public: View(Grafix *); View(Grafix *, Window); virtual ~View(); Grafix *grafix() const { return _grafix; } Window window() const { return _window; } bool trails() const { return _trails; } int window_width() const { return _window_width; } int window_height() const { return _window_height; } const Point &offset() const { return _offset; } double x_scale() const { return _x_scale; } double y_scale() const { return _y_scale; } Point transform(const Point &) const; void set_double_buffer(bool); void set_trails(bool t) { _trails = t; } void set_window_size(int, int); const Point &lower_left() const { return _offset; } Point upper_right() const; void reset(); void zoom(double); void screen_shift(double, double); void clear(); void expose(); virtual void draw_line(int gc, const Point &, const Point &); virtual void draw_lines(int gc, int np, const Point *p, bool closed); void draw_circle(int gc, const Point &, double); virtual void draw_arc(int gc, const Point &, double, double, double); void erase_poly(int np, const Point *p) { fill_poly(0, np, p); } virtual void fill_poly(int gc, int np, const Point *p); void fill_circle(int gc, const Point &, double); virtual void fill_arc(int gc, const Point &, double, double, double); }; class EPSView: public View { FILE *_f; public: EPSView(View *, FILE *); void draw_line(int gc, const Point &, const Point &); void draw_lines(int gc, int np, const Point *p, bool closed); void draw_arc(int gc, const Point &, double, double, double); void fill_poly(int gc, int np, const Point *p); void fill_arc(int gc, const Point &, double, double, double); }; inline Point View::transform(const Point &p) const { return Point((p.x - _offset.x) * _x_scale, (p.y - _offset.y) * _y_scale); } inline XPoint View::x_transform(const Point &p) const { XPoint xp; xp.x = (int)((p.x - _offset.x) * _x_scale); xp.y = _window_height - (int)((p.y - _offset.y) * _y_scale); return xp; } inline void View::draw_circle(int gc, const Point &p, double r) { draw_arc(gc, p, r, -M_PI, M_PI); } inline void View::fill_circle(int gc, const Point &p, double r) { fill_arc(gc, p, r, -M_PI, M_PI); } #endif