[gtk] Improve the font rendering demo



commit 0820a79bf58da4c6fd146f613a96e2d368c13c02
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jul 25 18:49:00 2019 -0400

    Improve the font rendering demo
    
    Show the pixel grid, extents, and baseline.

 demos/gtk-demo/fontrendering.c | 60 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 54 insertions(+), 6 deletions(-)
---
diff --git a/demos/gtk-demo/fontrendering.c b/demos/gtk-demo/fontrendering.c
index 4778f4aced..17df1a4667 100644
--- a/demos/gtk-demo/fontrendering.c
+++ b/demos/gtk-demo/fontrendering.c
@@ -32,6 +32,7 @@ update_image (void)
   PangoFontDescription *desc;
   PangoLayout *layout;
   PangoRectangle ink, logical;
+  int baseline;
   cairo_surface_t *surface;
   cairo_t *cr;
   GdkPixbuf *pixbuf;
@@ -40,6 +41,7 @@ update_image (void)
   cairo_font_options_t *fopt;
   cairo_hint_style_t hintstyle;
   cairo_hint_metrics_t hintmetrics;
+  int i;
 
   if (!context)
     context = gtk_widget_create_pango_context (image);
@@ -77,19 +79,64 @@ update_image (void)
       pango_layout_set_font_description (layout, desc);
       pango_layout_set_text (layout, text, -1);
       pango_layout_get_extents (layout, &ink, &logical);
+      baseline = pango_layout_get_baseline (layout);
 
-      pango_extents_to_pixels (&logical, NULL);
+      pango_extents_to_pixels (&ink, NULL);
 
-      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, logical.width, logical.height);
+      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ink.width + 20, ink.height + 20);
       cr = cairo_create (surface);
       cairo_set_source_rgb (cr, 1, 1, 1);
       cairo_paint (cr);
 
       cairo_set_source_rgb (cr, 0, 0, 0);
+      cairo_move_to (cr, 10, 10);
       pango_cairo_show_layout (cr, layout);
 
       cairo_destroy (cr);
       g_object_unref (layout);
+
+      pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, cairo_image_surface_get_width (surface), 
cairo_image_surface_get_height (surface));
+      pixbuf2 = gdk_pixbuf_scale_simple (pixbuf, gdk_pixbuf_get_width (pixbuf) * scale, 
gdk_pixbuf_get_height (pixbuf) * scale, GDK_INTERP_NEAREST);
+
+      g_object_unref (pixbuf);
+      cairo_surface_destroy (surface);
+
+      surface = cairo_image_surface_create_for_data (gdk_pixbuf_get_pixels (pixbuf2),
+                                                     CAIRO_FORMAT_ARGB32,
+                                                     gdk_pixbuf_get_width (pixbuf2),
+                                                     gdk_pixbuf_get_height (pixbuf2),
+                                                     gdk_pixbuf_get_rowstride (pixbuf2));
+
+      cr = cairo_create (surface);
+      cairo_set_line_width (cr, 1);
+
+      cairo_set_source_rgba (cr, 0.2, 0, 0, 0.2);
+      for (i = 1; i < ink.height + 20; i++)
+        {
+          cairo_move_to (cr, 0, scale * i - 0.5);
+          cairo_line_to (cr, scale * (ink.width + 20), scale * i - 0.5);
+          cairo_stroke (cr);
+        }
+      for (i = 1; i < ink.width + 20; i++)
+        {
+          cairo_move_to (cr, scale * i - 0.5, 0);
+          cairo_line_to (cr, scale * i - 0.5, scale * (ink.height + 20));
+          cairo_stroke (cr);
+        }
+
+      cairo_set_source_rgba (cr, 0, 0, 1, 1);
+      cairo_rectangle (cr,
+                       scale * (10 + (double)logical.x / PANGO_SCALE) - 0.5,
+                       scale * (10 + (double)logical.y / PANGO_SCALE) - 0.5,
+                       scale * ((double)logical.width / PANGO_SCALE) + 1,
+                       scale * ((double)logical.height / PANGO_SCALE) + 1);
+      cairo_stroke (cr);
+      cairo_move_to (cr, scale * (10 + (double)logical.x / PANGO_SCALE) - 0.5,
+                         scale * (10 + baseline / PANGO_SCALE) - 0.5);
+      cairo_line_to (cr, scale * (10 + (double)(logical.x + logical.width) / PANGO_SCALE) + 1,
+                         scale * (10 + baseline / PANGO_SCALE) - 0.5);
+      cairo_stroke (cr);
+      cairo_surface_destroy (surface);
     }
   else
     {
@@ -135,17 +182,18 @@ update_image (void)
       cairo_destroy (cr);
       pango_layout_iter_free (iter);
       g_object_unref (layout);
+
+      pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, cairo_image_surface_get_width (surface), 
cairo_image_surface_get_height (surface));
+      pixbuf2 = gdk_pixbuf_scale_simple (pixbuf, gdk_pixbuf_get_width (pixbuf) * scale, 
gdk_pixbuf_get_height (pixbuf) * scale, GDK_INTERP_NEAREST);
+      g_object_unref (pixbuf);
+      cairo_surface_destroy (surface);
     }
 
-  pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, cairo_image_surface_get_width (surface), 
cairo_image_surface_get_height (surface));
-  pixbuf2 = gdk_pixbuf_scale_simple (pixbuf, gdk_pixbuf_get_width (pixbuf) * scale, gdk_pixbuf_get_height 
(pixbuf) * scale, GDK_INTERP_NEAREST);
 
   gtk_picture_set_pixbuf (GTK_PICTURE (image), pixbuf2);
 
-  g_object_unref (pixbuf);
   g_object_unref (pixbuf2);
 
-  cairo_surface_destroy (surface);
   pango_font_description_free (desc);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]