diff options
| author | Manolo Gouy <Manolo> | 2014-05-23 16:47:21 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2014-05-23 16:47:21 +0000 |
| commit | 07dd8ba328117a2599cb39dbaa9f17d4f279f923 (patch) | |
| tree | 6e4976f79f015d70a9e540b6e66262219fd300a2 /src/Fl_Image_Surface.cxx | |
| parent | 85af2efe09d6ac88bfc18f8a991ea59af9a5b24b (diff) | |
Added copy/paste from/to FLTK applications of graphical data.
Added Fl_Image_Surface class to draw into an Fl_Image object.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10159 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Image_Surface.cxx')
| -rw-r--r-- | src/Fl_Image_Surface.cxx | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx new file mode 100644 index 000000000..047de7b57 --- /dev/null +++ b/src/Fl_Image_Surface.cxx @@ -0,0 +1,158 @@ +// +// "$Id: Fl_Image_Surface.cxx 9869 2013-04-09 20:11:28Z greg.ercolano $" +// +// 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 the image made of all drawings sent to the Fl_Image_Surface object. + The returned object can be safely cast to Fl_RGB_Image* and contains its own copy + of the RGB data. + */ +Fl_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: $". +// |
