[gtk+/wip/matthiasc/gskpango: 14/15] implement draw_shape better
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/gskpango: 14/15] implement draw_shape better
- Date: Thu, 31 Aug 2017 02:10:39 +0000 (UTC)
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]