FLTK 1.3.0
Fl_Device.H
Go to the documentation of this file.
1 //
2 // "$Id: Fl_Device.H 8529 2011-03-23 12:49:30Z AlbrechtS $"
3 //
4 // Definition of classes Fl_Device, Fl_Graphics_Driver, Fl_Surface_Device, Fl_Display_Device
5 // for the Fast Light Tool Kit (FLTK).
6 //
7 // Copyright 2010-2011 by Bill Spitzak and others.
8 //
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Library General Public
11 // License as published by the Free Software Foundation; either
12 // version 2 of the License, or (at your option) any later version.
13 //
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // Library General Public License for more details.
18 //
19 // You should have received a copy of the GNU Library General Public
20 // License along with this library; if not, write to the Free Software
21 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22 // USA.
23 //
24 // Please report all bugs and problems on the following page:
25 //
26 // http://www.fltk.org/str.php
27 //
33 #ifndef Fl_Device_H
34 #define Fl_Device_H
35 
36 #include <FL/x.H>
37 #include <FL/Fl_Plugin.H>
38 #include <FL/Fl_Image.H>
39 #include <FL/Fl_Bitmap.H>
40 #include <FL/Fl_Pixmap.H>
41 #include <FL/Fl_RGB_Image.H>
42 
43 class Fl_Graphics_Driver;
44 class Fl_Font_Descriptor;
46 FL_EXPORT extern Fl_Graphics_Driver *fl_graphics_driver;
47 
56 typedef void (*Fl_Draw_Image_Cb)(void* data,int x,int y,int w,uchar* buf);
57 
58 // typedef what the x,y fields in a point are:
59 #ifdef WIN32
60 typedef int COORD_T;
61 # define XPOINT XPoint
62 #elif defined(__APPLE__)
63 typedef float COORD_T;
64 typedef struct { float x; float y; } QPoint;
65 # define XPOINT QPoint
66 extern float fl_quartz_line_width_;
67 #else
68 typedef short COORD_T;
69 # define XPOINT XPoint
70 #endif
71 
75 class FL_EXPORT Fl_Device {
76 public:
80  static const char *class_id;
88  virtual const char *class_name() {return class_id;};
95  virtual ~Fl_Device() {};
96 };
97 
98 #define FL_REGION_STACK_SIZE 10
99 #define FL_MATRIX_STACK_SIZE 32
100 
108 class FL_EXPORT Fl_Graphics_Driver : public Fl_Device {
109 public:
112  struct matrix {double a, b, c, d, x, y;};
113 private:
114  static const matrix m0;
115  Fl_Font font_; // current font
116  Fl_Fontsize size_; // current font size
117  Fl_Color color_; // current color
118  enum {LINE, LOOP, POLYGON, POINT_};
119  int sptr;
120  static const int matrix_stack_size = FL_MATRIX_STACK_SIZE;
121  matrix stack[FL_MATRIX_STACK_SIZE];
122  matrix m;
123  int n, p_size, gap_;
124  XPOINT *p;
125  int what;
126  int fl_clip_state_number;
127  int rstackptr;
128  static const int region_stack_max = FL_REGION_STACK_SIZE - 1;
129  Fl_Region rstack[FL_REGION_STACK_SIZE];
130 #ifdef WIN32
131  int numcount;
132  int counts[20];
133 #endif
134  Fl_Font_Descriptor *font_descriptor_;
135  void transformed_vertex0(COORD_T x, COORD_T y);
136  void fixloop();
137 
138 protected:
139 /* ** \brief red color for background and/or mixing if device does not support masking or alpha *
140  uchar bg_r_;
141  ** \brief green color for background and/or mixing if device does not support masking or alpha *
142  uchar bg_g_;
143  ** \brief blue color for background and/or mixing if device does not support masking or alpha *
144  uchar bg_b_; */
145  friend class Fl_Pixmap;
146  friend class Fl_Bitmap;
147  friend class Fl_RGB_Image;
148  friend void fl_rect(int x, int y, int w, int h);
149  friend void fl_rectf(int x, int y, int w, int h);
150  friend void fl_line_style(int style, int width, char* dashes);
151  friend void fl_xyline(int x, int y, int x1);
152  friend void fl_xyline(int x, int y, int x1, int y2);
153  friend void fl_xyline(int x, int y, int x1, int y2, int x3);
154  friend void fl_yxline(int x, int y, int y1);
155  friend void fl_yxline(int x, int y, int y1, int x2);
156  friend void fl_yxline(int x, int y, int y1, int x2, int y3);
157  friend void fl_line(int x, int y, int x1, int y1);
158  friend void fl_line(int x, int y, int x1, int y1, int x2, int y2);
159  friend void fl_draw(const char *str, int n, int x, int y);
160 #ifdef __APPLE__
161  friend void fl_draw(const char *str, int n, float x, float y);
162 #endif
163  friend void fl_draw(int angle, const char *str, int n, int x, int y);
164  friend void fl_rtl_draw(const char *str, int n, int x, int y);
165  friend void fl_font(Fl_Font face, Fl_Fontsize size);
166  friend void fl_color(Fl_Color c);
167  friend void fl_color(uchar r, uchar g, uchar b);
168  friend void fl_point(int x, int y);
169  friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2);
170  friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
171  friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2);
172  friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
173  friend void fl_begin_points();
174  friend void fl_begin_line();
175  friend void fl_begin_loop();
176  friend void fl_begin_polygon();
177  friend void fl_vertex(double x, double y);
178  friend void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
179  friend void fl_circle(double x, double y, double r);
180  friend void fl_arc(double x, double y, double r, double start, double end);
181  friend void fl_arc(int x, int y, int w, int h, double a1, double a2);
182  friend void fl_pie(int x, int y, int w, int h, double a1, double a2);
183  friend void fl_end_points();
184  friend void fl_end_line();
185  friend void fl_end_loop();
186  friend void fl_end_polygon();
187  friend void fl_transformed_vertex(double xf, double yf);
188  friend void fl_push_clip(int x, int y, int w, int h);
189  friend int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
190  friend int fl_not_clipped(int x, int y, int w, int h);
191  friend void fl_push_no_clip();
192  friend void fl_pop_clip();
193  friend void fl_begin_complex_polygon();
194  friend void fl_gap();
195  friend void fl_end_complex_polygon();
196  friend void fl_push_matrix();
197  friend void fl_pop_matrix();
198  friend void fl_mult_matrix(double a, double b, double c, double d, double x, double y);
199  friend void fl_scale(double x, double y);
200  friend void fl_scale(double x);
201  friend void fl_translate(double x, double y);
202  friend void fl_rotate(double d);
203  friend double fl_transform_x(double x, double y);
204  friend double fl_transform_y(double x, double y);
205  friend double fl_transform_dx(double x, double y);
206  friend double fl_transform_dy(double x, double y);
207  friend Fl_Region fl_clip_region();
208  friend void fl_clip_region(Fl_Region r);
209  friend void fl_restore_clip();
210 
211  friend void fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L);
212  friend void fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L);
213  friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
214  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);
215  friend FL_EXPORT void gl_start();
216 
222  virtual void rect(int x, int y, int w, int h);
224  virtual void rectf(int x, int y, int w, int h);
226  virtual void line_style(int style, int width=0, char* dashes=0);
228  virtual void xyline(int x, int y, int x1);
230  virtual void xyline(int x, int y, int x1, int y2);
232  virtual void xyline(int x, int y, int x1, int y2, int x3);
234  virtual void yxline(int x, int y, int y1);
236  virtual void yxline(int x, int y, int y1, int x2);
238  virtual void yxline(int x, int y, int y1, int x2, int y3);
240  virtual void line(int x, int y, int x1, int y1);
242  virtual void line(int x, int y, int x1, int y1, int x2, int y2);
244  virtual void draw(const char *str, int n, int x, int y) = 0;
245 #ifdef __APPLE__
246  virtual void draw(const char *str, int n, float x, float y) = 0;
247 #endif
248 
249  virtual void draw(int angle, const char *str, int n, int x, int y) = 0;
251  virtual void rtl_draw(const char *str, int n, int x, int y) = 0;
253  virtual void color(Fl_Color c) {color_ = c;}
255  virtual void color(uchar r, uchar g, uchar b) = 0;
257  virtual void point(int x, int y);
259  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2);
261  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
263  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
265  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
267  virtual void begin_points();
269  virtual void begin_line();
271  virtual void begin_loop();
273  virtual void begin_polygon();
275  virtual void vertex(double x, double y);
277  virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
279  virtual void circle(double x, double y, double r);
281  virtual void arc(double x, double y, double r, double start, double end);
283  virtual void arc(int x, int y, int w, int h, double a1, double a2);
285  virtual void pie(int x, int y, int w, int h, double a1, double a2);
287  virtual void end_points();
289  virtual void end_line();
291  virtual void end_loop();
293  virtual void end_polygon();
295  virtual void begin_complex_polygon();
297  virtual void gap();
299  virtual void end_complex_polygon();
301  virtual void transformed_vertex(double xf, double yf);
303  virtual void push_clip(int x, int y, int w, int h);
305  virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
307  virtual int not_clipped(int x, int y, int w, int h);
309  virtual void push_no_clip();
311  virtual void pop_clip();
312 
314  void push_matrix();
316  void pop_matrix();
318  void mult_matrix(double a, double b, double c, double d, double x, double y);
320  inline void scale(double x, double y) { mult_matrix(x,0,0,y,0,0); }
322  inline void scale(double x) { mult_matrix(x,0,0,x,0,0); }
324  inline void translate(double x,double y) { mult_matrix(1,0,0,1,x,y); }
326  void rotate(double d);
328  double transform_x(double x, double y);
330  double transform_y(double x, double y);
332  double transform_dx(double x, double y);
334  double transform_dy(double x, double y);
336  Fl_Region clip_region();
338  void clip_region(Fl_Region r);
340  void restore_clip();
341 
342  // Images
344  virtual void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) = 0;
346  virtual void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) = 0;
348  virtual void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) = 0;
350  virtual void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) = 0;
351  // Image classes
357  virtual void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) = 0;
363  virtual void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) = 0;
369  virtual void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) = 0;
370 
371 public:
372  static const char *class_id;
373  virtual const char *class_name() {return class_id;};
375  virtual void font(Fl_Font face, Fl_Fontsize size) {font_ = face; size_ = size;}
377  Fl_Font font() {return font_; }
379  Fl_Fontsize size() {return size_; }
381  virtual double width(const char *str, int n) = 0;
383  virtual inline double width(unsigned int c) { char ch = (char)c; return width(&ch, 1); }
385  virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
387  virtual int height() = 0;
389  virtual int descent() = 0;
391  Fl_Color color() {return color_;}
393  inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
395  inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
397  virtual ~Fl_Graphics_Driver() {};
398 };
399 
400 #if defined(__APPLE__) || defined(FL_DOXYGEN)
401 
407 public:
408  static const char *class_id;
409  const char *class_name() {return class_id;};
410  void color(Fl_Color c);
411  void color(uchar r, uchar g, uchar b);
412  void draw(const char* str, int n, int x, int y);
413 #ifdef __APPLE__
414  void draw(const char *str, int n, float x, float y);
415 #endif
416  void draw(int angle, const char *str, int n, int x, int y);
417  void rtl_draw(const char* str, int n, int x, int y);
418  void font(Fl_Font face, Fl_Fontsize size);
419  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
420  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
421  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
422  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
423  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
424  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
425  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
426  double width(const char *str, int n);
427  double width(unsigned int c);
428  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
429  int height();
430  int descent();
431 };
432 #endif
433 #if defined(WIN32) || defined(FL_DOXYGEN)
434 
439 class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver {
440 public:
441  static const char *class_id;
442  const char *class_name() {return class_id;};
443  void color(Fl_Color c);
444  void color(uchar r, uchar g, uchar b);
445  void draw(const char* str, int n, int x, int y);
446  void draw(int angle, const char *str, int n, int x, int y);
447  void rtl_draw(const char* str, int n, int x, int y);
448  void font(Fl_Font face, Fl_Fontsize size);
449  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
450  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
451  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
452  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
453  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
454  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
455  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
456  double width(const char *str, int n);
457  double width(unsigned int c);
458  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
459  int height();
460  int descent();
461 };
462 #endif
463 #if !(defined(__APPLE__) || defined(WIN32))
464 
470 public:
471  static const char *class_id;
472  const char *class_name() {return class_id;};
473  void color(Fl_Color c);
474  void color(uchar r, uchar g, uchar b);
475  void draw(const char* str, int n, int x, int y);
476  void draw(int angle, const char *str, int n, int x, int y);
477  void rtl_draw(const char* str, int n, int x, int y);
478  void font(Fl_Font face, Fl_Fontsize size);
479  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
480  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
481  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
482  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
483  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
484  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
485  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
486  double width(const char *str, int n);
487  double width(unsigned int c);
488  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
489  int height();
490  int descent();
491 };
492 #endif
493 
497 class FL_EXPORT Fl_Surface_Device : public Fl_Device {
499  Fl_Graphics_Driver *_driver;
500  static Fl_Surface_Device *_surface; // the surface that currently receives graphics output
501 protected:
503  Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver; };
504 public:
505  static const char *class_id;
506  const char *class_name() {return class_id;};
507  virtual void set_current(void);
509  inline void driver(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver;};
511  inline Fl_Graphics_Driver *driver() {return _driver; };
513  static inline Fl_Surface_Device *surface() {return _surface; };
515  virtual ~Fl_Surface_Device() {}
516 };
517 
521 class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
522  static Fl_Display_Device *_display; // the platform display device
523 public:
524  static const char *class_id;
525  const char *class_name() {return class_id;};
527  Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
529  static inline Fl_Display_Device *display_device() {return _display;};
530 };
531 
537 class FL_EXPORT Fl_Device_Plugin : public Fl_Plugin {
538 public:
540  Fl_Device_Plugin(const char *name)
541  : Fl_Plugin(klass(), name) { }
543  virtual const char *klass() { return "fltk:device"; }
545  virtual const char *name() = 0;
551  virtual int print(Fl_Widget* w, int x, int y, int height) = 0;
552 };
553 
554 #endif // Fl_Device_H
555 
556 //
557 // End of "$Id: Fl_Device.H 8529 2011-03-23 12:49:30Z AlbrechtS $".
558 //