1//go:build linux
2
3package ui
4
5import (
6 "image"
7 "image/color"
8 "testing"
9 "time"
10)
11
12// An image added in a frame that uploads no glyph is still copied to the GPU:
13// before the fix it sampled an uninitialized texture and drew nothing. A first
14// text-only frame caches the glyphs and initializes the atlas, so the second
15// frame has nothing to upload but the image.
16func TestRendererGPUImageWithoutNewGlyphs(t *testing.T) {
17 r, tg := gpuRenderer(t)
18 src := image.NewNRGBA(image.Rect(0, 0, 40, 30))
19 for y := range 30 {
20 for x := range 40 {
21 src.SetNRGBA(x, y, color.NRGBA{R: uint8(x * 6), G: uint8(y * 8), B: 0x80, A: 0xff})
22 }
23 }
24 show := false
25 view := func(f *Frame, _ *struct{}) {
26 st := f.Root().Stack()
27 if show {
28 st.Box(Inline("overflow:hidden")).Rect(0, 0, 40, 30).Image(src, Inline("width:100%;height:100%"))
29 }
30 st.Box().Rect(0, 0, 1, 1).Text("x")
31 }
32 r.Resize(40, 30, 1)
33 var out Output
34 var m struct{}
35 ok, err := r.Render(&out, &m, view)
36 if err != nil || !ok {
37 t.Fatalf("text frame: ok=%v err=%v", ok, err)
38 }
39 signalRelease(t, tg, &out)
40 if !readable(t, out.ReleaseFD, time.Second) {
41 t.Fatal("text frame not released")
42 }
43 if err = r.Released(out.Buffer); err != nil {
44 t.Fatal(err)
45 }
46 show = true
47 r.Invalidate()
48 if ok, err = r.Render(&out, &m, view); err != nil || !ok {
49 t.Fatalf("image frame: ok=%v err=%v", ok, err)
50 }
51 img, err := tg.Readback(out.Buffer)
52 if err != nil {
53 t.Fatal(err)
54 }
55 for _, p := range []image.Point{{5, 5}, {20, 15}, {39, 29}} {
56 want, got := src.NRGBAAt(p.X, p.Y), img.NRGBAAt(p.X, p.Y)
57 if got.R != want.R || got.G != want.G || got.B != want.B {
58 t.Fatalf("pixel %v = %+v, want %+v", p, got, want)
59 }
60 }
61}