widget: Make transform a GskTransform

This concludes pushing transforms down into GskTransform.

What's remaining is potentially pushing it further into the renderers.
This commit is contained in:
Benjamin Otte 2019-03-02 05:15:47 +01:00
parent 979e9bec27
commit b391aea2b3
4 changed files with 20 additions and 40 deletions

View File

@ -1267,20 +1267,6 @@ gtk_snapshot_transform_matrix (GtkSnapshot *snapshot,
state->transform = gsk_transform_matrix (state->transform, matrix); state->transform = gsk_transform_matrix (state->transform, matrix);
} }
void
gtk_snapshot_transform_matrix_with_category (GtkSnapshot *snapshot,
const graphene_matrix_t *matrix,
GskTransformCategory category)
{
GtkSnapshotState *state;
g_return_if_fail (GTK_IS_SNAPSHOT (snapshot));
g_return_if_fail (matrix != NULL);
state = gtk_snapshot_get_current_state (snapshot);
state->transform = gsk_transform_matrix_with_category (state->transform, matrix, category);
}
/** /**
* gtk_snapshot_translate: * gtk_snapshot_translate:
* @snapshot: a #GtkSnapshot * @snapshot: a #GtkSnapshot

View File

@ -101,10 +101,6 @@ void gtk_snapshot_append_node_internal (GtkSnapshot
GtkSnapshot * gtk_snapshot_new_with_parent (GtkSnapshot *parent_snapshot); GtkSnapshot * gtk_snapshot_new_with_parent (GtkSnapshot *parent_snapshot);
void gtk_snapshot_transform_matrix_with_category
(GtkSnapshot *snapshot,
const graphene_matrix_t*matrix,
GskTransformCategory category);
void gtk_snapshot_append_text (GtkSnapshot *snapshot, void gtk_snapshot_append_text (GtkSnapshot *snapshot,
PangoFont *font, PangoFont *font,
PangoGlyphString *glyphs, PangoGlyphString *glyphs,

View File

@ -824,7 +824,8 @@ gtk_widget_real_pick (GtkWidget *widget,
GtkWidget *picked; GtkWidget *picked;
graphene_point3d_t p0, p1, res; graphene_point3d_t p0, p1, res;
if (!graphene_matrix_inverse (&priv->transform, &inv)) gsk_transform_to_matrix (priv->transform, &inv);
if (!graphene_matrix_inverse (&inv, &inv))
continue; continue;
graphene_point3d_init (&p0, x, y, 0); graphene_point3d_init (&p0, x, y, 0);
graphene_point3d_init (&p1, x, y, 1); graphene_point3d_init (&p1, x, y, 1);
@ -2885,8 +2886,6 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
priv->width_request = -1; priv->width_request = -1;
priv->height_request = -1; priv->height_request = -1;
graphene_matrix_init_identity (&priv->transform);
_gtk_size_request_cache_init (&priv->requests); _gtk_size_request_cache_init (&priv->requests);
priv->cssnode = gtk_css_widget_node_new (widget); priv->cssnode = gtk_css_widget_node_new (widget);
@ -4186,7 +4185,6 @@ gtk_widget_allocate (GtkWidget *widget,
gint min_width, min_height; gint min_width, min_height;
GtkCssStyle *style; GtkCssStyle *style;
GtkBorder margin, border, padding; GtkBorder margin, border, padding;
graphene_matrix_t transform_matrix;
GskTransform *css_transform; GskTransform *css_transform;
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
GdkDisplay *display; GdkDisplay *display;
@ -4330,13 +4328,10 @@ gtk_widget_allocate (GtkWidget *widget,
margin.bottom + border.bottom + padding.bottom; margin.bottom + border.bottom + padding.bottom;
if (baseline >= 0) if (baseline >= 0)
baseline -= margin.top + border.top + padding.top; baseline -= margin.top + border.top + padding.top;
graphene_matrix_init_translate (&priv->transform, &GRAPHENE_POINT3D_INIT (adjusted.x, adjusted.y, 0));
gsk_transform_to_matrix (transform, &transform_matrix);
graphene_matrix_multiply (&priv->transform, &transform_matrix, &priv->transform);
priv->transform_category = gsk_transform_get_category (transform);
if (adjusted.x || adjusted.y) if (adjusted.x || adjusted.y)
priv->transform_category = MIN (priv->transform_category, GSK_TRANSFORM_CATEGORY_2D_TRANSLATE); transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (adjusted.x, adjusted.y));
priv->transform = transform;
if (!alloc_needed && !size_changed && !baseline_changed) if (!alloc_needed && !size_changed && !baseline_changed)
{ {
@ -6224,7 +6219,7 @@ _gtk_widget_set_visible_flag (GtkWidget *widget,
priv->allocated_width = 0; priv->allocated_width = 0;
priv->allocated_height = 0; priv->allocated_height = 0;
priv->allocated_size_baseline = 0; priv->allocated_size_baseline = 0;
graphene_matrix_init_identity (&priv->transform); g_clear_pointer (&priv->transform, gsk_transform_unref);
priv->width = 0; priv->width = 0;
priv->height = 0; priv->height = 0;
gtk_widget_update_paintables (widget); gtk_widget_update_paintables (widget);
@ -11075,6 +11070,7 @@ gtk_widget_get_allocation (GtkWidget *widget,
{ {
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
const graphene_rect_t *margin_rect; const graphene_rect_t *margin_rect;
float dx, dy;
GtkCssBoxes boxes; GtkCssBoxes boxes;
g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (GTK_IS_WIDGET (widget));
@ -11083,10 +11079,11 @@ gtk_widget_get_allocation (GtkWidget *widget,
gtk_css_boxes_init (&boxes, widget); gtk_css_boxes_init (&boxes, widget);
margin_rect = gtk_css_boxes_get_margin_rect (&boxes); margin_rect = gtk_css_boxes_get_margin_rect (&boxes);
allocation->x = graphene_matrix_get_value (&priv->transform, 3, 0) + if (!gsk_transform_to_translate (priv->transform, &dx, &dy))
ceil (margin_rect->origin.x); dx = dy = 0;
allocation->y = graphene_matrix_get_value (&priv->transform, 3, 1) +
ceil (margin_rect->origin.y); allocation->x = dx + ceil (margin_rect->origin.x);
allocation->y = dy + ceil (margin_rect->origin.y);
allocation->width = ceil (margin_rect->size.width); allocation->width = ceil (margin_rect->size.width);
allocation->height = ceil (margin_rect->size.height); allocation->height = ceil (margin_rect->size.height);
} }
@ -11205,7 +11202,7 @@ gtk_widget_compute_transform (GtkWidget *widget,
graphene_matrix_t *out_transform) graphene_matrix_t *out_transform)
{ {
GtkWidget *ancestor, *iter; GtkWidget *ancestor, *iter;
graphene_matrix_t transform, inverse; graphene_matrix_t transform, inverse, tmp;
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
g_return_val_if_fail (GTK_IS_WIDGET (target), FALSE); g_return_val_if_fail (GTK_IS_WIDGET (target), FALSE);
@ -11214,7 +11211,7 @@ gtk_widget_compute_transform (GtkWidget *widget,
/* optimization for common case: parent wants coordinates of a direct child */ /* optimization for common case: parent wants coordinates of a direct child */
if (target == widget->priv->parent) if (target == widget->priv->parent)
{ {
graphene_matrix_init_from_matrix (out_transform, &widget->priv->transform); gsk_transform_to_matrix (widget->priv->transform, out_transform);
return TRUE; return TRUE;
} }
@ -11229,8 +11226,9 @@ gtk_widget_compute_transform (GtkWidget *widget,
for (iter = widget; iter != ancestor; iter = iter->priv->parent) for (iter = widget; iter != ancestor; iter = iter->priv->parent)
{ {
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (iter); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (iter);
gsk_transform_to_matrix (priv->transform, &tmp);
graphene_matrix_multiply (&transform, &priv->transform, &transform); graphene_matrix_multiply (&transform, &tmp, &transform);
} }
/* optimization for common case: parent wants coordinates of a non-direct child */ /* optimization for common case: parent wants coordinates of a non-direct child */
@ -11244,8 +11242,9 @@ gtk_widget_compute_transform (GtkWidget *widget,
for (iter = target; iter != ancestor; iter = iter->priv->parent) for (iter = target; iter != ancestor; iter = iter->priv->parent)
{ {
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (iter); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (iter);
gsk_transform_to_matrix (priv->transform, &tmp);
graphene_matrix_multiply (&inverse, &priv->transform, &inverse); graphene_matrix_multiply (&inverse, &tmp, &inverse);
} }
if (!graphene_matrix_inverse (&inverse, &inverse)) if (!graphene_matrix_inverse (&inverse, &inverse))
{ {
@ -13425,7 +13424,7 @@ gtk_widget_snapshot_child (GtkWidget *widget,
g_return_if_fail (snapshot != NULL); g_return_if_fail (snapshot != NULL);
gtk_snapshot_save (snapshot); gtk_snapshot_save (snapshot);
gtk_snapshot_transform_matrix_with_category (snapshot, &priv->transform, priv->transform_category); gtk_snapshot_transform (snapshot, priv->transform);
gtk_widget_snapshot (child, snapshot); gtk_widget_snapshot (child, snapshot);

View File

@ -149,8 +149,7 @@ struct _GtkWidgetPrivate
int allocated_height; int allocated_height;
gint allocated_size_baseline; gint allocated_size_baseline;
graphene_matrix_t transform; GskTransform *transform;
GskTransformCategory transform_category;
int width; int width;
int height; int height;
int baseline; int baseline;