Support SVG sources (closes #68)
check / check (push) Canceled after 0s

The fetcher accepts image/svg+xml and internal/magic detects SVG. orig
of an SVG at the orig size is the SVG unchanged, cached as a variant; at
another size it is ErrSVGNotOriginalSize (400). Any other format renders
it with libvips' thumbnail at the least size covering the output, at
most 8192 on a side, so it stays sharp. An SVG's own size is not
limited; one with a side over 8192 times the other is ErrSVGTooThin
(415). The cache reads up to 1024 first bytes to find a file's format.
Tests that pinned the SVG refusal now expect SVG to be read. Render time
and memory are unbounded: P1 in TODO.md until the owner decides on
#68.

Model: opus-5-5
This commit is contained in:
clawbot committed 2026-11-11 13:21:12 +00:00
1 parent e34463acf8
commit efbf05a6fa
20 files changed
+853 -83

No files matched your search

+5 -1
View File
@@ -14,7 +14,8 @@ import (
var ErrInvalidFitMode = errors.New("invalid fit mode")
// Format is an image format. pixa reads and writes the formats from JPEG to
// GIF below. In a request, orig and auto stand for one of them.
// GIF below. It reads SVG and writes it only as orig of an SVG source. In a
// request, orig and auto stand for another format.
type Format string
// Supported image formats.
@@ -26,6 +27,7 @@ const (
FormatAVIF Format = "avif"
FormatJXL Format = "jxl"
FormatGIF Format = "gif"
FormatSVG Format = "svg"
// FormatAuto stands for JPEG XL, AVIF, WebP or JPEG, chosen for each
// request from its Accept header once the URL's signature or token has
@@ -50,6 +52,8 @@ func (f Format) MIMEType() string {
return "image/jxl"
case FormatGIF:
return "image/gif"
case FormatSVG:
return "image/svg+xml"
case FormatOriginal, FormatAuto:
return ""
default: