summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2018-05-04 15:11:47 +0000
committerManolo Gouy <Manolo>2018-05-04 15:11:47 +0000
commit20ccb6b7f2b0b2b742211c31a32c3ac612c43489 (patch)
treebc432cbcba741ba6dab1ab27b0c5674160b67b12
parentd4eeb75ac6829e663996e87c3584e247d10eead8 (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.H2
-rw-r--r--FL/Fl_Widget_Surface.H2
-rw-r--r--src/Fl_Printer.cxx18
-rw-r--r--src/Fl_Screen_Driver.cxx5
-rw-r--r--src/Fl_cocoa.mm12
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm15
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Screen_Driver.cxx2
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H2
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();