> 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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4