@@ -38,7 +38,94 @@ const Color Color::purple(0.5, 0.0, 0.5, 1.0, "Purple");
3838const Color Color::magenta (1.0 , 0.0 , 1.0 , 1.0 , " Magenta" );
3939const Color Color::black (0.0 , 0.0 , 0.0 , 1.0 , " Black" );
4040const Color Color::white (1.0 , 1.0 , 1.0 , 1.0 , " White" );
41- const Color Color::transparent (0.0 , 0.0 , 0.0 , 0.0 , " Transparent" );
41+
42+ Color*
43+ Color::from_hex (std::string const & color)
44+ {
45+ std::string temp = color;
46+ if (temp[0 ] == ' #' )
47+ {
48+ temp = temp.substr (1 );
49+ }
50+ else if (temp[0 ] == ' 0' and (temp[1 ] == ' x' or temp[1 ] == ' X' ))
51+ {
52+ temp = temp.substr (2 );
53+ }
54+
55+ double _r, _g, _b, _a;
56+ // 0xFFFFFFFF (rgba, 255)
57+ int BASE_16 = 16 ;
58+ double BASE_16_DIV = 255.0 ;
59+ double BASE_8_DIV = 15.0 ;
60+ if (temp.length () == 8 )
61+ {
62+ _r = std::stoi (temp.substr (0 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
63+ _g = std::stoi (temp.substr (2 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
64+ _b = std::stoi (temp.substr (4 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
65+ _a = std::stoi (temp.substr (6 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
66+ }
67+ // 0xFFFFFF (rgb, 255)
68+ else if (temp.length () == 6 )
69+ {
70+ _r = std::stoi (temp.substr (0 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
71+ _g = std::stoi (temp.substr (2 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
72+ _b = std::stoi (temp.substr (4 , 2 ), nullptr , BASE_16 ) / BASE_16_DIV ;
73+ _a = 1.0 ;
74+ }
75+ // 0xFFF (rgb, 16)
76+ else if (temp.length () == 3 )
77+ {
78+ _r = std::stoi (temp.substr (0 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
79+ _g = std::stoi (temp.substr (1 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
80+ _b = std::stoi (temp.substr (2 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
81+ _a = 1.0 ;
82+ }
83+ // 0xFFFF (rgba, 16)
84+ else if (temp.length () == 4 )
85+ {
86+ _r = std::stoi (temp.substr (0 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
87+ _g = std::stoi (temp.substr (1 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
88+ _b = std::stoi (temp.substr (2 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
89+ _a = std::stoi (temp.substr (3 , 1 ), nullptr , BASE_16 ) / BASE_8_DIV ;
90+ }
91+ else {
92+ throw std::invalid_argument (" Invalid hex format" );
93+ }
94+ return new Color (_r, _g, _b, _a);
95+ }
96+
97+ Color*
98+ Color::from_int_list (std::vector<int > const & color, int bit_depth)
99+ {
100+ double depth = pow (2 , bit_depth) - 1.0 ; // e.g. 8 = 255.0
101+ if (color.size () == 3 )
102+ return new Color (color[0 ] / depth, color[1 ] / depth, color[2 ] / depth, 1.0 );
103+ else if (color.size () == 4 )
104+ return new Color (color[0 ] / depth, color[1 ] / depth, color[2 ] / depth, color[3 ] / depth);
105+
106+ throw std::invalid_argument (" List must have exactly 3 or 4 elements" );
107+ }
108+
109+ Color*
110+ Color::from_agbr_int (unsigned int agbr) noexcept
111+ {
112+ auto conv_r = (agbr & 0xFF ) / 255.0 ;
113+ auto conv_g = ((agbr >> 16 ) & 0xFF ) / 255.0 ;
114+ auto conv_b = ((agbr >> 8 ) & 0xFF ) / 255.0 ;
115+ auto conv_a = ((agbr >> 24 ) & 0xFF ) / 255.0 ;
116+ return new Color (conv_r, conv_g, conv_b, conv_a);
117+ }
118+
119+ Color*
120+ Color::from_float_list (std::vector<double > const & color)
121+ {
122+ if (color.size () == 3 )
123+ return new Color (color[0 ], color[1 ], color[2 ], 1.0 );
124+ else if (color.size () == 4 )
125+ return new Color (color[0 ], color[1 ], color[2 ], color[3 ]);
126+
127+ throw std::invalid_argument (" List must have exactly 3 or 4 elements" );
128+ }
42129
43130std::string
44131Color::to_hex ()
0 commit comments