Browse Source

gui builder...

leonsal 8 years ago
parent
commit
0687eb1d1d
3 changed files with 340 additions and 204 deletions
  1. 168 44
      gui/builder.go
  2. 169 157
      math32/color.go
  3. 3 3
      math32/color4.go

+ 168 - 44
gui/builder.go

@@ -21,6 +21,37 @@ import (
 type Builder struct {
 	desc    map[string]*panelDesc // parsed descriptions
 	imgpath string                // base path for image panels files
+	objpath strStack              // current object stack
+}
+
+type strStack struct {
+	stack []string
+}
+
+func (ss *strStack) clear() {
+
+	ss.stack = []string{}
+}
+func (ss *strStack) push(v string) {
+
+	ss.stack = append(ss.stack, v)
+}
+
+func (ss *strStack) pop() string {
+
+	if len(ss.stack) == 0 {
+		return ""
+	}
+	length := len(ss.stack)
+	v := ss.stack[length-1]
+	ss.stack = ss.stack[:length-1]
+	log.Error("pop--------->%v", ss.stack)
+	return v
+}
+
+func (ss *strStack) path() string {
+
+	return strings.Join(ss.stack, "/")
 }
 
 type panelStyle struct {
@@ -55,18 +86,19 @@ type panelDesc struct {
 	Enabled      bool
 	Visible      bool
 	Renderable   bool
-	Imagefile    string // Optional image filepath for ImagePanel
+	Imagefile    string // For Panel, Button
 	Children     []*panelDesc
 	Layout       layoutAttr
 	Styles       *panelStyles
-	Text         string
-	BgColor      string
-	FontColor    string // Optional
-	FontSize     *float32
-	FontDPI      *float32
-	LineSpacing  *float32
-	PlaceHolder  string
-	MaxLength    *uint
+	Text         string   // Label, Button
+	BgColor      string   // Label
+	FontColor    string   // Label
+	FontSize     *float32 // Label
+	FontDPI      *float32 // Label
+	LineSpacing  *float32 // Label
+	PlaceHolder  string   // Edit
+	MaxLength    *uint    // Edit
+	Icon         string   // Button
 }
 
 type layoutAttr struct {
@@ -77,26 +109,25 @@ const (
 	descTypePanel      = "Panel"
 	descTypeImagePanel = "ImagePanel"
 	descTypeLabel      = "Label"
+	descTypeIconLabel  = "IconLabel"
+	descTypeButton     = "Button"
 	descTypeEdit       = "Edit"
 	fieldMargins       = "margins"
 	fieldBorders       = "borders"
 	fieldBorderColor   = "bordercolor"
 	fieldPaddings      = "paddings"
 	fieldColor         = "color"
+	fieldBgColor       = "bgcolor"
 )
 
-//
 // NewBuilder creates and returns a pointer to a new gui Builder object
-//
 func NewBuilder() *Builder {
 
 	return new(Builder)
 }
 
-//
 // ParseString parses a string with gui objects descriptions in YAML format
 // It there was a previously parsed description, it is cleared.
-//
 func (b *Builder) ParseString(desc string) error {
 
 	// Try assuming the description contains a single root panel
@@ -108,7 +139,6 @@ func (b *Builder) ParseString(desc string) error {
 	if pd.Type != "" {
 		b.desc = make(map[string]*panelDesc)
 		b.desc[""] = &pd
-		fmt.Printf("\n%+v\n", b.desc)
 		return nil
 	}
 
@@ -119,14 +149,11 @@ func (b *Builder) ParseString(desc string) error {
 		return err
 	}
 	b.desc = pdm
-	fmt.Printf("\n%+v\n", b.desc)
 	return nil
 }
 
-//
 // ParseFile builds gui objects from the specified file which
 // must contain objects descriptions in YAML format
-//
 func (b *Builder) ParseFile(filepath string) error {
 
 	// Reads all file data
@@ -147,34 +174,35 @@ func (b *Builder) ParseFile(filepath string) error {
 	return b.ParseString(string(data))
 }
 
-//
 // Names returns a sorted list of names of top level previously parsed objects.
+// Only objects with defined types are returned.
 // If there is only a single object with no name, its name is returned
 // as an empty string
-//
 func (b *Builder) Names() []string {
 
 	var objs []string
-	for name, _ := range b.desc {
-		objs = append(objs, name)
+	for name, pd := range b.desc {
+		if pd.Type != "" {
+			objs = append(objs, name)
+		}
 	}
 	sort.Strings(objs)
 	return objs
 }
 
-//
 // Build builds a gui object and all its children recursively.
 // The specified name should be a top level name from a
 // from a previously parsed description
 // If the descriptions contains a single object with no name,
 // It should be specified the empty string to build this object.
-//
 func (b *Builder) Build(name string) (IPanel, error) {
 
 	pd, ok := b.desc[name]
 	if !ok {
 		return nil, fmt.Errorf("Object name:%s not found", name)
 	}
+	b.objpath.clear()
+	b.objpath.push(pd.Name)
 	return b.build(pd, nil)
 }
 
@@ -184,14 +212,11 @@ func (b *Builder) SetImagepath(path string) {
 	b.imgpath = path
 }
 
-//
 // build builds the gui object from the specified description.
 // All its children are also built recursively
 // Returns the built object or an error
-//
 func (b *Builder) build(pd *panelDesc, iparent IPanel) (IPanel, error) {
 
-	fmt.Printf("\n%+v\n\n", pd)
 	var err error
 	var pan IPanel
 	switch pd.Type {
@@ -201,6 +226,10 @@ func (b *Builder) build(pd *panelDesc, iparent IPanel) (IPanel, error) {
 		pan, err = b.buildImagePanel(pd)
 	case descTypeLabel:
 		pan, err = b.buildLabel(pd)
+	case descTypeIconLabel:
+		pan, err = b.buildLabel(pd)
+	case descTypeButton:
+		pan, err = b.buildButton(pd)
 	case descTypeEdit:
 		pan, err = b.buildEdit(pd)
 	default:
@@ -227,7 +256,9 @@ func (b *Builder) buildPanel(pd *panelDesc) (IPanel, error) {
 
 	// Builds panel children recursively
 	for i := 0; i < len(pd.Children); i++ {
+		b.objpath.push(pd.Children[i].Name)
 		child, err := b.build(pd.Children[i], pan)
+		b.objpath.pop()
 		if err != nil {
 			return nil, err
 		}
@@ -241,7 +272,7 @@ func (b *Builder) buildImagePanel(pd *panelDesc) (IPanel, error) {
 
 	// Imagefile must be supplied
 	if pd.Imagefile == "" {
-		return nil, b.err(pd.Name, "Imagefile", "Imagefile must be supplied")
+		return nil, b.err("Imagefile", "Imagefile must be supplied")
 	}
 
 	// If path is not absolute join with user supplied image base path
@@ -270,7 +301,9 @@ func (b *Builder) buildImagePanel(pd *panelDesc) (IPanel, error) {
 
 	// Builds panel children recursively
 	for i := 0; i < len(pd.Children); i++ {
+		b.objpath.push(pd.Children[i].Name)
 		child, err := b.build(pd.Children[i], panel)
+		b.objpath.pop()
 		if err != nil {
 			return nil, err
 		}
@@ -279,17 +312,26 @@ func (b *Builder) buildImagePanel(pd *panelDesc) (IPanel, error) {
 	return panel, nil
 }
 
+// buildLabel builds a gui object of type: "Label"
 func (b *Builder) buildLabel(pd *panelDesc) (IPanel, error) {
 
-	// Builds panel and set common attributes
-	label := NewLabel(pd.Text)
+	var label *Label
+	if pd.Type == descTypeLabel {
+		label = NewLabel(pd.Text)
+	} else {
+		icons, err := b.parseIconNames(pd.Name, "text", pd.Text)
+		if err != nil {
+			return nil, err
+		}
+		label = NewIconLabel(icons)
+	}
 	err := b.setCommon(pd, label)
 	if err != nil {
 		return nil, err
 	}
 
 	// Set optional background color
-	c, err := b.parseColor(pd.Name, "bgcolor", pd.BgColor)
+	c, err := b.parseColor(pd.Name, fieldBgColor, pd.BgColor)
 	if err != nil {
 		return nil, err
 	}
@@ -324,6 +366,49 @@ func (b *Builder) buildLabel(pd *panelDesc) (IPanel, error) {
 	return label, nil
 }
 
+// buildButtonl builds a gui object of type: "Button"
+func (b *Builder) buildButton(pd *panelDesc) (IPanel, error) {
+
+	// Builds button and set commont attributes
+	button := NewButton(pd.Text)
+	err := b.setCommon(pd, button)
+	if err != nil {
+		return nil, err
+	}
+
+	// Sets optional icon
+	if pd.Icon != "" {
+		cp, err := b.parseIconName(pd.Name, "icon", pd.Icon)
+		if err != nil {
+			return nil, err
+		}
+		button.SetIcon(int(cp))
+	}
+
+	// Sets optional image from file
+	// If path is not absolute join with user supplied image base path
+	if pd.Imagefile != "" {
+		path := pd.Imagefile
+		if !filepath.IsAbs(path) {
+			path = filepath.Join(b.imgpath, path)
+		}
+		err := button.SetImage(path)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	// Sets optional styles
+	if pd.Styles != nil {
+		err := b.setStyles(pd.Name, pd.Styles, button)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return button, nil
+}
+
+// buildEdit builds a gui object of type: "Edit"
 func (b *Builder) buildEdit(pa *panelDesc) (IPanel, error) {
 
 	return nil, nil
@@ -389,6 +474,11 @@ func (b *Builder) setCommon(pd *panelDesc, ipan IPanel) error {
 	return nil
 }
 
+func (b *Builder) setStyles(pname string, ps *panelStyles, ipan IPanel) error {
+
+	return nil
+}
+
 // parseBorderSizes parses a string field which can contain one float value or
 // float values. In the first case all borders has the same width
 func (b *Builder) parseBorderSizes(pname, fname, field string) (*BorderSizes, error) {
@@ -403,10 +493,8 @@ func (b *Builder) parseBorderSizes(pname, fname, field string) (*BorderSizes, er
 	return &BorderSizes{va[0], va[1], va[2], va[3]}, nil
 }
 
-//
 // parseColor parses a string field which can contain a color name or
 // a list of 3 or 4 float values for the color components
-//
 func (b *Builder) parseColor(pname, fname, field string) (*math32.Color4, error) {
 
 	// Checks if field is empty
@@ -415,12 +503,23 @@ func (b *Builder) parseColor(pname, fname, field string) (*math32.Color4, error)
 		return nil, nil
 	}
 
-	// Checks if field is a color name
-	value := math32.ColorUint(field)
-	if value != 0 {
-		var c math32.Color
-		c.SetName(field)
-		return &math32.Color4{c.R, c.G, c.B, 1}, nil
+	// If string has 1 or 2 fields it must be a color name and optional alpha
+	parts := strings.Fields(field)
+	if len(parts) == 1 || len(parts) == 2 {
+		// First part must be a color name
+		if !math32.IsColor(parts[0]) {
+			return nil, b.err(fname, fmt.Sprintf("Invalid color name:%s", parts[0]))
+		}
+		c := math32.ColorName(parts[0])
+		c4 := math32.Color4{c.R, c.G, c.B, 1}
+		if len(parts) == 2 {
+			val, err := strconv.ParseFloat(parts[1], 32)
+			if err != nil {
+				return nil, b.err(fname, fmt.Sprintf("Invalid float32 value:%s", parts[1]))
+			}
+			c4.A = float32(val)
+		}
+		return &c4, nil
 	}
 
 	// Accept 3 or 4 floats values
@@ -434,11 +533,36 @@ func (b *Builder) parseColor(pname, fname, field string) (*math32.Color4, error)
 	return &math32.Color4{va[0], va[1], va[2], va[3]}, nil
 }
 
-//
+// parseIconNames parses a string with a list of icon names or codepoints and
+// returns a string with the icons codepoints encoded in UTF8
+func (b *Builder) parseIconNames(pname, fname, field string) (string, error) {
+
+	text := ""
+	parts := strings.Fields(field)
+	for i := 0; i < len(parts); i++ {
+		cp, err := b.parseIconName(pname, fname, parts[i])
+		if err != nil {
+			return "", err
+		}
+		text = text + string(cp)
+	}
+	return text, nil
+}
+
+// parseIconName parses a string with an icon name or codepoint in hex
+// and returns the icon codepoints value and an error
+func (b *Builder) parseIconName(pname, fname, field string) (uint, error) {
+
+	cp, err := strconv.ParseUint(field, 16, 32)
+	if err != nil {
+		return 0, b.err(fname, fmt.Sprintf("Invalid icon codepoint value/name:%v", field))
+	}
+	return uint(cp), nil
+}
+
 // parseFloats parses a string with a list of floats with the specified size
 // and returns a slice. The specified size is 0 any number of floats is allowed.
 // The individual values can be separated by spaces or commas
-//
 func (b *Builder) parseFloats(pname, fname, field string, min, max int) ([]float32, error) {
 
 	// Checks if field is empty
@@ -455,7 +579,7 @@ func (b *Builder) parseFloats(pname, fname, field string, min, max int) ([]float
 		parts = strings.Split(field, ",")
 	}
 	if len(parts) < min || len(parts) > max {
-		return nil, b.err(pname, fname, "Invalid number of float32 values")
+		return nil, b.err(fname, "Invalid number of float32 values")
 	}
 
 	// Parse each field value and appends to slice
@@ -463,14 +587,14 @@ func (b *Builder) parseFloats(pname, fname, field string, min, max int) ([]float
 	for i := 0; i < len(parts); i++ {
 		val, err := strconv.ParseFloat(strings.Trim(parts[i], " "), 32)
 		if err != nil {
-			return nil, fmt.Errorf("Error parsing float32 field:[%s]: %s", field, err)
+			return nil, b.err(fname, err.Error())
 		}
 		values = append(values, float32(val))
 	}
 	return values, nil
 }
 
-func (b *Builder) err(pname, fname, msg string) error {
+func (b *Builder) err(fname, msg string) error {
 
-	return fmt.Errorf("Error in object:%s field:%s -> %s", pname, fname, msg)
+	return fmt.Errorf("Error in object:%s field:%s -> %s", b.objpath.path(), fname, msg)
 }

+ 169 - 157
math32/color.go

@@ -53,10 +53,11 @@ func (c *Color) SetHex(value uint) *Color {
 }
 
 // SetName sets the color RGB components from the
-// specified HTML color name
+// specified standard web color name
 func (c *Color) SetName(name string) *Color {
 
-	return c.SetHex(colorKeywords[name])
+	*c = colorNames[name]
+	return c
 }
 
 func (c *Color) Add(other *Color) *Color {
@@ -112,165 +113,176 @@ func (c *Color) Equals(other *Color) bool {
 	return (c.R == other.R) && (c.G == other.G) && (c.B == other.B)
 }
 
-func (c *Color) Clone() *Color {
+// IsColor returns true if the specified name is a standard web color name
+func IsColor(name string) bool {
+
+	_, ok := colorNames[name]
+	return ok
+
+}
+
+// ColorName returns a Color with the specified standard web color name.
+func ColorName(name string) Color {
 
-	return NewColor(c.R, c.G, c.B)
+	return colorNames[name]
 }
 
-//
-// ColorToValue returns the integer value of the color with
-// the specified name. If name not found returns 0.
-//
-func ColorUint(name string) uint {
+// Color4Name returns a Color4 with the specified standard web color name
+// and specified alpha channel.
+func Color4Name(name string, alpha float32) Color4 {
 
-	return colorKeywords[name]
+	c := colorNames[name]
+	return Color4{c.R, c.G, c.B, alpha}
 }
 
-var colorKeywords = map[string]uint{
-	"aliceblue":            0xF0F8FF,
-	"antiquewhite":         0xFAEBD7,
-	"aqua":                 0x00FFFF,
-	"aquamarine":           0x7FFFD4,
-	"azure":                0xF0FFFF,
-	"beige":                0xF5F5DC,
-	"bisque":               0xFFE4C4,
-	"black":                0x000000,
-	"blanchedalmond":       0xFFEBCD,
-	"blue":                 0x0000FF,
-	"blueviolet":           0x8A2BE2,
-	"brown":                0xA52A2A,
-	"burlywood":            0xDEB887,
-	"cadetblue":            0x5F9EA0,
-	"chartreuse":           0x7FFF00,
-	"chocolate":            0xD2691E,
-	"coral":                0xFF7F50,
-	"cornflowerblue":       0x6495ED,
-	"cornsilk":             0xFFF8DC,
-	"crimson":              0xDC143C,
-	"cyan":                 0x00FFFF,
-	"darkblue":             0x00008B,
-	"darkcyan":             0x008B8B,
-	"darkgoldenrod":        0xB8860B,
-	"darkgray":             0xA9A9A9,
-	"darkgreen":            0x006400,
-	"darkgrey":             0xA9A9A9,
-	"darkkhaki":            0xBDB76B,
-	"darkmagenta":          0x8B008B,
-	"darkolivegreen":       0x556B2F,
-	"darkorange":           0xFF8C00,
-	"darkorchid":           0x9932CC,
-	"darkred":              0x8B0000,
-	"darksalmon":           0xE9967A,
-	"darkseagreen":         0x8FBC8F,
-	"darkslateblue":        0x483D8B,
-	"darkslategray":        0x2F4F4F,
-	"darkslategrey":        0x2F4F4F,
-	"darkturquoise":        0x00CED1,
-	"darkviolet":           0x9400D3,
-	"deeppink":             0xFF1493,
-	"deepskyblue":          0x00BFFF,
-	"dimgray":              0x696969,
-	"dimgrey":              0x696969,
-	"dodgerblue":           0x1E90FF,
-	"firebrick":            0xB22222,
-	"floralwhite":          0xFFFAF0,
-	"forestgreen":          0x228B22,
-	"fuchsia":              0xFF00FF,
-	"gainsboro":            0xDCDCDC,
-	"ghostwhite":           0xF8F8FF,
-	"gold":                 0xFFD700,
-	"goldenrod":            0xDAA520,
-	"gray":                 0x808080,
-	"green":                0x008000,
-	"greenyellow":          0xADFF2F,
-	"grey":                 0x808080,
-	"honeydew":             0xF0FFF0,
-	"hotpink":              0xFF69B4,
-	"indianred":            0xCD5C5C,
-	"indigo":               0x4B0082,
-	"ivory":                0xFFFFF0,
-	"khaki":                0xF0E68C,
-	"lavender":             0xE6E6FA,
-	"lavenderblush":        0xFFF0F5,
-	"lawngreen":            0x7CFC00,
-	"lemonchiffon":         0xFFFACD,
-	"lightblue":            0xADD8E6,
-	"lightcoral":           0xF08080,
-	"lightcyan":            0xE0FFFF,
-	"lightgoldenrodyellow": 0xFAFAD2,
-	"lightgray":            0xD3D3D3,
-	"lightgreen":           0x90EE90,
-	"lightgrey":            0xD3D3D3,
-	"lightpink":            0xFFB6C1,
-	"lightsalmon":          0xFFA07A,
-	"lightseagreen":        0x20B2AA,
-	"lightskyblue":         0x87CEFA,
-	"lightslategray":       0x778899,
-	"lightslategrey":       0x778899,
-	"lightsteelblue":       0xB0C4DE,
-	"lightyellow":          0xFFFFE0,
-	"lime":                 0x00FF00,
-	"limegreen":            0x32CD32,
-	"linen":                0xFAF0E6,
-	"magenta":              0xFF00FF,
-	"maroon":               0x800000,
-	"mediumaquamarine":     0x66CDAA,
-	"mediumblue":           0x0000CD,
-	"mediumorchid":         0xBA55D3,
-	"mediumpurple":         0x9370DB,
-	"mediumseagreen":       0x3CB371,
-	"mediumslateblue":      0x7B68EE,
-	"mediumspringgreen":    0x00FA9A,
-	"mediumturquoise":      0x48D1CC,
-	"mediumvioletred":      0xC71585,
-	"midnightblue":         0x191970,
-	"mintcream":            0xF5FFFA,
-	"mistyrose":            0xFFE4E1,
-	"moccasin":             0xFFE4B5,
-	"navajowhite":          0xFFDEAD,
-	"navy":                 0x000080,
-	"oldlace":              0xFDF5E6,
-	"olive":                0x808000,
-	"olivedrab":            0x6B8E23,
-	"orange":               0xFFA500,
-	"orangered":            0xFF4500,
-	"orchid":               0xDA70D6,
-	"palegoldenrod":        0xEEE8AA,
-	"palegreen":            0x98FB98,
-	"paleturquoise":        0xAFEEEE,
-	"palevioletred":        0xDB7093,
-	"papayawhip":           0xFFEFD5,
-	"peachpuff":            0xFFDAB9,
-	"peru":                 0xCD853F,
-	"pink":                 0xFFC0CB,
-	"plum":                 0xDDA0DD,
-	"powderblue":           0xB0E0E6,
-	"purple":               0x800080,
-	"red":                  0xFF0000,
-	"rosybrown":            0xBC8F8F,
-	"royalblue":            0x4169E1,
-	"saddlebrown":          0x8B4513,
-	"salmon":               0xFA8072,
-	"sandybrown":           0xF4A460,
-	"seagreen":             0x2E8B57,
-	"seashell":             0xFFF5EE,
-	"sienna":               0xA0522D,
-	"silver":               0xC0C0C0,
-	"skyblue":              0x87CEEB,
-	"slateblue":            0x6A5ACD,
-	"slategrey":            0x708090,
-	"snow":                 0xFFFAFA,
-	"springgreen":          0x00FF7F,
-	"steelblue":            0x4682B4,
-	"tan":                  0xD2B48C,
-	"teal":                 0x008080,
-	"thistle":              0xD8BFD8,
-	"tomato":               0xFF6347,
-	"turquoise":            0x40E0D0,
-	"violet":               0xEE82EE,
-	"wheat":                0xF5DEB3,
-	"white":                0xFFFFFF,
-	"whitesmoke":           0xF5F5F5,
-	"yellow":               0xFFFF00,
-	"yellowgreen":          0x9ACD32,
+// colorNames maps standard web color names to a Vector3 with
+// the color's RGB component values
+var colorNames = map[string]Color{
+	"aliceblue":            Color{0.941, 0.973, 1.000},
+	"antiquewhite":         Color{0.980, 0.922, 0.843},
+	"aqua":                 Color{0.000, 1.000, 1.000},
+	"aquamarine":           Color{0.498, 1.000, 0.831},
+	"azure":                Color{0.941, 1.000, 1.000},
+	"beige":                Color{0.961, 0.961, 0.863},
+	"bisque":               Color{1.000, 0.894, 0.769},
+	"black":                Color{0.000, 0.000, 0.000},
+	"blanchedalmond":       Color{1.000, 0.922, 0.804},
+	"blue":                 Color{0.000, 0.000, 1.000},
+	"blueviolet":           Color{0.541, 0.169, 0.886},
+	"brown":                Color{0.647, 0.165, 0.165},
+	"burlywood":            Color{0.871, 0.722, 0.529},
+	"cadetblue":            Color{0.373, 0.620, 0.627},
+	"chartreuse":           Color{0.498, 1.000, 0.000},
+	"chocolate":            Color{0.824, 0.412, 0.118},
+	"coral":                Color{1.000, 0.498, 0.314},
+	"cornflowerblue":       Color{0.392, 0.584, 0.929},
+	"cornsilk":             Color{1.000, 0.973, 0.863},
+	"crimson":              Color{0.863, 0.078, 0.235},
+	"cyan":                 Color{0.000, 1.000, 1.000},
+	"darkblue":             Color{0.000, 0.000, 0.545},
+	"darkcyan":             Color{0.000, 0.545, 0.545},
+	"darkgoldenrod":        Color{0.722, 0.525, 0.043},
+	"darkgray":             Color{0.663, 0.663, 0.663},
+	"darkgreen":            Color{0.000, 0.392, 0.000},
+	"darkgrey":             Color{0.663, 0.663, 0.663},
+	"darkkhaki":            Color{0.741, 0.718, 0.420},
+	"darkmagenta":          Color{0.545, 0.000, 0.545},
+	"darkolivegreen":       Color{0.333, 0.420, 0.184},
+	"darkorange":           Color{1.000, 0.549, 0.000},
+	"darkorchid":           Color{0.600, 0.196, 0.800},
+	"darkred":              Color{0.545, 0.000, 0.000},
+	"darksalmon":           Color{0.914, 0.588, 0.478},
+	"darkseagreen":         Color{0.561, 0.737, 0.561},
+	"darkslateblue":        Color{0.282, 0.239, 0.545},
+	"darkslategray":        Color{0.184, 0.310, 0.310},
+	"darkslategrey":        Color{0.184, 0.310, 0.310},
+	"darkturquoise":        Color{0.000, 0.808, 0.820},
+	"darkviolet":           Color{0.580, 0.000, 0.827},
+	"deeppink":             Color{1.000, 0.078, 0.576},
+	"deepskyblue":          Color{0.000, 0.749, 1.000},
+	"dimgray":              Color{0.412, 0.412, 0.412},
+	"dimgrey":              Color{0.412, 0.412, 0.412},
+	"dodgerblue":           Color{0.118, 0.565, 1.000},
+	"firebrick":            Color{0.698, 0.133, 0.133},
+	"floralwhite":          Color{1.000, 0.980, 0.941},
+	"forestgreen":          Color{0.133, 0.545, 0.133},
+	"fuchsia":              Color{1.000, 0.000, 1.000},
+	"gainsboro":            Color{0.863, 0.863, 0.863},
+	"ghostwhite":           Color{0.973, 0.973, 1.000},
+	"gold":                 Color{1.000, 0.843, 0.000},
+	"goldenrod":            Color{0.855, 0.647, 0.125},
+	"gray":                 Color{0.502, 0.502, 0.502},
+	"green":                Color{0.000, 0.502, 0.000},
+	"greenyellow":          Color{0.678, 1.000, 0.184},
+	"grey":                 Color{0.502, 0.502, 0.502},
+	"honeydew":             Color{0.941, 1.000, 0.941},
+	"hotpink":              Color{1.000, 0.412, 0.706},
+	"indianred":            Color{0.804, 0.361, 0.361},
+	"indigo":               Color{0.294, 0.000, 0.510},
+	"ivory":                Color{1.000, 1.000, 0.941},
+	"khaki":                Color{0.941, 0.902, 0.549},
+	"lavender":             Color{0.902, 0.902, 0.980},
+	"lavenderblush":        Color{1.000, 0.941, 0.961},
+	"lawngreen":            Color{0.486, 0.988, 0.000},
+	"lemonchiffon":         Color{1.000, 0.980, 0.804},
+	"lightblue":            Color{0.678, 0.847, 0.902},
+	"lightcoral":           Color{0.941, 0.502, 0.502},
+	"lightcyan":            Color{0.878, 1.000, 1.000},
+	"lightgoldenrodyellow": Color{0.980, 0.980, 0.824},
+	"lightgray":            Color{0.827, 0.827, 0.827},
+	"lightgreen":           Color{0.565, 0.933, 0.565},
+	"lightgrey":            Color{0.827, 0.827, 0.827},
+	"lightpink":            Color{1.000, 0.714, 0.757},
+	"lightsalmon":          Color{1.000, 0.627, 0.478},
+	"lightseagreen":        Color{0.125, 0.698, 0.667},
+	"lightskyblue":         Color{0.529, 0.808, 0.980},
+	"lightslategray":       Color{0.467, 0.533, 0.600},
+	"lightslategrey":       Color{0.467, 0.533, 0.600},
+	"lightsteelblue":       Color{0.690, 0.769, 0.871},
+	"lightyellow":          Color{1.000, 1.000, 0.878},
+	"lime":                 Color{0.000, 1.000, 0.000},
+	"limegreen":            Color{0.196, 0.804, 0.196},
+	"linen":                Color{0.980, 0.941, 0.902},
+	"magenta":              Color{1.000, 0.000, 1.000},
+	"maroon":               Color{0.502, 0.000, 0.000},
+	"mediumaquamarine":     Color{0.400, 0.804, 0.667},
+	"mediumblue":           Color{0.000, 0.000, 0.804},
+	"mediumorchid":         Color{0.729, 0.333, 0.827},
+	"mediumpurple":         Color{0.576, 0.439, 0.859},
+	"mediumseagreen":       Color{0.235, 0.702, 0.443},
+	"mediumslateblue":      Color{0.482, 0.408, 0.933},
+	"mediumspringgreen":    Color{0.000, 0.980, 0.604},
+	"mediumturquoise":      Color{0.282, 0.820, 0.800},
+	"mediumvioletred":      Color{0.780, 0.082, 0.522},
+	"midnightblue":         Color{0.098, 0.098, 0.439},
+	"mintcream":            Color{0.961, 1.000, 0.980},
+	"mistyrose":            Color{1.000, 0.894, 0.882},
+	"moccasin":             Color{1.000, 0.894, 0.710},
+	"navajowhite":          Color{1.000, 0.871, 0.678},
+	"navy":                 Color{0.000, 0.000, 0.502},
+	"oldlace":              Color{0.992, 0.961, 0.902},
+	"olive":                Color{0.502, 0.502, 0.000},
+	"olivedrab":            Color{0.420, 0.557, 0.137},
+	"orange":               Color{1.000, 0.647, 0.000},
+	"orangered":            Color{1.000, 0.271, 0.000},
+	"orchid":               Color{0.855, 0.439, 0.839},
+	"palegoldenrod":        Color{0.933, 0.910, 0.667},
+	"palegreen":            Color{0.596, 0.984, 0.596},
+	"paleturquoise":        Color{0.686, 0.933, 0.933},
+	"palevioletred":        Color{0.859, 0.439, 0.576},
+	"papayawhip":           Color{1.000, 0.937, 0.835},
+	"peachpuff":            Color{1.000, 0.855, 0.725},
+	"peru":                 Color{0.804, 0.522, 0.247},
+	"pink":                 Color{1.000, 0.753, 0.796},
+	"plum":                 Color{0.867, 0.627, 0.867},
+	"powderblue":           Color{0.690, 0.878, 0.902},
+	"purple":               Color{0.502, 0.000, 0.502},
+	"red":                  Color{1.000, 0.000, 0.000},
+	"rosybrown":            Color{0.737, 0.561, 0.561},
+	"royalblue":            Color{0.255, 0.412, 0.882},
+	"saddlebrown":          Color{0.545, 0.271, 0.075},
+	"salmon":               Color{0.980, 0.502, 0.447},
+	"sandybrown":           Color{0.957, 0.643, 0.376},
+	"seagreen":             Color{0.180, 0.545, 0.341},
+	"seashell":             Color{1.000, 0.961, 0.933},
+	"sienna":               Color{0.627, 0.322, 0.176},
+	"silver":               Color{0.753, 0.753, 0.753},
+	"skyblue":              Color{0.529, 0.808, 0.922},
+	"slateblue":            Color{0.416, 0.353, 0.804},
+	"slategray":            Color{0.439, 0.502, 0.565},
+	"slategrey":            Color{0.439, 0.502, 0.565},
+	"snow":                 Color{1.000, 0.980, 0.980},
+	"springgreen":          Color{0.000, 1.000, 0.498},
+	"steelblue":            Color{0.275, 0.510, 0.706},
+	"tan":                  Color{0.824, 0.706, 0.549},
+	"teal":                 Color{0.000, 0.502, 0.502},
+	"thistle":              Color{0.847, 0.749, 0.847},
+	"tomato":               Color{1.000, 0.388, 0.278},
+	"turquoise":            Color{0.251, 0.878, 0.816},
+	"violet":               Color{0.933, 0.510, 0.933},
+	"wheat":                Color{0.961, 0.871, 0.702},
+	"white":                Color{1.000, 1.000, 1.000},
+	"whitesmoke":           Color{0.961, 0.961, 0.961},
+	"yellow":               Color{1.000, 1.000, 0.000},
+	"yellowgreen":          Color{0.604, 0.804, 0.196},
 }

+ 3 - 3
math32/color4.go

@@ -47,11 +47,11 @@ func (c *Color4) SetHex(value uint) *Color4 {
 }
 
 // SetName sets the color RGB components from the
-// specified HTML color name
-// Alpha component is not modified
+// specified standard web color name
 func (c *Color4) SetName(name string) *Color4 {
 
-	return c.SetHex(colorKeywords[name])
+	*c = Color4Name(name, 1)
+	return c
 }
 
 func (c *Color4) Add(other *Color4) *Color4 {