Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 24 additions & 19 deletions modules/avatar/avatar.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,27 @@ import (
"image/color"
"image/png"

_ "image/gif" // for processing gif images
_ "image/jpeg" // for processing jpeg images
_ "image/gif" // for image format registration
_ "image/jpeg" // for image format registration

"code.gitea.io/gitea/modules/avatar/identicon"
"code.gitea.io/gitea/modules/setting"

"golang.org/x/image/draw"

_ "golang.org/x/image/webp" // for processing webp images
_ "golang.org/x/image/webp" // for image format registration
)

// DefaultAvatarSize is the target CSS pixel size for avatar generation. It is
// multiplied by setting.Avatar.RenderedSizeFactor and the resulting size is the
// usual size of avatar image saved on server, unless the original file is smaller
// than the size after resizing.
const DefaultAvatarSize = 256

// RandomImageSize generates and returns a random avatar image unique to input data
// in custom size (height and width).
func RandomImageSize(size int, data []byte) (image.Image, error) {
// we use white as background, and use dark colors to draw blocks
imgMaker, err := identicon.New(size, color.White, identicon.DarkColors...)
// Use transparent background instead of white
imgMaker, err := identicon.New(size, color.Transparent, identicon.DarkColors...)
if err != nil {
return nil, fmt.Errorf("identicon.New: %w", err)
}
Expand Down Expand Up @@ -66,11 +65,14 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
return nil, fmt.Errorf("image height is too large: %d > %d", imgCfg.Height, setting.Avatar.MaxHeight)
}

// If the origin is small enough, just use it, then APNG could be supported,
// otherwise, if the image is processed later, APNG loses animation.
// And one more thing, webp is not fully supported, for animated webp, image.DecodeConfig works but Decode fails.
// So for animated webp, if the uploaded file is smaller than maxOriginSize, it will be used, if it's larger, there will be an error.
if len(data) < int(maxOriginSize) {
// Check max origin size if specified (for animated images)
if maxOriginSize > 0 && len(data) < int(maxOriginSize) {
return data, nil
}

// If the origin is small enough (both dimensions <= target size), just use it
targetSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
if imgCfg.Width <= targetSize && imgCfg.Height <= targetSize {
return data, nil
}

Expand All @@ -82,21 +84,24 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
// try to crop and resize the origin image if necessary
img = cropSquare(img)

targetSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
if setting.Avatar.RenderedSizeFactor > 0 {
targetSize = DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
}
img = scale(img, targetSize, targetSize, draw.BiLinear)

// try to encode the cropped/resized image to png
// Create a new RGBA image to preserve transparency
dst := image.NewRGBA(image.Rect(0, 0, img.Bounds().Dx(), img.Bounds().Dy()))
draw.Draw(dst, dst.Bounds(), image.Transparent, image.Point{}, draw.Src)
draw.Draw(dst, img.Bounds(), img, img.Bounds().Min, draw.Over)

// Encode the image to PNG with transparency
bs := bytes.Buffer{}
if err = png.Encode(&bs, img); err != nil {
if err = png.Encode(&bs, dst); err != nil {
return nil, err
}
resized := bs.Bytes()

// usually the png compression is not good enough, use the original image (no cropping/resizing) if the origin is smaller
if len(data) <= len(resized) {
return data, nil
}

// Always use the processed image to ensure transparency
return resized, nil
}

Expand Down
248 changes: 124 additions & 124 deletions modules/avatar/identicon/colors.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,128 +7,128 @@ import "image/color"

// DarkColors are dark colors for avatar blocks, they come from image/color/palette.WebSafe, and light colors (0xff) are removed
var DarkColors = []color.Color{
color.RGBA{0x00, 0x00, 0x33, 0xff},
color.RGBA{0x00, 0x00, 0x66, 0xff},
color.RGBA{0x00, 0x00, 0x99, 0xff},
color.RGBA{0x00, 0x00, 0xcc, 0xff},
color.RGBA{0x00, 0x33, 0x00, 0xff},
color.RGBA{0x00, 0x33, 0x33, 0xff},
color.RGBA{0x00, 0x33, 0x66, 0xff},
color.RGBA{0x00, 0x33, 0x99, 0xff},
color.RGBA{0x00, 0x33, 0xcc, 0xff},
color.RGBA{0x00, 0x66, 0x00, 0xff},
color.RGBA{0x00, 0x66, 0x33, 0xff},
color.RGBA{0x00, 0x66, 0x66, 0xff},
color.RGBA{0x00, 0x66, 0x99, 0xff},
color.RGBA{0x00, 0x66, 0xcc, 0xff},
color.RGBA{0x00, 0x99, 0x00, 0xff},
color.RGBA{0x00, 0x99, 0x33, 0xff},
color.RGBA{0x00, 0x99, 0x66, 0xff},
color.RGBA{0x00, 0x99, 0x99, 0xff},
color.RGBA{0x00, 0x99, 0xcc, 0xff},
color.RGBA{0x00, 0xcc, 0x00, 0xff},
color.RGBA{0x00, 0xcc, 0x33, 0xff},
color.RGBA{0x00, 0xcc, 0x66, 0xff},
color.RGBA{0x00, 0xcc, 0x99, 0xff},
color.RGBA{0x00, 0xcc, 0xcc, 0xff},
color.RGBA{0x33, 0x00, 0x00, 0xff},
color.RGBA{0x33, 0x00, 0x33, 0xff},
color.RGBA{0x33, 0x00, 0x66, 0xff},
color.RGBA{0x33, 0x00, 0x99, 0xff},
color.RGBA{0x33, 0x00, 0xcc, 0xff},
color.RGBA{0x33, 0x33, 0x00, 0xff},
color.RGBA{0x33, 0x33, 0x33, 0xff},
color.RGBA{0x33, 0x33, 0x66, 0xff},
color.RGBA{0x33, 0x33, 0x99, 0xff},
color.RGBA{0x33, 0x33, 0xcc, 0xff},
color.RGBA{0x33, 0x66, 0x00, 0xff},
color.RGBA{0x33, 0x66, 0x33, 0xff},
color.RGBA{0x33, 0x66, 0x66, 0xff},
color.RGBA{0x33, 0x66, 0x99, 0xff},
color.RGBA{0x33, 0x66, 0xcc, 0xff},
color.RGBA{0x33, 0x99, 0x00, 0xff},
color.RGBA{0x33, 0x99, 0x33, 0xff},
color.RGBA{0x33, 0x99, 0x66, 0xff},
color.RGBA{0x33, 0x99, 0x99, 0xff},
color.RGBA{0x33, 0x99, 0xcc, 0xff},
color.RGBA{0x33, 0xcc, 0x00, 0xff},
color.RGBA{0x33, 0xcc, 0x33, 0xff},
color.RGBA{0x33, 0xcc, 0x66, 0xff},
color.RGBA{0x33, 0xcc, 0x99, 0xff},
color.RGBA{0x33, 0xcc, 0xcc, 0xff},
color.RGBA{0x66, 0x00, 0x00, 0xff},
color.RGBA{0x66, 0x00, 0x33, 0xff},
color.RGBA{0x66, 0x00, 0x66, 0xff},
color.RGBA{0x66, 0x00, 0x99, 0xff},
color.RGBA{0x66, 0x00, 0xcc, 0xff},
color.RGBA{0x66, 0x33, 0x00, 0xff},
color.RGBA{0x66, 0x33, 0x33, 0xff},
color.RGBA{0x66, 0x33, 0x66, 0xff},
color.RGBA{0x66, 0x33, 0x99, 0xff},
color.RGBA{0x66, 0x33, 0xcc, 0xff},
color.RGBA{0x66, 0x66, 0x00, 0xff},
color.RGBA{0x66, 0x66, 0x33, 0xff},
color.RGBA{0x66, 0x66, 0x66, 0xff},
color.RGBA{0x66, 0x66, 0x99, 0xff},
color.RGBA{0x66, 0x66, 0xcc, 0xff},
color.RGBA{0x66, 0x99, 0x00, 0xff},
color.RGBA{0x66, 0x99, 0x33, 0xff},
color.RGBA{0x66, 0x99, 0x66, 0xff},
color.RGBA{0x66, 0x99, 0x99, 0xff},
color.RGBA{0x66, 0x99, 0xcc, 0xff},
color.RGBA{0x66, 0xcc, 0x00, 0xff},
color.RGBA{0x66, 0xcc, 0x33, 0xff},
color.RGBA{0x66, 0xcc, 0x66, 0xff},
color.RGBA{0x66, 0xcc, 0x99, 0xff},
color.RGBA{0x66, 0xcc, 0xcc, 0xff},
color.RGBA{0x99, 0x00, 0x00, 0xff},
color.RGBA{0x99, 0x00, 0x33, 0xff},
color.RGBA{0x99, 0x00, 0x66, 0xff},
color.RGBA{0x99, 0x00, 0x99, 0xff},
color.RGBA{0x99, 0x00, 0xcc, 0xff},
color.RGBA{0x99, 0x33, 0x00, 0xff},
color.RGBA{0x99, 0x33, 0x33, 0xff},
color.RGBA{0x99, 0x33, 0x66, 0xff},
color.RGBA{0x99, 0x33, 0x99, 0xff},
color.RGBA{0x99, 0x33, 0xcc, 0xff},
color.RGBA{0x99, 0x66, 0x00, 0xff},
color.RGBA{0x99, 0x66, 0x33, 0xff},
color.RGBA{0x99, 0x66, 0x66, 0xff},
color.RGBA{0x99, 0x66, 0x99, 0xff},
color.RGBA{0x99, 0x66, 0xcc, 0xff},
color.RGBA{0x99, 0x99, 0x00, 0xff},
color.RGBA{0x99, 0x99, 0x33, 0xff},
color.RGBA{0x99, 0x99, 0x66, 0xff},
color.RGBA{0x99, 0x99, 0x99, 0xff},
color.RGBA{0x99, 0x99, 0xcc, 0xff},
color.RGBA{0x99, 0xcc, 0x00, 0xff},
color.RGBA{0x99, 0xcc, 0x33, 0xff},
color.RGBA{0x99, 0xcc, 0x66, 0xff},
color.RGBA{0x99, 0xcc, 0x99, 0xff},
color.RGBA{0x99, 0xcc, 0xcc, 0xff},
color.RGBA{0xcc, 0x00, 0x00, 0xff},
color.RGBA{0xcc, 0x00, 0x33, 0xff},
color.RGBA{0xcc, 0x00, 0x66, 0xff},
color.RGBA{0xcc, 0x00, 0x99, 0xff},
color.RGBA{0xcc, 0x00, 0xcc, 0xff},
color.RGBA{0xcc, 0x33, 0x00, 0xff},
color.RGBA{0xcc, 0x33, 0x33, 0xff},
color.RGBA{0xcc, 0x33, 0x66, 0xff},
color.RGBA{0xcc, 0x33, 0x99, 0xff},
color.RGBA{0xcc, 0x33, 0xcc, 0xff},
color.RGBA{0xcc, 0x66, 0x00, 0xff},
color.RGBA{0xcc, 0x66, 0x33, 0xff},
color.RGBA{0xcc, 0x66, 0x66, 0xff},
color.RGBA{0xcc, 0x66, 0x99, 0xff},
color.RGBA{0xcc, 0x66, 0xcc, 0xff},
color.RGBA{0xcc, 0x99, 0x00, 0xff},
color.RGBA{0xcc, 0x99, 0x33, 0xff},
color.RGBA{0xcc, 0x99, 0x66, 0xff},
color.RGBA{0xcc, 0x99, 0x99, 0xff},
color.RGBA{0xcc, 0x99, 0xcc, 0xff},
color.RGBA{0xcc, 0xcc, 0x00, 0xff},
color.RGBA{0xcc, 0xcc, 0x33, 0xff},
color.RGBA{0xcc, 0xcc, 0x66, 0xff},
color.RGBA{0xcc, 0xcc, 0x99, 0xff},
color.RGBA{0xcc, 0xcc, 0xcc, 0xff},
// color.RGBA{0x00, 0x00, 0x33, 0xff}, // #000033 - Dark Blue
// color.RGBA{0x00, 0x00, 0x66, 0xff}, // #000066 - Deep Blue
// color.RGBA{0x00, 0x00, 0x99, 0xff}, // #000099 - Medium Blue
color.RGBA{0x00, 0x00, 0xcc, 0xff}, // #0000CC - Bright Blue
// color.RGBA{0x00, 0x33, 0x00, 0xff}, // #003300 - Dark Green
// color.RGBA{0x00, 0x33, 0x33, 0xff}, // #003333 - Greenish Blue
// color.RGBA{0x00, 0x33, 0x66, 0xff}, // #003366 - Dark Teal
color.RGBA{0x00, 0x33, 0x99, 0xff}, // #003399 - Teal
color.RGBA{0x00, 0x33, 0xcc, 0xff}, // #0033CC - Bright Teal
color.RGBA{0x00, 0x66, 0x00, 0xff}, // #006600 - Darker Green
color.RGBA{0x00, 0x66, 0x33, 0xff}, // #006633 - Greenish
color.RGBA{0x00, 0x66, 0x66, 0xff}, // #006666 - Soft Teal
color.RGBA{0x00, 0x66, 0x99, 0xff}, // #006699 - Light Teal
color.RGBA{0x00, 0x66, 0xcc, 0xff}, // #0066CC - Cyan
color.RGBA{0x00, 0x99, 0x00, 0xff}, // #009900 - Medium Green
color.RGBA{0x00, 0x99, 0x33, 0xff}, // #009933 - Bright Green
color.RGBA{0x00, 0x99, 0x66, 0xff}, // #009966 - Sea Green
color.RGBA{0x00, 0x99, 0x99, 0xff}, // #009999 - Dark Cyan
color.RGBA{0x00, 0x99, 0xcc, 0xff}, // #0099CC - Bright Cyan
color.RGBA{0x00, 0xcc, 0x00, 0xff}, // #00CC00 - Vivid Green
color.RGBA{0x00, 0xcc, 0x33, 0xff}, // #00CC33 - Bright Turquoise
color.RGBA{0x00, 0xcc, 0x66, 0xff}, // #00CC66 - Light Teal
color.RGBA{0x00, 0xcc, 0x99, 0xff}, // #00CC99 - Soft Cyan
color.RGBA{0x00, 0xcc, 0xcc, 0xff}, // #00CCCC - Cyan
// color.RGBA{0x33, 0x00, 0x00, 0xff}, // #330000 - Dark Red
// color.RGBA{0x33, 0x00, 0x33, 0xff}, // #330033 - Dark Purple
// color.RGBA{0x33, 0x00, 0x66, 0xff}, // #330066 - Purple
color.RGBA{0x33, 0x00, 0x99, 0xff}, // #330099 - Violet
color.RGBA{0x33, 0x00, 0xcc, 0xff}, // #3300CC - Bright Purple
// color.RGBA{0x33, 0x33, 0x00, 0xff}, // #333300 - Dark Yellow
// color.RGBA{0x33, 0x33, 0x33, 0xff}, // #333333 - Dark Gray
// color.RGBA{0x33, 0x33, 0x66, 0xff}, // #333366 - Blue Gray
color.RGBA{0x33, 0x33, 0x99, 0xff}, // #333399 - Slate Blue
color.RGBA{0x33, 0x33, 0xcc, 0xff}, // #3333CC - Light Slate Blue
color.RGBA{0x33, 0x66, 0x00, 0xff}, // #336600 - Olive Green
color.RGBA{0x33, 0x66, 0x33, 0xff}, // #336633 - Forest Green
color.RGBA{0x33, 0x66, 0x66, 0xff}, // #336666 - Teal
color.RGBA{0x33, 0x66, 0x99, 0xff}, // #336699 - Dark Aqua
color.RGBA{0x33, 0x66, 0xcc, 0xff}, // #3366CC - Aqua
color.RGBA{0x33, 0x99, 0x00, 0xff}, // #339900 - Bright Green
color.RGBA{0x33, 0x99, 0x33, 0xff}, // #339933 - Lime Green
color.RGBA{0x33, 0x99, 0x66, 0xff}, // #339966 - Light Lime
color.RGBA{0x33, 0x99, 0x99, 0xff}, // #339999 - Light Aqua
color.RGBA{0x33, 0x99, 0xcc, 0xff}, // #3399CC - Bright Aqua
color.RGBA{0x33, 0xcc, 0x00, 0xff}, // #33CC00 - Spring Green
color.RGBA{0x33, 0xcc, 0x33, 0xff}, // #33CC33 - Bright Olive
color.RGBA{0x33, 0xcc, 0x66, 0xff}, // #33CC66 - Pale Green
color.RGBA{0x33, 0xcc, 0x99, 0xff}, // #33CC99 - Light Spring Green
color.RGBA{0x33, 0xcc, 0xcc, 0xff}, // #33CCCC - Aqua
color.RGBA{0x66, 0x00, 0x00, 0xff}, // #660000 - Dark Maroon
color.RGBA{0x66, 0x00, 0x33, 0xff}, // #660033 - Dark Burgundy
color.RGBA{0x66, 0x00, 0x66, 0xff}, // #660066 - Deep Purple
color.RGBA{0x66, 0x00, 0x99, 0xff}, // #660099 - Indigo
color.RGBA{0x66, 0x00, 0xcc, 0xff}, // #6600CC - Bright Indigo
color.RGBA{0x66, 0x33, 0x00, 0xff}, // #663300 - Dark Brown
color.RGBA{0x66, 0x33, 0x33, 0xff}, // #663333 - Brownish
color.RGBA{0x66, 0x33, 0x66, 0xff}, // #663366 - Dark Violet
color.RGBA{0x66, 0x33, 0x99, 0xff}, // #663399 - Dark Lavender
color.RGBA{0x66, 0x33, 0xcc, 0xff}, // #6633CC - Bright Lavender
color.RGBA{0x66, 0x66, 0x00, 0xff}, // #666600 - Olive
color.RGBA{0x66, 0x66, 0x33, 0xff}, // #666633 - Khaki
color.RGBA{0x66, 0x66, 0x66, 0xff}, // #666666 - Gray
color.RGBA{0x66, 0x66, 0x99, 0xff}, // #666699 - Grayish Blue
color.RGBA{0x66, 0x66, 0xcc, 0xff}, // #6666CC - Light Blue Gray
color.RGBA{0x66, 0x99, 0x00, 0xff}, // #669900 - Yellow Green
color.RGBA{0x66, 0x99, 0x33, 0xff}, // #669933 - Medium Olive
color.RGBA{0x66, 0x99, 0x66, 0xff}, // #669966 - Olive Drab
color.RGBA{0x66, 0x99, 0x99, 0xff}, // #669999 - Dark Sea Green
color.RGBA{0x66, 0x99, 0xcc, 0xff}, // #6699CC - Soft Aqua
color.RGBA{0x66, 0xcc, 0x00, 0xff}, // #66CC00 - Bright Greeny Yellow
color.RGBA{0x66, 0xcc, 0x33, 0xff}, // #66CC33 - Light Frog Green
color.RGBA{0x66, 0xcc, 0x66, 0xff}, // #66CC66 - Light Olive Green
color.RGBA{0x66, 0xcc, 0x99, 0xff}, // #66CC99 - Light Sage
color.RGBA{0x66, 0xcc, 0xcc, 0xff}, // #66CCCC - Light Cyan
color.RGBA{0x99, 0x00, 0x00, 0xff}, // #990000 - Dark Crimson
color.RGBA{0x99, 0x00, 0x33, 0xff}, // #990033 - Purple Red
color.RGBA{0x99, 0x00, 0x66, 0xff}, // #990066 - Dark Fuchsia
color.RGBA{0x99, 0x00, 0x99, 0xff}, // #990099 - Dark Magenta
color.RGBA{0x99, 0x00, 0xcc, 0xff}, // #9900CC - Deep Magenta
color.RGBA{0x99, 0x33, 0x00, 0xff}, // #993300 - Dark Rust
color.RGBA{0x99, 0x33, 0x33, 0xff}, // #993333 - Reddish Brown
color.RGBA{0x99, 0x33, 0x66, 0xff}, // #993366 - Maroon
color.RGBA{0x99, 0x33, 0x99, 0xff}, // #993399 - Dark Pink
color.RGBA{0x99, 0x33, 0xcc, 0xff}, // #9933CC - Bright Magenta
color.RGBA{0x99, 0x66, 0x00, 0xff}, // #996600 - Olive Brown
color.RGBA{0x99, 0x66, 0x33, 0xff}, // #996633 - Dark Khaki
color.RGBA{0x99, 0x66, 0x66, 0xff}, // #996666 - Brown Gray
color.RGBA{0x99, 0x66, 0x99, 0xff}, // #996699 - Dusty Pink
color.RGBA{0x99, 0x66, 0xcc, 0xff}, // #9966CC - Lavender Gray
color.RGBA{0x99, 0x99, 0x00, 0xff}, // #999900 - Olive Drab Green
color.RGBA{0x99, 0x99, 0x33, 0xff}, // #999933 - Medium Olive Green
color.RGBA{0x99, 0x99, 0x66, 0xff}, // #999966 - Pale Olive
color.RGBA{0x99, 0x99, 0x99, 0xff}, // #999999 - Light Gray
color.RGBA{0x99, 0x99, 0xcc, 0xff}, // #9999CC - Light Steel Blue
color.RGBA{0x99, 0xcc, 0x00, 0xff}, // #99CC00 - Chartreuse
color.RGBA{0x99, 0xcc, 0x33, 0xff}, // #99CC33 - Light Lime Green
color.RGBA{0x99, 0xcc, 0x66, 0xff}, // #99CC66 - Soft Lime
color.RGBA{0x99, 0xcc, 0x99, 0xff}, // #99CC99 - Light Seafoam
color.RGBA{0x99, 0xcc, 0xcc, 0xff}, // #99CCCC - Pale Cyan
color.RGBA{0xcc, 0x00, 0x00, 0xff}, // #CC0000 - Bright Red
color.RGBA{0xcc, 0x00, 0x33, 0xff}, // #CC0033 - Ruby Red
color.RGBA{0xcc, 0x00, 0x66, 0xff}, // #CC0066 - Deep Pink
color.RGBA{0xcc, 0x00, 0x99, 0xff}, // #CC0099 - Fuchsia
color.RGBA{0xcc, 0x00, 0xcc, 0xff}, // #CC00CC - Magenta
color.RGBA{0xcc, 0x33, 0x00, 0xff}, // #CC3300 - Dark Tomato
color.RGBA{0xcc, 0x33, 0x33, 0xff}, // #CC3333 - Crimson
color.RGBA{0xcc, 0x33, 0x66, 0xff}, // #CC3366 - Dark Salmon
color.RGBA{0xcc, 0x33, 0x99, 0xff}, // #CC3399 - Hot Pink
color.RGBA{0xcc, 0x33, 0xcc, 0xff}, // #CC33CC - Bright Orchid
color.RGBA{0xcc, 0x66, 0x00, 0xff}, // #CC6600 - Burnt Orange
color.RGBA{0xcc, 0x66, 0x33, 0xff}, // #CC6633 - Orange
color.RGBA{0xcc, 0x66, 0x66, 0xff}, // #CC6666 - Light Coral
color.RGBA{0xcc, 0x66, 0x99, 0xff}, // #CC6699 - Light Pink
color.RGBA{0xcc, 0x66, 0xcc, 0xff}, // #CC66CC - Medium Violet Red
color.RGBA{0xcc, 0x99, 0x00, 0xff}, // #CC9900 - Goldenrod
color.RGBA{0xcc, 0x99, 0x33, 0xff}, // #CC9933 - Wheat
color.RGBA{0xcc, 0x99, 0x66, 0xff}, // #CC9966 - Khaki
color.RGBA{0xcc, 0x99, 0x99, 0xff}, // #CC9999 - Rosy Brown
color.RGBA{0xcc, 0x99, 0xcc, 0xff}, // #CC99CC - Thistle
color.RGBA{0xcc, 0xcc, 0x00, 0xff}, // #CCCC00 - Olive
color.RGBA{0xcc, 0xcc, 0x33, 0xff}, // #CCCC33 - Pale Olive
color.RGBA{0xcc, 0xcc, 0x66, 0xff}, // #CCCC66 - Pale Goldenrod
color.RGBA{0xcc, 0xcc, 0x99, 0xff}, // #CCCC99 - Light Khaki
color.RGBA{0xcc, 0xcc, 0xcc, 0xff}, // #CCCCCC - Light Gray
}
Loading