cursor-sprite: Add API for viewports

[jadahl] Rework hotspot calculations.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3859>
This commit is contained in:
Robert Mader
2024-06-30 23:18:39 +02:00
committed by Sebastian Wick
parent e402eaa950
commit e674c7e454
3 changed files with 183 additions and 4 deletions

View File

@ -56,6 +56,11 @@ typedef struct _MetaCursorSpritePrivate
CoglTexture2D *texture;
float texture_scale;
MtkMonitorTransform texture_transform;
gboolean has_viewport_src_rect;
graphene_rect_t viewport_src_rect;
gboolean has_viewport_dst_size;
int viewport_dst_width;
int viewport_dst_height;
int hot_x, hot_y;
ClutterColorState *color_state;
@ -151,6 +156,74 @@ meta_cursor_sprite_set_texture_transform (MetaCursorSprite *sprite,
meta_cursor_sprite_invalidate (sprite);
}
void
meta_cursor_sprite_set_viewport_src_rect (MetaCursorSprite *sprite,
const graphene_rect_t *src_rect)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (priv->has_viewport_src_rect &&
G_APPROX_VALUE (priv->viewport_src_rect.origin.x,
src_rect->origin.x, FLT_EPSILON) &&
G_APPROX_VALUE (priv->viewport_src_rect.origin.y,
src_rect->origin.y, FLT_EPSILON) &&
G_APPROX_VALUE (priv->viewport_src_rect.size.width,
src_rect->size.width, FLT_EPSILON) &&
G_APPROX_VALUE (priv->viewport_src_rect.size.height,
src_rect->size.height, FLT_EPSILON))
return;
priv->has_viewport_src_rect = TRUE;
priv->viewport_src_rect = *src_rect;
meta_cursor_sprite_invalidate (sprite);
}
void
meta_cursor_sprite_reset_viewport_src_rect (MetaCursorSprite *sprite)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (!priv->has_viewport_src_rect)
return;
priv->has_viewport_src_rect = FALSE;
meta_cursor_sprite_invalidate (sprite);
}
void
meta_cursor_sprite_set_viewport_dst_size (MetaCursorSprite *sprite,
int dst_width,
int dst_height)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (priv->has_viewport_dst_size &&
priv->viewport_dst_width == dst_width &&
priv->viewport_dst_height == dst_height)
return;
priv->has_viewport_dst_size = TRUE;
priv->viewport_dst_width = dst_width;
priv->viewport_dst_height = dst_height;
meta_cursor_sprite_invalidate (sprite);
}
void
meta_cursor_sprite_reset_viewport_dst_size (MetaCursorSprite *sprite)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (!priv->has_viewport_dst_size)
return;
priv->has_viewport_dst_size = FALSE;
meta_cursor_sprite_invalidate (sprite);
}
CoglTexture *
meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *sprite)
{
@ -208,6 +281,34 @@ meta_cursor_sprite_get_texture_transform (MetaCursorSprite *sprite)
return priv->texture_transform;
}
const graphene_rect_t *
meta_cursor_sprite_get_viewport_src_rect (MetaCursorSprite *sprite)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (!priv->has_viewport_src_rect)
return NULL;
return &priv->viewport_src_rect;
}
gboolean
meta_cursor_sprite_get_viewport_dst_size (MetaCursorSprite *sprite,
int *dst_width,
int *dst_height)
{
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
if (!priv->has_viewport_dst_size)
return FALSE;
*dst_width = priv->viewport_dst_width;
*dst_height = priv->viewport_dst_height;
return TRUE;
}
void
meta_cursor_sprite_set_prepare_func (MetaCursorSprite *sprite,
MetaCursorPrepareFunc func,