summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-03-22 22:35:16 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-03-22 22:35:16 +0000
commit6f9c9b934021288f9b34430344790a2722dc614e (patch)
treeecceca157626570e74a0a123a800837ada66ba89 /pango
parenta6128c9efba496a2193894ec9ebe7a14404df72e (diff)
downloadpango-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.
Diffstat (limited to 'pango')
-rw-r--r--pango/pango-layout.c58
-rw-r--r--pango/pango-types.h3
-rw-r--r--pango/pangox.c6
3 files changed, 50 insertions, 17 deletions
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)