summaryrefslogtreecommitdiff
path: root/src/Fl_Image_Surface.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Fl_Image_Surface.cxx')
-rw-r--r--src/Fl_Image_Surface.cxx157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx
new file mode 100644
index 0000000..b69b477
--- /dev/null
+++ b/src/Fl_Image_Surface.cxx
@@ -0,0 +1,157 @@
+//
+// "$Id: Fl_Image_Surface.cxx 10200 2014-06-18 01:22:16Z manolo $"
+//
+// Draw-to-image code for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2014 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:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include <FL/Fl_Image_Surface.H>
+#include <FL/Fl_Printer.H>
+#include <FL/Fl.H>
+
+
+const char *Fl_Image_Surface::class_id = "Fl_Image_Surface";
+
+/** The constructor.
+ \param w and \param h give the size in pixels of the resulting image.
+ */
+Fl_Image_Surface::Fl_Image_Surface(int w, int h) : Fl_Surface_Device(NULL) {
+ width = w;
+ height = h;
+#if !(defined(__APPLE__) || defined(WIN32))
+ gc = 0;
+ if (!fl_display) { // allows use of this class before any window is shown
+ fl_open_display();
+ gc = XCreateGC(fl_display, RootWindow(fl_display, fl_screen), 0, 0);
+ fl_gc = gc;
+ }
+#endif
+ offscreen = fl_create_offscreen(w, h);
+#ifdef __APPLE__
+ helper = new Fl_Quartz_Flipped_Surface_(width, height);
+ driver(helper->driver());
+#elif defined(WIN32)
+ helper = new Fl_GDI_Surface_();
+ driver(helper->driver());
+#else
+ helper = new Fl_Xlib_Surface_();
+ driver(helper->driver());
+#endif
+}
+
+/** The destructor.
+ */
+Fl_Image_Surface::~Fl_Image_Surface() {
+ fl_delete_offscreen(offscreen);
+#ifdef __APPLE__
+ delete (Fl_Quartz_Flipped_Surface_*)helper;
+#elif defined(WIN32)
+ delete (Fl_GDI_Surface_*)helper;
+#else
+ if (gc) { XFreeGC(fl_display, gc); fl_gc = 0; }
+ delete (Fl_Xlib_Surface_*)helper;
+#endif
+}
+
+/** Returns an image made of all drawings sent to the Fl_Image_Surface object.
+ The returned object contains its own copy of the RGB data.
+ */
+Fl_RGB_Image* Fl_Image_Surface::image()
+{
+ unsigned char *data;
+#ifdef __APPLE__
+ CGContextFlush(offscreen);
+ data = fl_read_image(NULL, 0, 0, width, height, 0);
+ fl_end_offscreen();
+#elif defined(WIN32)
+ fl_pop_clip();
+ data = fl_read_image(NULL, 0, 0, width, height, 0);
+ RestoreDC(fl_gc, _savedc);
+ DeleteDC(fl_gc);
+ _ss->set_current();
+ fl_window=_sw;
+ fl_gc = _sgc;
+#else
+ fl_pop_clip();
+ data = fl_read_image(NULL, 0, 0, width, height, 0);
+ fl_window = pre_window;
+ previous->set_current();
+#endif
+ Fl_RGB_Image *image = new Fl_RGB_Image(data, width, height);
+ image->alloc_array = 1;
+ return image;
+}
+
+/** Draws a widget in the image surface
+
+ \param widget any FLTK widget (e.g., standard, custom, window, GL view) to draw in the image
+ \param delta_x and \param delta_y give
+ the position in the image of the top-left corner of the widget
+ */
+void Fl_Image_Surface::draw(Fl_Widget *widget, int delta_x, int delta_y)
+{
+ helper->print_widget(widget, delta_x, delta_y);
+}
+
+
+void Fl_Image_Surface::set_current()
+{
+#if defined(__APPLE__)
+ fl_begin_offscreen(offscreen);
+ fl_pop_clip();
+ Fl_Surface_Device::set_current();
+ fl_push_no_clip();
+#elif defined(WIN32)
+ _sgc=fl_gc;
+ _sw=fl_window;
+ _ss = Fl_Surface_Device::surface();
+ Fl_Surface_Device::set_current();
+ fl_gc = fl_makeDC(offscreen);
+ _savedc = SaveDC(fl_gc);
+ fl_window=(HWND)offscreen;
+ fl_push_no_clip();
+#else
+ pre_window = fl_window;
+ fl_window = offscreen;
+ previous = Fl_Surface_Device::surface();
+ Fl_Surface_Device::set_current();
+ fl_push_no_clip();
+#endif
+}
+
+#if defined(__APPLE__)
+
+Fl_Quartz_Flipped_Surface_::Fl_Quartz_Flipped_Surface_(int w, int h) : Fl_Quartz_Surface_(w, h) {
+}
+
+void Fl_Quartz_Flipped_Surface_::translate(int x, int y) {
+ CGContextRestoreGState(fl_gc);
+ CGContextSaveGState(fl_gc);
+ CGContextTranslateCTM(fl_gc, x, -y);
+ CGContextSaveGState(fl_gc);
+ CGContextTranslateCTM(fl_gc, 0, height);
+ CGContextScaleCTM(fl_gc, 1.0f, -1.0f);
+}
+
+void Fl_Quartz_Flipped_Surface_::untranslate() {
+ CGContextRestoreGState(fl_gc);
+}
+
+const char *Fl_Quartz_Flipped_Surface_::class_id = "Fl_Quartz_Flipped_Surface_";
+
+#endif // __APPLE__
+
+//
+// End of "$Id: Fl_Image_Surface.cxx 10200 2014-06-18 01:22:16Z manolo $".
+//