|
Packit |
0ec9dd |
/* Pango
|
|
Packit |
0ec9dd |
* pango-renderer.h: Base class for rendering
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Copyright (C) 2004 Red Hat, Inc.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is free software; you can redistribute it and/or
|
|
Packit |
0ec9dd |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License as published by the Free Software Foundation; either
|
|
Packit |
0ec9dd |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
0ec9dd |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
0ec9dd |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
0ec9dd |
* Library General Public License for more details.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License along with this library; if not, write to the
|
|
Packit |
0ec9dd |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
0ec9dd |
* Boston, MA 02111-1307, USA.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#include "config.h"
|
|
Packit |
0ec9dd |
#include <stdlib.h>
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#include "pango-renderer.h"
|
|
Packit |
0ec9dd |
#include "pango-impl-utils.h"
|
|
Packit |
0ec9dd |
#include "pango-layout-private.h"
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#define N_RENDER_PARTS 4
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#define PANGO_IS_RENDERER_FAST(renderer) (renderer != NULL)
|
|
Packit |
0ec9dd |
#define IS_VALID_PART(part) ((guint)part < N_RENDER_PARTS)
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
typedef struct _LineState LineState;
|
|
Packit |
0ec9dd |
typedef struct _Point Point;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
struct _Point
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
double x, y;
|
|
Packit |
0ec9dd |
};
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
struct _LineState
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoUnderline underline;
|
|
Packit |
0ec9dd |
PangoRectangle underline_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
gboolean strikethrough;
|
|
Packit |
0ec9dd |
PangoRectangle strikethrough_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
int logical_rect_end;
|
|
Packit |
0ec9dd |
};
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
struct _PangoRendererPrivate
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoColor color[N_RENDER_PARTS];
|
|
Packit |
0ec9dd |
gboolean color_set[N_RENDER_PARTS];
|
|
Packit |
0ec9dd |
guint16 alpha[N_RENDER_PARTS];
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PangoLayoutLine *line;
|
|
Packit |
0ec9dd |
LineState *line_state;
|
|
Packit |
0ec9dd |
};
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void pango_renderer_finalize (GObject *gobject);
|
|
Packit |
0ec9dd |
static void pango_renderer_default_draw_glyphs (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoFont *font,
|
|
Packit |
0ec9dd |
PangoGlyphString *glyphs,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y);
|
|
Packit |
0ec9dd |
static void pango_renderer_default_draw_glyph_item (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
const char *text,
|
|
Packit |
0ec9dd |
PangoGlyphItem *glyph_item,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y);
|
|
Packit |
0ec9dd |
static void pango_renderer_default_draw_rectangle (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height);
|
|
Packit |
0ec9dd |
static void pango_renderer_default_draw_error_underline (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height);
|
|
Packit |
0ec9dd |
static void pango_renderer_default_prepare_run (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayoutRun *run);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void pango_renderer_prepare_run (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayoutRun *run);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
to_device (PangoMatrix *matrix,
|
|
Packit |
0ec9dd |
double x,
|
|
Packit |
0ec9dd |
double y,
|
|
Packit |
0ec9dd |
Point *result)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (matrix)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
result->x = (x * matrix->xx + y * matrix->xy) / PANGO_SCALE + matrix->x0;
|
|
Packit |
0ec9dd |
result->y = (x * matrix->yx + y * matrix->yy) / PANGO_SCALE + matrix->y0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
result->x = x / PANGO_SCALE;
|
|
Packit |
0ec9dd |
result->y = y / PANGO_SCALE;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
G_DEFINE_ABSTRACT_TYPE (PangoRenderer, pango_renderer, G_TYPE_OBJECT)
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_class_init (PangoRendererClass *klass)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
klass->draw_glyphs = pango_renderer_default_draw_glyphs;
|
|
Packit |
0ec9dd |
klass->draw_glyph_item = pango_renderer_default_draw_glyph_item;
|
|
Packit |
0ec9dd |
klass->draw_rectangle = pango_renderer_default_draw_rectangle;
|
|
Packit |
0ec9dd |
klass->draw_error_underline = pango_renderer_default_draw_error_underline;
|
|
Packit |
0ec9dd |
klass->prepare_run = pango_renderer_default_prepare_run;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
gobject_class->finalize = pango_renderer_finalize;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
g_type_class_add_private (gobject_class, sizeof (PangoRendererPrivate));
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_init (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
renderer->priv = G_TYPE_INSTANCE_GET_PRIVATE (renderer,
|
|
Packit |
0ec9dd |
PANGO_TYPE_RENDERER,
|
|
Packit |
0ec9dd |
PangoRendererPrivate);
|
|
Packit |
0ec9dd |
renderer->matrix = NULL;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_finalize (GObject *gobject)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRenderer *renderer = PANGO_RENDERER (gobject);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->matrix)
|
|
Packit |
0ec9dd |
pango_matrix_free (renderer->matrix);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
G_OBJECT_CLASS (pango_renderer_parent_class)->finalize (gobject);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_layout:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @layout: a #PangoLayout
|
|
Packit |
0ec9dd |
* @x: X position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
* @y: Y position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws @layout with the specified #PangoRenderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_layout (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayout *layout,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoLayoutIter iter;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_LAYOUT (layout));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* We only change the matrix if the renderer isn't already
|
|
Packit |
0ec9dd |
* active.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
if (!renderer->active_count)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoContext *context = pango_layout_get_context (layout);
|
|
Packit |
0ec9dd |
pango_renderer_set_matrix (renderer,
|
|
Packit |
0ec9dd |
pango_context_get_matrix (context));
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_activate (renderer);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
_pango_layout_get_iter (layout, &iter);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
do
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle logical_rect;
|
|
Packit |
0ec9dd |
PangoLayoutLine *line;
|
|
Packit |
0ec9dd |
int baseline;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
line = pango_layout_iter_get_line_readonly (&iter);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_layout_iter_get_line_extents (&iter, NULL, &logical_rect);
|
|
Packit |
0ec9dd |
baseline = pango_layout_iter_get_baseline (&iter);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_draw_layout_line (renderer,
|
|
Packit |
0ec9dd |
line,
|
|
Packit |
0ec9dd |
x + logical_rect.x,
|
|
Packit |
0ec9dd |
y + baseline);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
while (pango_layout_iter_next_line (&iter));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
_pango_layout_iter_destroy (&iter);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_deactivate (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
draw_underline (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
LineState *state)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *rect = &state->underline_rect;
|
|
Packit |
0ec9dd |
PangoUnderline underline = state->underline;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
state->underline = PANGO_UNDERLINE_NONE;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
switch (underline)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_NONE:
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_DOUBLE:
|
|
Packit |
0ec9dd |
pango_renderer_draw_rectangle (renderer,
|
|
Packit |
0ec9dd |
PANGO_RENDER_PART_UNDERLINE,
|
|
Packit |
0ec9dd |
rect->x,
|
|
Packit |
0ec9dd |
rect->y + 2 * rect->height,
|
|
Packit |
0ec9dd |
rect->width,
|
|
Packit |
0ec9dd |
rect->height);
|
|
Packit |
0ec9dd |
/* Fall through */
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_SINGLE:
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_LOW:
|
|
Packit |
0ec9dd |
pango_renderer_draw_rectangle (renderer,
|
|
Packit |
0ec9dd |
PANGO_RENDER_PART_UNDERLINE,
|
|
Packit |
0ec9dd |
rect->x,
|
|
Packit |
0ec9dd |
rect->y,
|
|
Packit |
0ec9dd |
rect->width,
|
|
Packit |
0ec9dd |
rect->height);
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_ERROR:
|
|
Packit |
0ec9dd |
pango_renderer_draw_error_underline (renderer,
|
|
Packit |
0ec9dd |
rect->x,
|
|
Packit |
0ec9dd |
rect->y,
|
|
Packit |
0ec9dd |
rect->width,
|
|
Packit |
0ec9dd |
3 * rect->height);
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
draw_strikethrough (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
LineState *state)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *rect = &state->strikethrough_rect;
|
|
Packit |
0ec9dd |
gboolean strikethrough = state->strikethrough;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
state->strikethrough = FALSE;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (strikethrough)
|
|
Packit |
0ec9dd |
pango_renderer_draw_rectangle (renderer,
|
|
Packit |
0ec9dd |
PANGO_RENDER_PART_STRIKETHROUGH,
|
|
Packit |
0ec9dd |
rect->x,
|
|
Packit |
0ec9dd |
rect->y,
|
|
Packit |
0ec9dd |
rect->width,
|
|
Packit |
0ec9dd |
rect->height);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
handle_line_state_change (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
LineState *state = renderer->priv->line_state;
|
|
Packit |
0ec9dd |
if (!state)
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (part == PANGO_RENDER_PART_UNDERLINE &&
|
|
Packit |
0ec9dd |
state->underline != PANGO_UNDERLINE_NONE)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *rect = &state->underline_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
rect->width = state->logical_rect_end - rect->x;
|
|
Packit |
0ec9dd |
draw_underline (renderer, state);
|
|
Packit |
0ec9dd |
state->underline = renderer->underline;
|
|
Packit |
0ec9dd |
rect->x = state->logical_rect_end;
|
|
Packit |
0ec9dd |
rect->width = 0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (part == PANGO_RENDER_PART_STRIKETHROUGH &&
|
|
Packit |
0ec9dd |
state->strikethrough)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *rect = &state->strikethrough_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
rect->width = state->logical_rect_end - rect->x;
|
|
Packit |
0ec9dd |
draw_strikethrough (renderer, state);
|
|
Packit |
0ec9dd |
state->strikethrough = renderer->strikethrough;
|
|
Packit |
0ec9dd |
rect->x = state->logical_rect_end;
|
|
Packit |
0ec9dd |
rect->width = 0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
add_underline (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
LineState *state,
|
|
Packit |
0ec9dd |
PangoFontMetrics *metrics,
|
|
Packit |
0ec9dd |
int base_x,
|
|
Packit |
0ec9dd |
int base_y,
|
|
Packit |
0ec9dd |
PangoRectangle *ink_rect,
|
|
Packit |
0ec9dd |
PangoRectangle *logical_rect)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *current_rect = &state->underline_rect;
|
|
Packit |
0ec9dd |
PangoRectangle new_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
int underline_thickness = pango_font_metrics_get_underline_thickness (metrics);
|
|
Packit |
0ec9dd |
int underline_position = pango_font_metrics_get_underline_position (metrics);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
new_rect.x = base_x + logical_rect->x;
|
|
Packit |
0ec9dd |
new_rect.width = logical_rect->width;
|
|
Packit |
0ec9dd |
new_rect.height = underline_thickness;
|
|
Packit |
0ec9dd |
new_rect.y = base_y;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
switch (renderer->underline)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_NONE:
|
|
Packit |
0ec9dd |
g_assert_not_reached ();
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_SINGLE:
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_DOUBLE:
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_ERROR:
|
|
Packit |
0ec9dd |
new_rect.y -= underline_position;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
case PANGO_UNDERLINE_LOW:
|
|
Packit |
0ec9dd |
new_rect.y += ink_rect->y + ink_rect->height + underline_thickness;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->underline == state->underline &&
|
|
Packit |
0ec9dd |
new_rect.y == current_rect->y &&
|
|
Packit |
0ec9dd |
new_rect.height == current_rect->height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
current_rect->width = new_rect.x + new_rect.width - current_rect->x;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_underline (renderer, state);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
*current_rect = new_rect;
|
|
Packit |
0ec9dd |
state->underline = renderer->underline;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
add_strikethrough (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
LineState *state,
|
|
Packit |
0ec9dd |
PangoFontMetrics *metrics,
|
|
Packit |
0ec9dd |
int base_x,
|
|
Packit |
0ec9dd |
int base_y,
|
|
Packit |
0ec9dd |
PangoRectangle *ink_rect G_GNUC_UNUSED,
|
|
Packit |
0ec9dd |
PangoRectangle *logical_rect)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRectangle *current_rect = &state->strikethrough_rect;
|
|
Packit |
0ec9dd |
PangoRectangle new_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
int strikethrough_thickness = pango_font_metrics_get_strikethrough_thickness (metrics);
|
|
Packit |
0ec9dd |
int strikethrough_position = pango_font_metrics_get_strikethrough_position (metrics);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
new_rect.x = base_x + logical_rect->x;
|
|
Packit |
0ec9dd |
new_rect.width = logical_rect->width;
|
|
Packit |
0ec9dd |
new_rect.y = base_y - strikethrough_position;
|
|
Packit |
0ec9dd |
new_rect.height = strikethrough_thickness;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (state->strikethrough &&
|
|
Packit |
0ec9dd |
new_rect.y == current_rect->y &&
|
|
Packit |
0ec9dd |
new_rect.height == current_rect->height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
current_rect->width = new_rect.x + new_rect.width - current_rect->x;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_strikethrough (renderer, state);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
*current_rect = new_rect;
|
|
Packit |
0ec9dd |
state->strikethrough = TRUE;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
get_item_properties (PangoItem *item,
|
|
Packit |
0ec9dd |
gint *rise,
|
|
Packit |
0ec9dd |
PangoAttrShape **shape_attr)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
GSList *l;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (rise)
|
|
Packit |
0ec9dd |
*rise = 0;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (shape_attr)
|
|
Packit |
0ec9dd |
*shape_attr = NULL;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (l = item->analysis.extra_attrs; l; l = l->next)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoAttribute *attr = l->data;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
switch ((int) attr->klass->type)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
case PANGO_ATTR_SHAPE:
|
|
Packit |
0ec9dd |
if (shape_attr)
|
|
Packit |
0ec9dd |
*shape_attr = (PangoAttrShape *)attr;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_RISE:
|
|
Packit |
0ec9dd |
if (rise)
|
|
Packit |
0ec9dd |
*rise = ((PangoAttrInt *)attr)->value;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
default:
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
draw_shaped_glyphs (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoGlyphString *glyphs,
|
|
Packit |
0ec9dd |
PangoAttrShape *attr,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoRendererClass *class = PANGO_RENDERER_GET_CLASS (renderer);
|
|
Packit |
0ec9dd |
int i;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (!class->draw_shape)
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (i = 0; i < glyphs->num_glyphs; i++)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoGlyphInfo *gi = &glyphs->glyphs[i];
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
class->draw_shape (renderer, attr, x, y);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
x += gi->geometry.width;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_layout_line:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @line: a #PangoLayoutLine
|
|
Packit |
0ec9dd |
* @x: X position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
* @y: Y position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws @line with the specified #PangoRenderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_layout_line (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayoutLine *line,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
int x_off = 0;
|
|
Packit |
0ec9dd |
int glyph_string_width;
|
|
Packit |
0ec9dd |
LineState state;
|
|
Packit |
0ec9dd |
GSList *l;
|
|
Packit |
0ec9dd |
gboolean got_overall = FALSE;
|
|
Packit |
0ec9dd |
PangoRectangle overall_rect;
|
|
Packit |
0ec9dd |
const char *text;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* We only change the matrix if the renderer isn't already
|
|
Packit |
0ec9dd |
* active.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
if (!renderer->active_count)
|
|
Packit |
0ec9dd |
pango_renderer_set_matrix (renderer,
|
|
Packit |
0ec9dd |
G_LIKELY (line->layout) ?
|
|
Packit |
0ec9dd |
pango_context_get_matrix
|
|
Packit |
0ec9dd |
(pango_layout_get_context (line->layout)) :
|
|
Packit |
0ec9dd |
NULL);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_activate (renderer);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
renderer->priv->line = line;
|
|
Packit |
0ec9dd |
renderer->priv->line_state = &stat;;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
state.underline = PANGO_UNDERLINE_NONE;
|
|
Packit |
0ec9dd |
state.strikethrough = FALSE;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
text = G_LIKELY (line->layout) ? pango_layout_get_text (line->layout) : NULL;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (l = line->runs; l; l = l->next)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoFontMetrics *metrics;
|
|
Packit |
0ec9dd |
gint rise;
|
|
Packit |
0ec9dd |
PangoLayoutRun *run = l->data;
|
|
Packit |
0ec9dd |
PangoAttrShape *shape_attr;
|
|
Packit |
0ec9dd |
PangoRectangle ink_rect, *ink = NULL;
|
|
Packit |
0ec9dd |
PangoRectangle logical_rect, *logical = NULL;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_CENTERED_BASELINE)
|
|
Packit |
0ec9dd |
logical = &logical_rect;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_prepare_run (renderer, run);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
get_item_properties (run->item, &rise, &shape_attr);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (shape_attr)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
ink = &ink_rect;
|
|
Packit |
0ec9dd |
logical = &logical_rect;
|
|
Packit |
0ec9dd |
_pango_shape_get_extents (run->glyphs->num_glyphs,
|
|
Packit |
0ec9dd |
&shape_attr->ink_rect,
|
|
Packit |
0ec9dd |
&shape_attr->logical_rect,
|
|
Packit |
0ec9dd |
ink,
|
|
Packit |
0ec9dd |
logical);
|
|
Packit |
0ec9dd |
glyph_string_width = logical->width;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (renderer->underline != PANGO_UNDERLINE_NONE ||
|
|
Packit |
0ec9dd |
renderer->strikethrough)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
ink = &ink_rect;
|
|
Packit |
0ec9dd |
logical = &logical_rect;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
if (G_UNLIKELY (ink || logical))
|
|
Packit |
0ec9dd |
pango_glyph_string_extents (run->glyphs, run->item->analysis.font,
|
|
Packit |
0ec9dd |
ink, logical);
|
|
Packit |
0ec9dd |
if (logical)
|
|
Packit |
0ec9dd |
glyph_string_width = logical_rect.width;
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
glyph_string_width = pango_glyph_string_get_width (run->glyphs);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
state.logical_rect_end = x + x_off + glyph_string_width;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_CENTERED_BASELINE)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
gboolean is_hinted = ((logical_rect.y | logical_rect.height) & (PANGO_SCALE - 1)) == 0;
|
|
Packit |
0ec9dd |
int adjustment = logical_rect.y + logical_rect.height / 2;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (is_hinted)
|
|
Packit |
0ec9dd |
adjustment = PANGO_UNITS_ROUND (adjustment);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
rise += adjustment;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->priv->color_set[PANGO_RENDER_PART_BACKGROUND])
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (!got_overall)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
pango_layout_line_get_extents (line, NULL, &overall_rect);
|
|
Packit |
0ec9dd |
got_overall = TRUE;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_draw_rectangle (renderer,
|
|
Packit |
0ec9dd |
PANGO_RENDER_PART_BACKGROUND,
|
|
Packit |
0ec9dd |
x + x_off,
|
|
Packit |
0ec9dd |
y + overall_rect.y,
|
|
Packit |
0ec9dd |
glyph_string_width,
|
|
Packit |
0ec9dd |
overall_rect.height);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (shape_attr)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_shaped_glyphs (renderer, run->glyphs, shape_attr, x + x_off, y - rise);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyph_item (renderer,
|
|
Packit |
0ec9dd |
text,
|
|
Packit |
0ec9dd |
run,
|
|
Packit |
0ec9dd |
x + x_off, y - rise);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->underline != PANGO_UNDERLINE_NONE ||
|
|
Packit |
0ec9dd |
renderer->strikethrough)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
metrics = pango_font_get_metrics (run->item->analysis.font,
|
|
Packit |
0ec9dd |
run->item->analysis.language);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->underline != PANGO_UNDERLINE_NONE)
|
|
Packit |
0ec9dd |
add_underline (renderer, &state,metrics,
|
|
Packit |
0ec9dd |
x + x_off, y - rise,
|
|
Packit |
0ec9dd |
ink, logical);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->strikethrough)
|
|
Packit |
0ec9dd |
add_strikethrough (renderer, &state, metrics,
|
|
Packit |
0ec9dd |
x + x_off, y - rise,
|
|
Packit |
0ec9dd |
ink, logical);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_font_metrics_unref (metrics);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->underline == PANGO_UNDERLINE_NONE &&
|
|
Packit |
0ec9dd |
state.underline != PANGO_UNDERLINE_NONE)
|
|
Packit |
0ec9dd |
draw_underline (renderer, &state);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (!renderer->strikethrough && state.strikethrough)
|
|
Packit |
0ec9dd |
draw_strikethrough (renderer, &state);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
x_off += glyph_string_width;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* Finish off any remaining underlines
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
draw_underline (renderer, &state);
|
|
Packit |
0ec9dd |
draw_strikethrough (renderer, &state);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
renderer->priv->line_state = NULL;
|
|
Packit |
0ec9dd |
renderer->priv->line = NULL;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_deactivate (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_glyphs:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @font: a #PangoFont
|
|
Packit |
0ec9dd |
* @glyphs: a #PangoGlyphString
|
|
Packit |
0ec9dd |
* @x: X position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
* @y: Y position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws the glyphs in @glyphs with the specified #PangoRenderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyphs (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoFont *font,
|
|
Packit |
0ec9dd |
PangoGlyphString *glyphs,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_activate (renderer);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_glyphs (renderer, font, glyphs, x, y);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_deactivate (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_default_draw_glyphs (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoFont *font,
|
|
Packit |
0ec9dd |
PangoGlyphString *glyphs,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
int i;
|
|
Packit |
0ec9dd |
int x_position = 0;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (i = 0; i < glyphs->num_glyphs; i++)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoGlyphInfo *gi = &glyphs->glyphs[i];
|
|
Packit |
0ec9dd |
Point p;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
to_device (renderer->matrix,
|
|
Packit |
0ec9dd |
x + x_position + gi->geometry.x_offset,
|
|
Packit |
0ec9dd |
y + gi->geometry.y_offset,
|
|
Packit |
0ec9dd |
&p);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyph (renderer, font, gi->glyph, p.x, p.y);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
x_position += gi->geometry.width;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_glyph_item:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @text: (allow-none): the UTF-8 text that @glyph_item refers to, or %NULL
|
|
Packit |
0ec9dd |
* @glyph_item: a #PangoGlyphItem
|
|
Packit |
0ec9dd |
* @x: X position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
* @y: Y position of left edge of baseline, in user space coordinates
|
|
Packit |
0ec9dd |
* in Pango units.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws the glyphs in @glyph_item with the specified #PangoRenderer,
|
|
Packit |
0ec9dd |
* embedding the text associated with the glyphs in the output if the
|
|
Packit |
0ec9dd |
* output format supports it (PDF for example).
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that @text is the start of the text for layout, which is then
|
|
Packit |
0ec9dd |
* indexed by <literal>@glyph_item->item->offset</literal>.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* If @text is %NULL, this simply calls pango_renderer_draw_glyphs().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* The default implementation of this method simply falls back to
|
|
Packit |
0ec9dd |
* pango_renderer_draw_glyphs().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.22
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyph_item (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
const char *text,
|
|
Packit |
0ec9dd |
PangoGlyphItem *glyph_item,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (!text)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyphs (renderer,
|
|
Packit |
0ec9dd |
glyph_item->item->analysis.font,
|
|
Packit |
0ec9dd |
glyph_item->glyphs,
|
|
Packit |
0ec9dd |
x, y);
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_activate (renderer);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_glyph_item (renderer, text, glyph_item, x, y);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_deactivate (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_default_draw_glyph_item (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
const char *text G_GNUC_UNUSED,
|
|
Packit |
0ec9dd |
PangoGlyphItem *glyph_item,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyphs (renderer,
|
|
Packit |
0ec9dd |
glyph_item->item->analysis.font,
|
|
Packit |
0ec9dd |
glyph_item->glyphs,
|
|
Packit |
0ec9dd |
x, y);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_rectangle:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: type of object this rectangle is part of
|
|
Packit |
0ec9dd |
* @x: X position at which to draw rectangle, in user space coordinates in Pango units
|
|
Packit |
0ec9dd |
* @y: Y position at which to draw rectangle, in user space coordinates in Pango units
|
|
Packit |
0ec9dd |
* @width: width of rectangle in Pango units in user space coordinates
|
|
Packit |
0ec9dd |
* @height: height of rectangle in Pango units in user space coordinates
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws an axis-aligned rectangle in user space coordinates with the
|
|
Packit |
0ec9dd |
* specified #PangoRenderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This should be called while @renderer is already active. Use
|
|
Packit |
0ec9dd |
* pango_renderer_activate() to activate a renderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_rectangle (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (IS_VALID_PART (part));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_rectangle (renderer, part, x, y, width, height);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static int
|
|
Packit |
0ec9dd |
compare_points (const void *a,
|
|
Packit |
0ec9dd |
const void *b)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
const Point *pa = a;
|
|
Packit |
0ec9dd |
const Point *pb = b;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (pa->y < pb->y)
|
|
Packit |
0ec9dd |
return -1;
|
|
Packit |
0ec9dd |
else if (pa->y > pb->y)
|
|
Packit |
0ec9dd |
return 1;
|
|
Packit |
0ec9dd |
else if (pa->x < pb->x)
|
|
Packit |
0ec9dd |
return -1;
|
|
Packit |
0ec9dd |
else if (pa->x > pb->x)
|
|
Packit |
0ec9dd |
return 1;
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
return 0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
draw_rectangle (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoMatrix *matrix,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
Point points[4];
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* Convert the points to device coordinates, and sort
|
|
Packit |
0ec9dd |
* in ascending Y order. (Ordering by X for ties)
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
to_device (matrix, x, y, &points[0]);
|
|
Packit |
0ec9dd |
to_device (matrix, x + width, y, &points[1]);
|
|
Packit |
0ec9dd |
to_device (matrix, x, y + height, &points[2]);
|
|
Packit |
0ec9dd |
to_device (matrix, x + width, y + height, &points[3]);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
qsort (points, 4, sizeof (Point), compare_points);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* There are essentially three cases. (There is a fourth
|
|
Packit |
0ec9dd |
* case where trapezoid B is degenerate and we just have
|
|
Packit |
0ec9dd |
* two triangles, but we don't need to handle it separately.)
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* 1 2 3
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* ______ /\ /\
|
|
Packit |
0ec9dd |
* / / /A \ /A \
|
|
Packit |
0ec9dd |
* / B / /____\ /____\
|
|
Packit |
0ec9dd |
* /_____/ / B / \ B \
|
|
Packit |
0ec9dd |
* /_____/ \_____\
|
|
Packit |
0ec9dd |
* \ C / \ C /
|
|
Packit |
0ec9dd |
* \ / \ /
|
|
Packit |
0ec9dd |
* \/ \/
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
if (points[0].y == points[1].y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
/* Case 1 (pure shear) */
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* B */
|
|
Packit |
0ec9dd |
points[0].y, points[0].x, points[1].x,
|
|
Packit |
0ec9dd |
points[2].y, points[2].x, points[3].x);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else if (points[1].x < points[2].x)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
/* Case 2 */
|
|
Packit |
0ec9dd |
double tmp_width = ((points[2].x - points[0].x) * (points[1].y - points[0].y)) / (points[2].y - points[0].y);
|
|
Packit |
0ec9dd |
double base_width = tmp_width + points[0].x - points[1].x;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* A */
|
|
Packit |
0ec9dd |
points[0].y, points[0].x, points[0].x,
|
|
Packit |
0ec9dd |
points[1].y, points[1].x, points[1].x + base_width);
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* B */
|
|
Packit |
0ec9dd |
points[1].y, points[1].x, points[1].x + base_width,
|
|
Packit |
0ec9dd |
points[2].y, points[2].x - base_width, points[2].x);
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* C */
|
|
Packit |
0ec9dd |
points[2].y, points[2].x - base_width, points[2].x,
|
|
Packit |
0ec9dd |
points[3].y, points[3].x, points[3].x);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
/* case 3 */
|
|
Packit |
0ec9dd |
double tmp_width = ((points[0].x - points[2].x) * (points[1].y - points[0].y)) / (points[2].y - points[0].y);
|
|
Packit |
0ec9dd |
double base_width = tmp_width + points[1].x - points[0].x;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* A */
|
|
Packit |
0ec9dd |
points[0].y, points[0].x, points[0].x,
|
|
Packit |
0ec9dd |
points[1].y, points[1].x - base_width, points[1].x);
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* B */
|
|
Packit |
0ec9dd |
points[1].y, points[1].x - base_width, points[1].x,
|
|
Packit |
0ec9dd |
points[2].y, points[2].x, points[2].x + base_width);
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (renderer, part, /* C */
|
|
Packit |
0ec9dd |
points[2].y, points[2].x, points[2].x + base_width,
|
|
Packit |
0ec9dd |
points[3].y, points[3].x, points[3].x);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_default_draw_rectangle (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_rectangle (renderer, renderer->matrix, part, x, y, width, height);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_error_underline:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @x: X coordinate of underline, in Pango units in user coordinate system
|
|
Packit |
0ec9dd |
* @y: Y coordinate of underline, in Pango units in user coordinate system
|
|
Packit |
0ec9dd |
* @width: width of underline, in Pango units in user coordinate system
|
|
Packit |
0ec9dd |
* @height: height of underline, in Pango units in user coordinate system
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draw a squiggly line that approximately covers the given rectangle
|
|
Packit |
0ec9dd |
* in the style of an underline used to indicate a spelling error.
|
|
Packit |
0ec9dd |
* (The width of the underline is rounded to an integer number
|
|
Packit |
0ec9dd |
* of up/down segments and the resulting rectangle is centered
|
|
Packit |
0ec9dd |
* in the original rectangle)
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This should be called while @renderer is already active. Use
|
|
Packit |
0ec9dd |
* pango_renderer_activate() to activate a renderer.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_error_underline (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_error_underline (renderer, x, y, width, height);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* We are drawing an error underline that looks like one of:
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* /\ /\ /\ /\ /\ -
|
|
Packit |
0ec9dd |
* / \ / \ / \ / \ / \ |
|
|
Packit |
0ec9dd |
* \ \ /\ \ / / \ \ /\ \ |
|
|
Packit |
0ec9dd |
* \ \/B \ \/ C / \ \/B \ \ | height = HEIGHT_SQUARES * square
|
|
Packit |
0ec9dd |
* \ A \ /\ A \ / \ A \ /\ A \ |
|
|
Packit |
0ec9dd |
* \ \/ \ \/ \ \/ \ \ |
|
|
Packit |
0ec9dd |
* \ / \ / \ / \ / |
|
|
Packit |
0ec9dd |
* \/ \/ \/ \/ -
|
|
Packit |
0ec9dd |
* |---|
|
|
Packit |
0ec9dd |
* unit_width = (HEIGHT_SQUARES - 1) * square
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* To do this conveniently, we work in a coordinate system where A,B,C
|
|
Packit |
0ec9dd |
* are axis aligned rectangles. (If fonts were square, the diagrams
|
|
Packit |
0ec9dd |
* would be clearer)
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* (0,0)
|
|
Packit |
0ec9dd |
* /\ /\
|
|
Packit |
0ec9dd |
* / \ / \
|
|
Packit |
0ec9dd |
* /\ /\ /\ /
|
|
Packit |
0ec9dd |
* / \/ \/ \/
|
|
Packit |
0ec9dd |
* / \ /\ /
|
|
Packit |
0ec9dd |
* Y axis \/ \/
|
|
Packit |
0ec9dd |
* \ /\
|
|
Packit |
0ec9dd |
* \/ \
|
|
Packit |
0ec9dd |
* \ X axis
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that the long side in this coordinate system is HEIGHT_SQUARES + 1
|
|
Packit |
0ec9dd |
* units long
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* The diagrams above are shown with HEIGHT_SQUARES an integer, but
|
|
Packit |
0ec9dd |
* that is actually incidental; the value 2.5 below seems better than
|
|
Packit |
0ec9dd |
* either HEIGHT_SQUARES=3 (a little long and skinny) or
|
|
Packit |
0ec9dd |
* HEIGHT_SQUARES=2 (a bit short and stubby)
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#define HEIGHT_SQUARES 2.5
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
get_total_matrix (PangoMatrix *total,
|
|
Packit |
0ec9dd |
const PangoMatrix *global,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int square)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoMatrix local;
|
|
Packit |
0ec9dd |
gdouble scale = 0.5 * square;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* The local matrix translates from the axis aligned coordinate system
|
|
Packit |
0ec9dd |
* to the original user space coordinate system.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
local.xx = scale;
|
|
Packit |
0ec9dd |
local.xy = - scale;
|
|
Packit |
0ec9dd |
local.yx = scale;
|
|
Packit |
0ec9dd |
local.yy = scale;
|
|
Packit |
0ec9dd |
local.x0 = 0;
|
|
Packit |
0ec9dd |
local.y0 = 0;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
*total = *global;
|
|
Packit |
0ec9dd |
pango_matrix_concat (total, &local);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
total->x0 = (global->xx * x + global->xy * y) / PANGO_SCALE + global->x0;
|
|
Packit |
0ec9dd |
total->y0 = (global->yx * x + global->yy * y) / PANGO_SCALE + global->y0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_default_draw_error_underline (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
int x,
|
|
Packit |
0ec9dd |
int y,
|
|
Packit |
0ec9dd |
int width,
|
|
Packit |
0ec9dd |
int height)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
int square = height / HEIGHT_SQUARES;
|
|
Packit |
0ec9dd |
int unit_width = (HEIGHT_SQUARES - 1) * square;
|
|
Packit |
0ec9dd |
int width_units = (width + unit_width / 2) / unit_width;
|
|
Packit |
0ec9dd |
const PangoMatrix identity = PANGO_MATRIX_INIT;
|
|
Packit |
0ec9dd |
const PangoMatrix *matrix;
|
|
Packit |
0ec9dd |
double dx, dx0, dy0;
|
|
Packit |
0ec9dd |
PangoMatrix total;
|
|
Packit |
0ec9dd |
int i;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
x += (width - width_units * unit_width) / 2;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->matrix)
|
|
Packit |
0ec9dd |
matrix = renderer->matrix;
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
matrix = &identity;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
get_total_matrix (&total, matrix, x, y, square);
|
|
Packit |
0ec9dd |
dx = unit_width * 2;
|
|
Packit |
0ec9dd |
dx0 = (matrix->xx * dx) / PANGO_SCALE;
|
|
Packit |
0ec9dd |
dy0 = (matrix->yx * dx) / PANGO_SCALE;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
i = (width_units - 1) / 2;
|
|
Packit |
0ec9dd |
while (TRUE)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* A */
|
|
Packit |
0ec9dd |
0, 0,
|
|
Packit |
0ec9dd |
HEIGHT_SQUARES * 2 - 1, 1);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (i <= 0)
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
i--;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* B */
|
|
Packit |
0ec9dd |
HEIGHT_SQUARES * 2 - 2, - (HEIGHT_SQUARES * 2 - 3),
|
|
Packit |
0ec9dd |
1, HEIGHT_SQUARES * 2 - 3);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
total.x0 += dx0;
|
|
Packit |
0ec9dd |
total.y0 += dy0;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
if (width_units % 2 == 0)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
draw_rectangle (renderer, &total, PANGO_RENDER_PART_UNDERLINE, /* C */
|
|
Packit |
0ec9dd |
HEIGHT_SQUARES * 2 - 2, - (HEIGHT_SQUARES * 2 - 2),
|
|
Packit |
0ec9dd |
1, HEIGHT_SQUARES * 2 - 2);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_trapezoid:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: type of object this trapezoid is part of
|
|
Packit |
0ec9dd |
* @y1_: Y coordinate of top of trapezoid
|
|
Packit |
0ec9dd |
* @x11: X coordinate of left end of top of trapezoid
|
|
Packit |
0ec9dd |
* @x21: X coordinate of right end of top of trapezoid
|
|
Packit |
0ec9dd |
* @y2: Y coordinate of bottom of trapezoid
|
|
Packit |
0ec9dd |
* @x12: X coordinate of left end of bottom of trapezoid
|
|
Packit |
0ec9dd |
* @x22: X coordinate of right end of bottom of trapezoid
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws a trapezoid with the parallel sides aligned with the X axis
|
|
Packit |
0ec9dd |
* using the given #PangoRenderer; coordinates are in device space.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_trapezoid (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
double y1_,
|
|
Packit |
0ec9dd |
double x11,
|
|
Packit |
0ec9dd |
double x21,
|
|
Packit |
0ec9dd |
double y2,
|
|
Packit |
0ec9dd |
double x12,
|
|
Packit |
0ec9dd |
double x22)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (PANGO_RENDERER_GET_CLASS (renderer)->draw_trapezoid)
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_trapezoid (renderer, part,
|
|
Packit |
0ec9dd |
y1_, x11, x21,
|
|
Packit |
0ec9dd |
y2, x12, x22);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_draw_glyph:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @font: a #PangoFont
|
|
Packit |
0ec9dd |
* @glyph: the glyph index of a single glyph
|
|
Packit |
0ec9dd |
* @x: X coordinate of left edge of baseline of glyph
|
|
Packit |
0ec9dd |
* @y: Y coordinate of left edge of baseline of glyph
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Draws a single glyph with coordinates in device space.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_draw_glyph (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoFont *font,
|
|
Packit |
0ec9dd |
PangoGlyph glyph,
|
|
Packit |
0ec9dd |
double x,
|
|
Packit |
0ec9dd |
double y)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (glyph == PANGO_GLYPH_EMPTY) /* glyph PANGO_GLYPH_EMPTY never renders */
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (PANGO_RENDERER_GET_CLASS (renderer)->draw_glyph)
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->draw_glyph (renderer, font, glyph, x, y);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_activate:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Does initial setup before rendering operations on @renderer.
|
|
Packit |
0ec9dd |
* pango_renderer_deactivate() should be called when done drawing.
|
|
Packit |
0ec9dd |
* Calls such as pango_renderer_draw_layout() automatically
|
|
Packit |
0ec9dd |
* activate the layout before drawing on it. Calls to
|
|
Packit |
0ec9dd |
* pango_renderer_activate() and pango_renderer_deactivate() can
|
|
Packit |
0ec9dd |
* be nested and the renderer will only be initialized and
|
|
Packit |
0ec9dd |
* deinitialized once.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_activate (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
renderer->active_count++;
|
|
Packit |
0ec9dd |
if (renderer->active_count == 1)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (PANGO_RENDERER_GET_CLASS (renderer)->begin)
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->begin (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_deactivate:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Cleans up after rendering operations on @renderer. See
|
|
Packit |
0ec9dd |
* docs for pango_renderer_activate().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_deactivate (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->active_count == 1)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (PANGO_RENDERER_GET_CLASS (renderer)->end)
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->end (renderer);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
renderer->active_count--;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_set_color:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: the part to change the color of
|
|
Packit |
0ec9dd |
* @color: (allow-none): the new color or %NULL to unset the current color
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Sets the color for part of the rendering.
|
|
Packit |
0ec9dd |
* Also see pango_renderer_set_alpha().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_set_color (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
const PangoColor *color)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (IS_VALID_PART (part));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if ((!color && !renderer->priv->color_set[part]) ||
|
|
Packit |
0ec9dd |
(color && renderer->priv->color_set[part] &&
|
|
Packit |
0ec9dd |
renderer->priv->color[part].red == color->red &&
|
|
Packit |
0ec9dd |
renderer->priv->color[part].green == color->green &&
|
|
Packit |
0ec9dd |
renderer->priv->color[part].blue == color->blue))
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_part_changed (renderer, part);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (color)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
renderer->priv->color_set[part] = TRUE;
|
|
Packit |
0ec9dd |
renderer->priv->color[part] = *color;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
renderer->priv->color_set[part] = FALSE;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_get_color:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: the part to get the color for
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the current rendering color for the specified part.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer none) (nullable): the color for the
|
|
Packit |
0ec9dd |
* specified part, or %NULL if it hasn't been set and should be
|
|
Packit |
0ec9dd |
* inherited from the environment.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoColor *
|
|
Packit |
0ec9dd |
pango_renderer_get_color (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_RENDERER_FAST (renderer), NULL);
|
|
Packit |
0ec9dd |
g_return_val_if_fail (IS_VALID_PART (part), NULL);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (renderer->priv->color_set[part])
|
|
Packit |
0ec9dd |
return &renderer->priv->color[part];
|
|
Packit |
0ec9dd |
else
|
|
Packit |
0ec9dd |
return NULL;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_set_alpha:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: the part to set the alpha for
|
|
Packit |
0ec9dd |
* @alpha: an alpha value between 1 and 65536, or 0 to unset the alpha
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Sets the alpha for part of the rendering.
|
|
Packit |
0ec9dd |
* Note that the alpha may only be used if a color is
|
|
Packit |
0ec9dd |
* specified for @part as well.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.38
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_set_alpha (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part,
|
|
Packit |
0ec9dd |
guint16 alpha)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (IS_VALID_PART (part));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if ((!alpha && !renderer->priv->alpha[part]) ||
|
|
Packit |
0ec9dd |
(alpha && renderer->priv->alpha[part] &&
|
|
Packit |
0ec9dd |
renderer->priv->alpha[part] == alpha))
|
|
Packit |
0ec9dd |
return;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_part_changed (renderer, part);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
renderer->priv->alpha[part] = alpha;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_get_alpha:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: the part to get the alpha for
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the current alpha for the specified part.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: the alpha for the specified part,
|
|
Packit |
0ec9dd |
* or 0 if it hasn't been set and should be
|
|
Packit |
0ec9dd |
* inherited from the environment.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.38
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
guint16
|
|
Packit |
0ec9dd |
pango_renderer_get_alpha (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_RENDERER_FAST (renderer), 0);
|
|
Packit |
0ec9dd |
g_return_val_if_fail (IS_VALID_PART (part), 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return renderer->priv->alpha[part];
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_part_changed:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @part: the part for which rendering has changed.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Informs Pango that the way that the rendering is done
|
|
Packit |
0ec9dd |
* for @part has changed in a way that would prevent multiple
|
|
Packit |
0ec9dd |
* pieces being joined together into one drawing call. For
|
|
Packit |
0ec9dd |
* instance, if a subclass of #PangoRenderer was to add a stipple
|
|
Packit |
0ec9dd |
* option for drawing underlines, it needs to call
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* <informalexample><programlisting>
|
|
Packit |
0ec9dd |
* pango_renderer_part_changed (render, PANGO_RENDER_PART_UNDERLINE);
|
|
Packit |
0ec9dd |
* </programlisting></informalexample>
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* When the stipple changes or underlines with different stipples
|
|
Packit |
0ec9dd |
* might be joined together. Pango automatically calls this for
|
|
Packit |
0ec9dd |
* changes to colors. (See pango_renderer_set_color())
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_part_changed (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoRenderPart part)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
g_return_if_fail (IS_VALID_PART (part));
|
|
Packit |
0ec9dd |
g_return_if_fail (renderer->active_count > 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
handle_line_state_change (renderer, part);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (PANGO_RENDERER_GET_CLASS (renderer)->part_changed)
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->part_changed (renderer, part);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_prepare_run:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @run: a #PangoLayoutRun
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Set up the state of the #PangoRenderer for rendering @run.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_prepare_run (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayoutRun *run)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
PANGO_RENDERER_GET_CLASS (renderer)->prepare_run (renderer, run);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_renderer_default_prepare_run (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
PangoLayoutRun *run)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoColor *fg_color = NULL;
|
|
Packit |
0ec9dd |
PangoColor *bg_color = NULL;
|
|
Packit |
0ec9dd |
PangoColor *underline_color = NULL;
|
|
Packit |
0ec9dd |
PangoColor *strikethrough_color = NULL;
|
|
Packit |
0ec9dd |
guint16 fg_alpha = 0;
|
|
Packit |
0ec9dd |
guint16 bg_alpha = 0;
|
|
Packit |
0ec9dd |
GSList *l;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
renderer->underline = PANGO_UNDERLINE_NONE;
|
|
Packit |
0ec9dd |
renderer->strikethrough = FALSE;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (l = run->item->analysis.extra_attrs; l; l = l->next)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoAttribute *attr = l->data;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
switch ((int) attr->klass->type)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
case PANGO_ATTR_UNDERLINE:
|
|
Packit |
0ec9dd |
renderer->underline = ((PangoAttrInt *)attr)->value;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_STRIKETHROUGH:
|
|
Packit |
0ec9dd |
renderer->strikethrough = ((PangoAttrInt *)attr)->value;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_FOREGROUND:
|
|
Packit |
0ec9dd |
fg_color = &((PangoAttrColor *)attr)->color;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_BACKGROUND:
|
|
Packit |
0ec9dd |
bg_color = &((PangoAttrColor *)attr)->color;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_UNDERLINE_COLOR:
|
|
Packit |
0ec9dd |
underline_color = &((PangoAttrColor *)attr)->color;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_STRIKETHROUGH_COLOR:
|
|
Packit |
0ec9dd |
strikethrough_color = &((PangoAttrColor *)attr)->color;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_FOREGROUND_ALPHA:
|
|
Packit |
0ec9dd |
fg_alpha = ((PangoAttrInt *)attr)->value;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
case PANGO_ATTR_BACKGROUND_ALPHA:
|
|
Packit |
0ec9dd |
bg_alpha = ((PangoAttrInt *)attr)->value;
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
default:
|
|
Packit |
0ec9dd |
break;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (!underline_color)
|
|
Packit |
0ec9dd |
underline_color = fg_color;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (!strikethrough_color)
|
|
Packit |
0ec9dd |
strikethrough_color = fg_color;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_set_color (renderer, PANGO_RENDER_PART_FOREGROUND, fg_color);
|
|
Packit |
0ec9dd |
pango_renderer_set_color (renderer, PANGO_RENDER_PART_BACKGROUND, bg_color);
|
|
Packit |
0ec9dd |
pango_renderer_set_color (renderer, PANGO_RENDER_PART_UNDERLINE, underline_color);
|
|
Packit |
0ec9dd |
pango_renderer_set_color (renderer, PANGO_RENDER_PART_STRIKETHROUGH, strikethrough_color);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_renderer_set_alpha (renderer, PANGO_RENDER_PART_FOREGROUND, fg_alpha);
|
|
Packit |
0ec9dd |
pango_renderer_set_alpha (renderer, PANGO_RENDER_PART_BACKGROUND, bg_alpha);
|
|
Packit |
0ec9dd |
pango_renderer_set_alpha (renderer, PANGO_RENDER_PART_UNDERLINE, fg_alpha);
|
|
Packit |
0ec9dd |
pango_renderer_set_alpha (renderer, PANGO_RENDER_PART_STRIKETHROUGH, fg_alpha);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_set_matrix:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
* @matrix: (allow-none): a #PangoMatrix, or %NULL to unset any existing matrix.
|
|
Packit |
0ec9dd |
* (No matrix set is the same as setting the identity matrix.)
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Sets the transformation matrix that will be applied when rendering.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_renderer_set_matrix (PangoRenderer *renderer,
|
|
Packit |
0ec9dd |
const PangoMatrix *matrix)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_RENDERER_FAST (renderer));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
pango_matrix_free (renderer->matrix);
|
|
Packit |
0ec9dd |
renderer->matrix = pango_matrix_copy (matrix);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_get_matrix:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the transformation matrix that will be applied when
|
|
Packit |
0ec9dd |
* rendering. See pango_renderer_set_matrix().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (nullable): the matrix, or %NULL if no matrix has
|
|
Packit |
0ec9dd |
* been set (which is the same as the identity matrix). The returned
|
|
Packit |
0ec9dd |
* matrix is owned by Pango and must not be modified or freed.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.8
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
const PangoMatrix *
|
|
Packit |
0ec9dd |
pango_renderer_get_matrix (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_RENDERER (renderer), NULL);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return renderer->matrix;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_get_layout:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the layout currently being rendered using @renderer.
|
|
Packit |
0ec9dd |
* Calling this function only makes sense from inside a subclass's
|
|
Packit |
0ec9dd |
* methods, like in its draw_shape() for example.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* The returned layout should not be modified while still being
|
|
Packit |
0ec9dd |
* rendered.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer none) (nullable): the layout, or %NULL if
|
|
Packit |
0ec9dd |
* no layout is being rendered using @renderer at this time.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.20
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoLayout *
|
|
Packit |
0ec9dd |
pango_renderer_get_layout (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
if (G_UNLIKELY (renderer->priv->line == NULL))
|
|
Packit |
0ec9dd |
return NULL;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return renderer->priv->line->layout;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_renderer_get_layout_line:
|
|
Packit |
0ec9dd |
* @renderer: a #PangoRenderer
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the layout line currently being rendered using @renderer.
|
|
Packit |
0ec9dd |
* Calling this function only makes sense from inside a subclass's
|
|
Packit |
0ec9dd |
* methods, like in its draw_shape() for example.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* The returned layout line should not be modified while still being
|
|
Packit |
0ec9dd |
* rendered.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer none) (nullable): the layout line, or %NULL
|
|
Packit |
0ec9dd |
* if no layout line is being rendered using @renderer at this time.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.20
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoLayoutLine *
|
|
Packit |
0ec9dd |
pango_renderer_get_layout_line (PangoRenderer *renderer)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
return renderer->priv->line;
|
|
Packit |
0ec9dd |
}
|