]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
resources/images: Fix 2 animated GIF resize issues
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 4 Oct 2022 09:00:07 +0000 (11:00 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 4 Oct 2022 13:38:12 +0000 (15:38 +0200)
* Fix resize of animated GIF when target != GIF
* Avoid processing all GIF frames if targetFormat != GIF

Fixes #10354

12 files changed:
resources/image_test.go
resources/images/config.go
resources/images/image.go
resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_100x0_resize_q75_bgffffff_box_1.jpg [new file with mode: 0644]
resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box.gif [deleted file]
resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box_1.gif [new file with mode: 0644]
resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box.gif [deleted file]
resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box_1.gif [new file with mode: 0644]
resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box.gif [deleted file]
resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box_1.gif [new file with mode: 0644]
resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box.gif [deleted file]
resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box_1.gif [new file with mode: 0644]

index 111ce66db2b4bae26a4c827788cc6c0f26441a9f..75a20f156b6eb3125ab0f90539cb83ffb48d3d5a 100644 (file)
@@ -620,6 +620,8 @@ func TestImageOperationsGolden(t *testing.T) {
 
        // Note, if you're enabling this on a MacOS M1 (ARM) you need to run the test with GOARCH=amd64.
        // GOARCH=amd64 go test -timeout 30s -run "^TestImageOperationsGolden$" ./resources -v
+       // The above will print out a folder.
+       // Replace testdata/golden with resources/_gen/images in that folder.
        devMode := false
 
        testImages := []string{"sunset.jpg", "gohugoio8.png", "gohugoio24.png"}
@@ -663,7 +665,7 @@ func TestImageOperationsGolden(t *testing.T) {
 
        // Animated GIF
        orig = fetchImageForSpec(spec, c, "giphy.gif")
-       for _, resizeSpec := range []string{"200x", "512x"} {
+       for _, resizeSpec := range []string{"200x", "512x", "100x jpg"} {
                resized, err := orig.Resize(resizeSpec)
                c.Assert(err, qt.IsNil)
                rel := resized.RelPermalink()
index 62b5c72d8cf9cfe52d9ca473fea2532684e2bec1..6f562ff8ecef430a80ec44b10248408b6ec54bfd 100644 (file)
@@ -60,6 +60,7 @@ var (
        imageFormatsVersions = map[Format]int{
                PNG:  3, // Fix transparency issue with 32 bit images.
                WEBP: 2, // Fix transparency issue with 32 bit images.
+               GIF:  1, // Fix resize issue with animated GIFs when target != GIF.
        }
 
        // Increment to mark all processed images as stale. Only use when absolutely needed.
index 4ffbaa2295aac3058b52f75a8d5ac2826e732b1f..9dc8ed408c387828f7d32ee6d9ab7cb89987bd3b 100644 (file)
@@ -247,7 +247,7 @@ func (p *ImageProcessor) ApplyFiltersFromConfig(src image.Image, conf ImageConfi
                return nil, fmt.Errorf("unsupported action: %q", conf.Action)
        }
 
-       img, err := p.Filter(src, filters...)
+       img, err := p.doFilter(src, conf.TargetFormat, filters...)
        if err != nil {
                return nil, err
        }
@@ -256,25 +256,34 @@ func (p *ImageProcessor) ApplyFiltersFromConfig(src image.Image, conf ImageConfi
 }
 
 func (p *ImageProcessor) Filter(src image.Image, filters ...gift.Filter) (image.Image, error) {
+       return p.doFilter(src, 0, filters...)
+}
+
+func (p *ImageProcessor) doFilter(src image.Image, targetFormat Format, filters ...gift.Filter) (image.Image, error) {
 
        filter := gift.New(filters...)
 
-       if giph, ok := src.(Giphy); ok && len(giph.GIF().Image) > 1 {
+       if giph, ok := src.(Giphy); ok {
                g := giph.GIF()
-               var bounds image.Rectangle
-               firstFrame := g.Image[0]
-               tmp := image.NewNRGBA(firstFrame.Bounds())
-               for i := range g.Image {
-                       gift.New().DrawAt(tmp, g.Image[i], g.Image[i].Bounds().Min, gift.OverOperator)
-                       bounds = filter.Bounds(tmp.Bounds())
-                       dst := image.NewPaletted(bounds, g.Image[i].Palette)
-                       filter.Draw(dst, tmp)
-                       g.Image[i] = dst
+               if len(g.Image) < 2 || (targetFormat == 0 || targetFormat != GIF) {
+                       src = g.Image[0]
+               } else {
+                       var bounds image.Rectangle
+                       firstFrame := g.Image[0]
+                       tmp := image.NewNRGBA(firstFrame.Bounds())
+                       for i := range g.Image {
+                               gift.New().DrawAt(tmp, g.Image[i], g.Image[i].Bounds().Min, gift.OverOperator)
+                               bounds = filter.Bounds(tmp.Bounds())
+                               dst := image.NewPaletted(bounds, g.Image[i].Palette)
+                               filter.Draw(dst, tmp)
+                               g.Image[i] = dst
+                       }
+                       g.Config.Width = bounds.Dx()
+                       g.Config.Height = bounds.Dy()
+
+                       return giph, nil
                }
-               g.Config.Width = bounds.Dx()
-               g.Config.Height = bounds.Dy()
 
-               return giph, nil
        }
 
        bounds := filter.Bounds(src.Bounds())
diff --git a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_100x0_resize_q75_bgffffff_box_1.jpg b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_100x0_resize_q75_bgffffff_box_1.jpg
new file mode 100644 (file)
index 0000000..c55e5d3
Binary files /dev/null and b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_100x0_resize_q75_bgffffff_box_1.jpg differ
diff --git a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box.gif b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box.gif
deleted file mode 100644 (file)
index ca82643..0000000
Binary files a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box.gif and /dev/null differ
diff --git a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box_1.gif b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box_1.gif
new file mode 100644 (file)
index 0000000..ca82643
Binary files /dev/null and b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box_1.gif differ
diff --git a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box.gif b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box.gif
deleted file mode 100644 (file)
index 590d2a7..0000000
Binary files a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box.gif and /dev/null differ
diff --git a/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box_1.gif b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box_1.gif
new file mode 100644 (file)
index 0000000..590d2a7
Binary files /dev/null and b/resources/testdata/golden/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_512x0_resize_box_1.gif differ
diff --git a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box.gif b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box.gif
deleted file mode 100644 (file)
index 7d810c1..0000000
Binary files a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box.gif and /dev/null differ
diff --git a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box_1.gif b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box_1.gif
new file mode 100644 (file)
index 0000000..7d810c1
Binary files /dev/null and b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_100x0_resize_box_1.gif differ
diff --git a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box.gif b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box.gif
deleted file mode 100644 (file)
index c4b39b0..0000000
Binary files a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box.gif and /dev/null differ
diff --git a/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box_1.gif b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box_1.gif
new file mode 100644 (file)
index 0000000..c4b39b0
Binary files /dev/null and b/resources/testdata/golden/gohugoio-card_hu4d09f75255d3942fd4680641110a1a73_10820_220x0_resize_box_1.gif differ