diff options
author | 6543 <6543@obermui.de> | 2020-09-06 21:53:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-06 20:53:33 +0100 |
commit | f7b3e0602603fda5d8a9b8eb65e0975af7cbe3bc (patch) | |
tree | 51e69fc451b94a783590f9349cd2f0325e6231ee /vendor/github.com/nfnt/resize | |
parent | 332dbe73935ba960d8769bfc20b8d275922e4137 (diff) | |
download | gitea-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.yml | 8 | ||||
-rw-r--r-- | vendor/github.com/nfnt/resize/README.md | 2 | ||||
-rw-r--r-- | vendor/github.com/nfnt/resize/resize.go | 6 | ||||
-rw-r--r-- | vendor/github.com/nfnt/resize/ycc.go | 390 |
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 } |