shaped-texture: Remove get_image_via_offscreen()

It duplicates functionality in `meta_window_actor_get_image()`, its
only user. Instead, make `should_get_via_offscreen()` public and
use it in the former.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1893>
This commit is contained in:
Robert Mader 2021-08-22 13:46:52 +02:00 committed by Marge Bot
parent b1c8510a95
commit 2239e7ad29
3 changed files with 11 additions and 116 deletions

View File

@ -73,4 +73,6 @@ void meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
void meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex); void meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex);
gboolean meta_shaped_texture_should_get_via_offscreen (MetaShapedTexture *stex);
#endif #endif

View File

@ -1343,8 +1343,8 @@ meta_shaped_texture_reset_viewport_dst_size (MetaShapedTexture *stex)
invalidate_size (stex); invalidate_size (stex);
} }
static gboolean gboolean
should_get_via_offscreen (MetaShapedTexture *stex) meta_shaped_texture_should_get_via_offscreen (MetaShapedTexture *stex)
{ {
if (!cogl_texture_is_get_data_supported (stex->texture)) if (!cogl_texture_is_get_data_supported (stex->texture))
return TRUE; return TRUE;
@ -1369,104 +1369,6 @@ should_get_via_offscreen (MetaShapedTexture *stex)
return FALSE; return FALSE;
} }
static cairo_surface_t *
get_image_via_offscreen (MetaShapedTexture *stex,
cairo_rectangle_int_t *clip,
int image_width,
int image_height)
{
g_autoptr (ClutterPaintNode) root_node = NULL;
ClutterBackend *clutter_backend = clutter_get_default_backend ();
CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
CoglTexture *image_texture;
GError *error = NULL;
CoglOffscreen *offscreen;
CoglFramebuffer *fb;
graphene_matrix_t projection_matrix;
cairo_rectangle_int_t fallback_clip;
ClutterColor clear_color;
ClutterPaintContext *paint_context;
cairo_surface_t *surface;
if (!clip)
{
fallback_clip = (cairo_rectangle_int_t) {
.width = image_width,
.height = image_height,
};
clip = &fallback_clip;
}
image_texture =
COGL_TEXTURE (cogl_texture_2d_new_with_size (cogl_context,
image_width,
image_height));
cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (image_texture),
FALSE);
if (!cogl_texture_allocate (COGL_TEXTURE (image_texture), &error))
{
g_error_free (error);
cogl_object_unref (image_texture);
return FALSE;
}
offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (image_texture));
fb = COGL_FRAMEBUFFER (offscreen);
cogl_object_unref (image_texture);
if (!cogl_framebuffer_allocate (fb, &error))
{
g_error_free (error);
g_object_unref (fb);
return FALSE;
}
cogl_framebuffer_push_matrix (fb);
graphene_matrix_init_translate (&projection_matrix,
&GRAPHENE_POINT3D_INIT (-(image_width / 2.0),
-(image_height / 2.0),
0));
graphene_matrix_scale (&projection_matrix,
1.0 / (image_width / 2.0),
-1.0 / (image_height / 2.0), 0);
cogl_framebuffer_set_projection_matrix (fb, &projection_matrix);
clear_color = (ClutterColor) { 0, 0, 0, 0 };
root_node = clutter_root_node_new (fb, &clear_color, COGL_BUFFER_BIT_COLOR);
clutter_paint_node_set_static_name (root_node, "MetaShapedTexture.offscreen");
paint_context =
clutter_paint_context_new_for_framebuffer (fb, NULL,
CLUTTER_PAINT_FLAG_NONE);
do_paint_content (stex, root_node, paint_context,
stex->texture,
&(ClutterActorBox) {
0, 0,
image_width,
image_height,
},
255);
clutter_paint_node_paint (root_node, paint_context);
clutter_paint_context_destroy (paint_context);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
clip->width, clip->height);
cogl_framebuffer_read_pixels (fb,
clip->x, clip->y,
clip->width, clip->height,
CLUTTER_CAIRO_FORMAT_ARGB32,
cairo_image_surface_get_data (surface));
g_object_unref (fb);
cairo_surface_mark_dirty (surface);
return surface;
}
/** /**
* meta_shaped_texture_get_image: * meta_shaped_texture_get_image:
* @stex: A #MetaShapedTexture * @stex: A #MetaShapedTexture
@ -1496,6 +1398,9 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
if (texture == NULL) if (texture == NULL)
return NULL; return NULL;
if (meta_shaped_texture_should_get_via_offscreen (stex))
return NULL;
meta_shaped_texture_ensure_size_valid (stex); meta_shaped_texture_ensure_size_valid (stex);
if (stex->dst_width == 0 || stex->dst_height == 0) if (stex->dst_width == 0 || stex->dst_height == 0)
@ -1523,19 +1428,6 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
}; };
} }
if (should_get_via_offscreen (stex))
{
int image_width;
int image_height;
image_width = stex->dst_width * stex->buffer_scale;
image_height = stex->dst_height * stex->buffer_scale;
return get_image_via_offscreen (stex,
image_clip,
image_width,
image_height);
}
if (image_clip) if (image_clip)
texture = cogl_texture_new_from_sub_texture (texture, texture = cogl_texture_new_from_sub_texture (texture,
image_clip->x, image_clip->x,

View File

@ -1484,6 +1484,7 @@ meta_window_actor_get_image (MetaWindowActor *self,
{ {
MetaWindowActorPrivate *priv = meta_window_actor_get_instance_private (self); MetaWindowActorPrivate *priv = meta_window_actor_get_instance_private (self);
ClutterActor *actor = CLUTTER_ACTOR (self); ClutterActor *actor = CLUTTER_ACTOR (self);
MetaShapedTexture *stex;
cairo_surface_t *surface = NULL; cairo_surface_t *surface = NULL;
CoglFramebuffer *framebuffer; CoglFramebuffer *framebuffer;
MetaRectangle framebuffer_clip; MetaRectangle framebuffer_clip;
@ -1495,9 +1496,10 @@ meta_window_actor_get_image (MetaWindowActor *self,
clutter_actor_inhibit_culling (actor); clutter_actor_inhibit_culling (actor);
if (clutter_actor_get_n_children (actor) == 1) stex = meta_surface_actor_get_texture (priv->surface);
if (!meta_shaped_texture_should_get_via_offscreen (stex) &&
clutter_actor_get_n_children (actor) == 1)
{ {
MetaShapedTexture *stex;
MetaRectangle *surface_clip = NULL; MetaRectangle *surface_clip = NULL;
if (clip) if (clip)
@ -1514,7 +1516,6 @@ meta_window_actor_get_image (MetaWindowActor *self,
surface_clip->height = clip->height / geometry_scale; surface_clip->height = clip->height / geometry_scale;
} }
stex = meta_surface_actor_get_texture (priv->surface);
surface = meta_shaped_texture_get_image (stex, surface_clip); surface = meta_shaped_texture_get_image (stex, surface_clip);
goto out; goto out;
} }