diff options
Diffstat (limited to 'FL/Fl_PostScript.H')
| -rw-r--r-- | FL/Fl_PostScript.H | 271 |
1 files changed, 47 insertions, 224 deletions
diff --git a/FL/Fl_PostScript.H b/FL/Fl_PostScript.H index 489916d6b..dc31cb116 100644 --- a/FL/Fl_PostScript.H +++ b/FL/Fl_PostScript.H @@ -15,7 +15,7 @@ // /** \file Fl_PostScript.H - \brief declaration of classes Fl_PostScript_Graphics_Driver, Fl_PostScript_File_Device. + \brief declaration of classes Fl_PostScript_File_Device and Fl_EPS_File_Surface. */ #ifndef Fl_PostScript_H @@ -25,204 +25,23 @@ #include <FL/fl_draw.H> #include <stdarg.h> -/* Signature of Fl_PostScript::close_command() functions passed as parameters. */ +/** Signature of Fl_PostScript::close_command() functions passed as parameters. */ extern "C" { - typedef int (Fl_PostScript_Close_Command)(FILE *); + typedef int (*Fl_PostScript_Close_Command)(FILE *); } -/** - \cond DriverDev - \addtogroup DriverDeveloper - \{ - */ - -/** - PostScript graphical backend. - */ -class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver { -private: - void transformed_draw_extra(const char* str, int n, double x, double y, int w, bool rtl); - void *prepare_rle85(); - void write_rle85(uchar b, void *data); - void close_rle85(void *data); - void *prepare85(); - void write85(void *data, const uchar *p, int len); - void close85(void *data); - int scale_for_image_(Fl_Image *img, int XP, int YP, int WP, int HP,int cx, int cy); -protected: - uchar **mask_bitmap() {return &mask;} -public: - Fl_PostScript_Graphics_Driver(); -#ifndef FL_DOXYGEN - enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS}; - - class Clip { - public: - int x, y, w, h; - Clip *prev; - }; - Clip * clip_; - - int lang_level_; - int gap_; - int pages_; - - double width_; - double height_; - - int shape_; - int linewidth_;// need for clipping, lang level 1-2 - int linestyle_;// - int interpolate_; //interpolation of images - unsigned char cr_,cg_,cb_; - char linedash_[256];//should be enough - void concat(); // transform ror scalable dradings... - void reconcat(); //invert - void recover(); //recovers the state after grestore (such as line styles...) - void reset(); - - uchar * mask; - int mx; // width of mask; - int my; // mask lines - //Fl_Color bg_; - Fl_PostScript_Close_Command* close_cmd_; - int page_policy_; - int nPages; - int orientation_; - - float scale_x; - float scale_y; - float angle; - int left_margin; - int top_margin; - - FILE *output; - double pw_, ph_; - - uchar bg_r, bg_g, bg_b; - int start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout); - /* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); - */ - void transformed_draw(const char* s, int n, double x, double y); //precise text placing - void transformed_draw(const char* s, double x, double y); - int alpha_mask(const uchar * data, int w, int h, int D, int LD=0); - - enum Fl_Paged_Device::Page_Format page_format_; - char *ps_filename_; - - void page_policy(int p); - int page_policy(){return page_policy_;}; - void close_command(Fl_PostScript_Close_Command* cmd){close_cmd_=cmd;}; - FILE * file() {return output;}; - //void orientation (int o); - //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor - //Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int x, int y, int w, int h); //eps constructor - void interpolate(int i){interpolate_=i;}; - int interpolate(){return interpolate_;} - - void page(double pw, double ph, int media = 0); - void page(int format); -#endif // FL_DOXYGEN - - // implementation of drawing methods - void color(Fl_Color c); - void color(uchar r, uchar g, uchar b); - - void push_clip(int x, int y, int w, int h); - int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H); - int not_clipped(int x, int y, int w, int h); - void push_no_clip(); - void pop_clip(); - - void line_style(int style, int width=0, char* dashes=0); - - void rect(int x, int y, int w, int h); - void rectf(int x, int y, int w, int h); - - void xyline(int x, int y, int x1); - void xyline(int x, int y, int x1, int y2); - void xyline(int x, int y, int x1, int y2, int x3); - - void yxline(int x, int y, int y1); - void yxline(int x, int y, int y1, int x2); - void yxline(int x, int y, int y1, int x2, int y3); - - void line(int x1, int y1, int x2, int y2); - void line(int x1, int y1, int x2, int y2, int x3, int y3); - - void loop(int x0, int y0, int x1, int y1, int x2, int y2); - void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); - void polygon(int x0, int y0, int x1, int y1, int x2, int y2); - void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); - void point(int x, int y); - - void begin_points(); - void begin_line(); - void begin_loop(); - void begin_polygon(); - void vertex(double x, double y); - void curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3); - void circle(double x, double y, double r); - void arc(double x, double y, double r, double start, double a); - void arc(int x, int y, int w, int h, double a1, double a2); - void pie(int x, int y, int w, int h, double a1, double a2); - void end_points(); - void end_line(); - void end_loop(); - void end_polygon(); - void begin_complex_polygon(){begin_polygon();}; - void gap(){gap_=1;}; - void end_complex_polygon(){end_polygon();}; - void transformed_vertex(double x, double y); - - void draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0); - void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0); - void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3); - void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1); - - void draw(const char* s, int nBytes, int x, int y) {transformed_draw(s,nBytes,x,y); }; - void draw(const char* s, int nBytes, float x, float y) {transformed_draw(s,nBytes,x,y); }; - void draw(int angle, const char *str, int n, int x, int y); - void rtl_draw(const char* s, int n, int x, int y); - void font(int face, int size); - double width(const char *, int); - double width(unsigned int u); - void text_extents(const char *c, int n, int &dx, int &dy, int &w, int &h); - int height(); - int descent(); - void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy); - void draw_bitmap(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy); - void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy); - /** Shields output PostScript data from modifications of the current locale. - It typically avoids PostScript errors caused if the current locale uses comma instead of dot - as "decimal point". - \param format directives controlling output PostScript data - \return value returned by vfprintf() call - */ - int clocale_printf(const char *format, ...); - ~Fl_PostScript_Graphics_Driver(); - // --- - Fl_Bitmask create_bitmask(int w, int h, const uchar *array) { return 0L; } - virtual int has_feature(driver_feature feature_mask) { return feature_mask & PRINTER; } - - int start_eps(int width, int height); - void ps_origin(int x, int y); - void ps_translate(int, int); - void ps_untranslate(); -}; - -/** - \} - \endcond - */ +class Fl_PostScript_Graphics_Driver; /** To send graphical output to a PostScript file. This class is used exactly as the Fl_Printer class except for the begin_job() call, two variants of which are usable and allow to specify what page format and layout are desired. - PostScript text uses vectorial fonts when using the FLTK standard fonts - and the latin alphabet or a few other characters listed in the following table. + <b>Processing of text</b>: Text uses vectorial fonts under the X11 + pango platform. + With other platforms, only text restricted to the Latin alphabet (and a few other characters + listed in the table below) and to FLTK standard fonts is vectorized. All other unicode characters + or all other fonts (FL_FREE_FONT and above) are output as a bitmap. + FLTK standard fonts are output using the corresponding PostScript standard fonts. The latin alphabet means all unicode characters between U+0020 and U+017F, or, in other words, the ASCII, Latin-1 Supplement and Latin Extended-A charts. <table> @@ -241,37 +60,31 @@ public: <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> <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> </table> - <br> All other unicode characters or all other fonts (FL_FREE_FONT and above) are output as a bitmap. - <br> FLTK standard fonts are output using the corresponding PostScript standard fonts. - + */ class FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device { protected: /** \brief Returns the PostScript driver of this drawing surface. */ - Fl_PostScript_Graphics_Driver *driver(); + inline Fl_PostScript_Graphics_Driver *driver() { return (Fl_PostScript_Graphics_Driver*)Fl_Surface_Device::driver(); } public: - /** - @brief The constructor. - */ - Fl_PostScript_File_Device(); - /** - @brief The destructor. - */ + /** The constructor. */ + Fl_PostScript_File_Device(); + /** The destructor. */ ~Fl_PostScript_File_Device(); /** Don't use with this class. */ int begin_job(int pagecount, int* from, int* to, char **perr_message); - /** - @brief Begins the session where all graphics requests will go to a local PostScript file. - * - Opens a file dialog entitled with Fl_PostScript_File_Device::file_chooser_title to select an output PostScript file. + /** Begins the session where all graphics requests will go to a local PostScript file. + Opens a file dialog to select an output PostScript file. + This member function makes end_job() close the resulting PostScript file and display an + alert message with fl_alert() in case of any output error. @param pagecount The total number of pages to be created. Use 0 if this number is unknown when this function is called. @param format Desired page format. @param layout Desired page layout. @return 0 if OK, 1 if user cancelled the file dialog, 2 if fopen failed on user-selected output file. */ - int begin_job(int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, + int begin_job(int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4, enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT); /** Synonym of begin_job(). For API compatibility with FLTK 1.3.x */ @@ -279,9 +92,9 @@ public: enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT) { return begin_job(pagecount, format, layout); } - /** - @brief Begins the session where all graphics requests will go to FILE pointer. - * + /** Begins the session where all graphics requests will go to FILE pointer. + This member function prevents end_job() from closing \p ps_output, so the user can check with \p ferror(ps_output) + for output errors. @param ps_output A writable FILE pointer that will receive PostScript output and that should not be closed until after end_job() has been called. @param pagecount The total number of pages to be created. Use 0 if this number is unknown when this function is called. @@ -308,11 +121,14 @@ public: void translate(int x, int y); void untranslate(void); int end_page (void); + /** Finishes all PostScript output. + This also closes the underlying \p fclose(file()) unless close_command() was used to set another function. + */ void end_job(void); - /** \brief Label of the PostScript file chooser window */ + /** Label of the PostScript file chooser window */ static const char *file_chooser_title; /** Returns the underlying FILE* receiving all PostScript data */ - FILE *file() { return driver()->file(); } + FILE *file(); }; /** Encapsulated PostScript drawing surface. @@ -329,13 +145,10 @@ public: surface->draw_decorated_window(win); Fl_Surface_Device::pop_current(); delete surface; // the .eps file is not complete until the destructor was run - fclose(eps); } \endcode */ class FL_EXPORT Fl_EPS_File_Surface : public Fl_Widget_Surface { -private: - void complete_(); protected: /** Returns the PostScript driver of this drawing surface. */ inline Fl_PostScript_Graphics_Driver *driver() { return (Fl_PostScript_Graphics_Driver*)Fl_Surface_Device::driver(); } @@ -343,27 +156,37 @@ public: /** Constructor. \param width,height Width and height of the EPS drawing area - \param eps A writable FILE pointer where the Encapsulated PostScript data will be sent - \param background Color expected to cover the background of the EPS drawing area. - This parameter affects only the drawing of transparent Fl_RGB_Image objects: - transparent areas of RGB images are blended with the \p background color. + \param eps_output A writable FILE pointer where the Encapsulated PostScript data will be sent + \param background Color expected to cover the background of the EPS drawing area. + This parameter affects only the drawing of transparent Fl_RGB_Image objects: + transparent areas of RGB images are blended with the \p background color. + Under the X11 + pango platform, transparent RGB images are correctly blended to their background, + thus this parameter has no effect. + \param closef If not NULL, the destructor or close() will call \p closef(eps_output) after all + EPS data has been sent. If NULL, \p fclose(eps_output) is called instead. This allows to close the FILE + pointer by, e.g., \p pclose, or, using a function such as \p "int keep_open(FILE*){return 0;}", to keep it open after + completion of all output to \p eps_output. Function \p closef should return non zero to indicate an error. */ - Fl_EPS_File_Surface(int width, int height, FILE *eps, Fl_Color background = FL_WHITE); + Fl_EPS_File_Surface(int width, int height, FILE *eps_output, + Fl_Color background = FL_WHITE, Fl_PostScript_Close_Command closef = NULL); /** Destructor. - The underlying FILE pointer remains open after destruction of the Fl_EPS_File_Surface object - unless close() was called. + By default, the destructor closes with function \p fclose() the underlying FILE. See the constructor for how + to close it differently or to keep it open. Use close() before object destruction to receive the status code + of output operations. If close() is not used and if EPS output results in error, the destructor displays an alert message + with fl_alert(). */ ~Fl_EPS_File_Surface(); virtual int printable_rect(int *w, int *h); /** Returns the underlying FILE pointer */ - FILE *file() { return driver() ? driver()->output : NULL; } + FILE *file(); virtual void origin(int x, int y); virtual void origin(int *px, int *py); virtual void translate(int x, int y); virtual void untranslate(); - /** Closes using fclose() the underlying FILE pointer. - The only operation possible with the Fl_EPS_File_Surface object after calling close() is its destruction. */ + /** Completes all EPS output. + The only operation possible with the Fl_EPS_File_Surface object after calling close() is its destruction. + \return The status code of output operations to the FILE object. 0 indicates success. */ int close(); }; |
