code.gitea.io/gitea@v1.19.3/modules/avatar/identicon/block.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 // Copied and modified from https://github.com/issue9/identicon/ (MIT License) 5 6 package identicon 7 8 import "image" 9 10 var ( 11 // the blocks can appear in center, these blocks can be more beautiful 12 centerBlocks = []blockFunc{b0, b1, b2, b3, b19, b26, b27} 13 14 // all blocks 15 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} 16 ) 17 18 type blockFunc func(img *image.Paletted, x, y, size, angle int) 19 20 // draw a polygon by points, and the polygon is rotated by angle. 21 func drawBlock(img *image.Paletted, x, y, size, angle int, points []int) { 22 if angle != 0 { 23 m := size / 2 24 rotate(points, m, m, angle) 25 } 26 27 for i := 0; i < size; i++ { 28 for j := 0; j < size; j++ { 29 if pointInPolygon(i, j, points) { 30 img.SetColorIndex(x+i, y+j, 1) 31 } 32 } 33 } 34 } 35 36 // blank 37 // 38 // -------- 39 // | | 40 // | | 41 // | | 42 // -------- 43 func b0(img *image.Paletted, x, y, size, angle int) {} 44 45 // full-filled 46 // 47 // -------- 48 // |######| 49 // |######| 50 // |######| 51 // -------- 52 func b1(img *image.Paletted, x, y, size, angle int) { 53 for i := x; i < x+size; i++ { 54 for j := y; j < y+size; j++ { 55 img.SetColorIndex(i, j, 1) 56 } 57 } 58 } 59 60 // a small block 61 // 62 // ---------- 63 // | | 64 // | #### | 65 // | #### | 66 // | | 67 // ---------- 68 func b2(img *image.Paletted, x, y, size, angle int) { 69 l := size / 4 70 x += l 71 y += l 72 73 for i := x; i < x+2*l; i++ { 74 for j := y; j < y+2*l; j++ { 75 img.SetColorIndex(i, j, 1) 76 } 77 } 78 } 79 80 // diamond 81 // 82 // --------- 83 // | # | 84 // | ### | 85 // | ##### | 86 // |#######| 87 // | ##### | 88 // | ### | 89 // | # | 90 // --------- 91 func b3(img *image.Paletted, x, y, size, angle int) { 92 m := size / 2 93 drawBlock(img, x, y, size, 0, []int{ 94 m, 0, 95 size, m, 96 m, size, 97 0, m, 98 m, 0, 99 }) 100 } 101 102 // b4 103 // 104 // ------- 105 // |#####| 106 // |#### | 107 // |### | 108 // |## | 109 // |# | 110 // |------ 111 func b4(img *image.Paletted, x, y, size, angle int) { 112 drawBlock(img, x, y, size, angle, []int{ 113 0, 0, 114 size, 0, 115 0, size, 116 0, 0, 117 }) 118 } 119 120 // b5 121 // 122 // --------- 123 // | # | 124 // | ### | 125 // | ##### | 126 // |#######| 127 func b5(img *image.Paletted, x, y, size, angle int) { 128 m := size / 2 129 drawBlock(img, x, y, size, angle, []int{ 130 m, 0, 131 size, size, 132 0, size, 133 m, 0, 134 }) 135 } 136 137 // b6 138 // 139 // -------- 140 // |### | 141 // |### | 142 // |### | 143 // -------- 144 func b6(img *image.Paletted, x, y, size, angle int) { 145 m := size / 2 146 drawBlock(img, x, y, size, angle, []int{ 147 0, 0, 148 m, 0, 149 m, size, 150 0, size, 151 0, 0, 152 }) 153 } 154 155 // b7 italic cone 156 // 157 // --------- 158 // | # | 159 // | ## | 160 // | #####| 161 // | ####| 162 // |-------- 163 func b7(img *image.Paletted, x, y, size, angle int) { 164 m := size / 2 165 drawBlock(img, x, y, size, angle, []int{ 166 0, 0, 167 size, m, 168 size, size, 169 m, size, 170 0, 0, 171 }) 172 } 173 174 // b8 three small triangles 175 // 176 // ----------- 177 // | # | 178 // | ### | 179 // | ##### | 180 // | # # | 181 // | ### ### | 182 // |#########| 183 // ----------- 184 func b8(img *image.Paletted, x, y, size, angle int) { 185 m := size / 2 186 mm := m / 2 187 188 // top 189 drawBlock(img, x, y, size, angle, []int{ 190 m, 0, 191 3 * mm, m, 192 mm, m, 193 m, 0, 194 }) 195 196 // bottom left 197 drawBlock(img, x, y, size, angle, []int{ 198 mm, m, 199 m, size, 200 0, size, 201 mm, m, 202 }) 203 204 // bottom right 205 drawBlock(img, x, y, size, angle, []int{ 206 3 * mm, m, 207 size, size, 208 m, size, 209 3 * mm, m, 210 }) 211 } 212 213 // b9 italic triangle 214 // 215 // --------- 216 // |# | 217 // | #### | 218 // | #####| 219 // | #### | 220 // | # | 221 // --------- 222 func b9(img *image.Paletted, x, y, size, angle int) { 223 m := size / 2 224 drawBlock(img, x, y, size, angle, []int{ 225 0, 0, 226 size, m, 227 m, size, 228 0, 0, 229 }) 230 } 231 232 // b10 233 // 234 // ---------- 235 // | ####| 236 // | ### | 237 // | ## | 238 // | # | 239 // |#### | 240 // |### | 241 // |## | 242 // |# | 243 // ---------- 244 func b10(img *image.Paletted, x, y, size, angle int) { 245 m := size / 2 246 drawBlock(img, x, y, size, angle, []int{ 247 m, 0, 248 size, 0, 249 m, m, 250 m, 0, 251 }) 252 253 drawBlock(img, x, y, size, angle, []int{ 254 0, m, 255 m, m, 256 0, size, 257 0, m, 258 }) 259 } 260 261 // b11 262 // 263 // ---------- 264 // |#### | 265 // |#### | 266 // |#### | 267 // | | 268 // | | 269 // ---------- 270 func b11(img *image.Paletted, x, y, size, angle int) { 271 m := size / 2 272 drawBlock(img, x, y, size, angle, []int{ 273 0, 0, 274 m, 0, 275 m, m, 276 0, m, 277 0, 0, 278 }) 279 } 280 281 // b12 282 // 283 // ----------- 284 // | | 285 // | | 286 // |#########| 287 // | ##### | 288 // | # | 289 // ----------- 290 func b12(img *image.Paletted, x, y, size, angle int) { 291 m := size / 2 292 drawBlock(img, x, y, size, angle, []int{ 293 0, m, 294 size, m, 295 m, size, 296 0, m, 297 }) 298 } 299 300 // b13 301 // 302 // ----------- 303 // | | 304 // | | 305 // | # | 306 // | ##### | 307 // |#########| 308 // ----------- 309 func b13(img *image.Paletted, x, y, size, angle int) { 310 m := size / 2 311 drawBlock(img, x, y, size, angle, []int{ 312 m, m, 313 size, size, 314 0, size, 315 m, m, 316 }) 317 } 318 319 // b14 320 // 321 // --------- 322 // | # | 323 // | ### | 324 // |#### | 325 // | | 326 // | | 327 // --------- 328 func b14(img *image.Paletted, x, y, size, angle int) { 329 m := size / 2 330 drawBlock(img, x, y, size, angle, []int{ 331 m, 0, 332 m, m, 333 0, m, 334 m, 0, 335 }) 336 } 337 338 // b15 339 // 340 // ---------- 341 // |##### | 342 // |### | 343 // |# | 344 // | | 345 // | | 346 // ---------- 347 func b15(img *image.Paletted, x, y, size, angle int) { 348 m := size / 2 349 drawBlock(img, x, y, size, angle, []int{ 350 0, 0, 351 m, 0, 352 0, m, 353 0, 0, 354 }) 355 } 356 357 // b16 358 // 359 // --------- 360 // | # | 361 // | ##### | 362 // |#######| 363 // | # | 364 // | ##### | 365 // |#######| 366 // --------- 367 func b16(img *image.Paletted, x, y, size, angle int) { 368 m := size / 2 369 drawBlock(img, x, y, size, angle, []int{ 370 m, 0, 371 size, m, 372 0, m, 373 m, 0, 374 }) 375 376 drawBlock(img, x, y, size, angle, []int{ 377 m, m, 378 size, size, 379 0, size, 380 m, m, 381 }) 382 } 383 384 // b17 385 // 386 // ---------- 387 // |##### | 388 // |### | 389 // |# | 390 // | ##| 391 // | ##| 392 // ---------- 393 func b17(img *image.Paletted, x, y, size, angle int) { 394 m := size / 2 395 396 drawBlock(img, x, y, size, angle, []int{ 397 0, 0, 398 m, 0, 399 0, m, 400 0, 0, 401 }) 402 403 quarter := size / 4 404 drawBlock(img, x, y, size, angle, []int{ 405 size - quarter, size - quarter, 406 size, size - quarter, 407 size, size, 408 size - quarter, size, 409 size - quarter, size - quarter, 410 }) 411 } 412 413 // b18 414 // 415 // ---------- 416 // |##### | 417 // |#### | 418 // |### | 419 // |## | 420 // |# | 421 // ---------- 422 func b18(img *image.Paletted, x, y, size, angle int) { 423 m := size / 2 424 425 drawBlock(img, x, y, size, angle, []int{ 426 0, 0, 427 m, 0, 428 0, size, 429 0, 0, 430 }) 431 } 432 433 // b19 434 // 435 // ---------- 436 // |########| 437 // |### ###| 438 // |# #| 439 // |### ###| 440 // |########| 441 // ---------- 442 func b19(img *image.Paletted, x, y, size, angle int) { 443 m := size / 2 444 445 drawBlock(img, x, y, size, angle, []int{ 446 0, 0, 447 m, 0, 448 0, m, 449 0, 0, 450 }) 451 452 drawBlock(img, x, y, size, angle, []int{ 453 m, 0, 454 size, 0, 455 size, m, 456 m, 0, 457 }) 458 459 drawBlock(img, x, y, size, angle, []int{ 460 size, m, 461 size, size, 462 m, size, 463 size, m, 464 }) 465 466 drawBlock(img, x, y, size, angle, []int{ 467 0, m, 468 m, size, 469 0, size, 470 0, m, 471 }) 472 } 473 474 // b20 475 // 476 // ---------- 477 // | ## | 478 // |### | 479 // |## | 480 // |## | 481 // |# | 482 // ---------- 483 func b20(img *image.Paletted, x, y, size, angle int) { 484 m := size / 2 485 q := size / 4 486 487 drawBlock(img, x, y, size, angle, []int{ 488 q, 0, 489 0, size, 490 0, m, 491 q, 0, 492 }) 493 } 494 495 // b21 496 // 497 // ---------- 498 // | #### | 499 // |## #####| 500 // |## ##| 501 // |## | 502 // |# | 503 // ---------- 504 func b21(img *image.Paletted, x, y, size, angle int) { 505 m := size / 2 506 q := size / 4 507 508 drawBlock(img, x, y, size, angle, []int{ 509 q, 0, 510 0, size, 511 0, m, 512 q, 0, 513 }) 514 515 drawBlock(img, x, y, size, angle, []int{ 516 q, 0, 517 size, q, 518 size, m, 519 q, 0, 520 }) 521 } 522 523 // b22 524 // 525 // ---------- 526 // | #### | 527 // |## ### | 528 // |## ##| 529 // |## ##| 530 // |# #| 531 // ---------- 532 func b22(img *image.Paletted, x, y, size, angle int) { 533 m := size / 2 534 q := size / 4 535 536 drawBlock(img, x, y, size, angle, []int{ 537 q, 0, 538 0, size, 539 0, m, 540 q, 0, 541 }) 542 543 drawBlock(img, x, y, size, angle, []int{ 544 q, 0, 545 size, q, 546 size, size, 547 q, 0, 548 }) 549 } 550 551 // b23 552 // 553 // ---------- 554 // | #######| 555 // |### #| 556 // |## | 557 // |## | 558 // |# | 559 // ---------- 560 func b23(img *image.Paletted, x, y, size, angle int) { 561 m := size / 2 562 q := size / 4 563 564 drawBlock(img, x, y, size, angle, []int{ 565 q, 0, 566 0, size, 567 0, m, 568 q, 0, 569 }) 570 571 drawBlock(img, x, y, size, angle, []int{ 572 q, 0, 573 size, 0, 574 size, q, 575 q, 0, 576 }) 577 } 578 579 // b24 580 // 581 // ---------- 582 // | ## ###| 583 // |### ###| 584 // |## ## | 585 // |## ## | 586 // |# # | 587 // ---------- 588 func b24(img *image.Paletted, x, y, size, angle int) { 589 m := size / 2 590 q := size / 4 591 592 drawBlock(img, x, y, size, angle, []int{ 593 q, 0, 594 0, size, 595 0, m, 596 q, 0, 597 }) 598 599 drawBlock(img, x, y, size, angle, []int{ 600 m, 0, 601 size, 0, 602 m, size, 603 m, 0, 604 }) 605 } 606 607 // b25 608 // 609 // ---------- 610 // |# #| 611 // |## ###| 612 // |## ## | 613 // |###### | 614 // |#### | 615 // ---------- 616 func b25(img *image.Paletted, x, y, size, angle int) { 617 m := size / 2 618 q := size / 4 619 620 drawBlock(img, x, y, size, angle, []int{ 621 0, 0, 622 0, size, 623 q, size, 624 0, 0, 625 }) 626 627 drawBlock(img, x, y, size, angle, []int{ 628 0, m, 629 size, 0, 630 q, size, 631 0, m, 632 }) 633 } 634 635 // b26 636 // 637 // ---------- 638 // |# #| 639 // |### ###| 640 // | #### | 641 // |### ###| 642 // |# #| 643 // ---------- 644 func b26(img *image.Paletted, x, y, size, angle int) { 645 m := size / 2 646 q := size / 4 647 648 drawBlock(img, x, y, size, angle, []int{ 649 0, 0, 650 m, q, 651 q, m, 652 0, 0, 653 }) 654 655 drawBlock(img, x, y, size, angle, []int{ 656 size, 0, 657 m + q, m, 658 m, q, 659 size, 0, 660 }) 661 662 drawBlock(img, x, y, size, angle, []int{ 663 size, size, 664 m, m + q, 665 q + m, m, 666 size, size, 667 }) 668 669 drawBlock(img, x, y, size, angle, []int{ 670 0, size, 671 q, m, 672 m, q + m, 673 0, size, 674 }) 675 } 676 677 // b27 678 // 679 // ---------- 680 // |########| 681 // |## ###| 682 // |# #| 683 // |### ##| 684 // |########| 685 // ---------- 686 func b27(img *image.Paletted, x, y, size, angle int) { 687 m := size / 2 688 q := size / 4 689 690 drawBlock(img, x, y, size, angle, []int{ 691 0, 0, 692 size, 0, 693 0, q, 694 0, 0, 695 }) 696 697 drawBlock(img, x, y, size, angle, []int{ 698 q + m, 0, 699 size, 0, 700 size, size, 701 q + m, 0, 702 }) 703 704 drawBlock(img, x, y, size, angle, []int{ 705 size, q + m, 706 size, size, 707 0, size, 708 size, q + m, 709 }) 710 711 drawBlock(img, x, y, size, angle, []int{ 712 0, size, 713 0, 0, 714 q, size, 715 0, size, 716 }) 717 }