• Main Page
  • Related Pages
  • Modules
  • Classes
  • Files
  • File List
  • File Members

Fl_Device.H

Go to the documentation of this file.
00001 //
00002 // "$Id$"
00003 //
00004 // Definition of classes Fl_Device, Fl_Graphics_Driver, Fl_Surface_Device, Fl_Display_Device
00005 // for the Fast Light Tool Kit (FLTK).
00006 //
00007 // Copyright 2010-2014 by Bill Spitzak and others.
00008 //
00009 // This library is free software. Distribution and use rights are outlined in
00010 // the file "COPYING" which should have been included with this file.  If this
00011 // file is missing or damaged, see the license at:
00012 //
00013 //     http://www.fltk.org/COPYING.php
00014 //
00015 // Please report all bugs and problems on the following page:
00016 //
00017 //     http://www.fltk.org/str.php
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 // typedef what the x,y fields in a point are:
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_; // current font
00118   Fl_Fontsize size_; // current font size
00119   Fl_Color color_; // current 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 /*  ** \brief red color for background and/or mixing if device does not support masking or alpha *
00147   uchar bg_r_; 
00148   ** \brief green color for background and/or mixing if device does not support masking or alpha *
00149   uchar bg_g_; 
00150   ** \brief blue color for background and/or mixing if device does not support masking or alpha *
00151   uchar bg_b_; */
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   // Images
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   // Image classes
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; // the surface that currently receives graphics output
00560   static Fl_Surface_Device *default_surface(); // create surface is none exists yet
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; // the platform display device
00588 #ifdef __APPLE__
00589   friend class Fl_X;
00590   friend class Fl_Graphics_Driver;
00591   static bool high_res_window_; //< true when drawing to a window of a retina display (Mac OS X only)
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 // End of "$Id$".
00636 //
  • © 1998-2016 by Bill Spitzak and others.     FLTK

  • © 1998-2016 by Bill Spitzak and others.     FLTK

    Permission is granted to reproduce this manual or any portion for any purpose, provided this copyright and permission notice are preserved.