FLTK 1.3.5
Fl_Device.H
Go to the documentation of this file.
1 //
2 // "$Id$"
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-2014 by Bill Spitzak and others.
8 //
9 // This library is free software. Distribution and use rights are outlined in
10 // the file "COPYING" which should have been included with this file. If this
11 // file is missing or damaged, see the license at:
12 //
13 // http://www.fltk.org/COPYING.php
14 //
15 // Please report all bugs and problems on the following page:
16 //
17 // http://www.fltk.org/str.php
18 //
19 
25 #ifndef Fl_Device_H
26 #define Fl_Device_H
27 
28 #include <FL/x.H>
29 #include <FL/Fl_Plugin.H>
30 #include <FL/Fl_Image.H>
31 #include <FL/Fl_Bitmap.H>
32 #include <FL/Fl_Pixmap.H>
33 #include <FL/Fl_RGB_Image.H>
34 #include <stdlib.h>
35 
36 class Fl_Graphics_Driver;
37 class Fl_Font_Descriptor;
39 FL_EXPORT extern Fl_Graphics_Driver *fl_graphics_driver;
40 
49 typedef void (*Fl_Draw_Image_Cb)(void* data,int x,int y,int w,uchar* buf);
50 
51 // typedef what the x,y fields in a point are:
52 #ifdef WIN32
53 typedef int COORD_T;
54 # define XPOINT XPoint
55 #elif defined(__APPLE__)
56 typedef float COORD_T;
57 typedef struct { float x; float y; } QPoint;
58 # define XPOINT QPoint
59 extern float fl_quartz_line_width_;
60 #else
61 typedef short COORD_T;
62 # define XPOINT XPoint
63 #endif
64 
69 class FL_EXPORT Fl_Device {
70 public:
74  static const char *class_id;
84  virtual const char *class_name() {return class_id;};
91  virtual ~Fl_Device() {};
92 };
93 
94 #define FL_REGION_STACK_SIZE 10
95 #define FL_MATRIX_STACK_SIZE 32
96 
110 class FL_EXPORT Fl_Graphics_Driver : public Fl_Device {
111 public:
114  struct matrix {double a, b, c, d, x, y;};
115 private:
116  static const matrix m0;
117  Fl_Font font_; // current font
118  Fl_Fontsize size_; // current font size
119  Fl_Color color_; // current color
120  int sptr;
121  static const int matrix_stack_size = FL_MATRIX_STACK_SIZE;
122  matrix stack[FL_MATRIX_STACK_SIZE];
123  matrix m;
124  int n, p_size, gap_;
125  XPOINT *p;
126  int what;
127  int fl_clip_state_number;
128  int rstackptr;
129  static const int region_stack_max = FL_REGION_STACK_SIZE - 1;
130  Fl_Region rstack[FL_REGION_STACK_SIZE];
131 #ifdef WIN32
132  int numcount;
133  int counts[20];
134 #endif
135  Fl_Font_Descriptor *font_descriptor_;
136  void transformed_vertex0(COORD_T x, COORD_T y);
137  void fixloop();
138 
139 protected:
140 #ifndef FL_DOXYGEN
141  enum {LINE, LOOP, POLYGON, POINT_};
142  inline int vertex_no() { return n; }
143  inline XPOINT *vertices() {return p;}
144  inline int vertex_kind() {return what;}
145 #endif
146 /* ** \brief red color for background and/or mixing if device does not support masking or alpha *
147  uchar bg_r_;
148  ** \brief green color for background and/or mixing if device does not support masking or alpha *
149  uchar bg_g_;
150  ** \brief blue color for background and/or mixing if device does not support masking or alpha *
151  uchar bg_b_; */
152  friend class Fl_Pixmap;
153  friend class Fl_Bitmap;
154  friend class Fl_RGB_Image;
155  friend void fl_rect(int x, int y, int w, int h);
156  friend void fl_rectf(int x, int y, int w, int h);
157  friend void fl_line_style(int style, int width, char* dashes);
158  friend void fl_xyline(int x, int y, int x1);
159  friend void fl_xyline(int x, int y, int x1, int y2);
160  friend void fl_xyline(int x, int y, int x1, int y2, int x3);
161  friend void fl_yxline(int x, int y, int y1);
162  friend void fl_yxline(int x, int y, int y1, int x2);
163  friend void fl_yxline(int x, int y, int y1, int x2, int y3);
164  friend void fl_line(int x, int y, int x1, int y1);
165  friend void fl_line(int x, int y, int x1, int y1, int x2, int y2);
166  friend void fl_draw(const char *str, int n, int x, int y);
167 #ifdef __APPLE__
168  friend void fl_draw(const char *str, int n, float x, float y);
169 #endif
170  friend void fl_draw(int angle, const char *str, int n, int x, int y);
171  friend void fl_rtl_draw(const char *str, int n, int x, int y);
172  friend void fl_font(Fl_Font face, Fl_Fontsize size);
173  friend void fl_color(Fl_Color c);
174  friend void fl_color(uchar r, uchar g, uchar b);
175  friend void fl_point(int x, int y);
176  friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2);
177  friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
178  friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2);
179  friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
180  friend void fl_begin_points();
181  friend void fl_begin_line();
182  friend void fl_begin_loop();
183  friend void fl_begin_polygon();
184  friend void fl_vertex(double x, double y);
185  friend void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
186  friend void fl_circle(double x, double y, double r);
187  friend void fl_arc(double x, double y, double r, double start, double end);
188  friend void fl_arc(int x, int y, int w, int h, double a1, double a2);
189  friend void fl_pie(int x, int y, int w, int h, double a1, double a2);
190  friend void fl_end_points();
191  friend void fl_end_line();
192  friend void fl_end_loop();
193  friend void fl_end_polygon();
194  friend void fl_transformed_vertex(double xf, double yf);
195  friend void fl_push_clip(int x, int y, int w, int h);
196  friend int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
197  friend int fl_not_clipped(int x, int y, int w, int h);
198  friend void fl_push_no_clip();
199  friend void fl_pop_clip();
200  friend void fl_begin_complex_polygon();
201  friend void fl_gap();
202  friend void fl_end_complex_polygon();
203  friend void fl_push_matrix();
204  friend void fl_pop_matrix();
205  friend void fl_mult_matrix(double a, double b, double c, double d, double x, double y);
206  friend void fl_scale(double x, double y);
207  friend void fl_scale(double x);
208  friend void fl_translate(double x, double y);
209  friend void fl_rotate(double d);
210  friend double fl_transform_x(double x, double y);
211  friend double fl_transform_y(double x, double y);
212  friend double fl_transform_dx(double x, double y);
213  friend double fl_transform_dy(double x, double y);
214  friend Fl_Region fl_clip_region();
215  friend void fl_clip_region(Fl_Region r);
216  friend void fl_restore_clip();
217 
218  friend void fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L);
219  friend void fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L);
220  friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
221  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);
222  friend FL_EXPORT void gl_start();
223  friend FL_EXPORT void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
229  virtual void rect(int x, int y, int w, int h);
231  virtual void rectf(int x, int y, int w, int h);
233  virtual void line_style(int style, int width=0, char* dashes=0);
235  virtual void xyline(int x, int y, int x1);
237  virtual void xyline(int x, int y, int x1, int y2);
239  virtual void xyline(int x, int y, int x1, int y2, int x3);
241  virtual void yxline(int x, int y, int y1);
243  virtual void yxline(int x, int y, int y1, int x2);
245  virtual void yxline(int x, int y, int y1, int x2, int y3);
247  virtual void line(int x, int y, int x1, int y1);
249  virtual void line(int x, int y, int x1, int y1, int x2, int y2);
251  virtual void draw(const char *str, int n, int x, int y) {}
252 #ifdef __APPLE__
253  virtual void draw(const char *str, int n, float x, float y) { draw(str, n, (int)(x+0.5), (int)(y+0.5));}
254 #endif
255 
256  virtual void draw(int angle, const char *str, int n, int x, int y) {}
258  virtual void rtl_draw(const char *str, int n, int x, int y) {};
260  virtual void color(Fl_Color c) {color_ = c;}
262  virtual void color(uchar r, uchar g, uchar b) {}
264  virtual void point(int x, int y);
266  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2);
268  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
270  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
272  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
274  virtual void begin_points();
276  virtual void begin_line();
278  virtual void begin_loop();
280  virtual void begin_polygon();
282  virtual void vertex(double x, double y);
284  virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
286  virtual void circle(double x, double y, double r);
288  virtual void arc(double x, double y, double r, double start, double end);
290  virtual void arc(int x, int y, int w, int h, double a1, double a2);
292  virtual void pie(int x, int y, int w, int h, double a1, double a2);
294  virtual void end_points();
296  virtual void end_line();
298  virtual void end_loop();
300  virtual void end_polygon();
302  virtual void begin_complex_polygon();
304  virtual void gap();
306  virtual void end_complex_polygon();
308  virtual void transformed_vertex(double xf, double yf);
310  virtual void push_clip(int x, int y, int w, int h);
312  virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
314  virtual int not_clipped(int x, int y, int w, int h);
316  virtual void push_no_clip();
318  virtual void pop_clip();
319 
321  void push_matrix();
323  void pop_matrix();
325  void mult_matrix(double a, double b, double c, double d, double x, double y);
327  inline void scale(double x, double y) { mult_matrix(x,0,0,y,0,0); }
329  inline void scale(double x) { mult_matrix(x,0,0,x,0,0); }
331  inline void translate(double x,double y) { mult_matrix(1,0,0,1,x,y); }
333  void rotate(double d);
335  double transform_x(double x, double y);
337  double transform_y(double x, double y);
339  double transform_dx(double x, double y);
341  double transform_dy(double x, double y);
343  Fl_Region clip_region();
345  void clip_region(Fl_Region r);
347  void restore_clip();
348 
349  // Images
351  virtual void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) {}
353  virtual void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) {}
355  virtual void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) {}
357  virtual void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) {}
358  // Image classes
364  virtual void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) {}
370  virtual void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) {}
376  virtual void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) {}
377 #if FLTK_ABI_VERSION >= 10301
378  virtual
379 #endif
380  void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
381 
382 public:
383  static const char *class_id;
384  virtual const char *class_name() {return class_id;};
386  virtual void font(Fl_Font face, Fl_Fontsize fsize) {font_ = face; size_ = fsize;}
388  Fl_Font font() {return font_; }
390  Fl_Fontsize size() {return size_; }
392  virtual double width(const char *str, int n) {return 0;}
394  virtual inline double width(unsigned int c) { char ch = (char)c; return width(&ch, 1); }
396  virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
398  virtual int height() {return size();}
400  virtual int descent() {return 0;}
402  Fl_Color color() {return color_;}
404  inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
406  inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
407 #if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
408  virtual
409 #endif
410  int draw_scaled(Fl_Image *img, int X, int Y, int W, int H);
412  virtual ~Fl_Graphics_Driver() { if (p) free(p); }
413 };
414 
415 #if defined(__APPLE__) || defined(FL_DOXYGEN)
416 
422 public:
423  static const char *class_id;
424  const char *class_name() {return class_id;};
425  void color(Fl_Color c);
426  void color(uchar r, uchar g, uchar b);
427  void draw(const char* str, int n, int x, int y);
428 #ifdef __APPLE__
429  void draw(const char *str, int n, float x, float y);
430 #endif
431  void draw(int angle, const char *str, int n, int x, int y);
432  void rtl_draw(const char* str, int n, int x, int y);
433  void font(Fl_Font face, Fl_Fontsize size);
434  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
435  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
436  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
437  int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
438  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
439  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
440  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
441  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
442  double width(const char *str, int n);
443  double width(unsigned int c);
444  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
445  int height();
446  int descent();
447 #if ! defined(FL_DOXYGEN)
448  static Fl_Offscreen create_offscreen_with_alpha(int w, int h);
449 #endif
450  void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
451 };
452 #endif
453 #if defined(WIN32) || defined(FL_DOXYGEN)
454 
459 class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver {
460 public:
461  static const char *class_id;
462  const char *class_name() {return class_id;};
463  void color(Fl_Color c);
464  void color(uchar r, uchar g, uchar b);
465  void draw(const char* str, int n, int x, int y);
466  void draw(int angle, const char *str, int n, int x, int y);
467  void rtl_draw(const char* str, int n, int x, int y);
468  void font(Fl_Font face, Fl_Fontsize size);
469  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
470  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
471  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
472  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
473  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
474  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
475  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
476  double width(const char *str, int n);
477  double width(unsigned int c);
478  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
479  int height();
480  int descent();
481 #if ! defined(FL_DOXYGEN)
482  void copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy);
483 #endif
484  void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
485 };
486 
493 public:
494  static const char *class_id;
495  const char *class_name() {return class_id;};
496  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
497  void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy);
498  int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
499 };
500 #endif
501 #if !(defined(__APPLE__) || defined(WIN32))
502 
507 class FL_EXPORT Fl_Xlib_Graphics_Driver : public Fl_Graphics_Driver {
508 public:
509  static const char *class_id;
510  const char *class_name() {return class_id;};
511  void color(Fl_Color c);
512  void color(uchar r, uchar g, uchar b);
513  void draw(const char* str, int n, int x, int y);
514  void draw(int angle, const char *str, int n, int x, int y);
515  void rtl_draw(const char* str, int n, int x, int y);
516  void font(Fl_Font face, Fl_Fontsize size);
517  void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
518  void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
519  void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
520  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
521  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
522  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
523  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
524  double width(const char *str, int n);
525  double width(unsigned int c);
526  void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
527  int height();
528  int descent();
529  void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
530 #if ! defined(FL_DOXYGEN)
531  void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
532 #endif
533 };
534 #endif
535 
556 class FL_EXPORT Fl_Surface_Device : public Fl_Device {
558  Fl_Graphics_Driver *_driver;
559  static Fl_Surface_Device *_surface; // the surface that currently receives graphics output
560  static Fl_Surface_Device *default_surface(); // create surface is none exists yet
561 protected:
563  Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver; };
564 public:
565  static const char *class_id;
566  const char *class_name() {return class_id;};
567  virtual void set_current(void);
569  inline void driver(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver;};
571  inline Fl_Graphics_Driver *driver() {return _driver; };
574  static inline Fl_Surface_Device *surface() {
575  return _surface ? _surface : default_surface();
576  };
578  virtual ~Fl_Surface_Device() {}
579 };
580 
586 class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
587  static Fl_Display_Device *_display; // the platform display device
588 #ifdef __APPLE__
589  friend class Fl_X;
590  friend class Fl_Graphics_Driver;
591  static bool high_res_window_; //< true when drawing to a window of a retina display (Mac OS X only)
592  static bool high_resolution() {return high_res_window_;}
593 #endif
594 public:
595  static const char *class_id;
596  const char *class_name() {return class_id;};
597  Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
598  static Fl_Display_Device *display_device();
599 };
600 
608 class FL_EXPORT Fl_Device_Plugin : public Fl_Plugin {
609 public:
611  Fl_Device_Plugin(const char *pluginName)
612  : Fl_Plugin(klass(), pluginName) { }
614  virtual const char *klass() { return "fltk:device"; }
616  virtual const char *name() = 0;
622  virtual int print(Fl_Widget* w, int x, int y, int height) = 0;
626 #ifdef FL_LIBRARY
627  virtual
628 #endif
629  Fl_RGB_Image* rectangle_capture(Fl_Widget *widget, int x, int y, int w, int h) {return NULL;}
630 };
631 
632 #endif // Fl_Device_H
633 
634 //
635 // End of "$Id$".
636 //