[gtk+/wip/matthiasc/gskpango: 14/15] implement draw_shape better



commit 3edb9b47177d224ec0fa64d534dff2035baa01ab
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Aug 30 21:59:20 2017 -0400

    implement draw_shape better

 gtk/gskpango.c |  148 +++++++-------------------------------------------------
 1 files changed, 18 insertions(+), 130 deletions(-)
---
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index 7fcac85..e526682 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -60,7 +60,6 @@ struct _GskPangoRenderer
 
   /* house-keeping options */
   gboolean is_cached_renderer;
-  gboolean cr_had_current_point;
 
   graphene_rect_t bounds;
 };
@@ -118,59 +117,6 @@ set_color (GskPangoRenderer *crenderer,
     gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
 }
 
-/* note: modifies cr without doing cairo_save/restore() */
-static void
-gsk_pango_renderer_draw_frame (cairo_t  *cr,
-                               double    x,
-                               double    y,
-                               double    width,
-                               double    height,
-                               double    line_width,
-                               gboolean  invalid)
-{
-      cairo_rectangle (cr, x, y, width, height);
-
-      if (invalid)
-        {
-          /* draw an X */
-
-          cairo_new_sub_path (cr);
-          cairo_move_to (cr, x, y);
-          cairo_rel_line_to (cr, width, height);
-
-          cairo_new_sub_path (cr);
-          cairo_move_to (cr, x + width, y);
-          cairo_rel_line_to (cr, -width, height);
-
-          cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
-        }
-
-      cairo_set_line_width (cr, line_width);
-      cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
-      cairo_set_miter_limit (cr, 2.);
-      cairo_stroke (cr);
-}
-
-static void
-gsk_pango_renderer_draw_box_glyph (cairo_t       *cr,
-                                   PangoGlyphInfo     *gi,
-                                   double              cx,
-                                   double              cy,
-                                   gboolean            invalid)
-{
-  cairo_save (cr);
-
-  gsk_pango_renderer_draw_frame (cr,
-                                 cx + 1.5,
-                                 cy + 1.5 - PANGO_UNKNOWN_GLYPH_HEIGHT,
-                                 (double)gi->geometry.width / PANGO_SCALE - 3.0,
-                                 PANGO_UNKNOWN_GLYPH_HEIGHT - 3.0,
-                                 1.0,
-                                 invalid);
-
-  cairo_restore (cr);
-}
-
 static gboolean
 _pango_cairo_font_install (PangoFont *font,
                            cairo_t   *cr)
@@ -192,77 +138,21 @@ gsk_pango_renderer_draw_unknown_glyph (GskPangoRenderer *crenderer,
                                        double              cx,
                                        double              cy)
 {
-  char buf[7];
-  double x0, y0;
-  int row, col;
-  int rows, cols;
-  double width, lsb;
-  char hexbox_string[2] = {0, 0};
-  PangoCairoFontHexBoxInfo *hbi;
-  gunichar ch;
-  gboolean invalid_input;
   cairo_t *cr;
+  PangoGlyphString *glyphs;
 
   cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawUnknownGlyph<%u>", 
gi->glyph);
 
   gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
 
-  ch = gi->glyph & ~PANGO_GLYPH_UNKNOWN_FLAG;
-  invalid_input = G_UNLIKELY (gi->glyph == PANGO_GLYPH_INVALID_INPUT || ch > 0x10FFFF);
+  cairo_move_to (cr, cx, cy);
 
-  //hbi = pango_cairo_font_get_hex_box_info ((PangoCairoFont *)font);
-  hbi = NULL; // FIXME
-  if (!hbi || !_pango_cairo_font_install ((PangoFont *)(hbi->font), cr))
-    {
-      gsk_pango_renderer_draw_box_glyph (cr, gi, cx, cy, invalid_input);
-      goto done;
-    }
+  glyphs = pango_glyph_string_new ();
+  pango_glyph_string_set_size (glyphs, 1);
+  glyphs->glyphs[0] = *gi;
 
-  rows = hbi->rows;
-  if (G_UNLIKELY (invalid_input))
-    {
-      cols = 1;
-    }
-  else
-    {
-      cols = (ch > 0xffff ? 6 : 4) / rows;
-      g_snprintf (buf, sizeof(buf), (ch > 0xffff) ? "%06X" : "%04X", ch);
-    }
-
-  width = (3 * hbi->pad_x + cols * (hbi->digit_width + hbi->pad_x));
-  lsb = ((double)gi->geometry.width / PANGO_SCALE - width) * .5;
-  lsb = floor (lsb / hbi->pad_x) * hbi->pad_x;
-
-  gsk_pango_renderer_draw_frame (cr,
-                                 cx + lsb + .5 * hbi->pad_x,
-                                 cy + hbi->box_descent - hbi->box_height + hbi->pad_y * 0.5,
-                                 width - hbi->pad_x,
-                                 (hbi->box_height - hbi->pad_y),
-                                 hbi->line_width,
-                                 invalid_input);
-
-  if (invalid_input)
-    goto done;
-
-  x0 = cx + lsb + hbi->pad_x * 2;
-  y0 = cy + hbi->box_descent - hbi->pad_y * 2;
-
-  for (row = 0; row < rows; row++)
-    {
-      double y = y0 - (rows - 1 - row) * (hbi->digit_height + hbi->pad_y);
-      for (col = 0; col < cols; col++)
-        {
-          double x = x0 + col * (hbi->digit_width + hbi->pad_x);
-
-          cairo_move_to (cr, x, y);
-
-          hexbox_string[0] = buf[row * cols + col];
+  pango_cairo_show_glyph_string (cr, font, glyphs);
 
-          cairo_show_text (cr, hexbox_string);
-        }
-    }
-
-done:
   cairo_destroy (cr);
 }
 
@@ -611,24 +501,24 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
 
 static void
 gsk_pango_renderer_draw_shape (PangoRenderer  *renderer,
-                                 PangoAttrShape *attr,
-                                 int             x,
-                                 int             y)
+                               PangoAttrShape *attr,
+                               int             x,
+                               int             y)
 {
-#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
-  cairo_t *cr = crenderer->cr;
+  cairo_t *cr;
   PangoLayout *layout;
-  GskPangoShapeRendererFunc shape_renderer;
-  gpointer                    shape_renderer_data;
+  PangoCairoShapeRendererFunc shape_renderer;
+  gpointer shape_renderer_data;
   double base_x, base_y;
 
-  layout = pango_renderer_get_layout (renderer);
+  cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawShape");
 
+  layout = pango_renderer_get_layout (renderer);
   if (!layout)
-        return;
+    return;
 
-  shape_renderer = gsk_pango_context_get_shape_renderer (pango_layout_get_context (layout),
+  shape_renderer = pango_cairo_context_get_shape_renderer (pango_layout_get_context (layout),
                                                            &shape_renderer_data);
 
   if (!shape_renderer)
@@ -637,15 +527,13 @@ gsk_pango_renderer_draw_shape (PangoRenderer  *renderer,
   base_x = crenderer->x_offset + (double)x / PANGO_SCALE;
   base_y = crenderer->y_offset + (double)y / PANGO_SCALE;
 
-  cairo_save (cr);
-  set_color (crenderer, PANGO_RENDER_PART_FOREGROUND);
+  set_color (crenderer, PANGO_RENDER_PART_FOREGROUND, cr);
 
   cairo_move_to (cr, base_x, base_y);
 
   shape_renderer (cr, attr, FALSE, shape_renderer_data);
 
-  cairo_restore (cr);
-#endif
+  cairo_destroy (cr);
 }
 
 static void


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