📄 pango-renderer.c
字号:
*total = *global; pango_matrix_concat (total, &local); total->x0 = (global->xx * x + global->xy * y) / PANGO_SCALE + global->x0; total->y0 = (global->yx * x + global->yy * y) / PANGO_SCALE + global->y0;}static voidpango_renderer_default_draw_error_underline (PangoRenderer *renderer, int x, int y, int width, int height){ int square = height / HEIGHT_SQUARES; int unit_width = (HEIGHT_SQUARES - 1) * square; int width_units = (width + unit_width / 2) / unit_width; static const PangoMatrix identity = PANGO_MATRIX_INIT; const PangoMatrix *matrix; x += (width - width_units * unit_width) / 2; width = width_units * unit_width; if (renderer->matrix) matrix = renderer->matrix; else matrix = &identity; while (TRUE) { PangoMatrix total; get_total_matrix (&total, matrix, x, y, square); draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* A */ 0, 0, HEIGHT_SQUARES * 2 - 1, 1); if (width_units > 2) { draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* B */ HEIGHT_SQUARES * 2 - 2, - (HEIGHT_SQUARES * 2 - 3), 1, HEIGHT_SQUARES * 2 - 3); width_units -= 2; x += unit_width * 2; } else if (width_units == 2) { draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* C */ HEIGHT_SQUARES * 2 - 2, - (HEIGHT_SQUARES * 2 - 2), 1, HEIGHT_SQUARES * 2 - 2); break; } else break; }}/** * pango_renderer_draw_trapezoid: * @renderer: a #PangoRenderer * @part: type of object this trapezoid is part of * @y1_: Y coordinate of top of trapezoid * @x11: X coordinate of left end of top of trapezoid * @x21: X coordinate of right end of top of trapezoid * @y2: Y coordinate of bottom of trapezoid * @x12: X coordinate of left end of bottom of trapezoid * @x22: X coordinate of right end of bottom of trapezoid * * Draws a trapezoid with the parallel sides aligned with the X axis * using the given #PangoRenderer; coordinates are in device space. * * Since: 1.8 **/voidpango_renderer_draw_trapezoid (PangoRenderer *renderer, PangoRenderPart part, double y1_, double x11, double x21, double y2, double x12, double x22){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); g_return_if_fail (renderer->active_count > 0); if (PANGO_RENDERER_GET_CLASS (renderer)->draw_trapezoid) PANGO_RENDERER_GET_CLASS (renderer)->draw_trapezoid (renderer, part, y1_, x11, x21, y2, x12, x22);}/** * pango_renderer_draw_glyph: * @renderer: a #PangoRenderer * @font: a #PangoFont * @glyph: the glyph index of a single glyph * @x: X coordinate of left edge of baseline of glyph * @y: Y coordinate of left edge of baseline of glyph * * Draws a single glyph with coordinates in device space. * * Since: 1.8 **/voidpango_renderer_draw_glyph (PangoRenderer *renderer, PangoFont *font, PangoGlyph glyph, double x, double y){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); g_return_if_fail (renderer->active_count > 0); if (glyph == PANGO_GLYPH_EMPTY) /* glyph PANGO_GLYPH_EMPTY never renders */ return; if (PANGO_RENDERER_GET_CLASS (renderer)->draw_glyph) PANGO_RENDERER_GET_CLASS (renderer)->draw_glyph (renderer, font, glyph, x, y);}/** * pango_renderer_activate: * @renderer: a #PangoRenderer * * Does initial setup before rendering operations on @renderer. * pango_renderer_deactivate() should be called when done drawing. * Calls such as pango_renderer_draw_layout() automatically * activate the layout before drawing on it. Calls to * pango_renderer_activate() and pango_renderer_deactivate() can * be nested and the renderer will only be initialized and * deinitialized once. * * Since: 1.8 **/voidpango_renderer_activate (PangoRenderer *renderer){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); renderer->active_count++; if (renderer->active_count == 1) { if (PANGO_RENDERER_GET_CLASS (renderer)->begin) PANGO_RENDERER_GET_CLASS (renderer)->begin (renderer); }}/** * pango_renderer_deactivate: * @renderer: a #PangoRenderer * * Cleans up after rendering operations on @renderer. See * docs for pango_renderer_activate(). * * Since: 1.8 **/voidpango_renderer_deactivate (PangoRenderer *renderer){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); g_return_if_fail (renderer->active_count > 0); if (renderer->active_count == 1) { if (PANGO_RENDERER_GET_CLASS (renderer)->end) PANGO_RENDERER_GET_CLASS (renderer)->end (renderer); } renderer->active_count--;}/** * pango_renderer_set_color: * @renderer: a #PangoRenderer * @part: the part to change the color of * @color: the new color or %NULL to unset the current color * * Sets the color for part of the rendering. * * Since: 1.8 **/voidpango_renderer_set_color (PangoRenderer *renderer, PangoRenderPart part, const PangoColor *color){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); g_return_if_fail (IS_VALID_PART (part)); if ((!color && !renderer->priv->color_set[part]) || (color && renderer->priv->color_set[part] && renderer->priv->color[part].red == color->red && renderer->priv->color[part].green == color->green && renderer->priv->color[part].blue == color->blue)) return; pango_renderer_part_changed (renderer, part); if (color) { renderer->priv->color_set[part] = TRUE; renderer->priv->color[part] = *color; } else { renderer->priv->color_set[part] = FALSE; }}/** * pango_renderer_get_color: * @renderer: a #PangoRenderer * @part: the part to get the color for * * Gets the current rendering color for the specified part. * * Return value: the color for the specified part, or %NULL * if it hasn't been set and should be inherited from the * environment. * * Since: 1.8 **/PangoColor *pango_renderer_get_color (PangoRenderer *renderer, PangoRenderPart part){ g_return_val_if_fail (PANGO_IS_RENDERER_FAST (renderer), NULL); g_return_val_if_fail (IS_VALID_PART (part), NULL); if (renderer->priv->color_set[part]) return &renderer->priv->color[part]; else return NULL;}/** * pango_renderer_part_changed: * @renderer: a #PangoRenderer * @part: the part for which rendering has changed. * * Informs Pango that the way that the rendering is done * for @part has changed in a way that would prevent multiple * pieces being joined together into one drawing call. For * instance, if a subclass of #PangoRenderer was to add a stipple * option for drawing underlines, it needs to call * * <informalexample><programlisting> * pango_renderer_part_changed (render, PANGO_RENDER_PART_UNDERLINE); * </programlisting></informalexample> * * When the stipple changes or underlines with different stipples * might be joined together. Pango automatically calls this for * changes to colors. (See pango_renderer_set_color()) * * Since: 1.8 **/voidpango_renderer_part_changed (PangoRenderer *renderer, PangoRenderPart part){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); g_return_if_fail (IS_VALID_PART (part)); g_return_if_fail (renderer->active_count > 0); handle_line_state_change (renderer, part); if (PANGO_RENDERER_GET_CLASS (renderer)->part_changed) PANGO_RENDERER_GET_CLASS (renderer)->part_changed (renderer, part);}/** * pango_renderer_prepare_run: * @renderer: a #PangoRenderer * @run: a #PangoLayoutRun * * Set up the state of the #PangoRenderer for rendering @run. * * Since: 1.8 **/static voidpango_renderer_prepare_run (PangoRenderer *renderer, PangoLayoutRun *run){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); PANGO_RENDERER_GET_CLASS (renderer)->prepare_run (renderer, run);}static voidpango_renderer_default_prepare_run (PangoRenderer *renderer, PangoLayoutRun *run){ PangoColor *fg_color = NULL; PangoColor *bg_color = NULL; PangoColor *underline_color = NULL; PangoColor *strikethrough_color = NULL; GSList *l; renderer->underline = PANGO_UNDERLINE_NONE; renderer->strikethrough = FALSE; for (l = run->item->analysis.extra_attrs; l; l = l->next) { PangoAttribute *attr = l->data; switch (attr->klass->type) { case PANGO_ATTR_UNDERLINE: renderer->underline = ((PangoAttrInt *)attr)->value; break; case PANGO_ATTR_STRIKETHROUGH: renderer->strikethrough = ((PangoAttrInt *)attr)->value; break; case PANGO_ATTR_FOREGROUND: fg_color = &((PangoAttrColor *)attr)->color; break; case PANGO_ATTR_BACKGROUND: bg_color = &((PangoAttrColor *)attr)->color; break; case PANGO_ATTR_UNDERLINE_COLOR: underline_color = &((PangoAttrColor *)attr)->color; break; case PANGO_ATTR_STRIKETHROUGH_COLOR: strikethrough_color = &((PangoAttrColor *)attr)->color; break; default: break; } } if (!underline_color) underline_color = fg_color; if (!strikethrough_color) strikethrough_color = fg_color; pango_renderer_set_color (renderer, PANGO_RENDER_PART_FOREGROUND, fg_color); pango_renderer_set_color (renderer, PANGO_RENDER_PART_BACKGROUND, bg_color); pango_renderer_set_color (renderer, PANGO_RENDER_PART_UNDERLINE, underline_color); pango_renderer_set_color (renderer, PANGO_RENDER_PART_STRIKETHROUGH, strikethrough_color);}/** * pango_renderer_set_matrix: * @renderer: a #PangoRenderer * @matrix: a #PangoMatrix, or %NULL to unset any existing matrix. * (No matrix set is the same as setting the identity matrix.) * * Sets the transformation matrix that will be applied when rendering. * * Since: 1.8 **/voidpango_renderer_set_matrix (PangoRenderer *renderer, const PangoMatrix *matrix){ g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer)); if (renderer->matrix) pango_matrix_free (renderer->matrix); if (matrix) renderer->matrix = pango_matrix_copy (matrix); else renderer->matrix = NULL;}/** * pango_renderer_get_matrix: * @renderer: a #PangoRenderer * * Gets the transformation matrix that will be applied when * rendering. See pango_renderer_set_matrix(). * * Return value: the matrix, or %NULL if no matrix has been set * (which is the same as the identity matrix). The returned * matrix is owned by Pango and must not be modified or * freed. * * Since: 1.8 **/G_CONST_RETURN PangoMatrix *pango_renderer_get_matrix (PangoRenderer *renderer){ g_return_val_if_fail (PANGO_IS_RENDERER (renderer), NULL); 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -