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  }