GskTransform: Add gsk_transform_transform_point()
authorTimm Bäder <mail@baedert.org>
Tue, 21 Jan 2020 08:41:54 +0000 (09:41 +0100)
committerTimm Bäder <mail@baedert.org>
Fri, 24 Jan 2020 05:19:12 +0000 (06:19 +0100)
Equivalent of gsk_transform_transform_bounds() and
graphene_matrix_transform_point() respectively.

docs/reference/gsk/gsk4-sections.txt
gsk/gsktransform.c
gsk/gsktransform.h

index 0f464bd195fd0d35f2b75a813089d6a0d2ebc5a0..201840b5c275b80d34b1ae357e200ec1e760013b 100644 (file)
@@ -183,6 +183,7 @@ gsk_transform_perspective
 gsk_transform_equal
 <SUBSECTION>
 gsk_transform_transform_bounds
+gsk_transform_transform_point
 <SUBSECTION Private>
 GSK_TYPE_TRANSFORM
 gsk_transform_get_type
index 388dad5b45366dcae957064b621c726142c191b8..5d9d538d4cbad56540508d9e6daf5561c588cb8d 100644 (file)
@@ -1773,6 +1773,62 @@ gsk_transform_transform_bounds (GskTransform          *self,
     }
 }
 
+/**
+ * gsk_transform_transform_point:
+ * @self: a #GskTransform
+ * @point: a #graphene_point_t
+ * @out_point: (out caller-allocates): return location for
+ *   the transformed point
+ *
+ * Transforms a #graphene_point_t using the given transform @self.
+ */
+void
+gsk_transform_transform_point (GskTransform           *self,
+                               const graphene_point_t *point,
+                               graphene_point_t       *out_point)
+{
+  switch (gsk_transform_get_category (self))
+    {
+    case GSK_TRANSFORM_CATEGORY_IDENTITY:
+      *out_point = *point;
+      break;
+
+    case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
+      {
+        float dx, dy;
+
+        gsk_transform_to_translate (self, &dx, &dy);
+        out_point->x = point->x + dx;
+        out_point->y = point->y + dy;
+      }
+    break;
+
+    case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
+      {
+        float dx, dy, scale_x, scale_y;
+
+        gsk_transform_to_affine (self, &scale_x, &scale_y, &dx, &dy);
+
+        out_point->x = (point->x * scale_x) + dx;
+        out_point->y = (point->y * scale_y) + dy;
+      }
+    break;
+
+    case GSK_TRANSFORM_CATEGORY_UNKNOWN:
+    case GSK_TRANSFORM_CATEGORY_ANY:
+    case GSK_TRANSFORM_CATEGORY_3D:
+    case GSK_TRANSFORM_CATEGORY_2D:
+    default:
+      {
+        graphene_matrix_t mat;
+
+        gsk_transform_to_matrix (self, &mat);
+        graphene_matrix_transform_point (&mat, point, out_point);
+      }
+      break;
+    }
+}
+
 static guint
 gsk_transform_parse_float (GtkCssParser *parser,
                            guint         n,
index 56cafcc4306be87001e6f21fe5b691610f538df6..f3676bca631cf0d393dcf969de5124b14a093a66 100644 (file)
@@ -116,6 +116,11 @@ GDK_AVAILABLE_IN_ALL
 void                    gsk_transform_transform_bounds          (GskTransform                   *self,
                                                                  const graphene_rect_t          *rect,
                                                                  graphene_rect_t                *out_rect);
+GDK_AVAILABLE_IN_ALL
+void                    gsk_transform_transform_point           (GskTransform                   *self,
+                                                                 const graphene_point_t          *point,
+                                                                 graphene_point_t                *out_point);
+
 
 G_END_DECLS