summaryrefslogtreecommitdiff
path: root/gtk/gtktextlayout.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtktextlayout.c')
-rw-r--r--gtk/gtktextlayout.c161
1 files changed, 93 insertions, 68 deletions
diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c
index ad0570b6b1..6adbe2a2d3 100644
--- a/gtk/gtktextlayout.c
+++ b/gtk/gtktextlayout.c
@@ -1073,7 +1073,9 @@ gtk_text_layout_wrap (GtkTextLayout *layout,
line_data->width = display->width;
line_data->height = display->height;
line_data->valid = TRUE;
- pango_layout_get_pixel_extents (display->layout, &ink_rect, &logical_rect);
+ pango_lines_get_extents (pango_layout_get_lines (display->layout), &ink_rect, &logical_rect);
+ pango_extents_to_pixels (&ink_rect, NULL);
+ pango_extents_to_pixels (&logical_rect, NULL);
line_data->top_ink = MAX (0, logical_rect.x - ink_rect.x);
line_data->bottom_ink = MAX (0, logical_rect.x + logical_rect.width - ink_rect.x - ink_rect.width);
gtk_text_line_display_unref (display);
@@ -1245,17 +1247,14 @@ set_para_values (GtkTextLayout *layout,
switch (style->justification)
{
case GTK_JUSTIFY_LEFT:
- pango_align = (base_dir == PANGO_DIRECTION_LTR) ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
- break;
case GTK_JUSTIFY_RIGHT:
- pango_align = (base_dir == PANGO_DIRECTION_LTR) ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
+ pango_align = PANGO_ALIGN_NATURAL;
break;
case GTK_JUSTIFY_CENTER:
pango_align = PANGO_ALIGN_CENTER;
break;
case GTK_JUSTIFY_FILL:
- pango_align = (base_dir == PANGO_DIRECTION_LTR) ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
- pango_layout_set_justify (display->layout, TRUE);
+ pango_align = GTK_JUSTIFY_FILL;
break;
default:
g_assert_not_reached ();
@@ -1263,8 +1262,7 @@ set_para_values (GtkTextLayout *layout,
}
pango_layout_set_alignment (display->layout, pango_align);
- pango_layout_set_spacing (display->layout,
- style->pixels_inside_wrap * PANGO_SCALE);
+ pango_layout_set_spacing (display->layout, style->pixels_inside_wrap * PANGO_SCALE);
if (style->tabs)
pango_layout_set_tabs (display->layout, style->tabs);
@@ -1904,16 +1902,14 @@ add_cursor (GtkTextLayout *layout,
static gboolean
is_shape (PangoLayoutRun *run)
{
- GSList *tmp_list = run->item->analysis.extra_attrs;
+ PangoItem *item = pango_layout_run_get_item (run);
- while (tmp_list)
+ for (GSList *l = item->analysis.extra_attrs; l; l = l->next)
{
- PangoAttribute *attr = tmp_list->data;
+ PangoAttribute *attr = l->data;
if (attr->klass->type == PANGO_ATTR_SHAPE)
return TRUE;
-
- tmp_list = tmp_list->next;
}
return FALSE;
@@ -1929,7 +1925,7 @@ allocate_child_widgets (GtkTextLayout *text_layout,
run_iter = pango_layout_get_iter (layout);
do
{
- PangoLayoutRun *run = pango_layout_iter_get_run_readonly (run_iter);
+ PangoLayoutRun *run = pango_layout_iter_get_run (run_iter);
if (run && is_shape (run))
{
@@ -2578,7 +2574,7 @@ gtk_text_layout_create_display (GtkTextLayout *layout,
g_slist_free (cursor_byte_offsets);
g_slist_free (cursor_segs);
- pango_layout_get_extents (display->layout, NULL, &extents);
+ pango_lines_get_extents (pango_layout_get_lines (display->layout), NULL, &extents);
text_pixel_width = PIXEL_BOUND (extents.width);
@@ -2606,6 +2602,17 @@ gtk_text_layout_create_display (GtkTextLayout *layout,
case PANGO_ALIGN_RIGHT:
display->x_offset += excess;
break;
+ case PANGO_ALIGN_NATURAL:
+ {
+ PangoLayoutLine *first_line;
+
+ first_line = pango_lines_get_line (pango_layout_get_lines (display->layout), 0, NULL, NULL);
+ if (first_line && pango_layout_line_get_resolved_direction (first_line) == PANGO_DIRECTION_RTL)
+ display->x_offset += excess;
+ }
+ break;
+ case PANGO_ALIGN_JUSTIFY:
+ break;
}
}
@@ -2824,12 +2831,13 @@ gtk_text_layout_get_iter_at_position (GtkTextLayout *layout,
}
else
{
- /* Ignore the "outside" return value from pango. Pango is doing
+ /* Ignore the return value from pango. Pango is doing
* the right thing even if we are outside the layout in the
* x-direction.
*/
- inside = pango_layout_xy_to_index (display->layout, x * PANGO_SCALE, y * PANGO_SCALE,
- &byte_index, trailing);
+ pango_lines_pos_to_index (pango_layout_get_lines (display->layout),
+ x * PANGO_SCALE, y * PANGO_SCALE,
+ &byte_index, trailing);
}
line_display_index_to_iter (layout, display, target_iter, byte_index, 0);
@@ -2887,9 +2895,9 @@ gtk_text_layout_get_cursor_locations (GtkTextLayout *layout,
if (gtk_text_iter_equal (iter, &insert_iter))
index += layout->preedit_cursor - layout->preedit_len;
- pango_layout_get_cursor_pos (display->layout, index,
- strong_pos ? &pango_strong_pos : NULL,
- weak_pos ? &pango_weak_pos : NULL);
+ pango_lines_get_cursor_pos (pango_layout_get_lines (display->layout), NULL, index,
+ strong_pos ? &pango_strong_pos : NULL,
+ weak_pos ? &pango_weak_pos : NULL);
if (strong_pos)
{
@@ -3034,7 +3042,7 @@ gtk_text_layout_get_iter_location (GtkTextLayout *layout,
byte_index = gtk_text_iter_get_line_index (iter);
- pango_layout_index_to_pos (display->layout, byte_index, &pango_rect);
+ pango_lines_index_to_pos (pango_layout_get_lines (display->layout), NULL, byte_index, &pango_rect);
rect->x = PANGO_PIXELS (x_offset + pango_rect.x);
rect->y += PANGO_PIXELS (pango_rect.y) + display->top_margin;
@@ -3082,8 +3090,9 @@ find_display_line_below (GtkTextLayout *layout,
do
{
- int first_y, last_y;
- PangoLayoutLine *layout_line = pango_layout_iter_get_line_readonly (layout_iter);
+ PangoRectangle ext;
+
+ PangoLayoutLine *layout_line = pango_layout_iter_get_line (layout_iter);
found_byte = pango_layout_line_get_start_index (layout_line);
@@ -3093,8 +3102,9 @@ find_display_line_below (GtkTextLayout *layout,
break;
}
- pango_layout_iter_get_line_yrange (layout_iter, &first_y, &last_y);
- line_top += (last_y - first_y) / PANGO_SCALE;
+ pango_layout_iter_get_line_extents (layout_iter, NULL, &ext);
+ pango_extents_to_pixels (&ext, NULL);
+ line_top += ext.height;
}
while (pango_layout_iter_next_line (layout_iter));
@@ -3154,19 +3164,21 @@ find_display_line_above (GtkTextLayout *layout,
do
{
- int first_y, last_y;
- PangoLayoutLine *layout_line = pango_layout_iter_get_line_readonly (layout_iter);
+ PangoRectangle ext;
+
+ PangoLayoutLine *layout_line = pango_layout_iter_get_line (layout_iter);
found_byte = pango_layout_line_get_start_index (layout_line);
- pango_layout_iter_get_line_yrange (layout_iter, &first_y, &last_y);
+ pango_layout_iter_get_line_extents (layout_iter, NULL, &ext);
+ pango_extents_to_pixels (&ext, NULL);
- tmp_top -= (last_y - first_y) / PANGO_SCALE;
+ tmp_top -= ext.height;
if (tmp_top < y)
{
found_line = line;
- pango_layout_iter_free (layout_iter);
+ pango_layout_iter_free (layout_iter);
goto done;
}
}
@@ -3248,10 +3260,10 @@ gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
GtkTextLine *line;
GtkTextLineDisplay *display;
int line_byte;
- GSList *tmp_list;
PangoLayoutLine *layout_line;
GtkTextIter orig;
gboolean update_byte = FALSE;
+ int line_no;
g_return_val_if_fail (GTK_IS_TEXT_LAYOUT (layout), FALSE);
g_return_val_if_fail (iter != NULL, FALSE);
@@ -3285,15 +3297,15 @@ gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
update_byte = TRUE;
}
- tmp_list = pango_layout_get_lines_readonly (display->layout);
- layout_line = tmp_list->data;
+ line_no = 0;
+ layout_line = pango_lines_get_line (pango_layout_get_lines (display->layout), line_no, NULL, NULL);
if (update_byte)
{
line_byte = pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line);
}
- if (line_byte < pango_layout_line_get_length (layout_line) || !tmp_list->next) /* first line of paragraph */
+ if (line_byte < pango_layout_line_get_length (layout_line) || line_no + 1 == pango_lines_get_line_count (pango_layout_get_lines (display->layout))) /* first line of paragraph */
{
GtkTextLine *prev_line;
@@ -3311,8 +3323,8 @@ gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
if (display->height > 0)
{
- tmp_list = g_slist_last (pango_layout_get_lines_readonly (display->layout));
- layout_line = tmp_list->data;
+ PangoLines *lines = pango_layout_get_lines (display->layout);
+ layout_line = pango_lines_get_line (lines, pango_lines_get_line_count (lines) - 1, NULL, NULL);
line_display_index_to_iter (layout, display, iter,
pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line), 0);
@@ -3326,20 +3338,20 @@ gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
{
int prev_offset = pango_layout_line_get_start_index (layout_line);
- tmp_list = tmp_list->next;
- while (tmp_list)
+ line_no++;
+ while (line_no < pango_lines_get_line_count (pango_layout_get_lines (display->layout)))
{
- layout_line = tmp_list->data;
+ layout_line = pango_lines_get_line (pango_layout_get_lines (display->layout), line_no, NULL, NULL);
if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) ||
- !tmp_list->next)
+ line_no + 1 == pango_lines_get_line_count (pango_layout_get_lines (display->layout)))
{
line_display_index_to_iter (layout, display, iter, prev_offset, 0);
break;
}
prev_offset = pango_layout_line_get_start_index (layout_line);
- tmp_list = tmp_list->next;
+ line_no++;
}
}
@@ -3372,6 +3384,8 @@ gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
gboolean found = FALSE;
gboolean found_after = FALSE;
gboolean first = TRUE;
+ PangoLines *lines;
+ int line_no;
g_return_val_if_fail (GTK_IS_TEXT_LAYOUT (layout), FALSE);
g_return_val_if_fail (iter != NULL, FALSE);
@@ -3382,8 +3396,6 @@ gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
while (line && !found_after)
{
- GSList *tmp_list;
-
display = gtk_text_layout_get_line_display (layout, line, FALSE);
if (display->height == 0)
@@ -3397,10 +3409,11 @@ gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
else
line_byte = 0;
- tmp_list = pango_layout_get_lines_readonly (display->layout);
- while (tmp_list && !found_after)
+ lines = pango_layout_get_lines (display->layout);
+ line_no = 0;
+ while (line_no < pango_lines_get_line_count (lines) && !found_after)
{
- PangoLayoutLine *layout_line = tmp_list->data;
+ PangoLayoutLine *layout_line = pango_lines_get_line (lines, line_no, NULL, NULL);
if (found)
{
@@ -3408,10 +3421,10 @@ gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
pango_layout_line_get_start_index (layout_line), 0);
found_after = TRUE;
}
- else if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) || !tmp_list->next)
+ else if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) || line_no + 1 == pango_lines_get_line_count (lines))
found = TRUE;
- tmp_list = tmp_list->next;
+ line_no++;
}
next:
@@ -3445,8 +3458,9 @@ gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout,
GtkTextLine *line;
GtkTextLineDisplay *display;
int line_byte;
- GSList *tmp_list;
GtkTextIter orig;
+ PangoLines *lines;
+ int line_no;
g_return_val_if_fail (GTK_IS_TEXT_LAYOUT (layout), FALSE);
g_return_val_if_fail (iter != NULL, FALSE);
@@ -3457,12 +3471,14 @@ gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout,
display = gtk_text_layout_get_line_display (layout, line, FALSE);
line_byte = line_display_iter_to_index (layout, display, iter);
- tmp_list = pango_layout_get_lines_readonly (display->layout);
- while (tmp_list)
+ lines = pango_layout_get_lines (display->layout);
+ line_no = 0;
+
+ while (line_no < pango_lines_get_line_count (lines))
{
- PangoLayoutLine *layout_line = tmp_list->data;
+ PangoLayoutLine *layout_line = pango_lines_get_line (lines, line_no, NULL, NULL);
- if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) || !tmp_list->next)
+ if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) || line_no + 1 == pango_lines_get_line_count (lines))
{
line_display_index_to_iter (layout, display, iter,
direction < 0 ? pango_layout_line_get_start_index (layout_line) : pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line),
@@ -3479,7 +3495,7 @@ gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout,
break;
}
- tmp_list = tmp_list->next;
+ line_no++;
}
gtk_text_line_display_unref (display);
@@ -3504,7 +3520,8 @@ gtk_text_layout_iter_starts_line (GtkTextLayout *layout,
GtkTextLine *line;
GtkTextLineDisplay *display;
int line_byte;
- GSList *tmp_list;
+ PangoLines *lines;
+ int line_no;
g_return_val_if_fail (GTK_IS_TEXT_LAYOUT (layout), FALSE);
g_return_val_if_fail (iter != NULL, FALSE);
@@ -3513,13 +3530,14 @@ gtk_text_layout_iter_starts_line (GtkTextLayout *layout,
display = gtk_text_layout_get_line_display (layout, line, FALSE);
line_byte = line_display_iter_to_index (layout, display, iter);
- tmp_list = pango_layout_get_lines_readonly (display->layout);
- while (tmp_list)
+ lines = pango_layout_get_lines (display->layout);
+ line_no = 0;
+ while (line_no < pango_lines_get_line_count (lines))
{
- PangoLayoutLine *layout_line = tmp_list->data;
+ PangoLayoutLine *layout_line = pango_lines_get_line (lines, line_no, NULL, NULL);
if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) ||
- !tmp_list->next)
+ line_no + 1 == pango_lines_get_line_count (lines))
{
/* We're located on this line or the para delimiters before
* it
@@ -3532,7 +3550,7 @@ gtk_text_layout_iter_starts_line (GtkTextLayout *layout,
return FALSE;
}
- tmp_list = tmp_list->next;
+ line_no++;
}
g_assert_not_reached ();
@@ -3581,7 +3599,7 @@ gtk_text_layout_move_iter_to_x (GtkTextLayout *layout,
do
{
- PangoLayoutLine *layout_line = pango_layout_iter_get_line_readonly (layout_iter);
+ PangoLayoutLine *layout_line = pango_layout_iter_get_line (layout_iter);
if (line_byte < pango_layout_line_get_start_index (layout_line) + pango_layout_line_get_length (layout_line) ||
pango_layout_iter_at_last_line (layout_iter))
@@ -3665,12 +3683,16 @@ gtk_text_layout_move_iter_visually (GtkTextLayout *layout,
if (count > 0)
{
- pango_layout_move_cursor_visually (display->layout, strong, line_byte, 0, 1, &new_index, &new_trailing);
+ pango_lines_move_cursor (pango_layout_get_lines (display->layout), strong,
+ NULL, line_byte, 0, 1,
+ NULL, &new_index, &new_trailing);
count--;
}
else
{
- pango_layout_move_cursor_visually (display->layout, strong, line_byte, 0, -1, &new_index, &new_trailing);
+ pango_lines_move_cursor (pango_layout_get_lines (display->layout), strong,
+ NULL, line_byte, 0, -1,
+ NULL, &new_index, &new_trailing);
count++;
}
@@ -3870,16 +3892,19 @@ render_para (GskPangoRenderer *crenderer,
do
{
- PangoLayoutLine *line = pango_layout_iter_get_line_readonly (iter);
+ PangoLayoutLine *line = pango_layout_iter_get_line (iter);
int selection_y, selection_height;
+ PangoRectangle ext;
int first_y, last_y;
PangoRectangle line_rect;
int baseline;
gboolean at_last_line;
pango_layout_iter_get_line_extents (iter, NULL, &line_rect);
- baseline = pango_layout_iter_get_baseline (iter);
- pango_layout_iter_get_line_yrange (iter, &first_y, &last_y);
+ baseline = pango_layout_iter_get_line_baseline (iter);
+ pango_layout_iter_get_line_extents (iter, NULL, &ext);
+ first_y = ext.y;
+ last_y = ext.y + ext.height;
/* Adjust for margins */
@@ -3954,7 +3979,7 @@ render_para (GskPangoRenderer *crenderer,
int *ranges = NULL;
int n_ranges, i;
- pango_layout_line_get_x_ranges (line, selection_start_index, selection_end_index, &ranges, &n_ranges);
+ pango_lines_get_x_ranges (pango_layout_iter_get_lines (iter), line, NULL, selection_start_index, NULL, selection_end_index, &ranges, &n_ranges);
gsk_pango_renderer_set_state (crenderer, GSK_PANGO_RENDERER_SELECTED);