aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/color.h
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-07-24 00:50:58 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-07-24 00:59:27 -0700
commitb4f53143b0e05fd3061cdf2e65e17a6a2904090b (patch)
tree4785bf31f7b89fc2420aa740d9a6967dc6c6f9b1 /src/color.h
parent9c2fdc6da57032c4448b59de5872086eea626b74 (diff)
Migrate source files into src/ directory
This change moves source files into a src/ directory, and puts object files into an obj/ directory. The Makefile and xcode project are updated accordingly. Fixes #1866
Diffstat (limited to 'src/color.h')
-rw-r--r--src/color.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/color.h b/src/color.h
new file mode 100644
index 00000000..b3da47d0
--- /dev/null
+++ b/src/color.h
@@ -0,0 +1,185 @@
+/** \file color.h Color class.
+ */
+#ifndef FISH_COLOR_H
+#define FISH_COLOR_H
+
+#include <stdint.h>
+#include <cstddef>
+#include "config.h"
+#include "common.h"
+
+/* 24 bit color */
+struct color24_t
+{
+ unsigned char rgb[3];
+};
+
+/* A type that represents a color. We work hard to keep it at a size of 4 bytes. */
+class rgb_color_t
+{
+
+ /* Types */
+ enum
+ {
+ type_none,
+ type_named,
+ type_rgb,
+ type_normal,
+ type_reset,
+ type_ignore
+ };
+ unsigned char type:4;
+
+ /* Flags */
+ enum
+ {
+ flag_bold = 1 << 0,
+ flag_underline = 1 << 1
+ };
+ unsigned char flags:4;
+
+ union
+ {
+ unsigned char name_idx; //0-10
+ color24_t color;
+ } data;
+
+ /** Try parsing a special color name like "normal" */
+ bool try_parse_special(const wcstring &str);
+
+ /** Try parsing an rgb color like "#F0A030" */
+ bool try_parse_rgb(const wcstring &str);
+
+ /** Try parsing an explicit color name like "magenta" */
+ bool try_parse_named(const wcstring &str);
+
+ /* Parsing entry point */
+ void parse(const wcstring &str);
+
+ /** Private constructor */
+ explicit rgb_color_t(unsigned char t, unsigned char i=0);
+
+public:
+
+ /** Default constructor of type none */
+ explicit rgb_color_t() : type(type_none), flags(), data() {}
+
+ /** Parse a color from a string */
+ explicit rgb_color_t(const wcstring &str);
+ explicit rgb_color_t(const std::string &str);
+
+ /** Returns white */
+ static rgb_color_t white();
+
+ /** Returns black */
+ static rgb_color_t black();
+
+ /** Returns the reset special color */
+ static rgb_color_t reset();
+
+ /** Returns the normal special color */
+ static rgb_color_t normal();
+
+ /** Returns the ignore special color */
+ static rgb_color_t ignore();
+
+ /** Returns the none special color */
+ static rgb_color_t none();
+
+ /** Returns whether the color is the ignore special color */
+ bool is_ignore(void) const
+ {
+ return type == type_ignore;
+ }
+
+ /** Returns whether the color is the normal special color */
+ bool is_normal(void) const
+ {
+ return type == type_normal;
+ }
+
+ /** Returns whether the color is the reset special color */
+ bool is_reset(void) const
+ {
+ return type == type_reset;
+ }
+
+ /** Returns whether the color is the none special color */
+ bool is_none(void) const
+ {
+ return type == type_none;
+ }
+
+ /** Returns whether the color is a named color (like "magenta") */
+ bool is_named(void) const
+ {
+ return type == type_named;
+ }
+
+ /** Returns whether the color is specified via RGB components */
+ bool is_rgb(void) const
+ {
+ return type == type_rgb;
+ }
+
+ /** Returns whether the color is special, that is, not rgb or named */
+ bool is_special(void) const
+ {
+ return type != type_named && type != type_rgb;
+ }
+
+ /** Returns a description of the color */
+ wcstring description() const;
+
+ /** Returns the name index for the given color. Requires that the color be named or RGB. */
+ unsigned char to_name_index() const;
+
+ /** Returns the term256 index for the given color. Requires that the color be RGB. */
+ unsigned char to_term256_index() const;
+
+ /** Returns the 24 bit color for the given color. Requires that the color be RGB. */
+ color24_t to_color24() const;
+
+ /** Returns whether the color is bold */
+ bool is_bold() const
+ {
+ return !!(flags & flag_bold);
+ }
+
+ /** Set whether the color is bold */
+ void set_bold(bool x)
+ {
+ if (x) flags |= flag_bold;
+ else flags &= ~flag_bold;
+ }
+
+ /** Returns whether the color is underlined */
+ bool is_underline() const
+ {
+ return !!(flags & flag_underline);
+ }
+
+ /** Set whether the color is underlined */
+ void set_underline(bool x)
+ {
+ if (x) flags |= flag_underline;
+ else flags &= ~flag_underline;
+ }
+
+ /** Compare two colors for equality */
+ bool operator==(const rgb_color_t &other) const
+ {
+ return type == other.type && ! memcmp(&data, &other.data, sizeof data);
+ }
+
+ /** Compare two colors for inequality */
+ bool operator!=(const rgb_color_t &other) const
+ {
+ return !(*this == other);
+ }
+
+ /** Returns the names of all named colors */
+ static wcstring_list_t named_color_names(void);
+};
+
+#endif