diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | docs/tmpl/tab-stops.sgml | 2 | ||||
-rw-r--r-- | examples/renderdemo.c | 82 | ||||
-rw-r--r-- | examples/renderdemo.h | 1 | ||||
-rw-r--r-- | pango/pango-layout.c | 51 | ||||
-rw-r--r-- | pango/pango-tabs.c | 8 | ||||
-rw-r--r-- | pango/pango-tabs.h | 6 |
7 files changed, 21 insertions, 143 deletions
@@ -1,19 +1,5 @@ 2006-01-28 Behdad Esfahbod <behdad@gnome.org> - Implement other tab alignments. Bug #325547, Itai Bar-Haim. - - * docs/tmpl/tab-stops.sgml: Documented new tab alignment enum vals. - - * pango/pango-tabs.h, pango/pango-tabs.c, pango/pango-layout.c: - Added support for tab alignments PANGO_TAB_RIGHT and PANGO_TAB_CENTER. - - * examples/renderdemo.h, examples/renderdemo.c: Added support for - --tab-spec. - - * examples/GLASS.utf8, examples/HELLO.utf8: Cleaned up tabs. - -2006-01-28 Behdad Esfahbod <behdad@gnome.org> - * doc/tmpl/opentype.sgml: Document PangoOTBuffer and PangoOTGlyph. * pango/pango-ot-buffer.c, pango/pango-ot-info.c, diff --git a/docs/tmpl/tab-stops.sgml b/docs/tmpl/tab-stops.sgml index 82954993..757280ad 100644 --- a/docs/tmpl/tab-stops.sgml +++ b/docs/tmpl/tab-stops.sgml @@ -34,8 +34,6 @@ A #PangoTabAlign specifies where a tab stop appears relative to the text. </para> @PANGO_TAB_LEFT: the tab stop appears to the left of the text. -@PANGO_TAB_RIGHT: the tab stop appears to the right of the text. -@PANGO_TAB_CENTER: the tab stop appears to the center of the text. <!-- ##### MACRO PANGO_TYPE_TAB_ALIGN ##### --> <para> diff --git a/examples/renderdemo.c b/examples/renderdemo.c index 155b7714..e225fe7e 100644 --- a/examples/renderdemo.c +++ b/examples/renderdemo.c @@ -58,14 +58,10 @@ int opt_runs = 1; PangoEllipsizeMode opt_ellipsize = PANGO_ELLIPSIZE_NONE; HintMode opt_hinting = HINT_DEFAULT; const char *opt_pangorc = NULL; -const char *opt_tab_spec; /* Text (or markup) to render */ static char *text; - -static PangoTabArray * parse_tab_spec (const char *p); - void fail (const char *format, ...) { @@ -132,15 +128,6 @@ make_layout(PangoContext *context, pango_font_description_free (font_description); - if (opt_tab_spec != NULL) - { - PangoTabArray *tabs; - - tabs = parse_tab_spec (opt_tab_spec); - pango_layout_set_tabs (layout, tabs); - pango_tab_array_free (tabs); - } - return layout; } @@ -382,6 +369,11 @@ parse_hinting (ArgContext *arg_context, const char *arg, gpointer data) { + static GEnumClass *class = NULL; + + if (!class) + class = g_type_class_ref (PANGO_TYPE_ELLIPSIZE_MODE); + if (strcmp (arg, "none") == 0) opt_hinting = HINT_NONE; else if (strcmp (arg, "auto") == 0) @@ -392,68 +384,6 @@ parse_hinting (ArgContext *arg_context, fail ("--hinting option must be one of none/auto/full"); } -static PangoTabArray * -parse_tab_spec (const char *p) -{ - PangoTabArray *tabs; - int tab_index; - - tab_index = 0; - tabs = pango_tab_array_new (0, FALSE); - - while (*p) - { - double pos; - int pos_units; - PangoTabAlign tab_align; - char *endpos; - - pos = g_ascii_strtod (p, &endpos); - if (p == (const char *)endpos) - goto failed; - p = endpos; - - pos_units = (pos * opt_dpi * PANGO_SCALE + 32) / 72; - - switch (*p) - { - case 'c': - p++; - tab_align = PANGO_TAB_CENTER; - break; - - case 'r': - p++; - tab_align = PANGO_TAB_RIGHT; - break; - - case 'l': - p++; - tab_align = PANGO_TAB_LEFT; - break; - - default: - break; - } - - if (*p == ',') - p++; - else if (*p) - goto failed; - - pango_tab_array_set_tab (tabs, tab_index, tab_align, pos_units); - tab_index++; - } - - return tabs; - -failed: - fail ("invalid --tab-spec option.\n" - "A tab spec should consist of a comma-separated list of tab-stop\n" - "positions in points optionally followed by one of 'l', 'c', and 'r'."); - return NULL; -} - void parse_options (int argc, char *argv[]) { @@ -492,8 +422,6 @@ parse_options (int argc, char *argv[]) ARG_INT, &opt_width, NULL }, { "indent", "Width in points to indent paragraphs", ARG_INT, &opt_indent, NULL }, - { "tab-spec", "Tab stops and alignment in points, like '100l,300r,500c,700'", - ARG_STRING, &opt_tab_spec, NULL }, { "runs", "Render text this many times", ARG_INT, &opt_runs, NULL }, { "pangorc", "pangorc file to use (default is ./pangorc if available)", diff --git a/examples/renderdemo.h b/examples/renderdemo.h index acd4c46b..d79df1a6 100644 --- a/examples/renderdemo.h +++ b/examples/renderdemo.h @@ -73,4 +73,3 @@ extern int opt_runs; extern PangoEllipsizeMode opt_ellipsize; extern HintMode opt_hinting; extern const char *opt_pangorc; -extern const char *opt_tab_spec; diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 5dc3a0ce..50143387 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -109,8 +109,6 @@ struct _PangoLayoutLinePrivate { PangoLayoutLine line; guint ref_count; - PangoGlyphString *last_tab_glyph; - PangoTabAlign last_tab_alignment; }; struct _PangoLayoutClass @@ -2497,8 +2495,11 @@ 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, PangoTabAlign *alignment) +get_tab_pos (PangoLayout *layout, int index) { gint n_tabs; gboolean in_pixels; @@ -2518,7 +2519,7 @@ get_tab_pos (PangoLayout *layout, int index, PangoTabAlign *alignment) { gint pos = 0; - pango_tab_array_get_tab (layout->tabs, index, alignment, &pos); + pango_tab_array_get_tab (layout->tabs, index, NULL, &pos); if (in_pixels) return pos * PANGO_SCALE; @@ -2535,10 +2536,10 @@ get_tab_pos (PangoLayout *layout, int index, PangoTabAlign *alignment) int next_to_last_pos = 0; int tab_width; - pango_tab_array_get_tab (layout->tabs, n_tabs - 1, alignment, &last_pos); + pango_tab_array_get_tab (layout->tabs, n_tabs - 1, NULL, &last_pos); if (n_tabs > 1) - pango_tab_array_get_tab (layout->tabs, n_tabs - 2, alignment, &next_to_last_pos); + pango_tab_array_get_tab (layout->tabs, n_tabs - 2, NULL, &next_to_last_pos); else next_to_last_pos = 0; @@ -2596,8 +2597,6 @@ shape_tab (PangoLayoutLine *line, { int i; - PangoTabAlign tab_alignment; - int current_width = line_width (line); pango_glyph_string_set_size (glyphs, 1); @@ -2611,16 +2610,13 @@ shape_tab (PangoLayoutLine *line, for (i=0;;i++) { - int tab_pos = get_tab_pos (line->layout, i, &tab_alignment); + int tab_pos = get_tab_pos (line->layout, i); 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 @@ -2693,16 +2689,6 @@ 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, @@ -2715,10 +2701,6 @@ 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, @@ -2726,21 +2708,6 @@ 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; @@ -4067,8 +4034,6 @@ 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 */ diff --git a/pango/pango-tabs.c b/pango/pango-tabs.c index 73343bc4..aedd9bce 100644 --- a/pango/pango-tabs.c +++ b/pango/pango-tabs.c @@ -257,12 +257,13 @@ pango_tab_array_resize (PangoTabArray *tab_array, /** * pango_tab_array_set_tab: * @tab_array: a #PangoTabArray - * @tab_index: the index of a tab stop, starting from zero + * @tab_index: the index of a tab stop * @alignment: tab alignment * @location: tab location in Pango units * - * Sets the alignment and location of a tab stop. Resizes the - * tab array if needed. + * Sets the alignment and location of a tab stop. + * @alignment must always be #PANGO_TAB_LEFT in the current + * implementation. * **/ void @@ -273,6 +274,7 @@ pango_tab_array_set_tab (PangoTabArray *tab_array, { g_return_if_fail (tab_array != NULL); g_return_if_fail (tab_index >= 0); + g_return_if_fail (alignment == PANGO_TAB_LEFT); g_return_if_fail (location >= 0); if (tab_index >= tab_array->size) diff --git a/pango/pango-tabs.h b/pango/pango-tabs.h index c2ec7eff..f60949e8 100644 --- a/pango/pango-tabs.h +++ b/pango/pango-tabs.h @@ -30,13 +30,13 @@ typedef struct _PangoTabArray PangoTabArray; typedef enum { - PANGO_TAB_LEFT, - PANGO_TAB_RIGHT, - PANGO_TAB_CENTER + PANGO_TAB_LEFT /* These are not supported now, but may be in the * future. * + * PANGO_TAB_RIGHT, + * PANGO_TAB_CENTER, * PANGO_TAB_NUMERIC */ } PangoTabAlign; |