summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/nfnt/resize
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2020-09-06 21:53:33 +0200
committerGitHub <noreply@github.com>2020-09-06 20:53:33 +0100
commitf7b3e0602603fda5d8a9b8eb65e0975af7cbe3bc (patch)
tree51e69fc451b94a783590f9349cd2f0325e6231ee /vendor/github.com/nfnt/resize
parent332dbe73935ba960d8769bfc20b8d275922e4137 (diff)
downloadgitea-f7b3e0602603fda5d8a9b8eb65e0975af7cbe3bc.tar.gz
gitea-f7b3e0602603fda5d8a9b8eb65e0975af7cbe3bc.zip
Fix Avatar Resize (resize algo NearestNeighbor -> Bilinear) (#12745)
* Update Vendor github.com/nfnt/resize * switch resize algo NearestNeighbor -> Bilinear
Diffstat (limited to 'vendor/github.com/nfnt/resize')
-rw-r--r--vendor/github.com/nfnt/resize/.travis.yml8
-rw-r--r--vendor/github.com/nfnt/resize/README.md2
-rw-r--r--vendor/github.com/nfnt/resize/resize.go6
-rw-r--r--vendor/github.com/nfnt/resize/ycc.go390
4 files changed, 287 insertions, 119 deletions
diff --git a/vendor/github.com/nfnt/resize/.travis.yml b/vendor/github.com/nfnt/resize/.travis.yml
index 57bd4a76e8..5ff08e7e4e 100644
--- a/vendor/github.com/nfnt/resize/.travis.yml
+++ b/vendor/github.com/nfnt/resize/.travis.yml
@@ -1,7 +1,7 @@
language: go
go:
- - 1.1
- - 1.2
- - 1.3
- - tip
+ - "1.x"
+ - "1.1"
+ - "1.4"
+ - "1.10"
diff --git a/vendor/github.com/nfnt/resize/README.md b/vendor/github.com/nfnt/resize/README.md
index 2aefa75c94..372777d2eb 100644
--- a/vendor/github.com/nfnt/resize/README.md
+++ b/vendor/github.com/nfnt/resize/README.md
@@ -1,3 +1,5 @@
+# This package is no longer being updated! Please look for alternatives if that bothers you.
+
Resize
======
diff --git a/vendor/github.com/nfnt/resize/resize.go b/vendor/github.com/nfnt/resize/resize.go
index 57bd1fcd03..0d7fbf69a9 100644
--- a/vendor/github.com/nfnt/resize/resize.go
+++ b/vendor/github.com/nfnt/resize/resize.go
@@ -78,6 +78,7 @@ var blur = 1.0
// If one of the parameters width or height is set to 0, its size will be calculated so that
// the aspect ratio is that of the originating image.
// The resizing algorithm uses channels for parallel computation.
+// If the input image has width or height of 0, it is returned unchanged.
func Resize(width, height uint, img image.Image, interp InterpolationFunction) image.Image {
scaleX, scaleY := calcFactors(width, height, float64(img.Bounds().Dx()), float64(img.Bounds().Dy()))
if width == 0 {
@@ -92,6 +93,11 @@ func Resize(width, height uint, img image.Image, interp InterpolationFunction) i
return img
}
+ // Input image has no pixels
+ if img.Bounds().Dx() <= 0 || img.Bounds().Dy() <= 0 {
+ return img
+ }
+
if interp == NearestNeighbor {
return resizeNearest(width, height, scaleX, scaleY, img, interp)
}
diff --git a/vendor/github.com/nfnt/resize/ycc.go b/vendor/github.com/nfnt/resize/ycc.go
index 104159955e..143e4d06ac 100644
--- a/vendor/github.com/nfnt/resize/ycc.go
+++ b/vendor/github.com/nfnt/resize/ycc.go
@@ -88,140 +88,300 @@ func newYCC(r image.Rectangle, s image.YCbCrSubsampleRatio) *ycc {
return &ycc{Pix: buf, Stride: 3 * w, Rect: r, SubsampleRatio: s}
}
+// Copy of image.YCbCrSubsampleRatio constants - this allows us to support
+// older versions of Go where these constants are not defined (i.e. Go 1.4)
+const (
+ ycbcrSubsampleRatio444 image.YCbCrSubsampleRatio = iota
+ ycbcrSubsampleRatio422
+ ycbcrSubsampleRatio420
+ ycbcrSubsampleRatio440
+ ycbcrSubsampleRatio411
+ ycbcrSubsampleRatio410
+)
+
// YCbCr converts ycc to a YCbCr image with the same subsample ratio
// as the YCbCr image that ycc was generated from.
func (p *ycc) YCbCr() *image.YCbCr {
ycbcr := image.NewYCbCr(p.Rect, p.SubsampleRatio)
+ switch ycbcr.SubsampleRatio {
+ case ycbcrSubsampleRatio422:
+ return p.ycbcr422(ycbcr)
+ case ycbcrSubsampleRatio420:
+ return p.ycbcr420(ycbcr)
+ case ycbcrSubsampleRatio440:
+ return p.ycbcr440(ycbcr)
+ case ycbcrSubsampleRatio444:
+ return p.ycbcr444(ycbcr)
+ case ycbcrSubsampleRatio411:
+ return p.ycbcr411(ycbcr)
+ case ycbcrSubsampleRatio410:
+ return p.ycbcr410(ycbcr)
+ }
+ return ycbcr
+}
+
+// imageYCbCrToYCC converts a YCbCr image to a ycc image for resizing.
+func imageYCbCrToYCC(in *image.YCbCr) *ycc {
+ w, h := in.Rect.Dx(), in.Rect.Dy()
+ p := ycc{
+ Pix: make([]uint8, 3*w*h),
+ Stride: 3 * w,
+ Rect: image.Rect(0, 0, w, h),
+ SubsampleRatio: in.SubsampleRatio,
+ }
+ switch in.SubsampleRatio {
+ case ycbcrSubsampleRatio422:
+ return convertToYCC422(in, &p)
+ case ycbcrSubsampleRatio420:
+ return convertToYCC420(in, &p)
+ case ycbcrSubsampleRatio440:
+ return convertToYCC440(in, &p)
+ case ycbcrSubsampleRatio444:
+ return convertToYCC444(in, &p)
+ case ycbcrSubsampleRatio411:
+ return convertToYCC411(in, &p)
+ case ycbcrSubsampleRatio410:
+ return convertToYCC410(in, &p)
+ }
+ return &p
+}
+
+func (p *ycc) ycbcr422(ycbcr *image.YCbCr) *image.YCbCr {
var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := y * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x/2
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
+ }
+ }
+ return ycbcr
+}
- switch ycbcr.SubsampleRatio {
- case image.YCbCrSubsampleRatio422:
- for y := ycbcr.Rect.Min.Y; y < ycbcr.Rect.Max.Y; y++ {
- yy := (y - ycbcr.Rect.Min.Y) * ycbcr.YStride
- cy := (y - ycbcr.Rect.Min.Y) * ycbcr.CStride
- for x := ycbcr.Rect.Min.X; x < ycbcr.Rect.Max.X; x++ {
- xx := (x - ycbcr.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx/2
- ycbcr.Y[yi] = p.Pix[off+0]
- ycbcr.Cb[ci] = p.Pix[off+1]
- ycbcr.Cr[ci] = p.Pix[off+2]
- off += 3
- }
+func (p *ycc) ycbcr420(ycbcr *image.YCbCr) *image.YCbCr {
+ var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := (y / 2) * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x/2
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
}
- case image.YCbCrSubsampleRatio420:
- for y := ycbcr.Rect.Min.Y; y < ycbcr.Rect.Max.Y; y++ {
- yy := (y - ycbcr.Rect.Min.Y) * ycbcr.YStride
- cy := (y/2 - ycbcr.Rect.Min.Y/2) * ycbcr.CStride
- for x := ycbcr.Rect.Min.X; x < ycbcr.Rect.Max.X; x++ {
- xx := (x - ycbcr.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx/2
- ycbcr.Y[yi] = p.Pix[off+0]
- ycbcr.Cb[ci] = p.Pix[off+1]
- ycbcr.Cr[ci] = p.Pix[off+2]
- off += 3
- }
+ }
+ return ycbcr
+}
+
+func (p *ycc) ycbcr440(ycbcr *image.YCbCr) *image.YCbCr {
+ var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := (y / 2) * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
}
- case image.YCbCrSubsampleRatio440:
- for y := ycbcr.Rect.Min.Y; y < ycbcr.Rect.Max.Y; y++ {
- yy := (y - ycbcr.Rect.Min.Y) * ycbcr.YStride
- cy := (y/2 - ycbcr.Rect.Min.Y/2) * ycbcr.CStride
- for x := ycbcr.Rect.Min.X; x < ycbcr.Rect.Max.X; x++ {
- xx := (x - ycbcr.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx
- ycbcr.Y[yi] = p.Pix[off+0]
- ycbcr.Cb[ci] = p.Pix[off+1]
- ycbcr.Cr[ci] = p.Pix[off+2]
- off += 3
- }
+ }
+ return ycbcr
+}
+
+func (p *ycc) ycbcr444(ycbcr *image.YCbCr) *image.YCbCr {
+ var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := y * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
+ }
+ }
+ return ycbcr
+}
+
+func (p *ycc) ycbcr411(ycbcr *image.YCbCr) *image.YCbCr {
+ var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := y * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x/4
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
}
- default:
- // Default to 4:4:4 subsampling.
- for y := ycbcr.Rect.Min.Y; y < ycbcr.Rect.Max.Y; y++ {
- yy := (y - ycbcr.Rect.Min.Y) * ycbcr.YStride
- cy := (y - ycbcr.Rect.Min.Y) * ycbcr.CStride
- for x := ycbcr.Rect.Min.X; x < ycbcr.Rect.Max.X; x++ {
- xx := (x - ycbcr.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx
- ycbcr.Y[yi] = p.Pix[off+0]
- ycbcr.Cb[ci] = p.Pix[off+1]
- ycbcr.Cr[ci] = p.Pix[off+2]
- off += 3
- }
+ }
+ return ycbcr
+}
+
+func (p *ycc) ycbcr410(ycbcr *image.YCbCr) *image.YCbCr {
+ var off int
+ Pix := p.Pix
+ Y := ycbcr.Y
+ Cb := ycbcr.Cb
+ Cr := ycbcr.Cr
+ for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ {
+ yy := y * ycbcr.YStride
+ cy := (y / 2) * ycbcr.CStride
+ for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ {
+ ci := cy + x/4
+ Y[yy+x] = Pix[off+0]
+ Cb[ci] = Pix[off+1]
+ Cr[ci] = Pix[off+2]
+ off += 3
}
}
return ycbcr
}
-// imageYCbCrToYCC converts a YCbCr image to a ycc image for resizing.
-func imageYCbCrToYCC(in *image.YCbCr) *ycc {
- w, h := in.Rect.Dx(), in.Rect.Dy()
- r := image.Rect(0, 0, w, h)
- buf := make([]uint8, 3*w*h)
- p := ycc{Pix: buf, Stride: 3 * w, Rect: r, SubsampleRatio: in.SubsampleRatio}
+func convertToYCC422(in *image.YCbCr, p *ycc) *ycc {
var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := y * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x/2
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
+ }
+ }
+ return p
+}
- switch in.SubsampleRatio {
- case image.YCbCrSubsampleRatio422:
- for y := in.Rect.Min.Y; y < in.Rect.Max.Y; y++ {
- yy := (y - in.Rect.Min.Y) * in.YStride
- cy := (y - in.Rect.Min.Y) * in.CStride
- for x := in.Rect.Min.X; x < in.Rect.Max.X; x++ {
- xx := (x - in.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx/2
- p.Pix[off+0] = in.Y[yi]
- p.Pix[off+1] = in.Cb[ci]
- p.Pix[off+2] = in.Cr[ci]
- off += 3
- }
+func convertToYCC420(in *image.YCbCr, p *ycc) *ycc {
+ var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := (y / 2) * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x/2
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
}
- case image.YCbCrSubsampleRatio420:
- for y := in.Rect.Min.Y; y < in.Rect.Max.Y; y++ {
- yy := (y - in.Rect.Min.Y) * in.YStride
- cy := (y/2 - in.Rect.Min.Y/2) * in.CStride
- for x := in.Rect.Min.X; x < in.Rect.Max.X; x++ {
- xx := (x - in.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx/2
- p.Pix[off+0] = in.Y[yi]
- p.Pix[off+1] = in.Cb[ci]
- p.Pix[off+2] = in.Cr[ci]
- off += 3
- }
+ }
+ return p
+}
+
+func convertToYCC440(in *image.YCbCr, p *ycc) *ycc {
+ var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := (y / 2) * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
}
- case image.YCbCrSubsampleRatio440:
- for y := in.Rect.Min.Y; y < in.Rect.Max.Y; y++ {
- yy := (y - in.Rect.Min.Y) * in.YStride
- cy := (y/2 - in.Rect.Min.Y/2) * in.CStride
- for x := in.Rect.Min.X; x < in.Rect.Max.X; x++ {
- xx := (x - in.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx
- p.Pix[off+0] = in.Y[yi]
- p.Pix[off+1] = in.Cb[ci]
- p.Pix[off+2] = in.Cr[ci]
- off += 3
- }
+ }
+ return p
+}
+
+func convertToYCC444(in *image.YCbCr, p *ycc) *ycc {
+ var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := y * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
}
- default:
- // Default to 4:4:4 subsampling.
- for y := in.Rect.Min.Y; y < in.Rect.Max.Y; y++ {
- yy := (y - in.Rect.Min.Y) * in.YStride
- cy := (y - in.Rect.Min.Y) * in.CStride
- for x := in.Rect.Min.X; x < in.Rect.Max.X; x++ {
- xx := (x - in.Rect.Min.X)
- yi := yy + xx
- ci := cy + xx
- p.Pix[off+0] = in.Y[yi]
- p.Pix[off+1] = in.Cb[ci]
- p.Pix[off+2] = in.Cr[ci]
- off += 3
- }
+ }
+ return p
+}
+
+func convertToYCC411(in *image.YCbCr, p *ycc) *ycc {
+ var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := y * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x/4
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
}
}
- return &p
+ return p
+}
+
+func convertToYCC410(in *image.YCbCr, p *ycc) *ycc {
+ var off int
+ Pix := p.Pix
+ Y := in.Y
+ Cb := in.Cb
+ Cr := in.Cr
+ for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ {
+ yy := y * in.YStride
+ cy := (y / 2) * in.CStride
+ for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ {
+ ci := cy + x/4
+ Pix[off+0] = Y[yy+x]
+ Pix[off+1] = Cb[ci]
+ Pix[off+2] = Cr[ci]
+ off += 3
+ }
+ }
+ return p
}