winemac: Use screen color space for windows covered by OpenGL views.
This commit is contained in:
parent
b0a3d93400
commit
d30705bdfe
|
@ -158,6 +158,8 @@ @interface WineWindow ()
|
||||||
@property (assign, nonatomic) void* imeData;
|
@property (assign, nonatomic) void* imeData;
|
||||||
@property (nonatomic) BOOL commandDone;
|
@property (nonatomic) BOOL commandDone;
|
||||||
|
|
||||||
|
- (void) updateColorSpace;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -256,12 +258,14 @@ - (void) addGLContext:(WineOpenGLContext*)context
|
||||||
pendingGlContexts = [[NSMutableArray alloc] init];
|
pendingGlContexts = [[NSMutableArray alloc] init];
|
||||||
[pendingGlContexts addObject:context];
|
[pendingGlContexts addObject:context];
|
||||||
[self setNeedsDisplay:YES];
|
[self setNeedsDisplay:YES];
|
||||||
|
[(WineWindow*)[self window] updateColorSpace];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) removeGLContext:(WineOpenGLContext*)context
|
- (void) removeGLContext:(WineOpenGLContext*)context
|
||||||
{
|
{
|
||||||
[glContexts removeObjectIdenticalTo:context];
|
[glContexts removeObjectIdenticalTo:context];
|
||||||
[pendingGlContexts removeObjectIdenticalTo:context];
|
[pendingGlContexts removeObjectIdenticalTo:context];
|
||||||
|
[(WineWindow*)[self window] updateColorSpace];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) updateGLContexts
|
- (void) updateGLContexts
|
||||||
|
@ -270,6 +274,11 @@ - (void) updateGLContexts
|
||||||
context.needsUpdate = TRUE;
|
context.needsUpdate = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL) hasGLContext
|
||||||
|
{
|
||||||
|
return [glContexts count] || [pendingGlContexts count];
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL) acceptsFirstMouse:(NSEvent*)theEvent
|
- (BOOL) acceptsFirstMouse:(NSEvent*)theEvent
|
||||||
{
|
{
|
||||||
return YES;
|
return YES;
|
||||||
|
@ -919,7 +928,10 @@ - (BOOL) setFrameIfOnScreen:(NSRect)contentRect
|
||||||
if (NSEqualSizes(frame.size, oldFrame.size))
|
if (NSEqualSizes(frame.size, oldFrame.size))
|
||||||
[self setFrameOrigin:frame.origin];
|
[self setFrameOrigin:frame.origin];
|
||||||
else
|
else
|
||||||
|
{
|
||||||
[self setFrame:frame display:YES];
|
[self setFrame:frame display:YES];
|
||||||
|
[self updateColorSpace];
|
||||||
|
}
|
||||||
|
|
||||||
[self updateFullscreen];
|
[self updateFullscreen];
|
||||||
|
|
||||||
|
@ -1032,6 +1044,7 @@ - (void) makeFocused:(BOOL)activate
|
||||||
[self setFrameTopLeftPoint:NSMakePoint(NSMinX(frame), NSMaxY(frame))];
|
[self setFrameTopLeftPoint:NSMakePoint(NSMinX(frame), NSMaxY(frame))];
|
||||||
frame = [self constrainFrameRect:[self frame] toScreen:primaryScreen];
|
frame = [self constrainFrameRect:[self frame] toScreen:primaryScreen];
|
||||||
[self setFrame:frame display:YES];
|
[self setFrame:frame display:YES];
|
||||||
|
[self updateColorSpace];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activate)
|
if (activate)
|
||||||
|
@ -1182,6 +1195,37 @@ - (void) makeKeyAndOrderFront:(id)sender
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We normally use the generic/calibrated RGB color space for the window,
|
||||||
|
// rather than the device color space, to avoid expensive color conversion
|
||||||
|
// which slows down drawing. However, for windows displaying OpenGL, having
|
||||||
|
// a different color space than the screen greatly reduces frame rates, often
|
||||||
|
// limiting it to the display refresh rate.
|
||||||
|
//
|
||||||
|
// To avoid this, we switch back to the screen color space whenever the
|
||||||
|
// window is covered by a view with an attached OpenGL context.
|
||||||
|
- (void) updateColorSpace
|
||||||
|
{
|
||||||
|
NSRect contentRect = [[self contentView] frame];
|
||||||
|
BOOL coveredByGLView = FALSE;
|
||||||
|
for (WineContentView* view in [[self contentView] subviews])
|
||||||
|
{
|
||||||
|
if ([view hasGLContext])
|
||||||
|
{
|
||||||
|
NSRect frame = [view convertRect:[view bounds] toView:nil];
|
||||||
|
if (NSContainsRect(frame, contentRect))
|
||||||
|
{
|
||||||
|
coveredByGLView = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (coveredByGLView)
|
||||||
|
[self setColorSpace:nil];
|
||||||
|
else
|
||||||
|
[self setColorSpace:[NSColorSpace genericRGBColorSpace]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ---------- NSResponder method overrides ----------
|
* ---------- NSResponder method overrides ----------
|
||||||
|
@ -1872,6 +1916,7 @@ macdrv_view macdrv_create_view(macdrv_window w, CGRect rect)
|
||||||
name:NSApplicationDidChangeScreenParametersNotification
|
name:NSApplicationDidChangeScreenParametersNotification
|
||||||
object:NSApp];
|
object:NSApp];
|
||||||
[[window contentView] addSubview:view];
|
[[window contentView] addSubview:view];
|
||||||
|
[window updateColorSpace];
|
||||||
});
|
});
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
|
@ -1890,6 +1935,7 @@ void macdrv_dispose_view(macdrv_view v)
|
||||||
|
|
||||||
OnMainThread(^{
|
OnMainThread(^{
|
||||||
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
|
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
|
||||||
|
WineWindow* window = (WineWindow*)[view window];
|
||||||
|
|
||||||
[nc removeObserver:view
|
[nc removeObserver:view
|
||||||
name:NSViewGlobalFrameDidChangeNotification
|
name:NSViewGlobalFrameDidChangeNotification
|
||||||
|
@ -1899,6 +1945,7 @@ void macdrv_dispose_view(macdrv_view v)
|
||||||
object:NSApp];
|
object:NSApp];
|
||||||
[view removeFromSuperview];
|
[view removeFromSuperview];
|
||||||
[view release];
|
[view release];
|
||||||
|
[window updateColorSpace];
|
||||||
});
|
});
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
|
@ -1923,11 +1970,15 @@ void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rec
|
||||||
BOOL changedWindow = (window && window != [view window]);
|
BOOL changedWindow = (window && window != [view window]);
|
||||||
NSRect newFrame = NSRectFromCGRect(rect);
|
NSRect newFrame = NSRectFromCGRect(rect);
|
||||||
NSRect oldFrame = [view frame];
|
NSRect oldFrame = [view frame];
|
||||||
|
BOOL needUpdateWindowColorSpace = FALSE;
|
||||||
|
|
||||||
if (changedWindow)
|
if (changedWindow)
|
||||||
{
|
{
|
||||||
|
WineWindow* oldWindow = (WineWindow*)[view window];
|
||||||
[view removeFromSuperview];
|
[view removeFromSuperview];
|
||||||
|
[oldWindow updateColorSpace];
|
||||||
[[window contentView] addSubview:view];
|
[[window contentView] addSubview:view];
|
||||||
|
needUpdateWindowColorSpace = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NSEqualRects(oldFrame, newFrame))
|
if (!NSEqualRects(oldFrame, newFrame))
|
||||||
|
@ -1941,7 +1992,11 @@ void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rec
|
||||||
else
|
else
|
||||||
[view setFrame:newFrame];
|
[view setFrame:newFrame];
|
||||||
[view setNeedsDisplay:YES];
|
[view setNeedsDisplay:YES];
|
||||||
|
needUpdateWindowColorSpace = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (needUpdateWindowColorSpace)
|
||||||
|
[(WineWindow*)[view window] updateColorSpace];
|
||||||
});
|
});
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
|
|
Loading…
Reference in New Issue