diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-06-27 09:56:00 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-06-27 09:56:00 +0200 |
| commit | 26e6c3f930a052a1e729d160b0e8e5b6042b5018 (patch) | |
| tree | a8d9ced3f2c8eac6414394a9b2930a1757a1ee50 /FL | |
| parent | 93f19c3a2457f1c87f3c0781481f0bcc1602a514 (diff) | |
Add classes Fl_SVG_File_Surface and Fl_EPS_File_Surface to draw to SVG and EPS.
Test programs device and pixmap_browser use these new classes.
Class Fl_SVG_File_Surface can be optionally made non functional using the
--disable-svg configure option or turning off OPTION_USE_SVG in CMake.
Class Fl_EPS_File_Surface can be optionally made non functional using the
--disable-print configure option or turning off OPTION_PRINT_SUPPORT in CMake.
Diffstat (limited to 'FL')
| -rw-r--r-- | FL/Fl_PostScript.H | 59 | ||||
| -rw-r--r-- | FL/Fl_SVG_File_Surface.H | 73 |
2 files changed, 131 insertions, 1 deletions
diff --git a/FL/Fl_PostScript.H b/FL/Fl_PostScript.H index 6d26490dc..ad6a6cd4a 100644 --- a/FL/Fl_PostScript.H +++ b/FL/Fl_PostScript.H @@ -3,7 +3,7 @@ // // Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK). // -// Copyright 2010-2019 by Bill Spitzak and others. +// Copyright 2010-2020 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -206,6 +206,11 @@ public: // --- 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(); }; /** @@ -310,6 +315,58 @@ public: static const char *file_chooser_title; }; +/** Encapsulated PostScript drawing surface. + This drawing surface allows to store any FLTK graphics in vectorial form in an "Encapsulated PostScript" file. + \n Usage example: + \code + Fl_Window *win = ...// Window to draw to an .eps file + int ww = win->decorated_w(); + int wh = win->decorated_h(); + FILE *eps = fl_fopen("/path/to/mywindow.eps", "w"); + if (eps) { + Fl_EPS_File_Surface *surface = new Fl_EPS_File_Surface(ww, wh, eps, win->color()); + Fl_Surface_Device::push_current(surface); + 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(); } +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. + */ + Fl_EPS_File_Surface(int width, int height, FILE *eps, Fl_Color background = FL_WHITE); + /** + Destructor. + The underlying FILE pointer remains open after destruction of the Fl_EPS_File_Surface object + unless close() was called. + */ + ~Fl_EPS_File_Surface(); + virtual int printable_rect(int *w, int *h); + /** Returns the underlying FILE pointer */ + FILE *file() { return driver()->output; } + 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. */ + int close(); +}; + #endif // Fl_PostScript_H // diff --git a/FL/Fl_SVG_File_Surface.H b/FL/Fl_SVG_File_Surface.H new file mode 100644 index 000000000..272f7db1f --- /dev/null +++ b/FL/Fl_SVG_File_Surface.H @@ -0,0 +1,73 @@ +// +// Declaration of Fl_SVG_File_Surface in the Fast Light Tool Kit (FLTK). +// +// Copyright 2020 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// https://www.fltk.org/str.php +// + +#ifndef Fl_SVG_File_Surface_H +#define Fl_SVG_File_Surface_H + +#include <FL/Fl_Widget_Surface.H> +#include <stdio.h> + +/** A drawing surface producing a Scalable Vector Graphics (SVG) file. + This drawing surface allows to store any FLTK graphics in vectorial form in a "Scalable Vector Graphics" file. + \n Usage example: + \code + Fl_Window *win = ...// Window to draw to a .svg file + int ww = win->decorated_w(); + int wh = win->decorated_h(); + FILE *svg = fl_fopen("/path/to/mywindow.svg", "w"); + if (svg) { + Fl_SVG_File_Surface *surface = new Fl_SVG_File_Surface(ww, wh, svg); + Fl_Surface_Device::push_current(surface); + fl_color(FL_WHITE); + fl_rectf(0, 0, ww, wh); + surface->draw_decorated_window(win); + Fl_Surface_Device::pop_current(); + delete surface; // the .svg file is not complete until the destructor was run + fclose(svg); + } + \endcode + \note FLTK uses the PNG and JPEG libraries to encode images to the SVG format. If JPEG is + not available at application build time, PNG is enough (but produces a quite larger output). + If PNG isn't available either, images don't appear in the SVG output. +*/ +class FL_EXPORT Fl_SVG_File_Surface : public Fl_Widget_Surface { + int width_, height_; +public: + /** + Constructor of the SVG drawing surface. + \param width,height Width and height of the graphics area in FLTK drawing units + \param svg A writable FILE pointer where the SVG data are to be sent. The resulting SVG data are not complete until after destruction of the Fl_SVG_File_Surface object or after calling close(). + */ + Fl_SVG_File_Surface(int width, int height, FILE *svg); + /** + Destructor. + The underlying FILE pointer remains open after destruction of the Fl_SVG_File_Surface object + unless close() was called. + */ + ~Fl_SVG_File_Surface(); + /** Returns the underlying FILE pointer */ + FILE *file(); + virtual void origin(int x, int y); + virtual void translate(int x, int y); + virtual void untranslate(); + virtual int printable_rect(int *w, int *h); + /** Closes with function fclose() the FILE pointer where SVG data is output. + The only operation possible after this on the Fl_SVG_File_Surface object is its destruction. + \return The value returned by fclose(). */ + int close(); +}; + +#endif /* Fl_SVG_File_Surface_H */ |
