summaryrefslogtreecommitdiff
path: root/FL
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2020-06-27 09:56:00 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2020-06-27 09:56:00 +0200
commit26e6c3f930a052a1e729d160b0e8e5b6042b5018 (patch)
treea8d9ced3f2c8eac6414394a9b2930a1757a1ee50 /FL
parent93f19c3a2457f1c87f3c0781481f0bcc1602a514 (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.H59
-rw-r--r--FL/Fl_SVG_File_Surface.H73
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 */