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: समीर सिंह Sameer Singh
Subject: Re: Implementing Vertical Text support in Emacs
Date: Fri, 30 Sep 2022 01:27:01 +0530

Before you modify display_line, you need to decide how will the
vertical-layout display produce glyphs.

Can you please expand more on this?
How to produce glyphs in a column wise order?
I looked at gui_produce_glyphs and that led me to append_glyph, but I could not figure out how the glyphs are produced.
There is also draw_glyphs but I think working with that will require editing the low level *term files (if it even is the right function)

Thanks

On Sat, Sep 10, 2022 at 9:47 PM Eli Zaretskii <eliz@gnu.org> wrote:
> From: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
> Date: Sat, 10 Sep 2022 21:23:32 +0530
> Cc: emacs-devel@gnu.org
>
> In order to find the "real meat" of the display_line function I started to slowly remove most of the lines of the
> function as long as it does not break emacs and text can be typed.
>
> In the end I was left with this a 20-25 lines function (excluding comments and spaces):
> (I have attached this function too)
>
> static bool
> display_line (struct it *it, int cursor_vpos)
> {
>   struct glyph_row *row = it->glyph_row;

>   /* Clear the result glyph row and enable it.  */
>   prepare_desired_row (it->w, row, false);
>
>   row->y = it->current_y;
>   
>   /* Loop generating characters.  The loop is left with IT on the next
>      character to display.  */
>   while (true)
>     {
>             
>       /* Retrieve the next thing to display.  Value is false if end of
> buffer reached.  */
>       if (!get_next_display_element (it))
> {
>  break;
> }
>
>       PRODUCE_GLYPHS (it);
>       
>     at_end_of_line:
>       /* Is this a line end?  If yes, we're also done, after making
> sure that a non-default face is extended up to the right
> margin of the window.  */
>       if (ITERATOR_AT_END_OF_LINE_P (it))
> { 
>  /* Consume the line end.  This skips over invisible lines.  */
>  set_iterator_to_next (it, true);
>  break;
> }
>
>       set_iterator_to_next (it, true);
>     }
>
>   /* Compute pixel dimensions of this line.  */
>   compute_line_metrics (it);
>
>   /* Prepare for the next line.  This line starts horizontally at (X
>      HPOS) = (0 0).  Vertical positions are incremented.  As a
>      convenience for the caller, IT->glyph_row is set to the next
>      row to be used.  */
>
>   it->current_y += row->height;
>   ++it->glyph_row;
>   return MATRIX_ROW_DISPLAYS_TEXT_P (row);
> }
>
> Obviously most of the things do not work such as bidi, word wrapping, displaying cursor and line numbers but
> still text is being shown
> in rows one after the other and it can be scrolled, but now there are no lines mentioning the hpos, the
> x-coordinate, first_visible_x or
> last_visible_x, does that mean I do not understand the display_line function? I thought its function was to fill a
> row with glyphs in the desired matrix
> to display it on the glass but now I cannot find a line which fills the matrix.

That hides behind the PRODUCE_GLYPHS macro.

> You had advised to swap the x and y
> coordinates, but here there
> is no x coordinate present! How can the redisplay still work?

display_line also makes the decisions when the screen line is full and
the rest should be on the next screen line this is one of its most
important roles.  But you have removed that code, so you don't see it
in what's left.  The parts that deal with the X coordinate that
exceeds last_visible_x are those which make that decision.

reply via email to

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