image_test.go raw
1 // SPDX-License-Identifier: Unlicense OR MIT
2
3 package widget
4
5 import (
6 "image"
7 "testing"
8
9 "github.com/p9c/p9/pkg/gel/gio/layout"
10 "github.com/p9c/p9/pkg/gel/gio/op"
11 "github.com/p9c/p9/pkg/gel/gio/op/paint"
12 )
13
14 func TestImageScale(t *testing.T) {
15 var ops op.Ops
16 gtx := layout.Context{
17 Ops: &ops,
18 Constraints: layout.Constraints{
19 Max: image.Pt(50, 50),
20 },
21 }
22 imgSize := image.Pt(10, 10)
23 img := image.NewNRGBA(image.Rectangle{Max: imgSize})
24 imgOp := paint.NewImageOp(img)
25
26 // Ensure the default scales correctly.
27 dims := Image{Src: imgOp}.Layout(gtx)
28 expectedSize := imgSize
29 expectedSize.X = int(float32(expectedSize.X) * defaultScale)
30 expectedSize.Y = int(float32(expectedSize.Y) * defaultScale)
31 if dims.Size != expectedSize {
32 t.Fatalf("non-scaled image is wrong size, expected %v, got %v", expectedSize, dims.Size)
33 }
34
35 // Ensure scaling the image via the Scale field works.
36 currentScale := float32(0.5)
37 dims = Image{Src: imgOp, Scale: float32(currentScale)}.Layout(gtx)
38 expectedSize = imgSize
39 expectedSize.X = int(float32(expectedSize.X) * currentScale)
40 expectedSize.Y = int(float32(expectedSize.Y) * currentScale)
41 if dims.Size != expectedSize {
42 t.Fatalf(".5 scale image is wrong size, expected %v, got %v", expectedSize, dims.Size)
43 }
44
45 // Ensure the image responds to changes in DPI.
46 currentScale = float32(1)
47 gtx.Metric.PxPerDp = 2
48 dims = Image{Src: imgOp, Scale: float32(currentScale)}.Layout(gtx)
49 expectedSize = imgSize
50 expectedSize.X = int(float32(expectedSize.X) * currentScale * gtx.Metric.PxPerDp)
51 expectedSize.Y = int(float32(expectedSize.Y) * currentScale * gtx.Metric.PxPerDp)
52 if dims.Size != expectedSize {
53 t.Fatalf("HiDPI non-scaled image is wrong size, expected %v, got %v", expectedSize, dims.Size)
54 }
55
56 // Ensure scaling the image responds to changes in DPI.
57 currentScale = float32(.5)
58 gtx.Metric.PxPerDp = 2
59 dims = Image{Src: imgOp, Scale: float32(currentScale)}.Layout(gtx)
60 expectedSize = imgSize
61 expectedSize.X = int(float32(expectedSize.X) * currentScale * gtx.Metric.PxPerDp)
62 expectedSize.Y = int(float32(expectedSize.Y) * currentScale * gtx.Metric.PxPerDp)
63 if dims.Size != expectedSize {
64 t.Fatalf("HiDPI .5 scale image is wrong size, expected %v, got %v", expectedSize, dims.Size)
65 }
66 }
67