summaryrefslogtreecommitdiff
path: root/pango/pango-layout.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/pango-layout.c')
-rw-r--r--pango/pango-layout.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 50143387..5dc3a0ce 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -109,6 +109,8 @@ struct _PangoLayoutLinePrivate
{
PangoLayoutLine line;
guint ref_count;
+ PangoGlyphString *last_tab_glyph;
+ PangoTabAlign last_tab_alignment;
};
struct _PangoLayoutClass
@@ -2495,11 +2497,8 @@ ensure_tab_width (PangoLayout *layout)
}
}
-/* For now we only need the tab position, we assume
- * all tabs are left-aligned.
- */
static int
-get_tab_pos (PangoLayout *layout, int index)
+get_tab_pos (PangoLayout *layout, int index, PangoTabAlign *alignment)
{
gint n_tabs;
gboolean in_pixels;
@@ -2519,7 +2518,7 @@ get_tab_pos (PangoLayout *layout, int index)
{
gint pos = 0;
- pango_tab_array_get_tab (layout->tabs, index, NULL, &pos);
+ pango_tab_array_get_tab (layout->tabs, index, alignment, &pos);
if (in_pixels)
return pos * PANGO_SCALE;
@@ -2536,10 +2535,10 @@ get_tab_pos (PangoLayout *layout, int index)
int next_to_last_pos = 0;
int tab_width;
- pango_tab_array_get_tab (layout->tabs, n_tabs - 1, NULL, &last_pos);
+ pango_tab_array_get_tab (layout->tabs, n_tabs - 1, alignment, &last_pos);
if (n_tabs > 1)
- pango_tab_array_get_tab (layout->tabs, n_tabs - 2, NULL, &next_to_last_pos);
+ pango_tab_array_get_tab (layout->tabs, n_tabs - 2, alignment, &next_to_last_pos);
else
next_to_last_pos = 0;
@@ -2597,6 +2596,8 @@ shape_tab (PangoLayoutLine *line,
{
int i;
+ PangoTabAlign tab_alignment;
+
int current_width = line_width (line);
pango_glyph_string_set_size (glyphs, 1);
@@ -2610,13 +2611,16 @@ shape_tab (PangoLayoutLine *line,
for (i=0;;i++)
{
- int tab_pos = get_tab_pos (line->layout, i);
+ int tab_pos = get_tab_pos (line->layout, i, &tab_alignment);
if (tab_pos > current_width)
{
glyphs->glyphs[0].geometry.width = tab_pos - current_width;
break;
}
}
+ PangoLayoutLinePrivate *private = (PangoLayoutLinePrivate *)line;
+ private->last_tab_glyph = glyphs;
+ private->last_tab_alignment = tab_alignment;
}
static inline gboolean
@@ -2689,6 +2693,16 @@ struct _ParaBreakState
* to the remaining portion of the first item */
};
+static int
+glyphstring_width (PangoGlyphString* glyphs)
+{
+ int i;
+ int width = 0;
+ for (i=0; i < glyphs->num_glyphs; i++)
+ width += glyphs->glyphs[i].geometry.width;
+ return width;
+}
+
static PangoGlyphString *
shape_run (PangoLayoutLine *line,
ParaBreakState *state,
@@ -2701,6 +2715,10 @@ shape_run (PangoLayoutLine *line,
shape_tab (line, glyphs);
else
{
+ PangoLayoutLinePrivate *private = (PangoLayoutLinePrivate *)line;
+
+ g_return_val_if_fail (line != NULL, glyphs);
+
if (state->properties.shape_set)
imposed_shape (layout->text + item->offset, item->num_chars,
state->properties.shape_ink_rect, state->properties.shape_logical_rect,
@@ -2708,6 +2726,21 @@ shape_run (PangoLayoutLine *line,
else
pango_shape (layout->text + item->offset, item->length, &item->analysis, glyphs);
+ if (private->last_tab_glyph != NULL)
+ {
+ if (private->last_tab_glyph->num_glyphs > 0)
+ {
+ int w = private->last_tab_glyph->glyphs[0].geometry.width;
+ if (private->last_tab_alignment == PANGO_TAB_RIGHT)
+ w -= glyphstring_width (glyphs);
+ else if (private->last_tab_alignment == PANGO_TAB_CENTER)
+ w -= glyphstring_width (glyphs) / 2;
+
+ if (w < 0) w = 0;
+ private->last_tab_glyph->glyphs[0].geometry.width = w;
+ }
+ }
+
if (state->properties.letter_spacing)
{
PangoGlyphItem glyph_item;
@@ -4034,6 +4067,8 @@ pango_layout_line_new (PangoLayout *layout)
private->line.layout = layout;
private->line.runs = 0;
private->line.length = 0;
+ private->last_tab_glyph = NULL;
+ private->last_tab_alignment = PANGO_TAB_LEFT;
/* Note that we leave start_index, resolved_dir, and is_paragraph_start
* uninitialized */