@@ -38,13 +38,28 @@ type InternalLineVisitor = (
3838 endGraphemeIndex : number ,
3939) => void
4040
41- function normalizeSimpleLineStartSegmentIndex (
41+ function consumesAtLineStart ( kind : SegmentBreakKind ) : boolean {
42+ return kind === 'space' || kind === 'zero-width-break' || kind === 'soft-hyphen'
43+ }
44+
45+ function breaksAfter ( kind : SegmentBreakKind ) : boolean {
46+ return (
47+ kind === 'space' ||
48+ kind === 'preserved-space' ||
49+ kind === 'tab' ||
50+ kind === 'zero-width-break' ||
51+ kind === 'soft-hyphen'
52+ )
53+ }
54+
55+ function normalizeLineStartSegmentIndex (
4256 prepared : PreparedLineBreakData ,
4357 segmentIndex : number ,
58+ endSegmentIndex = prepared . widths . length ,
4459) : number {
45- while ( segmentIndex < prepared . widths . length ) {
60+ while ( segmentIndex < endSegmentIndex ) {
4661 const kind = prepared . kinds [ segmentIndex ] !
47- if ( kind !== 'space' && kind !== 'zero-width-break' && kind !== 'soft-hyphen' ) break
62+ if ( ! consumesAtLineStart ( kind ) ) break
4863 segmentIndex ++
4964 }
5065 return segmentIndex
@@ -113,14 +128,11 @@ function normalizeLineStartInChunk(
113128 }
114129
115130 if ( segmentIndex < chunk . startSegmentIndex ) segmentIndex = chunk . startSegmentIndex
116- while ( segmentIndex < chunk . endSegmentIndex ) {
117- const kind = prepared . kinds [ segmentIndex ] !
118- if ( kind !== 'space' && kind !== 'zero-width-break' && kind !== 'soft-hyphen' ) {
119- cursor . segmentIndex = segmentIndex
120- cursor . graphemeIndex = 0
121- return chunkIndex
122- }
123- segmentIndex ++
131+ segmentIndex = normalizeLineStartSegmentIndex ( prepared , segmentIndex , chunk . endSegmentIndex )
132+ if ( segmentIndex < chunk . endSegmentIndex ) {
133+ cursor . segmentIndex = segmentIndex
134+ cursor . graphemeIndex = 0
135+ return chunkIndex
124136 }
125137
126138 if ( chunk . consumedEndSegmentIndex >= prepared . widths . length ) return - 1
@@ -274,13 +286,13 @@ function walkPreparedLinesSimple(
274286 let i = 0
275287 while ( i < widths . length ) {
276288 if ( ! hasContent ) {
277- i = normalizeSimpleLineStartSegmentIndex ( prepared , i )
289+ i = normalizeLineStartSegmentIndex ( prepared , i )
278290 if ( i >= widths . length ) break
279291 }
280292
281293 const w = widths [ i ] !
282294 const kind = kinds [ i ] !
283- const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen'
295+ const breakAfter = breaksAfter ( kind )
284296
285297 if ( ! hasContent ) {
286298 if ( w > maxWidth && breakableFitAdvances [ i ] !== null ) {
@@ -525,8 +537,13 @@ export function walkPreparedLinesRaw(
525537
526538 let i = chunk . startSegmentIndex
527539 while ( i < chunk . endSegmentIndex ) {
540+ if ( ! hasContent ) {
541+ i = normalizeLineStartSegmentIndex ( prepared , i , chunk . endSegmentIndex )
542+ if ( i >= chunk . endSegmentIndex ) break
543+ }
544+
528545 const kind = kinds [ i ] !
529- const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen'
546+ const breakAfter = breaksAfter ( kind )
530547 const w = kind === 'tab' ? getTabAdvance ( lineW , tabStopAdvance ) : widths [ i ] !
531548
532549 if ( kind === 'soft-hyphen' ) {
@@ -800,7 +817,7 @@ function stepPreparedChunkLineGeometry(
800817
801818 for ( let i = cursor . segmentIndex ; i < chunk . endSegmentIndex ; i ++ ) {
802819 const kind = kinds [ i ] !
803- const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen'
820+ const breakAfter = breaksAfter ( kind )
804821 const startGraphemeIndex = i === cursor . segmentIndex ? cursor . graphemeIndex : 0
805822 const w = kind === 'tab' ? getTabAdvance ( lineW , tabStopAdvance ) : widths [ i ] !
806823
@@ -902,7 +919,7 @@ function stepPreparedSimpleLineGeometry(
902919 for ( let i = cursor . segmentIndex ; i < widths . length ; i ++ ) {
903920 const w = widths [ i ] !
904921 const kind = kinds [ i ] !
905- const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen'
922+ const breakAfter = breaksAfter ( kind )
906923 const startGraphemeIndex = i === cursor . segmentIndex ? cursor . graphemeIndex : 0
907924 const breakableFitAdvance = breakableFitAdvances [ i ]
908925
0 commit comments