summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/jesseduffield/gocui/attribute.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jesseduffield/gocui/attribute.go')
-rw-r--r--vendor/github.com/jesseduffield/gocui/attribute.go173
1 files changed, 153 insertions, 20 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/attribute.go b/vendor/github.com/jesseduffield/gocui/attribute.go
index 5b46b1427..54e39fc2b 100644
--- a/vendor/github.com/jesseduffield/gocui/attribute.go
+++ b/vendor/github.com/jesseduffield/gocui/attribute.go
@@ -1,32 +1,165 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
+// Copyright 2020 The gocui Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package gocui
-import "github.com/jesseduffield/termbox-go"
+import "github.com/gdamore/tcell/v2"
-// Attribute represents a terminal attribute, like color, font style, etc. They
-// can be combined using bitwise OR (|). Note that it is not possible to
-// combine multiple color attributes.
-type Attribute termbox.Attribute
+// Attribute affects the presentation of characters, such as color, boldness, etc.
+type Attribute uint64
-// Color attributes.
const (
- ColorDefault Attribute = Attribute(termbox.ColorDefault)
- ColorBlack = Attribute(termbox.ColorBlack)
- ColorRed = Attribute(termbox.ColorRed)
- ColorGreen = Attribute(termbox.ColorGreen)
- ColorYellow = Attribute(termbox.ColorYellow)
- ColorBlue = Attribute(termbox.ColorBlue)
- ColorMagenta = Attribute(termbox.ColorMagenta)
- ColorCyan = Attribute(termbox.ColorCyan)
- ColorWhite = Attribute(termbox.ColorWhite)
+ // ColorDefault is used to leave the Color unchanged from whatever system or teminal default may exist.
+ ColorDefault = Attribute(tcell.ColorDefault)
+
+ // AttrIsValidColor is used to indicate the color value is actually
+ // valid (initialized). This is useful to permit the zero value
+ // to be treated as the default.
+ AttrIsValidColor = Attribute(tcell.ColorValid)
+
+ // AttrIsRGBColor is used to indicate that the Attribute value is RGB value of color.
+ // The lower order 3 bytes are RGB.
+ // (It's not a color in basic ANSI range 256).
+ AttrIsRGBColor = Attribute(tcell.ColorIsRGB)
+
+ // AttrColorBits is a mask where color is located in Attribute
+ AttrColorBits = 0xffffffffff // roughly 5 bytes, tcell uses 4 bytes and half-byte as a special flags for color (rest is reserved for future)
+
+ // AttrStyleBits is a mask where character attributes (e.g.: bold, italic, underline) are located in Attribute
+ AttrStyleBits = 0xffffff0000000000 // remaining 3 bytes in the 8 bytes Attribute (tcell is not using it, so we should be fine)
+)
+
+// Color attributes. These colors are compatible with tcell.Color type and can be expanded like:
+// g.FgColor := gocui.Attribute(tcell.ColorLime)
+const (
+ ColorBlack Attribute = AttrIsValidColor + iota
+ ColorRed
+ ColorGreen
+ ColorYellow
+ ColorBlue
+ ColorMagenta
+ ColorCyan
+ ColorWhite
)
-// Text style attributes.
+// grayscale indexes (for backward compatibility with termbox-go original grayscale)
+var grayscale = []tcell.Color{
+ 16, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
+ 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 231,
+}
+
+// Attributes are not colors, but effects (e.g.: bold, dim) which affect the display of text.
+// They can be combined.
const (
- AttrBold Attribute = Attribute(termbox.AttrBold)
- AttrUnderline = Attribute(termbox.AttrUnderline)
- AttrReverse = Attribute(termbox.AttrReverse)
+ AttrBold Attribute = 1 << (40 + iota)
+ AttrBlink
+ AttrReverse
+ AttrUnderline
+ AttrDim
+ AttrItalic
+ AttrStrikeThrough
+ AttrNone Attribute = 0 // Just normal text.
)
+
+// AttrAll represents all the text effect attributes turned on
+const AttrAll = AttrBold | AttrBlink | AttrReverse | AttrUnderline | AttrDim | AttrItalic
+
+// IsValidColor indicates if the Attribute is a valid color value (has been set).
+func (a Attribute) IsValidColor() bool {
+ return a&AttrIsValidColor != 0
+}
+
+// Hex returns the color's hexadecimal RGB 24-bit value with each component
+// consisting of a single byte, ala R << 16 | G << 8 | B. If the color
+// is unknown or unset, -1 is returned.
+//
+// This function produce the same output as `tcell.Hex()` with additional
+// support for `termbox-go` colors (to 256).
+func (a Attribute) Hex() int32 {
+ if !a.IsValidColor() {
+ return -1
+ }
+ tc := getTcellColor(a, OutputTrue)
+ return tc.Hex()
+}
+
+// RGB returns the red, green, and blue components of the color, with
+// each component represented as a value 0-255. If the color
+// is unknown or unset, -1 is returned for each component.
+//
+// This function produce the same output as `tcell.RGB()` with additional
+// support for `termbox-go` colors (to 256).
+func (a Attribute) RGB() (int32, int32, int32) {
+ v := a.Hex()
+ if v < 0 {
+ return -1, -1, -1
+ }
+ return (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff
+}
+
+// GetColor creates a Color from a color name (W3C name). A hex value may
+// be supplied as a string in the format "#ffffff".
+func GetColor(color string) Attribute {
+ return Attribute(tcell.GetColor(color))
+}
+
+// Get256Color creates Attribute which stores ANSI color (0-255)
+func Get256Color(color int32) Attribute {
+ return Attribute(color) | AttrIsValidColor
+}
+
+// GetRGBColor creates Attribute which stores RGB color.
+// Color is passed as 24bit RGB value, where R << 16 | G << 8 | B
+func GetRGBColor(color int32) Attribute {
+ return Attribute(color) | AttrIsValidColor | AttrIsRGBColor
+}
+
+// NewRGBColor creates Attribute which stores RGB color.
+func NewRGBColor(r, g, b int32) Attribute {
+ return Attribute(tcell.NewRGBColor(r, g, b))
+}
+
+// getTcellColor transform Attribute into tcell.Color
+func getTcellColor(c Attribute, omode OutputMode) tcell.Color {
+ c = c & AttrColorBits
+ // Default color is 0 in tcell/v2 and was 0 in termbox-go, so we are good here
+ if c == ColorDefault {
+ return tcell.ColorDefault
+ }
+
+ tc := tcell.ColorDefault
+ // Check if we have valid color
+ if c.IsValidColor() {
+ tc = tcell.Color(c)
+ } else if c > 0 && c <= 256 {
+ // It's not valid color, but it has value in range 1-256
+ // This is old Attribute style of color from termbox-go (black=1, etc.)
+ // convert to tcell color (black=0|ColorValid)
+ tc = tcell.Color(c-1) | tcell.ColorValid
+ }
+
+ switch omode {
+ case OutputTrue:
+ return tc
+ case OutputNormal:
+ tc &= tcell.Color(0xf) | tcell.ColorValid
+ case Output256:
+ tc &= tcell.Color(0xff) | tcell.ColorValid
+ case Output216:
+ tc &= tcell.Color(0xff)
+ if tc > 215 {
+ return tcell.ColorDefault
+ }
+ tc += tcell.Color(16) | tcell.ColorValid
+ case OutputGrayscale:
+ tc &= tcell.Color(0x1f)
+ if tc > 26 {
+ return tcell.ColorDefault
+ }
+ tc = grayscale[tc] | tcell.ColorValid
+ default:
+ return tcell.ColorDefault
+ }
+ return tc
+}