Skip to content

Commit

Permalink
Fix transparency problem when converting 32-bit images to WebP
Browse files Browse the repository at this point in the history
Fixes #8729
  • Loading branch information
bep committed Jul 7, 2021
1 parent 8ddbc95 commit 8f40f34
Show file tree
Hide file tree
Showing 17 changed files with 73 additions and 2 deletions.
51 changes: 50 additions & 1 deletion resources/image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import (
"testing"
"time"

"github.com/gohugoio/hugo/resources/images/webp"

"github.com/gohugoio/hugo/common/paths"

"github.com/spf13/afero"
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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())
}
}

Expand Down
14 changes: 13 additions & 1 deletion resources/images/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"fmt"
"image"
"image/color"
"image/draw"
"image/gif"
"image/jpeg"
"image/png"
Expand Down Expand Up @@ -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
}
Expand Down
5 changes: 5 additions & 0 deletions resources/images/webp/webp.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
5 changes: 5 additions & 0 deletions resources/images/webp/webp_notavailable.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 added resources/testdata/fuzzy-cirlcle.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.

0 comments on commit 8f40f34

Please sign in to comment.