Skip to content
Permalink
Browse files
Fix transparency problem when converting 32-bit images to WebP
Fixes #8729
  • Loading branch information
bep committed Jul 7, 2021
1 parent 8ddbc95 commit 8f40f34cd10a98598bb822ec633fd5d0ea64b612
Showing with 73 additions and 2 deletions.
  1. +50 −1 resources/image_test.go
  2. +13 −1 resources/images/image.go
  3. +5 −0 resources/images/webp/webp.go
  4. +5 −0 resources/images/webp/webp_notavailable.go
  5. BIN resources/testdata/fuzzy-cirlcle.png
  6. BIN ...ta/golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_300x200_fill_gaussian_smart1_2.png
  7. BIN .../golden/gohugoio24_huc57dd738f4724f4b341121e66fd85555_267952_3ad578dd67cd055b4382e4062918d0a2.png
  8. BIN ...data/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_300x200_fill_gaussian_smart1_2.png
  9. BIN ...ta/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_8544b956dc08b714975ae52d4dcfdd78.png
  10. BIN ...ta/golden/gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_b4afd8d32218a87ed1f7e351368501c3.png
  11. BIN ...data/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_bge3e615_box_2.png
  12. BIN .../golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_200x0_resize_q75_bge3e615_box_2.jpg
  13. BIN ...urces/testdata/golden/gopher-hero8_huaa0cd7d2cfc14ff32a57f171896f2285_13327_30x0_resize_box_2.png
  14. BIN ...a/golden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_bge3e615_box_2.png
  15. BIN ...lden/gradient-circle_huf3d35257a40a8d6f525263a856c5ecfd_20069_200x0_resize_q75_bge3e615_box_2.jpg
  16. BIN ...tdata/golden/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_da536a2a5436e387d0d482675e08ad48.jpg
  17. BIN ...golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_2.webp
@@ -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())
}
}

@@ -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
}
@@ -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
}
@@ -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
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 comments on commit 8f40f34

Please sign in to comment.