|
@@ -247,6 +247,293 @@ func BenchmarkAdjustSaturation(b *testing.B) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestAdjustHue(t *testing.T) {
|
|
|
+ testCases := []struct {
|
|
|
+ name string
|
|
|
+ src image.Image
|
|
|
+ p float64
|
|
|
+ want *image.NRGBA
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 -540",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ -540,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0xcc, 0xcc, 0x01, 0xcc, 0x00, 0xcc, 0x02, 0xcc, 0xcc, 0x00, 0x03,
|
|
|
+ 0x33, 0x22, 0x11, 0xff, 0x11, 0x22, 0x33, 0xff, 0x44, 0xbb, 0x33, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 -360",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ -360,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 -350",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ -350,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x22, 0x00, 0x01, 0x00, 0xcc, 0x22, 0x02, 0x22, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x1c, 0x33, 0xff, 0x33, 0x28, 0x11, 0xff, 0xbb, 0x33, 0xb5, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 -180",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ -180,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0xcc, 0xcc, 0x01, 0xcc, 0x00, 0xcc, 0x02, 0xcc, 0xcc, 0x00, 0x03,
|
|
|
+ 0x33, 0x22, 0x11, 0xff, 0x11, 0x22, 0x33, 0xff, 0x44, 0xbb, 0x33, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 -10",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ -10,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x22, 0x01, 0x22, 0xcc, 0x00, 0x02, 0x00, 0x22, 0xcc, 0x03,
|
|
|
+ 0x11, 0x28, 0x33, 0xff, 0x33, 0x1c, 0x11, 0xff, 0x93, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 0",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 0,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 10",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 10,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x22, 0x00, 0x01, 0x00, 0xcc, 0x22, 0x02, 0x22, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x1c, 0x33, 0xff, 0x33, 0x28, 0x11, 0xff, 0xbb, 0x33, 0xb5, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 180",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 180,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0xcc, 0xcc, 0x01, 0xcc, 0x00, 0xcc, 0x02, 0xcc, 0xcc, 0x00, 0x03,
|
|
|
+ 0x33, 0x22, 0x11, 0xff, 0x11, 0x22, 0x33, 0xff, 0x44, 0xbb, 0x33, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 350",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 350,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x22, 0x01, 0x22, 0xcc, 0x00, 0x02, 0x00, 0x22, 0xcc, 0x03,
|
|
|
+ 0x11, 0x28, 0x33, 0xff, 0x33, 0x1c, 0x11, 0xff, 0x93, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 360",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 360,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "AdjustHue 3x3 540",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 2),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xcc, 0x00, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x00, 0xcc, 0x03,
|
|
|
+ 0x11, 0x22, 0x33, 0xff, 0x33, 0x22, 0x11, 0xff, 0xaa, 0x33, 0xbb, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 540,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 3, 3),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0xcc, 0xcc, 0x01, 0xcc, 0x00, 0xcc, 0x02, 0xcc, 0xcc, 0x00, 0x03,
|
|
|
+ 0x33, 0x22, 0x11, 0xff, 0x11, 0x22, 0x33, 0xff, 0x44, 0xbb, 0x33, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, tc := range testCases {
|
|
|
+ t.Run(tc.name, func(t *testing.T) {
|
|
|
+ got := AdjustHue(tc.src, tc.p)
|
|
|
+ if !compareNRGBA(got, tc.want, 0) {
|
|
|
+ t.Fatalf("got result %#v want %#v", got, tc.want)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestAdjustHueGolden(t *testing.T) {
|
|
|
+ for name, p := range map[string]float64{
|
|
|
+ "out_hue_m480.png": -480,
|
|
|
+ "out_hue_m120.png": -120,
|
|
|
+ "out_hue_m60.png": -60,
|
|
|
+ "out_hue_p60.png": 60,
|
|
|
+ "out_hue_p120.png": 120,
|
|
|
+ "out_hue_p480.png": 480,
|
|
|
+ } {
|
|
|
+ got := AdjustHue(testdataFlowersSmallPNG, p)
|
|
|
+ want, err := Open("testdata/" + name)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("failed to open image: %v", err)
|
|
|
+ }
|
|
|
+ if !compareNRGBAGolden(got, toNRGBA(want)) {
|
|
|
+ t.Errorf("resulting image differs from golden: %s", name)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func BenchmarkAdjustHue(b *testing.B) {
|
|
|
+ b.ReportAllocs()
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
+ AdjustHue(testdataBranchesJPG, 10)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func TestAdjustContrast(t *testing.T) {
|
|
|
testCases := []struct {
|
|
|
name string
|