From 881b3455cb5620daca2cb620ecac9d471b917cea Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 11 Aug 2025 03:15:29 +0200 Subject: [PATCH] input-only codecs --- internal/codec/avif/avif.go | 5 ++++- internal/codec/bmp/bmp.go | 4 ++++ internal/codec/codec.go | 2 ++ internal/codec/detect.go | 8 ++++++++ internal/codec/gif/gif.go | 4 ++++ internal/codec/ico/ico.go | 4 ++++ internal/codec/jpeg/jpeg.go | 4 ++++ internal/codec/jpegxl/jpegxl.go | 4 ++++ internal/codec/png/png.go | 4 ++++ internal/codec/tiff/tiff.go | 4 ++++ internal/codec/webp/webp.go | 4 ++++ 11 files changed, 46 insertions(+), 1 deletion(-) diff --git a/internal/codec/avif/avif.go b/internal/codec/avif/avif.go index 60bb6ea..1af4882 100644 --- a/internal/codec/avif/avif.go +++ b/internal/codec/avif/avif.go @@ -15,7 +15,6 @@ import ( ) var ( - quality int qualityA int speed int chroma int @@ -35,6 +34,10 @@ func (impl) Extensions() []string { return []string{"avif"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{ diff --git a/internal/codec/bmp/bmp.go b/internal/codec/bmp/bmp.go index 8a731c7..e4bb68d 100644 --- a/internal/codec/bmp/bmp.go +++ b/internal/codec/bmp/bmp.go @@ -26,6 +26,10 @@ func (impl) Extensions() []string { return []string{"bmp"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return flags } diff --git a/internal/codec/codec.go b/internal/codec/codec.go index 1583c40..abc26c8 100644 --- a/internal/codec/codec.go +++ b/internal/codec/codec.go @@ -14,6 +14,8 @@ type Codec interface { Flags([]cli.Flag) []cli.Flag Extensions() []string + CanEncode() bool + Sniff(io.ReaderAt) (int, []byte, error) Decode(io.Reader) (image.Image, error) Encode(io.Writer, image.Image, opts.Common) error diff --git a/internal/codec/detect.go b/internal/codec/detect.go index 9b0402e..c377964 100644 --- a/internal/codec/detect.go +++ b/internal/codec/detect.go @@ -78,6 +78,10 @@ func Detect(output, override string) (Codec, error) { return nil, fmt.Errorf("unsupported output codec: %q", override) } + if !codec.CanEncode() { + return nil, fmt.Errorf("decode-only output codec: %q", override) + } + return codec, nil } @@ -93,6 +97,10 @@ func Detect(output, override string) (Codec, error) { for _, codec := range codecs { for _, alias := range codec.Extensions() { if ext == strings.ToLower(alias) { + if !codec.CanEncode() { + return nil, fmt.Errorf("decode-only output codec: %q", override) + } + return codec, nil } } diff --git a/internal/codec/gif/gif.go b/internal/codec/gif/gif.go index ba81d79..cfed6ef 100644 --- a/internal/codec/gif/gif.go +++ b/internal/codec/gif/gif.go @@ -29,6 +29,10 @@ func (impl) Extensions() []string { return []string{"gif"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{ Name: "gif.colors", diff --git a/internal/codec/ico/ico.go b/internal/codec/ico/ico.go index 2a0f64e..49698f0 100644 --- a/internal/codec/ico/ico.go +++ b/internal/codec/ico/ico.go @@ -30,6 +30,10 @@ func (impl) Flags(flags []cli.Flag) []cli.Flag { return flags } +func (impl) CanEncode() bool { + return true +} + func (impl) Sniff(reader io.ReaderAt) (int, []byte, error) { magicICO := []byte{0x00, 0x00, 0x01, 0x00} magicCUR := []byte{0x00, 0x00, 0x02, 0x00} diff --git a/internal/codec/jpeg/jpeg.go b/internal/codec/jpeg/jpeg.go index 6c325af..4ad8cdd 100644 --- a/internal/codec/jpeg/jpeg.go +++ b/internal/codec/jpeg/jpeg.go @@ -30,6 +30,10 @@ func (impl) Flags(flags []cli.Flag) []cli.Flag { return flags } +func (impl) CanEncode() bool { + return true +} + func (impl) Sniff(reader io.ReaderAt) (int, []byte, error) { magic := []byte{0xFF, 0xD8, 0xFF} diff --git a/internal/codec/jpegxl/jpegxl.go b/internal/codec/jpegxl/jpegxl.go index 911a311..221f678 100644 --- a/internal/codec/jpegxl/jpegxl.go +++ b/internal/codec/jpegxl/jpegxl.go @@ -32,6 +32,10 @@ func (impl) Extensions() []string { return []string{"jxl"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{ diff --git a/internal/codec/png/png.go b/internal/codec/png/png.go index c2d69fa..24728bd 100644 --- a/internal/codec/png/png.go +++ b/internal/codec/png/png.go @@ -31,6 +31,10 @@ func (impl) Extensions() []string { return []string{"png"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{ Name: "png.compression", diff --git a/internal/codec/tiff/tiff.go b/internal/codec/tiff/tiff.go index 2e36dd6..6f885a2 100644 --- a/internal/codec/tiff/tiff.go +++ b/internal/codec/tiff/tiff.go @@ -33,6 +33,10 @@ func (impl) Extensions() []string { return []string{"tiff", "tif"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{ diff --git a/internal/codec/webp/webp.go b/internal/codec/webp/webp.go index 7161e5b..7969828 100644 --- a/internal/codec/webp/webp.go +++ b/internal/codec/webp/webp.go @@ -33,6 +33,10 @@ func (impl) Extensions() []string { return []string{"webp"} } +func (impl) CanEncode() bool { + return true +} + func (impl) Flags(flags []cli.Flag) []cli.Flag { return append(flags, &cli.IntFlag{