forked from AuroraMiddleware/gtk
Merge branch 'wip/chergert/macos-gl-opaque-context' into 'master'
macos: make OpenGL context opaque when possible See merge request GNOME/gtk!3226
This commit is contained in:
commit
e220b24b70
@ -267,6 +267,34 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
opaque_region_covers_surface (GdkMacosGLContext *self)
|
||||||
|
{
|
||||||
|
GdkSurface *surface;
|
||||||
|
cairo_region_t *region;
|
||||||
|
|
||||||
|
g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
|
||||||
|
|
||||||
|
surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self));
|
||||||
|
region = GDK_MACOS_SURFACE (surface)->opaque_region;
|
||||||
|
|
||||||
|
if (region != NULL &&
|
||||||
|
cairo_region_num_rectangles (region) == 1)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t extents;
|
||||||
|
|
||||||
|
cairo_region_get_extents (region, &extents);
|
||||||
|
|
||||||
|
if (extents.x == 0 &&
|
||||||
|
extents.y == 0 &&
|
||||||
|
extents.width == surface->width &&
|
||||||
|
extents.height == surface->height)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
|
gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
|
||||||
cairo_region_t *painted)
|
cairo_region_t *painted)
|
||||||
@ -315,6 +343,10 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
|
|||||||
else
|
else
|
||||||
opaque = FALSE;
|
opaque = FALSE;
|
||||||
|
|
||||||
|
/* If we are maximized, we might be able to make it opaque */
|
||||||
|
if (opaque == FALSE)
|
||||||
|
opaque = opaque_region_covers_surface (self);
|
||||||
|
|
||||||
CGLSetParameter (cgl_context, kCGLCPSurfaceOpacity, &opaque);
|
CGLSetParameter (cgl_context, kCGLCPSurfaceOpacity, &opaque);
|
||||||
|
|
||||||
[self->gl_context update];
|
[self->gl_context update];
|
||||||
|
@ -48,6 +48,7 @@ struct _GdkMacosSurface
|
|||||||
GdkMacosWindow *window;
|
GdkMacosWindow *window;
|
||||||
GPtrArray *monitors;
|
GPtrArray *monitors;
|
||||||
cairo_region_t *input_region;
|
cairo_region_t *input_region;
|
||||||
|
cairo_region_t *opaque_region;
|
||||||
char *title;
|
char *title;
|
||||||
|
|
||||||
int root_x;
|
int root_x;
|
||||||
|
@ -98,9 +98,16 @@ static void
|
|||||||
gdk_macos_surface_set_opaque_region (GdkSurface *surface,
|
gdk_macos_surface_set_opaque_region (GdkSurface *surface,
|
||||||
cairo_region_t *region)
|
cairo_region_t *region)
|
||||||
{
|
{
|
||||||
|
GdkMacosSurface *self = (GdkMacosSurface *)surface;
|
||||||
NSView *nsview;
|
NSView *nsview;
|
||||||
|
|
||||||
g_assert (GDK_IS_MACOS_SURFACE (surface));
|
g_assert (GDK_IS_MACOS_SURFACE (self));
|
||||||
|
|
||||||
|
if (region != self->opaque_region)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&self->opaque_region, cairo_region_destroy);
|
||||||
|
self->opaque_region = cairo_region_copy (region);
|
||||||
|
}
|
||||||
|
|
||||||
if ((nsview = _gdk_macos_surface_get_view (GDK_MACOS_SURFACE (surface))) &&
|
if ((nsview = _gdk_macos_surface_get_view (GDK_MACOS_SURFACE (surface))) &&
|
||||||
GDK_IS_MACOS_CAIRO_VIEW (nsview))
|
GDK_IS_MACOS_CAIRO_VIEW (nsview))
|
||||||
@ -386,6 +393,7 @@ gdk_macos_surface_destroy (GdkSurface *surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_clear_pointer (&self->title, g_free);
|
g_clear_pointer (&self->title, g_free);
|
||||||
|
g_clear_pointer (&self->opaque_region, cairo_region_destroy);
|
||||||
|
|
||||||
if (window != NULL)
|
if (window != NULL)
|
||||||
[window close];
|
[window close];
|
||||||
|
Loading…
Reference in New Issue
Block a user