FLTK 1.3.0
|
00001 // 00002 // "$Id$" 00003 // 00004 // Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK). 00005 // 00006 // Copyright 2010-2011 by Bill Spitzak and others. 00007 // 00008 // This library is free software. Distribution and use rights are outlined in 00009 // the file "COPYING" which should have been included with this file. If this 00010 // file is missing or damaged, see the license at: 00011 // 00012 // http://www.fltk.org/COPYING.php 00013 // 00014 // Please report all bugs and problems on the following page: 00015 // 00016 // http://www.fltk.org/str.php 00017 // 00018 00023 #ifndef Fl_PostScript_H 00024 #define Fl_PostScript_H 00025 00026 #include <FL/Fl_Paged_Device.H> 00027 #include <FL/fl_draw.H> 00028 00055 class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver { 00056 public: 00057 static const char *class_id; 00058 const char *class_name() {return class_id;}; 00059 Fl_PostScript_Graphics_Driver(); 00060 #ifndef FL_DOXYGEN 00061 enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS}; 00062 00063 class Clip { 00064 public: 00065 int x, y, w, h; 00066 Clip *prev; 00067 }; 00068 Clip * clip_; 00069 00070 int lang_level_; 00071 int gap_; 00072 int pages_; 00073 00074 double width_; 00075 double height_; 00076 00077 int shape_; 00078 int linewidth_;// need for clipping, lang level 1-2 00079 int linestyle_;// 00080 int interpolate_; //interpolation of images 00081 unsigned char cr_,cg_,cb_; 00082 char linedash_[256];//should be enough 00083 void concat(); // transform ror scalable dradings... 00084 void reconcat(); //invert 00085 void recover(); //recovers the state after grestore (such as line styles...) 00086 void reset(); 00087 00088 uchar * mask; 00089 int mx; // width of mask; 00090 int my; // mask lines 00091 //Fl_Color bg_; 00092 int (*close_cmd_)(FILE *); 00093 int page_policy_; 00094 int nPages; 00095 int orientation_; 00096 00097 float scale_x; 00098 float scale_y; 00099 float angle; 00100 int left_margin; 00101 int top_margin; 00102 00103 FILE *output; 00104 double pw_, ph_; 00105 00106 uchar bg_r, bg_g, bg_b; 00107 int start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout); 00108 /* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); 00109 */ 00110 void transformed_draw(const char* s, int n, double x, double y); //precise text placing 00111 void transformed_draw(const char* s, double x, double y); 00112 int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); 00113 00114 enum Fl_Paged_Device::Page_Format page_format_; 00115 char *ps_filename_; 00116 00117 void page_policy(int p); 00118 int page_policy(){return page_policy_;}; 00119 void close_command( int (*cmd)(FILE *)){close_cmd_=cmd;}; 00120 FILE * file() {return output;}; 00121 //void orientation (int o); 00122 //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor 00123 //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int x, int y, int w, int h); //eps constructor 00124 void interpolate(int i){interpolate_=i;}; 00125 int interpolate(){return interpolate_;} 00126 00127 void page(double pw, double ph, int media = 0); 00128 void page(int format); 00129 #endif // FL_DOXYGEN 00130 00131 // implementation of drawing methods 00132 void color(Fl_Color c); 00133 void color(uchar r, uchar g, uchar b); 00134 00135 void push_clip(int x, int y, int w, int h); 00136 int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H); 00137 int not_clipped(int x, int y, int w, int h); 00138 void push_no_clip(); 00139 void pop_clip(); 00140 00141 void line_style(int style, int width=0, char* dashes=0); 00142 00143 void rect(int x, int y, int w, int h); 00144 void rectf(int x, int y, int w, int h); 00145 00146 void xyline(int x, int y, int x1); 00147 void xyline(int x, int y, int x1, int y2); 00148 void xyline(int x, int y, int x1, int y2, int x3); 00149 00150 void yxline(int x, int y, int y1); 00151 void yxline(int x, int y, int y1, int x2); 00152 void yxline(int x, int y, int y1, int x2, int y3); 00153 00154 void line(int x1, int y1, int x2, int y2); 00155 void line(int x1, int y1, int x2, int y2, int x3, int y3); 00156 00157 void loop(int x0, int y0, int x1, int y1, int x2, int y2); 00158 void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); 00159 void polygon(int x0, int y0, int x1, int y1, int x2, int y2); 00160 void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); 00161 void point(int x, int y); 00162 00163 void begin_points(); 00164 void begin_line(); 00165 void begin_loop(); 00166 void begin_polygon(); 00167 void vertex(double x, double y); 00168 void curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3); 00169 void circle(double x, double y, double r); 00170 void arc(double x, double y, double r, double start, double a); 00171 void arc(int x, int y, int w, int h, double a1, double a2); 00172 void pie(int x, int y, int w, int h, double a1, double a2); 00173 void end_points(); 00174 void end_line(); 00175 void end_loop(); 00176 void end_polygon(); 00177 void begin_complex_polygon(){begin_polygon();}; 00178 void gap(){gap_=1;}; 00179 void end_complex_polygon(){end_polygon();}; 00180 void transformed_vertex(double x, double y); 00181 00182 void draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0); 00183 void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0); 00184 void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3); 00185 void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1); 00186 00187 void draw(const char* s, int nBytes, int x, int y) {transformed_draw(s,nBytes,x,y); }; 00188 #ifdef __APPLE__ 00189 void draw(const char* s, int nBytes, float x, float y) {transformed_draw(s,nBytes,x,y); }; 00190 #endif 00191 void draw(int angle, const char *str, int n, int x, int y); 00192 void rtl_draw(const char* s, int n, int x, int y); 00193 void font(int face, int size); 00194 double width(const char *, int); 00195 void text_extents(const char *c, int n, int &dx, int &dy, int &w, int &h); 00196 int height(); 00197 int descent(); 00198 void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy); 00199 void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy); 00200 void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy); 00201 ~Fl_PostScript_Graphics_Driver(); 00202 }; 00203 00207 class FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device { 00208 #ifdef __APPLE__ 00209 CGContextRef gc; 00210 #endif 00211 protected: 00212 Fl_PostScript_Graphics_Driver *driver(); 00213 public: 00214 static const char *class_id; 00215 const char *class_name() {return class_id;}; 00216 Fl_PostScript_File_Device(); 00217 ~Fl_PostScript_File_Device(); 00218 int start_job(int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, 00219 enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); 00220 int start_job(FILE *ps_output, int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, 00221 enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); 00222 int start_page (void); 00223 int printable_rect(int *w, int *h); 00224 void margins(int *left, int *top, int *right, int *bottom); 00225 void origin(int *x, int *y); 00226 void origin(int x, int y); 00227 void scale (float scale_x, float scale_y = 0.); 00228 void rotate(float angle); 00229 void translate(int x, int y); 00230 void untranslate(void); 00231 int end_page (void); 00232 void end_job(void); 00233 #ifdef __APPLE__ 00234 void set_current() { fl_gc = gc; Fl_Paged_Device::set_current(); } 00235 #endif 00236 00237 static const char *file_chooser_title; 00238 }; 00239 00240 #endif // Fl_PostScript_H 00241 00242 // 00243 // End of "$Id$" 00244 //