hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 8f40f34cd10a98598bb822ec633fd5d0ea64b612
parent 8ddbc95466e2702ca192acc0950e6fce45b313a8
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Wed,  7 Jul 2021 09:34:39 +0200

Fix transparency problem when converting 32-bit images to WebP

Fixes #8729

Diffstat:
Mresources/image_test.go | 51++++++++++++++++++++++++++++++++++++++++++++++++++-
Mresources/images/image.go | 14+++++++++++++-
Mresources/images/webp/webp.go | 5+++++
Mresources/images/webp/webp_notavailable.go | 5+++++
Aresources/testdata/fuzzy-cirlcle.png | 0
Mresources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png | 0
Mresources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png | 0
Mresources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png | 0
Mresources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png | 0
Mresources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png | 0
Mresources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png | 0
Mresources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg | 0
Mresources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png | 0
Mresources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png | 0
Mresources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg | 0
Mresources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg | 0
Aresources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp | 0
17 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/resources/image_test.go b/resources/image_test.go
@@ -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())
 			}
 		}
 
diff --git a/resources/images/image.go b/resources/images/image.go
@@ -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
 }
diff --git a/resources/images/webp/webp.go b/resources/images/webp/webp.go
@@ -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
+}
diff --git a/resources/images/webp/webp_notavailable.go b/resources/images/webp/webp_notavailable.go
@@ -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
Binary files differ.
diff --git a/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png b/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png
Binary files differ.
diff --git a/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png b/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png
Binary files differ.
diff --git a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png
Binary files differ.
diff --git a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png
Binary files differ.
diff --git a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png
Binary files differ.
diff --git a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png
Binary files differ.
diff --git a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg
Binary files differ.
diff --git a/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png b/resources/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png
Binary files differ.
diff --git a/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png b/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png
Binary files differ.
diff --git a/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg b/resources/testdata/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg
Binary files differ.
diff --git a/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg b/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg
Binary files 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
Binary files differ.