From fa9a33eaeeddb85a6afedc2d02d0d67f290b0822 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Fri, 18 Mar 2016 18:20:11 +0000 Subject: Beginning of Albrecht's plan for Fl_Window and Fl_Window_Driver classes. Still unclear whether the implementation of the flush() functions follows the plan. The Fl_Printer class is fully rewritten under the driver model. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11364 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H | 1 - src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 52 ++++---------------------- src/drivers/PostScript/Fl_PostScript.cxx | 22 +++++++---- src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H | 1 - src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 9 +---- src/drivers/X11/Fl_X11_Window_Driver.H | 2 - src/drivers/X11/Fl_X11_Window_Driver.cxx | 15 -------- src/drivers/Xlib/Fl_Xlib_Image_Surface.cxx | 1 + 8 files changed, 25 insertions(+), 78 deletions(-) (limited to 'src/drivers') 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 -#include +#include #include #include #include @@ -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()); } -- cgit v1.2.3