summaryrefslogtreecommitdiff
path: root/gsk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2019-03-04 19:33:04 +0100
committerBenjamin Otte <otte@redhat.com>2019-03-04 23:41:51 +0100
commitbd113aa85cd011edd11874c4e2d9353898d8f793 (patch)
treefa7ce7392574036f2f59db79a6817d777e9dba20 /gsk
parent1fecbd4241529197984ed1c717fdf91f0bb8337b (diff)
downloadgtk+-bd113aa85cd011edd11874c4e2d9353898d8f793.tar.gz
transform: Redo querying API
Make the API expect a tranform of the proper category instead of doing the check ourselves and returning TRUE/FALSE. The benefit is that the mai use case is switch (transform->category) statements and in those we know the category and don't need to check TRUE/FALSE. Using the wrong matrix will now cause a g_warning().
Diffstat (limited to 'gsk')
-rw-r--r--gsk/gl/gskglrenderer.c5
-rw-r--r--gsk/gskrendernodeimpl.c26
-rw-r--r--gsk/gsktransform.c271
-rw-r--r--gsk/gsktransform.h12
4 files changed, 136 insertions, 178 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 4054bf8e95..02b15f5c8e 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -809,10 +809,7 @@ render_transform_node (GskGLRenderer *self,
{
float dx, dy;
- if (!gsk_transform_to_translate (node_transform, &dx, &dy))
- {
- g_assert_not_reached ();
- }
+ gsk_transform_to_translate (node_transform, &dx, &dy);
ops_offset (builder, dx, dy);
gsk_gl_renderer_add_render_ops (self, child, builder);
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index 11cb612a87..48dbcb76cd 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -2406,25 +2406,25 @@ gsk_transform_node_draw (GskRenderNode *node,
{
GskTransformNode *self = (GskTransformNode *) node;
float xx, yx, xy, yy, dx, dy;
+ cairo_matrix_t ctm;
- if (gsk_transform_to_2d (self->transform, &xx, &yx, &xy, &yy, &dx, &dy))
- {
- cairo_matrix_t ctm = { xx, yx, xy, yy, dx, dy };
-
- GSK_NOTE (CAIRO, g_message ("CTM = { .xx = %g, .yx = %g, .xy = %g, .yy = %g, .x0 = %g, .y0 = %g }",
- ctm.xx, ctm.yx,
- ctm.xy, ctm.yy,
- ctm.x0, ctm.y0));
- cairo_transform (cr, &ctm);
-
- gsk_render_node_draw (self->child, cr);
- }
- else
+ if (gsk_transform_get_category (self->transform) < GSK_TRANSFORM_CATEGORY_2D)
{
cairo_set_source_rgb (cr, 255 / 255., 105 / 255., 180 / 255.);
cairo_rectangle (cr, node->bounds.origin.x, node->bounds.origin.y, node->bounds.size.width, node->bounds.size.height);
cairo_fill (cr);
+ return;
}
+
+ gsk_transform_to_2d (self->transform, &xx, &yx, &xy, &yy, &dx, &dy);
+ cairo_matrix_init (&ctm, xx, yx, xy, yy, dx, dy);
+ GSK_NOTE (CAIRO, g_message ("CTM = { .xx = %g, .yx = %g, .xy = %g, .yy = %g, .x0 = %g, .y0 = %g }",
+ ctm.xx, ctm.yx,
+ ctm.xy, ctm.yy,
+ ctm.x0, ctm.y0));
+ cairo_transform (cr, &ctm);
+
+ gsk_render_node_draw (self->child, cr);
}
#define GSK_TRANSFORM_NODE_VARIANT_TYPE "(idddddddddddddddduv)"
diff --git a/gsk/gsktransform.c b/gsk/gsktransform.c
index 6c7ab16e01..a9c75c7599 100644
--- a/gsk/gsktransform.c
+++ b/gsk/gsktransform.c
@@ -56,19 +56,19 @@ struct _GskTransformClass
void (* finalize) (GskTransform *transform);
void (* to_matrix) (GskTransform *transform,
graphene_matrix_t *out_matrix);
- gboolean (* apply_2d) (GskTransform *transform,
+ void (* apply_2d) (GskTransform *transform,
float *out_xx,
float *out_yx,
float *out_xy,
float *out_yy,
float *out_dx,
float *out_dy);
- gboolean (* apply_affine) (GskTransform *transform,
+ void (* apply_affine) (GskTransform *transform,
float *out_scale_x,
float *out_scale_y,
float *out_dx,
float *out_dy);
- gboolean (* apply_translate) (GskTransform *transform,
+ void (* apply_translate) (GskTransform *transform,
float *out_dx,
float *out_dy);
void (* print) (GskTransform *transform,
@@ -117,7 +117,7 @@ gsk_transform_alloc (const GskTransformClass *transform_class,
self->transform_class = transform_class;
self->ref_count = 1;
- self->category = MIN (category, next->category);
+ self->category = next ? MIN (category, next->category) : category;
self->next = gsk_transform_is_identity (next) ? NULL : next;
return self;
@@ -137,7 +137,7 @@ gsk_identity_transform_to_matrix (GskTransform *transform,
graphene_matrix_init_identity (out_matrix);
}
-static gboolean
+static void
gsk_identity_transform_apply_2d (GskTransform *transform,
float *out_xx,
float *out_yx,
@@ -146,25 +146,22 @@ gsk_identity_transform_apply_2d (GskTransform *transform,
float *out_dx,
float *out_dy)
{
- return TRUE;
}
-static gboolean
+static void
gsk_identity_transform_apply_affine (GskTransform *transform,
float *out_scale_x,
float *out_scale_y,
float *out_dx,
float *out_dy)
{
- return TRUE;
}
-static gboolean
+static void
gsk_identity_transform_apply_translate (GskTransform *transform,
float *out_dx,
float *out_dy)
{
- return TRUE;
}
static void
@@ -267,7 +264,7 @@ gsk_matrix_transform_to_matrix (GskTransform *transform,
graphene_matrix_init_from_matrix (out_matrix, &self->matrix);
}
-static gboolean
+static void
gsk_matrix_transform_apply_2d (GskTransform *transform,
float *out_xx,
float *out_yx,
@@ -276,10 +273,26 @@ gsk_matrix_transform_apply_2d (GskTransform *transform,
float *out_dx,
float *out_dy)
{
- return FALSE;
+ GskMatrixTransform *self = (GskMatrixTransform *) transform;
+ graphene_matrix_t mat;
+
+ graphene_matrix_init_from_2d (&mat,
+ *out_xx, *out_yx,
+ *out_xy, *out_yy,
+ *out_dx, *out_dy);
+ graphene_matrix_multiply (&self->matrix, &mat, &mat);
+
+ /* not using graphene_matrix_to_2d() because it may
+ * fail the is_2d() check due to improper rounding */
+ *out_xx = graphene_matrix_get_value (&mat, 0, 0);
+ *out_yx = graphene_matrix_get_value (&mat, 0, 1);
+ *out_xy = graphene_matrix_get_value (&mat, 1, 0);
+ *out_yy = graphene_matrix_get_value (&mat, 1, 1);
+ *out_dx = graphene_matrix_get_value (&mat, 3, 0);
+ *out_dy = graphene_matrix_get_value (&mat, 3, 1);
}
-static gboolean
+static void
gsk_matrix_transform_apply_affine (GskTransform *transform,
float *out_scale_x,
float *out_scale_y,
@@ -295,26 +308,27 @@ gsk_matrix_transform_apply_affine (GskTransform *transform,
case GSK_TRANSFORM_CATEGORY_3D:
case GSK_TRANSFORM_CATEGORY_2D:
default:
- return FALSE;
+ g_assert_not_reached ();
+ break;
case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
*out_dx += *out_scale_x * graphene_matrix_get_value (&self->matrix, 3, 0);
*out_dy += *out_scale_y * graphene_matrix_get_value (&self->matrix, 3, 1);
*out_scale_x *= graphene_matrix_get_value (&self->matrix, 0, 0);
*out_scale_y *= graphene_matrix_get_value (&self->matrix, 1, 1);
- return TRUE;
+ break;
case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
*out_dx += *out_scale_x * graphene_matrix_get_value (&self->matrix, 3, 0);
*out_dy += *out_scale_y * graphene_matrix_get_value (&self->matrix, 3, 1);
- return TRUE;
+ break;
case GSK_TRANSFORM_CATEGORY_IDENTITY:
- return TRUE;
+ break;
}
}
-static gboolean
+static void
gsk_matrix_transform_apply_translate (GskTransform *transform,
float *out_dx,
float *out_dy)
@@ -329,17 +343,17 @@ gsk_matrix_transform_apply_translate (GskTransform *transform,
case GSK_TRANSFORM_CATEGORY_2D:
case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
default:
- return FALSE;
+ g_assert_not_reached ();
+ break;
case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
*out_dx += graphene_matrix_get_value (&self->matrix, 3, 0);
*out_dy += graphene_matrix_get_value (&self->matrix, 3, 1);
- return TRUE;
+ break;
case GSK_TRANSFORM_CATEGORY_IDENTITY:
- return TRUE;
+ break;
}
- return TRUE;
}
static void
@@ -479,7 +493,7 @@ gsk_translate_transform_to_matrix (GskTransform *transform,
graphene_matrix_init_translate (out_matrix, &self->point);
}
-static gboolean
+static void
gsk_translate_transform_apply_2d (GskTransform *transform,
float *out_xx,
float *out_yx,
@@ -490,16 +504,13 @@ gsk_translate_transform_apply_2d (GskTransform *transform,
{
GskTranslateTransform *self = (GskTranslateTransform *) transform;
- if (self->point.z != 0.0)
- return FALSE;
+ g_assert (self->point.z == 0.0);
*out_dx += *out_xx * self->point.x + *out_xy * self->point.y;
*out_dy += *out_yx * self->point.x + *out_yy * self->point.y;
-
- return TRUE;
}
-static gboolean
+static void
gsk_translate_transform_apply_affine (GskTransform *transform,
float *out_scale_x,
float *out_scale_y,
@@ -508,29 +519,23 @@ gsk_translate_transform_apply_affine (GskTransform *transform,
{
GskTranslateTransform *self = (GskTranslateTransform *) transform;
- if (self->point.z != 0.0)
- return FALSE;
+ g_assert (self->point.z == 0.0);
*out_dx += *out_scale_x * self->point.x;
*out_dy += *out_scale_y * self->point.y;
-
- return TRUE;
}
-static gboolean
+static void
gsk_translate_transform_apply_translate (GskTransform *transform,
float *out_dx,
float *out_dy)
{
GskTranslateTransform *self = (GskTranslateTransform *) transform;
- if (self->point.z != 0.0)
- return FALSE;
+ g_assert (self->point.z == 0.0);
*out_dx += self->point.x;
*out_dy += self->point.y;
-
- return TRUE;
}
static GskTransform *
@@ -675,7 +680,7 @@ gsk_rotate_transform_to_matrix (GskTransform *transform,
0, 0);
}
-static gboolean
+static void
gsk_rotate_transform_apply_2d (GskTransform *transform,
float *out_xx,
float *out_yx,
@@ -688,7 +693,7 @@ gsk_rotate_transform_apply_2d (GskTransform *transform,
float s, c, rad, xx, xy, yx, yy;
if (fmodf (self->angle, 360.0f) == 0.0)
- return TRUE;
+ return;
rad = self->angle * G_PI / 180.0f;
s = sinf (rad);
@@ -703,26 +708,6 @@ gsk_rotate_transform_apply_2d (GskTransform *transform,
*out_yx = yx;
*out_xy = xy;
*out_yy = yy;
-
- return TRUE;
-}
-
-static gboolean
-gsk_rotate_transform_apply_affine (GskTransform *transform,
- float *out_scale_x,
- float *out_scale_y,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
-}
-
-static gboolean
-gsk_rotate_transform_apply_translate (GskTransform *transform,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
}
static GskTransform *
@@ -771,8 +756,8 @@ static const GskTransformClass GSK_ROTATE_TRANSFORM_CLASS =
gsk_rotate_transform_finalize,
gsk_rotate_transform_to_matrix,
gsk_rotate_transform_apply_2d,
- gsk_rotate_transform_apply_affine,
- gsk_rotate_transform_apply_translate,
+ NULL,
+ NULL,
gsk_rotate_transform_print,
gsk_rotate_transform_apply,
gsk_rotate_transform_invert,
@@ -827,36 +812,6 @@ gsk_rotate3d_transform_to_matrix (GskTransform *transform,
graphene_matrix_init_rotate (out_matrix, self->angle, &self->axis);
}
-static gboolean
-gsk_rotate3d_transform_apply_2d (GskTransform *transform,
- float *out_xx,
- float *out_yx,
- float *out_xy,
- float *out_yy,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
-}
-
-static gboolean
-gsk_rotate3d_transform_apply_affine (GskTransform *transform,
- float *out_scale_x,
- float *out_scale_y,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
-}
-
-static gboolean
-gsk_rotate3d_transform_apply_translate (GskTransform *transform,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
-}
-
static GskTransform *
gsk_rotate3d_transform_apply (GskTransform *transform,
GskTransform *apply_to)
@@ -911,9 +866,9 @@ static const GskTransformClass GSK_ROTATE3D_TRANSFORM_CLASS =
"GskRotate3dTransform",
gsk_rotate3d_transform_finalize,
gsk_rotate3d_transform_to_matrix,
- gsk_rotate3d_transform_apply_2d,
- gsk_rotate3d_transform_apply_affine,
- gsk_rotate3d_transform_apply_translate,
+ NULL,
+ NULL,
+ NULL,
gsk_rotate3d_transform_print,
gsk_rotate3d_transform_apply,
gsk_rotate3d_transform_invert,
@@ -979,7 +934,7 @@ gsk_scale_transform_to_matrix (GskTransform *transform,
graphene_matrix_init_scale (out_matrix, self->factor_x, self->factor_y, self->factor_z);
}
-static gboolean
+static void
gsk_scale_transform_apply_2d (GskTransform *transform,
float *out_xx,
float *out_yx,
@@ -990,18 +945,15 @@ gsk_scale_transform_apply_2d (GskTransform *transform,
{
GskScaleTransform *self = (GskScaleTransform *) transform;
- if (self->factor_z != 1.0)
- return FALSE;
+ g_assert (self->factor_z == 1.0);
*out_xx *= self->factor_x;
*out_yx *= self->factor_x;
*out_xy *= self->factor_y;
*out_yy *= self->factor_y;
-
- return TRUE;
}
-static gboolean
+static void
gsk_scale_transform_apply_affine (GskTransform *transform,
float *out_scale_x,
float *out_scale_y,
@@ -1010,21 +962,10 @@ gsk_scale_transform_apply_affine (GskTransform *transform,
{
GskScaleTransform *self = (GskScaleTransform *) transform;
- if (self->factor_z != 1.0)
- return FALSE;
+ g_assert (self->factor_z == 1.0);
*out_scale_x *= self->factor_x;
*out_scale_y *= self->factor_y;
-
- return TRUE;
-}
-
-static gboolean
-gsk_scale_transform_apply_translate (GskTransform *transform,
- float *out_dx,
- float *out_dy)
-{
- return FALSE;
}
static GskTransform *
@@ -1097,7 +1038,7 @@ static const GskTransformClass GSK_SCALE_TRANSFORM_CLASS =
gsk_scale_transform_to_matrix,
gsk_scale_transform_apply_2d,
gsk_scale_transform_apply_affine,
- gsk_scale_transform_apply_translate,
+ NULL,
gsk_scale_transform_print,
gsk_scale_transform_apply,
gsk_scale_transform_invert,
@@ -1284,7 +1225,7 @@ gsk_transform_to_matrix (GskTransform *self,
/**
* gsk_transform_to_2d:
- * @m: a #GskTransform
+ * @m: a 2D #GskTransform
* @out_xx: (out): return location for the xx member
* @out_yx: (out): return location for the yx member
* @out_xy: (out): return location for the xy member
@@ -1293,7 +1234,10 @@ gsk_transform_to_matrix (GskTransform *self,
* @out_dy: (out): return location for the y0 member
*
* Converts a #GskTransform to a 2D transformation
- * matrix, if the given matrix is compatible.
+ * matrix.
+ * @self must be a 2D transformation. If you are not
+ * sure, use gsk_transform_get_category() >=
+ * %GSK_TRANSFORM_CATEGORY_2D to check.
*
* The returned values have the following layout:
*
@@ -1310,7 +1254,7 @@ gsk_transform_to_matrix (GskTransform *self,
* Returns: %TRUE if the matrix is compatible with an 2D
* transformation matrix.
*/
-gboolean
+void
gsk_transform_to_2d (GskTransform *self,
float *out_xx,
float *out_yx,
@@ -1319,32 +1263,38 @@ gsk_transform_to_2d (GskTransform *self,
float *out_dx,
float *out_dy)
{
- if (self == NULL)
+ if (self == NULL ||
+ self->category < GSK_TRANSFORM_CATEGORY_2D)
{
+ if (self != NULL)
+ {
+ char *s = gsk_transform_to_string (self);
+ g_warning ("Given transform \"%s\" is not a 2D transform.", s);
+ g_free (s);
+ }
*out_xx = 1.0f;
*out_yx = 0.0f;
*out_xy = 0.0f;
*out_yy = 1.0f;
*out_dx = 0.0f;
*out_dy = 0.0f;
- return TRUE;
+ return;
}
- if (!gsk_transform_to_2d (self->next,
- out_xx, out_yx,
- out_xy, out_yy,
- out_dx, out_dy))
- return FALSE;
+ gsk_transform_to_2d (self->next,
+ out_xx, out_yx,
+ out_xy, out_yy,
+ out_dx, out_dy);
- return self->transform_class->apply_2d (self,
- out_xx, out_yx,
- out_xy, out_yy,
- out_dx, out_dy);
+ self->transform_class->apply_2d (self,
+ out_xx, out_yx,
+ out_xy, out_yy,
+ out_dx, out_dy);
}
/**
* gsk_transform_to_affine:
- * @m: a #GskTransform
+ * @self: a #GskTransform
* @out_scale_x: (out): return location for the scale
* factor in the x direction
* @out_scale_y: (out): return location for the scale
@@ -1355,35 +1305,41 @@ gsk_transform_to_2d (GskTransform *self,
* in the y direction
*
* Converts a #GskTransform to 2D affine transformation
- * factors, if the given matrix is compatible.
- *
- * Returns: %TRUE if the matrix is compatible with an 2D
- * affine transformation.
+ * factors.
+ * @self must be a 2D transformation. If you are not
+ * sure, use gsk_transform_get_category() >=
+ * %GSK_TRANSFORM_CATEGORY_2D_AFFINE to check.
*/
-gboolean
+void
gsk_transform_to_affine (GskTransform *self,
float *out_scale_x,
float *out_scale_y,
float *out_dx,
float *out_dy)
{
- if (self == NULL)
+ if (self == NULL ||
+ self->category < GSK_TRANSFORM_CATEGORY_2D_AFFINE)
{
+ if (self != NULL)
+ {
+ char *s = gsk_transform_to_string (self);
+ g_warning ("Given transform \"%s\" is not an affine 2D transform.", s);
+ g_free (s);
+ }
*out_scale_x = 1.0f;
*out_scale_y = 1.0f;
*out_dx = 0.0f;
*out_dy = 0.0f;
- return TRUE;
+ return;
}
- if (!gsk_transform_to_affine (self->next,
- out_scale_x, out_scale_y,
- out_dx, out_dy))
- return FALSE;
+ gsk_transform_to_affine (self->next,
+ out_scale_x, out_scale_y,
+ out_dx, out_dy);
- return self->transform_class->apply_affine (self,
- out_scale_x, out_scale_y,
- out_dx, out_dy);
+ self->transform_class->apply_affine (self,
+ out_scale_x, out_scale_y,
+ out_dx, out_dy);
}
/**
@@ -1394,30 +1350,35 @@ gsk_transform_to_affine (GskTransform *self,
* @out_dy: (out): return location for the translation
* in the y direction
*
- * Converts a #GskTransform to a translation operation,
- * if the given matrix is compatible.
- *
- * Returns: %TRUE if the matrix is compatible with a
- * translation transformation.
+ * Converts a #GskTransform to a translation operation.
+ * @self must be a 2D transformation. If you are not
+ * sure, use gsk_transform_get_category() >=
+ * %GSK_TRANSFORM_CATEGORY_2D_TRANSLATE to check.
*/
-gboolean
+void
gsk_transform_to_translate (GskTransform *self,
float *out_dx,
float *out_dy)
{
- if (self == NULL)
+ if (self == NULL ||
+ self->category < GSK_TRANSFORM_CATEGORY_2D_TRANSLATE)
{
+ if (self != NULL)
+ {
+ char *s = gsk_transform_to_string (self);
+ g_warning ("Given transform \"%s\" is not a 2D translation.", s);
+ g_free (s);
+ }
*out_dx = 0.0f;
*out_dy = 0.0f;
- return TRUE;
+ return;
}
- if (!gsk_transform_to_translate (self->next,
- out_dx, out_dy))
- return FALSE;
+ gsk_transform_to_translate (self->next,
+ out_dx, out_dy);
- return self->transform_class->apply_translate (self,
- out_dx, out_dy);
+ self->transform_class->apply_translate (self,
+ out_dx, out_dy);
}
/**
diff --git a/gsk/gsktransform.h b/gsk/gsktransform.h
index 4a90b1308b..19552a0add 100644
--- a/gsk/gsktransform.h
+++ b/gsk/gsktransform.h
@@ -49,23 +49,23 @@ GDK_AVAILABLE_IN_ALL
void gsk_transform_to_matrix (GskTransform *self,
graphene_matrix_t *out_matrix);
GDK_AVAILABLE_IN_ALL
-gboolean gsk_transform_to_2d (GskTransform *self,
+void gsk_transform_to_2d (GskTransform *self,
float *out_xx,
float *out_yx,
float *out_xy,
float *out_yy,
float *out_dx,
- float *out_dy) G_GNUC_WARN_UNUSED_RESULT;
+ float *out_dy);
GDK_AVAILABLE_IN_ALL
-gboolean gsk_transform_to_affine (GskTransform *self,
+void gsk_transform_to_affine (GskTransform *self,
float *out_scale_x,
float *out_scale_y,
float *out_dx,
- float *out_dy) G_GNUC_WARN_UNUSED_RESULT;
+ float *out_dy);
GDK_AVAILABLE_IN_ALL
-gboolean gsk_transform_to_translate (GskTransform *self,
+void gsk_transform_to_translate (GskTransform *self,
float *out_dx,
- float *out_dy) G_GNUC_WARN_UNUSED_RESULT;
+ float *out_dy);
GDK_AVAILABLE_IN_ALL
GskTransformCategory gsk_transform_get_category (GskTransform *self) G_GNUC_PURE;