⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pango-renderer.c

📁 Pango is a library for layout and rendering of text, with an emphasis on internationalization. Pang
💻 C
📖 第 1 页 / 共 3 页
字号:
  *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 + -