summaryrefslogtreecommitdiffstats
path: root/resources/images/color.go
diff options
context:
space:
mode:
Diffstat (limited to 'resources/images/color.go')
-rw-r--r--resources/images/color.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/resources/images/color.go b/resources/images/color.go
new file mode 100644
index 000000000..b17173e26
--- /dev/null
+++ b/resources/images/color.go
@@ -0,0 +1,85 @@
+// Copyright 2019 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package images
+
+import (
+ "encoding/hex"
+ "image/color"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+// AddColorToPalette adds c as the first color in p if not already there.
+// Note that it does no additional checks, so callers must make sure
+// that the palette is valid for the relevant format.
+func AddColorToPalette(c color.Color, p color.Palette) color.Palette {
+ var found bool
+ for _, cc := range p {
+ if c == cc {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ p = append(color.Palette{c}, p...)
+ }
+
+ return p
+}
+
+// ReplaceColorInPalette will replace the color in palette p closest to c in Euclidean
+// R,G,B,A space with c.
+func ReplaceColorInPalette(c color.Color, p color.Palette) {
+ p[p.Index(c)] = c
+}
+
+func hexStringToColor(s string) (color.Color, error) {
+ s = strings.TrimPrefix(s, "#")
+
+ if len(s) != 3 && len(s) != 6 {
+ return nil, errors.Errorf("invalid color code: %q", s)
+ }
+
+ s = strings.ToLower(s)
+
+ if len(s) == 3 {
+ var v string
+ for _, r := range s {
+ v += string(r) + string(r)
+ }
+ s = v
+ }
+
+ // Standard colors.
+ if s == "ffffff" {
+ return color.White, nil
+ }
+
+ if s == "000000" {
+ return color.Black, nil
+ }
+
+ // Set Alfa to white.
+ s += "ff"
+
+ b, err := hex.DecodeString(s)
+ if err != nil {
+ return nil, err
+ }
+
+ return color.RGBA{b[0], b[1], b[2], b[3]}, nil
+
+}