Skip to content

Commit eee2613

Browse files
chenglouvoidborne-d
andcommitted
Prevent rich inline boundary overflow
Fixes #120. Refs #132. Wrap before a new rich inline item when the lower line walker only made forced progress that would overflow the current partially-filled line. This keeps split CJK inline fragments, and the same boundary shape in other scripts, inside the requested width. Refresh benchmark snapshots and status dashboard. Co-authored-by: voidborne-d <voidborne-d@users.noreply.github.com>
1 parent ad2bc4e commit eee2613

5 files changed

Lines changed: 305 additions & 249 deletions

File tree

benchmarks/chrome.json

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,110 +3,110 @@
33
"results": [
44
{
55
"label": "Our library: prepare()",
6-
"ms": 18.299999833106995,
6+
"ms": 22,
77
"desc": "One cold 500-text measurement batch"
88
},
99
{
1010
"label": "Our library: layout()",
11-
"ms": 0.14875,
11+
"ms": 0.15625,
1212
"desc": "Normalized hot-path throughput per 500-text batch"
1313
},
1414
{
1515
"label": "DOM batch",
16-
"ms": 4.149999976158142,
16+
"ms": 4.450000047683716,
1717
"desc": "Single 400→300px batch resize: write all, then read all"
1818
},
1919
{
2020
"label": "DOM interleaved",
21-
"ms": 45,
21+
"ms": 50.700000047683716,
2222
"desc": "Single 400→300px batch resize: write + read per div"
2323
}
2424
],
2525
"richResults": [
2626
{
2727
"label": "Our library: measureLineStats()",
28-
"ms": 0.0125,
28+
"ms": 0.01499999761581421,
2929
"desc": "60-text shared-corpus batch across widths 180/220/260px; stats only"
3030
},
3131
{
3232
"label": "Our library: layoutWithLines()",
33-
"ms": 0.05250000357627869,
33+
"ms": 0.0550000011920929,
3434
"desc": "60-text shared-corpus batch across widths 180/220/260px; materializes text lines"
3535
},
3636
{
3737
"label": "Our library: walkLineRanges()",
38-
"ms": 0.025,
38+
"ms": 0.026249998807907106,
3939
"desc": "60-text shared-corpus batch across widths 180/220/260px; line ranges only, no line text strings"
4040
},
4141
{
4242
"label": "Our library: layoutNextLine()",
43-
"ms": 0.04625000059604645,
43+
"ms": 0.047500002384185794,
4444
"desc": "60-text shared-corpus batch across widths 180/220/260px; streaming line-by-line layout"
4545
}
4646
],
4747
"richInlineResults": [
4848
{
4949
"label": "Our library: measureRichInlineStats()",
50-
"ms": 0.010000002384185792,
50+
"ms": 0.011250001192092896,
5151
"desc": "36 rich-text inline flow shared-corpus texts across widths 180/220/260px; stats only"
5252
},
5353
{
5454
"label": "Our library: walkRichInlineLineRanges()",
55-
"ms": 0.022499996423721313,
55+
"ms": 0.02249999940395355,
5656
"desc": "36 rich-text inline flow shared-corpus texts across widths 180/220/260px; per-line ranges with fragment ownership, no text strings"
5757
},
5858
{
5959
"label": "Our library: materializeRichInlineLineRange()",
60-
"ms": 0.0449999988079071,
60+
"ms": 0.04749999642372131,
6161
"desc": "36 rich-text inline flow shared-corpus texts across widths 180/220/260px; range walker plus per-line materialization"
6262
},
6363
{
6464
"label": "Our library: layoutNextRichInlineLineRange() + materializeRichInlineLineRange()",
65-
"ms": 0.04250000119209289,
65+
"ms": 0.04749999940395355,
6666
"desc": "36 rich-text inline flow shared-corpus texts across widths 180/220/260px; streaming range walk plus per-line materialization"
6767
}
6868
],
6969
"richPreWrapResults": [
7070
{
7171
"label": "Our library: measureLineStats()",
72-
"ms": 0.3024999976158142,
72+
"ms": 0.3149999976158142,
7373
"desc": "12 generated pre-wrap texts with 320 hard-break chunks across widths 220/260/320px; stats only"
7474
},
7575
{
7676
"label": "Our library: layoutWithLines()",
77-
"ms": 0.4324999928474426,
77+
"ms": 0.45,
7878
"desc": "12 generated pre-wrap texts with 320 hard-break chunks across widths 220/260/320px; materializes text lines"
7979
},
8080
{
8181
"label": "Our library: walkLineRanges()",
82-
"ms": 0.23500000238418578,
82+
"ms": 0.24499999284744262,
8383
"desc": "12 generated pre-wrap texts with 320 hard-break chunks across widths 220/260/320px; line ranges only, no line text strings"
8484
},
8585
{
8686
"label": "Our library: layoutNextLine()",
87-
"ms": 1.192500001192093,
87+
"ms": 1.2899999976158143,
8888
"desc": "12 generated pre-wrap texts with 320 hard-break chunks across widths 220/260/320px; streaming line-by-line layout"
8989
}
9090
],
9191
"richLongResults": [
9292
{
9393
"label": "Our library: measureLineStats()",
94-
"ms": 1.6750000029802323,
94+
"ms": 1.7924999982118606,
9595
"desc": "8 Arabic long-form texts across widths 240/300/360px; stats only"
9696
},
9797
{
9898
"label": "Our library: layoutWithLines()",
99-
"ms": 5.719999995827675,
99+
"ms": 6.1412499994039536,
100100
"desc": "8 Arabic long-form texts across widths 240/300/360px; materializes text lines"
101101
},
102102
{
103103
"label": "Our library: walkLineRanges()",
104-
"ms": 2.220000001788139,
104+
"ms": 2.35625,
105105
"desc": "8 Arabic long-form texts across widths 240/300/360px; line ranges only, no line text strings"
106106
},
107107
{
108108
"label": "Our library: layoutNextLine()",
109-
"ms": 5.75,
109+
"ms": 5.94375,
110110
"desc": "8 Arabic long-form texts across widths 240/300/360px; streaming line-by-line layout"
111111
}
112112
],
@@ -121,10 +121,10 @@
121121
"breakableSegments": 0,
122122
"width": 300,
123123
"lineCount": 193,
124-
"analysisMs": 2.6999998092651367,
125-
"measureMs": 5.200000047683716,
126-
"prepareMs": 7.700000047683716,
127-
"layoutMs": 0.02550000071525574
124+
"analysisMs": 2.5999999046325684,
125+
"measureMs": 5.200000286102295,
126+
"prepareMs": 8.100000143051147,
127+
"layoutMs": 0.02649999976158142
128128
},
129129
{
130130
"id": "ja-rashomon",
@@ -136,10 +136,10 @@
136136
"breakableSegments": 1,
137137
"width": 300,
138138
"lineCount": 380,
139-
"analysisMs": 4.900000095367432,
140-
"measureMs": 9.099999904632568,
141-
"prepareMs": 13.900000095367432,
142-
"layoutMs": 0.04850000023841858
139+
"analysisMs": 5.1000001430511475,
140+
"measureMs": 10.299999952316284,
141+
"prepareMs": 15.200000047683716,
142+
"layoutMs": 0.05200000047683716
143143
},
144144
{
145145
"id": "ko-unsu-joh-eun-nal",
@@ -151,10 +151,10 @@
151151
"breakableSegments": 0,
152152
"width": 300,
153153
"lineCount": 428,
154-
"analysisMs": 3.3000001907348633,
155-
"measureMs": 9.099999904632568,
156-
"prepareMs": 12.700000047683716,
157-
"layoutMs": 0.07700000047683715
154+
"analysisMs": 3.700000047683716,
155+
"measureMs": 11.800000190734863,
156+
"prepareMs": 15.599999904632568,
157+
"layoutMs": 0.07950000047683715
158158
},
159159
{
160160
"id": "ko-sonagi",
@@ -166,10 +166,10 @@
166166
"breakableSegments": 2,
167167
"width": 300,
168168
"lineCount": 332,
169-
"analysisMs": 2.6000001430511475,
170-
"measureMs": 7.3999998569488525,
171-
"prepareMs": 10.100000143051147,
172-
"layoutMs": 0.05899999976158142
169+
"analysisMs": 2.799999952316284,
170+
"measureMs": 8.599999904632568,
171+
"prepareMs": 11.400000095367432,
172+
"layoutMs": 0.060499999523162845
173173
},
174174
{
175175
"id": "zh-zhufu",
@@ -181,10 +181,10 @@
181181
"breakableSegments": 4,
182182
"width": 300,
183183
"lineCount": 626,
184-
"analysisMs": 7.699999809265137,
185-
"measureMs": 15.000000238418579,
186-
"prepareMs": 23.200000047683716,
187-
"layoutMs": 0.07850000023841858
184+
"analysisMs": 8.100000143051147,
185+
"measureMs": 17.200000047683716,
186+
"prepareMs": 25.59999990463257,
187+
"layoutMs": 0.08149999976158143
188188
},
189189
{
190190
"id": "zh-guxiang",
@@ -196,10 +196,10 @@
196196
"breakableSegments": 14,
197197
"width": 300,
198198
"lineCount": 375,
199-
"analysisMs": 4.400000095367432,
200-
"measureMs": 9.799999952316284,
201-
"prepareMs": 14.400000095367432,
202-
"layoutMs": 0.0475
199+
"analysisMs": 5,
200+
"measureMs": 10.899999856948853,
201+
"prepareMs": 17,
202+
"layoutMs": 0.04850000023841858
203203
},
204204
{
205205
"id": "th-nithan-vetal-story-1",
@@ -211,10 +211,10 @@
211211
"breakableSegments": 8087,
212212
"width": 300,
213213
"lineCount": 1024,
214-
"analysisMs": 11.100000143051147,
215-
"measureMs": 8.100000143051147,
216-
"prepareMs": 18.700000047683716,
217-
"layoutMs": 0.08649999976158142
214+
"analysisMs": 10.399999856948853,
215+
"measureMs": 10.699999809265137,
216+
"prepareMs": 20.600000143051147,
217+
"layoutMs": 0.08850000023841859
218218
},
219219
{
220220
"id": "my-cunning-heron-teacher",
@@ -226,10 +226,10 @@
226226
"breakableSegments": 422,
227227
"width": 300,
228228
"lineCount": 81,
229-
"analysisMs": 0.8000001907348633,
230-
"measureMs": 0.9000000953674316,
231-
"prepareMs": 1.7000000476837158,
232-
"layoutMs": 0.0070000004768371584
229+
"analysisMs": 0.7999999523162842,
230+
"measureMs": 1,
231+
"prepareMs": 1.7999999523162842,
232+
"layoutMs": 0.0075
233233
},
234234
{
235235
"id": "my-bad-deeds-return-to-you-teacher",
@@ -241,9 +241,9 @@
241241
"breakableSegments": 274,
242242
"width": 300,
243243
"lineCount": 54,
244-
"analysisMs": 0.40000009536743164,
244+
"analysisMs": 0.5,
245245
"measureMs": 0.7000000476837158,
246-
"prepareMs": 1.1999998092651367,
246+
"prepareMs": 1.2000000476837158,
247247
"layoutMs": 0.004500000476837158
248248
},
249249
{
@@ -256,10 +256,10 @@
256256
"breakableSegments": 2922,
257257
"width": 300,
258258
"lineCount": 351,
259-
"analysisMs": 3.9000000953674316,
260-
"measureMs": 4.499999761581421,
261-
"prepareMs": 8.599999904632568,
262-
"layoutMs": 0.042000000476837156
259+
"analysisMs": 3.799999952316284,
260+
"measureMs": 4.699999809265137,
261+
"prepareMs": 8.900000095367432,
262+
"layoutMs": 0.04350000023841858
263263
},
264264
{
265265
"id": "km-prachum-reuang-preng-khmer-volume-7-stories-1-10",
@@ -271,10 +271,10 @@
271271
"breakableSegments": 4010,
272272
"width": 300,
273273
"lineCount": 591,
274-
"analysisMs": 8.200000047683716,
275-
"measureMs": 6.299999952316284,
276-
"prepareMs": 15,
277-
"layoutMs": 0.08350000023841858
274+
"analysisMs": 8.599999904632568,
275+
"measureMs": 7.799999713897705,
276+
"prepareMs": 15.899999856948853,
277+
"layoutMs": 0.0875
278278
},
279279
{
280280
"id": "hi-eidgah",
@@ -286,10 +286,10 @@
286286
"breakableSegments": 4089,
287287
"width": 300,
288288
"lineCount": 653,
289-
"analysisMs": 6.1000001430511475,
290-
"measureMs": 9.200000047683716,
291-
"prepareMs": 15.099999904632568,
292-
"layoutMs": 0.06899999976158142
289+
"analysisMs": 6.200000047683716,
290+
"measureMs": 9.299999952316284,
291+
"prepareMs": 15.900000095367432,
292+
"layoutMs": 0.07149999976158142
293293
},
294294
{
295295
"id": "synthetic-long-breakable-runs",
@@ -301,10 +301,10 @@
301301
"breakableSegments": 1540,
302302
"width": 300,
303303
"lineCount": 2860,
304-
"analysisMs": 9.400000095367432,
305-
"measureMs": 11.699999809265137,
306-
"prepareMs": 21.899999856948853,
307-
"layoutMs": 0.31399999976158144
304+
"analysisMs": 9.599999904632568,
305+
"measureMs": 13.499999761581421,
306+
"prepareMs": 23.40000009536743,
307+
"layoutMs": 0.3260000002384186
308308
},
309309
{
310310
"id": "ar-risalat-al-ghufran-part-1",
@@ -316,10 +316,10 @@
316316
"breakableSegments": 18745,
317317
"width": 300,
318318
"lineCount": 2643,
319-
"analysisMs": 28,
320-
"measureMs": 51,
321-
"prepareMs": 78.60000014305115,
322-
"layoutMs": 0.2725
319+
"analysisMs": 30.90000009536743,
320+
"measureMs": 59.89999985694885,
321+
"prepareMs": 92.09999990463257,
322+
"layoutMs": 0.2835000002384186
323323
}
324324
]
325325
}

0 commit comments

Comments
 (0)