|
|
commit 75016cb8530c886fad9227b015413da0634aa63a
Author: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Fri Sep 30 09:03:54 2022 +0200
Commit: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Fri Sep 30 09:03:54 2022 +0200
macOS: implement (BOOL)[FLView isOpaque] to improve drawing performance.
src/Fl_cocoa.mm | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git src/Fl_cocoa.mm src/Fl_cocoa.mm
index 694e54a..beaba84 100644
--- src/Fl_cocoa.mm
+++ src/Fl_cocoa.mm
@@ -505,8 +505,9 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
BOOL need_handle; // YES means Fl::handle(FL_KEYBOARD,) is needed after handleEvent processing
NSInteger identifier;
NSRange selectedRange;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
@public
+ BOOL is_opaque;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
CGContextRef aux_bitmap; // all drawing to view goes there and is finally copied to the CALayer
#endif
}
@@ -684,11 +685,14 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
if (!CGRectEqualToRect(srect, current_clip)) { // if new clip differs from current clip
delete r;
FLWindow *xid = fl_xid(w);
- NSView *view = [xid contentView];
- if (CGRectEqualToRect(srect, full)) r = NULL;
- else {
+ FLView *view = (FLView*)[xid contentView];
+ if (CGRectEqualToRect(srect, full)) {
+ r = NULL;
+ view->is_opaque = (w->shape() == NULL);
+ } else {
r = new CGRect(srect);
if (r->size.width == 0 && r->size.height == 0) r->origin.x = r->origin.y = 0;
+ view->is_opaque = NO;
}
d->subRect(r);
w->redraw();
@@ -698,7 +702,7 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
[xid orderWindow:NSWindowAbove relativeTo:parent_num];
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
- if (!views_use_CA || ((FLView*)view)->aux_bitmap)
+ if (!views_use_CA || view->aux_bitmap)
#endif
[view display]; // subwindow needs redrawn
}
@@ -2199,6 +2203,9 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
*/
@implementation FLView
+- (BOOL)isOpaque {
+ return is_opaque;
+}
- (BOOL)did_view_resolution_change {
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
if (fl_mac_os_version >= 100700) { // determine whether window is mapped to a retina display
@@ -2994,6 +3001,7 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow()
[cw setContentView:myview];
[myview release];
[cw setLevel:winlevel];
+ myview->is_opaque = (w->shape() == NULL);
q_set_window_title(cw, w->label(), w->iconlabel());
NSImage *icon = icon_image; // is a window or default icon present?
[ Direct Link to Message ] | |
|
| |