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  }