diff options
| author | Manolo Gouy <Manolo> | 2018-05-04 15:11:47 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2018-05-04 15:11:47 +0000 |
| commit | 20ccb6b7f2b0b2b742211c31a32c3ac612c43489 (patch) | |
| tree | bc432cbcba741ba6dab1ab27b0c5674160b67b12 | |
| parent | d4eeb75ac6829e663996e87c3584e247d10eead8 (diff) | |
Shorten the list of virtual member functions used to support Fl_Widget_Surface derived classes.
Change Fl_Cocoa_Screen_Driver::read_win_rectangle() so it captures only
from the current window and ignores its subwindows, as do other Fl_Screen_Driver derived classes.
Remove Fl_Cocoa_Printer_Driver::print_window_part() that is no longer necessary.
Remove Fl_Printer::print_widget() and Fl_Printer::print_window_part() that
are no longer necessary.
Stop Fl_Widget_Surface::print_window_part() from being virtual because its platform-independent
implementation should suffice.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12894 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | FL/Fl_Printer.H | 2 | ||||
| -rw-r--r-- | FL/Fl_Widget_Surface.H | 2 | ||||
| -rw-r--r-- | src/Fl_Printer.cxx | 18 | ||||
| -rw-r--r-- | src/Fl_Screen_Driver.cxx | 5 | ||||
| -rw-r--r-- | src/Fl_cocoa.mm | 12 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm | 15 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx | 2 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H | 2 |
8 files changed, 11 insertions, 47 deletions
diff --git a/FL/Fl_Printer.H b/FL/Fl_Printer.H index 148897f2e..97ff1d19f 100644 --- a/FL/Fl_Printer.H +++ b/FL/Fl_Printer.H @@ -102,8 +102,6 @@ public: void untranslate(void); int end_page (void); void end_job (void); - void print_widget(Fl_Widget* widget, int delta_x=0, int delta_y=0); - void print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x=0, int delta_y=0); void draw_decorated_window(Fl_Window *win, int x_offset, int y_offset); void set_current(void); diff --git a/FL/Fl_Widget_Surface.H b/FL/Fl_Widget_Surface.H index b8799dea2..17355e784 100644 --- a/FL/Fl_Widget_Surface.H +++ b/FL/Fl_Widget_Surface.H @@ -47,7 +47,7 @@ public: virtual void untranslate(void) {} void draw(Fl_Widget* widget, int delta_x = 0, int delta_y = 0); virtual void draw_decorated_window(Fl_Window *win, int x_offset = 0, int y_offset = 0); - virtual void print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x = 0, int delta_y = 0); + void print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x = 0, int delta_y = 0); virtual int printable_rect(int *w, int *h); virtual void origin(int x, int y); virtual void origin(int *x, int *y); diff --git a/src/Fl_Printer.cxx b/src/Fl_Printer.cxx index c0982687c..36000e8ef 100644 --- a/src/Fl_Printer.cxx +++ b/src/Fl_Printer.cxx @@ -43,8 +43,6 @@ void Fl_Printer::translate(int x, int y) {} void Fl_Printer::untranslate(void) {} int Fl_Printer::end_page (void) {return 1;} void Fl_Printer::end_job (void) {} -void Fl_Printer::print_widget(Fl_Widget* widget, int delta_x, int delta_y) {} -void Fl_Printer::print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y) {} void Fl_Printer::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y) {} void Fl_Printer::set_current(void) {} Fl_Printer::~Fl_Printer(void) {} @@ -208,27 +206,11 @@ void Fl_Printer::end_job (void) printer->end_job(); } -/** Prints the widget on the drawing surface. - \param[in] widget Any FLTK widget (e.g., standard, custom, window, GL window). - \param[in] delta_x,delta_y Optional offsets for positioning the widget's - top-left corner relatively to the current origin of graphics functions. - */ -void Fl_Printer::print_widget(Fl_Widget* widget, int delta_x, int delta_y) -{ - printer->draw(widget, delta_x, delta_y); -} - void Fl_Printer::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y) { printer->draw_decorated_window(win, delta_x, delta_y); } - -void Fl_Printer::print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y) -{ - printer->print_window_part(win, x, y, w, h, delta_x, delta_y); -} - void Fl_Printer::set_current(void) { printer->set_current(); diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index 971ce423e..85a60109c 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -196,6 +196,7 @@ Fl_RGB_Image *Fl_Screen_Driver::traverse_to_gl_subwindows(Fl_Group *g, int x, in if (full_img) g->as_window()->make_current(); full_img = Fl::screen_driver()->read_win_rectangle(x, y, w, h); } + float full_img_scale = (full_img && w > 0 ? float(full_img->data_w())/w : 1); int n = g->children(); for (int i = 0; i < n; i++) { Fl_Widget *c = g->child(i); @@ -221,9 +222,7 @@ Fl_RGB_Image *Fl_Screen_Driver::traverse_to_gl_subwindows(Fl_Group *g, int x, in } else { top = full_img->h() - (origin_y - y + img->h()); } - int nscreen = c->as_window()->driver()->screen_num(); - float s = Fl::screen_driver()->scale(nscreen); - write_image_inside(full_img, img, (origin_x - x) * s, top * s); + write_image_inside(full_img, img, (origin_x - x) * full_img_scale, top * full_img_scale); delete img; } } diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 7cac1b1ef..20c15e857 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -87,7 +87,7 @@ static void createAppleMenu(void); static void cocoaMouseHandler(NSEvent *theEvent); static void clipboard_check(void); static unsigned make_current_counts = 0; // if > 0, then Fl_Window::make_current() can be called only once -static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h); +static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins = true); static void drain_dropped_files_list(void); int fl_mac_os_version = Fl_Darwin_System_Driver::calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4) @@ -4181,7 +4181,7 @@ static NSBitmapImageRep* GL_rect_to_nsbitmap(Fl_Window *win, int x, int y, int w return bitmap; } -static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h) +static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins) /* Captures a rectangle from a mapped window. On retina displays, the resulting bitmap has 2 pixels per screen unit. The returned value is to be released after use @@ -4222,7 +4222,7 @@ static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, NSArray *children = [fl_xid(win) childWindows]; // 10.2 NSEnumerator *enumerator = [children objectEnumerator]; id child; - while ((child = [enumerator nextObject]) != nil) { + while (capture_subwins && ((child = [enumerator nextObject]) != nil)) { if (![child isKindOfClass:[FLWindow class]]) continue; Fl_Window *sub = [(FLWindow*)child getFl_Window]; CGRect rsub = CGRectMake(sub->x(), win->h() -(sub->y()+sub->h()), sub->w(), sub->h()); @@ -4247,7 +4247,7 @@ static void nsbitmapProviderReleaseData (void *info, const void *data, size_t si [(NSBitmapImageRep*)info release]; } -CGImageRef Fl_Cocoa_Window_Driver::CGImage_from_window_rect(int x, int y, int w, int h) +CGImageRef Fl_Cocoa_Window_Driver::CGImage_from_window_rect(int x, int y, int w, int h, bool capture_subwins) /* Returns a capture of a rectangle of a mapped window as a CGImage. With retina displays, the returned image has twice the width and height. CFRelease the returned CGImageRef after use @@ -4255,7 +4255,7 @@ CGImageRef Fl_Cocoa_Window_Driver::CGImage_from_window_rect(int x, int y, int w, { Fl_Window *win = pWindow; CGImageRef img; - NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h); + NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h, capture_subwins); if (fl_mac_os_version >= 100500) { img = (CGImageRef)[bitmap performSelector:@selector(CGImage)]; // requires Mac OS 10.5 CGImageRetain(img); @@ -4363,7 +4363,7 @@ void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_Shared_Image*& top, } } } else { - CGImageRef img = CGImage_from_window_rect(0, -htop, scaled_w, htop); + CGImageRef img = CGImage_from_window_rect(0, -htop, scaled_w, htop, false); CGContextSaveGState(auxgc); clip_to_rounded_corners(auxgc, scaled_w, htop); CGContextDrawImage(auxgc, CGRectMake(0, 0, scaled_w, htop), img); diff --git a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm index c61f09df1..4a7a713dd 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm +++ b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm @@ -70,7 +70,6 @@ private: 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); }; @@ -362,20 +361,6 @@ void Fl_Cocoa_Printer_Driver::end_job (void) if (w) w->show(); } -// version that prints at high res if using a retina display -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::push_current( Fl_Display_Device::display_device() ); - Fl_Window *save_front = Fl::first_window(); - win->show(); - Fl::check(); - CGImageRef img = Fl_Cocoa_Window_Driver::driver(win)->CGImage_from_window_rect(x, y, w, h); - if (save_front != win) save_front->show(); - Fl_Surface_Device::pop_current(); - ((Fl_Quartz_Graphics_Driver*)driver())->draw_CGImage(img,delta_x, delta_y, w, h, 0,0,w,h); - CFRelease(img); -} - void Fl_Cocoa_Printer_Driver::origin(int *x, int *y) { Fl_Paged_Device::origin(x, y); diff --git a/src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx index d46879932..b7623193d 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx @@ -372,7 +372,7 @@ Fl_RGB_Image *Fl_Cocoa_Screen_Driver::read_win_rectangle(int X, int Y, int w, in bpr = 0; } else { // read from window Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(Fl_Window::current()); - CGImageRef cgimg = d->CGImage_from_window_rect(X, Y, w, h); + CGImageRef cgimg = d->CGImage_from_window_rect(X, Y, w, h, false); if (!cgimg) { return NULL; } diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H index f9631198e..256a89a6f 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H @@ -88,7 +88,7 @@ public: CGRect* subRect() { return subRect_; } // getter void subRect(CGRect *r) { subRect_ = r; } // setter static void destroy(FLWindow*); - CGImageRef CGImage_from_window_rect(int x, int y, int w, int h); + CGImageRef CGImage_from_window_rect(int x, int y, int w, int h, bool capture_subwins = true); // --- window data virtual int decorated_w(); |
