2007-10-24 Behdad Esfahbod <behdad@gnome.org>
+ Bug 472629 – Add pango_renderer_get_layout(_line)
+
+ * pango/pango-renderer.h:
+ * pango/pango-renderer.c:
+ New public API:
+
+ pango_renderer_get_layout()
+ pango_renderer_get_layout_line()
+
+ * pango/pangocairo-render.c (pango_cairo_renderer_draw_shape),
+ (release_renderer), (_pango_cairo_do_layout_line),
+ (_pango_cairo_do_layout): Use above API to simplify
+ shape_renderer implementation.
+
+ * pango/pango.def:
+ * docs/pango-sections.txt:
+ * docs/tmpl/pango-renderer.sgml:
+ Update.
+
+2007-10-24 Behdad Esfahbod <behdad@gnome.org>
+
* pango/pango-attributes.c: Fix couple Oopses from my last
commit.
pango_renderer_get_color
pango_renderer_set_matrix
pango_renderer_get_matrix
+pango_renderer_get_layout
+pango_renderer_get_layout_line
<SUBSECTION Standard>
PANGO_RENDERER
PANGO_IS_RENDERER
@Returns:
+<!-- ##### FUNCTION pango_renderer_get_layout ##### -->
+<para>
+
+</para>
+
+@renderer:
+@Returns:
+
+
+<!-- ##### FUNCTION pango_renderer_get_layout_line ##### -->
+<para>
+
+</para>
+
+@renderer:
+@Returns:
+
+
PangoColor color[N_RENDER_PARTS];
gboolean color_set[N_RENDER_PARTS];
+ PangoLayoutLine *line;
LineState *line_state;
};
pango_renderer_activate (renderer);
+ renderer->priv->line = line;
renderer->priv->line_state = &state;
state.underline = PANGO_UNDERLINE_NONE;
draw_strikethrough (renderer, &state);
renderer->priv->line_state = NULL;
+ renderer->priv->line = NULL;
pango_renderer_deactivate (renderer);
}
return renderer->matrix;
}
+
+/**
+ * pango_renderer_get_layout:
+ * @renderer: a #PangoRenderer
+ *
+ * Gets the layout currently being rendered using @renderer.
+ * Calling this function only makes sense from inside a subclass's
+ * methods, like in its draw_shape<!---->() for example.
+ *
+ * The returned layout should not be modified while still being
+ * rendered.
+ *
+ * Return value: the layout, or %NULL if no layout is being
+ * rendered using @renderer at this time.
+ *
+ * Since: 1.20
+ **/
+PangoLayout *
+pango_renderer_get_layout (PangoRenderer *renderer)
+{
+ if (G_UNLIKELY (renderer->priv->line == NULL))
+ return NULL;
+
+ return renderer->priv->line->layout;
+}
+
+/**
+ * pango_renderer_get_layout_line:
+ * @renderer: a #PangoRenderer
+ *
+ * Gets the layout line currently being rendered using @renderer.
+ * Calling this function only makes sense from inside a subclass's
+ * methods, like in its draw_shape<!---->() for example.
+ *
+ * The returned layout line should not be modified while still being
+ * rendered.
+ *
+ * Return value: the layout line, or %NULL if no layout line is being
+ * rendered using @renderer at this time.
+ *
+ * Since: 1.20
+ **/
+PangoLayoutLine *
+pango_renderer_get_layout_line (PangoRenderer *renderer)
+{
+ return renderer->priv->line;
+}
const PangoMatrix *matrix);
G_CONST_RETURN PangoMatrix *pango_renderer_get_matrix (PangoRenderer *renderer);
+PangoLayout *pango_renderer_get_layout (PangoRenderer *renderer);
+PangoLayoutLine *pango_renderer_get_layout_line (PangoRenderer *renderer);
+
G_END_DECLS
#endif /* __PANGO_RENDERER_H_ */
pango_renderer_draw_rectangle
pango_renderer_draw_trapezoid
pango_renderer_get_color
+ pango_renderer_get_layout
+ pango_renderer_get_layout_line
pango_renderer_get_matrix
pango_renderer_get_type
pango_renderer_part_changed
cairo_t *cr;
gboolean do_path;
double x_offset, y_offset;
- PangoCairoShapeRendererFunc shape_renderer;
- gpointer shape_renderer_data;
};
struct _PangoCairoRendererClass
{
PangoCairoRenderer *crenderer = (PangoCairoRenderer *) (renderer);
cairo_t *cr = crenderer->cr;
- double base_x = crenderer->x_offset + (double)x / PANGO_SCALE;
- double base_y = crenderer->y_offset + (double)y / PANGO_SCALE;
+ PangoLayout *layout;
+ PangoCairoShapeRendererFunc shape_renderer;
+ gpointer shape_renderer_data;
+ double base_x, base_y;
+
+ layout = pango_renderer_get_layout (renderer);
+
+ if (!layout)
+ return;
- if (!crenderer->shape_renderer)
+ shape_renderer = pango_cairo_context_get_shape_renderer (pango_layout_get_context (layout),
+ &shape_renderer_data);
+
+ if (!shape_renderer)
return;
+ base_x = crenderer->x_offset + (double)x / PANGO_SCALE;
+ base_y = crenderer->y_offset + (double)y / PANGO_SCALE;
+
cairo_save (cr);
if (!crenderer->do_path)
set_color (crenderer, PANGO_RENDER_PART_FOREGROUND);
cairo_move_to (cr, base_x, base_y);
- crenderer->shape_renderer (cr, attr, crenderer->do_path, crenderer->shape_renderer_data);
+ shape_renderer (cr, attr, crenderer->do_path, shape_renderer_data);
cairo_restore (cr);
}
{
renderer->cr = NULL;
renderer->do_path = FALSE;
- renderer->shape_renderer = NULL;
- renderer->shape_renderer_data = NULL;
renderer->x_offset = 0.;
renderer->y_offset = 0.;
crenderer->cr = cr;
crenderer->do_path = do_path;
- crenderer->shape_renderer = pango_cairo_context_get_shape_renderer (pango_layout_get_context (line->layout),
- &crenderer->shape_renderer_data);
cairo_get_current_point (cr, &crenderer->x_offset, &crenderer->y_offset);
pango_renderer_draw_layout_line (renderer, line, 0, 0);
crenderer->cr = cr;
crenderer->do_path = do_path;
- crenderer->shape_renderer = pango_cairo_context_get_shape_renderer (pango_layout_get_context (layout),
- &crenderer->shape_renderer_data);
cairo_get_current_point (cr, &crenderer->x_offset, &crenderer->y_offset);
pango_renderer_draw_layout (renderer, layout, 0, 0);