A child pinned with bottom: 0 can end a pixel above its parent's bottom after pixel rounding
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 25/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
- 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.
- Lenguaje dominante
- C++
- Estrellas
- 18.9k
- Forks
- 1.6k
- Merge medio
- 1 d 31 min
- PR fusionados (30 d)
- 14
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de react/yoga
-
Yoga 3.2.2 patch releaseAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 25/100
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
Measured nodes in a cached subtree grow by a rounding step on every layout passPosiblemente ocupada @salmanmkc la tomó hace 7 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Auto cross axis margins are ignored in wrapping containers and baseline rowsPosiblemente ocupada @sorinc03 la tomó hace 5 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 56/100
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
Todos los issues de react/yoga
Issues similares
-
#2754 make deepseek api not workAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
xiaoyifang/goldendict-ng#3148 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 91/100
triton-inference-server/server#9069 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 4 días
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100