Retire Remap: a translation shifts, and only a stretch needs a fraction
`Remap` existed to invert a composition, and a translation never needed one: shifting a box shifts everything composed into it by the same amount, because `lerp(s + d, e + d, t) == lerp(s, e, t) + d` on both channels. That holds whether or not the box has a relative extent, so the carry branch was answering a question it did not have to ask. So the decision is made once, before the walk, and neither relocation method branches. A translation is already one slot write. A change of length calls `UiRegion::stretch`, which re-expresses each part at its own fraction of the new box and needs `stretchable` -- a fixed length holds its parts as offsets from its start and keeps no fraction to stretch by. `Remap`, `UiScalar::outside`, `UiSpan::outside` and `LerpUtil::lerp_inv` are all gone with it. Nothing inverts a lerp any more: the one division is done against a denominator `stretchable` already established is not zero. What it gives up is the per-axis carry, so a box that changed length on one axis and not the other is redrawn where it used to be remapped. Counted: six of `tabs`'s fourteen relocations and five of `text`'s sixteen, and one extra redraw per frame on `replace_cost`'s 200 rows -- 354,310,889 instructions against 354,272,387, which is noise. Checked: fmt, clippy and 42 tests. `tabs` (with the image replay), `view`, `minimal` and `text` all still render byte-identical to `upstream/main`.
This commit is contained in:
1 parent
78a53b6bf6
commit
db1751fdfd
5 files changed
+85
-99
No files matched your search
+1
-10
@@ -1,6 +1,5 @@
|
||||
pub const trait LerpUtil: Sized {
|
||||
pub const trait LerpUtil {
|
||||
fn lerp(self, from: Self, to: Self) -> Self;
|
||||
fn lerp_inv(self, from: Self, to: Self) -> Option<Self>;
|
||||
}
|
||||
|
||||
const impl LerpUtil for f32 {
|
||||
@@ -9,14 +8,6 @@ const impl LerpUtil for f32 {
|
||||
fn lerp(self, from: Self, to: Self) -> Self {
|
||||
from + (to - from) * self
|
||||
}
|
||||
/// inverse of lerp, and `None` where `from` and `to` are the same point:
|
||||
/// every input lerps to it, so there is no one answer to come back to.
|
||||
fn lerp_inv(self, from: Self, to: Self) -> Option<Self> {
|
||||
match to == from {
|
||||
true => None,
|
||||
false => Some((self - from) / (to - from)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_op {
|
||||
|
||||
Reference in new issue
Block a user