A child pinned with bottom: 0 can end a pixel above its parent's bottom after pixel rounding
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 25/100
Direzione di ricerca
Start with PixelGrid.cpp and the roundLayoutResultsToPixelGrid logic described in the issue. Review draft PR #2068 and the gentest position rounding and generated expectations it identifies. Done means bottom-pinned children align with the parent after rounding, text positions avoid cumulative drift, and the reported gentest expectations are updated.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
- I have searched existing issues and this is not a duplicate
Summary
roundLayoutResultsToPixelGrid: position rounded from relative offset (nodeTop), size from absolute edges (round(absoluteNodeBottom) - round(absoluteNodeTop)).- Parent on a fractional pixel → child pinned
bottom: 0ends 1 px above parent's bottom.
Repro
yoga-layout 3.2.1; PixelGrid.cpp on main rounds the same way.
import Yoga, { Edge, PositionType } from "yoga-layout";
const config = Yoga.Config.create();
config.setPointScaleFactor(1);
const root = Yoga.Node.create(config);
root.setWidth(100);
const parent = Yoga.Node.create(config);
parent.setPositionType(PositionType.Absolute);
parent.setPosition(Edge.Top, 0.25);
parent.setWidth(100);
parent.setHeight(10.5);
const child = Yoga.Node.create(config);
child.setPositionType(PositionType.Absolute);
child.setPosition(Edge.Bottom, 0);
child.setWidth(100);
child.setHeight(10.25);
parent.insertChild(child, 0);
root.insertChild(parent, 0);
root.calculateLayout(undefined, undefined);
parent.getComputedLayout(); // { top: 0, height: 11 }
child.getComputedLayout(); // { top: 0, height: 10 } -> bottom 10, parent bottom 11
- Expected: child
top: 1, height: 10, flush with parent bottom. - Actual: 1 px gap.
Why
- Child absolute edges 0.5 / 10.75 → rounded 1 / 11 → height 10.
- Position:
round(0.25) = 0, notround(0.5) - round(0.25) = 1.
Scale
- Scale 2.25 (Pixel 8 Pro), parent 506 tall at offset 0–4,
bottom: 0child 150–260 tall: 2003 / 9176 layouts 1 px short. top: 0; bottom: 0child: 0 / 9176.- Seen in React Native 0.88, Android: card shade
bottom: 0stops 1 px above the card edge, image line shows.
Related
- #1574: rounding is meant to avoid gaps between touching edges. This is one.
Possible fix
- Non-text position:
round(absoluteNodeTop) - round(absoluteTop)(same for left), reusing the rounded leading edge of the size. - Text nodes keep floored relative position: absolute flooring drifts text 1 px per relayout.
- gentest reads positions with the same relative rounding (
Math.round(rect.top - parentTop)); change it too. 2 generated expectations move. - Draft PR: #2068.
Written with help from Claude (AI); reviewed and tested by me.
- Lingua principale
- C++
- Stelle
- 18.9k
- Fork
- 1.6k
- Merge medio
- 1g 31m
- PR unite (30g)
- 14
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di react/yoga
-
Yoga 3.2.2 patch releaseAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
Measured nodes in a cached subtree grow by a rounding step on every layout passForse già presa @salmanmkc l’ha presa 7 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Auto cross axis margins are ignored in wrapping containers and baseline rowsForse già presa @sorinc03 l’ha presa 5 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 56/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
xiaoyifang/goldendict-ng#3148 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 91/100
triton-inference-server/server#9069 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 4 giorni
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100