rendernodepaintable: Provide accurate aspect ratio
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Sep 2021 13:28:12 +0000 (09:28 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Sep 2021 14:28:49 +0000 (10:28 -0400)
Since we report width and height as integers, the
default implementation of this introduces rounding
errors. This shows up in the node-editor, as having
uneven scale factors like sx=1.0 and sy=1.0035.
Text nodes don't handle uneven scales like that well
and overdraw.

gtk/gtkrendernodepaintable.c

index a7771872477c948f7cc7805b2e4ce7a8afafbbdc..bbe9cc5b13be5f724eaa81ca330a7fa43b6ef7f7 100644 (file)
@@ -87,6 +87,17 @@ gtk_render_node_paintable_paintable_get_intrinsic_height (GdkPaintable *paintabl
   return ceilf (self->bounds.size.height);
 }
 
+static double
+gtk_render_node_paintable_paintable_get_intrinsic_aspect_ratio (GdkPaintable *paintable)
+{
+  GtkRenderNodePaintable *self = GTK_RENDER_NODE_PAINTABLE (paintable);
+
+  if (self->bounds.size.height != 0)
+    return self->bounds.size.width / self->bounds.size.height;
+
+  return 0;
+}
+
 static void
 gtk_render_node_paintable_paintable_init (GdkPaintableInterface *iface)
 {
@@ -94,6 +105,7 @@ gtk_render_node_paintable_paintable_init (GdkPaintableInterface *iface)
   iface->get_flags = gtk_render_node_paintable_paintable_get_flags;
   iface->get_intrinsic_width = gtk_render_node_paintable_paintable_get_intrinsic_width;
   iface->get_intrinsic_height = gtk_render_node_paintable_paintable_get_intrinsic_height;
+  iface->get_intrinsic_aspect_ratio = gtk_render_node_paintable_paintable_get_intrinsic_aspect_ratio;
 }
 
 G_DEFINE_TYPE_EXTENDED (GtkRenderNodePaintable, gtk_render_node_paintable, G_TYPE_OBJECT, 0,