mirror of
https://github.com/brl/mutter.git
synced 2024-11-24 17:10:40 -05:00
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:
parent
b1c8510a95
commit
2239e7ad29
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user