]> source.dussan.org Git - gitea.git/commitdiff
Remove nfnt/resize and oliamb/cutter (#25999)
authorharryzcy <harry@harryzheng.com>
Thu, 20 Jul 2023 11:52:42 +0000 (06:52 -0500)
committerGitHub <noreply@github.com>
Thu, 20 Jul 2023 11:52:42 +0000 (19:52 +0800)
The package `github.com/nfnt/resize` is deprecated and archived by the
author. `github.com/oliamb/cutter` is not maintained since 2018. We
could use `golang.org/x/image/draw` instead.

assets/go-licenses.json
go.mod
go.sum
modules/avatar/avatar.go

index 87f13ad9d58f0c75497c526d78fc31943075bceb..313002e17f33448abccf8f584a0feaa0b821e85f 100644 (file)
     "path": "github.com/nektos/act/pkg/LICENSE",
     "licenseText": "MIT License\n\nCopyright (c) 2022 The Gitea Authors\nCopyright (c) 2019\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
   },
-  {
-    "name": "github.com/nfnt/resize",
-    "path": "github.com/nfnt/resize/LICENSE",
-    "licenseText": "Copyright (c) 2012, Jan Schlicht \u003cjan.schlicht@gmail.com\u003e\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n"
-  },
   {
     "name": "github.com/niklasfasching/go-org/org",
     "path": "github.com/niklasfasching/go-org/org/LICENSE",
     "path": "github.com/olekukonko/tablewriter/LICENSE.md",
     "licenseText": "Copyright (C) 2014 by Oleku Konko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
   },
-  {
-    "name": "github.com/oliamb/cutter",
-    "path": "github.com/oliamb/cutter/LICENSE",
-    "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2014 Olivier Amblet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
-  },
   {
     "name": "github.com/olivere/elastic/v7",
     "path": "github.com/olivere/elastic/v7/LICENSE",
diff --git a/go.mod b/go.mod
index 2b784674d08c3c0ee7503fbeef9ebafc2547ab64..9478ebee2aaa9cda9d9c75d311bc9a266bf437a2 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -81,9 +81,7 @@ require (
        github.com/minio/sha256-simd v1.0.1
        github.com/msteinert/pam v1.1.0
        github.com/nektos/act v0.2.48
-       github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
        github.com/niklasfasching/go-org v1.7.0
-       github.com/oliamb/cutter v0.2.2
        github.com/olivere/elastic/v7 v7.0.32
        github.com/opencontainers/go-digest v1.0.0
        github.com/opencontainers/image-spec v1.1.0-rc4
diff --git a/go.sum b/go.sum
index 8018ceb027ab0c4f1f8ec6320e57f4086c4bce85..c438ea732b62aa3fc3e73d642d9485fa966e3f29 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -921,8 +921,6 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
 github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
-github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/niklasfasching/go-org v1.7.0 h1:vyMdcMWWTe/XmANk19F4k8XGBYg0GQ/gJGMimOjGMek=
 github.com/niklasfasching/go-org v1.7.0/go.mod h1:WuVm4d45oePiE0eX25GqTDQIt/qPW1T9DGkRscqLW5o=
@@ -939,8 +937,6 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
-github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k=
-github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU=
 github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
 github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
index 10de85b74eb36cd7b07d521c3e24b368e7287f35..106215ec0b2b8b805854fc1a176f5e872e1241b3 100644 (file)
@@ -17,8 +17,7 @@ import (
        "code.gitea.io/gitea/modules/avatar/identicon"
        "code.gitea.io/gitea/modules/setting"
 
-       "github.com/nfnt/resize"
-       "github.com/oliamb/cutter"
+       "golang.org/x/image/draw"
 
        _ "golang.org/x/image/webp" // for processing webp images
 )
@@ -81,28 +80,10 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
        }
 
        // try to crop and resize the origin image if necessary
-       if imgCfg.Width != imgCfg.Height {
-               var newSize, ax, ay int
-               if imgCfg.Width > imgCfg.Height {
-                       newSize = imgCfg.Height
-                       ax = (imgCfg.Width - imgCfg.Height) / 2
-               } else {
-                       newSize = imgCfg.Width
-                       ay = (imgCfg.Height - imgCfg.Width) / 2
-               }
-
-               img, err = cutter.Crop(img, cutter.Config{
-                       Width:  newSize,
-                       Height: newSize,
-                       Anchor: image.Point{X: ax, Y: ay},
-               })
-               if err != nil {
-                       return nil, err
-               }
-       }
+       img = cropSquare(img)
 
-       targetSize := uint(DefaultAvatarSize * setting.Avatar.RenderedSizeFactor)
-       img = resize.Resize(targetSize, targetSize, img, resize.Bilinear)
+       targetSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
+       img = scale(img, targetSize, targetSize, draw.BiLinear)
 
        // try to encode the cropped/resized image to png
        bs := bytes.Buffer{}
@@ -124,3 +105,35 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
 func ProcessAvatarImage(data []byte) ([]byte, error) {
        return processAvatarImage(data, setting.Avatar.MaxOriginSize)
 }
+
+// scale resizes the image to width x height using the given scaler.
+func scale(src image.Image, width, height int, scale draw.Scaler) image.Image {
+       rect := image.Rect(0, 0, width, height)
+       dst := image.NewRGBA(rect)
+       scale.Scale(dst, rect, src, src.Bounds(), draw.Over, nil)
+       return dst
+}
+
+// cropSquare crops the largest square image from the center of the image.
+// If the image is already square, it is returned unchanged.
+func cropSquare(src image.Image) image.Image {
+       bounds := src.Bounds()
+       if bounds.Dx() == bounds.Dy() {
+               return src
+       }
+
+       var rect image.Rectangle
+       if bounds.Dx() > bounds.Dy() {
+               // width > height
+               size := bounds.Dy()
+               rect = image.Rect((bounds.Dx()-size)/2, 0, (bounds.Dx()+size)/2, size)
+       } else {
+               // width < height
+               size := bounds.Dx()
+               rect = image.Rect(0, (bounds.Dy()-size)/2, size, (bounds.Dy()+size)/2)
+       }
+
+       dst := image.NewRGBA(rect)
+       draw.Draw(dst, rect, src, rect.Min, draw.Src)
+       return dst
+}