00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00025 #ifndef Fl_Device_H
00026 #define Fl_Device_H
00027
00028 #include <FL/x.H>
00029 #include <FL/Fl_Plugin.H>
00030 #include <FL/Fl_Image.H>
00031 #include <FL/Fl_Bitmap.H>
00032 #include <FL/Fl_Pixmap.H>
00033 #include <FL/Fl_RGB_Image.H>
00034 #include <stdlib.h>
00035
00036 class Fl_Graphics_Driver;
00037 class Fl_Font_Descriptor;
00039 FL_EXPORT extern Fl_Graphics_Driver *fl_graphics_driver;
00040
00049 typedef void (*Fl_Draw_Image_Cb)(void* data,int x,int y,int w,uchar* buf);
00050
00051
00052 #ifdef WIN32
00053 typedef int COORD_T;
00054 # define XPOINT XPoint
00055 #elif defined(__APPLE__)
00056 typedef float COORD_T;
00057 typedef struct { float x; float y; } QPoint;
00058 # define XPOINT QPoint
00059 extern float fl_quartz_line_width_;
00060 #else
00061 typedef short COORD_T;
00062 # define XPOINT XPoint
00063 #endif
00064
00069 class FL_EXPORT Fl_Device {
00070 public:
00074 static const char *class_id;
00084 virtual const char *class_name() {return class_id;};
00091 virtual ~Fl_Device() {};
00092 };
00093
00094 #define FL_REGION_STACK_SIZE 10
00095 #define FL_MATRIX_STACK_SIZE 32
00096
00110 class FL_EXPORT Fl_Graphics_Driver : public Fl_Device {
00111 public:
00114 struct matrix {double a, b, c, d, x, y;};
00115 private:
00116 static const matrix m0;
00117 Fl_Font font_;
00118 Fl_Fontsize size_;
00119 Fl_Color color_;
00120 int sptr;
00121 static const int matrix_stack_size = FL_MATRIX_STACK_SIZE;
00122 matrix stack[FL_MATRIX_STACK_SIZE];
00123 matrix m;
00124 int n, p_size, gap_;
00125 XPOINT *p;
00126 int what;
00127 int fl_clip_state_number;
00128 int rstackptr;
00129 static const int region_stack_max = FL_REGION_STACK_SIZE - 1;
00130 Fl_Region rstack[FL_REGION_STACK_SIZE];
00131 #ifdef WIN32
00132 int numcount;
00133 int counts[20];
00134 #endif
00135 Fl_Font_Descriptor *font_descriptor_;
00136 void transformed_vertex0(COORD_T x, COORD_T y);
00137 void fixloop();
00138
00139 protected:
00140 #ifndef FL_DOXYGEN
00141 enum {LINE, LOOP, POLYGON, POINT_};
00142 inline int vertex_no() { return n; }
00143 inline XPOINT *vertices() {return p;}
00144 inline int vertex_kind() {return what;}
00145 #endif
00146
00147
00148
00149
00150
00151
00152 friend class Fl_Pixmap;
00153 friend class Fl_Bitmap;
00154 friend class Fl_RGB_Image;
00155 friend void fl_rect(int x, int y, int w, int h);
00156 friend void fl_rectf(int x, int y, int w, int h);
00157 friend void fl_line_style(int style, int width, char* dashes);
00158 friend void fl_xyline(int x, int y, int x1);
00159 friend void fl_xyline(int x, int y, int x1, int y2);
00160 friend void fl_xyline(int x, int y, int x1, int y2, int x3);
00161 friend void fl_yxline(int x, int y, int y1);
00162 friend void fl_yxline(int x, int y, int y1, int x2);
00163 friend void fl_yxline(int x, int y, int y1, int x2, int y3);
00164 friend void fl_line(int x, int y, int x1, int y1);
00165 friend void fl_line(int x, int y, int x1, int y1, int x2, int y2);
00166 friend void fl_draw(const char *str, int n, int x, int y);
00167 #ifdef __APPLE__
00168 friend void fl_draw(const char *str, int n, float x, float y);
00169 #endif
00170 friend void fl_draw(int angle, const char *str, int n, int x, int y);
00171 friend void fl_rtl_draw(const char *str, int n, int x, int y);
00172 friend void fl_font(Fl_Font face, Fl_Fontsize size);
00173 friend void fl_color(Fl_Color c);
00174 friend void fl_color(uchar r, uchar g, uchar b);
00175 friend void fl_point(int x, int y);
00176 friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2);
00177 friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00178 friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2);
00179 friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00180 friend void fl_begin_points();
00181 friend void fl_begin_line();
00182 friend void fl_begin_loop();
00183 friend void fl_begin_polygon();
00184 friend void fl_vertex(double x, double y);
00185 friend void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
00186 friend void fl_circle(double x, double y, double r);
00187 friend void fl_arc(double x, double y, double r, double start, double end);
00188 friend void fl_arc(int x, int y, int w, int h, double a1, double a2);
00189 friend void fl_pie(int x, int y, int w, int h, double a1, double a2);
00190 friend void fl_end_points();
00191 friend void fl_end_line();
00192 friend void fl_end_loop();
00193 friend void fl_end_polygon();
00194 friend void fl_transformed_vertex(double xf, double yf);
00195 friend void fl_push_clip(int x, int y, int w, int h);
00196 friend int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
00197 friend int fl_not_clipped(int x, int y, int w, int h);
00198 friend void fl_push_no_clip();
00199 friend void fl_pop_clip();
00200 friend void fl_begin_complex_polygon();
00201 friend void fl_gap();
00202 friend void fl_end_complex_polygon();
00203 friend void fl_push_matrix();
00204 friend void fl_pop_matrix();
00205 friend void fl_mult_matrix(double a, double b, double c, double d, double x, double y);
00206 friend void fl_scale(double x, double y);
00207 friend void fl_scale(double x);
00208 friend void fl_translate(double x, double y);
00209 friend void fl_rotate(double d);
00210 friend double fl_transform_x(double x, double y);
00211 friend double fl_transform_y(double x, double y);
00212 friend double fl_transform_dx(double x, double y);
00213 friend double fl_transform_dy(double x, double y);
00214 friend Fl_Region fl_clip_region();
00215 friend void fl_clip_region(Fl_Region r);
00216 friend void fl_restore_clip();
00217
00218 friend void fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L);
00219 friend void fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L);
00220 friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
00221 friend FL_EXPORT void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
00222 friend FL_EXPORT void gl_start();
00223 friend FL_EXPORT void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00224 matrix *fl_matrix;
00227 Fl_Graphics_Driver();
00229 virtual void rect(int x, int y, int w, int h);
00231 virtual void rectf(int x, int y, int w, int h);
00233 virtual void line_style(int style, int width=0, char* dashes=0);
00235 virtual void xyline(int x, int y, int x1);
00237 virtual void xyline(int x, int y, int x1, int y2);
00239 virtual void xyline(int x, int y, int x1, int y2, int x3);
00241 virtual void yxline(int x, int y, int y1);
00243 virtual void yxline(int x, int y, int y1, int x2);
00245 virtual void yxline(int x, int y, int y1, int x2, int y3);
00247 virtual void line(int x, int y, int x1, int y1);
00249 virtual void line(int x, int y, int x1, int y1, int x2, int y2);
00251 virtual void draw(const char *str, int n, int x, int y) {}
00252 #ifdef __APPLE__
00253 virtual void draw(const char *str, int n, float x, float y) { draw(str, n, (int)(x+0.5), (int)(y+0.5));}
00254 #endif
00255
00256 virtual void draw(int angle, const char *str, int n, int x, int y) {}
00258 virtual void rtl_draw(const char *str, int n, int x, int y) {};
00260 virtual void color(Fl_Color c) {color_ = c;}
00262 virtual void color(uchar r, uchar g, uchar b) {}
00264 virtual void point(int x, int y);
00266 virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2);
00268 virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00270 virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
00272 virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00274 virtual void begin_points();
00276 virtual void begin_line();
00278 virtual void begin_loop();
00280 virtual void begin_polygon();
00282 virtual void vertex(double x, double y);
00284 virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
00286 virtual void circle(double x, double y, double r);
00288 virtual void arc(double x, double y, double r, double start, double end);
00290 virtual void arc(int x, int y, int w, int h, double a1, double a2);
00292 virtual void pie(int x, int y, int w, int h, double a1, double a2);
00294 virtual void end_points();
00296 virtual void end_line();
00298 virtual void end_loop();
00300 virtual void end_polygon();
00302 virtual void begin_complex_polygon();
00304 virtual void gap();
00306 virtual void end_complex_polygon();
00308 virtual void transformed_vertex(double xf, double yf);
00310 virtual void push_clip(int x, int y, int w, int h);
00312 virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
00314 virtual int not_clipped(int x, int y, int w, int h);
00316 virtual void push_no_clip();
00318 virtual void pop_clip();
00319
00321 void push_matrix();
00323 void pop_matrix();
00325 void mult_matrix(double a, double b, double c, double d, double x, double y);
00327 inline void scale(double x, double y) { mult_matrix(x,0,0,y,0,0); }
00329 inline void scale(double x) { mult_matrix(x,0,0,x,0,0); }
00331 inline void translate(double x,double y) { mult_matrix(1,0,0,1,x,y); }
00333 void rotate(double d);
00335 double transform_x(double x, double y);
00337 double transform_y(double x, double y);
00339 double transform_dx(double x, double y);
00341 double transform_dy(double x, double y);
00343 Fl_Region clip_region();
00345 void clip_region(Fl_Region r);
00347 void restore_clip();
00348
00349
00351 virtual void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) {}
00353 virtual void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) {}
00355 virtual void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) {}
00357 virtual void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) {}
00358
00364 virtual void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) {}
00370 virtual void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) {}
00376 virtual void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) {}
00377 #if FLTK_ABI_VERSION >= 10301
00378 virtual
00379 #endif
00380 void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00381
00382 public:
00383 static const char *class_id;
00384 virtual const char *class_name() {return class_id;};
00386 virtual void font(Fl_Font face, Fl_Fontsize fsize) {font_ = face; size_ = fsize;}
00388 Fl_Font font() {return font_; }
00390 Fl_Fontsize size() {return size_; }
00392 virtual double width(const char *str, int n) {return 0;}
00394 virtual inline double width(unsigned int c) { char ch = (char)c; return width(&ch, 1); }
00396 virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00398 virtual int height() {return size();}
00400 virtual int descent() {return 0;}
00402 Fl_Color color() {return color_;}
00404 inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
00406 inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
00407 #if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
00408 virtual
00409 #endif
00410 int draw_scaled(Fl_Image *img, int X, int Y, int W, int H);
00412 virtual ~Fl_Graphics_Driver() { if (p) free(p); }
00413 };
00414
00415 #if defined(__APPLE__) || defined(FL_DOXYGEN)
00416
00421 class FL_EXPORT Fl_Quartz_Graphics_Driver : public Fl_Graphics_Driver {
00422 public:
00423 static const char *class_id;
00424 const char *class_name() {return class_id;};
00425 void color(Fl_Color c);
00426 void color(uchar r, uchar g, uchar b);
00427 void draw(const char* str, int n, int x, int y);
00428 #ifdef __APPLE__
00429 void draw(const char *str, int n, float x, float y);
00430 #endif
00431 void draw(int angle, const char *str, int n, int x, int y);
00432 void rtl_draw(const char* str, int n, int x, int y);
00433 void font(Fl_Font face, Fl_Fontsize size);
00434 void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00435 void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00436 void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00437 int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
00438 void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00439 void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00440 void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00441 void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00442 double width(const char *str, int n);
00443 double width(unsigned int c);
00444 void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00445 int height();
00446 int descent();
00447 #if ! defined(FL_DOXYGEN)
00448 static Fl_Offscreen create_offscreen_with_alpha(int w, int h);
00449 #endif
00450 void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00451 };
00452 #endif
00453 #if defined(WIN32) || defined(FL_DOXYGEN)
00454
00459 class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver {
00460 public:
00461 static const char *class_id;
00462 const char *class_name() {return class_id;};
00463 void color(Fl_Color c);
00464 void color(uchar r, uchar g, uchar b);
00465 void draw(const char* str, int n, int x, int y);
00466 void draw(int angle, const char *str, int n, int x, int y);
00467 void rtl_draw(const char* str, int n, int x, int y);
00468 void font(Fl_Font face, Fl_Fontsize size);
00469 void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00470 void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00471 void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00472 void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00473 void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00474 void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00475 void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00476 double width(const char *str, int n);
00477 double width(unsigned int c);
00478 void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00479 int height();
00480 int descent();
00481 #if ! defined(FL_DOXYGEN)
00482 void copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy);
00483 #endif
00484 void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00485 };
00486
00492 class FL_EXPORT Fl_GDI_Printer_Graphics_Driver : public Fl_GDI_Graphics_Driver {
00493 public:
00494 static const char *class_id;
00495 const char *class_name() {return class_id;};
00496 void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00497 void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy);
00498 int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
00499 };
00500 #endif
00501 #if !(defined(__APPLE__) || defined(WIN32))
00502
00507 class FL_EXPORT Fl_Xlib_Graphics_Driver : public Fl_Graphics_Driver {
00508 public:
00509 static const char *class_id;
00510 const char *class_name() {return class_id;};
00511 void color(Fl_Color c);
00512 void color(uchar r, uchar g, uchar b);
00513 void draw(const char* str, int n, int x, int y);
00514 void draw(int angle, const char *str, int n, int x, int y);
00515 void rtl_draw(const char* str, int n, int x, int y);
00516 void font(Fl_Font face, Fl_Fontsize size);
00517 void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00518 void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00519 void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00520 void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00521 void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00522 void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00523 void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00524 double width(const char *str, int n);
00525 double width(unsigned int c);
00526 void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00527 int height();
00528 int descent();
00529 void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00530 #if ! defined(FL_DOXYGEN)
00531 void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
00532 #endif
00533 };
00534 #endif
00535
00556 class FL_EXPORT Fl_Surface_Device : public Fl_Device {
00558 Fl_Graphics_Driver *_driver;
00559 static Fl_Surface_Device *_surface;
00560 static Fl_Surface_Device *default_surface();
00561 protected:
00563 Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver; };
00564 public:
00565 static const char *class_id;
00566 const char *class_name() {return class_id;};
00567 virtual void set_current(void);
00569 inline void driver(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver;};
00571 inline Fl_Graphics_Driver *driver() {return _driver; };
00574 static inline Fl_Surface_Device *surface() {
00575 return _surface ? _surface : default_surface();
00576 };
00578 virtual ~Fl_Surface_Device() {}
00579 };
00580
00586 class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
00587 static Fl_Display_Device *_display;
00588 #ifdef __APPLE__
00589 friend class Fl_X;
00590 friend class Fl_Graphics_Driver;
00591 static bool high_res_window_;
00592 static bool high_resolution() {return high_res_window_;}
00593 #endif
00594 public:
00595 static const char *class_id;
00596 const char *class_name() {return class_id;};
00597 Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
00598 static Fl_Display_Device *display_device();
00599 };
00600
00608 class FL_EXPORT Fl_Device_Plugin : public Fl_Plugin {
00609 public:
00611 Fl_Device_Plugin(const char *pluginName)
00612 : Fl_Plugin(klass(), pluginName) { }
00614 virtual const char *klass() { return "fltk:device"; }
00616 virtual const char *name() = 0;
00622 virtual int print(Fl_Widget* w, int x, int y, int height) = 0;
00626 #ifdef FL_LIBRARY
00627 virtual
00628 #endif
00629 Fl_RGB_Image* rectangle_capture(Fl_Widget *widget, int x, int y, int w, int h) {return NULL;}
00630 };
00631
00632 #endif // Fl_Device_H
00633
00634
00635
00636