diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-03-22 22:35:16 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-03-22 22:35:16 +0000 |
commit | 6f9c9b934021288f9b34430344790a2722dc614e (patch) | |
tree | ecceca157626570e74a0a123a800837ada66ba89 | |
parent | a6128c9efba496a2193894ec9ebe7a14404df72e (diff) | |
download | pango-6f9c9b934021288f9b34430344790a2722dc614e.tar.gz |
Handle right alignment for width == -1, align within total width of
Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com>
* pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right
alignment for width == -1, align within total width of layout.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-0 | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-10 | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-2 | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-4 | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-6 | 5 | ||||
-rw-r--r-- | ChangeLog.pre-1-8 | 5 | ||||
-rw-r--r-- | TODO | 3 | ||||
-rw-r--r-- | pango/pango-layout.c | 58 | ||||
-rw-r--r-- | pango/pango-types.h | 3 | ||||
-rw-r--r-- | pango/pangox.c | 6 |
11 files changed, 88 insertions, 17 deletions
@@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-0 b/ChangeLog.pre-1-0 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-0 +++ b/ChangeLog.pre-1-0 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-2 +++ b/ChangeLog.pre-1-2 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index 83f5fd3e..f592c6c4 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,8 @@ +Mon Mar 13 11:47:53 2000 Owen Taylor <otaylor@redhat.com> + + * pango/pango-layout.c pango/pangox.c (pango_x_render_layout): Handle right + alignment for width == -1, align within total width of layout. + Mon Mar 13 10:54:48 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-item.[ch]: Memory management functions for PangoItem. @@ -22,6 +22,9 @@ string and produces lines of glyphs. should have change-notification, or else the layout should make a copy of the context when the context is set. +* optimize right alignment for width == -1 and only a single + line. (Currently this causes a useless call to gtk_layout_get_extents.) + X rendering =========== diff --git a/pango/pango-layout.c b/pango/pango-layout.c index cc6734e7..8330edfe 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -546,17 +546,25 @@ pango_layout_xy_to_index (PangoLayout *layout, gboolean *trailing) { GSList *line_list; + PangoRectangle logical_rect; int y_offset = 0; + int width; g_return_val_if_fail (layout != NULL, FALSE); pango_layout_check_lines (layout); + width = layout->width; + if (width == -1 && layout->alignment != PANGO_ALIGN_LEFT) + { + pango_layout_get_extents (layout, NULL, &logical_rect); + width = logical_rect.width; + } + line_list = layout->lines; while (line_list) { PangoLayoutLine *line = line_list->data; - PangoRectangle logical_rect; pango_layout_line_get_extents (line, NULL, &logical_rect); @@ -564,10 +572,10 @@ pango_layout_xy_to_index (PangoLayout *layout, { int x_offset; - if (layout->width != 1 && layout->alignment == PANGO_ALIGN_RIGHT) - x_offset = layout->width - logical_rect.width; - else if (layout->width != 1 && layout->alignment == PANGO_ALIGN_CENTER) - x_offset = (layout->width - logical_rect.width) / 2; + if (layout->alignment == PANGO_ALIGN_RIGHT) + x_offset = width - logical_rect.width; + else if (layout->alignment == PANGO_ALIGN_CENTER) + x_offset = (width - logical_rect.width) / 2; else x_offset = 0; @@ -602,6 +610,7 @@ pango_layout_index_to_pos (PangoLayout *layout, PangoRectangle logical_rect; GSList *tmp_list; int bytes_seen = 0; + int width; g_return_if_fail (layout != NULL); g_return_if_fail (index >= 0 && index < layout->length); @@ -610,6 +619,13 @@ pango_layout_index_to_pos (PangoLayout *layout, pango_layout_check_lines (layout); + width = layout->width; + if (width == -1 && layout->alignment != PANGO_ALIGN_LEFT) + { + pango_layout_get_extents (layout, NULL, &logical_rect); + width = logical_rect.width; + } + tmp_list = layout->lines; while (tmp_list) { @@ -622,10 +638,10 @@ pango_layout_index_to_pos (PangoLayout *layout, int x_pos; int x_offset; - if (layout->width != 1 && layout->alignment == PANGO_ALIGN_RIGHT) - x_offset = layout->width - logical_rect.width; - else if (layout->width != 1 && layout->alignment == PANGO_ALIGN_CENTER) - x_offset = (layout->width - logical_rect.width) / 2; + if (layout->alignment == PANGO_ALIGN_RIGHT) + x_offset = width - logical_rect.width; + else if (layout->alignment == PANGO_ALIGN_CENTER) + x_offset = (width - logical_rect.width) / 2; else x_offset = 0; @@ -667,11 +683,21 @@ pango_layout_get_extents (PangoLayout *layout, { GSList *line_list; int y_offset = 0; + int width; g_return_if_fail (layout != NULL); pango_layout_check_lines (layout); + width = layout->width; + if (width == -1 && layout->alignment != PANGO_ALIGN_LEFT && ink_rect != NULL) + { + PangoRectangle overall_logical; + + pango_layout_get_extents (layout, NULL, &overall_logical); + width = overall_logical.width; + } + line_list = layout->lines; while (line_list) { @@ -684,10 +710,10 @@ pango_layout_get_extents (PangoLayout *layout, pango_layout_line_get_extents (line, ink_rect ? &line_ink : NULL, &line_logical); - if (layout->width != 1 && layout->alignment == PANGO_ALIGN_RIGHT) - x_offset = layout->width - line_logical.width; - else if (layout->width != 1 && layout->alignment == PANGO_ALIGN_CENTER) - x_offset = (layout->width - line_logical.width) / 2; + if (layout->alignment == PANGO_ALIGN_RIGHT) + x_offset = width - line_logical.width; + else if (layout->alignment == PANGO_ALIGN_CENTER) + x_offset = (width - line_logical.width) / 2; else x_offset = 0; @@ -718,16 +744,16 @@ pango_layout_get_extents (PangoLayout *layout, { if (line_list == layout->lines) { - logical_rect->x = line_logical.x + x_offset; + logical_rect->x = line_logical.x; logical_rect->y = line_logical.y; logical_rect->width = line_logical.width; logical_rect->height = line_logical.height; } else { - new_pos = MIN (logical_rect->x, line_logical.x + x_offset); + new_pos = MIN (logical_rect->x, line_logical.x); logical_rect->width = MAX (logical_rect->x + logical_rect->width, - line_logical.x + line_logical.width + x_offset) - new_pos; + line_logical.x + line_logical.width) - new_pos; logical_rect->x = new_pos; new_pos = MIN (logical_rect->y, line_logical.y + y_offset); diff --git a/pango/pango-types.h b/pango/pango-types.h index a0a41b0a..346d858f 100644 --- a/pango/pango-types.h +++ b/pango/pango-types.h @@ -70,7 +70,8 @@ struct _PangoRectangle typedef enum { PANGO_DIRECTION_LTR, PANGO_DIRECTION_RTL, - PANGO_DIRECTION_TTB + PANGO_DIRECTION_TTB_LTR, + PANGO_DIRECTION_TTB_RTL } PangoDirection; /* Language tagging information diff --git a/pango/pangox.c b/pango/pangox.c index d16d598c..d9b86618 100644 --- a/pango/pangox.c +++ b/pango/pangox.c @@ -2109,6 +2109,12 @@ pango_x_render_layout (Display *display, indent = pango_layout_get_indent (layout); width = pango_layout_get_width (layout); align = pango_layout_get_alignment (layout); + + if (width == -1 && align != PANGO_ALIGN_LEFT) + { + pango_layout_get_extents (layout, NULL, &logical_rect); + width = logical_rect.width; + } tmp_list = pango_layout_get_lines (layout); while (tmp_list) |