Fix transparency problem when converting 32-bit images to WebP - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 8f40f34cd10a98598bb822ec633fd5d0ea64b612
DIR parent 8ddbc95466e2702ca192acc0950e6fce45b313a8
HTML 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:
M resources/image_test.go | 51 ++++++++++++++++++++++++++++++-
M resources/images/image.go | 14 +++++++++++++-
M resources/images/webp/webp.go | 5 +++++
M resources/images/webp/webp_notavai… | 5 +++++
A resources/testdata/fuzzy-cirlcle.p… | 0
M resources/testdata/golden/gohugoio… | 0
M resources/testdata/golden/gohugoio… | 0
M resources/testdata/golden/gohugoio… | 0
M resources/testdata/golden/gohugoio… | 0
M resources/testdata/golden/gohugoio… | 0
M resources/testdata/golden/gopher-h… | 0
M resources/testdata/golden/gopher-h… | 0
M resources/testdata/golden/gopher-h… | 0
M resources/testdata/golden/gradient… | 0
M resources/testdata/golden/gradient… | 0
M resources/testdata/golden/sunset_h… | 0
A resources/testdata/golden_webp/fuz… | 0
17 files changed, 73 insertions(+), 2 deletions(-)
---
DIR 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())
}
}
DIR 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
}
DIR 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
+}
DIR 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
+}
DIR diff --git a/resources/testdata/fuzzy-cirlcle.png b/resources/testdata/fuzzy-cirlcle.png
Binary files differ.
DIR 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.
DIR diff --git a/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png b/resources/testdata/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png
Binary files differ.
DIR 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.
DIR diff --git a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png
Binary files differ.
DIR diff --git a/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png b/resources/testdata/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png
Binary files differ.
DIR 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.
DIR 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.
DIR 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.
DIR 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.
DIR 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.
DIR diff --git a/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg b/resources/testdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg
Binary files differ.
DIR 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.