Skip to content

Commit a8fd765

Browse files
authored
Better builtin avatar generator (#17707)
This PR fixes the builtin avatar generator. 1. The random background color makes some images very dirty. So now we only use white background for avatars. 2. We use left-right mirror avatars to satisfy #14799 3. Fix a small padding error in the algorithm
1 parent 38347aa commit a8fd765

File tree

19 files changed

+417
-376
lines changed

19 files changed

+417
-376
lines changed

build/codeformat/formatimports_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import (
5050
"bytes"
5151
"fmt"
5252
"image"
53-
"image/color/palette"
53+
"image/color"
5454
5555
_ "image/gif" // for processing gif images
5656
_ "image/jpeg" // for processing jpeg images
@@ -76,7 +76,7 @@ import (
7676
"bytes"
7777
"fmt"
7878
"image"
79-
"image/color/palette"
79+
"image/color"
8080
8181
_ "image/gif" // for processing gif images
8282
_ "image/jpeg" // for processing jpeg images

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ require (
6363
github.com/hashicorp/go-version v1.3.1
6464
github.com/hashicorp/golang-lru v0.5.4
6565
github.com/huandu/xstrings v1.3.2
66-
github.com/issue9/identicon v1.2.0
6766
github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7
6867
github.com/json-iterator/go v1.1.11
6968
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -661,10 +661,6 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
661661
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
662662
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
663663
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
664-
github.com/issue9/assert v1.4.1 h1:gUtOpMTeaE4JTe9kACma5foOHBvVt1p5XTFrULDwdXI=
665-
github.com/issue9/assert v1.4.1/go.mod h1:Yktk83hAVl1SPSYtd9kjhBizuiBIqUQyj+D5SE2yjVY=
666-
github.com/issue9/identicon v1.2.0 h1:ek+UcTTyMW/G0iNbLOAlrPC13eSzXTWhbJSs8PHhHGQ=
667-
github.com/issue9/identicon v1.2.0/go.mod h1:A9toNT0ky/1WP5iNFyDmrkNiYH6eX3HcN5V6uH0g0ec=
668664
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
669665
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
670666
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=

modules/avatar/avatar.go

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,15 @@ import (
88
"bytes"
99
"fmt"
1010
"image"
11-
"image/color/palette"
11+
"image/color"
1212

1313
_ "image/gif" // for processing gif images
1414
_ "image/jpeg" // for processing jpeg images
1515
_ "image/png" // for processing png images
1616

17+
"code.gitea.io/gitea/modules/avatar/identicon"
1718
"code.gitea.io/gitea/modules/setting"
18-
"code.gitea.io/gitea/modules/util"
1919

20-
"github.com/issue9/identicon"
2120
"github.com/nfnt/resize"
2221
"github.com/oliamb/cutter"
2322
)
@@ -28,20 +27,8 @@ const AvatarSize = 290
2827
// RandomImageSize generates and returns a random avatar image unique to input data
2928
// in custom size (height and width).
3029
func RandomImageSize(size int, data []byte) (image.Image, error) {
31-
randExtent := len(palette.WebSafe) - 32
32-
integer, err := util.RandomInt(int64(randExtent))
33-
if err != nil {
34-
return nil, fmt.Errorf("util.RandomInt: %v", err)
35-
}
36-
colorIndex := int(integer)
37-
backColorIndex := colorIndex - 1
38-
if backColorIndex < 0 {
39-
backColorIndex = randExtent - 1
40-
}
41-
42-
// Define size, background, and forecolor
43-
imgMaker, err := identicon.New(size,
44-
palette.WebSafe[backColorIndex], palette.WebSafe[colorIndex:colorIndex+32]...)
30+
// we use white as background, and use dark colors to draw blocks
31+
imgMaker, err := identicon.New(size, color.White, identicon.DarkColors...)
4532
if err != nil {
4633
return nil, fmt.Errorf("identicon.New: %v", err)
4734
}

vendor/github.com/issue9/identicon/block.go renamed to modules/avatar/identicon/block.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
1-
// SPDX-License-Identifier: MIT
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
// Copied and modified from https://github.com/issue9/identicon/ (MIT License)
26

37
package identicon
48

59
import "image"
610

711
var (
8-
// 可以出现在中间的方块,一般为了美观,都是对称图像。
12+
// the blocks can appear in center, these blocks can be more beautiful
913
centerBlocks = []blockFunc{b0, b1, b2, b3, b19, b26, b27}
1014

11-
// 所有方块
15+
// all blocks
1216
blocks = []blockFunc{b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27}
1317
)
1418

15-
// 所有 block 函数的类型
1619
type blockFunc func(img *image.Paletted, x, y, size int, angle int)
1720

18-
// 将多边形 points 旋转 angle 个角度,然后输出到 img 上,起点为 x,y 坐标
19-
//
20-
// points 中的坐标是基于左上角是原点的坐标系。
21+
// draw a polygon by points, and the polygon is rotated by angle.
2122
func drawBlock(img *image.Paletted, x, y, size int, angle int, points []int) {
22-
if angle > 0 { // 0 角度不需要转换
23+
if angle != 0 {
2324
m := size / 2
2425
rotate(points, m, m, angle)
2526
}
@@ -33,7 +34,7 @@ func drawBlock(img *image.Paletted, x, y, size int, angle int, points []int) {
3334
}
3435
}
3536

36-
// 全空白
37+
// blank
3738
//
3839
// --------
3940
// | |
@@ -42,7 +43,7 @@ func drawBlock(img *image.Paletted, x, y, size int, angle int, points []int) {
4243
// --------
4344
func b0(img *image.Paletted, x, y, size int, angle int) {}
4445

45-
// 全填充正方形
46+
// full-filled
4647
//
4748
// --------
4849
// |######|
@@ -57,7 +58,7 @@ func b1(img *image.Paletted, x, y, size int, angle int) {
5758
}
5859
}
5960

60-
// 中间小方块
61+
// a small block
6162
// ----------
6263
// | |
6364
// | #### |
@@ -66,8 +67,8 @@ func b1(img *image.Paletted, x, y, size int, angle int) {
6667
// ----------
6768
func b2(img *image.Paletted, x, y, size int, angle int) {
6869
l := size / 4
69-
x = x + l
70-
y = y + l
70+
x += l
71+
y += l
7172

7273
for i := x; i < x+2*l; i++ {
7374
for j := y; j < y+2*l; j++ {
@@ -76,7 +77,7 @@ func b2(img *image.Paletted, x, y, size int, angle int) {
7677
}
7778
}
7879

79-
// 菱形
80+
// diamond
8081
//
8182
// ---------
8283
// | # |
@@ -133,7 +134,7 @@ func b5(img *image.Paletted, x, y, size int, angle int) {
133134
})
134135
}
135136

136-
// b6 矩形
137+
// b6
137138
//
138139
// --------
139140
// |### |
@@ -151,7 +152,7 @@ func b6(img *image.Paletted, x, y, size int, angle int) {
151152
})
152153
}
153154

154-
// b7 斜放的锥形
155+
// b7 italic cone
155156
//
156157
// ---------
157158
// | # |
@@ -170,7 +171,7 @@ func b7(img *image.Paletted, x, y, size int, angle int) {
170171
})
171172
}
172173

173-
// b8 三个堆叠的三角形
174+
// b8 three small triangles
174175
//
175176
// -----------
176177
// | # |
@@ -184,23 +185,23 @@ func b8(img *image.Paletted, x, y, size int, angle int) {
184185
m := size / 2
185186
mm := m / 2
186187

187-
// 顶部三角形
188+
// top
188189
drawBlock(img, x, y, size, angle, []int{
189190
m, 0,
190191
3 * mm, m,
191192
mm, m,
192193
m, 0,
193194
})
194195

195-
// 底下左边
196+
// bottom left
196197
drawBlock(img, x, y, size, angle, []int{
197198
mm, m,
198199
m, size,
199200
0, size,
200201
mm, m,
201202
})
202203

203-
// 底下右边
204+
// bottom right
204205
drawBlock(img, x, y, size, angle, []int{
205206
3 * mm, m,
206207
size, size,
@@ -209,7 +210,7 @@ func b8(img *image.Paletted, x, y, size int, angle int) {
209210
})
210211
}
211212

212-
// b9 斜靠的三角形
213+
// b9 italic triangle
213214
//
214215
// ---------
215216
// |# |
@@ -257,7 +258,7 @@ func b10(img *image.Paletted, x, y, size int, angle int) {
257258
})
258259
}
259260

260-
// b11 左上角1/4大小的方块
261+
// b11
261262
//
262263
// ----------
263264
// |#### |

modules/avatar/identicon/colors.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package identicon
6+
7+
import "image/color"
8+
9+
// DarkColors are dark colors for avatar blocks, they come from image/color/palette.WebSafe, and light colors (0xff) are removed
10+
var DarkColors = []color.Color{
11+
color.RGBA{0x00, 0x00, 0x33, 0xff},
12+
color.RGBA{0x00, 0x00, 0x66, 0xff},
13+
color.RGBA{0x00, 0x00, 0x99, 0xff},
14+
color.RGBA{0x00, 0x00, 0xcc, 0xff},
15+
color.RGBA{0x00, 0x33, 0x00, 0xff},
16+
color.RGBA{0x00, 0x33, 0x33, 0xff},
17+
color.RGBA{0x00, 0x33, 0x66, 0xff},
18+
color.RGBA{0x00, 0x33, 0x99, 0xff},
19+
color.RGBA{0x00, 0x33, 0xcc, 0xff},
20+
color.RGBA{0x00, 0x66, 0x00, 0xff},
21+
color.RGBA{0x00, 0x66, 0x33, 0xff},
22+
color.RGBA{0x00, 0x66, 0x66, 0xff},
23+
color.RGBA{0x00, 0x66, 0x99, 0xff},
24+
color.RGBA{0x00, 0x66, 0xcc, 0xff},
25+
color.RGBA{0x00, 0x99, 0x00, 0xff},
26+
color.RGBA{0x00, 0x99, 0x33, 0xff},
27+
color.RGBA{0x00, 0x99, 0x66, 0xff},
28+
color.RGBA{0x00, 0x99, 0x99, 0xff},
29+
color.RGBA{0x00, 0x99, 0xcc, 0xff},
30+
color.RGBA{0x00, 0xcc, 0x00, 0xff},
31+
color.RGBA{0x00, 0xcc, 0x33, 0xff},
32+
color.RGBA{0x00, 0xcc, 0x66, 0xff},
33+
color.RGBA{0x00, 0xcc, 0x99, 0xff},
34+
color.RGBA{0x00, 0xcc, 0xcc, 0xff},
35+
color.RGBA{0x33, 0x00, 0x00, 0xff},
36+
color.RGBA{0x33, 0x00, 0x33, 0xff},
37+
color.RGBA{0x33, 0x00, 0x66, 0xff},
38+
color.RGBA{0x33, 0x00, 0x99, 0xff},
39+
color.RGBA{0x33, 0x00, 0xcc, 0xff},
40+
color.RGBA{0x33, 0x33, 0x00, 0xff},
41+
color.RGBA{0x33, 0x33, 0x33, 0xff},
42+
color.RGBA{0x33, 0x33, 0x66, 0xff},
43+
color.RGBA{0x33, 0x33, 0x99, 0xff},
44+
color.RGBA{0x33, 0x33, 0xcc, 0xff},
45+
color.RGBA{0x33, 0x66, 0x00, 0xff},
46+
color.RGBA{0x33, 0x66, 0x33, 0xff},
47+
color.RGBA{0x33, 0x66, 0x66, 0xff},
48+
color.RGBA{0x33, 0x66, 0x99, 0xff},
49+
color.RGBA{0x33, 0x66, 0xcc, 0xff},
50+
color.RGBA{0x33, 0x99, 0x00, 0xff},
51+
color.RGBA{0x33, 0x99, 0x33, 0xff},
52+
color.RGBA{0x33, 0x99, 0x66, 0xff},
53+
color.RGBA{0x33, 0x99, 0x99, 0xff},
54+
color.RGBA{0x33, 0x99, 0xcc, 0xff},
55+
color.RGBA{0x33, 0xcc, 0x00, 0xff},
56+
color.RGBA{0x33, 0xcc, 0x33, 0xff},
57+
color.RGBA{0x33, 0xcc, 0x66, 0xff},
58+
color.RGBA{0x33, 0xcc, 0x99, 0xff},
59+
color.RGBA{0x33, 0xcc, 0xcc, 0xff},
60+
color.RGBA{0x66, 0x00, 0x00, 0xff},
61+
color.RGBA{0x66, 0x00, 0x33, 0xff},
62+
color.RGBA{0x66, 0x00, 0x66, 0xff},
63+
color.RGBA{0x66, 0x00, 0x99, 0xff},
64+
color.RGBA{0x66, 0x00, 0xcc, 0xff},
65+
color.RGBA{0x66, 0x33, 0x00, 0xff},
66+
color.RGBA{0x66, 0x33, 0x33, 0xff},
67+
color.RGBA{0x66, 0x33, 0x66, 0xff},
68+
color.RGBA{0x66, 0x33, 0x99, 0xff},
69+
color.RGBA{0x66, 0x33, 0xcc, 0xff},
70+
color.RGBA{0x66, 0x66, 0x00, 0xff},
71+
color.RGBA{0x66, 0x66, 0x33, 0xff},
72+
color.RGBA{0x66, 0x66, 0x66, 0xff},
73+
color.RGBA{0x66, 0x66, 0x99, 0xff},
74+
color.RGBA{0x66, 0x66, 0xcc, 0xff},
75+
color.RGBA{0x66, 0x99, 0x00, 0xff},
76+
color.RGBA{0x66, 0x99, 0x33, 0xff},
77+
color.RGBA{0x66, 0x99, 0x66, 0xff},
78+
color.RGBA{0x66, 0x99, 0x99, 0xff},
79+
color.RGBA{0x66, 0x99, 0xcc, 0xff},
80+
color.RGBA{0x66, 0xcc, 0x00, 0xff},
81+
color.RGBA{0x66, 0xcc, 0x33, 0xff},
82+
color.RGBA{0x66, 0xcc, 0x66, 0xff},
83+
color.RGBA{0x66, 0xcc, 0x99, 0xff},
84+
color.RGBA{0x66, 0xcc, 0xcc, 0xff},
85+
color.RGBA{0x99, 0x00, 0x00, 0xff},
86+
color.RGBA{0x99, 0x00, 0x33, 0xff},
87+
color.RGBA{0x99, 0x00, 0x66, 0xff},
88+
color.RGBA{0x99, 0x00, 0x99, 0xff},
89+
color.RGBA{0x99, 0x00, 0xcc, 0xff},
90+
color.RGBA{0x99, 0x33, 0x00, 0xff},
91+
color.RGBA{0x99, 0x33, 0x33, 0xff},
92+
color.RGBA{0x99, 0x33, 0x66, 0xff},
93+
color.RGBA{0x99, 0x33, 0x99, 0xff},
94+
color.RGBA{0x99, 0x33, 0xcc, 0xff},
95+
color.RGBA{0x99, 0x66, 0x00, 0xff},
96+
color.RGBA{0x99, 0x66, 0x33, 0xff},
97+
color.RGBA{0x99, 0x66, 0x66, 0xff},
98+
color.RGBA{0x99, 0x66, 0x99, 0xff},
99+
color.RGBA{0x99, 0x66, 0xcc, 0xff},
100+
color.RGBA{0x99, 0x99, 0x00, 0xff},
101+
color.RGBA{0x99, 0x99, 0x33, 0xff},
102+
color.RGBA{0x99, 0x99, 0x66, 0xff},
103+
color.RGBA{0x99, 0x99, 0x99, 0xff},
104+
color.RGBA{0x99, 0x99, 0xcc, 0xff},
105+
color.RGBA{0x99, 0xcc, 0x00, 0xff},
106+
color.RGBA{0x99, 0xcc, 0x33, 0xff},
107+
color.RGBA{0x99, 0xcc, 0x66, 0xff},
108+
color.RGBA{0x99, 0xcc, 0x99, 0xff},
109+
color.RGBA{0x99, 0xcc, 0xcc, 0xff},
110+
color.RGBA{0xcc, 0x00, 0x00, 0xff},
111+
color.RGBA{0xcc, 0x00, 0x33, 0xff},
112+
color.RGBA{0xcc, 0x00, 0x66, 0xff},
113+
color.RGBA{0xcc, 0x00, 0x99, 0xff},
114+
color.RGBA{0xcc, 0x00, 0xcc, 0xff},
115+
color.RGBA{0xcc, 0x33, 0x00, 0xff},
116+
color.RGBA{0xcc, 0x33, 0x33, 0xff},
117+
color.RGBA{0xcc, 0x33, 0x66, 0xff},
118+
color.RGBA{0xcc, 0x33, 0x99, 0xff},
119+
color.RGBA{0xcc, 0x33, 0xcc, 0xff},
120+
color.RGBA{0xcc, 0x66, 0x00, 0xff},
121+
color.RGBA{0xcc, 0x66, 0x33, 0xff},
122+
color.RGBA{0xcc, 0x66, 0x66, 0xff},
123+
color.RGBA{0xcc, 0x66, 0x99, 0xff},
124+
color.RGBA{0xcc, 0x66, 0xcc, 0xff},
125+
color.RGBA{0xcc, 0x99, 0x00, 0xff},
126+
color.RGBA{0xcc, 0x99, 0x33, 0xff},
127+
color.RGBA{0xcc, 0x99, 0x66, 0xff},
128+
color.RGBA{0xcc, 0x99, 0x99, 0xff},
129+
color.RGBA{0xcc, 0x99, 0xcc, 0xff},
130+
color.RGBA{0xcc, 0xcc, 0x00, 0xff},
131+
color.RGBA{0xcc, 0xcc, 0x33, 0xff},
132+
color.RGBA{0xcc, 0xcc, 0x66, 0xff},
133+
color.RGBA{0xcc, 0xcc, 0x99, 0xff},
134+
color.RGBA{0xcc, 0xcc, 0xcc, 0xff},
135+
}

0 commit comments

Comments
 (0)