diff options
author | Benjamin Otte <otte@redhat.com> | 2019-03-04 19:33:04 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2019-03-04 23:41:51 +0100 |
commit | bd113aa85cd011edd11874c4e2d9353898d8f793 (patch) | |
tree | fa7ce7392574036f2f59db79a6817d777e9dba20 /gsk | |
parent | 1fecbd4241529197984ed1c717fdf91f0bb8337b (diff) | |
download | gtk+-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.c | 5 | ||||
-rw-r--r-- | gsk/gskrendernodeimpl.c | 26 | ||||
-rw-r--r-- | gsk/gsktransform.c | 271 | ||||
-rw-r--r-- | gsk/gsktransform.h | 12 |
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; |