emacs-devel
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]