DRC | 2ff39b8 | 2011-07-28 08:38:59 +0000 | [diff] [blame] | 1 | // |
| 2 | // "$Id: Fl_PostScript.H 8699 2011-05-20 16:39:06Z manolo $" |
| 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; you can redistribute it and/or |
| 9 | // modify it under the terms of the GNU Library General Public |
| 10 | // License as published by the Free Software Foundation; either |
| 11 | // version 2 of the License, or (at your option) any later version. |
| 12 | // |
| 13 | // This library is distributed in the hope that it will be useful, |
| 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 | // Library General Public License for more details. |
| 17 | // |
| 18 | // You should have received a copy of the GNU Library General Public |
| 19 | // License along with this library; if not, write to the Free Software |
| 20 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
| 21 | // USA. |
| 22 | // |
| 23 | // Please report all bugs and problems on the following page: |
| 24 | // |
| 25 | // http://www.fltk.org/str.php |
| 26 | // |
| 27 | /** \file Fl_PostScript.H |
| 28 | \brief declaration of classes Fl_PostScript_Graphics_Driver, Fl_PostScript_File_Device. |
| 29 | */ |
| 30 | |
| 31 | |
| 32 | #ifndef Fl_PostScript_H |
| 33 | #define Fl_PostScript_H |
| 34 | |
| 35 | #include <FL/Fl_Paged_Device.H> |
| 36 | #include <FL/fl_draw.H> |
| 37 | |
| 38 | /** |
| 39 | \brief PostScript graphical backend. |
| 40 | * |
| 41 | PostScript text uses vectorial fonts for the latin alphabet (exactly: all unicode |
| 42 | characters between U+0020 and U+017F, that is, ASCII, Latin-1 Supplement and Latin Extended-A charts) |
| 43 | plus a few other characters: |
| 44 | <table> |
| 45 | <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> |
| 46 | <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> |
| 47 | <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> |
| 48 | <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> |
| 49 | <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> |
| 50 | <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> |
| 51 | <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> |
| 52 | <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> |
| 53 | <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> |
| 54 | <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> |
| 55 | <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> |
| 56 | <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> |
| 57 | <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> |
| 58 | <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> |
| 59 | </table> |
| 60 | <br> All other unicode characters are output as a bitmap. |
| 61 | <br> FLTK standard fonts are output using PostScript standard fonts: Helvetica, Courier, |
| 62 | Times (and their bold, oblique, italic variants). |
| 63 | */ |
| 64 | class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver { |
| 65 | public: |
| 66 | static const char *class_id; |
| 67 | const char *class_name() {return class_id;}; |
| 68 | Fl_PostScript_Graphics_Driver(); |
| 69 | #ifndef FL_DOXYGEN |
| 70 | enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS}; |
| 71 | |
| 72 | class Clip { |
| 73 | public: |
| 74 | int x, y, w, h; |
| 75 | Clip *prev; |
| 76 | }; |
| 77 | Clip * clip_; |
| 78 | |
| 79 | int lang_level_; |
| 80 | int gap_; |
| 81 | int pages_; |
| 82 | |
| 83 | double width_; |
| 84 | double height_; |
| 85 | |
| 86 | int shape_; |
| 87 | int linewidth_;// need for clipping, lang level 1-2 |
| 88 | int linestyle_;// |
| 89 | int interpolate_; //interpolation of images |
| 90 | unsigned char cr_,cg_,cb_; |
| 91 | char linedash_[256];//should be enough |
| 92 | void concat(); // transform ror scalable dradings... |
| 93 | void reconcat(); //invert |
| 94 | void recover(); //recovers the state after grestore (such as line styles...) |
| 95 | void reset(); |
| 96 | |
| 97 | uchar * mask; |
| 98 | int mx; // width of mask; |
| 99 | int my; // mask lines |
| 100 | //Fl_Color bg_; |
| 101 | int (*close_cmd_)(FILE *); |
| 102 | int page_policy_; |
| 103 | int nPages; |
| 104 | int orientation_; |
| 105 | |
| 106 | float scale_x; |
| 107 | float scale_y; |
| 108 | float angle; |
| 109 | int left_margin; |
| 110 | int top_margin; |
| 111 | |
| 112 | FILE *output; |
| 113 | double pw_, ph_; |
| 114 | |
| 115 | uchar bg_r, bg_g, bg_b; |
| 116 | int start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout); |
| 117 | /* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); |
| 118 | */ |
| 119 | void transformed_draw(const char* s, int n, double x, double y); //precise text placing |
| 120 | void transformed_draw(const char* s, double x, double y); |
| 121 | int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); |
| 122 | |
| 123 | enum Fl_Paged_Device::Page_Format page_format_; |
| 124 | char *ps_filename_; |
| 125 | |
| 126 | void page_policy(int p); |
| 127 | int page_policy(){return page_policy_;}; |
| 128 | void close_command( int (*cmd)(FILE *)){close_cmd_=cmd;}; |
| 129 | FILE * file() {return output;}; |
| 130 | //void orientation (int o); |
| 131 | //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor |
| 132 | //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int x, int y, int w, int h); //eps constructor |
| 133 | void interpolate(int i){interpolate_=i;}; |
| 134 | int interpolate(){return interpolate_;} |
| 135 | |
| 136 | void page(double pw, double ph, int media = 0); |
| 137 | void page(int format); |
| 138 | #endif // FL_DOXYGEN |
| 139 | |
| 140 | // implementation of drawing methods |
| 141 | void color(Fl_Color c); |
| 142 | void color(uchar r, uchar g, uchar b); |
| 143 | |
| 144 | void push_clip(int x, int y, int w, int h); |
| 145 | int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H); |
| 146 | int not_clipped(int x, int y, int w, int h); |
| 147 | void push_no_clip(); |
| 148 | void pop_clip(); |
| 149 | |
| 150 | void line_style(int style, int width=0, char* dashes=0); |
| 151 | |
| 152 | void rect(int x, int y, int w, int h); |
| 153 | void rectf(int x, int y, int w, int h); |
| 154 | |
| 155 | void xyline(int x, int y, int x1); |
| 156 | void xyline(int x, int y, int x1, int y2); |
| 157 | void xyline(int x, int y, int x1, int y2, int x3); |
| 158 | |
| 159 | void yxline(int x, int y, int y1); |
| 160 | void yxline(int x, int y, int y1, int x2); |
| 161 | void yxline(int x, int y, int y1, int x2, int y3); |
| 162 | |
| 163 | void line(int x1, int y1, int x2, int y2); |
| 164 | void line(int x1, int y1, int x2, int y2, int x3, int y3); |
| 165 | |
| 166 | void loop(int x0, int y0, int x1, int y1, int x2, int y2); |
| 167 | void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); |
| 168 | void polygon(int x0, int y0, int x1, int y1, int x2, int y2); |
| 169 | void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); |
| 170 | void point(int x, int y); |
| 171 | |
| 172 | void begin_points(); |
| 173 | void begin_line(); |
| 174 | void begin_loop(); |
| 175 | void begin_polygon(); |
| 176 | void vertex(double x, double y); |
| 177 | void curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3); |
| 178 | void circle(double x, double y, double r); |
| 179 | void arc(double x, double y, double r, double start, double a); |
| 180 | void arc(int x, int y, int w, int h, double a1, double a2); |
| 181 | void pie(int x, int y, int w, int h, double a1, double a2); |
| 182 | void end_points(); |
| 183 | void end_line(); |
| 184 | void end_loop(); |
| 185 | void end_polygon(); |
| 186 | void begin_complex_polygon(){begin_polygon();}; |
| 187 | void gap(){gap_=1;}; |
| 188 | void end_complex_polygon(){end_polygon();}; |
| 189 | void transformed_vertex(double x, double y); |
| 190 | |
| 191 | void draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0); |
| 192 | void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0); |
| 193 | void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3); |
| 194 | void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1); |
| 195 | |
| 196 | void draw(const char* s, int n, int x, int y) {transformed_draw(s,n,x,y); }; |
| 197 | #ifdef __APPLE__ |
| 198 | void draw(const char* s, int n, float x, float y) {transformed_draw(s,n,x,y); }; |
| 199 | #endif |
| 200 | void draw(int angle, const char *str, int n, int x, int y); |
| 201 | void rtl_draw(const char* s, int n, int x, int y); |
| 202 | void font(int face, int size); |
| 203 | double width(const char *, int); |
| 204 | void text_extents(const char *c, int n, int &dx, int &dy, int &w, int &h); |
| 205 | int height(); |
| 206 | int descent(); |
| 207 | void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy); |
| 208 | void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy); |
| 209 | void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy); |
| 210 | ~Fl_PostScript_Graphics_Driver(); |
| 211 | }; |
| 212 | |
| 213 | /** |
| 214 | \brief To send graphical output to a PostScript file. |
| 215 | */ |
| 216 | class FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device { |
| 217 | #ifdef __APPLE__ |
| 218 | Fl_CGContextRef gc; |
| 219 | #endif |
| 220 | protected: |
| 221 | Fl_PostScript_Graphics_Driver *driver(); |
| 222 | public: |
| 223 | static const char *class_id; |
| 224 | const char *class_name() {return class_id;}; |
| 225 | Fl_PostScript_File_Device(); |
| 226 | ~Fl_PostScript_File_Device(); |
| 227 | int start_job(int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, |
| 228 | enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); |
| 229 | int start_job(FILE *ps_output, int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, |
| 230 | enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); |
| 231 | int start_page (void); |
| 232 | int printable_rect(int *w, int *h); |
| 233 | void margins(int *left, int *top, int *right, int *bottom); |
| 234 | void origin(int *x, int *y); |
| 235 | void origin(int x, int y); |
| 236 | void scale (float scale_x, float scale_y = 0.); |
| 237 | void rotate(float angle); |
| 238 | void translate(int x, int y); |
| 239 | void untranslate(void); |
| 240 | int end_page (void); |
| 241 | void end_job(void); |
| 242 | #ifdef __APPLE__ |
| 243 | void set_current() { fl_gc = gc; Fl_Paged_Device::set_current(); } |
| 244 | #endif |
| 245 | |
| 246 | static const char *file_chooser_title; |
| 247 | }; |
| 248 | |
| 249 | #endif // Fl_PostScript_H |
| 250 | |
| 251 | // |
| 252 | // End of "$Id: Fl_PostScript.H 8699 2011-05-20 16:39:06Z manolo $" |
| 253 | // |