1 // 2 // "$Id$" 3 // 4 // Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK). 5 // 6 // Copyright 2010-2011 by Bill Spitzak and others. 7 // 8 // This library is free software. Distribution and use rights are outlined in 9 // the file "COPYING" which should have been included with this file. If this 10 // file is missing or damaged, see the license at: 11 // 12 // http://www.fltk.org/COPYING.php 13 // 14 // Please report all bugs and problems on the following page: 15 // 16 // http://www.fltk.org/str.php 17 // 18 19 /** \file Fl_PostScript.H 20 \brief declaration of classes Fl_PostScript_Graphics_Driver, Fl_PostScript_File_Device. 21 */ 22 23 #ifndef Fl_PostScript_H 24 #define Fl_PostScript_H 25 26 #include <FL/Fl_Paged_Device.H> 27 #include <FL/fl_draw.H> 28 #include <stdarg.h> 29 30 /* Signature of Fl_PostScript::close_command() functions passed as parameters. */ 31 extern "C" { 32 typedef int (Fl_PostScript_Close_Command)(FILE *); 33 } 34 35 /** 36 \brief PostScript graphical backend. 37 * 38 PostScript text uses vectorial fonts when using the FLTK standard fonts 39 and the latin alphabet or a few other characters listed in the following table. 40 The latin alphabet means all unicode characters between U+0020 and U+017F, or, in other words, 41 the ASCII, Latin-1 Supplement and Latin Extended-A charts. 42 <table> 43 <tr> <th>Char</th><th>Codepoint</th><th>Name</th> <th>Char</th><th>Codepoint</th><th>Name</th> <th>Char</th><th>Codepoint</th><th>Name</th></tr> 44 <tr><td>ƒ</td><td>U+0192</td><td>florin</td><td>‚</td><td>U+201A</td><td>quotesinglbase</td><td>™</td><td>U+2122</td><td>trademark</td></tr> 45 <tr><td>ˆ</td><td>U+02C6</td><td>circumflex</td><td>“</td><td>U+201C</td><td>quotedblleft</td><td>∂</td><td>U+2202</td><td>partialdiff</td></tr> 46 <tr><td>ˇ</td><td>U+02C7</td><td>caron</td><td>”</td><td>U+201D</td><td>quotedblright</td><td>Δ</td><td>U+2206</td><td>Delta</td></tr> 47 <tr><td>˘</td><td>U+02D8</td><td>breve</td><td>„</td><td>U+201E</td><td>quotedblbase</td><td>∑</td><td>U+2211</td><td>summation</td></tr> 48 <tr><td>˙</td><td>U+02D9</td><td>dotaccent</td><td>†</td><td>U+2020</td><td>dagger</td><td>√</td><td>U+221A</td><td>radical</td></tr> 49 <tr><td>˚</td><td>U+02DA</td><td>ring</td><td>‡</td><td>U+2021</td><td>daggerdbl</td><td>∞</td><td>U+221E</td><td>infinity</td></tr> 50 <tr><td>˛</td><td>U+02DB</td><td>ogonek</td><td>•</td><td>U+2022</td><td>bullet</td><td>≠</td><td>U+2260</td><td>notequal</td></tr> 51 <tr><td>˜</td><td>U+02DC</td><td>tilde</td><td>…</td><td>U+2026</td><td>ellipsis</td><td>≤</td><td>U+2264</td><td>lessequal</td></tr> 52 <tr><td>˝</td><td>U+02DD</td><td>hungarumlaut</td><td>‰</td><td>U+2030</td><td>perthousand</td><td>≥</td><td>U+2265</td><td>greaterequal</td></tr> 53 <tr><td>–</td><td>U+2013</td><td>endash</td><td>‹</td><td>U+2039</td><td>guilsinglleft</td><td>◊</td><td>U+25CA</td><td>lozenge</td></tr> 54 <tr><td>—</td><td>U+2014</td><td>emdash</td><td>›</td><td>U+203A</td><td>guilsinglright</td><td>fi</td><td>U+FB01</td><td>fi</td></tr> 55 <tr><td>‘</td><td>U+2018</td><td>quoteleft</td><td>/</td><td>U+2044</td><td>fraction</td><td>fl</td><td>U+FB02</td><td>fl</td></tr> 56 <tr><td>’</td><td>U+2019</td><td>quoteright</td><td>€</td><td>U+20AC</td><td>Euro</td><td></td><td>U+F8FF</td><td>apple (Mac OS only)</td></tr> 57 </table> 58 <br> All other unicode characters or all other fonts (FL_FREE_FONT and above) are output as a bitmap. 59 <br> FLTK standard fonts are output using the corresponding PostScript standard fonts. 60 */ 61 class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver { 62 private: 63 void transformed_draw_extra(const char* str, int n, double x, double y, int w, bool rtl); 64 void *prepare_rle85(); 65 void write_rle85(uchar b, void *data); 66 void close_rle85(void *data); 67 void *prepare85(); 68 void write85(void *data, const uchar *p, int len); 69 void close85(void *data); 70 public: 71 static const char *class_id; class_name()72 const char *class_name() {return class_id;}; 73 Fl_PostScript_Graphics_Driver(); 74 #ifndef FL_DOXYGEN 75 enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS}; 76 77 class Clip { 78 public: 79 int x, y, w, h; 80 Clip *prev; 81 }; 82 Clip * clip_; 83 84 int lang_level_; 85 int gap_; 86 int pages_; 87 88 double width_; 89 double height_; 90 91 int shape_; 92 int linewidth_;// need for clipping, lang level 1-2 93 int linestyle_;// 94 int interpolate_; //interpolation of images 95 unsigned char cr_,cg_,cb_; 96 char linedash_[256];//should be enough 97 void concat(); // transform ror scalable dradings... 98 void reconcat(); //invert 99 void recover(); //recovers the state after grestore (such as line styles...) 100 void reset(); 101 102 uchar * mask; 103 int mx; // width of mask; 104 int my; // mask lines 105 //Fl_Color bg_; 106 Fl_PostScript_Close_Command* close_cmd_; 107 int page_policy_; 108 int nPages; 109 int orientation_; 110 111 float scale_x; 112 float scale_y; 113 float angle; 114 int left_margin; 115 int top_margin; 116 117 FILE *output; 118 double pw_, ph_; 119 120 uchar bg_r, bg_g, bg_b; 121 int start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout); 122 /* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); 123 */ 124 void transformed_draw(const char* s, int n, double x, double y); //precise text placing 125 void transformed_draw(const char* s, double x, double y); 126 int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); 127 128 enum Fl_Paged_Device::Page_Format page_format_; 129 char *ps_filename_; 130 131 void page_policy(int p); page_policy()132 int page_policy(){return page_policy_;}; close_command(Fl_PostScript_Close_Command * cmd)133 void close_command(Fl_PostScript_Close_Command* cmd){close_cmd_=cmd;}; file()134 FILE * file() {return output;}; 135 //void orientation (int o); 136 //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor 137 //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int x, int y, int w, int h); //eps constructor interpolate(int i)138 void interpolate(int i){interpolate_=i;}; interpolate()139 int interpolate(){return interpolate_;} 140 141 void page(double pw, double ph, int media = 0); 142 void page(int format); 143 #endif // FL_DOXYGEN 144 145 // implementation of drawing methods 146 void color(Fl_Color c); 147 void color(uchar r, uchar g, uchar b); 148 149 void push_clip(int x, int y, int w, int h); 150 int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H); 151 int not_clipped(int x, int y, int w, int h); 152 void push_no_clip(); 153 void pop_clip(); 154 155 void line_style(int style, int width=0, char* dashes=0); 156 157 void rect(int x, int y, int w, int h); 158 void rectf(int x, int y, int w, int h); 159 160 void xyline(int x, int y, int x1); 161 void xyline(int x, int y, int x1, int y2); 162 void xyline(int x, int y, int x1, int y2, int x3); 163 164 void yxline(int x, int y, int y1); 165 void yxline(int x, int y, int y1, int x2); 166 void yxline(int x, int y, int y1, int x2, int y3); 167 168 void line(int x1, int y1, int x2, int y2); 169 void line(int x1, int y1, int x2, int y2, int x3, int y3); 170 171 void loop(int x0, int y0, int x1, int y1, int x2, int y2); 172 void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); 173 void polygon(int x0, int y0, int x1, int y1, int x2, int y2); 174 void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); 175 void point(int x, int y); 176 177 void begin_points(); 178 void begin_line(); 179 void begin_loop(); 180 void begin_polygon(); 181 void vertex(double x, double y); 182 void curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3); 183 void circle(double x, double y, double r); 184 void arc(double x, double y, double r, double start, double a); 185 void arc(int x, int y, int w, int h, double a1, double a2); 186 void pie(int x, int y, int w, int h, double a1, double a2); 187 void end_points(); 188 void end_line(); 189 void end_loop(); 190 void end_polygon(); begin_complex_polygon()191 void begin_complex_polygon(){begin_polygon();}; gap()192 void gap(){gap_=1;}; end_complex_polygon()193 void end_complex_polygon(){end_polygon();}; 194 void transformed_vertex(double x, double y); 195 196 void draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0); 197 void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0); 198 void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3); 199 void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1); 200 draw(const char * s,int nBytes,int x,int y)201 void draw(const char* s, int nBytes, int x, int y) {transformed_draw(s,nBytes,x,y); }; 202 #ifdef __APPLE__ draw(const char * s,int nBytes,float x,float y)203 void draw(const char* s, int nBytes, float x, float y) {transformed_draw(s,nBytes,x,y); }; 204 #endif 205 void draw(int angle, const char *str, int n, int x, int y); 206 void rtl_draw(const char* s, int n, int x, int y); 207 void font(int face, int size); 208 double width(const char *, int); 209 double width(unsigned int u); 210 void text_extents(const char *c, int n, int &dx, int &dy, int &w, int &h); 211 int height(); 212 int descent(); 213 void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy); 214 void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy); 215 void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy); 216 int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP); 217 int clocale_printf(const char *format, ...); 218 ~Fl_PostScript_Graphics_Driver(); 219 }; 220 221 /** 222 To send graphical output to a PostScript file. 223 This class is used exactly as the Fl_Printer class except for the start_job() call, 224 two variants of which are usable and allow to specify what page format and layout are desired. 225 */ 226 class FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device { 227 #ifdef __APPLE__ 228 CGContextRef gc; 229 #endif 230 protected: 231 Fl_PostScript_Graphics_Driver *driver(); 232 public: 233 static const char *class_id; class_name()234 const char *class_name() {return class_id;}; 235 Fl_PostScript_File_Device(); 236 ~Fl_PostScript_File_Device(); 237 int start_job(int pagecount, int* from, int* to); 238 int start_job(int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, 239 enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); 240 int start_job(FILE *ps_output, int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, 241 enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); 242 int start_page (void); 243 int printable_rect(int *w, int *h); 244 void margins(int *left, int *top, int *right, int *bottom); 245 void origin(int *x, int *y); 246 void origin(int x, int y); 247 void scale (float scale_x, float scale_y = 0.); 248 void rotate(float angle); 249 void translate(int x, int y); 250 void untranslate(void); 251 int end_page (void); 252 void end_job(void); 253 #ifdef __APPLE__ set_current()254 void set_current() { fl_gc = gc; Fl_Paged_Device::set_current(); } 255 #endif 256 257 static const char *file_chooser_title; 258 }; 259 260 #endif // Fl_PostScript_H 261 262 // 263 // End of "$Id$" 264 // 265