Skip to content

Tab stops - #934

Open
WilliamDGH wants to merge 34 commits into
linebender:mainfrom
WilliamDGH:tab-stops
Open

WilliamDGH wants to merge 34 commits into
linebender:mainfrom
WilliamDGH:tab-stops

Conversation

@WilliamDGH

Copy link
Copy Markdown

Implement tab stops, which fixes issue 302.

LLM Contributions:

  • LLM did the research on CSS Text 4 and Blink's Font::TabWidth.
  • LLM created an implementation plan, a reference implementation and all test files.
  • I wrote the implementation code by hand following that plan.

What is it

Preserved tabs (U+0009) now advance to the next tab stop, following CSS tab-size. A tab shapes to no glyphs and a zero advance like a newline. The line breaker computes its advance when it reaches it and stores it per line, and EffectiveSpacing adds it back on read, like justification.

parley_engine

  • Changed shaping so a tab cluster has no glyphs and a zero advance, like a newline, instead of whatever glyph the font maps U+0009 to. Its width is left to the layout engine.

parley

  • Added StyleProperty::TabSize(TabSize). TabSize { size, skip_threshold } holds two lengths in layout units, scaled like other lengths and passed from TextStyle through the resolved styles to layout::Style. size defaults to 0.0, so tabs take no space until a size is set. A tab whose next stop is closer than skip_threshold skips to the one after it (one stop at most); when unset, the threshold is half the root style's font size, resolved once from the style table's root entry.
  • Added layout::tab::tab_advance to compute the distance to the next tab stop.
  • Changed the line breaker to size each tab when it reaches it and record the advance per line in LayoutData::tab_advances (each LineData owns a range, like aligned_subtree_offsets). Tabs with no advance get no entry. Backtracking to an earlier break, revert_to and a new layout all truncate the table.
  • Added the line's justification and tab advances as fields of EffectiveSpacing, which adds a tab's recorded advance as its after gap on read, like justification (a binary search over the line's entries). Hanging whitespace, run and cluster advances, glyph positioning and hit testing all go through it.
  • Changed Spacing::gaps to give tabs no letter or word spacing of their own, as CSS puts that spacing into the tab size's unit rather than around the tab.
  • Changed GlyphRunIter to end a glyph run at a glyphless advance and shift the next run by it, and to count spacing gaps for glyphless atoms like the breaker does.
  • Changed ContentWidthsMeasurer to size tabs from each constraint's running width, tracking hanging whitespace per constraint, so it keeps matching the breaker.
  • Declared parley/src/tests/test_layout.rs in tests/mod.rs.

Changelog

Added

  • StyleProperty::TabSize: preserved tabs advance to tab stops following CSS tab-size, with a configurable skip threshold. Tabs take no space until a tab size is set.

Changed

  • parley_engine: tabs shape to no glyphs and a zero advance, like newlines.

parley_engine: check that marks and joiners after a tab leave it glyphless
@nicoburns

nicoburns commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Blitz WPT results are looking generally good (+69 -20). See DioxusLabs/blitz#1313.

Benchmark results are not so great (roughly +20% on line-breaking, and content widths, and +10% glyph iteration). I suspect we can do better than this.

phase base #934 Δ
build ~43.9 ~44.4 ~+1%
break+align ~1.99 ~2.45 +23%
widths ~0.90 ~0.95 +5%
widths spaced ~1.00 ~1.19 +18%
glyph-iter ~1.94 ~2.16 +11%

@nicoburns

nicoburns commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

I haven't fully reviewed the changes yet, but DioxusLabs#96 has this down to closer to 2%.

@WilliamDGH feel free to incorporate any of those changes into your branch as you see fit. And also as a general point, I didn't have to do much more than point my agent at the PR and tell it to fix the regressions to get these results. Would recommend!

@WilliamDGH

WilliamDGH commented Oct 29, 2026 •

Copy link
Copy Markdown
Author

I haven't fully reviewed the changes yet, but DioxusLabs#96 has this down to closer to 2%.

@WilliamDGH feel free to incorporate any of those changes into your branch as you see fit. And also as a general point, I didn't have to do much more than point my agent at the PR and tell it to fix the regressions to get these results. Would recommend!

Thanks @nicoburns , I will take a look of that PR and try to fix the benchmark results.

@WilliamDGH

WilliamDGH commented Oct 29, 2026 •

Copy link
Copy Markdown
Author

Added 3 commits that recover the regressions on text without tabs, based on DioxusLabs/parley#96 (thanks @nicoburns).

Ran Tango benchmark on my Mac and this is the results:

Group before now
Line Breaking (12 rows) +6.5 .. +18.7 +0.1 .. +4.8
Content Widths uniform / mixed (18) +7.0 .. +25.9 -8.5 .. +7.9 (latin 8000 mixed +5.7 / +7.9 in both runs)
Content Widths spacing (3) +5.2 .. +15.7 +1.8 .. +7.2
Page Content Widths (3) +13.8 .. +21.7 -4.9 .. +7.0
Page Break / Resize (6) +9.7 .. +16.8 -0.7 .. +1.5
Glyph Runs + Page Glyph Runs (11) -5.3 .. +9.2 -9.1 .. -0.6
Query Cursor line down + up (4), not touched +2.4 .. +4.0 +2.7 .. +4.4
everything else within ±2 within ±1.5
Full Tango output, this branch vs merge-base (102 rows, -t 2)
Default Style - arabic 20 characters               [   8.3 us ...   8.2 us ]      -0.49%
Default Style - latin 20 characters                [   3.8 us ...   3.9 us ]      +1.45%*
Default Style - japanese 20 characters             [   7.1 us ...   7.2 us ]      +1.11%*
Default Style - arabic 400 characters              [ 167.4 us ... 167.3 us ]      -0.06%
Default Style - latin 400 characters               [  54.9 us ...  55.0 us ]      +0.19%
Default Style - japanese 400 characters            [ 125.7 us ... 126.0 us ]      +0.26%
Default Style - arabic 8000 characters             [   3.4 ms ...   3.4 ms ]      +0.04%
Default Style - latin 8000 characters              [   1.1 ms ...   1.1 ms ]      +0.71%
Default Style - japanese 8000 characters           [   2.4 ms ...   2.4 ms ]      +0.12%
Styled - arabic 20 characters                      [   9.9 us ...   9.8 us ]      -0.68%
Styled - latin 20 characters                       [   5.4 us ...   5.4 us ]      -0.12%
Styled - japanese 20 characters                    [   8.1 us ...   8.1 us ]      -0.10%
Styled - arabic 400 characters                     [ 183.3 us ... 181.2 us ]      -1.15%*
Styled - latin 400 characters                      [  70.0 us ...  70.2 us ]      +0.29%
Styled - japanese 400 characters                   [ 138.4 us ... 137.9 us ]      -0.32%
Styled - arabic 8000 characters                    [   3.8 ms ...   3.8 ms ]      -0.96%
Styled - latin 8000 characters                     [   1.4 ms ...   1.4 ms ]      +0.19%
Styled - japanese 8000 characters                  [   2.7 ms ...   2.7 ms ]      +0.01%
Glyph Runs - latin 8000 characters, uniform        [  45.6 us ...  43.3 us ]      -5.14%*
Glyph Runs - latin 8000 characters, non-splitting every 1 chars [ 142.0 us ... 139.2 us ]      -1.98%*
Glyph Runs - latin 8000 characters, non-splitting every 16 chars [  51.7 us ...  49.3 us ]      -4.76%*
Glyph Runs - latin 8000 characters, splitting every 1 chars [ 210.6 us ... 199.2 us ]      -5.43%*
Glyph Runs - latin 8000 characters, splitting every 16 chars [  54.7 us ...  52.9 us ]      -3.16%*
Glyph Runs - arabic 8000 characters, mixed         [ 160.6 us ... 154.6 us ]      -3.74%*
Glyph Runs - latin 8000 characters, mixed          [  70.0 us ...  68.2 us ]      -2.63%*
Glyph Runs - japanese 8000 characters, mixed       [ 135.6 us ... 133.9 us ]      -1.20%*
Content Widths - arabic 20 characters, uniform     [ 100.3 ns ...  99.3 ns ]      -1.04%*
Content Widths - latin 20 characters, uniform      [  59.3 ns ...  63.4 ns ]      +6.82%*
Content Widths - japanese 20 characters, uniform   [ 100.3 ns ... 102.0 ns ]      +1.66%*
Content Widths - arabic 400 characters, uniform    [   1.6 us ...   1.6 us ]      +1.71%*
Content Widths - latin 400 characters, uniform     [ 923.2 ns ... 957.6 ns ]      +3.73%*
Content Widths - japanese 400 characters, uniform  [   1.4 us ...   1.3 us ]      -8.51%*
Content Widths - arabic 8000 characters, uniform   [  29.8 us ...  30.6 us ]      +2.61%*
Content Widths - latin 8000 characters, uniform    [  18.8 us ...  18.5 us ]      -1.35%*
Content Widths - japanese 8000 characters, uniform [  25.1 us ...  23.9 us ]      -4.66%*
Content Widths - arabic 20 characters, mixed       [ 105.2 ns ... 107.9 ns ]      +2.54%*
Content Widths - latin 20 characters, mixed        [  68.1 ns ...  70.7 ns ]      +3.83%*
Content Widths - japanese 20 characters, mixed     [ 111.6 ns ... 114.9 ns ]      +3.02%*
Content Widths - arabic 400 characters, mixed      [   1.6 us ...   1.7 us ]      +6.61%*
Content Widths - latin 400 characters, mixed       [   1.1 us ...   1.1 us ]      -1.37%*
Content Widths - japanese 400 characters, mixed    [   1.6 us ...   1.5 us ]      -3.59%*
Content Widths - arabic 8000 characters, mixed     [  32.0 us ...  32.9 us ]      +3.02%*
Content Widths - latin 8000 characters, mixed      [  20.7 us ...  21.9 us ]      +5.70%*
Content Widths - japanese 8000 characters, mixed   [  31.0 us ...  29.1 us ]      -5.97%*
Content Widths - arabic 8000 characters, spacing   [  33.2 us ...  35.1 us ]      +5.80%*
Content Widths - latin 8000 characters, spacing    [  23.6 us ...  25.3 us ]      +7.16%*
Content Widths - japanese 8000 characters, spacing [  33.0 us ...  33.9 us ]      +2.75%*
Word + Letter Spacing - arabic 20 characters       [   8.4 us ...   8.3 us ]      -1.30%*
Word + Letter Spacing - latin 20 characters        [   3.9 us ...   3.9 us ]      +0.67%
Word + Letter Spacing - japanese 20 characters     [   7.5 us ...   7.4 us ]      -1.08%*
Word + Letter Spacing - arabic 400 characters      [ 171.1 us ... 171.3 us ]      +0.13%
Word + Letter Spacing - latin 400 characters       [  54.4 us ...  54.6 us ]      +0.40%
Word + Letter Spacing - japanese 400 characters    [ 125.4 us ... 125.0 us ]      -0.30%
Word + Letter Spacing - arabic 8000 characters     [   3.4 ms ...   3.4 ms ]      +0.32%
Word + Letter Spacing - latin 8000 characters      [   1.1 ms ...   1.1 ms ]      -0.11%
Word + Letter Spacing - japanese 8000 characters   [   2.4 ms ...   2.4 ms ]      -0.04%
Repeated Justification - latin 8000 characters     [  22.1 us ...  22.3 us ]      +0.79%
Line Breaking - arabic 8000 characters, narrow     [ 161.0 us ... 164.1 us ]      +1.93%*
Line Breaking - arabic 8000 characters, wider      [  92.0 us ...  92.9 us ]      +0.89%
Line Breaking - arabic 8000 characters, unwrapped  [  73.3 us ...  74.6 us ]      +1.83%*
Line Breaking - latin 8000 characters, narrow      [ 130.5 us ... 134.2 us ]      +2.84%*
Line Breaking - latin 8000 characters, wider       [  62.6 us ...  62.6 us ]      +0.07%
Line Breaking - latin 8000 characters, unwrapped   [  40.5 us ...  42.3 us ]      +4.32%*
Line Breaking - japanese 8000 characters, narrow   [ 138.7 us ... 141.0 us ]      +1.65%*
Line Breaking - japanese 8000 characters, wider    [  90.9 us ...  91.8 us ]      +1.04%*
Line Breaking - japanese 8000 characters, unwrapped [  77.4 us ...  78.1 us ]      +0.87%
Line Breaking - arabic 8000 characters, wrapped + spacing [  97.9 us ...  99.2 us ]      +1.26%*
Line Breaking - latin 8000 characters, wrapped + spacing [  69.9 us ...  69.3 us ]      -0.87%
Line Breaking - japanese 8000 characters, wrapped + spacing [  95.8 us ...  96.5 us ]      +0.71%
Long Line - arabic                                 [   3.4 ms ...   3.4 ms ]      -0.71%
Long Line Justify - arabic                         [   3.4 ms ...   3.4 ms ]      -0.53%
Long Line - latin                                  [   1.1 ms ...   1.1 ms ]      +0.53%
Long Line Justify - latin                          [   1.1 ms ...   1.1 ms ]      +0.57%
Long Line - japanese                               [   2.4 ms ...   2.4 ms ]      -0.08%
Long Line Justify - japanese                       [   2.4 ms ...   2.4 ms ]      -0.19%
Page Full - arabic 8000 characters                 [   3.6 ms ...   3.6 ms ]      -0.26%
Page Full - latin 8000 characters                  [   1.2 ms ...   1.2 ms ]      +0.57%
Page Full - japanese 8000 characters               [   2.8 ms ...   2.8 ms ]      -0.04%
Page Build - arabic 8000 characters                [   3.3 ms ...   3.3 ms ]      -0.49%
Page Build - latin 8000 characters                 [   1.0 ms ...   1.0 ms ]      +0.56%
Page Build - japanese 8000 characters              [   2.5 ms ...   2.5 ms ]      -1.01%*
Page Content Widths - arabic 8000 characters       [  29.7 us ...  31.8 us ]      +6.98%*
Page Content Widths - latin 8000 characters        [  18.7 us ...  19.2 us ]      +2.14%*
Page Content Widths - japanese 8000 characters     [  28.6 us ...  27.2 us ]      -4.91%*
Page Break - arabic 8000 characters                [  77.7 us ...  78.2 us ]      +0.72%
Page Break - latin 8000 characters                 [  49.4 us ...  49.1 us ]      -0.66%
Page Break - japanese 8000 characters              [  94.6 us ...  94.9 us ]      +0.31%
Page Resize - arabic 8000 characters               [  80.7 us ...  81.6 us ]      +1.18%*
Page Resize - latin 8000 characters                [  51.5 us ...  51.7 us ]      +0.37%
Page Resize - japanese 8000 characters             [  96.3 us ...  96.2 us ]      -0.09%
Page Glyph Runs - arabic 8000 characters           [ 146.0 us ... 142.0 us ]      -2.75%*
Page Glyph Runs - latin 8000 characters            [  47.8 us ...  46.0 us ]      -3.69%*
Page Glyph Runs - japanese 8000 characters         [ 115.6 us ... 115.0 us ]      -0.55%
Query Cursor - arabic 8000 characters, next visual [  40.0 us ...  40.1 us ]      +0.34%
Query Cursor - latin 8000 characters, next visual  [  50.2 us ...  50.1 us ]      -0.19%
Query Cursor - japanese 8000 characters, next visual [  41.8 us ...  42.0 us ]      +0.56%
Query Cursor - arabic 8000 characters, line down + up [  58.9 us ...  61.5 us ]      +4.39%*
Query Cursor - latin 8000 characters, line down + up [ 190.7 us ... 195.7 us ]      +2.67%*
Query Cursor - japanese 8000 characters, line down + up [  58.4 us ...  60.4 us ]      +3.50%*
Query Cursor - latin 8000 characters, line down + up, long lines [   1.6 ms ...   1.6 ms ]      +4.37%*
Query Cursor - latin 8000 characters, from byte index [ 982.8 ns ... 952.9 ns ]      -3.04%*
Fontique - system fonts init (CoreText)            [  50.5 ms ...  50.4 ms ]      -0.17%
Full Tango output, this branch before the performance fix vs merge-base (102 rows, -t 2)
Default Style - arabic 20 characters               [   9.0 us ...   9.1 us ]      +1.11%*
Default Style - latin 20 characters                [   4.2 us ...   4.4 us ]      +4.98%*
Default Style - japanese 20 characters             [   7.9 us ...   7.9 us ]      +0.27%
Default Style - arabic 400 characters              [ 187.0 us ... 191.1 us ]      +2.19%*
Default Style - latin 400 characters               [  58.8 us ...  65.9 us ]     +12.03%*
Default Style - japanese 400 characters            [ 131.8 us ... 132.6 us ]      +0.55%
Default Style - arabic 8000 characters             [   3.8 ms ...   3.9 ms ]      +2.63%*
Default Style - latin 8000 characters              [   1.2 ms ...   1.3 ms ]     +12.14%*
Default Style - japanese 8000 characters           [   2.6 ms ...   2.6 ms ]      +0.86%
Styled - arabic 20 characters                      [  10.6 us ...  10.5 us ]      -1.60%*
Styled - latin 20 characters                       [   5.9 us ...   5.9 us ]      +0.20%
Styled - japanese 20 characters                    [   8.9 us ...   8.9 us ]      -1.08%*
Styled - arabic 400 characters                     [ 193.6 us ... 192.5 us ]      -0.56%
Styled - latin 400 characters                      [  74.9 us ...  75.8 us ]      +1.18%*
Styled - japanese 400 characters                   [ 148.0 us ... 148.1 us ]      +0.08%
Styled - arabic 8000 characters                    [   4.1 ms ...   4.1 ms ]      -0.46%
Styled - latin 8000 characters                     [   1.5 ms ...   1.5 ms ]      +1.44%*
Styled - japanese 8000 characters                  [   2.9 ms ...   2.9 ms ]      +0.19%
Glyph Runs - latin 8000 characters, uniform        [  47.3 us ...  47.7 us ]      +0.88%
Glyph Runs - latin 8000 characters, non-splitting every 1 chars [ 145.7 us ... 139.2 us ]      -4.48%*
Glyph Runs - latin 8000 characters, non-splitting every 16 chars [  53.7 us ...  58.7 us ]      +9.19%*
Glyph Runs - latin 8000 characters, splitting every 1 chars [ 208.5 us ... 197.5 us ]      -5.28%*
Glyph Runs - latin 8000 characters, splitting every 16 chars [  56.4 us ...  58.5 us ]      +3.71%*
Glyph Runs - arabic 8000 characters, mixed         [ 162.6 us ... 161.4 us ]      -0.72%
Glyph Runs - latin 8000 characters, mixed          [  71.1 us ...  70.4 us ]      -0.87%
Glyph Runs - japanese 8000 characters, mixed       [ 134.8 us ... 131.7 us ]      -2.28%*
Content Widths - arabic 20 characters, uniform     [ 130.3 ns ... 139.5 ns ]      +7.03%*
Content Widths - latin 20 characters, uniform      [  66.9 ns ...  79.1 ns ]     +18.28%*
Content Widths - japanese 20 characters, uniform   [ 145.0 ns ... 159.1 ns ]      +9.71%*
Content Widths - arabic 400 characters, uniform    [   1.8 us ...   2.1 us ]     +16.56%*
Content Widths - latin 400 characters, uniform     [   1.0 us ...   1.2 us ]     +22.20%*
Content Widths - japanese 400 characters, uniform  [   1.7 us ...   2.0 us ]     +17.77%*
Content Widths - arabic 8000 characters, uniform   [  42.6 us ...  48.8 us ]     +14.47%*
Content Widths - latin 8000 characters, uniform    [  20.4 us ...  24.7 us ]     +21.44%*
Content Widths - japanese 8000 characters, uniform [  35.5 us ...  41.7 us ]     +17.55%*
Content Widths - arabic 20 characters, mixed       [ 203.5 ns ... 219.0 ns ]      +7.61%*
Content Widths - latin 20 characters, mixed        [  82.1 ns ...  98.0 ns ]     +19.33%*
Content Widths - japanese 20 characters, mixed     [ 185.7 ns ... 200.9 ns ]      +8.20%*
Content Widths - arabic 400 characters, mixed      [   2.4 us ...   2.7 us ]     +11.70%*
Content Widths - latin 400 characters, mixed       [   1.2 us ...   1.4 us ]     +25.92%*
Content Widths - japanese 400 characters, mixed    [   2.3 us ...   2.7 us ]     +13.28%*
Content Widths - arabic 8000 characters, mixed     [  41.9 us ...  48.2 us ]     +15.00%*
Content Widths - latin 8000 characters, mixed      [  22.9 us ...  28.5 us ]     +24.73%*
Content Widths - japanese 8000 characters, mixed   [  36.8 us ...  42.7 us ]     +16.17%*
Content Widths - arabic 8000 characters, spacing   [  37.0 us ...  42.8 us ]     +15.68%*
Content Widths - latin 8000 characters, spacing    [  24.9 us ...  26.6 us ]      +6.88%*
Content Widths - japanese 8000 characters, spacing [  36.7 us ...  38.6 us ]      +5.22%*
Word + Letter Spacing - arabic 20 characters       [   9.7 us ...   9.4 us ]      -3.07%*
Word + Letter Spacing - latin 20 characters        [   4.6 us ...   4.4 us ]      -4.73%*
Word + Letter Spacing - japanese 20 characters     [   9.3 us ...   9.3 us ]      +0.30%
Word + Letter Spacing - arabic 400 characters      [ 193.9 us ... 190.0 us ]      -2.01%*
Word + Letter Spacing - latin 400 characters       [  67.7 us ...  61.7 us ]      -8.89%*
Word + Letter Spacing - japanese 400 characters    [ 144.6 us ... 143.9 us ]      -0.49%
Word + Letter Spacing - arabic 8000 characters     [   4.1 ms ...   4.1 ms ]      -1.42%*
Word + Letter Spacing - latin 8000 characters      [   1.3 ms ...   1.2 ms ]      -8.86%*
Word + Letter Spacing - japanese 8000 characters   [   2.9 ms ...   2.9 ms ]      -0.34%
Repeated Justification - latin 8000 characters     [  24.9 us ...  25.1 us ]      +0.54%
Line Breaking - arabic 8000 characters, narrow     [ 200.9 us ... 213.9 us ]      +6.48%*
Line Breaking - arabic 8000 characters, wider      [ 104.7 us ... 113.4 us ]      +8.33%*
Line Breaking - arabic 8000 characters, unwrapped  [  88.1 us ...  97.3 us ]     +10.47%*
Line Breaking - latin 8000 characters, narrow      [ 144.5 us ... 159.9 us ]     +10.65%*
Line Breaking - latin 8000 characters, wider       [  68.6 us ...  80.1 us ]     +16.70%*
Line Breaking - latin 8000 characters, unwrapped   [  45.7 us ...  54.3 us ]     +18.72%*
Line Breaking - japanese 8000 characters, narrow   [ 144.7 us ... 160.7 us ]     +11.05%*
Line Breaking - japanese 8000 characters, wider    [ 100.0 us ... 114.2 us ]     +14.29%*
Line Breaking - japanese 8000 characters, unwrapped [  88.6 us ... 102.1 us ]     +15.22%*
Line Breaking - arabic 8000 characters, wrapped + spacing [ 104.7 us ... 113.4 us ]      +8.35%*
Line Breaking - latin 8000 characters, wrapped + spacing [  71.6 us ...  82.9 us ]     +15.80%*
Line Breaking - japanese 8000 characters, wrapped + spacing [  99.0 us ... 112.5 us ]     +13.72%*
Long Line - arabic                                 [   3.6 ms ...   3.6 ms ]      +0.67%
Long Line Justify - arabic                         [   3.6 ms ...   3.5 ms ]      -1.03%*
Long Line - latin                                  [   1.1 ms ...   1.1 ms ]      +0.98%
Long Line Justify - latin                          [   1.1 ms ...   1.1 ms ]      +1.38%*
Long Line - japanese                               [   2.5 ms ...   2.5 ms ]      +0.45%
Long Line Justify - japanese                       [   2.5 ms ...   2.5 ms ]      +0.18%
Page Full - arabic 8000 characters                 [   3.7 ms ...   3.7 ms ]      -1.02%*
Page Full - latin 8000 characters                  [   1.2 ms ...   1.2 ms ]      +0.84%
Page Full - japanese 8000 characters               [   3.0 ms ...   2.9 ms ]      -1.25%*
Page Build - arabic 8000 characters                [   3.5 ms ...   3.5 ms ]      -1.46%*
Page Build - latin 8000 characters                 [   1.1 ms ...   1.1 ms ]      +0.07%
Page Build - japanese 8000 characters              [   2.6 ms ...   2.6 ms ]      -0.40%
Page Content Widths - arabic 8000 characters       [  31.5 us ...  37.3 us ]     +18.51%*
Page Content Widths - latin 8000 characters        [  19.1 us ...  23.3 us ]     +21.65%*
Page Content Widths - japanese 8000 characters     [  34.4 us ...  39.1 us ]     +13.81%*
Page Break - arabic 8000 characters                [  79.4 us ...  87.3 us ]      +9.97%*
Page Break - latin 8000 characters                 [  50.4 us ...  58.9 us ]     +16.81%*
Page Break - japanese 8000 characters              [  99.1 us ... 113.4 us ]     +14.46%*
Page Resize - arabic 8000 characters               [  82.2 us ...  90.2 us ]      +9.73%*
Page Resize - latin 8000 characters                [  52.2 us ...  60.2 us ]     +15.34%*
Page Resize - japanese 8000 characters             [ 100.2 us ... 114.1 us ]     +13.93%*
Page Glyph Runs - arabic 8000 characters           [ 142.5 us ... 144.2 us ]      +1.17%*
Page Glyph Runs - latin 8000 characters            [  48.8 us ...  49.3 us ]      +1.08%*
Page Glyph Runs - japanese 8000 characters         [ 112.2 us ... 110.6 us ]      -1.45%*
Query Cursor - arabic 8000 characters, next visual [  40.5 us ...  40.5 us ]      -0.03%
Query Cursor - latin 8000 characters, next visual  [  50.9 us ...  50.9 us ]      -0.12%
Query Cursor - japanese 8000 characters, next visual [  42.9 us ...  42.8 us ]      -0.12%
Query Cursor - arabic 8000 characters, line down + up [  59.7 us ...  61.9 us ]      +3.71%*
Query Cursor - latin 8000 characters, line down + up [ 196.3 us ... 201.0 us ]      +2.39%*
Query Cursor - japanese 8000 characters, line down + up [  59.4 us ...  61.2 us ]      +3.06%*
Query Cursor - latin 8000 characters, line down + up, long lines [   1.6 ms ...   1.6 ms ]      +4.01%*
Query Cursor - latin 8000 characters, from byte index [   1.0 us ...   1.0 us ]      +0.06%
Fontique - system fonts init (CoreText)            [  48.0 ms ...  47.8 ms ]      -0.28%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Display tab character

2 participants