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