forked from AuroraMiddleware/gtk
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:
parent
979e9bec27
commit
b391aea2b3
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user