FLTK 1.3.0
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-2011 by Bill Spitzak and others.
00008 //
00009 // This library is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU Library General Public
00011 // License as published by the Free Software Foundation; either
00012 // version 2 of the License, or (at your option) any later version.
00013 //
00014 // This library is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 // Library General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU Library General Public
00020 // License along with this library; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00022 // USA.
00023 //
00024 // Please report all bugs and problems on the following page:
00025 //
00026 //     http://www.fltk.org/str.php
00027 //
00033 #ifndef Fl_Device_H
00034 #define Fl_Device_H
00035 
00036 #include <FL/x.H>
00037 #include <FL/Fl_Plugin.H>
00038 #include <FL/Fl_Image.H>
00039 #include <FL/Fl_Bitmap.H>
00040 #include <FL/Fl_Pixmap.H>
00041 #include <FL/Fl_RGB_Image.H>
00042 
00043 class Fl_Graphics_Driver;
00044 class Fl_Font_Descriptor;
00046 FL_EXPORT extern Fl_Graphics_Driver *fl_graphics_driver;
00047 
00056 typedef void (*Fl_Draw_Image_Cb)(void* data,int x,int y,int w,uchar* buf);
00057 
00058 // typedef what the x,y fields in a point are:
00059 #ifdef WIN32
00060 typedef int COORD_T;
00061 #  define XPOINT XPoint
00062 #elif defined(__APPLE__)
00063 typedef float COORD_T;
00064 typedef struct { float x; float y; } QPoint;
00065 #  define XPOINT QPoint
00066 extern float fl_quartz_line_width_;
00067 #else
00068 typedef short COORD_T;
00069 #  define XPOINT XPoint
00070 #endif
00071 
00075 class FL_EXPORT Fl_Device {
00076 public:
00080   static const char *class_id;
00088   virtual const char *class_name() {return class_id;};
00095   virtual ~Fl_Device() {};
00096 };
00097 
00098 #define FL_REGION_STACK_SIZE 10
00099 #define FL_MATRIX_STACK_SIZE 32
00100 
00108 class FL_EXPORT Fl_Graphics_Driver : public Fl_Device {
00109 public:
00112   struct matrix {double a, b, c, d, x, y;};
00113 private:
00114   static const matrix m0;
00115   Fl_Font font_; // current font
00116   Fl_Fontsize size_; // current font size
00117   Fl_Color color_; // current color
00118   enum {LINE, LOOP, POLYGON, POINT_};
00119   int sptr;
00120   static const int matrix_stack_size = FL_MATRIX_STACK_SIZE;
00121   matrix stack[FL_MATRIX_STACK_SIZE];
00122   matrix m;
00123   int n, p_size, gap_;
00124   XPOINT *p;
00125   int what;
00126   int fl_clip_state_number;
00127   int rstackptr;
00128   static const int region_stack_max = FL_REGION_STACK_SIZE - 1;
00129   Fl_Region rstack[FL_REGION_STACK_SIZE];
00130 #ifdef WIN32
00131   int numcount;
00132   int counts[20];
00133 #endif
00134   Fl_Font_Descriptor *font_descriptor_;
00135   void transformed_vertex0(COORD_T x, COORD_T y);
00136   void fixloop();
00137   
00138 protected:
00139 /*  ** \brief red color for background and/or mixing if device does not support masking or alpha *
00140   uchar bg_r_; 
00141   ** \brief green color for background and/or mixing if device does not support masking or alpha *
00142   uchar bg_g_; 
00143   ** \brief blue color for background and/or mixing if device does not support masking or alpha *
00144   uchar bg_b_; */
00145   friend class Fl_Pixmap;
00146   friend class Fl_Bitmap;
00147   friend class Fl_RGB_Image;
00148   friend void fl_rect(int x, int y, int w, int h);
00149   friend void fl_rectf(int x, int y, int w, int h);
00150   friend void fl_line_style(int style, int width, char* dashes);
00151   friend void fl_xyline(int x, int y, int x1);
00152   friend void fl_xyline(int x, int y, int x1, int y2);
00153   friend void fl_xyline(int x, int y, int x1, int y2, int x3);
00154   friend void fl_yxline(int x, int y, int y1);
00155   friend void fl_yxline(int x, int y, int y1, int x2);
00156   friend void fl_yxline(int x, int y, int y1, int x2, int y3);
00157   friend void fl_line(int x, int y, int x1, int y1);
00158   friend void fl_line(int x, int y, int x1, int y1, int x2, int y2);
00159   friend void fl_draw(const char *str, int n, int x, int y);
00160 #ifdef __APPLE__
00161   friend void fl_draw(const char *str, int n, float x, float y);
00162 #endif
00163   friend void fl_draw(int angle, const char *str, int n, int x, int y);
00164   friend void fl_rtl_draw(const char *str, int n, int x, int y);
00165   friend void fl_font(Fl_Font face, Fl_Fontsize size);
00166   friend void fl_color(Fl_Color c);
00167   friend void fl_color(uchar r, uchar g, uchar b);
00168   friend void fl_point(int x, int y);
00169   friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2);
00170   friend void fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00171   friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2);
00172   friend void fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00173   friend void fl_begin_points();
00174   friend void fl_begin_line();
00175   friend void fl_begin_loop();
00176   friend void fl_begin_polygon();
00177   friend void fl_vertex(double x, double y);
00178   friend void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
00179   friend void fl_circle(double x, double y, double r);
00180   friend void fl_arc(double x, double y, double r, double start, double end);
00181   friend void fl_arc(int x, int y, int w, int h, double a1, double a2);
00182   friend void fl_pie(int x, int y, int w, int h, double a1, double a2);
00183   friend void fl_end_points();
00184   friend void fl_end_line();
00185   friend void fl_end_loop();
00186   friend void fl_end_polygon();
00187   friend void fl_transformed_vertex(double xf, double yf);
00188   friend void fl_push_clip(int x, int y, int w, int h);
00189   friend int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
00190   friend int fl_not_clipped(int x, int y, int w, int h);
00191   friend void fl_push_no_clip();
00192   friend void fl_pop_clip();
00193   friend void fl_begin_complex_polygon();
00194   friend void fl_gap();
00195   friend void fl_end_complex_polygon();
00196   friend void fl_push_matrix();
00197   friend void fl_pop_matrix();
00198   friend void fl_mult_matrix(double a, double b, double c, double d, double x, double y);
00199   friend void fl_scale(double x, double y);
00200   friend void fl_scale(double x);
00201   friend void fl_translate(double x, double y);
00202   friend void fl_rotate(double d);
00203   friend double fl_transform_x(double x, double y);
00204   friend double fl_transform_y(double x, double y);
00205   friend double fl_transform_dx(double x, double y);
00206   friend double fl_transform_dy(double x, double y);
00207   friend Fl_Region fl_clip_region();
00208   friend void fl_clip_region(Fl_Region r);
00209   friend void fl_restore_clip();
00210   
00211   friend void fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L);
00212   friend void fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L);
00213   friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
00214   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);
00215   friend FL_EXPORT void gl_start();
00216 
00217   matrix *fl_matrix; 
00220   Fl_Graphics_Driver();
00222   virtual void rect(int x, int y, int w, int h);
00224   virtual void rectf(int x, int y, int w, int h);
00226   virtual void line_style(int style, int width=0, char* dashes=0);
00228   virtual void xyline(int x, int y, int x1);
00230   virtual void xyline(int x, int y, int x1, int y2);
00232   virtual void xyline(int x, int y, int x1, int y2, int x3);
00234   virtual void yxline(int x, int y, int y1);
00236   virtual void yxline(int x, int y, int y1, int x2);
00238   virtual void yxline(int x, int y, int y1, int x2, int y3);
00240   virtual void line(int x, int y, int x1, int y1);
00242   virtual void line(int x, int y, int x1, int y1, int x2, int y2);
00244   virtual void draw(const char *str, int n, int x, int y) = 0;
00245 #ifdef __APPLE__
00246   virtual void draw(const char *str, int n, float x, float y) = 0;
00247 #endif
00248 
00249   virtual void draw(int angle, const char *str, int n, int x, int y) = 0;
00251   virtual void rtl_draw(const char *str, int n, int x, int y) = 0;
00253   virtual void color(Fl_Color c) {color_ = c;}
00255   virtual void color(uchar r, uchar g, uchar b) = 0;
00257   virtual void point(int x, int y);
00259   virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2);
00261   virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00263   virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
00265   virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
00267   virtual void begin_points();
00269   virtual void begin_line();
00271   virtual void begin_loop();
00273   virtual void begin_polygon();
00275   virtual void vertex(double x, double y);
00277   virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
00279   virtual void circle(double x, double y, double r);
00281   virtual void arc(double x, double y, double r, double start, double end);
00283   virtual void arc(int x, int y, int w, int h, double a1, double a2);
00285   virtual void pie(int x, int y, int w, int h, double a1, double a2);
00287   virtual void end_points();
00289   virtual void end_line();
00291   virtual void end_loop();
00293   virtual void end_polygon();
00295   virtual void begin_complex_polygon();
00297   virtual void gap();
00299   virtual void end_complex_polygon();
00301   virtual void transformed_vertex(double xf, double yf);
00303   virtual void push_clip(int x, int y, int w, int h);
00305   virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
00307   virtual int not_clipped(int x, int y, int w, int h);
00309   virtual void push_no_clip();
00311   virtual void pop_clip();
00312     
00314   void push_matrix();
00316   void pop_matrix();
00318   void mult_matrix(double a, double b, double c, double d, double x, double y);
00320   inline void scale(double x, double y) { mult_matrix(x,0,0,y,0,0); }
00322   inline void scale(double x) { mult_matrix(x,0,0,x,0,0); }
00324   inline void translate(double x,double y) { mult_matrix(1,0,0,1,x,y); }
00326   void rotate(double d);
00328   double transform_x(double x, double y);
00330   double transform_y(double x, double y);
00332   double transform_dx(double x, double y);
00334   double transform_dy(double x, double y);
00336   Fl_Region clip_region();
00338   void clip_region(Fl_Region r);
00340   void restore_clip();
00341   
00342   // Images
00344   virtual   void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) = 0;
00346   virtual   void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) = 0;
00348   virtual   void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) = 0;
00350   virtual   void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) = 0;
00351   // Image classes
00357   virtual   void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) = 0;
00363   virtual   void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) = 0;
00369   virtual void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) = 0;
00370     
00371 public:
00372   static const char *class_id;
00373   virtual const char *class_name() {return class_id;};
00375   virtual void font(Fl_Font face, Fl_Fontsize size) {font_ = face; size_ = size;}
00377   Fl_Font font() {return font_; }
00379   Fl_Fontsize size() {return size_; }
00381   virtual double width(const char *str, int n) = 0;
00383   virtual inline double width(unsigned int c) { char ch = (char)c; return width(&ch, 1); }
00385   virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00387   virtual int height() = 0;
00389   virtual int descent() = 0;
00391   Fl_Color color() {return color_;}
00393   inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
00395   inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
00397   virtual ~Fl_Graphics_Driver() {};
00398 };
00399 
00400 #if defined(__APPLE__) || defined(FL_DOXYGEN)
00401 
00406 class FL_EXPORT Fl_Quartz_Graphics_Driver : public Fl_Graphics_Driver {
00407 public:
00408   static const char *class_id;
00409   const char *class_name() {return class_id;};
00410   void color(Fl_Color c);
00411   void color(uchar r, uchar g, uchar b);
00412   void draw(const char* str, int n, int x, int y);
00413 #ifdef __APPLE__
00414   void draw(const char *str, int n, float x, float y);
00415 #endif
00416   void draw(int angle, const char *str, int n, int x, int y);
00417   void rtl_draw(const char* str, int n, int x, int y);
00418   void font(Fl_Font face, Fl_Fontsize size);
00419   void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00420   void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00421   void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00422   void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00423   void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00424   void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00425   void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00426   double width(const char *str, int n);
00427   double width(unsigned int c);
00428   void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00429   int height();
00430   int descent();
00431 };
00432 #endif
00433 #if defined(WIN32) || defined(FL_DOXYGEN)
00434 
00439 class FL_EXPORT Fl_GDI_Graphics_Driver : public Fl_Graphics_Driver {
00440 public:
00441   static const char *class_id;
00442   const char *class_name() {return class_id;};
00443   void color(Fl_Color c);
00444   void color(uchar r, uchar g, uchar b);
00445   void draw(const char* str, int n, int x, int y);
00446   void draw(int angle, const char *str, int n, int x, int y);
00447   void rtl_draw(const char* str, int n, int x, int y);
00448   void font(Fl_Font face, Fl_Fontsize size);
00449   void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00450   void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00451   void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00452   void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00453   void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00454   void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00455   void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00456   double width(const char *str, int n);
00457   double width(unsigned int c);
00458   void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00459   int height();
00460   int descent();
00461 };
00462 #endif
00463 #if !(defined(__APPLE__) || defined(WIN32))
00464 
00469 class Fl_Xlib_Graphics_Driver : public Fl_Graphics_Driver {
00470 public:
00471   static const char *class_id;
00472   const char *class_name() {return class_id;};
00473   void color(Fl_Color c);
00474   void color(uchar r, uchar g, uchar b);
00475   void draw(const char* str, int n, int x, int y);
00476   void draw(int angle, const char *str, int n, int x, int y);
00477   void rtl_draw(const char* str, int n, int x, int y);
00478   void font(Fl_Font face, Fl_Fontsize size);
00479   void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00480   void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
00481   void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
00482   void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
00483   void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
00484   void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
00485   void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);
00486   double width(const char *str, int n);
00487   double width(unsigned int c);
00488   void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
00489   int height();
00490   int descent();
00491 };
00492 #endif
00493 
00497 class FL_EXPORT Fl_Surface_Device : public Fl_Device {
00499   Fl_Graphics_Driver *_driver;
00500   static Fl_Surface_Device *_surface; // the surface that currently receives graphics output
00501 protected:
00503   Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver; };
00504 public:
00505   static const char *class_id;
00506   const char *class_name() {return class_id;};
00507   virtual void set_current(void);
00509   inline void driver(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver;};
00511   inline Fl_Graphics_Driver *driver() {return _driver; };
00513   static inline Fl_Surface_Device *surface() {return _surface; }; 
00515   virtual ~Fl_Surface_Device() {}
00516 };
00517 
00521 class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
00522   static Fl_Display_Device *_display; // the platform display device
00523 public:
00524   static const char *class_id;
00525   const char *class_name() {return class_id;};
00527   Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
00529   static inline Fl_Display_Device *display_device() {return _display;};
00530 };
00531 
00537 class FL_EXPORT Fl_Device_Plugin : public Fl_Plugin {
00538 public:
00540   Fl_Device_Plugin(const char *name)
00541   : Fl_Plugin(klass(), name) { }
00543   virtual const char *klass() { return "fltk:device"; }
00545   virtual const char *name() = 0;
00551   virtual int print(Fl_Widget* w, int x, int y, int height) = 0;
00552 };
00553 
00554 #endif // Fl_Device_H
00555 
00556 //
00557 // End of "$Id$".
00558 //