Fix transparency problem when converting 32-bit images to WebP
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 7 Jul 2021 07:34:39 +0000 (09:34 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 7 Jul 2021 15:25:14 +0000 (17:25 +0200)
Fixes #8729

17 files changed:
resources/image_test.go
resources/images/image.go
resources/images/webp/webp.go
resources/images/webp/webp_notavailable.go
resources/testdata/fuzzy-cirlcle.png [new file with mode: 0644]
resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png
resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png
resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png
resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png
resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png
resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png
resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg
resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png
resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png
resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg
resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg
resources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp [new file with mode: 0644]

index e39e889925f8db46178b55ca3f1b74a30d7ebf11..a92249132c5e4ea0ea215388b20d908432ea1802 100644 (file)
@@ -28,6 +28,8 @@ import (
        "testing"
        "time"
 
+       "github.com/gohugoio/hugo/resources/images/webp"
+
        "github.com/gohugoio/hugo/common/paths"
 
        "github.com/spf13/afero"
@@ -550,6 +552,47 @@ func goldenEqual(img1, img2 *image.NRGBA) bool {
        return true
 }
 
+// Issue #8729
+func TestImageOperationsGoldenWebp(t *testing.T) {
+       if !webp.Supports() {
+               t.Skip("skip webp test")
+       }
+       c := qt.New(t)
+       c.Parallel()
+
+       devMode := false
+
+       testImages := []string{"fuzzy-cirlcle.png"}
+
+       spec, workDir := newTestResourceOsFs(c)
+       defer func() {
+               if !devMode {
+                       os.Remove(workDir)
+               }
+       }()
+
+       if devMode {
+               fmt.Println(workDir)
+       }
+
+       for _, imageName := range testImages {
+               image := fetchImageForSpec(spec, c, imageName)
+               imageWebp, err := image.Resize("200x webp")
+               c.Assert(err, qt.IsNil)
+               c.Assert(imageWebp.Width(), qt.Equals, 200)
+       }
+
+       if devMode {
+               return
+       }
+
+       dir1 := filepath.Join(workDir, "resources/_gen/images")
+       dir2 := filepath.FromSlash("testdata/golden_webp")
+
+       assetGoldenDirs(c, dir1, dir2)
+
+}
+
 func TestImageOperationsGolden(t *testing.T) {
        c := qt.New(t)
        c.Parallel()
@@ -658,6 +701,12 @@ func TestImageOperationsGolden(t *testing.T) {
        dir1 := filepath.Join(workDir, "resources/_gen/images")
        dir2 := filepath.FromSlash("testdata/golden")
 
+       assetGoldenDirs(c, dir1, dir2)
+
+}
+
+func assetGoldenDirs(c *qt.C, dir1, dir2 string) {
+
        // The two dirs above should now be the same.
        dirinfos1, err := ioutil.ReadDir(dir1)
        c.Assert(err, qt.IsNil)
@@ -692,7 +741,7 @@ func TestImageOperationsGolden(t *testing.T) {
                                "gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png":
                                c.Log("expectedly differs from golden due to dithering:", fi1.Name())
                        default:
-                               t.Errorf("resulting image differs from golden: %s", fi1.Name())
+                               c.Errorf("resulting image differs from golden: %s", fi1.Name())
                        }
                }
 
index db7d566a7d9aadf0a4d8ebb9a8ffe3aaba6a186f..4cbdc895f073b61a80c10c7b6613ab544e2159b4 100644 (file)
@@ -17,6 +17,7 @@ import (
        "fmt"
        "image"
        "image/color"
+       "image/draw"
        "image/gif"
        "image/jpeg"
        "image/png"
@@ -236,7 +237,18 @@ func (p *ImageProcessor) ApplyFiltersFromConfig(src image.Image, conf ImageConfi
 
 func (p *ImageProcessor) Filter(src image.Image, filters ...gift.Filter) (image.Image, error) {
        g := gift.New(filters...)
-       dst := image.NewRGBA(g.Bounds(src.Bounds()))
+       bounds := g.Bounds(src.Bounds())
+       var dst draw.Image
+       switch src.(type) {
+       case *image.RGBA:
+               dst = image.NewRGBA(bounds)
+       case *image.NRGBA:
+               dst = image.NewNRGBA(bounds)
+       case *image.Gray:
+               dst = image.NewGray(bounds)
+       default:
+               dst = image.NewNRGBA(bounds)
+       }
        g.Draw(dst, src)
        return dst, nil
 }
index d7443ff23a0aa58a920d4f023351841fef7785ee..5393569dae7dd0aeef835dfb0698ed0e7d3f6ff5 100644 (file)
@@ -28,3 +28,8 @@ import (
 func Encode(w io.Writer, m image.Image, o webpoptions.EncodingOptions) error {
        return libwebp.Encode(w, m, o)
 }
+
+// Supports returns whether webp encoding is supported in this build.
+func Supports() bool {
+       return true
+}
index 4209eb41aefe75454271e99d69267cedf948dc02..0c03a17499a90d7a9cc78b1c820f20c1297d6038 100644 (file)
@@ -28,3 +28,8 @@ import (
 func Encode(w io.Writer, m image.Image, o webpoptions.EncodingOptions) error {
        return herrors.ErrFeatureNotAvailable
 }
+
+// Supports returns whether webp encoding is supported in this build.
+func Supports() bool {
+       return false
+}
diff --git a/resources/testdata/fuzzy-cirlcle.png b/resources/testdata/fuzzy-cirlcle.png
new file mode 100644 (file)
index 0000000..95497d8
Binary files /dev/null and b/resources/testdata/fuzzy-cirlcle.png differ
index 59ac93c1c7754a227171badf510098ef0a8443f6..4ef633564b050a42b5791b0ab29f135e6e5dcbbd 100644 (file)
Binary files a/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png and b/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png differ
index 3a267fbdb69d706a495eaf0a4e0dce09f5df64f5..056648a749b2ecfe11bd0608571acec718488b02 100644 (file)
Binary files a/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png and b/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png differ
index f62d093a0839f98358519a207bc646a2a6e1a055..162dc4ec9eb8ad8927b4bca13861ff7dff3b4419 100644 (file)
Binary files a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png and b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png differ
index 5a27e2fada38e97055165b820c1c744b7813f1d9..0b914391c23a6ae448355008939c76ec913d7815 100644 (file)
Binary files a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png and b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png differ
index 86896ef012b2bf3f534831490c3e8b72ac67a44c..09d9919726562ef445b8464c7887e208d3df7d17 100644 (file)
Binary files a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png and b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png differ
index 830ee906b60e38ede61c23c71f1c5bb94cc3bc3b..50c55c9ebfdba485f1aae2ec4c1aad6b79a8fab5 100644 (file)
Binary files a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png and b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png differ
index 4ae6f51737afcdff6a49cda9997f5ab31a1559e9..17fca6e6ab639fc88bdd81c133a4411fecd3828c 100644 (file)
Binary files a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg and b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg differ
index 5b8748351b876fad0bfc0638cc7ab781dcc3695b..eb9f1170ca78ab7fd5200f1076646bafbf7b3b35 100644 (file)
Binary files a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png and b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png differ
index 3c861e922844ac13b4b5f9c1726d802308145b54..b01efee5029055df20fb1fc6054596339bf0899e 100644 (file)
Binary files a/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png and b/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png differ
index beb80bb123dc0764a403e4a0e5d36fef804e69cf..56642d7e10a155f79a07e29a88bb02f669b5e3e3 100644 (file)
Binary files a/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg and b/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg differ
index 15f2ef1c54049223e8333580d18e6e34c44f70ab..1857f8758ca86b8af45c303c95527dd898815c75 100644 (file)
Binary files a/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg and b/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg differ
diff --git a/resources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp b/resources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp
new file mode 100644 (file)
index 0000000..0b9e675
Binary files /dev/null and b/resources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp differ