summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/Fl_GDI_Printer.cxx63
-rw-r--r--src/Fl_Printer.cxx13
-rw-r--r--src/Fl_Quartz_Printer.mm159
-rw-r--r--src/Fl_Window.cxx3
-rw-r--r--src/Fl_Window_Driver.cxx31
-rw-r--r--src/Fl_cocoa.mm93
-rw-r--r--src/Fl_win32.cxx2
-rw-r--r--src/Makefile3
-rw-r--r--src/config_lib.h4
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H1
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx52
-rw-r--r--src/drivers/PostScript/Fl_PostScript.cxx22
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H1
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx9
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.H2
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx15
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx1
18 files changed, 237 insertions, 238 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8b568a7ff..2ed442236 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -281,6 +281,7 @@ else ()
drivers/GDI/Fl_GDI_Graphics_Driver_vertex.cxx
drivers/GDI/Fl_GDI_Copy_Surface.cxx
drivers/GDI/Fl_GDI_Image_Surface.cxx
+ Fl_GDI_Printer.cxx
)
set(DRIVER_HEADER_FILES
drivers/WinAPI/Fl_WinAPI_System_Driver.H
diff --git a/src/Fl_GDI_Printer.cxx b/src/Fl_GDI_Printer.cxx
index c0bad87a0..d9bbf3b11 100644
--- a/src/Fl_GDI_Printer.cxx
+++ b/src/Fl_GDI_Printer.cxx
@@ -28,12 +28,45 @@
extern HWND fl_window;
-Fl_Printer::Helper::Helper(void) : Fl_Paged_Device() {
+/** Support for printing on the MSWindows platform */
+class Fl_WinAPI_Printer_Driver : public Fl_Paged_Device {
+ friend class Fl_Paged_Device;
+private:
+ int abortPrint;
+ PRINTDLG pd;
+ HDC hPr;
+ int prerr;
+ int left_margin;
+ int top_margin;
+ void absolute_printable_rect(int *x, int *y, int *w, int *h);
+ Fl_WinAPI_Printer_Driver(void);
+ int start_job(int pagecount, int *frompage = NULL, int *topage = NULL);
+ int start_page (void);
+ int printable_rect(int *w, int *h);
+ void margins(int *left, int *top, int *right, int *bottom);
+ void origin(int *x, int *y);
+ void origin(int x, int y);
+ void scale (float scale_x, float scale_y = 0.);
+ void rotate(float angle);
+ void translate(int x, int y);
+ void untranslate(void);
+ int end_page (void);
+ void end_job (void);
+ ~Fl_WinAPI_Printer_Driver(void);
+};
+
+Fl_WinAPI_Printer_Driver::Fl_WinAPI_Printer_Driver(void) : Fl_Paged_Device() {
hPr = NULL;
driver(new Fl_GDI_Printer_Graphics_Driver);
}
-Fl_Printer::Helper::~Helper(void) {
+Fl_Paged_Device* Fl_Paged_Device::newPrinterDriver(void)
+{
+ return new Fl_WinAPI_Printer_Driver();
+}
+
+
+Fl_WinAPI_Printer_Driver::~Fl_WinAPI_Printer_Driver(void) {
if (hPr) end_job();
delete driver();
}
@@ -54,7 +87,7 @@ static void WIN_SetupPrinterDeviceContext(HDC prHDC)
}
-int Fl_Printer::Helper::start_job (int pagecount, int *frompage, int *topage)
+int Fl_WinAPI_Printer_Driver::start_job (int pagecount, int *frompage, int *topage)
// returns 0 iff OK
{
if (pagecount == 0) pagecount = 10000;
@@ -115,7 +148,7 @@ int Fl_Printer::Helper::start_job (int pagecount, int *frompage, int *topage)
return err;
}
-void Fl_Printer::Helper::end_job (void)
+void Fl_WinAPI_Printer_Driver::end_job (void)
{
Fl_Display_Device::display_device()->set_current();
if (hPr != NULL) {
@@ -136,7 +169,7 @@ void Fl_Printer::Helper::end_job (void)
hPr = NULL;
}
-void Fl_Printer::Helper::absolute_printable_rect(int *x, int *y, int *w, int *h)
+void Fl_WinAPI_Printer_Driver::absolute_printable_rect(int *x, int *y, int *w, int *h)
{
POINT physPageSize;
POINT pixelsPerInch;
@@ -167,7 +200,7 @@ void Fl_Printer::Helper::absolute_printable_rect(int *x, int *y, int *w, int *h)
SetWorldTransform(gc, &transform);
}
-void Fl_Printer::Helper::margins(int *left, int *top, int *right, int *bottom)
+void Fl_WinAPI_Printer_Driver::margins(int *left, int *top, int *right, int *bottom)
{
int x = 0, y = 0, w = 0, h = 0;
absolute_printable_rect(&x, &y, &w, &h);
@@ -177,14 +210,14 @@ void Fl_Printer::Helper::margins(int *left, int *top, int *right, int *bottom)
if (bottom) *bottom = y;
}
-int Fl_Printer::Helper::printable_rect(int *w, int *h)
+int Fl_WinAPI_Printer_Driver::printable_rect(int *w, int *h)
{
int x, y;
absolute_printable_rect(&x, &y, w, h);
return 0;
}
-int Fl_Printer::Helper::start_page (void)
+int Fl_WinAPI_Printer_Driver::start_page (void)
{
int rsult, w, h;
@@ -203,14 +236,14 @@ int Fl_Printer::Helper::start_page (void)
return rsult;
}
-void Fl_Printer::Helper::origin (int deltax, int deltay)
+void Fl_WinAPI_Printer_Driver::origin (int deltax, int deltay)
{
SetWindowOrgEx( (HDC)driver()->gc(), - left_margin - deltax, - top_margin - deltay, NULL);
x_offset = deltax;
y_offset = deltay;
}
-void Fl_Printer::Helper::scale (float scalex, float scaley)
+void Fl_WinAPI_Printer_Driver::scale (float scalex, float scaley)
{
if (scaley == 0.) scaley = scalex;
int w, h;
@@ -219,7 +252,7 @@ void Fl_Printer::Helper::scale (float scalex, float scaley)
origin(0, 0);
}
-void Fl_Printer::Helper::rotate (float rot_angle)
+void Fl_WinAPI_Printer_Driver::rotate (float rot_angle)
{
XFORM mat;
float angle;
@@ -232,7 +265,7 @@ void Fl_Printer::Helper::rotate (float rot_angle)
SetWorldTransform((HDC)driver()->gc(), &mat);
}
-int Fl_Printer::Helper::end_page (void)
+int Fl_WinAPI_Printer_Driver::end_page (void)
{
int rsult;
@@ -263,7 +296,7 @@ static void do_translate(int x, int y, HDC gc)
ModifyWorldTransform(gc, &tr, MWT_LEFTMULTIPLY);
}
-void Fl_Printer::Helper::translate (int x, int y)
+void Fl_WinAPI_Printer_Driver::translate (int x, int y)
{
do_translate(x, y, (HDC)driver()->gc());
if (translate_stack_depth < translate_stack_max) {
@@ -273,7 +306,7 @@ void Fl_Printer::Helper::translate (int x, int y)
}
}
-void Fl_Printer::Helper::untranslate (void)
+void Fl_WinAPI_Printer_Driver::untranslate (void)
{
if (translate_stack_depth > 0) {
translate_stack_depth--;
@@ -281,7 +314,7 @@ void Fl_Printer::Helper::untranslate (void)
}
}
-void Fl_Printer::Helper::origin(int *x, int *y)
+void Fl_WinAPI_Printer_Driver::origin(int *x, int *y)
{
Fl_Paged_Device::origin(x, y);
}
diff --git a/src/Fl_Printer.cxx b/src/Fl_Printer.cxx
index 47ae9748d..e5a9e3abe 100644
--- a/src/Fl_Printer.cxx
+++ b/src/Fl_Printer.cxx
@@ -18,8 +18,13 @@
//
#include <FL/Fl_Printer.H>
+#include "config.h"
-#ifdef NO_PRINT_SUPPORT
+#ifdef FL_PORTING
+# pragma message "FL_PORTING: implement print support for your platform, or define NO_PRINT_SUPPORT"
+#endif
+
+#if defined(NO_PRINT_SUPPORT)
Fl_Printer::Fl_Printer(void) {
printer = NULL;
@@ -107,8 +112,8 @@ const char *Fl_Printer::property_cancel = "Cancel";
Fl_Printer::Fl_Printer(void) {
- printer = new Helper();
- Fl_Surface_Device::driver(printer->driver());
+ printer = Fl_Paged_Device::newPrinterDriver();
+ driver(printer->driver());
}
/**
@@ -209,7 +214,7 @@ Fl_Printer::~Fl_Printer(void)
delete printer;
}
-#endif // NO_PRINT_SUPPORT
+#endif // defined(NO_PRINT_SUPPORT)
//
// End of "$Id$".
diff --git a/src/Fl_Quartz_Printer.mm b/src/Fl_Quartz_Printer.mm
index 350ab53b7..68e7f44d0 100644
--- a/src/Fl_Quartz_Printer.mm
+++ b/src/Fl_Quartz_Printer.mm
@@ -16,8 +16,9 @@
// http://www.fltk.org/str.php
//
-#ifdef __APPLE__
#include <FL/Fl_Printer.H>
+#include <FL/Fl_Shared_Image.H>
+#include <FL/Fl_Window_Driver.H>
#include "drivers/Quartz/Fl_Quartz_Printer_Graphics_Driver.H"
#include <FL/Fl.H>
@@ -42,7 +43,37 @@ typedef OSStatus
extern void fl_quartz_restore_line_style_(CGContextRef gc);
-Fl_Printer::Helper::Helper(void)
+
+/** Support for printing on the Apple OS X platform */
+class Fl_Cocoa_Printer_Driver : public Fl_Paged_Device {
+ friend class Fl_Paged_Device;
+private:
+ float scale_x;
+ float scale_y;
+ float angle; // rotation angle in radians
+ PMPrintSession printSession;
+ PMPageFormat pageFormat;
+ PMPrintSettings printSettings;
+ Fl_Cocoa_Printer_Driver(void);
+ int start_job(int pagecount, int *frompage = NULL, int *topage = NULL);
+ int start_page (void);
+ int printable_rect(int *w, int *h);
+ void margins(int *left, int *top, int *right, int *bottom);
+ void origin(int *x, int *y);
+ void origin(int x, int y);
+ void scale (float scale_x, float scale_y = 0.);
+ void rotate(float angle);
+ void translate(int x, int y);
+ void untranslate(void);
+ int end_page (void);
+ void end_job (void);
+ void draw_decorated_window(Fl_Window *win, int x_offset, int y_offset);
+ void print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y);
+ ~Fl_Cocoa_Printer_Driver(void);
+};
+
+
+Fl_Cocoa_Printer_Driver::Fl_Cocoa_Printer_Driver(void)
{
x_offset = 0;
y_offset = 0;
@@ -50,11 +81,17 @@ Fl_Printer::Helper::Helper(void)
driver(new Fl_Quartz_Printer_Graphics_Driver);
}
-Fl_Printer::Helper::~Helper(void) {
+Fl_Paged_Device* Fl_Paged_Device::newPrinterDriver(void)
+{
+ return new Fl_Cocoa_Printer_Driver();
+}
+
+Fl_Cocoa_Printer_Driver::~Fl_Cocoa_Printer_Driver(void) {
delete driver();
}
-int Fl_Printer::Helper::start_job (int pagecount, int *frompage, int *topage)
+
+int Fl_Cocoa_Printer_Driver::start_job (int pagecount, int *frompage, int *topage)
//printing using a Quartz graphics context
//returns 0 iff OK
{
@@ -145,7 +182,7 @@ int Fl_Printer::Helper::start_job (int pagecount, int *frompage, int *topage)
return 0;
}
-void Fl_Printer::Helper::margins(int *left, int *top, int *right, int *bottom)
+void Fl_Cocoa_Printer_Driver::margins(int *left, int *top, int *right, int *bottom)
{
PMPaper paper;
PMGetPageFormatPaper(pageFormat, &paper);
@@ -167,7 +204,7 @@ void Fl_Printer::Helper::margins(int *left, int *top, int *right, int *bottom)
}
}
-int Fl_Printer::Helper::printable_rect(int *w, int *h)
+int Fl_Cocoa_Printer_Driver::printable_rect(int *w, int *h)
//returns 0 iff OK
{
OSStatus status;
@@ -184,7 +221,7 @@ int Fl_Printer::Helper::printable_rect(int *w, int *h)
return 0;
}
-void Fl_Printer::Helper::origin(int x, int y)
+void Fl_Cocoa_Printer_Driver::origin(int x, int y)
{
x_offset = x;
y_offset = y;
@@ -198,7 +235,7 @@ void Fl_Printer::Helper::origin(int x, int y)
CGContextSaveGState(gc);
}
-void Fl_Printer::Helper::scale (float s_x, float s_y)
+void Fl_Cocoa_Printer_Driver::scale (float s_x, float s_y)
{
if (s_y == 0.) s_y = s_x;
scale_x = s_x;
@@ -213,7 +250,7 @@ void Fl_Printer::Helper::scale (float s_x, float s_y)
CGContextSaveGState(gc);
}
-void Fl_Printer::Helper::rotate (float rot_angle)
+void Fl_Cocoa_Printer_Driver::rotate (float rot_angle)
{
angle = - rot_angle * M_PI / 180.;
CGContextRef gc = (CGContextRef)driver()->gc();
@@ -226,7 +263,7 @@ void Fl_Printer::Helper::rotate (float rot_angle)
CGContextSaveGState(gc);
}
-void Fl_Printer::Helper::translate(int x, int y)
+void Fl_Cocoa_Printer_Driver::translate(int x, int y)
{
CGContextRef gc = (CGContextRef)driver()->gc();
CGContextSaveGState(gc);
@@ -234,14 +271,14 @@ void Fl_Printer::Helper::translate(int x, int y)
CGContextSaveGState(gc);
}
-void Fl_Printer::Helper::untranslate(void)
+void Fl_Cocoa_Printer_Driver::untranslate(void)
{
CGContextRef gc = (CGContextRef)driver()->gc();
CGContextRestoreGState(gc);
CGContextRestoreGState(gc);
}
-int Fl_Printer::Helper::start_page (void)
+int Fl_Cocoa_Printer_Driver::start_page (void)
{
OSStatus status = PMSessionBeginPageNoDialog(printSession, pageFormat, NULL);
CGContextRef gc;
@@ -259,6 +296,7 @@ int Fl_Printer::Helper::start_page (void)
#endif
}
driver()->gc(gc);
+ set_current();
PMRect pmRect;
float win_scale_x, win_scale_y;
@@ -291,7 +329,7 @@ int Fl_Printer::Helper::start_page (void)
return status != noErr;
}
-int Fl_Printer::Helper::end_page (void)
+int Fl_Cocoa_Printer_Driver::end_page (void)
{
CGContextRef gc = (CGContextRef)driver()->gc();
CGContextFlush(gc);
@@ -302,7 +340,7 @@ int Fl_Printer::Helper::end_page (void)
return status != noErr;
}
-void Fl_Printer::Helper::end_job (void)
+void Fl_Cocoa_Printer_Driver::end_job (void)
{
OSStatus status;
@@ -325,7 +363,7 @@ void Fl_Printer::Helper::end_job (void)
}
// version that prints at high res if using a retina display
-void Fl_Printer::Helper::print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y)
+void Fl_Cocoa_Printer_Driver::print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y)
{
Fl_Surface_Device *current = Fl_Surface_Device::surface();
Fl_Display_Device::display_device()->set_current();
@@ -339,12 +377,99 @@ void Fl_Printer::Helper::print_window_part(Fl_Window *win, int x, int y, int w,
CFRelease(img);
}
-void Fl_Printer::Helper::origin(int *x, int *y)
+void Fl_Cocoa_Printer_Driver::origin(int *x, int *y)
{
Fl_Paged_Device::origin(x, y);
}
-#endif // __APPLE__
+void Fl_Cocoa_Printer_Driver::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset)
+{
+ if (!win->shown() || win->parent() || !win->border() || !win->visible()) {
+ this->print_widget(win, x_offset, y_offset);
+ return;
+ }
+ int bt = win->decorated_h() - win->h();
+ BOOL to_quartz = (this->driver()->has_feature(Fl_Graphics_Driver::NATIVE));
+ CALayer *layer = nil;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ if (fl_mac_os_version >= 101000) layer = [[[fl_xid(win) standardWindowButton:NSWindowCloseButton] superview] layer];
+#endif
+
+ if (layer) { // if title bar uses a layer
+ if (to_quartz) { // to Quartz printer
+ CGContextRef gc = (CGContextRef)driver()->gc();
+ CGContextSaveGState(gc);
+ CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5);
+ CGContextScaleCTM(gc, 1, -1);
+ Fl_X::draw_layer_to_context(layer, gc, win->w(), bt);
+ CGContextRestoreGState(gc);
+ }
+ else {
+ CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB ();
+ CGContextRef gc = CGBitmapContextCreate(NULL, 2*win->w(), 2*bt, 8, 0, cspace, kCGImageAlphaPremultipliedLast);
+ CGColorSpaceRelease(cspace);
+ CGContextScaleCTM(gc, 2, 2);
+ Fl_X::draw_layer_to_context(layer, gc, win->w(), bt);
+ Fl_RGB_Image *image = new Fl_RGB_Image((const uchar*)CGBitmapContextGetData(gc), 2*win->w(), 2*bt, 4,
+ CGBitmapContextGetBytesPerRow(gc)); // 10.2
+ int ori_x, ori_y;
+ origin(&ori_x, &ori_y);
+ scale(0.5);
+ origin(2*ori_x, 2*ori_y);
+ image->draw(2*x_offset, 2*y_offset); // draw title bar as double resolution image
+ scale(1);
+ origin(ori_x, ori_y);
+ delete image;
+ CGContextRelease(gc);
+ }
+ this->print_widget(win, x_offset, y_offset + bt);
+ return;
+ }
+ Fl_Display_Device::display_device()->set_current(); // send win to front and make it current
+ const char *title = win->label();
+ win->label(""); // temporarily set a void window title
+ win->show();
+ Fl::check();
+ // capture the window title bar with no title
+ Fl_Shared_Image *top, *left, *bottom, *right;
+ win->driver()->capture_titlebar_and_borders(top, left, bottom, right);
+ win->label(title); // put back the window title
+ this->set_current(); // back to the Fl_Paged_Device
+ top->draw(x_offset, y_offset); // print the title bar
+ top->release();
+ if (title) { // print the window title
+ const int skip = 65; // approx width of the zone of the 3 window control buttons
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 100400 && to_quartz) { // use Cocoa string drawing with exact title bar font
+ // the exact font is LucidaGrande 13 pts (and HelveticaNeueDeskInterface-Regular with 10.10)
+ NSGraphicsContext *current = [NSGraphicsContext currentContext];
+ [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:driver()->gc() flipped:YES]];//10.4
+ NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:0]
+ forKey:NSFontAttributeName];
+ NSString *title_s = [fl_xid(win) title];
+ NSSize size = [title_s sizeWithAttributes:attr];
+ int x = x_offset + win->w()/2 - size.width/2;
+ if (x < x_offset+skip) x = x_offset+skip;
+ NSRect r = NSMakeRect(x, y_offset+bt/2+4, win->w() - skip, bt);
+ [[NSGraphicsContext currentContext] setShouldAntialias:YES];
+ [title_s drawWithRect:r options:(NSStringDrawingOptions)0 attributes:attr]; // 10.4
+ [[NSGraphicsContext currentContext] setShouldAntialias:NO];
+ [NSGraphicsContext setCurrentContext:current];
+ }
+ else
+#endif
+ {
+ fl_font(FL_HELVETICA, 14);
+ fl_color(FL_BLACK);
+ int x = x_offset + win->w()/2 - fl_width(title)/2;
+ if (x < x_offset+skip) x = x_offset+skip;
+ fl_push_clip(x_offset, y_offset, win->w(), bt);
+ fl_draw(title, x, y_offset+bt/2+4);
+ fl_pop_clip();
+ }
+ }
+ this->print_widget(win, x_offset, y_offset + bt); // print the window inner part
+}
//
// End of "$Id$".
diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx
index 98882591e..483eea714 100644
--- a/src/Fl_Window.cxx
+++ b/src/Fl_Window.cxx
@@ -471,6 +471,9 @@ void Fl_Window::draw()
draw_children();
pWindowDriver->draw_end();
+# if defined(FLTK_USE_CAIRO)
+ Fl::cairo_make_current(this); // checkout if an update is necessary
+# endif
}
diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx
index eda8c2901..484a2fbdf 100644
--- a/src/Fl_Window_Driver.cxx
+++ b/src/Fl_Window_Driver.cxx
@@ -89,37 +89,6 @@ void Fl_Window_Driver::destroy_double_buffer() {
i->other_xid = 0;
}
-void Fl_Window_Driver::draw() {
- // The following is similar to Fl_Group::draw(), but ...
- //
- // - draws the box at (0,0), i.e. with x=0 and y=0 instead of x() and y()
- // - does NOT draw the label (text)
- // - draws the image only if FL_ALIGN_INSIDE is set
- //
- // Note: The label (text) of top level windows is drawn in the title bar.
- // Other windows do not draw their labels at all, unless drawn by their
- // parent widgets or by special draw() methods (derived classes).
-
- if (pWindow->damage() & ~FL_DAMAGE_CHILD) { // draw the entire thing
- pWindow->draw_box(pWindow->box(),0,0,pWindow->w(),pWindow->h(),pWindow->color()); // draw box with x/y = 0
-
- if (pWindow->image() && (pWindow->align() & FL_ALIGN_INSIDE)) { // draw the image only
- Fl_Label l1;
- memset(&l1,0,sizeof(l1));
- l1.align_ = pWindow->align();
- l1.image = pWindow->image();
- if (!pWindow->active_r() && l1.image && l1.deimage) l1.image = l1.deimage;
- l1.type = pWindow->labeltype();
- l1.draw(0,0,pWindow->w(),pWindow->h(),pWindow->align());
- }
- }
- pWindow->draw_children();
-
-# if defined(FLTK_USE_CAIRO)
- Fl::cairo_make_current(this); // checkout if an update is necessary
-# endif
-}
-
/** Assigns a non-rectangular shape to the window.
This function gives an arbitrary shape (not just a rectangular region) to an Fl_Window.
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index 821ef57bf..40d984f0a 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -41,6 +41,7 @@ extern "C" {
#include <FL/Fl_Tooltip.H>
#include <FL/Fl_Printer.H>
#include <FL/Fl_Shared_Image.H>
+#include <FL/fl_draw.H>
#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.H"
#include "drivers/Cocoa/Fl_Cocoa_Screen_Driver.H"
#include "drivers/Cocoa/Fl_Cocoa_Window_Driver.H"
@@ -84,7 +85,7 @@ static unsigned make_current_counts = 0; // if > 0, then Fl_Window::make_current
static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h);
// make this available on all platforms to make code maintainability easier
-extern class Fl_Widget *fl_selection_requestor;
+/*extern*/ class Fl_Widget *fl_selection_requestor;
int fl_mac_os_version = Fl_X::calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4)
@@ -4330,7 +4331,7 @@ static CALayer *get_titlebar_layer(Fl_Window *win)
}
-static void draw_layer_to_context(CALayer *layer, CGContextRef gc, int w, int h)
+void Fl_X::draw_layer_to_context(CALayer *layer, CGContextRef gc, int w, int h)
{
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
CGContextSaveGState(gc);
@@ -4358,7 +4359,7 @@ void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_Shared_Image*& top,
CGColorSpaceRelease(cspace);
CGContextScaleCTM(auxgc, 2, 2);
if (layer) {
- draw_layer_to_context(layer, auxgc, pWindow->w(), htop);
+ Fl_X::draw_layer_to_context(layer, auxgc, pWindow->w(), htop);
} else {
CGImageRef img = Fl_X::CGImage_from_window_rect(pWindow, 0, -htop, pWindow->w(), htop);
CGContextSaveGState(auxgc);
@@ -4375,92 +4376,6 @@ void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_Shared_Image*& top,
}
-void Fl_Printer::Helper::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset)
-{
- if (!win->shown() || win->parent() || !win->border() || !win->visible()) {
- this->print_widget(win, x_offset, y_offset);
- return;
- }
- int bx, by, bt;
- get_window_frame_sizes(bx, by, bt);
- BOOL to_quartz = (this->driver()->has_feature(Fl_Graphics_Driver::NATIVE));
- CALayer *layer = get_titlebar_layer(win);
- if (layer) { // if title bar uses a layer
- if (to_quartz) { // to Quartz printer
- CGContextRef gc = (CGContextRef)driver()->gc();
- CGContextSaveGState(gc);
- CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5);
- CGContextScaleCTM(gc, 1, -1);
- draw_layer_to_context(layer, gc, win->w(), bt);
- CGContextRestoreGState(gc);
- }
- else {
- CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB ();
- CGContextRef gc = CGBitmapContextCreate(NULL, 2*win->w(), 2*bt, 8, 0, cspace, kCGImageAlphaPremultipliedLast);
- CGColorSpaceRelease(cspace);
- CGContextScaleCTM(gc, 2, 2);
- draw_layer_to_context(layer, gc, win->w(), bt);
- Fl_RGB_Image *image = new Fl_RGB_Image((const uchar*)CGBitmapContextGetData(gc), 2*win->w(), 2*bt, 4,
- CGBitmapContextGetBytesPerRow(gc)); // 10.2
- int ori_x, ori_y;
- origin(&ori_x, &ori_y);
- scale(0.5);
- origin(2*ori_x, 2*ori_y);
- image->draw(2*x_offset, 2*y_offset); // draw title bar as double resolution image
- scale(1);
- origin(ori_x, ori_y);
- delete image;
- CGContextRelease(gc);
- }
- this->print_widget(win, x_offset, y_offset + bt);
- return;
- }
- Fl_Display_Device::display_device()->set_current(); // send win to front and make it current
- const char *title = win->label();
- win->label(""); // temporarily set a void window title
- win->show();
- Fl::check();
- // capture the window title bar with no title
- Fl_Shared_Image *top, *left, *bottom, *right;
- win->driver()->capture_titlebar_and_borders(top, left, bottom, right);
- win->label(title); // put back the window title
- this->set_current(); // back to the Fl_Paged_Device
- top->draw(x_offset, y_offset); // print the title bar
- top->release();
- if (title) { // print the window title
- const int skip = 65; // approx width of the zone of the 3 window control buttons
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if (fl_mac_os_version >= 100400 && to_quartz) { // use Cocoa string drawing with exact title bar font
- // the exact font is LucidaGrande 13 pts (and HelveticaNeueDeskInterface-Regular with 10.10)
- NSGraphicsContext *current = [NSGraphicsContext currentContext];
- [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:driver()->gc() flipped:YES]];//10.4
- NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:0]
- forKey:NSFontAttributeName];
- NSString *title_s = [fl_xid(win) title];
- NSSize size = [title_s sizeWithAttributes:attr];
- int x = x_offset + win->w()/2 - size.width/2;
- if (x < x_offset+skip) x = x_offset+skip;
- NSRect r = NSMakeRect(x, y_offset+bt/2+4, win->w() - skip, bt);
- [[NSGraphicsContext currentContext] setShouldAntialias:YES];
- [title_s drawWithRect:r options:(NSStringDrawingOptions)0 attributes:attr]; // 10.4
- [[NSGraphicsContext currentContext] setShouldAntialias:NO];
- [NSGraphicsContext setCurrentContext:current];
- }
- else
-#endif
- {
- fl_font(FL_HELVETICA, 14);
- fl_color(FL_BLACK);
- int x = x_offset + win->w()/2 - fl_width(title)/2;
- if (x < x_offset+skip) x = x_offset+skip;
- fl_push_clip(x_offset, y_offset, win->w(), bt);
- fl_draw(title, x, y_offset+bt/2+4);
- fl_pop_clip();
- }
- }
- this->print_widget(win, x_offset, y_offset + bt); // print the window inner part
-}
-
/* Returns the address of a Carbon function after dynamically loading the Carbon library if needed.
Supports old Mac OS X versions that may use a couple of Carbon calls:
GetKeys used by OS X 10.3 or before (in Fl::get_key())
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index b1715edb2..0caf501f1 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -86,7 +86,7 @@
*/
// make this available on all platforms to make code maintainability easier
-extern class Fl_Widget *fl_selection_requestor;
+class Fl_Widget *fl_selection_requestor;
// Internal functions
static void fl_clipboard_notify_target(HWND wnd);
diff --git a/src/Makefile b/src/Makefile
index 00711c077..9035b46a9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -272,7 +272,8 @@ GDICPPFILES = \
drivers/GDI/Fl_GDI_Image_Surface.cxx \
drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx \
drivers/WinAPI/Fl_WinAPI_Screen_Driver.cxx \
- drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
+ drivers/WinAPI/Fl_WinAPI_System_Driver.cxx \
+ Fl_GDI_Printer.cxx
PSCPPFILES = \
drivers/PostScript/Fl_PostScript.cxx \
diff --git a/src/config_lib.h b/src/config_lib.h
index d4cc9af7a..5ae8a3ff7 100644
--- a/src/config_lib.h
+++ b/src/config_lib.h
@@ -45,9 +45,9 @@
#elif defined(WIN32)
# define FL_CFG_WIN_WIN32
#elif defined(FL_PORTING)
-# pragma message "FL_PORTING: please choose a graphics driver library"
+# pragma message "FL_PORTING: please choose a printer driver"
#else // X11
-# define FL_CFG_GFX_PS
+# define FL_CFG_PRN_PS
#endif
#endif
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
index 8a5c8d42e..cad0f8c71 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
@@ -76,7 +76,6 @@ public:
virtual void draw_end();
virtual void shape(const Fl_Image* img);
- virtual void draw();
// that one is implemented in Fl_Cocoa.mm because it uses Objective-c
virtual void capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Image*& left, Fl_Shared_Image*& bottom, Fl_Shared_Image*& right);
//this one is in Fl_cocoa.mm because it uses Objective-c
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
index 0285af9df..e6c066680 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
@@ -99,10 +99,10 @@ void Fl_Cocoa_Window_Driver::flush_overlay()
if ( i->other_xid ) {
fl_begin_offscreen( i->other_xid );
fl_clip_region( 0 );
- draw();
+ pWindow->draw();
fl_end_offscreen();
} else {
- draw();
+ pWindow->draw();
}
}
if (erase_overlay) fl_clip_region(0);
@@ -116,12 +116,13 @@ void Fl_Cocoa_Window_Driver::flush_overlay()
void Fl_Cocoa_Window_Driver::draw_begin()
{
+ CGContextRef gc = (CGContextRef)Fl_Surface_Device::surface()->driver()->gc();
if (shape_data_) {
# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
if (shape_data_->mask && (&CGContextClipToMask != NULL)) {
- CGContextClipToMask(fl_gc, CGRectMake(0,0,pWindow->w(),pWindow->h()), shape_data_->mask); // requires Mac OS 10.4
+ CGContextClipToMask(gc, CGRectMake(0,0,pWindow->w(),pWindow->h()), shape_data_->mask); // requires Mac OS 10.4
}
- CGContextSaveGState(fl_gc);
+ CGContextSaveGState(gc);
# endif
}
}
@@ -131,7 +132,8 @@ void Fl_Cocoa_Window_Driver::draw_end()
{
// on OS X, windows have no frame. Before OS X 10.7, to resize a window, we drag the lower right
// corner. This code draws a little ribbed triangle for dragging.
- if (fl_mac_os_version < 100700 && fl_gc && !pWindow->parent() && pWindow->resizable() &&
+ CGContextRef gc = (CGContextRef)Fl_Surface_Device::surface()->driver()->gc();
+ if (fl_mac_os_version < 100700 && gc && !pWindow->parent() && pWindow->resizable() &&
(!pWindow->size_range_set || pWindow->minh!=pWindow->maxh || pWindow->minw!=pWindow->maxw)) {
int dx = Fl::box_dw(pWindow->box())-Fl::box_dx(pWindow->box());
int dy = Fl::box_dh(pWindow->box())-Fl::box_dy(pWindow->box());
@@ -151,7 +153,7 @@ void Fl_Cocoa_Window_Driver::draw_end()
}
}
# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if (shape_data_) CGContextRestoreGState(fl_gc);
+ if (shape_data_) CGContextRestoreGState(gc);
# endif
}
@@ -240,44 +242,6 @@ void Fl_Cocoa_Window_Driver::shape(const Fl_Image* img) {
#endif
}
-
-void Fl_Cocoa_Window_Driver::draw()
-{
- CGContextRef gc = (CGContextRef)Fl_Surface_Device::surface()->driver()->gc();
- if (shape_data_) {
-# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if (shape_data_->mask && (&CGContextClipToMask != NULL)) {
- CGContextClipToMask(gc, CGRectMake(0,0, pWindow->w(), pWindow->h()), shape_data_->mask); // requires Mac OS 10.4
- }
- CGContextSaveGState(gc);
-# endif
- }
- Fl_Window_Driver::draw();
- // on OS X, windows have no frame. Before OS X 10.7, to resize a window, we drag the lower right
- // corner. This code draws a little ribbed triangle for dragging.
- if (fl_mac_os_version < 100700 && gc && !pWindow->parent() && pWindow->resizable() ) {
- int dx = Fl::box_dw(pWindow->box())-Fl::box_dx(pWindow->box());
- int dy = Fl::box_dh(pWindow->box())-Fl::box_dy(pWindow->box());
- if (dx<=0) dx = 1;
- if (dy<=0) dy = 1;
- int x1 = pWindow->w()-dx-1, x2 = x1, y1 = pWindow->h()-dx-1, y2 = y1;
- Fl_Color c[4] = {
- pWindow->color(),
- fl_color_average(pWindow->color(), FL_WHITE, 0.7f),
- fl_color_average(pWindow->color(), FL_BLACK, 0.6f),
- fl_color_average(pWindow->color(), FL_BLACK, 0.8f),
- };
- int i;
- for (i=dx; i<12; i++) {
- fl_color(c[i&3]);
- fl_line(x1--, y1, x2, y2--);
- }
- }
-# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if (shape_data_) CGContextRestoreGState(gc);
-# endif
-}
-
//
// End of "$Id$".
//
diff --git a/src/drivers/PostScript/Fl_PostScript.cxx b/src/drivers/PostScript/Fl_PostScript.cxx
index 9528c6023..b3e7d214d 100644
--- a/src/drivers/PostScript/Fl_PostScript.cxx
+++ b/src/drivers/PostScript/Fl_PostScript.cxx
@@ -17,7 +17,7 @@
//
#include <FL/Fl_Printer.H>
-#include <config.h>
+#include <src/config_lib.h>
#include <FL/Fl.H>
#include <FL/fl_ask.H>
#include <FL/fl_draw.H>
@@ -1557,15 +1557,21 @@ void Fl_PostScript_File_Device::end_job (void)
#endif // FL_DOXYGEN
-#if defined(__APPLE__) // PORTME: Fl_Surface_Driver ? - platform PostScript
-#elif defined(WIN32)
-#elif defined(FL_PORTING)
-# pragma message "FL_PORTING: implement postscript printing"
-#else // X11
+#if defined(FL_CFG_PRN_PS)
+
+/** Support for printing on the Unix/Linux platform */
+class Fl_Posix_Printer_Driver : public Fl_PostScript_File_Device {
+ virtual int start_job(int pagecount, int *frompage = NULL, int *topage = NULL);
+};
+
+Fl_Paged_Device* Fl_Paged_Device::newPrinterDriver(void)
+{
+ return new Fl_Posix_Printer_Driver();
+}
/** Starts a print job. */
-int Fl_Printer::Helper::start_job(int pages, int *firstpage, int *lastpage) {
+int Fl_Posix_Printer_Driver::start_job(int pages, int *firstpage, int *lastpage) {
enum Fl_Paged_Device::Page_Format format;
enum Fl_Paged_Device::Page_Layout layout;
@@ -1661,7 +1667,7 @@ int Fl_Printer::Helper::start_job(int pages, int *firstpage, int *lastpage) {
return ps->start_postscript(pages, format, layout); // start printing
}
-#endif // ! (defined(__APPLE__) || defined(WIN32) ) // PORTME: Fl_Surface_Driver - platform PostScript
+#endif // defined(FL_CFG_PRN_PS)
//
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
index ebcf72440..120bca748 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
@@ -77,7 +77,6 @@ public:
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();
- virtual void draw_end();
virtual void shape(const Fl_Image* img);
virtual void icons(const Fl_RGB_Image *icons[], int count);
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
index c1893b841..78110c7fb 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
@@ -255,11 +255,6 @@ void Fl_WinAPI_Window_Driver::draw_begin()
}
-void Fl_WinAPI_Window_Driver::draw_end()
-{
-}
-
-
void Fl_WinAPI_Window_Driver::flush_single()
{
if (!pWindow->shown()) return;
@@ -287,7 +282,7 @@ void Fl_WinAPI_Window_Driver::flush_double()
fl_clip_region(i->region); i->region = 0;
fl_begin_offscreen(i->other_xid);
fl_graphics_driver->clip_region( 0 );
- draw();
+ pWindow->draw();
fl_end_offscreen();
}
@@ -317,7 +312,7 @@ void Fl_WinAPI_Window_Driver::flush_overlay()
fl_clip_region(i->region); i->region = 0;
fl_begin_offscreen(i->other_xid);
fl_graphics_driver->clip_region(0);
- draw();
+ pWindow->draw();
fl_end_offscreen();
}
diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H
index 126f4b103..9b7e1954b 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.H
+++ b/src/drivers/X11/Fl_X11_Window_Driver.H
@@ -81,10 +81,8 @@ public:
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();
- virtual void draw_end();
virtual void shape(const Fl_Image* img);
- virtual void draw();
virtual void icons(const Fl_RGB_Image *icons[], int count);
virtual const void *icon() const;
virtual void icon(const void * ic);
diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx
index b8ca36480..fc278c553 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.cxx
+++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx
@@ -148,11 +148,6 @@ void Fl_X11_Window_Driver::draw_begin()
}
-void Fl_X11_Window_Driver::draw_end()
-{
-}
-
-
void Fl_X11_Window_Driver::flush_single()
{
if (!pWindow->shown()) return;
@@ -394,16 +389,6 @@ void Fl_X11_Window_Driver::combine_mask()
}
-void Fl_X11_Window_Driver::draw() {
- if (shape_data_) {
- if (( shape_data_->lw_ != pWindow->w() || shape_data_->lh_ != pWindow->h() ) && shape_data_->shape_) {
- // size of window has changed since last time
- combine_mask();
- }
- }
- Fl_Window_Driver::draw();
-}
-
void Fl_X11_Window_Driver::icons(const Fl_RGB_Image *icons[], int count) {
free_icons();
diff --git a/src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx b/src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx
index 326505174..2f04259b1 100644
--- a/src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx
+++ b/src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx
@@ -30,6 +30,7 @@ Fl_Image_Surface::Helper::Helper(int w, int h, int high_res) : Fl_Widget_Surface
width = w;
height = h;
previous = 0;
+ fl_open_display();
offscreen = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, fl_visual->depth);
driver(new Fl_Translated_Xlib_Graphics_Driver());
}