[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Implementing Vertical Text support in Emacs
From: |
Eli Zaretskii |
Subject: |
Re: Implementing Vertical Text support in Emacs |
Date: |
Thu, 24 Nov 2022 13:39:24 +0200 |
> From: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
> Date: Sun, 20 Nov 2022 17:38:05 +0530
> Cc: emacs-devel@gnu.org
>
> I'm not sure I understand the question. Are you saying that if you ignore
> the line overflow, termination of a line, etc., you can write code that does
> display characters column-wise?
>
> I thought that displaying line row wise is the "base" of the display_line
> function with code for
> line truncation, overflow, bidi etc added on top of it in "if" blocks
That is basically correct.
> so if I could just get the base to work (i.e. displaying lines in a
> column) then I could work on the the finer details. Am I wrong?
No, you are not wrong. But the base of display_line is very simple:
prepare_desired_row (it->w, row, false);
row->y = it->current_y;
row->start = it->start;
row->continuation_lines_width = it->continuation_lines_width;
row->displays_text_p = true;
row->starts_in_middle_of_char_p = it->starts_in_middle_of_char_p;
it->starts_in_middle_of_char_p = false;
it->stretch_adjust = 0;
row->ascent = it->max_ascent;
row->height = it->max_ascent + it->max_descent;
row->phys_ascent = it->max_phys_ascent;
row->phys_height = it->max_phys_ascent + it->max_phys_descent;
row->extra_line_spacing = it->max_extra_line_spacing;
while (true)
{
if (!get_next_display_element (it))
{
row->ends_at_zv_p = true;
break;
}
PRODUCE_GLYPHS (it);
if (/* Not a newline. */
nglyphs > 0
/* Glyphs produced fit entirely in the line. */
&& it->current_x < it->last_visible_x)
{
it->hpos += nglyphs;
row->ascent = max (row->ascent, it->max_ascent);
row->height = max (row->height, it->max_ascent + it->max_descent);
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
row->phys_height = max (row->phys_height,
it->max_phys_ascent + it->max_phys_descent);
}
else
{
++it->hpos;
row->ascent = max (row->ascent, it->max_ascent);
row->height = max (row->height, it->max_ascent + it->max_descent);
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
row->phys_height = max (row->phys_height,
it->max_phys_ascent + it->max_phys_descent);
row->extra_line_spacing = max (row->extra_line_spacing,
it->max_extra_line_spacing);
}
if (ITERATOR_AT_END_OF_LINE_P (it))
{
/* Add a space at the end of the line that is used to
display the cursor there. */
if (!IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
append_space_for_newline (it, false);
/* Extend the face to the end of the line. */
extend_face_to_end_of_line (it);
/* Consume the line end. This skips over invisible lines. */
set_iterator_to_next (it, true);
it->continuation_lines_width = 0;
break;
}
}
compute_line_metrics (it);
Basically, it loops calling get_next_display_element, then PRODUCE_GLYPHS,
and then set_iterator_to_next.