123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717 |
- // Copyright 2021 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- // Copied and modified from https://github.com/issue9/identicon/ (MIT License)
-
- package identicon
-
- import "image"
-
- var (
- // the blocks can appear in center, these blocks can be more beautiful
- centerBlocks = []blockFunc{b0, b1, b2, b3, b19, b26, b27}
-
- // all blocks
- 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}
- )
-
- type blockFunc func(img *image.Paletted, x, y, size int, angle int)
-
- // draw a polygon by points, and the polygon is rotated by angle.
- func drawBlock(img *image.Paletted, x, y, size int, angle int, points []int) {
- if angle != 0 {
- m := size / 2
- rotate(points, m, m, angle)
- }
-
- for i := 0; i < size; i++ {
- for j := 0; j < size; j++ {
- if pointInPolygon(i, j, points) {
- img.SetColorIndex(x+i, y+j, 1)
- }
- }
- }
- }
-
- // blank
- //
- // --------
- // | |
- // | |
- // | |
- // --------
- func b0(img *image.Paletted, x, y, size int, angle int) {}
-
- // full-filled
- //
- // --------
- // |######|
- // |######|
- // |######|
- // --------
- func b1(img *image.Paletted, x, y, size int, angle int) {
- for i := x; i < x+size; i++ {
- for j := y; j < y+size; j++ {
- img.SetColorIndex(i, j, 1)
- }
- }
- }
-
- // a small block
- // ----------
- // | |
- // | #### |
- // | #### |
- // | |
- // ----------
- func b2(img *image.Paletted, x, y, size int, angle int) {
- l := size / 4
- x += l
- y += l
-
- for i := x; i < x+2*l; i++ {
- for j := y; j < y+2*l; j++ {
- img.SetColorIndex(i, j, 1)
- }
- }
- }
-
- // diamond
- //
- // ---------
- // | # |
- // | ### |
- // | ##### |
- // |#######|
- // | ##### |
- // | ### |
- // | # |
- // ---------
- func b3(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, 0, []int{
- m, 0,
- size, m,
- m, size,
- 0, m,
- m, 0,
- })
- }
-
- // b4
- //
- // -------
- // |#####|
- // |#### |
- // |### |
- // |## |
- // |# |
- // |------
- func b4(img *image.Paletted, x, y, size int, angle int) {
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- size, 0,
- 0, size,
- 0, 0,
- })
- }
-
- // b5
- //
- // ---------
- // | # |
- // | ### |
- // | ##### |
- // |#######|
- func b5(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- size, size,
- 0, size,
- m, 0,
- })
- }
-
- // b6
- //
- // --------
- // |### |
- // |### |
- // |### |
- // --------
- func b6(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- m, size,
- 0, size,
- 0, 0,
- })
- }
-
- // b7 italic cone
- //
- // ---------
- // | # |
- // | ## |
- // | #####|
- // | ####|
- // |--------
- func b7(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- size, m,
- size, size,
- m, size,
- 0, 0,
- })
- }
-
- // b8 three small triangles
- //
- // -----------
- // | # |
- // | ### |
- // | ##### |
- // | # # |
- // | ### ### |
- // |#########|
- // -----------
- func b8(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- mm := m / 2
-
- // top
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- 3 * mm, m,
- mm, m,
- m, 0,
- })
-
- // bottom left
- drawBlock(img, x, y, size, angle, []int{
- mm, m,
- m, size,
- 0, size,
- mm, m,
- })
-
- // bottom right
- drawBlock(img, x, y, size, angle, []int{
- 3 * mm, m,
- size, size,
- m, size,
- 3 * mm, m,
- })
- }
-
- // b9 italic triangle
- //
- // ---------
- // |# |
- // | #### |
- // | #####|
- // | #### |
- // | # |
- // ---------
- func b9(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- size, m,
- m, size,
- 0, 0,
- })
- }
-
- // b10
- //
- // ----------
- // | ####|
- // | ### |
- // | ## |
- // | # |
- // |#### |
- // |### |
- // |## |
- // |# |
- // ----------
- func b10(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- size, 0,
- m, m,
- m, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- 0, m,
- m, m,
- 0, size,
- 0, m,
- })
- }
-
- // b11
- //
- // ----------
- // |#### |
- // |#### |
- // |#### |
- // | |
- // | |
- // ----------
- func b11(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- m, m,
- 0, m,
- 0, 0,
- })
- }
-
- // b12
- //
- // -----------
- // | |
- // | |
- // |#########|
- // | ##### |
- // | # |
- // -----------
- func b12(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, m,
- size, m,
- m, size,
- 0, m,
- })
- }
-
- // b13
- //
- // -----------
- // | |
- // | |
- // | # |
- // | ##### |
- // |#########|
- // -----------
- func b13(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- m, m,
- size, size,
- 0, size,
- m, m,
- })
- }
-
- // b14
- //
- // ---------
- // | # |
- // | ### |
- // |#### |
- // | |
- // | |
- // ---------
- func b14(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- m, m,
- 0, m,
- m, 0,
- })
- }
-
- // b15
- //
- // ----------
- // |##### |
- // |### |
- // |# |
- // | |
- // | |
- // ----------
- func b15(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- 0, m,
- 0, 0,
- })
- }
-
- // b16
- //
- // ---------
- // | # |
- // | ##### |
- // |#######|
- // | # |
- // | ##### |
- // |#######|
- // ---------
- func b16(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- size, m,
- 0, m,
- m, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- m, m,
- size, size,
- 0, size,
- m, m,
- })
- }
-
- // b17
- //
- // ----------
- // |##### |
- // |### |
- // |# |
- // | ##|
- // | ##|
- // ----------
- func b17(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- 0, m,
- 0, 0,
- })
-
- quarter := size / 4
- drawBlock(img, x, y, size, angle, []int{
- size - quarter, size - quarter,
- size, size - quarter,
- size, size,
- size - quarter, size,
- size - quarter, size - quarter,
- })
- }
-
- // b18
- //
- // ----------
- // |##### |
- // |#### |
- // |### |
- // |## |
- // |# |
- // ----------
- func b18(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- 0, size,
- 0, 0,
- })
- }
-
- // b19
- //
- // ----------
- // |########|
- // |### ###|
- // |# #|
- // |### ###|
- // |########|
- // ----------
- func b19(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, 0,
- 0, m,
- 0, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- size, 0,
- size, m,
- m, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- size, m,
- size, size,
- m, size,
- size, m,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- 0, m,
- m, size,
- 0, size,
- 0, m,
- })
- }
-
- // b20
- //
- // ----------
- // | ## |
- // |### |
- // |## |
- // |## |
- // |# |
- // ----------
- func b20(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- 0, size,
- 0, m,
- q, 0,
- })
- }
-
- // b21
- //
- // ----------
- // | #### |
- // |## #####|
- // |## ##|
- // |## |
- // |# |
- // ----------
- func b21(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- 0, size,
- 0, m,
- q, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- size, q,
- size, m,
- q, 0,
- })
- }
-
- // b22
- //
- // ----------
- // | #### |
- // |## ### |
- // |## ##|
- // |## ##|
- // |# #|
- // ----------
- func b22(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- 0, size,
- 0, m,
- q, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- size, q,
- size, size,
- q, 0,
- })
- }
-
- // b23
- //
- // ----------
- // | #######|
- // |### #|
- // |## |
- // |## |
- // |# |
- // ----------
- func b23(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- 0, size,
- 0, m,
- q, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- size, 0,
- size, q,
- q, 0,
- })
- }
-
- // b24
- //
- // ----------
- // | ## ###|
- // |### ###|
- // |## ## |
- // |## ## |
- // |# # |
- // ----------
- func b24(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- q, 0,
- 0, size,
- 0, m,
- q, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- m, 0,
- size, 0,
- m, size,
- m, 0,
- })
- }
-
- // b25
- //
- // ----------
- // |# #|
- // |## ###|
- // |## ## |
- // |###### |
- // |#### |
- // ----------
- func b25(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- 0, size,
- q, size,
- 0, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- 0, m,
- size, 0,
- q, size,
- 0, m,
- })
- }
-
- // b26
- //
- // ----------
- // |# #|
- // |### ###|
- // | #### |
- // |### ###|
- // |# #|
- // ----------
- func b26(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- m, q,
- q, m,
- 0, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- size, 0,
- m + q, m,
- m, q,
- size, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- size, size,
- m, m + q,
- q + m, m,
- size, size,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- 0, size,
- q, m,
- m, q + m,
- 0, size,
- })
- }
-
- // b27
- //
- // ----------
- // |########|
- // |## ###|
- // |# #|
- // |### ##|
- // |########|
- // ----------
- func b27(img *image.Paletted, x, y, size int, angle int) {
- m := size / 2
- q := size / 4
-
- drawBlock(img, x, y, size, angle, []int{
- 0, 0,
- size, 0,
- 0, q,
- 0, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- q + m, 0,
- size, 0,
- size, size,
- q + m, 0,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- size, q + m,
- size, size,
- 0, size,
- size, q + m,
- })
-
- drawBlock(img, x, y, size, angle, []int{
- 0, size,
- 0, 0,
- q, size,
- 0, size,
- })
- }
|