Commit c8fdd67
wangkai39
fix: never round a text node below its measured width
Yoga rounds a node's left and right edge to the pixel grid independently
and derives the width from the difference. For a node with a measure
function it aims to never round the size down, "as this could lead to
unwanted text truncation".
That guarantee leaks. `roundValueToPixelGrid` treats a value as already
on the grid when it is within `inexactEquals`' 0.0001 tolerance of a
whole pixel, and the two edges can fall on opposite sides of it. For text
measured as 23 physical pixels on a 2.75 density screen the left edge
lands on 103.9999008 scaled units and is snapped up to 104, while the
right edge lands on 126.9998999, misses the tolerance, and is floored to
126 - a 22 pixel wide box for 23 pixels of text. `ReactTextView` then
re-breaks the text at the width it is mounted with, so the missing pixel
drops the trailing glyph.
Recompute the right edge with `forceCeil` only when the width came out
below what the node measured. Nodes that already round to at least their
measured size, and all nodes without a measure function, are unchanged.
Only the width dimension is changed. The height dimension has the same
asymmetry, but a height shortfall clips a row of pixels rather than
triggering a re-break, and `getLineBottom()` already includes descent and
line spacing, so it has no comparable user-visible effect.1 parent 2fa37b1 commit c8fdd67
2 files changed
Lines changed: 103 additions & 9 deletions
File tree
- packages/react-native
- Libraries/Text/__tests__
- ReactCommon/yoga/yoga/algorithm
Lines changed: 72 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
Lines changed: 31 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
118 | 140 | | |
119 | 141 | | |
120 | 142 | | |
| |||
0 commit comments