@@ -4,6 +4,7 @@ package lilliput
44
55import (
66 "bytes"
7+ _ "embed"
78 "errors"
89 "strings"
910 "time"
@@ -14,6 +15,12 @@ const (
1415 ICCProfileBufferSize = 32768
1516)
1617
18+ // SRGBICCProfile is the sRGB ICC profile (v4) - used when force_sdr overrides HDR ICC profiles.
19+ // Source: https://github.com/saucecontrol/Compact-ICC-Profiles
20+ //
21+ //go:embed icc_profiles/srgb_profile.icc
22+ var SRGBICCProfile []byte
23+
1724var (
1825 ErrInvalidImage = errors .New ("unrecognized image format" )
1926 ErrDecodingFailed = errors .New ("failed to decode image" )
@@ -156,30 +163,40 @@ func NewDecoderWithOptionalToneMapping(buf []byte, toneMappingEnabled bool) (Dec
156163 return newAVCodecDecoder (buf )
157164}
158165
159- // NewEncoder returns an Encode which can be used to encode Framebuffer
166+ // EncodeConfig provides configuration options for encoders.
167+ // This struct provides a clean extension point for future encoding config
168+ // without changing function signatures.
169+ type EncodeConfig struct {
170+ // ICCOverride overrides the decoder's ICC profile when set.
171+ // Used for HDR→SDR conversion to force sRGB output.
172+ ICCOverride []byte
173+ }
174+
175+ // NewEncoder returns an Encoder which can be used to encode Framebuffer
160176// into compressed image data. ext should be a string like ".jpeg" or
161177// ".png". decodedBy is optional and can be the Decoder used to make
162178// the Framebuffer. dst is where an encoded image will be written.
163- func NewEncoder (ext string , decodedBy Decoder , dst []byte ) (Encoder , error ) {
179+ // config can be nil to use default settings.
180+ func NewEncoder (ext string , decodedBy Decoder , dst []byte , config * EncodeConfig ) (Encoder , error ) {
164181 if strings .ToLower (ext ) == ".gif" {
165- return newGifEncoder (decodedBy , dst )
182+ return newGifEncoder (decodedBy , dst , config )
166183 }
167184
168185 if strings .ToLower (ext ) == ".webp" {
169- return newWebpEncoder (decodedBy , dst )
186+ return newWebpEncoder (decodedBy , dst , config )
170187 }
171188
172189 if strings .ToLower (ext ) == ".avif" {
173- return newAvifEncoder (decodedBy , dst )
190+ return newAvifEncoder (decodedBy , dst , config )
174191 }
175192
176193 if strings .ToLower (ext ) == ".mp4" || strings .ToLower (ext ) == ".webm" {
177194 return nil , errors .New ("Encoder cannot encode into video types" )
178195 }
179196
180197 if strings .ToLower (ext ) == ".thumbhash" {
181- return newThumbhashEncoder (decodedBy , dst )
198+ return newThumbhashEncoder (decodedBy , dst , config )
182199 }
183200
184- return newOpenCVEncoder (ext , decodedBy , dst )
201+ return newOpenCVEncoder (ext , decodedBy , dst , config )
185202}
0 commit comments