Kaynağa Gözat

Add SVG pasthrough

DarthSim 6 yıl önce
ebeveyn
işleme
aa5ce8be8d
5 değiştirilmiş dosya ile 27 ekleme ve 6 silme
  1. 2 1
      CHANGELOG.md
  2. 1 1
      download.go
  3. 2 0
      image_type.go
  4. 21 3
      process.go
  5. 1 1
      processing_options.go

+ 2 - 1
CHANGELOG.md

@@ -6,7 +6,8 @@
 - TIFF and BMP support;
 - Using Application Default Credentials when `IMGPROXY_USE_GCS` is set to `true` but `IMGPROXY_GCS_KEY` is not set.
   **Note:** If you use `IMGPROXY_GCS_KEY`, it's recommended to set `IMGPROXY_USE_GCS` to `true` since it may be required by future versions to enable GCS support;
-- Setting `IMGPROXY_REPORT_DOWNLOADING_ERRORS` to `false` disables reporting of downloading errors.
+- Setting `IMGPROXY_REPORT_DOWNLOADING_ERRORS` to `false` disables reporting of downloading errors;
+- SVG passthrough. When source image and requested format are SVG, image will be returned without changes.
 
 ## v2.5.0
 

+ 1 - 1
download.go

@@ -111,7 +111,7 @@ func checkTypeAndDimensions(r io.Reader) (imageType, error) {
 	}
 
 	imgtype, imgtypeOk := imageTypes[meta.Format]
-	if !imgtypeOk || !vipsTypeSupportLoad[imgtype] {
+	if !imgtypeOk || !imageTypeLoadSupport(imgtype) {
 		return imageTypeUnknown, errSourceImageTypeNotSupported
 	}
 

+ 2 - 0
image_type.go

@@ -50,6 +50,7 @@ var (
 		imageTypeWEBP: "image/webp",
 		imageTypeGIF:  "image/gif",
 		imageTypeICO:  "image/x-icon",
+		imageTypeSVG:  "image/svg+xml",
 		imageTypeHEIC: "image/heif",
 		imageTypeBMP:  "image/bmp",
 		imageTypeTIFF: "image/tiff",
@@ -61,6 +62,7 @@ var (
 		imageTypeWEBP: "inline; filename=\"%s.webp\"",
 		imageTypeGIF:  "inline; filename=\"%s.gif\"",
 		imageTypeICO:  "inline; filename=\"%s.ico\"",
+		imageTypeSVG:  "inline; filename=\"%s.svg\"",
 		imageTypeHEIC: "inline; filename=\"%s.heic\"",
 		imageTypeBMP:  "inline; filename=\"%s.bmp\"",
 		imageTypeTIFF: "inline; filename=\"%s.tiff\"",

+ 21 - 3
process.go

@@ -10,6 +10,16 @@ import (
 
 const msgSmartCropNotSupported = "Smart crop is not supported by used version of libvips"
 
+var errConvertingNonSvgToSvg = newError(422, "Converting non-SVG images to SVG is not supported", "Converting non-SVG images to SVG is not supported")
+
+func imageTypeLoadSupport(imgtype imageType) bool {
+	return imgtype == imageTypeSVG || vipsTypeSupportLoad[imgtype]
+}
+
+func imageTypeSaveSupport(imgtype imageType) bool {
+	return imgtype == imageTypeSVG || vipsTypeSupportSave[imgtype]
+}
+
 func extractMeta(img *vipsImage) (int, int, int, bool) {
 	width := img.Width()
 	height := img.Height()
@@ -545,17 +555,25 @@ func processImage(ctx context.Context) ([]byte, context.CancelFunc, error) {
 
 	if po.Format == imageTypeUnknown {
 		switch {
-		case po.PreferWebP && vipsTypeSupportSave[imageTypeWEBP]:
+		case po.PreferWebP && imageTypeSaveSupport(imageTypeWEBP):
 			po.Format = imageTypeWEBP
-		case vipsTypeSupportSave[imgdata.Type] && imgdata.Type != imageTypeHEIC && imgdata.Type != imageTypeTIFF:
+		case imageTypeSaveSupport(imgdata.Type) && imgdata.Type != imageTypeHEIC && imgdata.Type != imageTypeTIFF:
 			po.Format = imgdata.Type
 		default:
 			po.Format = imageTypeJPEG
 		}
-	} else if po.EnforceWebP && vipsTypeSupportSave[imageTypeWEBP] {
+	} else if po.EnforceWebP && imageTypeSaveSupport(imageTypeWEBP) {
 		po.Format = imageTypeWEBP
 	}
 
+	if po.Format == imageTypeSVG {
+		if imgdata.Type != imageTypeSVG {
+			return []byte{}, func() {}, errConvertingNonSvgToSvg
+		}
+
+		return imgdata.Data, func() {}, nil
+	}
+
 	if !vipsSupportSmartcrop {
 		if po.Gravity.Type == gravitySmart {
 			logWarning(msgSmartCropNotSupported)

+ 1 - 1
processing_options.go

@@ -641,7 +641,7 @@ func applyFormatOption(po *processingOptions, args []string) error {
 		return fmt.Errorf("Invalid image format: %s", args[0])
 	}
 
-	if !vipsTypeSupportSave[po.Format] {
+	if !imageTypeSaveSupport(po.Format) {
 		return fmt.Errorf("Resulting image format is not supported: %s", po.Format)
 	}