From 5b3e5782f38f6570b84dd5eecdfc3f21f4aed8a4 Mon Sep 17 00:00:00 2001 From: Adrian Shum Date: Thu, 6 Oct 2022 17:20:02 +0800 Subject: [PATCH] feat(vips): filter max_frames(n) (#195) * feat(vips): filter max_frames(n) * test: update golden files --- .../dancing-banana.gif | Bin 0 -> 6405 bytes vips/filter.go | 2 +- vips/process.go | 5 +++++ vips/processor_test.go | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 testdata/golden/filters%3Amax_frames%283%29/dancing-banana.gif diff --git a/testdata/golden/filters%3Amax_frames%283%29/dancing-banana.gif b/testdata/golden/filters%3Amax_frames%283%29/dancing-banana.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fae30c679083ebd4a5177bf90ef6647c8381f54 GIT binary patch literal 6405 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 literal 0 HcmV?d00001 diff --git a/vips/filter.go b/vips/filter.go index ae73fe63a..777985d70 100644 --- a/vips/filter.go +++ b/vips/filter.go @@ -146,7 +146,7 @@ func (v *Processor) watermark(ctx context.Context, img *Image, load imagor.LoadF return } -func frames(ctx context.Context, img *Image, _ imagor.LoadFunc, args ...string) (err error) { +func frames(_ context.Context, img *Image, _ imagor.LoadFunc, args ...string) (err error) { ln := len(args) if ln == 0 { return diff --git a/vips/process.go b/vips/process.go index e5d1f584b..1e1bc42cb 100644 --- a/vips/process.go +++ b/vips/process.go @@ -69,6 +69,11 @@ func (v *Processor) Process( } } break + case "max_frames": + if n, _ := strconv.Atoi(p.Args); n > 0 { + maxN = n + } + break case "stretch": stretch = true break diff --git a/vips/processor_test.go b/vips/processor_test.go index bd6c1431f..4a1588e2f 100644 --- a/vips/processor_test.go +++ b/vips/processor_test.go @@ -125,6 +125,7 @@ func TestProcessor(t *testing.T) { {name: "original no animate", path: "filters:fill(white):format(jpeg)/dancing-banana.gif"}, {name: "original animated", path: "dancing-banana.gif"}, {name: "original animated quality", path: "filters:quality(60)/dancing-banana.gif"}, + {name: "original animated max_frames", path: "filters:max_frames(3)/dancing-banana.gif"}, {name: "rotate animated", path: "fit-in/100x150/filters:rotate(90):fill(yellow)/dancing-banana.gif"}, {name: "crop animated", path: "30x20:100x150/dancing-banana.gif"}, {name: "crop-percent animated", path: "0.1x0.2:0.89x0.72/dancing-banana.gif"},