summaryrefslogtreecommitdiff
path: root/gsk/gskrendernodeimpl.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-09-03 07:15:52 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-09-03 12:43:35 -0400
commitf1347f5841ea526c7016a8fbd329b45001812a23 (patch)
tree6652a054c60493462bb4287118b3cc0e79741ebf /gsk/gskrendernodeimpl.c
parentf3ccf62463019ef0ec0e79f304056895a47d4f4e (diff)
downloadgtk+-f1347f5841ea526c7016a8fbd329b45001812a23.tar.gz
gsk: Add font options to text nodes
Since font options affect how the glyphs get rendered, we need to pass the font options down from the gtk level to where the glyph cache is populated. Add a new gsk_text_node_new_full api that takes a cairo_font_options_t in addition to the other parameters.
Diffstat (limited to 'gsk/gskrendernodeimpl.c')
-rw-r--r--gsk/gskrendernodeimpl.c159
1 files changed, 139 insertions, 20 deletions
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index 30ef0ff38b..8a4c003a5a 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -4336,7 +4336,10 @@ struct _GskTextNode
GskRenderNode render_node;
PangoFont *font;
- gboolean has_color_glyphs;
+ guint has_color_glyphs : 1;
+ guint hint_metrics : 1;
+ guint antialias : 1;
+ guint hint_style : 3;
GdkRGBA color;
graphene_point_t offset;
@@ -4363,6 +4366,7 @@ gsk_text_node_draw (GskRenderNode *node,
{
GskTextNode *self = (GskTextNode *) node;
PangoGlyphString glyphs;
+ cairo_font_options_t *options;
glyphs.num_glyphs = self->num_glyphs;
glyphs.glyphs = self->glyphs;
@@ -4370,6 +4374,13 @@ gsk_text_node_draw (GskRenderNode *node,
cairo_save (cr);
+ options = cairo_font_options_create ();
+ cairo_font_options_set_hint_metrics (options, self->hint_metrics ? CAIRO_HINT_METRICS_ON : CAIRO_HINT_METRICS_OFF);
+ cairo_font_options_set_antialias (options, self->antialias ? CAIRO_ANTIALIAS_GRAY : CAIRO_ANTIALIAS_NONE);
+ cairo_font_options_set_hint_style (options, self->hint_style);
+ cairo_set_font_options (cr, options);
+ cairo_font_options_destroy (options);
+
gdk_cairo_set_source_rgba (cr, &self->color);
cairo_translate (cr, self->offset.x, self->offset.y);
pango_cairo_show_glyph_string (cr, self->font, &glyphs);
@@ -4424,25 +4435,12 @@ gsk_text_node_diff (GskRenderNode *node1,
gsk_render_node_diff_impossible (node1, node2, region);
}
-/**
- * gsk_text_node_new:
- * @font: the `PangoFont` containing the glyphs
- * @glyphs: the `PangoGlyphString` to render
- * @color: the foreground color to render with
- * @offset: offset of the baseline
- *
- * Creates a render node that renders the given glyphs.
- *
- * Note that @color may not be used if the font contains
- * color glyphs.
- *
- * Returns: (nullable) (transfer full) (type GskTextNode): a new `GskRenderNode`
- */
-GskRenderNode *
-gsk_text_node_new (PangoFont *font,
- PangoGlyphString *glyphs,
- const GdkRGBA *color,
- const graphene_point_t *offset)
+static GskRenderNode *
+gsk_text_node_new_internal (const cairo_font_options_t *options,
+ PangoFont *font,
+ PangoGlyphString *glyphs,
+ const GdkRGBA *color,
+ const graphene_point_t *offset)
{
GskTextNode *self;
GskRenderNode *node;
@@ -4464,6 +4462,16 @@ gsk_text_node_new (PangoFont *font,
self->color = *color;
self->offset = *offset;
self->has_color_glyphs = FALSE;
+ self->antialias = TRUE;
+ self->hint_style = CAIRO_HINT_STYLE_NONE;
+ self->hint_metrics = FALSE;
+
+ if (options)
+ {
+ self->antialias = cairo_font_options_get_antialias (options) != CAIRO_ANTIALIAS_NONE;
+ self->hint_metrics = cairo_font_options_get_hint_metrics (options) == CAIRO_HINT_METRICS_ON;
+ self->hint_style = cairo_font_options_get_hint_style (options);
+ }
glyph_infos = g_malloc_n (glyphs->num_glyphs, sizeof (PangoGlyphInfo));
@@ -4495,6 +4503,117 @@ gsk_text_node_new (PangoFont *font,
}
/**
+ * gsk_text_node_new_with_font_options:
+ * @options: `cairo_font_options_t` to render with
+ * @font: the `PangoFont` containing the glyphs
+ * @glyphs: the `PangoGlyphString` to render
+ * @color: the foreground color to render with
+ * @offset: offset of the baseline
+ *
+ * Creates a render node that renders the given glyphs.
+ *
+ * Note that @color may not be used if the font contains
+ * color glyphs.
+ *
+ * Returns: (nullable) (transfer full) (type GskTextNode): a new `GskRenderNode`
+ *
+ * Since: 4.6
+ */
+GskRenderNode *
+gsk_text_node_new_with_font_options (const cairo_font_options_t *options,
+ PangoFont *font,
+ PangoGlyphString *glyphs,
+ const GdkRGBA *color,
+ const graphene_point_t *offset)
+{
+ return gsk_text_node_new_internal (options, font, glyphs, color, offset);
+}
+
+/**
+ * gsk_text_node_new:
+ * @font: the `PangoFont` containing the glyphs
+ * @glyphs: the `PangoGlyphString` to render
+ * @color: the foreground color to render with
+ * @offset: offset of the baseline
+ *
+ * Creates a render node that renders the given glyphs.
+ *
+ * Note that @color may not be used if the font contains
+ * color glyphs.
+ *
+ * Returns: (nullable) (transfer full) (type GskTextNode): a new `GskRenderNode`
+ */
+GskRenderNode *
+gsk_text_node_new (PangoFont *font,
+ PangoGlyphString *glyphs,
+ const GdkRGBA *color,
+ const graphene_point_t *offset)
+{
+ return gsk_text_node_new_internal (NULL, font, glyphs, color, offset);
+}
+
+/**
+ * gsk_text_node_get_hint_metrics:
+ * @node: (type GskTextNode): a text `GskRenderNode`
+ *
+ * Retrieves whether metrics hinting is enabled for rendering.
+ *
+ * See the cairo [documentation](https://www.cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-hint-metrics-t).
+ *
+ * Returns: whether metrics hinting is enabled
+ *
+ * Since: 4.6
+ */
+gboolean
+gsk_text_node_get_hint_metrics (const GskRenderNode *node)
+{
+ const GskTextNode *self = (const GskTextNode *) node;
+
+ return self->hint_metrics;
+}
+
+/**
+ * gsk_text_node_get_antialias:
+ * @node: (type GskTextNode): a text `GskRenderNode`
+ *
+ * Retrieves whether antialiasing is enabled for rendering.
+ *
+ * See the cairo [documentation](https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t).
+ * Note that GSK only supports grayscale antialiasing.
+ *
+ * Returns: whether antialiasing is enabled
+ *
+ * Since: 4.6
+ */
+gboolean
+gsk_text_node_get_antialias (const GskRenderNode *node)
+{
+ const GskTextNode *self = (const GskTextNode *) node;
+
+ return self->antialias;
+}
+
+/**
+ * gsk_text_node_get_hint_style:
+ * @node: (type GskTextNode): a text `GskRenderNode`
+ *
+ * Retrieves what style of font hinting is used for rendering.
+ *
+ * See the cairo [documentation](https://www.cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-hint-style-t).
+ *
+ * Returns: what style of hinting is used
+ *
+ * Since: 4.6
+ */
+cairo_hint_style_t
+gsk_text_node_get_hint_style (const GskRenderNode *node)
+{
+ const GskTextNode *self = (const GskTextNode *) node;
+
+ return self->hint_style;
+}
+
+/**
* gsk_text_node_get_color:
* @node: (type GskTextNode): a text `GskRenderNode`
*