diff --git a/README.md b/README.md
index 206a8643..79923293 100644
--- a/README.md
+++ b/README.md
@@ -210,10 +210,6 @@ You can find helpful code snippets in the `examples` folder.
imgproxy supports only the most popular image formats of the moment: PNG, JPEG, GIF and WebP.
-## Special thanks
-
-Special thanks to [h2non](https://github.com/h2non) and all authors and contributors of [bimg](https://github.com/h2non/bimg).
-
## Author
Sergey "DarthSim" Aleksandrovich
diff --git a/config.go b/config.go
index f4043a0a..0b103b89 100644
--- a/config.go
+++ b/config.go
@@ -167,4 +167,6 @@ func init() {
} else if conf.GZipCompression > 9 {
log.Fatalf("GZip compression can't be greater than 9, now - %d\n", conf.GZipCompression)
}
+
+ initVips()
}
diff --git a/download.go b/download.go
index cec43a94..2bb57fe2 100644
--- a/download.go
+++ b/download.go
@@ -57,41 +57,50 @@ func (r *netReader) GrowBuf(s int) {
r.buf.Grow(s)
}
-func checkTypeAndDimensions(r io.Reader) error {
- imgconf, _, err := image.DecodeConfig(r)
+func checkTypeAndDimensions(r io.Reader) (imageType, error) {
+ imgconf, imgtypeStr, err := image.DecodeConfig(r)
+ imgtype, imgtypeOk := imageTypes[imgtypeStr]
+
if err != nil {
- return err
+ return UNKNOWN, err
}
if imgconf.Width > conf.MaxSrcDimension || imgconf.Height > conf.MaxSrcDimension {
- return errors.New("File is too big")
+ return UNKNOWN, errors.New("File is too big")
}
- return nil
+ if !imgtypeOk || !vipsTypeSupportedLoad(imgtype) {
+ return UNKNOWN, errors.New("Source image type not supported")
+ }
+
+ return imgtype, nil
}
-func readAndCheckImage(res *http.Response) ([]byte, error) {
+func readAndCheckImage(res *http.Response) ([]byte, imageType, error) {
nr := newNetReader(res.Body)
- if err := checkTypeAndDimensions(nr); err != nil {
- return nil, err
+ imgtype, err := checkTypeAndDimensions(nr)
+ if err != nil {
+ return nil, UNKNOWN, err
}
if res.ContentLength > 0 {
nr.GrowBuf(int(res.ContentLength))
}
- return nr.ReadAll()
+ b, err := nr.ReadAll()
+
+ return b, imgtype, err
}
-func downloadImage(url string) ([]byte, error) {
+func downloadImage(url string) ([]byte, imageType, error) {
res, err := downloadClient.Get(url)
if err != nil {
- return nil, err
+ return nil, UNKNOWN, err
}
defer res.Body.Close()
if res.StatusCode != 200 {
body, _ := ioutil.ReadAll(res.Body)
- return nil, fmt.Errorf("Can't download image; Status: %d; %s", res.StatusCode, string(body))
+ return nil, UNKNOWN, fmt.Errorf("Can't download image; Status: %d; %s", res.StatusCode, string(body))
}
return readAndCheckImage(res)
diff --git a/glide.lock b/glide.lock
index f4db7f9f..c426ecee 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,19 +1,15 @@
-hash: 54db290c0c5bcd14e69e3faa4a1a23040d9117283134d96d6d8ed0df3544283e
-updated: 2017-09-15T13:31:21.075317146+03:00
+hash: 0ef57dd15f41e8f5181f43ff93b7c420e63c8bb2174a8c879ffd56dd98bed659
+updated: 2017-09-27T13:53:20.123821976+06:00
imports:
-- name: github.com/h2non/bimg
- version: 276e0541892a9c518de3cf332536cd30ebef25de
-- name: github.com/tj/go-debug
- version: ff4a55a20a86994118644bbddc6a216da193cc13
- name: golang.org/x/image
- version: e20db36d77bd0cb36cea8fe49d5c37d82d21591f
+ version: 334384d9e19178a0488c9360d94d183c1ef0f711
subpackages:
- riff
- vp8
- vp8l
- webp
- name: golang.org/x/net
- version: 859d1a86bb617c0c20d154590c3c5d3fcb670b07
+ version: 0a9397675ba34b2845f758fe3cd68828369c6517
subpackages:
- netutil
- name: gopkg.in/yaml.v2
diff --git a/glide.yaml b/glide.yaml
index b379ab83..9d159acd 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -1,7 +1,5 @@
package: github.com/DarthSim/imgproxy
import:
-- package: github.com/h2non/bimg
- version: ~1.0.9
- package: gopkg.in/yaml.v2
- package: golang.org/x/net
subpackages:
diff --git a/main.go b/main.go
index f2255010..51700cd6 100644
--- a/main.go
+++ b/main.go
@@ -16,7 +16,7 @@ func main() {
}
s := &http.Server{
- Handler: newHttpHandler(),
+ Handler: newHTTPHandler(),
ReadTimeout: time.Duration(conf.ReadTimeout) * time.Second,
WriteTimeout: time.Duration(conf.WriteTimeout) * time.Second,
MaxHeaderBytes: 1 << 20,
diff --git a/process.go b/process.go
index 57ce7d5c..eb794913 100644
--- a/process.go
+++ b/process.go
@@ -1,91 +1,269 @@
package main
-import (
- "math"
+/*
+#cgo pkg-config: vips
+#include "vips.h"
+*/
+import "C"
- "github.com/h2non/bimg"
+import (
+ "errors"
+ "log"
+ "math"
+ "runtime"
+ "unsafe"
)
+type imageType int
+
+const (
+ UNKNOWN imageType = iota
+ JPEG
+ PNG
+ WEBP
+ GIF
+)
+
+var imageTypes = map[string]imageType{
+ "jpeg": JPEG,
+ "jpg": JPEG,
+ "png": PNG,
+ "webp": WEBP,
+ "gif": GIF,
+}
+
+type gravityType int
+
+const (
+ CENTER gravityType = iota
+ NORTH
+ EAST
+ SOUTH
+ WEST
+ SMART
+)
+
+var gravityTypes = map[string]gravityType{
+ "ce": CENTER,
+ "no": NORTH,
+ "ea": EAST,
+ "so": SOUTH,
+ "we": WEST,
+ "sm": SMART,
+}
+
+type resizeType int
+
+const (
+ FIT resizeType = iota
+ FILL
+ CROP
+)
+
+var resizeTypes = map[string]resizeType{
+ "fit": FIT,
+ "fill": FILL,
+ "crop": CROP,
+}
+
type processingOptions struct {
- resize string
+ resize resizeType
width int
height int
- gravity bimg.Gravity
+ gravity gravityType
enlarge bool
- format bimg.ImageType
+ format imageType
}
-var imageTypes = map[string]bimg.ImageType{
- "jpeg": bimg.JPEG,
- "jpg": bimg.JPEG,
- "png": bimg.PNG,
- "webp": bimg.WEBP,
+func initVips() {
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ if err := C.vips_initialize(); err != 0 {
+ C.vips_shutdown()
+ log.Fatalln("unable to start vips!")
+ }
+
+ C.vips_concurrency_set(1)
+ C.vips_cache_set_max_mem(100 * 1024 * 1024) // 100Mb
+ C.vips_cache_set_max(500)
}
-var gravityTypes = map[string]bimg.Gravity{
- "ce": bimg.GravityCentre,
- "no": bimg.GravityNorth,
- "ea": bimg.GravityEast,
- "so": bimg.GravitySouth,
- "we": bimg.GravityWest,
- "sm": bimg.GravitySmart,
+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)
}
-func calcSize(size bimg.ImageSize, po processingOptions) (int, int) {
- if (po.width == size.Width && po.height == size.Height) || (po.resize != "fill" && po.resize != "fit") {
- return po.width, po.height
+
+func calcScale(width, height int, po processingOptions) float64 {
+ if (po.width == width && po.height == height) || (po.resize != FILL && po.resize != FIT) {
+ return 1
}
- fsw, fsh, fow, foh := float64(size.Width), float64(size.Height), float64(po.width), float64(po.height)
+ fsw, fsh, fow, foh := float64(width), float64(height), float64(po.width), float64(po.height)
wr := fow / fsw
hr := foh / fsh
- var rate float64
- if po.resize == "fit" {
- rate = math.Min(wr, hr)
- } else {
- rate = math.Max(wr, hr)
+ if po.resize == FIT {
+ return math.Min(wr, hr)
}
- return round(math.Min(fsw*rate, fow)), round(math.Min(fsh*rate, foh))
+ return math.Max(wr, hr)
}
-func processImage(p []byte, po processingOptions) ([]byte, error) {
- var err error
+func calcCrop(width, height int, po processingOptions) (left, top int) {
+ left = (width - po.width + 1) / 2
+ top = (height - po.height + 1) / 2
- img := bimg.NewImage(p)
-
- size, err := img.Size()
- if err != nil {
- return nil, err
+ if po.gravity == NORTH {
+ top = 0
}
- // Default options
- opts := bimg.Options{
- Interpolator: bimg.Bicubic,
- Quality: conf.Quality,
- Gravity: po.gravity,
- Enlarge: po.enlarge,
- Type: po.format,
+ if po.gravity == EAST {
+ left = width - po.width
}
- opts.Width, opts.Height = calcSize(size, po)
-
- switch po.resize {
- case "fit":
- opts.Embed = true
- case "fill":
- opts.Embed = true
- opts.Crop = true
- case "crop":
- opts.Crop = true
- default:
- opts.Force = true
+ if po.gravity == SOUTH {
+ top = height - po.height
}
- return img.Process(opts)
+ if po.gravity == WEST {
+ left = 0
+ }
+
+ return
+}
+
+func processImage(data []byte, imgtype imageType, po processingOptions) ([]byte, error) {
+ defer runtime.KeepAlive(data)
+
+ err := C.int(0)
+
+ var img, tmpImg *C.struct__VipsImage
+
+ // Cleanup after all
+ defer func() {
+ C.vips_thread_shutdown()
+ C.vips_error_clear()
+ }()
+
+ // Load the image
+ switch imgtype {
+ case JPEG:
+ err = C.vips_jpegload_buffer_go(unsafe.Pointer(&data[0]), C.size_t(len(data)), &img)
+ case PNG:
+ err = C.vips_pngload_buffer_go(unsafe.Pointer(&data[0]), C.size_t(len(data)), &img)
+ case GIF:
+ err = C.vips_gifload_buffer_go(unsafe.Pointer(&data[0]), C.size_t(len(data)), &img)
+ case WEBP:
+ err = C.vips_webpload_buffer_go(unsafe.Pointer(&data[0]), C.size_t(len(data)), &img)
+ }
+ if err != 0 {
+ return nil, vipsError()
+ }
+
+ imgWidth := int(img.Xsize)
+ imgHeight := int(img.Ysize)
+
+ // Ensure we won't crop out of bounds
+ if !po.enlarge || po.resize == CROP {
+ if imgWidth < po.width {
+ po.width = imgWidth
+ }
+
+ if imgHeight < po.height {
+ po.height = imgHeight
+ }
+ }
+
+ if po.width != imgWidth || po.height != imgHeight {
+ // Resize image for "fill" and "fit"
+ if po.resize == FILL || po.resize == FIT {
+ scale := calcScale(imgWidth, imgHeight, po)
+ err = C.vips_resize_go(img, &tmpImg, C.double(scale))
+ C.g_object_unref(C.gpointer(img))
+ img = tmpImg
+ if err != 0 {
+ return nil, vipsError()
+ }
+ }
+ // Crop image for "fill" and "crop"
+ if po.resize == FILL || po.resize == CROP {
+ if po.gravity == SMART && C.vips_support_smartcrop() == 1 {
+ err = C.vips_smartcrop_go(img, &tmpImg, C.int(po.width), C.int(po.height))
+ C.g_object_unref(C.gpointer(img))
+ img = tmpImg
+ if err != 0 {
+ return nil, vipsError()
+ }
+ } else {
+ left, top := calcCrop(int(img.Xsize), int(img.Ysize), po)
+ err = C.vips_extract_area_go(img, &tmpImg, C.int(left), C.int(top), C.int(po.width), C.int(po.height))
+ C.g_object_unref(C.gpointer(img))
+ img = tmpImg
+ if err != 0 {
+ return nil, vipsError()
+ }
+ }
+ }
+ }
+
+ // Convert to sRGB colour space
+ err = C.vips_colourspace_go(img, &tmpImg, C.VIPS_INTERPRETATION_sRGB)
+ C.g_object_unref(C.gpointer(img))
+ img = tmpImg
+ if err != 0 {
+ return nil, vipsError()
+ }
+
+ // Finally, save
+ imgsize := C.size_t(0)
+ var ptr unsafe.Pointer
+ switch po.format {
+ case JPEG:
+ err = C.vips_jpegsave_go(img, &ptr, &imgsize, 1, C.int(conf.Quality), 0)
+ case PNG:
+ err = C.vips_pngsave_go(img, &ptr, &imgsize)
+ case WEBP:
+ err = C.vips_webpsave_go(img, &ptr, &imgsize, 1, C.int(conf.Quality))
+ }
+ if err != 0 {
+ return nil, vipsError()
+ }
+
+ C.g_object_unref(C.gpointer(img))
+
+ buf := C.GoBytes(ptr, C.int(imgsize))
+ C.g_free(C.gpointer(ptr))
+
+ return buf, nil
+}
+
+func vipsError() error {
+ return errors.New(C.GoString(C.vips_error_buffer()))
}
diff --git a/server.go b/server.go
index 6c077a88..422ba82a 100644
--- a/server.go
+++ b/server.go
@@ -12,21 +12,19 @@ import (
"strconv"
"strings"
"time"
-
- "github.com/h2non/bimg"
)
-var mimes = map[bimg.ImageType]string{
- bimg.JPEG: "image/jpeg",
- bimg.PNG: "image/png",
- bimg.WEBP: "image/webp",
+var mimes = map[imageType]string{
+ JPEG: "image/jpeg",
+ PNG: "image/png",
+ WEBP: "image/webp",
}
type httpHandler struct {
sem chan struct{}
}
-func newHttpHandler() httpHandler {
+func newHTTPHandler() httpHandler {
return httpHandler{make(chan struct{}, conf.Concurrency)}
}
@@ -47,7 +45,11 @@ func parsePath(r *http.Request) (string, processingOptions, error) {
return "", po, err
}
- po.resize = parts[1]
+ if r, ok := resizeTypes[parts[1]]; ok {
+ po.resize = r
+ } else {
+ return "", po, fmt.Errorf("Invalid resize type: %s", parts[1])
+ }
if po.width, err = strconv.Atoi(parts[2]); err != nil {
return "", po, fmt.Errorf("Invalid width: %s", parts[2])
@@ -75,6 +77,10 @@ func parsePath(r *http.Request) (string, processingOptions, error) {
return "", po, fmt.Errorf("Invalid image format: %s", filenameParts[1])
}
+ if !vipsTypeSupportedSave(po.format) {
+ return "", po, errors.New("Resulting image type not supported")
+ }
+
filename, err := base64.RawURLEncoding.DecodeString(filenameParts[0])
if err != nil {
return "", po, errors.New("Invalid filename encoding")
@@ -173,13 +179,13 @@ func (h httpHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
return
}
- b, err := downloadImage(imgURL)
+ b, imgtype, err := downloadImage(imgURL)
if err != nil {
respondWithError(rw, 404, err, "Image is unreachable")
return
}
- b, err = processImage(b, procOpt)
+ b, err = processImage(b, imgtype, procOpt)
if err != nil {
respondWithError(rw, 500, err, "Error occurred while processing image")
return
diff --git a/vendor/github.com/h2non/bimg/.editorconfig b/vendor/github.com/h2non/bimg/.editorconfig
deleted file mode 100644
index b570cb16..00000000
--- a/vendor/github.com/h2non/bimg/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-root = true
-
-[*]
-indent_style = tab
-indent_size = 2
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.md]
-trim_trailing_whitespace = false
diff --git a/vendor/github.com/h2non/bimg/.gitignore b/vendor/github.com/h2non/bimg/.gitignore
deleted file mode 100644
index 93b3def5..00000000
--- a/vendor/github.com/h2non/bimg/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-/bimg
-/bundle
-bin
-/*.jpg
-/*.png
-/*.webp
-/fixtures/*_out.*
-/.idea/
-fixtures/test_vertical_*.jpg
diff --git a/vendor/github.com/h2non/bimg/.travis.yml b/vendor/github.com/h2non/bimg/.travis.yml
deleted file mode 100644
index 69161668..00000000
--- a/vendor/github.com/h2non/bimg/.travis.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-language: go
-
-dist: trusty
-sudo: false
-
-go:
- - 1.6
- - 1.7
- - 1.8
- - 1.9
- - tip
-
-env:
- - LIBVIPS=7.42.3
- - LIBVIPS=8.2.3
- - LIBVIPS=8.3.3
- - LIBVIPS=8.4.6
- - LIBVIPS=8.5.8
- - LIBVIPS=8.6.0-alpha4
- - LIBVIPS=master
-
-matrix:
- allow_failures:
- - env: LIBVIPS=7.42.3
- - env: LIBVIPS=8.2.3
- - env: LIBVIPS=8.3.3
- - env: LIBVIPS=8.6.0-alpha4
-
-cache:
- apt:
- directories:
- - $HOME/libvips
-
-addons:
- apt:
- packages:
- - gobject-introspection
- - gtk-doc-tools
- - libcfitsio3-dev
- - libfftw3-dev
- - libgif-dev
- - libgs-dev
- - libgsf-1-dev
- - libmatio-dev
- - libopenslide-dev
- - liborc-0.4-dev
- - libpango1.0-dev
- - libpoppler-glib-dev
- - libwebp-dev
-
-# VIPS 8.3.3 requires Poppler 0.30 which is not released on Trusty.
-before_install:
- - >
- test "$LIBVIPS" != "master" -a "$LIBVIPS" \< "8.4" \
- && wget http://www.vips.ecs.soton.ac.uk/supported/${LIBVIPS%.*}/vips-${LIBVIPS}.tar.gz -O vips.tgz \
- || echo ":-)"
- - >
- test "$LIBVIPS" != "master" -a "$LIBVIPS" \> "8.4" \
- && wget https://github.com/jcupitt/libvips/archive/v${LIBVIPS}.tar.gz -O vips.tgz \
- || echo ":-)"
- - >
- test $LIBVIPS == "master" \
- && wget https://github.com/jcupitt/libvips/archive/${LIBVIPS}.tar.gz -O vips.tgz \
- || echo ":-)"
- - mkdir libvips
- - tar xf vips.tgz -C libvips --strip-components 1
- - cd libvips
- - test -f autogen.sh && ./autogen.sh || ./bootstrap.sh
- - >
- CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0
- ./configure
- --disable-debug
- --disable-dependency-tracking
- --disable-introspection
- --disable-static
- --enable-gtk-doc-html=no
- --enable-gtk-doc=no
- --enable-pyvips8=no
- --without-orc
- --without-python
- --prefix=$HOME/libvips
- $1
- - make
- - make install
- - cd ..
- - export PATH=$PATH:$HOME/libvips/bin
- - export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/libvips/lib/pkgconfig
- - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/libvips/lib
- - vips --vips-version
-
-before_script:
- - go get -u github.com/golang/lint/golint
-
-script:
- - diff -u <(echo -n) <(gofmt -s -d ./)
- - diff -u <(echo -n) <(go vet ./)
- - diff -u <(echo -n) <(golint ./)
- - go test -v -race -covermode=atomic -coverprofile=coverage.out
-
-after_success:
- - goveralls -coverprofile=coverage.out -service=travis-ci
diff --git a/vendor/github.com/h2non/bimg/History.md b/vendor/github.com/h2non/bimg/History.md
deleted file mode 100644
index 2ea850f9..00000000
--- a/vendor/github.com/h2non/bimg/History.md
+++ /dev/null
@@ -1,139 +0,0 @@
-
-## v1.0.14 / 2017-09-12
-
- * Merge pull request #192 from greut/trim
- * Adding trim operation.
- * Merge pull request #191 from greut/alpha4
- * Update 8.6 to alpha4.
-
-## v1.0.13 / 2017-09-11
-
- * Merge pull request #190 from greut/typos
- * Fix typo and small cleanup.
-
-## v1.0.12 / 2017-09-10
-
- * Merge branch '99designs-vips-reduce'
- * fix(reduce): resolve conflicts with master
- * Use vips reduce when downscaling
-
-## v1.0.11 / 2017-09-10
-
- * feat(#189): allow strip image metadata via bimg.Options.StripMetadata = bool
- * fix(resize): code format issue
- * refactor(resize): add Go version comment
- * refactor(tests): fix minor code formatting issues
- * fix(#162): garbage collection fix. split Resize() implementation for Go runtime specific
- * feat(travis): add go 1.9
- * Merge pull request #183 from greut/autorotate
- * Proper handling of the EXIF cases.
- * Merge pull request #184 from greut/libvips858
- * Merge branch 'master' into libvips858
- * Merge pull request #185 from greut/libvips860
- * Add libvips 8.6 pre-release
- * Update to libvips 8.5.8
- * fix(resize): runtime.KeepAlive is only Go
- * fix(#159): prevent buf to be freed by the GC before resize function exits
- * Merge pull request #171 from greut/fix-170
- * Check the length before jumping into buffer.
- * Merge pull request #168 from Traum-Ferienwohnungen/icc_transform
- * Add option to convert embedded ICC profiles
- * Merge pull request #166 from danjou-a/patch-1
- * Fix Resize verification value
- * Merge pull request #165 from greut/libvips846
- * Testing using libvips8.4.6 from Github.
-
-## v1.0.10 / 2017-06-25
-
- * Merge pull request #164 from greut/length
- * Add Image.Length()
- * Merge pull request #163 from greut/libvips856
- * Run libvips 8.5.6 on Travis.
- * Merge pull request #161 from henry-blip/master
- * Expose vips cache memory management functions.
- * feat(docs): add watermark image note in features
-
-## v1.0.9 / 2017-05-25
-
- * Merge pull request #156 from Dynom/SmartCropToGravity
- * Adding a test, verifying both ways of enabling SmartCrop work
- * Merge pull request #149 from waldophotos/master
- * Replacing SmartCrop with a Gravity option
- * refactor(docs): v8.4
- * Change for older LIBVIPS versions. `vips_bandjoin_const1` is added in libvips 8.2.
- * Second try, watermarking memory issue fix
-
-## v1.0.8 / 2017-05-18
-
- * Merge pull request #145 from greut/smartcrop
- * Merge pull request #155 from greut/libvips8.5.5
- * Update libvips to 8.5.5.
- * Adding basic smartcrop support.
- * Merge pull request #153 from abracadaber/master
- * Added Linux Mint 17.3+ distro names
- * feat(docs): add new maintainer notice (thanks to @kirillDanshin)
- * Merge pull request #152 from greut/libvips85
- * Download latest version of libvips from github.
- * Merge pull request #147 from h2non/revert-143-master
- * Revert "Fix for memory issue when watermarking images"
- * Merge pull request #146 from greut/minor-major
- * Merge pull request #143 from waldophotos/master
- * Merge pull request #144 from greut/go18
- * Fix tests where minor/major were mixed up
- * Enabled go 1.8 builds.
- * Fix the unref of images, when image isn't transparent
- * Fix for memory issue when watermarking images
- * feat(docs): add maintainers sections
- * Merge pull request #132 from jaume-pinyol/WATERMARK_SUPPORT
- * Add support for image watermarks
- * Merge pull request #131 from greut/versions
- * Running tests on more specific versions.
- * refactor(preinstall.sh): remove deprecation notice
- * Update preinstall.sh
- * fix(requirements): required libvips 7.42
- * fix(History): typo
- * chore(History): add breaking change note
-
-## v1.0.7 / 13-01-2017
-
-- fix(#128): crop image calculation for missing width or height axis.
-- feat: add TIFF save output format (**note**: this introduces a minor interface breaking change in `bimg.IsImageTypeSupportedByVips` auxiliary function).
-
-## v1.0.6 / 12-11-2016
-
-- feat(#118): handle 16-bit PNGs.
-- feat(#119): adds JPEG2000 file for the type tests.
-- feat(#121): test bimg against multiple libvips versions.
-
-## v1.0.5 / 01-10-2016
-
-- feat(#92): support Extend param with optional background.
-- fix(#106): allow image area extraction without explicit x/y axis.
-- feat(api): add Extend type with `libvips` enum alias.
-
-## v1.0.4 / 29-09-2016
-
-- fix(#111): safe check of magick image type support.
-
-## v1.0.3 / 28-09-2016
-
-- fix(#95): better image type inference and support check.
-- fix(background): pass proper background RGB color for PNG image conversion.
-- feat(types): validate supported image types by current `libvips` compilation.
-- feat(types): consistent SVG image checking.
-- feat(api): add public functions `VipsIsTypeSupported()`, `IsImageTypeSupportedByVips()` and `IsSVGImage()`.
-
-## v1.0.2 / 27-09-2016
-
-- feat(#95): support GIF, SVG and PDF formats.
-- fix(#108): auto-width and height calculations now round instead of floor.
-
-## v1.0.1 / 22-06-2016
-
-- fix(#90): Do not not dereference the original image a second time.
-
-## v1.0.0 / 21-04-2016
-
-- refactor(api): breaking changes: normalize public members to follow Go naming idioms.
-- feat(version): bump to major version. API contract won't be compromised in `v1`.
-- feat(docs): add missing inline godoc documentation.
diff --git a/vendor/github.com/h2non/bimg/LICENSE b/vendor/github.com/h2non/bimg/LICENSE
deleted file mode 100644
index b28d546c..00000000
--- a/vendor/github.com/h2non/bimg/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) Tomas Aparicio and contributors
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/github.com/h2non/bimg/README.md b/vendor/github.com/h2non/bimg/README.md
deleted file mode 100644
index 17f8037d..00000000
--- a/vendor/github.com/h2non/bimg/README.md
+++ /dev/null
@@ -1,348 +0,0 @@
-# bimg [](https://travis-ci.org/h2non/bimg) [](https://godoc.org/github.com/h2non/bimg) [](http://goreportcard.com/report/h2non/bimg) [](https://coveralls.io/github/h2non/bimg?branch=master) 
-
-Small [Go](http://golang.org) package for fast high-level image processing using [libvips](https://github.com/jcupitt/libvips) via C bindings, providing a simple, elegant and fluent [programmatic API](#examples).
-
-bimg was designed to be a small and efficient library supporting a common set of [image operations](#supported-image-operations) such as crop, resize, rotate, zoom or watermark. It can read JPEG, PNG, WEBP natively, and optionally TIFF, PDF, GIF and SVG formats if `libvips@8.3+` is compiled with proper library bindings.
-
-bimg is able to output images as JPEG, PNG and WEBP formats, including transparent conversion across them.
-
-bimg uses internally libvips, a powerful library written in C for image processing which requires a [low memory footprint](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use)
-and it's typically 4x faster than using the quickest ImageMagick and GraphicsMagick settings or Go native `image` package, and in some cases it's even 8x faster processing JPEG images.
-
-If you're looking for an HTTP based image processing solution, see [imaginary](https://github.com/h2non/imaginary).
-
-bimg was heavily inspired in [sharp](https://github.com/lovell/sharp), its homologous package built for [node.js](http://nodejs.org). bimg is used in production environments processing thousands of images per day.
-
-**v1 notice**: `bimg` introduces some minor breaking changes in `v1` release.
-If you're using `gopkg.in`, you can still rely in the `v0` without worrying about API breaking changes.
-
-`bimg` is currently maintained by [Kirill Danshin](https://github.com/kirillDanshin).
-
-## Contents
-
-- [Supported image operations](#supported-image-operations)
-- [Prerequisites](#prerequisites)
-- [Installation](#installation)
-- [Performance](#performance)
-- [Benchmark](#benchmark)
-- [Examples](#examples)
-- [Debugging](#debugging)
-- [API](#api)
-- [Authors](#authors)
-- [Credits](#credits)
-
-## Supported image operations
-
-- Resize
-- Enlarge
-- Crop (including smart crop support, libvips 8.5+)
-- Rotate (with auto-rotate based on EXIF orientation)
-- Flip (with auto-flip based on EXIF metadata)
-- Flop
-- Zoom
-- Thumbnail
-- Extract area
-- Watermark (using text or image)
-- Gaussian blur effect
-- Custom output color space (RGB, grayscale...)
-- Format conversion (with additional quality/compression settings)
-- EXIF metadata (size, alpha channel, profile, orientation...)
-- Trim (libvips 8.6+)
-
-## Prerequisites
-
-- [libvips](https://github.com/jcupitt/libvips) 7.42+ or 8+ (8.4+ recommended)
-- C compatible compiler such as gcc 4.6+ or clang 3.0+
-- Go 1.3+
-
-**Note**: `libvips` v8.3+ is required for GIF, PDF and SVG support.
-
-## Installation
-
-```bash
-go get -u gopkg.in/h2non/bimg.v1
-```
-
-### libvips
-
-Run the following script as `sudo` (supports OSX, Debian/Ubuntu, Redhat, Fedora, Amazon Linux):
-```bash
-curl -s https://raw.githubusercontent.com/h2non/bimg/master/preinstall.sh | sudo bash -
-```
-
-If you wanna take the advantage of [OpenSlide](http://openslide.org/), simply add `--with-openslide` to enable it:
-```bash
-curl -s https://raw.githubusercontent.com/h2non/bimg/master/preinstall.sh | sudo bash -s --with-openslide
-```
-
-The [install script](https://github.com/h2non/bimg/blob/master/preinstall.sh) requires `curl` and `pkg-config`.
-
-## Performance
-
-libvips is probably the faster open source solution for image processing.
-Here you can see some performance test comparisons for multiple scenarios:
-
-- [libvips speed and memory usage](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use)
-
-## Benchmark
-
-Tested using Go 1.5.1 and libvips-7.42.3 in OSX i7 2.7Ghz
-```
-BenchmarkRotateJpeg-8 20 64686945 ns/op
-BenchmarkResizeLargeJpeg-8 20 63390416 ns/op
-BenchmarkResizePng-8 100 18147294 ns/op
-BenchmarkResizeWebP-8 100 20836741 ns/op
-BenchmarkConvertToJpeg-8 100 12831812 ns/op
-BenchmarkConvertToPng-8 10 128901422 ns/op
-BenchmarkConvertToWebp-8 10 204027990 ns/op
-BenchmarkCropJpeg-8 30 59068572 ns/op
-BenchmarkCropPng-8 10 117303259 ns/op
-BenchmarkCropWebP-8 10 107060659 ns/op
-BenchmarkExtractJpeg-8 50 30708919 ns/op
-BenchmarkExtractPng-8 3000 595546 ns/op
-BenchmarkExtractWebp-8 3000 386379 ns/op
-BenchmarkZoomJpeg-8 10 160005424 ns/op
-BenchmarkZoomPng-8 30 44561047 ns/op
-BenchmarkZoomWebp-8 10 126732678 ns/op
-BenchmarkWatermarkJpeg-8 20 79006133 ns/op
-BenchmarkWatermarPng-8 200 8197291 ns/op
-BenchmarkWatermarWebp-8 30 49360369 ns/op
-```
-
-## Examples
-
-```go
-import (
- "fmt"
- "os"
- "gopkg.in/h2non/bimg.v1"
-)
-```
-
-#### Resize
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).Resize(800, 600)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-size, err := bimg.NewImage(newImage).Size()
-if size.Width == 800 && size.Height == 600 {
- fmt.Println("The image size is valid")
-}
-
-bimg.Write("new.jpg", newImage)
-```
-
-#### Rotate
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).Rotate(90)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-bimg.Write("new.jpg", newImage)
-```
-
-#### Convert
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).Convert(bimg.PNG)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-if bimg.NewImage(newImage).Type() == "png" {
- fmt.Fprintln(os.Stderr, "The image was converted into png")
-}
-```
-
-#### Force resize
-
-Force resize operation without perserving the aspect ratio:
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).ForceResize(1000, 500)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-size := bimg.Size(newImage)
-if size.Width != 1000 || size.Height != 500 {
- fmt.Fprintln(os.Stderr, "Incorrect image size")
-}
-```
-
-#### Custom colour space (black & white)
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).Colourspace(bimg.INTERPRETATION_B_W)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-colourSpace, _ := bimg.ImageInterpretation(newImage)
-if colourSpace != bimg.INTERPRETATION_B_W {
- fmt.Fprintln(os.Stderr, "Invalid colour space")
-}
-```
-
-#### Custom options
-
-See [Options](https://godoc.org/github.com/h2non/bimg#Options) struct to discover all the available fields
-
-```go
-options := bimg.Options{
- Width: 800,
- Height: 600,
- Crop: true,
- Quality: 95,
- Rotate: 180,
- Interlace: true,
-}
-
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-newImage, err := bimg.NewImage(buffer).Process(options)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-bimg.Write("new.jpg", newImage)
-```
-
-#### Watermark
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-watermark := bimg.Watermark{
- Text: "Chuck Norris (c) 2315",
- Opacity: 0.25,
- Width: 200,
- DPI: 100,
- Margin: 150,
- Font: "sans bold 12",
- Background: bimg.Color{255, 255, 255},
-}
-
-newImage, err := bimg.NewImage(buffer).Watermark(watermark)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-bimg.Write("new.jpg", newImage)
-```
-
-#### Fluent interface
-
-```go
-buffer, err := bimg.Read("image.jpg")
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-image := bimg.NewImage(buffer)
-
-// first crop image
-_, err := image.CropByWidth(300)
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-// then flip it
-newImage, err := image.Flip()
-if err != nil {
- fmt.Fprintln(os.Stderr, err)
-}
-
-// save the cropped and flipped image
-bimg.Write("new.jpg", newImage)
-```
-
-## Debugging
-
-Run the process passing the `DEBUG` environment variable
-```
-DEBUG=bimg ./app
-```
-
-Enable libvips traces (note that a lot of data will be written in stdout):
-```
-VIPS_TRACE=1 ./app
-```
-
-You can also dump a core on failure, as [John Cuppit](https://github.com/jcupitt) said:
-```c
-g_log_set_always_fatal(
- G_LOG_FLAG_RECURSION |
- G_LOG_FLAG_FATAL |
- G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL |
- G_LOG_LEVEL_WARNING );
-```
-
-Or set the G_DEBUG environment variable:
-```
-export G_DEBUG=fatal-warnings,fatal-criticals
-```
-
-## API
-
-See [godoc reference](https://godoc.org/github.com/h2non/bimg) for detailed API documentation.
-
-## Authors
-
-- [Tomás Aparicio](https://github.com/h2non) - Original author and architect.
-- [Kirill Danshin](https://github.com/kirillDanshin) - Maintainer since April 2017.
-
-## Credits
-
-People who recurrently contributed to improve `bimg` in some way.
-
-- [John Cupitt](https://github.com/jcupitt)
-- [Yoan Blanc](https://github.com/greut)
-- [Christophe Eblé](https://github.com/chreble)
-- [Brant Fitzsimmons](https://github.com/bfitzsimmons)
-- [Thomas Meson](https://github.com/zllak)
-
-Thank you!
-
-## License
-
-MIT - Tomas Aparicio
-
-[](https://sourcegraph.com/github.com/h2non/bimg)
diff --git a/vendor/github.com/h2non/bimg/file.go b/vendor/github.com/h2non/bimg/file.go
deleted file mode 100644
index 0cbf82aa..00000000
--- a/vendor/github.com/h2non/bimg/file.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package bimg
-
-import "io/ioutil"
-
-// Read reads all the content of the given file path
-// and returns it as byte buffer.
-func Read(path string) ([]byte, error) {
- return ioutil.ReadFile(path)
-}
-
-// Write writes the given byte buffer into disk
-// to the given file path.
-func Write(path string, buf []byte) error {
- return ioutil.WriteFile(path, buf, 0644)
-}
diff --git a/vendor/github.com/h2non/bimg/file_test.go b/vendor/github.com/h2non/bimg/file_test.go
deleted file mode 100644
index 2144669a..00000000
--- a/vendor/github.com/h2non/bimg/file_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package bimg
-
-import (
- "testing"
-)
-
-func TestRead(t *testing.T) {
- buf, err := Read("fixtures/test.jpg")
-
- if err != nil {
- t.Errorf("Cannot read the image: %#v", err)
- }
-
- if len(buf) == 0 {
- t.Fatal("Empty buffer")
- }
-
- if DetermineImageType(buf) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-}
-
-func TestWrite(t *testing.T) {
- buf, err := Read("fixtures/test.jpg")
-
- if err != nil {
- t.Errorf("Cannot read the image: %#v", err)
- }
-
- if len(buf) == 0 {
- t.Fatal("Empty buffer")
- }
-
- err = Write("fixtures/test_write_out.jpg", buf)
- if err != nil {
- t.Fatalf("Cannot write the file: %#v", err)
- }
-}
diff --git a/vendor/github.com/h2non/bimg/fixtures/corrupt.jpg b/vendor/github.com/h2non/bimg/fixtures/corrupt.jpg
deleted file mode 100644
index e5992220..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/corrupt.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1.jpg
deleted file mode 100644
index 8d513f46..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1_out.jpg
deleted file mode 100644
index 033589e8..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_1_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2.jpg
deleted file mode 100644
index 427a551b..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2_out.jpg
deleted file mode 100644
index 1b2259f1..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_2_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3.jpg
deleted file mode 100644
index d904dc92..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3_out.jpg
deleted file mode 100644
index 681964a3..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_3_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4.jpg
deleted file mode 100644
index f85f4eb4..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4_out.jpg
deleted file mode 100644
index fee30ead..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_4_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5.jpg
deleted file mode 100644
index 1abf17e7..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5_out.jpg
deleted file mode 100644
index fbd8f5b1..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_5_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6.jpg
deleted file mode 100644
index 74d68ddd..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6_out.jpg
deleted file mode 100644
index 1ec5d125..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_6_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7.jpg
deleted file mode 100644
index ba17a9e5..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7_out.jpg
deleted file mode 100644
index 8a4f94c5..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_7_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8.jpg
deleted file mode 100644
index 4c43c368..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8_out.jpg
deleted file mode 100644
index 3e50c6fd..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Landscape_8_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1.jpg
deleted file mode 100644
index ab2d1686..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1_out.jpg
deleted file mode 100644
index e3af98ce..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_1_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2.jpg
deleted file mode 100644
index b2ccfd15..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2_out.jpg
deleted file mode 100644
index 5c5366f4..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_2_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3.jpg
deleted file mode 100644
index 87b0da45..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3_out.jpg
deleted file mode 100644
index 8a8da006..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_3_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4.jpg
deleted file mode 100644
index 81be6ad4..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4_out.jpg
deleted file mode 100644
index 2528749a..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_4_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5.jpg
deleted file mode 100644
index 3384800f..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5_out.jpg
deleted file mode 100644
index c2b2ff3c..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_5_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6.jpg
deleted file mode 100644
index 40f5199a..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6_out.jpg
deleted file mode 100644
index a13b3f1a..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_6_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7.jpg
deleted file mode 100644
index b590bfc2..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7_out.jpg
deleted file mode 100644
index e64cc8d3..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_7_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8.jpg
deleted file mode 100644
index e15ebe42..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8_out.jpg b/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8_out.jpg
deleted file mode 100644
index ffe52aa2..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/exif/Portrait_8_out.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/northern_cardinal_bird.jpg b/vendor/github.com/h2non/bimg/fixtures/northern_cardinal_bird.jpg
deleted file mode 100644
index 1bf53853..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/northern_cardinal_bird.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.gif b/vendor/github.com/h2non/bimg/fixtures/test.gif
deleted file mode 100644
index 7bf290ac..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.gif and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.jp2 b/vendor/github.com/h2non/bimg/fixtures/test.jp2
deleted file mode 100644
index 940778ff..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.jp2 and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.jpg b/vendor/github.com/h2non/bimg/fixtures/test.jpg
deleted file mode 100644
index f17d2f18..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.pdf b/vendor/github.com/h2non/bimg/fixtures/test.pdf
deleted file mode 100644
index c14cc561..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.pdf and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.png b/vendor/github.com/h2non/bimg/fixtures/test.png
deleted file mode 100644
index d2f05912..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.png and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.svg b/vendor/github.com/h2non/bimg/fixtures/test.svg
deleted file mode 100644
index 679edec2..00000000
--- a/vendor/github.com/h2non/bimg/fixtures/test.svg
+++ /dev/null
@@ -1,725 +0,0 @@
-
-
diff --git a/vendor/github.com/h2non/bimg/fixtures/test.webp b/vendor/github.com/h2non/bimg/fixtures/test.webp
deleted file mode 100644
index 122741b6..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test.webp and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_gif.jpg b/vendor/github.com/h2non/bimg/fixtures/test_gif.jpg
deleted file mode 100644
index 7f28bcef..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_gif.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_icc_prophoto.jpg b/vendor/github.com/h2non/bimg/fixtures/test_icc_prophoto.jpg
deleted file mode 100644
index ebf7f02b..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_icc_prophoto.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_issue.jpg b/vendor/github.com/h2non/bimg/fixtures/test_issue.jpg
deleted file mode 100644
index 8348e387..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_issue.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_pdf.jpg b/vendor/github.com/h2non/bimg/fixtures/test_pdf.jpg
deleted file mode 100644
index bbb26c52..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_pdf.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_square.jpg b/vendor/github.com/h2non/bimg/fixtures/test_square.jpg
deleted file mode 100644
index c69aab42..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_square.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/test_svg.jpg b/vendor/github.com/h2non/bimg/fixtures/test_svg.jpg
deleted file mode 100644
index 77b4714e..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/test_svg.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/transparent.png b/vendor/github.com/h2non/bimg/fixtures/transparent.png
deleted file mode 100644
index c82d0151..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/transparent.png and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/transparent_trim.png b/vendor/github.com/h2non/bimg/fixtures/transparent_trim.png
deleted file mode 100644
index 80878106..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/transparent_trim.png and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/fixtures/vertical.jpg b/vendor/github.com/h2non/bimg/fixtures/vertical.jpg
deleted file mode 100644
index 3e12e65e..00000000
Binary files a/vendor/github.com/h2non/bimg/fixtures/vertical.jpg and /dev/null differ
diff --git a/vendor/github.com/h2non/bimg/image.go b/vendor/github.com/h2non/bimg/image.go
deleted file mode 100644
index 093d5a5a..00000000
--- a/vendor/github.com/h2non/bimg/image.go
+++ /dev/null
@@ -1,235 +0,0 @@
-package bimg
-
-// Image provides a simple method DSL to transform a given image as byte buffer.
-type Image struct {
- buffer []byte
-}
-
-// NewImage creates a new Image struct with method DSL.
-func NewImage(buf []byte) *Image {
- return &Image{buf}
-}
-
-// Resize resizes the image to fixed width and height.
-func (i *Image) Resize(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Embed: true,
- }
- return i.Process(options)
-}
-
-// ForceResize resizes with custom size (aspect ratio won't be maintained).
-func (i *Image) ForceResize(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Force: true,
- }
- return i.Process(options)
-}
-
-// ResizeAndCrop resizes the image to fixed width and height with additional crop transformation.
-func (i *Image) ResizeAndCrop(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Embed: true,
- Crop: true,
- }
- return i.Process(options)
-}
-
-// SmartCrop produces a thumbnail aiming at focus on the interesting part.
-func (i *Image) SmartCrop(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Crop: true,
- Gravity: GravitySmart,
- }
- return i.Process(options)
-}
-
-// Extract area from the by X/Y axis in the current image.
-func (i *Image) Extract(top, left, width, height int) ([]byte, error) {
- options := Options{
- Top: top,
- Left: left,
- AreaWidth: width,
- AreaHeight: height,
- }
-
- if top == 0 && left == 0 {
- options.Top = -1
- }
-
- return i.Process(options)
-}
-
-// Enlarge enlarges the image by width and height. Aspect ratio is maintained.
-func (i *Image) Enlarge(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Enlarge: true,
- }
- return i.Process(options)
-}
-
-// EnlargeAndCrop enlarges the image by width and height with additional crop transformation.
-func (i *Image) EnlargeAndCrop(width, height int) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Enlarge: true,
- Crop: true,
- }
- return i.Process(options)
-}
-
-// Crop crops the image to the exact size specified.
-func (i *Image) Crop(width, height int, gravity Gravity) ([]byte, error) {
- options := Options{
- Width: width,
- Height: height,
- Gravity: gravity,
- Crop: true,
- }
- return i.Process(options)
-}
-
-// CropByWidth crops an image by width only param (auto height).
-func (i *Image) CropByWidth(width int) ([]byte, error) {
- options := Options{
- Width: width,
- Crop: true,
- }
- return i.Process(options)
-}
-
-// CropByHeight crops an image by height (auto width).
-func (i *Image) CropByHeight(height int) ([]byte, error) {
- options := Options{
- Height: height,
- Crop: true,
- }
- return i.Process(options)
-}
-
-// Thumbnail creates a thumbnail of the image by the a given width by aspect ratio 4:4.
-func (i *Image) Thumbnail(pixels int) ([]byte, error) {
- options := Options{
- Width: pixels,
- Height: pixels,
- Crop: true,
- Quality: 95,
- }
- return i.Process(options)
-}
-
-// Watermark adds text as watermark on the given image.
-func (i *Image) Watermark(w Watermark) ([]byte, error) {
- options := Options{Watermark: w}
- return i.Process(options)
-}
-
-// WatermarkImage adds image as watermark on the given image.
-func (i *Image) WatermarkImage(w WatermarkImage) ([]byte, error) {
- options := Options{WatermarkImage: w}
- return i.Process(options)
-}
-
-// Zoom zooms the image by the given factor.
-// You should probably call Extract() before.
-func (i *Image) Zoom(factor int) ([]byte, error) {
- options := Options{Zoom: factor}
- return i.Process(options)
-}
-
-// Rotate rotates the image by given angle degrees (0, 90, 180 or 270).
-func (i *Image) Rotate(a Angle) ([]byte, error) {
- options := Options{Rotate: a}
- return i.Process(options)
-}
-
-// Flip flips the image about the vertical Y axis.
-func (i *Image) Flip() ([]byte, error) {
- options := Options{Flip: true}
- return i.Process(options)
-}
-
-// Flop flops the image about the horizontal X axis.
-func (i *Image) Flop() ([]byte, error) {
- options := Options{Flop: true}
- return i.Process(options)
-}
-
-// Convert converts image to another format.
-func (i *Image) Convert(t ImageType) ([]byte, error) {
- options := Options{Type: t}
- return i.Process(options)
-}
-
-// Colourspace performs a color space conversion bsaed on the given interpretation.
-func (i *Image) Colourspace(c Interpretation) ([]byte, error) {
- options := Options{Interpretation: c}
- return i.Process(options)
-}
-
-// Trim removes the background from the picture. It can result in a 0x0 output
-// if the image is all background.
-func (i *Image) Trim() ([]byte, error) {
- options := Options{Trim: true}
- return i.Process(options)
-}
-
-// Process processes the image based on the given transformation options,
-// talking with libvips bindings accordingly and returning the resultant
-// image buffer.
-func (i *Image) Process(o Options) ([]byte, error) {
- image, err := Resize(i.buffer, o)
- if err != nil {
- return nil, err
- }
- i.buffer = image
- return image, nil
-}
-
-// Metadata returns the image metadata (size, alpha channel, profile, EXIF rotation).
-func (i *Image) Metadata() (ImageMetadata, error) {
- return Metadata(i.buffer)
-}
-
-// Interpretation gets the image interpretation type.
-// See: http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/VipsImage.html#VipsInterpretation
-func (i *Image) Interpretation() (Interpretation, error) {
- return ImageInterpretation(i.buffer)
-}
-
-// ColourspaceIsSupported checks if the current image
-// color space is supported.
-func (i *Image) ColourspaceIsSupported() (bool, error) {
- return ColourspaceIsSupported(i.buffer)
-}
-
-// Type returns the image type format (jpeg, png, webp, tiff).
-func (i *Image) Type() string {
- return DetermineImageTypeName(i.buffer)
-}
-
-// Size returns the image size as form of width and height pixels.
-func (i *Image) Size() (ImageSize, error) {
- return Size(i.buffer)
-}
-
-// Image returns the current resultant image buffer.
-func (i *Image) Image() []byte {
- return i.buffer
-}
-
-// Length returns the size in bytes of the image buffer.
-func (i *Image) Length() int {
- return len(i.buffer)
-}
diff --git a/vendor/github.com/h2non/bimg/image_test.go b/vendor/github.com/h2non/bimg/image_test.go
deleted file mode 100644
index e7c431b2..00000000
--- a/vendor/github.com/h2non/bimg/image_test.go
+++ /dev/null
@@ -1,527 +0,0 @@
-package bimg
-
-import (
- "fmt"
- "path"
- "testing"
-)
-
-func TestImageResize(t *testing.T) {
- buf, err := initImage("test.jpg").Resize(300, 240)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 300, 240)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_resize_out.jpg", buf)
-}
-
-func TestImageGifResize(t *testing.T) {
- _, err := initImage("test.gif").Resize(300, 240)
- if err == nil {
- t.Errorf("GIF shouldn't be saved within VIPS")
- }
-}
-
-func TestImagePdfResize(t *testing.T) {
- _, err := initImage("test.pdf").Resize(300, 240)
- if err == nil {
- t.Errorf("PDF cannot be saved within VIPS")
- }
-}
-
-func TestImageSvgResize(t *testing.T) {
- _, err := initImage("test.svg").Resize(300, 240)
- if err == nil {
- t.Errorf("SVG cannot be saved within VIPS")
- }
-}
-
-func TestImageGifToJpeg(t *testing.T) {
- if VipsMajorVersion >= 8 && VipsMinorVersion > 2 {
- i := initImage("test.gif")
- options := Options{
- Type: JPEG,
- }
- buf, err := i.Process(options)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- Write("fixtures/test_gif.jpg", buf)
- }
-}
-
-func TestImagePdfToJpeg(t *testing.T) {
- if VipsMajorVersion >= 8 && VipsMinorVersion > 2 {
- i := initImage("test.pdf")
- options := Options{
- Type: JPEG,
- }
- buf, err := i.Process(options)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- Write("fixtures/test_pdf.jpg", buf)
- }
-}
-
-func TestImageSvgToJpeg(t *testing.T) {
- if VipsMajorVersion >= 8 && VipsMinorVersion > 2 {
- i := initImage("test.svg")
- options := Options{
- Type: JPEG,
- }
- buf, err := i.Process(options)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- Write("fixtures/test_svg.jpg", buf)
- }
-}
-
-func TestImageResizeAndCrop(t *testing.T) {
- buf, err := initImage("test.jpg").ResizeAndCrop(300, 200)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 300, 200)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_resize_crop_out.jpg", buf)
-}
-
-func TestImageExtract(t *testing.T) {
- buf, err := initImage("test.jpg").Extract(100, 100, 300, 200)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 300, 200)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_extract_out.jpg", buf)
-}
-
-func TestImageExtractZero(t *testing.T) {
- buf, err := initImage("test.jpg").Extract(0, 0, 300, 200)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 300, 200)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_extract_zero_out.jpg", buf)
-}
-
-func TestImageEnlarge(t *testing.T) {
- buf, err := initImage("test.png").Enlarge(500, 375)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 500, 375)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_enlarge_out.jpg", buf)
-}
-
-func TestImageEnlargeAndCrop(t *testing.T) {
- buf, err := initImage("test.png").EnlargeAndCrop(800, 480)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 800, 480)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_enlarge_crop_out.jpg", buf)
-}
-
-func TestImageCrop(t *testing.T) {
- buf, err := initImage("test.jpg").Crop(800, 600, GravityNorth)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 800, 600)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_crop_out.jpg", buf)
-}
-
-func TestImageCropByWidth(t *testing.T) {
- buf, err := initImage("test.jpg").CropByWidth(600)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 600, 1050)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_crop_width_out.jpg", buf)
-}
-
-func TestImageCropByHeight(t *testing.T) {
- buf, err := initImage("test.jpg").CropByHeight(300)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 1680, 300)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_crop_height_out.jpg", buf)
-}
-
-func TestImageThumbnail(t *testing.T) {
- buf, err := initImage("test.jpg").Thumbnail(100)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 100, 100)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_thumbnail_out.jpg", buf)
-}
-
-func TestImageWatermark(t *testing.T) {
- image := initImage("test.jpg")
- _, err := image.Crop(800, 600, GravityNorth)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- buf, err := image.Watermark(Watermark{
- Text: "Copy me if you can",
- Opacity: 0.5,
- Width: 200,
- DPI: 100,
- Background: Color{255, 255, 255},
- })
- if err != nil {
- t.Error(err)
- }
-
- err = assertSize(buf, 800, 600)
- if err != nil {
- t.Error(err)
- }
-
- if DetermineImageType(buf) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-
- Write("fixtures/test_watermark_text_out.jpg", buf)
-}
-
-func TestImageWatermarkWithImage(t *testing.T) {
- image := initImage("test.jpg")
- watermark, _ := imageBuf("transparent.png")
-
- _, err := image.Crop(800, 600, GravityNorth)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- buf, err := image.WatermarkImage(WatermarkImage{Left: 100, Top: 100, Buf: watermark})
-
- if err != nil {
- t.Error(err)
- }
-
- err = assertSize(buf, 800, 600)
- if err != nil {
- t.Error(err)
- }
-
- if DetermineImageType(buf) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-
- Write("fixtures/test_watermark_image_out.jpg", buf)
-}
-
-func TestImageWatermarkNoReplicate(t *testing.T) {
- image := initImage("test.jpg")
- _, err := image.Crop(800, 600, GravityNorth)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- buf, err := image.Watermark(Watermark{
- Text: "Copy me if you can",
- Opacity: 0.5,
- Width: 200,
- DPI: 100,
- NoReplicate: true,
- Background: Color{255, 255, 255},
- })
- if err != nil {
- t.Error(err)
- }
-
- err = assertSize(buf, 800, 600)
- if err != nil {
- t.Error(err)
- }
-
- if DetermineImageType(buf) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-
- Write("fixtures/test_watermark_replicate_out.jpg", buf)
-}
-
-func TestImageZoom(t *testing.T) {
- image := initImage("test.jpg")
-
- _, err := image.Extract(100, 100, 400, 300)
- if err != nil {
- t.Errorf("Cannot extract the image: %s", err)
- }
-
- buf, err := image.Zoom(1)
- if err != nil {
- t.Errorf("Cannot process the image: %s", err)
- }
-
- err = assertSize(buf, 800, 600)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_zoom_out.jpg", buf)
-}
-
-func TestImageFlip(t *testing.T) {
- buf, err := initImage("test.jpg").Flip()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- Write("fixtures/test_flip_out.jpg", buf)
-}
-
-func TestImageFlop(t *testing.T) {
- buf, err := initImage("test.jpg").Flop()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- Write("fixtures/test_flop_out.jpg", buf)
-}
-
-func TestImageRotate(t *testing.T) {
- buf, err := initImage("test_flip_out.jpg").Rotate(90)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- Write("fixtures/test_image_rotate_out.jpg", buf)
-}
-
-func TestImageConvert(t *testing.T) {
- buf, err := initImage("test.jpg").Convert(PNG)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- Write("fixtures/test_image_convert_out.png", buf)
-}
-
-func TestTransparentImageConvert(t *testing.T) {
- image := initImage("transparent.png")
- options := Options{
- Type: JPEG,
- Background: Color{255, 255, 255},
- }
- buf, err := image.Process(options)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- Write("fixtures/test_transparent_image_convert_out.jpg", buf)
-}
-
-func TestImageMetadata(t *testing.T) {
- data, err := initImage("test.png").Metadata()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- if data.Alpha != true {
- t.Fatal("Invalid alpha channel")
- }
- if data.Size.Width != 400 {
- t.Fatal("Invalid width size")
- }
- if data.Type != "png" {
- t.Fatal("Invalid image type")
- }
-}
-
-func TestInterpretation(t *testing.T) {
- interpretation, err := initImage("test.jpg").Interpretation()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- if interpretation != InterpretationSRGB {
- t.Errorf("Invalid interpretation: %d", interpretation)
- }
-}
-
-func TestImageColourspace(t *testing.T) {
- tests := []struct {
- file string
- interpretation Interpretation
- }{
- {"test.jpg", InterpretationSRGB},
- {"test.jpg", InterpretationBW},
- }
-
- for _, test := range tests {
- buf, err := initImage(test.file).Colourspace(test.interpretation)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- interpretation, err := ImageInterpretation(buf)
- if interpretation != test.interpretation {
- t.Errorf("Invalid colourspace")
- }
- }
-}
-
-func TestImageColourspaceIsSupported(t *testing.T) {
- supported, err := initImage("test.jpg").ColourspaceIsSupported()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- if supported != true {
- t.Errorf("Non-supported colourspace")
- }
-}
-
-func TestFluentInterface(t *testing.T) {
- image := initImage("test.jpg")
- _, err := image.CropByWidth(300)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- _, err = image.Flip()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- _, err = image.Convert(PNG)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- data, _ := image.Metadata()
- if data.Alpha != false {
- t.Fatal("Invalid alpha channel")
- }
- if data.Size.Width != 300 {
- t.Fatal("Invalid width size")
- }
- if data.Type != "png" {
- t.Fatal("Invalid image type")
- }
-
- Write("fixtures/test_image_fluent_out.png", image.Image())
-}
-
-func TestImageSmartCrop(t *testing.T) {
-
- if !(VipsMajorVersion >= 8 && VipsMinorVersion >= 5) {
- t.Skipf("Skipping this test, libvips doesn't meet version requirement %s >= 8.5", VipsVersion)
- }
-
- i := initImage("northern_cardinal_bird.jpg")
- buf, err := i.SmartCrop(300, 300)
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 300, 300)
- if err != nil {
- t.Error(err)
- }
-
- Write("fixtures/test_smart_crop.jpg", buf)
-}
-
-func TestImageTrim(t *testing.T) {
-
- if !(VipsMajorVersion >= 8 && VipsMinorVersion >= 6) {
- t.Skipf("Skipping this test, libvips doesn't meet version requirement %s >= 8.6", VipsVersion)
- }
-
- i := initImage("transparent.png")
- buf, err := i.Trim()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
-
- err = assertSize(buf, 250, 208)
- if err != nil {
- t.Errorf("The image wasn't trimmed.")
- }
-
- Write("fixtures/transparent_trim.png", buf)
-}
-
-func TestImageLength(t *testing.T) {
- i := initImage("test.jpg")
-
- actual := i.Length()
- expected := 53653
-
- if expected != actual {
- t.Errorf("Size in Bytes of the image doesn't correspond. %d != %d", expected, actual)
- }
-}
-
-func initImage(file string) *Image {
- buf, _ := imageBuf(file)
- return NewImage(buf)
-}
-
-func imageBuf(file string) ([]byte, error) {
- return Read(path.Join("fixtures", file))
-}
-
-func assertSize(buf []byte, width, height int) error {
- size, err := NewImage(buf).Size()
- if err != nil {
- return err
- }
- if size.Width != width || size.Height != height {
- return fmt.Errorf("Invalid image size: %dx%d", size.Width, size.Height)
- }
- return nil
-}
diff --git a/vendor/github.com/h2non/bimg/metadata.go b/vendor/github.com/h2non/bimg/metadata.go
deleted file mode 100644
index 77eac8cd..00000000
--- a/vendor/github.com/h2non/bimg/metadata.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package bimg
-
-/*
-#cgo pkg-config: vips
-#include "vips/vips.h"
-*/
-import "C"
-
-// ImageSize represents the image width and height values
-type ImageSize struct {
- Width int
- Height int
-}
-
-// ImageMetadata represents the basic metadata fields
-type ImageMetadata struct {
- Orientation int
- Channels int
- Alpha bool
- Profile bool
- Type string
- Space string
- Colourspace string
- Size ImageSize
-}
-
-// Size returns the image size by width and height pixels.
-func Size(buf []byte) (ImageSize, error) {
- metadata, err := Metadata(buf)
- if err != nil {
- return ImageSize{}, err
- }
-
- return ImageSize{
- Width: int(metadata.Size.Width),
- Height: int(metadata.Size.Height),
- }, nil
-}
-
-// ColourspaceIsSupported checks if the image colourspace is supported by libvips.
-func ColourspaceIsSupported(buf []byte) (bool, error) {
- return vipsColourspaceIsSupportedBuffer(buf)
-}
-
-// ImageInterpretation returns the image interpretation type.
-// See: http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/VipsImage.html#VipsInterpretation
-func ImageInterpretation(buf []byte) (Interpretation, error) {
- return vipsInterpretationBuffer(buf)
-}
-
-// Metadata returns the image metadata (size, type, alpha channel, profile, EXIF orientation...).
-func Metadata(buf []byte) (ImageMetadata, error) {
- defer C.vips_thread_shutdown()
-
- image, imageType, err := vipsRead(buf)
- if err != nil {
- return ImageMetadata{}, err
- }
- defer C.g_object_unref(C.gpointer(image))
-
- size := ImageSize{
- Width: int(image.Xsize),
- Height: int(image.Ysize),
- }
-
- metadata := ImageMetadata{
- Size: size,
- Channels: int(image.Bands),
- Orientation: vipsExifOrientation(image),
- Alpha: vipsHasAlpha(image),
- Profile: vipsHasProfile(image),
- Space: vipsSpace(image),
- Type: ImageTypeName(imageType),
- }
-
- return metadata, nil
-}
diff --git a/vendor/github.com/h2non/bimg/metadata_test.go b/vendor/github.com/h2non/bimg/metadata_test.go
deleted file mode 100644
index 663ec564..00000000
--- a/vendor/github.com/h2non/bimg/metadata_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package bimg
-
-import (
- "io/ioutil"
- "os"
- "path"
- "testing"
-)
-
-func TestSize(t *testing.T) {
- files := []struct {
- name string
- width int
- height int
- }{
- {"test.jpg", 1680, 1050},
- {"test.png", 400, 300},
- {"test.webp", 550, 368},
- }
- for _, file := range files {
- size, err := Size(readFile(file.name))
- if err != nil {
- t.Fatalf("Cannot read the image: %#v", err)
- }
-
- if size.Width != file.width || size.Height != file.height {
- t.Fatalf("Unexpected image size: %dx%d", size.Width, size.Height)
- }
- }
-}
-
-func TestMetadata(t *testing.T) {
- files := []struct {
- name string
- format string
- orientation int
- alpha bool
- profile bool
- space string
- }{
- {"test.jpg", "jpeg", 0, false, false, "srgb"},
- {"test_icc_prophoto.jpg", "jpeg", 0, false, true, "srgb"},
- {"test.png", "png", 0, true, false, "srgb"},
- {"test.webp", "webp", 0, false, false, "srgb"},
- }
-
- for _, file := range files {
- metadata, err := Metadata(readFile(file.name))
- if err != nil {
- t.Fatalf("Cannot read the image: %s -> %s", file.name, err)
- }
-
- if metadata.Type != file.format {
- t.Fatalf("Unexpected image format: %s", file.format)
- }
- if metadata.Orientation != file.orientation {
- t.Fatalf("Unexpected image orientation: %d != %d", metadata.Orientation, file.orientation)
- }
- if metadata.Alpha != file.alpha {
- t.Fatalf("Unexpected image alpha: %t != %t", metadata.Alpha, file.alpha)
- }
- if metadata.Profile != file.profile {
- t.Fatalf("Unexpected image profile: %t != %t", metadata.Profile, file.profile)
- }
- if metadata.Space != file.space {
- t.Fatalf("Unexpected image profile: %t != %t", metadata.Profile, file.profile)
- }
- }
-}
-
-func TestImageInterpretation(t *testing.T) {
- files := []struct {
- name string
- interpretation Interpretation
- }{
- {"test.jpg", InterpretationSRGB},
- {"test.png", InterpretationSRGB},
- {"test.webp", InterpretationSRGB},
- }
-
- for _, file := range files {
- interpretation, err := ImageInterpretation(readFile(file.name))
- if err != nil {
- t.Fatalf("Cannot read the image: %s -> %s", file.name, err)
- }
- if interpretation != file.interpretation {
- t.Fatalf("Unexpected image interpretation")
- }
- }
-}
-
-func TestColourspaceIsSupported(t *testing.T) {
- files := []struct {
- name string
- }{
- {"test.jpg"},
- {"test.png"},
- {"test.webp"},
- }
-
- for _, file := range files {
- supported, err := ColourspaceIsSupported(readFile(file.name))
- if err != nil {
- t.Fatalf("Cannot read the image: %s -> %s", file.name, err)
- }
- if supported != true {
- t.Fatalf("Unsupported image colourspace")
- }
- }
-
- supported, err := initImage("test.jpg").ColourspaceIsSupported()
- if err != nil {
- t.Errorf("Cannot process the image: %#v", err)
- }
- if supported != true {
- t.Errorf("Non-supported colourspace")
- }
-}
-
-func readFile(file string) []byte {
- data, _ := os.Open(path.Join("fixtures", file))
- buf, _ := ioutil.ReadAll(data)
- return buf
-}
diff --git a/vendor/github.com/h2non/bimg/options.go b/vendor/github.com/h2non/bimg/options.go
deleted file mode 100644
index 609de606..00000000
--- a/vendor/github.com/h2non/bimg/options.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package bimg
-
-/*
-#cgo pkg-config: vips
-#include "vips/vips.h"
-*/
-import "C"
-
-const (
- // Quality defines the default JPEG quality to be used.
- Quality = 80
- // MaxSize defines the maximum pixels width or height supported.
- MaxSize = 16383
-)
-
-// Gravity represents the image gravity value.
-type Gravity int
-
-const (
- // GravityCentre represents the centre value used for image gravity orientation.
- GravityCentre Gravity = iota
- // GravityNorth represents the north value used for image gravity orientation.
- GravityNorth
- // GravityEast represents the east value used for image gravity orientation.
- GravityEast
- // GravitySouth represents the south value used for image gravity orientation.
- GravitySouth
- // GravityWest represents the west value used for image gravity orientation.
- GravityWest
- // GravitySmart enables libvips Smart Crop algorithm for image gravity orientation.
- GravitySmart
-)
-
-// Interpolator represents the image interpolation value.
-type Interpolator int
-
-const (
- // Bicubic interpolation value.
- Bicubic Interpolator = iota
- // Bilinear interpolation value.
- Bilinear
- // Nohalo interpolation value.
- Nohalo
-)
-
-var interpolations = map[Interpolator]string{
- Bicubic: "bicubic",
- Bilinear: "bilinear",
- Nohalo: "nohalo",
-}
-
-func (i Interpolator) String() string {
- return interpolations[i]
-}
-
-// Angle represents the image rotation angle value.
-type Angle int
-
-const (
- // D0 represents the rotation angle 0 degrees.
- D0 Angle = 0
- // D45 represents the rotation angle 90 degrees.
- D45 Angle = 45
- // D90 represents the rotation angle 90 degrees.
- D90 Angle = 90
- // D135 represents the rotation angle 90 degrees.
- D135 Angle = 135
- // D180 represents the rotation angle 180 degrees.
- D180 Angle = 180
- // D235 represents the rotation angle 235 degrees.
- D235 Angle = 235
- // D270 represents the rotation angle 270 degrees.
- D270 Angle = 270
- // D315 represents the rotation angle 180 degrees.
- D315 Angle = 315
-)
-
-// Direction represents the image direction value.
-type Direction int
-
-const (
- // Horizontal represents the orizontal image direction value.
- Horizontal Direction = C.VIPS_DIRECTION_HORIZONTAL
- // Vertical represents the vertical image direction value.
- Vertical Direction = C.VIPS_DIRECTION_VERTICAL
-)
-
-// Interpretation represents the image interpretation type.
-// See: http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/VipsImage.html#VipsInterpretation
-type Interpretation int
-
-const (
- // InterpretationError points to the libvips interpretation error type.
- InterpretationError Interpretation = C.VIPS_INTERPRETATION_ERROR
- // InterpretationMultiband points to its libvips interpretation equivalent type.
- InterpretationMultiband Interpretation = C.VIPS_INTERPRETATION_MULTIBAND
- // InterpretationBW points to its libvips interpretation equivalent type.
- InterpretationBW Interpretation = C.VIPS_INTERPRETATION_B_W
- // InterpretationCMYK points to its libvips interpretation equivalent type.
- InterpretationCMYK Interpretation = C.VIPS_INTERPRETATION_CMYK
- // InterpretationRGB points to its libvips interpretation equivalent type.
- InterpretationRGB Interpretation = C.VIPS_INTERPRETATION_RGB
- // InterpretationSRGB points to its libvips interpretation equivalent type.
- InterpretationSRGB Interpretation = C.VIPS_INTERPRETATION_sRGB
- // InterpretationRGB16 points to its libvips interpretation equivalent type.
- InterpretationRGB16 Interpretation = C.VIPS_INTERPRETATION_RGB16
- // InterpretationGREY16 points to its libvips interpretation equivalent type.
- InterpretationGREY16 Interpretation = C.VIPS_INTERPRETATION_GREY16
- // InterpretationScRGB points to its libvips interpretation equivalent type.
- InterpretationScRGB Interpretation = C.VIPS_INTERPRETATION_scRGB
- // InterpretationLAB points to its libvips interpretation equivalent type.
- InterpretationLAB Interpretation = C.VIPS_INTERPRETATION_LAB
- // InterpretationXYZ points to its libvips interpretation equivalent type.
- InterpretationXYZ Interpretation = C.VIPS_INTERPRETATION_XYZ
-)
-
-// Extend represents the image extend mode, used when the edges
-// of an image are extended, you can specify how you want the extension done.
-// See: http://www.vips.ecs.soton.ac.uk/supported/8.4/doc/html/libvips/libvips-conversion.html#VIPS-EXTEND-BACKGROUND:CAPS
-type Extend int
-
-const (
- // ExtendBlack extend with black (all 0) pixels mode.
- ExtendBlack Extend = C.VIPS_EXTEND_BLACK
- // ExtendCopy copy the image edges.
- ExtendCopy Extend = C.VIPS_EXTEND_COPY
- // ExtendRepeat repeat the whole image.
- ExtendRepeat Extend = C.VIPS_EXTEND_REPEAT
- // ExtendMirror mirror the whole image.
- ExtendMirror Extend = C.VIPS_EXTEND_MIRROR
- // ExtendWhite extend with white (all bits set) pixels.
- ExtendWhite Extend = C.VIPS_EXTEND_WHITE
- // ExtendBackground with colour from the background property.
- ExtendBackground Extend = C.VIPS_EXTEND_BACKGROUND
- // ExtendLast extend with last pixel.
- ExtendLast Extend = C.VIPS_EXTEND_LAST
-)
-
-// WatermarkFont defines the default watermark font to be used.
-var WatermarkFont = "sans 10"
-
-// Color represents a traditional RGB color scheme.
-type Color struct {
- R, G, B uint8
-}
-
-// ColorBlack is a shortcut to black RGB color representation.
-var ColorBlack = Color{0, 0, 0}
-
-// Watermark represents the text-based watermark supported options.
-type Watermark struct {
- Width int
- DPI int
- Margin int
- Opacity float32
- NoReplicate bool
- Text string
- Font string
- Background Color
-}
-
-// WatermarkImage represents the image-based watermark supported options.
-type WatermarkImage struct {
- Left int
- Top int
- Buf []byte
- Opacity float32
-}
-
-// GaussianBlur represents the gaussian image transformation values.
-type GaussianBlur struct {
- Sigma float64
- MinAmpl float64
-}
-
-// Sharpen represents the image sharp transformation options.
-type Sharpen struct {
- Radius int
- X1 float64
- Y2 float64
- Y3 float64
- M1 float64
- M2 float64
-}
-
-// Options represents the supported image transformation options.
-type Options struct {
- Height int
- Width int
- AreaHeight int
- AreaWidth int
- Top int
- Left int
- Quality int
- Compression int
- Zoom int
- Crop bool
- SmartCrop bool // Deprecated
- Enlarge bool
- Embed bool
- Flip bool
- Flop bool
- Force bool
- NoAutoRotate bool
- NoProfile bool
- Interlace bool
- StripMetadata bool
- Trim bool
- Extend Extend
- Rotate Angle
- Background Color
- Gravity Gravity
- Watermark Watermark
- WatermarkImage WatermarkImage
- Type ImageType
- Interpolator Interpolator
- Interpretation Interpretation
- GaussianBlur GaussianBlur
- Sharpen Sharpen
- OutputICC string
-}
diff --git a/vendor/github.com/h2non/bimg/preinstall.sh b/vendor/github.com/h2non/bimg/preinstall.sh
deleted file mode 100644
index 47fa24c5..00000000
--- a/vendor/github.com/h2non/bimg/preinstall.sh
+++ /dev/null
@@ -1,302 +0,0 @@
-#!/bin/bash
-
-vips_version_minimum=8.4.2
-vips_version_latest_major_minor=8.4
-vips_version_latest_patch=2
-
-openslide_version_minimum=3.4.0
-openslide_version_latest_major_minor=3.4
-openslide_version_latest_patch=1
-
-install_libvips_from_source() {
- echo "Compiling libvips $vips_version_latest_major_minor.$vips_version_latest_patch from source"
- curl -O http://www.vips.ecs.soton.ac.uk/supported/$vips_version_latest_major_minor/vips-$vips_version_latest_major_minor.$vips_version_latest_patch.tar.gz
- tar zvxf vips-$vips_version_latest_major_minor.$vips_version_latest_patch.tar.gz
- cd vips-$vips_version_latest_major_minor.$vips_version_latest_patch
- CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" ./configure --disable-debug --disable-docs --disable-static --disable-introspection --disable-dependency-tracking --enable-cxx=yes --without-python --without-orc --without-fftw $1
- make
- make install
- cd ..
- rm -rf vips-$vips_version_latest_major_minor.$vips_version_latest_patch
- rm vips-$vips_version_latest_major_minor.$vips_version_latest_patch.tar.gz
- ldconfig
- echo "Installed libvips $(PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig pkg-config --modversion vips)"
-}
-
-install_libopenslide_from_source() {
- echo "Compiling openslide $openslide_version_latest_major_minor.$openslide_version_latest_patch from source"
- curl -O -L https://github.com/openslide/openslide/releases/download/v$openslide_version_latest_major_minor.$openslide_version_latest_patch/openslide-$openslide_version_latest_major_minor.$openslide_version_latest_patch.tar.gz
- tar xzvf openslide-$openslide_version_latest_major_minor.$openslide_version_latest_patch.tar.gz
- cd openslide-$openslide_version_latest_major_minor.$openslide_version_latest_patch
- PKG_CONFIG_PATH=$pkg_config_path ./configure $1
- make
- make install
- cd ..
- rm -rf openslide-$openslide_version_latest_major_minor.$openslide_version_latest_patch
- rm openslide-$openslide_version_latest_major_minor.$openslide_version_latest_patch.tar.gz
- ldconfig
- echo "Installed libopenslide $openslide_version_latest_major_minor.$openslide_version_latest_patch"
-}
-
-sorry() {
- echo "Sorry, I don't yet know how to install lib$1 on $2"
- exit 1
-}
-
-pkg_config_path="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig"
-
-check_if_library_exists() {
- PKG_CONFIG_PATH=$pkg_config_path pkg-config --exists $1
- if [ $? -eq 0 ]; then
- version_found=$(PKG_CONFIG_PATH=$pkg_config_path pkg-config --modversion $1)
- PKG_CONFIG_PATH=$pkg_config_path pkg-config --atleast-version=$2 $1
- if [ $? -eq 0 ]; then
- # Found suitable version of libvips
- echo "Found lib$1 $version_found"
- return 1
- fi
- echo "Found lib$1 $version_found but require $2"
- else
- echo "Could not find lib$1 using a PKG_CONFIG_PATH of '$pkg_config_path'"
- fi
- return 0
-}
-
-enable_openslide=0
-# Is libvips already installed, and is it at least the minimum required version?
-if [ $# -eq 1 ]; then
- if [ "$1" = "--with-openslide" ]; then
- echo "Installing vips with openslide support"
- enable_openslide=1
- else
- echo "Sorry, $1 is not supported. Did you mean --with-openslide?"
- exit 1
- fi
-fi
-
-if ! type pkg-config >/dev/null; then
- sorry "vips" "a system without pkg-config"
-fi
-
-openslide_exists=0
-if [ $enable_openslide -eq 1 ]; then
- check_if_library_exists "openslide" "$openslide_version_minimum"
- openslide_exists=$?
-fi
-
-check_if_library_exists "vips" "$vips_version_minimum"
-vips_exists=$?
-if [ $vips_exists -eq 1 ] && [ $enable_openslide -eq 1 ]; then
- if [ $openslide_exists -eq 1 ]; then
- # Check if vips compiled with openslide support
- vips_with_openslide=`vips list classes | grep -i opensli`
- if [ -z $vips_with_openslide ]; then
- echo "Vips compiled without openslide support."
- else
- exit 0
- fi
- fi
-elif [ $vips_exists -eq 1 ] && [ $enable_openslide -eq 0 ]; then
- exit 0
-fi
-
-# Verify root/sudo access
-if [ "$(id -u)" -ne "0" ]; then
- echo "Sorry, I need root/sudo access to continue"
- exit 1
-fi
-
-# Deprecation warning
-if [ "$(arch)" == "x86_64" ]; then
- echo "This script is no longer required on most 64-bit Linux systems when using sharp v0.12.0+"
-fi
-
-# OS-specific installations of libopenslide follows
-# Either openslide does not exist, or vips is installed without openslide support
-if [ $enable_openslide -eq 1 ] && [ -z $vips_with_openslide ] && [ $openslide_exists -eq 0 ]; then
- if [ -f /etc/debian_version ]; then
- # Debian Linux
- DISTRO=$(lsb_release -c -s)
- echo "Detected Debian Linux '$DISTRO'"
- case "$DISTRO" in
- jessie|vivid|wily|xenial)
- # Debian 8, Ubuntu 15
- echo "Installing libopenslide via apt-get"
- apt-get install -y libopenslide-dev
- ;;
- trusty|utopic|qiana|rebecca|rafaela|freya|rosa|sarah|serena)
- # Ubuntu 14, Mint 17+
- echo "Installing libopenslide dependencies via apt-get"
- apt-get install -y automake build-essential curl zlib1g-dev libopenjpeg-dev libpng12-dev libjpeg-dev libtiff5-dev libgdk-pixbuf2.0-dev libxml2-dev libsqlite3-dev libcairo2-dev libglib2.0-dev sqlite3 libsqlite3-dev
- install_libopenslide_from_source
- ;;
- precise|wheezy|maya)
- # Debian 7, Ubuntu 12.04, Mint 13
- echo "Installing libopenslide dependencies via apt-get"
- apt-get install -y automake build-essential curl zlib1g-dev libopenjpeg-dev libpng12-dev libjpeg-dev libtiff5-dev libgdk-pixbuf2.0-dev libxml2-dev libsqlite3-dev libcairo2-dev libglib2.0-dev sqlite3 libsqlite3-dev
- install_libopenslide_from_source
- ;;
- *)
- # Unsupported Debian-based OS
- sorry "openslide" "Debian-based $DISTRO"
- ;;
- esac
- elif [ -f /etc/redhat-release ]; then
- # Red Hat Linux
- RELEASE=$(cat /etc/redhat-release)
- echo "Detected Red Hat Linux '$RELEASE'"
- case $RELEASE in
- "Red Hat Enterprise Linux release 7."*|"CentOS Linux release 7."*|"Scientific Linux release 7."*)
- # RHEL/CentOS 7
- echo "Installing libopenslide dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y tar curl libpng-devel libjpeg-devel libxml2-devel zlib-devel openjpeg-devel libtiff-devel gdk-pixbuf2-devel sqlite-devel cairo-devel glib2-devel
- install_libopenslide_from_source "--prefix=/usr"
- ;;
- "Red Hat Enterprise Linux release 6."*|"CentOS release 6."*|"Scientific Linux release 6."*)
- # RHEL/CentOS 6
- echo "Installing libopenslide dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y tar curl libpng-devel libjpeg-devel libxml2-devel zlib-devel openjpeg-devel libtiff-devel gdk-pixbuf2-devel sqlite-devel cairo-devel glib2-devel
- install_libopenslide_from_source "--prefix=/usr"
- ;;
- "Fedora release 21 "*|"Fedora release 22 "*)
- # Fedora 21, 22
- echo "Installing libopenslide via yum"
- yum install -y openslide-devel
- ;;
- *)
- # Unsupported RHEL-based OS
- sorry "openslide" "$RELEASE"
- ;;
- esac
- elif [ -f /etc/os-release ]; then
- RELEASE=$(cat /etc/os-release | grep VERSION)
- echo "Detected OpenSuse Linux '$RELEASE'"
- case $RELEASE in
- *"13.2"*)
- echo "Installing libopenslide via zypper"
- zypper --gpg-auto-import-keys install -y libopenslide-devel
- ;;
- esac
- elif [ -f /etc/SuSE-brand ]; then
- RELEASE=$(cat /etc/SuSE-brand | grep VERSION)
- echo "Detected OpenSuse Linux '$RELEASE'"
- case $RELEASE in
- *"13.1")
- echo "Installing libopenslide dependencies via zypper"
- zypper --gpg-auto-import-keys install -y --type pattern devel_basis
- zypper --gpg-auto-import-keys install -y tar curl libpng16-devel libjpeg-turbo libjpeg8-devel libxml2-devel zlib-devel openjpeg-devel libtiff-devel libgdk_pixbuf-2_0-0 sqlite3-devel cairo-devel glib2-devel
- install_libopenslide_from_source
- ;;
- esac
- else
- # Unsupported OS
- sorry "openslide" "$(uname -a)"
- fi
-fi
-
-# OS-specific installations of libvips follows
-
-if [ -f /etc/debian_version ]; then
- # Debian Linux
- DISTRO=$(lsb_release -c -s)
- echo "Detected Debian Linux '$DISTRO'"
- case "$DISTRO" in
- jessie|trusty|utopic|vivid|wily|xenial|qiana|rebecca|rafaela|freya|rosa|sarah|serena)
- # Debian 8, Ubuntu 14.04+, Mint 17+
- echo "Installing libvips dependencies via apt-get"
- apt-get install -y automake build-essential gobject-introspection gtk-doc-tools libglib2.0-dev libjpeg-dev libpng12-dev libwebp-dev libtiff5-dev libexif-dev libgsf-1-dev liblcms2-dev libxml2-dev swig libmagickcore-dev curl
- install_libvips_from_source
- ;;
- precise|wheezy|maya)
- # Debian 7, Ubuntu 12.04, Mint 13
- echo "Installing libvips dependencies via apt-get"
- add-apt-repository -y ppa:lyrasis/precise-backports
- apt-get update
- apt-get install -y automake build-essential gobject-introspection gtk-doc-tools libglib2.0-dev libjpeg-dev libpng12-dev libwebp-dev libtiff4-dev libexif-dev libgsf-1-dev liblcms2-dev libxml2-dev swig libmagickcore-dev curl
- install_libvips_from_source
- ;;
- *)
- # Unsupported Debian-based OS
- sorry "vips" "Debian-based $DISTRO"
- ;;
- esac
-elif [ -f /etc/redhat-release ]; then
- # Red Hat Linux
- RELEASE=$(cat /etc/redhat-release)
- echo "Detected Red Hat Linux '$RELEASE'"
- case $RELEASE in
- "Red Hat Enterprise Linux release 7."*|"CentOS Linux release 7."*|"Scientific Linux release 7."*)
- # RHEL/CentOS 7
- echo "Installing libvips dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y tar curl gtk-doc libxml2-devel libjpeg-turbo-devel libpng-devel libtiff-devel libexif-devel libgsf-devel lcms2-devel ImageMagick-devel gobject-introspection-devel libwebp-devel
- install_libvips_from_source "--prefix=/usr"
- ;;
- "Red Hat Enterprise Linux release 6."*|"CentOS release 6."*|"Scientific Linux release 6."*)
- # RHEL/CentOS 6
- echo "Installing libvips dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y tar curl gtk-doc libxml2-devel libjpeg-turbo-devel libpng-devel libtiff-devel libexif-devel libgsf-devel lcms-devel ImageMagick-devel
- yum install -y http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
- yum install -y --enablerepo=nux-dextop gobject-introspection-devel
- yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
- yum install -y --enablerepo=remi libwebp-devel
- install_libvips_from_source "--prefix=/usr"
- ;;
- "Fedora"*)
- # Fedora 21, 22, 23
- echo "Installing libvips dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y gcc-c++ gtk-doc libxml2-devel libjpeg-turbo-devel libpng-devel libtiff-devel libexif-devel lcms-devel ImageMagick-devel gobject-introspection-devel libwebp-devel curl
- install_libvips_from_source "--prefix=/usr"
- ;;
- *)
- # Unsupported RHEL-based OS
- sorry "vips" "$RELEASE"
- ;;
- esac
-elif [ -f /etc/system-release ]; then
- # Probably Amazon Linux
- RELEASE=$(cat /etc/system-release)
- case $RELEASE in
- "Amazon Linux AMI release 2015.03"|"Amazon Linux AMI release 2015.09")
- # Amazon Linux
- echo "Detected '$RELEASE'"
- echo "Installing libvips dependencies via yum"
- yum groupinstall -y "Development Tools"
- yum install -y gtk-doc libxml2-devel libjpeg-turbo-devel libpng-devel libtiff-devel libexif-devel libgsf-devel lcms2-devel ImageMagick-devel gobject-introspection-devel libwebp-devel curl
- install_libvips_from_source "--prefix=/usr"
- ;;
- *)
- # Unsupported Amazon Linux version
- sorry "vips" "$RELEASE"
- ;;
- esac
-elif [ -f /etc/os-release ]; then
- RELEASE=$(cat /etc/os-release | grep VERSION)
- echo "Detected OpenSuse Linux '$RELEASE'"
- case $RELEASE in
- *"13.2"*)
- echo "Installing libvips dependencies via zypper"
- zypper --gpg-auto-import-keys install -y --type pattern devel_basis
- zypper --gpg-auto-import-keys install -y tar curl gtk-doc libxml2-devel libjpeg-turbo libjpeg8-devel libpng16-devel libtiff-devel libexif-devel liblcms2-devel ImageMagick-devel gobject-introspection-devel libwebp-devel
- install_libvips_from_source
- ;;
- esac
-elif [ -f /etc/SuSE-brand ]; then
- RELEASE=$(cat /etc/SuSE-brand | grep VERSION)
- echo "Detected OpenSuse Linux '$RELEASE'"
- case $RELEASE in
- *"13.1")
- echo "Installing libvips dependencies via zypper"
- zypper --gpg-auto-import-keys install -y --type pattern devel_basis
- zypper --gpg-auto-import-keys install -y tar curl gtk-doc libxml2-devel libjpeg-turbo libjpeg8-devel libpng16-devel libtiff-devel libexif-devel liblcms2-devel ImageMagick-devel gobject-introspection-devel libwebp-devel
- install_libvips_from_source
- ;;
- esac
-else
- # Unsupported OS
- sorry "vips" "$(uname -a)"
-fi
diff --git a/vendor/github.com/h2non/bimg/resize.go b/vendor/github.com/h2non/bimg/resize.go
deleted file mode 100644
index 07fdaa25..00000000
--- a/vendor/github.com/h2non/bimg/resize.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// +build go17
-
-package bimg
-
-import (
- "runtime"
-)
-
-// Resize is used to transform a given image as byte buffer
-// with the passed options.
-func Resize(buf []byte, o Options) ([]byte, error) {
- // Required in order to prevent premature garbage collection. See:
- // https://github.com/h2non/bimg/pull/162
- defer runtime.KeepAlive(buf)
- return resizer(buf, o)
-}
diff --git a/vendor/github.com/h2non/bimg/resize_legacy.go b/vendor/github.com/h2non/bimg/resize_legacy.go
deleted file mode 100644
index 86d8acd4..00000000
--- a/vendor/github.com/h2non/bimg/resize_legacy.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// +build !go17
-
-package bimg
-
-// Resize is used to transform a given image as byte buffer
-// with the passed options.
-// Used as proxy to resizer() only in Go <= 1.6 versions
-func Resize(buf []byte, o Options) ([]byte, error) {
- return resizer(buf, o)
-}
diff --git a/vendor/github.com/h2non/bimg/resizer.go b/vendor/github.com/h2non/bimg/resizer.go
deleted file mode 100644
index eab4d041..00000000
--- a/vendor/github.com/h2non/bimg/resizer.go
+++ /dev/null
@@ -1,572 +0,0 @@
-package bimg
-
-/*
-#cgo pkg-config: vips
-#include "vips/vips.h"
-*/
-import "C"
-
-import (
- "errors"
- "math"
-)
-
-// resizer is used to transform a given image as byte buffer
-// with the passed options.
-func resizer(buf []byte, o Options) ([]byte, error) {
- defer C.vips_thread_shutdown()
-
- image, imageType, err := loadImage(buf)
- if err != nil {
- return nil, err
- }
-
- // Clone and define default options
- o = applyDefaults(o, imageType)
-
- if !IsTypeSupported(o.Type) {
- return nil, errors.New("Unsupported image output type")
- }
-
- debug("Options: %#v", o)
-
- // Auto rotate image based on EXIF orientation header
- image, rotated, err := rotateAndFlipImage(image, o)
- if err != nil {
- return nil, err
- }
-
- // If JPEG image, retrieve the buffer
- if rotated && imageType == JPEG && !o.NoAutoRotate {
- buf, err = getImageBuffer(image)
- if err != nil {
- return nil, err
- }
- }
-
- inWidth := int(image.Xsize)
- inHeight := int(image.Ysize)
-
- // Infer the required operation based on the in/out image sizes for a coherent transformation
- normalizeOperation(&o, inWidth, inHeight)
-
- // image calculations
- factor := imageCalculations(&o, inWidth, inHeight)
- shrink := calculateShrink(factor, o.Interpolator)
- residual := calculateResidual(factor, shrink)
-
- // Do not enlarge the output if the input width or height
- // are already less than the required dimensions
- if !o.Enlarge && !o.Force {
- if inWidth < o.Width && inHeight < o.Height {
- factor = 1.0
- shrink = 1
- residual = 0
- o.Width = inWidth
- o.Height = inHeight
- }
- }
-
- // Try to use libjpeg shrink-on-load
- if imageType == JPEG && shrink >= 2 {
- tmpImage, factor, err := shrinkJpegImage(buf, image, factor, shrink)
- if err != nil {
- return nil, err
- }
-
- image = tmpImage
- factor = math.Max(factor, 1.0)
- shrink = int(math.Floor(factor))
- residual = float64(shrink) / factor
- }
-
- // Zoom image, if necessary
- image, err = zoomImage(image, o.Zoom)
- if err != nil {
- return nil, err
- }
-
- // Transform image, if necessary
- if shouldTransformImage(o, inWidth, inHeight) {
- image, err = transformImage(image, o, shrink, residual)
- if err != nil {
- return nil, err
- }
- }
-
- // Apply effects, if necessary
- if shouldApplyEffects(o) {
- image, err = applyEffects(image, o)
- if err != nil {
- return nil, err
- }
- }
-
- // Add watermark, if necessary
- image, err = watermarkImageWithText(image, o.Watermark)
- if err != nil {
- return nil, err
- }
-
- // Add watermark, if necessary
- image, err = watermarkImageWithAnotherImage(image, o.WatermarkImage)
- if err != nil {
- return nil, err
- }
-
- // Flatten image on a background, if necessary
- image, err = imageFlatten(image, imageType, o)
- if err != nil {
- return nil, err
- }
-
- return saveImage(image, o)
-}
-
-func loadImage(buf []byte) (*C.VipsImage, ImageType, error) {
- if len(buf) == 0 {
- return nil, JPEG, errors.New("Image buffer is empty")
- }
-
- image, imageType, err := vipsRead(buf)
- if err != nil {
- return nil, JPEG, err
- }
-
- return image, imageType, nil
-}
-
-func applyDefaults(o Options, imageType ImageType) Options {
- if o.Quality == 0 {
- o.Quality = Quality
- }
- if o.Compression == 0 {
- o.Compression = 6
- }
- if o.Type == 0 {
- o.Type = imageType
- }
- if o.Interpretation == 0 {
- o.Interpretation = InterpretationSRGB
- }
- return o
-}
-
-func saveImage(image *C.VipsImage, o Options) ([]byte, error) {
- saveOptions := vipsSaveOptions{
- Quality: o.Quality,
- Type: o.Type,
- Compression: o.Compression,
- Interlace: o.Interlace,
- NoProfile: o.NoProfile,
- Interpretation: o.Interpretation,
- OutputICC: o.OutputICC,
- StripMetadata: o.StripMetadata,
- }
- // Finally get the resultant buffer
- return vipsSave(image, saveOptions)
-}
-
-func normalizeOperation(o *Options, inWidth, inHeight int) {
- if !o.Force && !o.Crop && !o.Embed && !o.Enlarge && o.Rotate == 0 && (o.Width > 0 || o.Height > 0) {
- o.Force = true
- }
-}
-
-func shouldTransformImage(o Options, inWidth, inHeight int) bool {
- return o.Force || (o.Width > 0 && o.Width != inWidth) ||
- (o.Height > 0 && o.Height != inHeight) || o.AreaWidth > 0 || o.AreaHeight > 0 ||
- o.Trim
-}
-
-func shouldApplyEffects(o Options) bool {
- return o.GaussianBlur.Sigma > 0 || o.GaussianBlur.MinAmpl > 0 || o.Sharpen.Radius > 0 && o.Sharpen.Y2 > 0 || o.Sharpen.Y3 > 0
-}
-
-func transformImage(image *C.VipsImage, o Options, shrink int, residual float64) (*C.VipsImage, error) {
- var err error
- // Use vips_shrink with the integral reduction
- if shrink > 1 {
- image, residual, err = shrinkImage(image, o, residual, shrink)
- if err != nil {
- return nil, err
- }
- }
-
- residualx, residualy := residual, residual
- if o.Force {
- residualx = float64(o.Width) / float64(image.Xsize)
- residualy = float64(o.Height) / float64(image.Ysize)
- }
-
- if o.Force || residual != 0 {
- if residualx < 1 && residualy < 1 {
- image, err = vipsReduce(image, 1/residualx, 1/residualy)
- } else {
- image, err = vipsAffine(image, residualx, residualy, o.Interpolator)
- }
- if err != nil {
- return nil, err
- }
- }
-
- if o.Force {
- o.Crop = false
- o.Embed = false
- }
-
- image, err = extractOrEmbedImage(image, o)
- if err != nil {
- return nil, err
- }
-
- debug("Transform: shrink=%v, residual=%v, interpolator=%v",
- shrink, residual, o.Interpolator.String())
-
- return image, nil
-}
-
-func applyEffects(image *C.VipsImage, o Options) (*C.VipsImage, error) {
- var err error
-
- if o.GaussianBlur.Sigma > 0 || o.GaussianBlur.MinAmpl > 0 {
- image, err = vipsGaussianBlur(image, o.GaussianBlur)
- if err != nil {
- return nil, err
- }
- }
-
- if o.Sharpen.Radius > 0 && o.Sharpen.Y2 > 0 || o.Sharpen.Y3 > 0 {
- image, err = vipsSharpen(image, o.Sharpen)
- if err != nil {
- return nil, err
- }
- }
-
- debug("Effects: gaussSigma=%v, gaussMinAmpl=%v, sharpenRadius=%v",
- o.GaussianBlur.Sigma, o.GaussianBlur.MinAmpl, o.Sharpen.Radius)
-
- return image, nil
-}
-
-func extractOrEmbedImage(image *C.VipsImage, o Options) (*C.VipsImage, error) {
- var err error
- inWidth := int(image.Xsize)
- inHeight := int(image.Ysize)
-
- switch {
- case o.Gravity == GravitySmart, o.SmartCrop:
- image, err = vipsSmartCrop(image, o.Width, o.Height)
- break
- case o.Crop:
- width := int(math.Min(float64(inWidth), float64(o.Width)))
- height := int(math.Min(float64(inHeight), float64(o.Height)))
- left, top := calculateCrop(inWidth, inHeight, o.Width, o.Height, o.Gravity)
- left, top = int(math.Max(float64(left), 0)), int(math.Max(float64(top), 0))
- image, err = vipsExtract(image, left, top, width, height)
- break
- case o.Embed:
- left, top := (o.Width-inWidth)/2, (o.Height-inHeight)/2
- image, err = vipsEmbed(image, left, top, o.Width, o.Height, o.Extend, o.Background)
- break
- case o.Trim:
- left, top, width, height, err := vipsTrim(image)
- if err == nil {
- image, err = vipsExtract(image, left, top, width, height)
- }
- break
- case o.Top != 0 || o.Left != 0 || o.AreaWidth != 0 || o.AreaHeight != 0:
- if o.AreaWidth == 0 {
- o.AreaHeight = o.Width
- }
- if o.AreaHeight == 0 {
- o.AreaHeight = o.Height
- }
- if o.AreaWidth == 0 || o.AreaHeight == 0 {
- return nil, errors.New("Extract area width/height params are required")
- }
- image, err = vipsExtract(image, o.Left, o.Top, o.AreaWidth, o.AreaHeight)
- break
- }
-
- return image, err
-}
-
-func rotateAndFlipImage(image *C.VipsImage, o Options) (*C.VipsImage, bool, error) {
- var err error
- var rotated bool
- var direction Direction = -1
-
- if o.NoAutoRotate == false {
- rotation, flip := calculateRotationAndFlip(image, o.Rotate)
- if flip {
- o.Flip = flip
- }
- if rotation > 0 && o.Rotate == 0 {
- o.Rotate = rotation
- }
- }
-
- if o.Rotate > 0 {
- rotated = true
- image, err = vipsRotate(image, getAngle(o.Rotate))
- }
-
- if o.Flip {
- direction = Horizontal
- } else if o.Flop {
- direction = Vertical
- }
-
- if direction != -1 {
- rotated = true
- image, err = vipsFlip(image, direction)
- }
-
- return image, rotated, err
-}
-
-func watermarkImageWithText(image *C.VipsImage, w Watermark) (*C.VipsImage, error) {
- if w.Text == "" {
- return image, nil
- }
-
- // Defaults
- if w.Font == "" {
- w.Font = WatermarkFont
- }
- if w.Width == 0 {
- w.Width = int(math.Floor(float64(image.Xsize / 6)))
- }
- if w.DPI == 0 {
- w.DPI = 150
- }
- if w.Margin == 0 {
- w.Margin = w.Width
- }
- if w.Opacity == 0 {
- w.Opacity = 0.25
- } else if w.Opacity > 1 {
- w.Opacity = 1
- }
-
- image, err := vipsWatermark(image, w)
- if err != nil {
- return nil, err
- }
-
- return image, nil
-}
-
-func watermarkImageWithAnotherImage(image *C.VipsImage, w WatermarkImage) (*C.VipsImage, error) {
-
- if len(w.Buf) == 0 {
- return image, nil
- }
-
- if w.Opacity == 0.0 {
- w.Opacity = 1.0
- }
-
- image, err := vipsDrawWatermark(image, w)
-
- if err != nil {
- return nil, err
- }
-
- return image, nil
-}
-
-func imageFlatten(image *C.VipsImage, imageType ImageType, o Options) (*C.VipsImage, error) {
- // Only PNG images are supported for now
- if imageType != PNG || o.Background == ColorBlack {
- return image, nil
- }
- return vipsFlattenBackground(image, o.Background)
-}
-
-func zoomImage(image *C.VipsImage, zoom int) (*C.VipsImage, error) {
- if zoom == 0 {
- return image, nil
- }
- return vipsZoom(image, zoom+1)
-}
-
-func shrinkImage(image *C.VipsImage, o Options, residual float64, shrink int) (*C.VipsImage, float64, error) {
- // Use vips_shrink with the integral reduction
- image, err := vipsShrink(image, shrink)
- if err != nil {
- return nil, 0, err
- }
-
- // Recalculate residual float based on dimensions of required vs shrunk images
- residualx := float64(o.Width) / float64(image.Xsize)
- residualy := float64(o.Height) / float64(image.Ysize)
-
- if o.Crop {
- residual = math.Max(residualx, residualy)
- } else {
- residual = math.Min(residualx, residualy)
- }
-
- return image, residual, nil
-}
-
-func shrinkJpegImage(buf []byte, input *C.VipsImage, factor float64, shrink int) (*C.VipsImage, float64, error) {
- var image *C.VipsImage
- var err error
- shrinkOnLoad := 1
-
- // Recalculate integral shrink and double residual
- switch {
- case shrink >= 8:
- factor = factor / 8
- shrinkOnLoad = 8
- case shrink >= 4:
- factor = factor / 4
- shrinkOnLoad = 4
- case shrink >= 2:
- factor = factor / 2
- shrinkOnLoad = 2
- }
-
- // Reload input using shrink-on-load
- if shrinkOnLoad > 1 {
- image, err = vipsShrinkJpeg(buf, input, shrinkOnLoad)
- }
-
- return image, factor, err
-}
-
-func imageCalculations(o *Options, inWidth, inHeight int) float64 {
- factor := 1.0
- xfactor := float64(inWidth) / float64(o.Width)
- yfactor := float64(inHeight) / float64(o.Height)
-
- switch {
- // Fixed width and height
- case o.Width > 0 && o.Height > 0:
- if o.Crop {
- factor = math.Min(xfactor, yfactor)
- } else {
- factor = math.Max(xfactor, yfactor)
- }
- // Fixed width, auto height
- case o.Width > 0:
- if o.Crop {
- o.Height = inHeight
- } else {
- factor = xfactor
- o.Height = roundFloat(float64(inHeight) / factor)
- }
- // Fixed height, auto width
- case o.Height > 0:
- if o.Crop {
- o.Width = inWidth
- } else {
- factor = yfactor
- o.Width = roundFloat(float64(inWidth) / factor)
- }
- // Identity transform
- default:
- o.Width = inWidth
- o.Height = inHeight
- break
- }
-
- return factor
-}
-
-func roundFloat(f float64) int {
- if f < 0 {
- return int(math.Ceil(f - 0.5))
- }
- return int(math.Floor(f + 0.5))
-}
-
-func calculateCrop(inWidth, inHeight, outWidth, outHeight int, gravity Gravity) (int, int) {
- left, top := 0, 0
-
- switch gravity {
- case GravityNorth:
- left = (inWidth - outWidth + 1) / 2
- case GravityEast:
- left = inWidth - outWidth
- top = (inHeight - outHeight + 1) / 2
- case GravitySouth:
- left = (inWidth - outWidth + 1) / 2
- top = inHeight - outHeight
- case GravityWest:
- top = (inHeight - outHeight + 1) / 2
- default:
- left = (inWidth - outWidth + 1) / 2
- top = (inHeight - outHeight + 1) / 2
- }
-
- return left, top
-}
-
-func calculateRotationAndFlip(image *C.VipsImage, angle Angle) (Angle, bool) {
- rotate := D0
- flip := false
-
- if angle > 0 {
- return rotate, flip
- }
-
- switch vipsExifOrientation(image) {
- case 6:
- rotate = D90
- break
- case 3:
- rotate = D180
- break
- case 8:
- rotate = D270
- break
- case 2:
- flip = true
- break // flip 1
- case 7:
- flip = true
- rotate = D270
- break // flip 6
- case 4:
- flip = true
- rotate = D180
- break // flip 3
- case 5:
- flip = true
- rotate = D90
- break // flip 8
- }
-
- return rotate, flip
-}
-
-func calculateShrink(factor float64, i Interpolator) int {
- var shrink float64
-
- // Calculate integral box shrink
- windowSize := vipsWindowSize(i.String())
- if factor >= 2 && windowSize > 3 {
- // Shrink less, affine more with interpolators that use at least 4x4 pixel window, e.g. bicubic
- shrink = float64(math.Floor(factor * 3.0 / windowSize))
- } else {
- shrink = math.Floor(factor)
- }
-
- return int(math.Max(shrink, 1))
-}
-
-func calculateResidual(factor float64, shrink int) float64 {
- return float64(shrink) / factor
-}
-
-func getAngle(angle Angle) Angle {
- divisor := angle % 90
- if divisor != 0 {
- angle = angle - divisor
- }
- return Angle(math.Min(float64(angle), 270))
-}
diff --git a/vendor/github.com/h2non/bimg/resizer_test.go b/vendor/github.com/h2non/bimg/resizer_test.go
deleted file mode 100644
index a78f6aac..00000000
--- a/vendor/github.com/h2non/bimg/resizer_test.go
+++ /dev/null
@@ -1,704 +0,0 @@
-package bimg
-
-import (
- "bytes"
- "crypto/md5"
- "fmt"
- "image"
- "image/jpeg"
- "io/ioutil"
- "os"
- "path"
- "strconv"
- "testing"
-)
-
-func TestResize(t *testing.T) {
- options := Options{Width: 800, Height: 600}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_out.jpg", newImg)
-}
-
-func TestResizeVerticalImage(t *testing.T) {
- tests := []struct {
- format ImageType
- options Options
- }{
- {JPEG, Options{Width: 800, Height: 600}},
- {JPEG, Options{Width: 1000, Height: 1000}},
- {JPEG, Options{Width: 1000, Height: 1500}},
- {JPEG, Options{Width: 1000}},
- {JPEG, Options{Height: 1500}},
- {JPEG, Options{Width: 100, Height: 50}},
- {JPEG, Options{Width: 2000, Height: 2000}},
- {JPEG, Options{Width: 500, Height: 1000}},
- {JPEG, Options{Width: 500}},
- {JPEG, Options{Height: 500}},
- {JPEG, Options{Crop: true, Width: 500, Height: 1000}},
- {JPEG, Options{Crop: true, Enlarge: true, Width: 2000, Height: 1400}},
- {JPEG, Options{Enlarge: true, Force: true, Width: 2000, Height: 2000}},
- {JPEG, Options{Force: true, Width: 2000, Height: 2000}},
- }
-
- buf, _ := Read("fixtures/vertical.jpg")
- for _, test := range tests {
- image, err := Resize(buf, test.options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", test.options, err)
- }
-
- if DetermineImageType(image) != test.format {
- t.Fatalf("Image format is invalid. Expected: %#v", test.format)
- }
-
- size, _ := Size(image)
- if test.options.Height > 0 && size.Height != test.options.Height {
- t.Fatalf("Invalid height: %d", size.Height)
- }
- if test.options.Width > 0 && size.Width != test.options.Width {
- t.Fatalf("Invalid width: %d", size.Width)
- }
-
- Write("fixtures/test_vertical_"+strconv.Itoa(test.options.Width)+"x"+strconv.Itoa(test.options.Height)+"_out.jpg", image)
- }
-}
-
-func TestResizeCustomSizes(t *testing.T) {
- tests := []struct {
- format ImageType
- options Options
- }{
- {JPEG, Options{Width: 800, Height: 600}},
- {JPEG, Options{Width: 1000, Height: 1000}},
- {JPEG, Options{Width: 100, Height: 50}},
- {JPEG, Options{Width: 2000, Height: 2000}},
- {JPEG, Options{Width: 500, Height: 1000}},
- {JPEG, Options{Width: 500}},
- {JPEG, Options{Height: 500}},
- {JPEG, Options{Crop: true, Width: 500, Height: 1000}},
- {JPEG, Options{Crop: true, Enlarge: true, Width: 2000, Height: 1400}},
- {JPEG, Options{Enlarge: true, Force: true, Width: 2000, Height: 2000}},
- {JPEG, Options{Force: true, Width: 2000, Height: 2000}},
- }
-
- buf, _ := Read("fixtures/test.jpg")
- for _, test := range tests {
- image, err := Resize(buf, test.options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", test.options, err)
- }
-
- if DetermineImageType(image) != test.format {
- t.Fatalf("Image format is invalid. Expected: %#v", test.format)
- }
-
- size, _ := Size(image)
- if test.options.Height > 0 && size.Height != test.options.Height {
- t.Fatalf("Invalid height: %d", size.Height)
- }
- if test.options.Width > 0 && size.Width != test.options.Width {
- t.Fatalf("Invalid width: %d", size.Width)
- }
- }
-}
-
-func TestResizePrecision(t *testing.T) {
- // see https://github.com/h2non/bimg/issues/99
- img := image.NewGray16(image.Rect(0, 0, 1920, 1080))
- input := &bytes.Buffer{}
- jpeg.Encode(input, img, nil)
-
- opts := Options{Width: 300}
- newImg, err := Resize(input.Bytes(), opts)
- if err != nil {
- t.Fatalf("Resize(imgData, %#v) error: %#v", opts, err)
- }
-
- size, _ := Size(newImg)
- if size.Width != opts.Width {
- t.Fatalf("Invalid width: %d", size.Width)
- }
-}
-
-func TestRotate(t *testing.T) {
- options := Options{Width: 800, Height: 600, Rotate: 270, Crop: true}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != JPEG {
- t.Error("Image is not jpeg")
- }
-
- size, _ := Size(newImg)
- if size.Width != options.Width || size.Height != options.Height {
- t.Errorf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_rotate_out.jpg", newImg)
-}
-
-func TestInvalidRotateDegrees(t *testing.T) {
- options := Options{Width: 800, Height: 600, Rotate: 111, Crop: true}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != JPEG {
- t.Errorf("Image is not jpeg")
- }
-
- size, _ := Size(newImg)
- if size.Width != options.Width || size.Height != options.Height {
- t.Errorf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_rotate_invalid_out.jpg", newImg)
-}
-
-func TestCorruptedImage(t *testing.T) {
- options := Options{Width: 800, Height: 600}
- buf, _ := Read("fixtures/corrupt.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != JPEG {
- t.Fatal("Image is not jpeg")
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_corrupt_out.jpg", newImg)
-}
-
-func TestNoColorProfile(t *testing.T) {
- options := Options{Width: 800, Height: 600, NoProfile: true}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- metadata, err := Metadata(newImg)
- if metadata.Profile == true {
- t.Fatal("Invalid profile data")
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-}
-
-func TestEmbedExtendColor(t *testing.T) {
- options := Options{Width: 400, Height: 600, Crop: false, Embed: true, Extend: ExtendWhite, Background: Color{255, 20, 10}}
- buf, _ := Read("fixtures/test_issue.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_extend_white_out.jpg", newImg)
-}
-
-func TestEmbedExtendWithCustomColor(t *testing.T) {
- options := Options{Width: 400, Height: 600, Crop: false, Embed: true, Extend: 5, Background: Color{255, 20, 10}}
- buf, _ := Read("fixtures/test_issue.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_extend_background_out.jpg", newImg)
-}
-
-func TestGaussianBlur(t *testing.T) {
- options := Options{Width: 800, Height: 600, GaussianBlur: GaussianBlur{Sigma: 5}}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_gaussian_out.jpg", newImg)
-}
-
-func TestSharpen(t *testing.T) {
- options := Options{Width: 800, Height: 600, Sharpen: Sharpen{Radius: 1, X1: 1.5, Y2: 20, Y3: 50, M1: 1, M2: 2}}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.Height || size.Width != options.Width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_sharpen_out.jpg", newImg)
-}
-
-func TestExtractWithDefaultAxis(t *testing.T) {
- options := Options{AreaWidth: 200, AreaHeight: 200}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.AreaHeight || size.Width != options.AreaWidth {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_extract_defaults_out.jpg", newImg)
-}
-
-func TestExtractCustomAxis(t *testing.T) {
- options := Options{Top: 100, Left: 100, AreaWidth: 200, AreaHeight: 200}
- buf, _ := Read("fixtures/test.jpg")
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- size, _ := Size(newImg)
- if size.Height != options.AreaHeight || size.Width != options.AreaWidth {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
-
- Write("fixtures/test_extract_custom_axis_out.jpg", newImg)
-}
-
-func TestConvert(t *testing.T) {
- width, height := 300, 240
- formats := [3]ImageType{PNG, WEBP, JPEG}
-
- files := []string{
- "test.jpg",
- "test.png",
- "test.webp",
- }
-
- for _, file := range files {
- img, err := os.Open("fixtures/" + file)
- if err != nil {
- t.Fatal(err)
- }
-
- buf, err := ioutil.ReadAll(img)
- if err != nil {
- t.Fatal(err)
- }
- img.Close()
-
- for _, format := range formats {
- options := Options{Width: width, Height: height, Crop: true, Type: format}
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != format {
- t.Fatal("Image is not png")
- }
-
- size, _ := Size(newImg)
- if size.Height != height || size.Width != width {
- t.Fatalf("Invalid image size: %dx%d", size.Width, size.Height)
- }
- }
- }
-}
-
-func TestResizePngWithTransparency(t *testing.T) {
- width, height := 300, 240
-
- options := Options{Width: width, Height: height, Crop: true}
- img, err := os.Open("fixtures/transparent.png")
- if err != nil {
- t.Fatal(err)
- }
- defer img.Close()
-
- buf, err := ioutil.ReadAll(img)
- if err != nil {
- t.Fatal(err)
- }
-
- newImg, err := Resize(buf, options)
- if err != nil {
- t.Errorf("Resize(imgData, %#v) error: %#v", options, err)
- }
-
- if DetermineImageType(newImg) != PNG {
- t.Fatal("Image is not png")
- }
-
- size, _ := Size(newImg)
- if size.Height != height || size.Width != width {
- t.Fatal("Invalid image size")
- }
-
- Write("fixtures/transparent_out.png", newImg)
-}
-
-func TestRotationAndFlip(t *testing.T) {
- files := []struct {
- Name string
- Angle Angle
- Flip bool
- }{
- {"Landscape_1", 0, false},
- {"Landscape_2", 0, true},
- {"Landscape_3", D180, false},
- {"Landscape_4", D180, true},
- {"Landscape_5", D90, true},
- {"Landscape_6", D90, false},
- {"Landscape_7", D270, true},
- {"Landscape_8", D270, false},
- {"Portrait_1", 0, false},
- {"Portrait_2", 0, true},
- {"Portrait_3", D180, false},
- {"Portrait_4", D180, true},
- {"Portrait_5", D90, true},
- {"Portrait_6", D90, false},
- {"Portrait_7", D270, true},
- {"Portrait_8", D270, false},
- }
-
- for _, file := range files {
- img, err := os.Open(fmt.Sprintf("fixtures/exif/%s.jpg", file.Name))
- if err != nil {
- t.Fatal(err)
- }
-
- buf, err := ioutil.ReadAll(img)
- if err != nil {
- t.Fatal(err)
- }
- img.Close()
-
- image, _, err := loadImage(buf)
- if err != nil {
- t.Fatal(err)
- }
-
- angle, flip := calculateRotationAndFlip(image, D0)
- if angle != file.Angle {
- t.Errorf("Rotation for %v expected to be %v. got %v", file.Name, file.Angle, angle)
- }
- if flip != file.Flip {
- t.Errorf("Flip for %v expected to be %v. got %v", file.Name, file.Flip, flip)
- }
-
- // Visual debugging.
- newImg, err := Resize(buf, Options{})
- if err != nil {
- t.Fatal(err)
- }
-
- Write(fmt.Sprintf("fixtures/exif/%s_out.jpg", file.Name), newImg)
- }
-}
-
-func TestIfBothSmartCropOptionsAreIdentical(t *testing.T) {
- if !(VipsMajorVersion >= 8 && VipsMinorVersion > 4) {
- t.Skipf("Skipping this test, libvips doesn't meet version requirement %s > 8.4", VipsVersion)
- }
-
- benchmarkOptions := Options{Width: 100, Height: 100, Crop: true}
- smartCropOptions := Options{Width: 100, Height: 100, Crop: true, SmartCrop: true}
- gravityOptions := Options{Width: 100, Height: 100, Crop: true, Gravity: GravitySmart}
-
- testImg, err := os.Open("fixtures/northern_cardinal_bird.jpg")
- if err != nil {
- t.Fatal(err)
- }
- defer testImg.Close()
-
- testImgByte, err := ioutil.ReadAll(testImg)
- if err != nil {
- t.Fatal(err)
- }
-
- scImg, err := Resize(testImgByte, smartCropOptions)
- if err != nil {
- t.Fatal(err)
- }
-
- gImg, err := Resize(testImgByte, gravityOptions)
- if err != nil {
- t.Fatal(err)
- }
-
- benchmarkImg, err := Resize(testImgByte, benchmarkOptions)
- if err != nil {
- t.Fatal(err)
- }
-
- sch, gh, bh := md5.Sum(scImg), md5.Sum(gImg), md5.Sum(benchmarkImg)
- if gh == bh || sch == bh {
- t.Error("Expected both options produce a different result from a standard crop.")
- }
-
- if sch != gh {
- t.Errorf("Expected both options to result in the same output, %x != %x", sch, gh)
- }
-}
-
-func runBenchmarkResize(file string, o Options, b *testing.B) {
- buf, _ := Read(path.Join("fixtures", file))
-
- for n := 0; n < b.N; n++ {
- Resize(buf, o)
- }
-}
-
-func BenchmarkRotateJpeg(b *testing.B) {
- options := Options{Rotate: 180}
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkResizeLargeJpeg(b *testing.B) {
- options := Options{
- Width: 800,
- Height: 600,
- }
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkResizePng(b *testing.B) {
- options := Options{
- Width: 200,
- Height: 200,
- }
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkResizeWebP(b *testing.B) {
- options := Options{
- Width: 200,
- Height: 200,
- }
- runBenchmarkResize("test.webp", options, b)
-}
-
-func BenchmarkConvertToJpeg(b *testing.B) {
- options := Options{Type: JPEG}
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkConvertToPng(b *testing.B) {
- options := Options{Type: PNG}
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkConvertToWebp(b *testing.B) {
- options := Options{Type: WEBP}
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkCropJpeg(b *testing.B) {
- options := Options{
- Width: 800,
- Height: 600,
- }
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkCropPng(b *testing.B) {
- options := Options{
- Width: 800,
- Height: 600,
- }
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkCropWebP(b *testing.B) {
- options := Options{
- Width: 800,
- Height: 600,
- }
- runBenchmarkResize("test.webp", options, b)
-}
-
-func BenchmarkExtractJpeg(b *testing.B) {
- options := Options{
- Top: 100,
- Left: 50,
- AreaWidth: 600,
- AreaHeight: 480,
- }
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkExtractPng(b *testing.B) {
- options := Options{
- Top: 100,
- Left: 50,
- AreaWidth: 600,
- AreaHeight: 480,
- }
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkExtractWebp(b *testing.B) {
- options := Options{
- Top: 100,
- Left: 50,
- AreaWidth: 600,
- AreaHeight: 480,
- }
- runBenchmarkResize("test.webp", options, b)
-}
-
-func BenchmarkZoomJpeg(b *testing.B) {
- options := Options{Zoom: 1}
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkZoomPng(b *testing.B) {
- options := Options{Zoom: 1}
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkZoomWebp(b *testing.B) {
- options := Options{Zoom: 1}
- runBenchmarkResize("test.webp", options, b)
-}
-
-func BenchmarkWatermarkJpeg(b *testing.B) {
- options := Options{
- Watermark: Watermark{
- Text: "Chuck Norris (c) 2315",
- Opacity: 0.25,
- Width: 200,
- DPI: 100,
- Margin: 150,
- Font: "sans bold 12",
- Background: Color{255, 255, 255},
- },
- }
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkWatermarPng(b *testing.B) {
- options := Options{
- Watermark: Watermark{
- Text: "Chuck Norris (c) 2315",
- Opacity: 0.25,
- Width: 200,
- DPI: 100,
- Margin: 150,
- Font: "sans bold 12",
- Background: Color{255, 255, 255},
- },
- }
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkWatermarWebp(b *testing.B) {
- options := Options{
- Watermark: Watermark{
- Text: "Chuck Norris (c) 2315",
- Opacity: 0.25,
- Width: 200,
- DPI: 100,
- Margin: 150,
- Font: "sans bold 12",
- Background: Color{255, 255, 255},
- },
- }
- runBenchmarkResize("test.webp", options, b)
-}
-
-func BenchmarkWatermarkImageJpeg(b *testing.B) {
- watermark := readFile("transparent.png")
- options := Options{
- WatermarkImage: WatermarkImage{
- Buf: watermark,
- Opacity: 0.25,
- Left: 100,
- Top: 100,
- },
- }
- runBenchmarkResize("test.jpg", options, b)
-}
-
-func BenchmarkWatermarImagePng(b *testing.B) {
- watermark := readFile("transparent.png")
- options := Options{
- WatermarkImage: WatermarkImage{
- Buf: watermark,
- Opacity: 0.25,
- Left: 100,
- Top: 100,
- },
- }
- runBenchmarkResize("test.png", options, b)
-}
-
-func BenchmarkWatermarImageWebp(b *testing.B) {
- watermark := readFile("transparent.png")
- options := Options{
- WatermarkImage: WatermarkImage{
- Buf: watermark,
- Opacity: 0.25,
- Left: 100,
- Top: 100,
- },
- }
- runBenchmarkResize("test.webp", options, b)
-}
diff --git a/vendor/github.com/h2non/bimg/type.go b/vendor/github.com/h2non/bimg/type.go
deleted file mode 100644
index 260adbf8..00000000
--- a/vendor/github.com/h2non/bimg/type.go
+++ /dev/null
@@ -1,172 +0,0 @@
-package bimg
-
-import (
- "regexp"
- "sync"
- "unicode/utf8"
-)
-
-const (
- // UNKNOWN represents an unknow image type value.
- UNKNOWN ImageType = iota
- // JPEG represents the JPEG image type.
- JPEG
- // WEBP represents the WEBP image type.
- WEBP
- // PNG represents the PNG image type.
- PNG
- // TIFF represents the TIFF image type.
- TIFF
- // GIF represents the GIF image type.
- GIF
- // PDF represents the PDF type.
- PDF
- // SVG represents the SVG image type.
- SVG
- // MAGICK represents the libmagick compatible genetic image type.
- MAGICK
-)
-
-// ImageType represents an image type value.
-type ImageType int
-
-var (
- htmlCommentRegex = regexp.MustCompile("(?i)")
- svgRegex = regexp.MustCompile(`(?i)^\s*(?:<\?xml[^>]*>\s*)?(?:]*>\s*)?