github.com/status-im/status-go@v1.1.0/images/color.go (about)

     1  package images
     2  
     3  import (
     4  	"fmt"
     5  	"image/color"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  func ParseColor(colorStr string) (color.RGBA, error) {
    11  	var c color.RGBA
    12  
    13  	if strings.HasPrefix(colorStr, "#") {
    14  		// Parse hex color string
    15  		// Remove "#" prefix
    16  		colorStr = colorStr[1:]
    17  
    18  		// Convert to RGBA
    19  		val, err := strconv.ParseUint(colorStr, 16, 32)
    20  		if err != nil {
    21  			return c, err
    22  		}
    23  		c.R = uint8(val >> 16)
    24  		c.G = uint8(val >> 8)
    25  		c.B = uint8(val)
    26  		c.A = 255
    27  	} else if strings.HasPrefix(colorStr, "rgb(") {
    28  		// Parse RGB color string
    29  		// Remove prefix and suffix
    30  		colorStr = strings.TrimSuffix(strings.TrimPrefix(colorStr, "rgb("), ")")
    31  
    32  		// Split the string into comma separated parts
    33  		parts := strings.Split(colorStr, ",")
    34  		if len(parts) != 3 {
    35  			return c, fmt.Errorf("invalid RGB color string")
    36  		}
    37  
    38  		// Convert to RGBA
    39  		r, err := strconv.Atoi(strings.TrimSpace(parts[0]))
    40  		if err != nil {
    41  			return c, err
    42  		}
    43  		g, err := strconv.Atoi(strings.TrimSpace(parts[1]))
    44  		if err != nil {
    45  			return c, err
    46  		}
    47  		b, err := strconv.Atoi(strings.TrimSpace(parts[2]))
    48  		if err != nil {
    49  			return c, err
    50  		}
    51  		c.R = uint8(r)
    52  		c.G = uint8(g)
    53  		c.B = uint8(b)
    54  		c.A = 255
    55  	} else if strings.HasPrefix(colorStr, "rgba(") {
    56  		// Parse RGBA color string
    57  		// Remove prefix and suffix
    58  		colorStr = strings.TrimSuffix(strings.TrimPrefix(colorStr, "rgba("), ")")
    59  
    60  		// Split the string into comma separated parts
    61  		parts := strings.Split(colorStr, ",")
    62  		if len(parts) != 4 {
    63  			return c, fmt.Errorf("invalid RGBA color string")
    64  		}
    65  
    66  		// Convert to RGBA
    67  		r, err := strconv.Atoi(strings.TrimSpace(parts[0]))
    68  		if err != nil {
    69  			return c, err
    70  		}
    71  		g, err := strconv.Atoi(strings.TrimSpace(parts[1]))
    72  		if err != nil {
    73  			return c, err
    74  		}
    75  		b, err := strconv.Atoi(strings.TrimSpace(parts[2]))
    76  		if err != nil {
    77  			return c, err
    78  		}
    79  		a, err := strconv.ParseFloat(strings.TrimSpace(parts[3]), 64)
    80  		if err != nil {
    81  			return c, err
    82  		}
    83  		if a < 0 || a > 1 {
    84  			return c, fmt.Errorf("invalid RGBA alpha value")
    85  		}
    86  		c.R = uint8(r)
    87  		c.G = uint8(g)
    88  		c.B = uint8(b)
    89  		c.A = uint8(a * 255)
    90  	} else {
    91  		return c, fmt.Errorf("invalid color string format")
    92  	}
    93  
    94  	return c, nil
    95  }