diff --git a/download.go b/download.go index 2bb57fe2..7bb7099b 100644 --- a/download.go +++ b/download.go @@ -67,7 +67,7 @@ func checkTypeAndDimensions(r io.Reader) (imageType, error) { if imgconf.Width > conf.MaxSrcDimension || imgconf.Height > conf.MaxSrcDimension { return UNKNOWN, errors.New("File is too big") } - if !imgtypeOk || !vipsTypeSupportedLoad(imgtype) { + if !imgtypeOk || !vipsTypeSupportLoad[imgtype] { return UNKNOWN, errors.New("Source image type not supported") } diff --git a/process.go b/process.go index 5e93fd2e..9b2a6080 100644 --- a/process.go +++ b/process.go @@ -78,6 +78,8 @@ type processingOptions struct { } var vipsSupportSmartcrop bool +var vipsTypeSupportLoad = make(map[imageType]bool) +var vipsTypeSupportSave = make(map[imageType]bool) func initVips() { runtime.LockOSThread() @@ -97,6 +99,29 @@ func initVips() { } vipsSupportSmartcrop = C.vips_support_smartcrop() == 1 + + if int(C.vips_type_find_load_go(C.JPEG)) != 0 { + vipsTypeSupportLoad[JPEG] = true + } + if int(C.vips_type_find_load_go(C.PNG)) != 0 { + vipsTypeSupportLoad[PNG] = true + } + if int(C.vips_type_find_load_go(C.WEBP)) != 0 { + vipsTypeSupportLoad[WEBP] = true + } + if int(C.vips_type_find_load_go(C.GIF)) != 0 { + vipsTypeSupportLoad[GIF] = true + } + + if int(C.vips_type_find_save_go(C.JPEG)) != 0 { + vipsTypeSupportSave[JPEG] = true + } + if int(C.vips_type_find_save_go(C.PNG)) != 0 { + vipsTypeSupportSave[PNG] = true + } + if int(C.vips_type_find_save_go(C.WEBP)) != 0 { + vipsTypeSupportSave[WEBP] = true + } } func randomAccessRequired(po processingOptions) int { @@ -106,32 +131,6 @@ func randomAccessRequired(po processingOptions) int { return 0 } -func vipsTypeSupportedLoad(imgtype imageType) bool { - switch imgtype { - case JPEG: - return int(C.vips_type_find_load_go(C.JPEG)) != 0 - case PNG: - return int(C.vips_type_find_load_go(C.PNG)) != 0 - case WEBP: - return int(C.vips_type_find_load_go(C.WEBP)) != 0 - case GIF: - return int(C.vips_type_find_load_go(C.GIF)) != 0 - } - return false -} - -func vipsTypeSupportedSave(imgtype imageType) bool { - switch imgtype { - case JPEG: - return int(C.vips_type_find_save_go(C.JPEG)) != 0 - case PNG: - return int(C.vips_type_find_save_go(C.PNG)) != 0 - case WEBP: - return int(C.vips_type_find_save_go(C.WEBP)) != 0 - } - return false -} - func round(f float64) int { return int(f + .5) } diff --git a/server.go b/server.go index f0123946..e8595e8e 100644 --- a/server.go +++ b/server.go @@ -77,7 +77,7 @@ func parsePath(r *http.Request) (string, processingOptions, error) { return "", po, fmt.Errorf("Invalid image format: %s", filenameParts[1]) } - if !vipsTypeSupportedSave(po.format) { + if !vipsTypeSupportSave[po.format] { return "", po, errors.New("Resulting image type not supported") }