That Terminal
A terminal emulator designed for video making purposes.
color.hh
Go to the documentation of this file.
1 #ifndef bqtColorHH
2 #define bqtColorHH
7 #include <array>
8 #include <string>
9 #include <algorithm>
10 
22 unsigned ParseColorName(std::string_view s);
23 unsigned ParseColorName(std::u32string_view s);
24 
28 inline constexpr std::array<unsigned,3> Unpack(unsigned rgb)
29 {
30  return { rgb>>16, (rgb>>8)&0xFF, rgb&0xFF };
31 }
32 
38 inline constexpr unsigned Repack(std::array<unsigned,3> rgb)
39 {
40  if(rgb[0] > 255 || rgb[1] > 255 || rgb[2] > 255) [[unlikely]]
41  {
42  // Clamp with desaturation:
43  float l = (rgb[0]*299u + rgb[1]*587u + rgb[2]*114u)*1e-3f, s = 1.f;
44  if(rgb[0] > 255) s = std::min(s, (l-255.f) / (l-rgb[0]));
45  if(rgb[1] > 255) s = std::min(s, (l-255.f) / (l-rgb[1]));
46  if(rgb[2] > 255) s = std::min(s, (l-255.f) / (l-rgb[2]));
47  rgb[0] = (rgb[0] - l) * s + l + 0.5f;
48  rgb[1] = (rgb[1] - l) * s + l + 0.5f;
49  rgb[2] = (rgb[2] - l) * s + l + 0.5f;
50  return (std::min(rgb[0],255u)<<16)
51  + (std::min(rgb[1],255u)<<8)
52  + (std::min(rgb[2],255u)<<0);
53  }
54  return (rgb[0] << 16)
55  + (rgb[1] << 8)
56  + (rgb[2] << 0);
57 }
58 
62 inline constexpr unsigned Mix(unsigned color1,unsigned color2,
63  unsigned fac1,unsigned fac2,
64  unsigned sum)
65 {
66  auto a = Unpack(color1), b = Unpack(color2);
67  for(unsigned n=0; n<3; ++n) a[n] = (a[n]*fac1 + b[n]*fac2)/(sum);
68  return Repack(a);
69 }
70 
73 inline unsigned cmy2rgb(unsigned cmy)
74 {
75  return ~cmy & 0xFFFFFF;
76 }
79 inline unsigned cmyk2rgb(unsigned cmyk)
80 {
81  return Mix(0u, ~cmyk >> 8, cmyk & 255, ~cmyk & 255, 255);
82 }
83 
84 #endif
unsigned cmyk2rgb(unsigned cmyk)
Definition: color.hh:79
unsigned cmy2rgb(unsigned cmy)
Definition: color.hh:73
constexpr unsigned Mix(unsigned color1, unsigned color2, unsigned fac1, unsigned fac2, unsigned sum)
Definition: color.hh:62
constexpr std::array< unsigned, 3 > Unpack(unsigned rgb)
Definition: color.hh:28
constexpr unsigned Repack(std::array< unsigned, 3 > rgb)
Definition: color.hh:38
unsigned ParseColorName(std::string_view s)
Definition: color.cc:828