From 77709d17711d0d1704383065e7dfc3867e777b6a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 18 Feb 2025 14:51:26 +0000 Subject: [PATCH] gpu: don't store transformed rectangle paths under the same cache key Fixes incorrect rendering of multiple transformed instances of a rectangle. Fixes: https://todo.sr.ht/~eliasnaur/gio/635 Signed-off-by: Elias Naur --- gpu/gpu.go | 3 ++- gpu/internal/rendertest/clip_test.go | 17 +++++++++++++++++ .../rendertest/refs/TestInstancedRects.png | Bin 0 -> 787 bytes 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 gpu/internal/rendertest/refs/TestInstancedRects.png diff --git a/gpu/gpu.go b/gpu/gpu.go index b68ca541..49c878ea 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -1055,6 +1055,7 @@ loop: } else { quads.aux, bounds, _ = d.boundsForTransformedRect(bounds, trans) quads.key = opKey{Key: encOp.Key} + quads.key = quads.key.SetTransform(trans) } d.addClipPath(&state, quads.aux, quads.key, bounds, off) quads = quadsOp{} @@ -1100,7 +1101,7 @@ loop: // The paint operation is sheared or rotated, add a clip path representing // this transformed rectangle. k := opKey{Key: encOp.Key} - k.SetTransform(t) // TODO: This call has no effect. + k = k.SetTransform(t) d.addClipPath(&state, clipData, k, bnd, off) } diff --git a/gpu/internal/rendertest/clip_test.go b/gpu/internal/rendertest/clip_test.go index 793b1397..381e9784 100644 --- a/gpu/internal/rendertest/clip_test.go +++ b/gpu/internal/rendertest/clip_test.go @@ -293,3 +293,20 @@ func TestStrokedRect(t *testing.T) { }, func(r result) { }) } + +func TestInstancedRects(t *testing.T) { + run(t, func(o *op.Ops) { + macro := op.Record(o) + clip := clip.Rect{Max: image.Pt(20, 20)}.Push(o) + paint.ColorOp{Color: color.NRGBA{R: 0x80, A: 0xFF}}.Add(o) + paint.PaintOp{}.Add(o) + clip.Pop() + c := macro.Stop() + + for i := 0; i < 2; i++ { + op.Affine(f32.Affine2D{}.Rotate(f32.Pt(0, 0), .2)).Add(o) + c.Add(o) + op.Offset(image.Pt(20, 20)).Add(o) + } + }, nil) +} diff --git a/gpu/internal/rendertest/refs/TestInstancedRects.png b/gpu/internal/rendertest/refs/TestInstancedRects.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f195a8b36aa5eee87ed70e5495cdf70533bbd3 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV7le$;uunK>+S9P+5Uwx$3H%w zBL6egOfhxqr^l0Gc1-AQUDL+xwWHu^+w8j+!fu@V{ic1&qS(jBSh?3~Y$|fqi_sAe z^3pJMH8GzYe>)~;>6czp>#d*v+Q^swYrOvZtL5|0md}5yCTKh;b8vSkKHxQ_ui+!t z_1g{qWc*Suhy%m z>wfHT!+Ob>vkBduDocdT!fpuLa9T_{TqC^d-_`n;`m+yzXS9`EW4Q8_OkM7Q6C!;b z_C`BIFWg`o4hvm6%B<$K8 z!`EH>BgTP|&1bvJ>i-o$Vg4K0K;hFz*cUu!<@x`W)t_N$#NXT8QGfr