diff --git a/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff b/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff new file mode 100644 index 0000000000..d15d5b0aab --- /dev/null +++ b/desktop/toolkit/gtk/pango/files/1cf8e9b3cadad6efe510a177ca2be8f852022333.diff @@ -0,0 +1,157 @@ +diff --git a/tests/fonts/DejaVuSansMono.ttf b/tests/fonts/DejaVuSansMono.ttf +new file mode 100644 +index 0000000000000000000000000000000000000000..d723948fed5dc9d2e63f57af9f80f2a472aff898 +Binary files /dev/null and b/tests/fonts/DejaVuSansMono.ttf differ +diff --git a/tests/fonts/fonts.conf b/tests/fonts/fonts.conf +index 5ff7022b727b37ef2d52efd2738682baa8af9280..4308770bc153dfae16639b2c6d8b4eb6822b0db2 100644 +--- a/tests/fonts/fonts.conf ++++ b/tests/fonts/fonts.conf +@@ -62,4 +62,10 @@ + Noto Color Emoji + + ++ ++ ++ DejaVu Sans Mono ++ monospace ++ ++ + +diff --git a/tests/layouts/valid-12.layout b/tests/layouts/valid-12.layout +index 099813cefb41cf5f93040323d98342c4c06a0970..3c09f51f9b22cbde88bebd139296cf34b25052dd 100644 +--- a/tests/layouts/valid-12.layout ++++ b/tests/layouts/valid-12.layout +@@ -52,8 +52,8 @@ + "is-wrapped" : true, + "is-ellipsized" : false, + "unknown-glyphs" : 1, +- "width" : 202752, +- "height" : 202752, ++ "width" : 179200, ++ "height" : 179200, + "log-attrs" : [ + { + "char-break" : true, +@@ -258,7 +258,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -330,7 +330,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -402,7 +402,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -554,7 +554,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -626,7 +626,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 46080, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -698,7 +698,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +diff --git a/tests/layouts/valid-13.layout b/tests/layouts/valid-13.layout +index bd0f04fa11763fdcd57077c92c5c69fced592960..cb2ac92a2af2e46e0c4277234cbb5f3b46e80275 100644 +--- a/tests/layouts/valid-13.layout ++++ b/tests/layouts/valid-13.layout +@@ -53,8 +53,8 @@ + "is-wrapped" : false, + "is-ellipsized" : false, + "unknown-glyphs" : 1, +- "width" : 386048, +- "height" : 386048, ++ "width" : 315392, ++ "height" : 315392, + "log-attrs" : [ + { + "char-break" : true, +@@ -271,7 +271,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -355,7 +355,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -439,7 +439,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -607,7 +607,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 17408, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -691,7 +691,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 46080, + "is-cluster-start" : true, + "log-cluster" : 0 + } +@@ -775,7 +775,7 @@ + "glyphs" : [ + { + "glyph" : 268435455, +- "width" : 51200, ++ "width" : 43008, + "is-cluster-start" : true, + "log-cluster" : 0 + } diff --git a/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff b/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff new file mode 100644 index 0000000000..b4d2ce2d09 --- /dev/null +++ b/desktop/toolkit/gtk/pango/files/dc5b1fdea7d63277f2b31489896d1947f0511a24.diff @@ -0,0 +1,426 @@ +diff --git a/pango/pango-layout.c b/pango/pango-layout.c +index ed46d57a6e4c26f34e23044544d0b0ec34cb93f3..a495596ccbb022948a7a3dfcee9e3852046c1b7b 100644 +--- a/pango/pango-layout.c ++++ b/pango/pango-layout.c +@@ -3662,6 +3662,31 @@ get_decimal_prefix_width (PangoItem *item, + g_free (log_widths); + } + ++static int ++line_width (ParaBreakState *state, ++ PangoLayoutLine *line) ++{ ++ GSList *l; ++ int i; ++ int width = 0; ++ ++ if (state->remaining_width > -1) ++ return state->line_width - state->remaining_width; ++ ++ /* Compute the width of the line currently - inefficient, but easier ++ * than keeping the current width of the line up to date everywhere ++ */ ++ for (l = line->runs; l; l = l->next) ++ { ++ PangoLayoutRun *run = l->data; ++ ++ for (i = 0; i < run->glyphs->num_glyphs; i++) ++ width += run->glyphs->glyphs[i].geometry.width; ++ } ++ ++ return width; ++} ++ + static PangoGlyphString * + shape_run (PangoLayoutLine *line, + ParaBreakState *state, +@@ -3671,7 +3696,7 @@ shape_run (PangoLayoutLine *line, + PangoGlyphString *glyphs = pango_glyph_string_new (); + + if (layout->text[item->offset] == '\t') +- shape_tab (line, &state->last_tab, &state->properties, state->line_width - state->remaining_width, item, glyphs); ++ shape_tab (line, &state->last_tab, &state->properties, line_width (state, line), item, glyphs); + else + { + PangoShapeFlags shape_flags = PANGO_SHAPE_NONE; +diff --git a/tests/layouts/tabs-nowrap.layout b/tests/layouts/tabs-nowrap.layout +new file mode 100644 +index 0000000000000000000000000000000000000000..4a1d40b5202c776079fdf017110a2e8ab3bc5f7f +--- /dev/null ++++ b/tests/layouts/tabs-nowrap.layout +@@ -0,0 +1,363 @@ ++{ ++ "context" : { ++ "font" : "serif 12", ++ "base-gravity" : "south", ++ "gravity-hint" : "natural", ++ "base-dir" : "weak-ltr", ++ "round-glyph-positions" : true, ++ "transform" : [ ++ 1, ++ 0, ++ 0, ++ 1, ++ 0, ++ 0 ++ ] ++ }, ++ "comment" : "A case where tabs were broken if line wrapping is disabled.", ++ "text" : "123\t9\n123456789", ++ "attributes" : [ ++ { ++ "type" : "font-features", ++ "value" : "tnum=1" ++ } ++ ], ++ "font" : "DejaVu Sans Mono 32", ++ "output" : { ++ "is-wrapped" : false, ++ "is-ellipsized" : false, ++ "unknown-glyphs" : 0, ++ "width" : 239616, ++ "height" : 239616, ++ "log-attrs" : [ ++ { ++ "char-break" : true, ++ "cursor-position" : true, ++ "word-start" : true, ++ "sentence-boundary" : true, ++ "sentence-start" : true, ++ "backspace-deletes-character" : true, ++ "word-boundary" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "white" : true, ++ "cursor-position" : true, ++ "word-end" : true, ++ "word-boundary" : true ++ }, ++ { ++ "line-break" : true, ++ "char-break" : true, ++ "cursor-position" : true, ++ "word-start" : true, ++ "backspace-deletes-character" : true, ++ "word-boundary" : true ++ }, ++ { ++ "char-break" : true, ++ "white" : true, ++ "cursor-position" : true, ++ "word-end" : true, ++ "sentence-end" : true, ++ "word-boundary" : true ++ }, ++ { ++ "line-break" : true, ++ "mandatory-break" : true, ++ "char-break" : true, ++ "cursor-position" : true, ++ "word-start" : true, ++ "sentence-boundary" : true, ++ "sentence-start" : true, ++ "backspace-deletes-character" : true, ++ "word-boundary" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "char-break" : true, ++ "cursor-position" : true ++ }, ++ { ++ "line-break" : true, ++ "mandatory-break" : true, ++ "char-break" : true, ++ "white" : true, ++ "cursor-position" : true, ++ "word-end" : true, ++ "sentence-boundary" : true, ++ "sentence-end" : true, ++ "word-boundary" : true ++ } ++ ], ++ "lines" : [ ++ { ++ "start-index" : 0, ++ "length" : 5, ++ "paragraph-start" : true, ++ "direction" : "ltr", ++ "runs" : [ ++ { ++ "offset" : 0, ++ "length" : 3, ++ "text" : "123", ++ "bidi-level" : 0, ++ "gravity" : "south", ++ "language" : "en-us", ++ "script" : "common", ++ "font" : { ++ "description" : "DejaVu Sans Mono 32", ++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a", ++ "matrix" : [ ++ 1, ++ -0, ++ -0, ++ 1, ++ 0, ++ 0 ++ ] ++ }, ++ "flags" : 0, ++ "extra-attributes" : [ ++ { ++ "type" : "font-features", ++ "value" : "tnum=1" ++ } ++ ], ++ "y-offset" : 0, ++ "start-x-offset" : 0, ++ "end-x-offset" : 0, ++ "glyphs" : [ ++ { ++ "glyph" : 20, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 0 ++ }, ++ { ++ "glyph" : 21, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 1 ++ }, ++ { ++ "glyph" : 22, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 2 ++ } ++ ] ++ }, ++ { ++ "offset" : 3, ++ "length" : 1, ++ "text" : "\t", ++ "bidi-level" : 0, ++ "gravity" : "south", ++ "language" : "en-us", ++ "script" : "common", ++ "font" : { ++ "description" : "DejaVu Sans Mono 32", ++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a", ++ "matrix" : [ ++ 1, ++ -0, ++ -0, ++ 1, ++ 0, ++ 0 ++ ] ++ }, ++ "flags" : 0, ++ "extra-attributes" : [ ++ { ++ "type" : "font-features", ++ "value" : "tnum=1" ++ } ++ ], ++ "y-offset" : 0, ++ "start-x-offset" : 0, ++ "end-x-offset" : 0, ++ "glyphs" : [ ++ { ++ "glyph" : 268435455, ++ "width" : 133120, ++ "is-cluster-start" : true, ++ "log-cluster" : 0 ++ } ++ ] ++ }, ++ { ++ "offset" : 4, ++ "length" : 1, ++ "text" : "9", ++ "bidi-level" : 0, ++ "gravity" : "south", ++ "language" : "en-us", ++ "script" : "common", ++ "font" : { ++ "description" : "DejaVu Sans Mono 32", ++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a", ++ "matrix" : [ ++ 1, ++ -0, ++ -0, ++ 1, ++ 0, ++ 0 ++ ] ++ }, ++ "flags" : 0, ++ "extra-attributes" : [ ++ { ++ "type" : "font-features", ++ "value" : "tnum=1" ++ } ++ ], ++ "y-offset" : 0, ++ "start-x-offset" : 0, ++ "end-x-offset" : 0, ++ "glyphs" : [ ++ { ++ "glyph" : 28, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 0 ++ } ++ ] ++ } ++ ] ++ }, ++ { ++ "start-index" : 6, ++ "length" : 9, ++ "paragraph-start" : true, ++ "direction" : "ltr", ++ "runs" : [ ++ { ++ "offset" : 6, ++ "length" : 9, ++ "text" : "123456789", ++ "bidi-level" : 0, ++ "gravity" : "south", ++ "language" : "en-us", ++ "script" : "common", ++ "font" : { ++ "description" : "DejaVu Sans Mono 32", ++ "checksum" : "84c5467cadd1f6f23db0d9fbb6377e0d301334d3b5f36e6d5acebd34d0857d3a", ++ "matrix" : [ ++ 1, ++ -0, ++ -0, ++ 1, ++ 0, ++ 0 ++ ] ++ }, ++ "flags" : 0, ++ "extra-attributes" : [ ++ { ++ "type" : "font-features", ++ "value" : "tnum=1" ++ } ++ ], ++ "y-offset" : 0, ++ "start-x-offset" : 0, ++ "end-x-offset" : 0, ++ "glyphs" : [ ++ { ++ "glyph" : 20, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 0 ++ }, ++ { ++ "glyph" : 21, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 1 ++ }, ++ { ++ "glyph" : 22, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 2 ++ }, ++ { ++ "glyph" : 23, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 3 ++ }, ++ { ++ "glyph" : 24, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 4 ++ }, ++ { ++ "glyph" : 25, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 5 ++ }, ++ { ++ "glyph" : 26, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 6 ++ }, ++ { ++ "glyph" : 27, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 7 ++ }, ++ { ++ "glyph" : 28, ++ "width" : 26624, ++ "is-cluster-start" : true, ++ "log-cluster" : 8 ++ } ++ ] ++ } ++ ] ++ } ++ ] ++ } ++} +diff --git a/tests/meson.build b/tests/meson.build +index 2acf0def5f2d016884cc4cab63ab6fc77bde85b6..b15c72914b73db2649caeb7677604de6b1fa675b 100644 +--- a/tests/meson.build ++++ b/tests/meson.build +@@ -96,6 +96,7 @@ installed_test_layouts_data = [ + 'layouts/effigy.layout', + 'layouts/kebab.layout', + 'layouts/tabs.layout', ++ 'layouts/tabs-nowrap.layout', + 'layouts/valid-1.layout', + 'layouts/valid-2.layout', + 'layouts/valid-3.layout', diff --git a/desktop/toolkit/gtk/pango/pspec.xml b/desktop/toolkit/gtk/pango/pspec.xml index d6813155dc..0c4479fb5d 100644 --- a/desktop/toolkit/gtk/pango/pspec.xml +++ b/desktop/toolkit/gtk/pango/pspec.xml @@ -35,6 +35,8 @@ 56174802a73d8855b7497d90f722b37233c6b477.diff + 1cf8e9b3cadad6efe510a177ca2be8f852022333.diff + dc5b1fdea7d63277f2b31489896d1947f0511a24.diff