The picture-cache invalidation stores prim corners quantized to 1/4px via
round(v * 4). Those buckets are centered on the .5 boundary, which is exactly
where the rasterizer's whole-pixel round() flips device pixels. So two corners
that render to different device pixels (e.g. 20.4 -> 20 and 20.5 -> 21) can share
one invalidation key, and a tile is not re-rasterized when it should be, leaving
stale content. This was masked while prims were device-snapped (integer corners
quantize unambiguously); it surfaces once prims carry sub-pixel positions.
Truncate toward zero instead. This places the 1/4px bucket boundaries on every
half-integer with the same sign-aware tie-ownership as round() (half away from
zero), so a quant key uniquely determines the rendered device pixel for both
positive and negative coordinates, while keeping the 1/4px tolerance for
anti-aliased content. Verified: a full sweep over [-300, 300] including exact
half-integers has zero keys mapping to two device pixels (600 with the old
round).
Differential Revision: https://phabricator.services.mozilla.com/D310211