2014-05-23 20:47:21 +04:00
|
|
|
//
|
2014-05-24 20:21:46 +04:00
|
|
|
// "$Id$"
|
2014-05-23 20:47:21 +04:00
|
|
|
//
|
|
|
|
// Copy-to-clipboard 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
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef Fl_Copy_Surface_H
|
|
|
|
#define Fl_Copy_Surface_H
|
|
|
|
|
|
|
|
#include <FL/Fl_Paged_Device.H>
|
|
|
|
#include <FL/Fl_Printer.H>
|
2014-11-09 11:34:26 +03:00
|
|
|
#include <FL/x.H>
|
2014-05-23 20:47:21 +04:00
|
|
|
|
|
|
|
/** Supports copying of graphical data to the clipboard.
|
|
|
|
|
|
|
|
<br> After creation of an Fl_Copy_Surface object, call set_current() on it, and all subsequent graphics requests
|
|
|
|
will be recorded in the clipboard. It's possible to draw widgets (using Fl_Copy_Surface::draw()
|
|
|
|
) or to use any of the \ref fl_drawings or the \ref fl_attributes.
|
|
|
|
Finally, delete the Fl_Copy_Surface object to load the clipboard with the graphical data.
|
|
|
|
<br> Fl_GL_Window 's can be copied to the clipboard as well.
|
|
|
|
<br> Usage example:
|
|
|
|
\code
|
|
|
|
Fl_Widget *g = ...; // a widget you want to copy to the clipboard
|
|
|
|
Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(g->w(), g->h()); // create an Fl_Copy_Surface object
|
|
|
|
copy_surf->set_current(); // direct graphics requests to the clipboard
|
|
|
|
fl_color(FL_WHITE); fl_rectf(0, 0, g->w(), g->h()); // draw a white background
|
|
|
|
copy_surf->draw(g); // draw the g widget in the clipboard
|
|
|
|
delete copy_surf; // after this, the clipboard is loaded
|
|
|
|
Fl_Display_Device::display_device()->set_current(); // direct graphics requests back to the display
|
|
|
|
\endcode
|
|
|
|
Platform details:
|
|
|
|
\li MSWindows: Transparent RGB images copy without transparency.
|
2015-10-21 09:12:32 +03:00
|
|
|
The graphical data are copied to the clipboard as an 'enhanced metafile'.
|
|
|
|
\li Mac OS: The graphical data are copied to the clipboard (a.k.a. pasteboard) in two 'flavors':
|
2015-01-20 12:05:10 +03:00
|
|
|
1) in vectorial form as PDF data; 2) in bitmap form as a TIFF image.
|
2014-05-23 20:47:21 +04:00
|
|
|
Applications to which the clipboard content is pasted can use the flavor that suits them best.
|
2015-10-21 09:12:32 +03:00
|
|
|
\li X11: the graphical data are copied to the clipboard as an image in BMP format.
|
2014-05-23 20:47:21 +04:00
|
|
|
*/
|
2014-10-29 22:57:42 +03:00
|
|
|
class FL_EXPORT Fl_Copy_Surface : public Fl_Surface_Device {
|
2014-05-23 20:47:21 +04:00
|
|
|
private:
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
Fl_Paged_Device *helper;
|
2016-02-11 15:02:36 +03:00
|
|
|
#ifdef __APPLE__ // PORTME: platform surface driver
|
2015-11-18 18:53:46 +03:00
|
|
|
CFMutableDataRef pdfdata;
|
2014-05-23 20:47:21 +04:00
|
|
|
CGContextRef oldgc;
|
|
|
|
CGContextRef gc;
|
|
|
|
void prepare_copy_pdf_and_tiff(int w, int h);
|
|
|
|
void complete_copy_pdf_and_tiff();
|
|
|
|
void init_PDF_context(int w, int h);
|
|
|
|
static size_t MyPutBytes(void* info, const void* buffer, size_t count);
|
|
|
|
#elif defined(WIN32)
|
|
|
|
HDC oldgc;
|
|
|
|
HDC gc;
|
2016-01-04 01:54:29 +03:00
|
|
|
#elif defined(FL_PORTING)
|
|
|
|
# pragma message "FL_PORTING: define variables to hold a native offscreen bitmap in Fl_Copy_Surface"
|
|
|
|
// no default implementation
|
2014-05-23 20:47:21 +04:00
|
|
|
#else // Xlib
|
|
|
|
Fl_Offscreen xid;
|
|
|
|
Window oldwindow;
|
|
|
|
Fl_Surface_Device *_ss;
|
|
|
|
#endif
|
|
|
|
public:
|
|
|
|
static const char *class_id;
|
|
|
|
const char *class_name() {return class_id;};
|
|
|
|
Fl_Copy_Surface(int w, int h);
|
|
|
|
~Fl_Copy_Surface();
|
|
|
|
void set_current();
|
|
|
|
void draw(Fl_Widget* widget, int delta_x = 0, int delta_y = 0);
|
2015-11-24 17:26:52 +03:00
|
|
|
void draw_decorated_window(Fl_Window* win, int delta_x = 0, int delta_y = 0);
|
2014-11-08 21:10:35 +03:00
|
|
|
/** Returns the pixel width of the copy surface */
|
|
|
|
int w() { return width; }
|
|
|
|
/** Returns the pixel height of the copy surface */
|
|
|
|
int h() { return height; }
|
2014-05-23 20:47:21 +04:00
|
|
|
};
|
|
|
|
|
2016-02-11 15:02:36 +03:00
|
|
|
#if defined(__APPLE__) // PORTME: platform surface driver
|
2014-05-23 20:47:21 +04:00
|
|
|
|
|
|
|
/* Mac class to reimplement Fl_Paged_Device::printable_rect() */
|
2014-10-29 22:57:42 +03:00
|
|
|
class FL_EXPORT Fl_Quartz_Surface_ : public Fl_System_Printer {
|
2014-05-23 20:47:21 +04:00
|
|
|
protected:
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
public:
|
|
|
|
static const char *class_id;
|
|
|
|
const char *class_name() {return class_id;};
|
|
|
|
Fl_Quartz_Surface_(int w, int h);
|
|
|
|
virtual int printable_rect(int *w, int *h);
|
|
|
|
virtual ~Fl_Quartz_Surface_() {};
|
|
|
|
};
|
|
|
|
|
|
|
|
#elif defined(WIN32)
|
|
|
|
|
|
|
|
/* Win class to implement translate()/untranslate() */
|
2014-10-29 22:57:42 +03:00
|
|
|
class FL_EXPORT Fl_GDI_Surface_ : public Fl_Paged_Device {
|
2014-05-23 20:47:21 +04:00
|
|
|
int width;
|
|
|
|
int height;
|
2014-05-23 21:03:08 +04:00
|
|
|
unsigned depth;
|
2014-05-23 20:47:21 +04:00
|
|
|
POINT origins[10];
|
|
|
|
public:
|
|
|
|
static const char *class_id;
|
|
|
|
const char *class_name() {return class_id;};
|
|
|
|
Fl_GDI_Surface_();
|
|
|
|
virtual void translate(int x, int y);
|
|
|
|
virtual void untranslate();
|
|
|
|
virtual ~Fl_GDI_Surface_();
|
|
|
|
};
|
|
|
|
|
2016-01-04 01:54:29 +03:00
|
|
|
#elif defined(FL_PORTING)
|
|
|
|
|
|
|
|
# pragma message "FL_PORTING: define a drawing surface for your platform"
|
|
|
|
|
2014-05-23 20:47:21 +04:00
|
|
|
#elif !defined(FL_DOXYGEN)
|
|
|
|
|
|
|
|
/* Xlib class to implement translate()/untranslate() */
|
2014-10-29 22:57:42 +03:00
|
|
|
class FL_EXPORT Fl_Xlib_Surface_ : public Fl_Paged_Device {
|
2014-05-23 20:47:21 +04:00
|
|
|
public:
|
|
|
|
static const char *class_id;
|
|
|
|
const char *class_name() {return class_id;};
|
|
|
|
Fl_Xlib_Surface_();
|
|
|
|
virtual void translate(int x, int y);
|
|
|
|
virtual void untranslate();
|
|
|
|
virtual ~Fl_Xlib_Surface_();
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // Fl_Copy_Surface_H
|
|
|
|
|
|
|
|
//
|
2014-05-24 20:21:46 +04:00
|
|
|
// End of "$Id$".
|
2014-05-23 20:47:21 +04:00
|
|
|
//
|