6 static uint16_t sixd_to_16bit(int x
)
8 // This formula comes from st.
9 return x
== 0 ? 0 : 0x3737 + 0x2828 * x
;
12 void Colors::init(Display
* display_in
)
20 int screen
= XDefaultScreen(display
);
21 Visual
* visual
= XDefaultVisual(display
, screen
);
22 Colormap colormap
= XDefaultColormap(display
, screen
);
23 XRenderColor render_color
;
24 render_color
.alpha
= 0xFFFF;
26 // 16 "themed" colors.
27 static uint32_t default_color_theme
[] = {
28 0x000000, 0xCD0000, 0x00CD00, 0xCDCD00, 0x0000EE, 0xCD00CD, 0x00CDCD, 0xE5E5E5,
29 0x7F7F7F, 0xFF0000, 0x00FF00, 0xFFFF00, 0x5C5CFF, 0xFF00FF, 0x00FFFF, 0xFFFFFF,
31 for (i
= 0; i
< 16; ++i
) {
32 uint32_t color
= default_color_theme
[i
];
33 render_color
.red
= (color
& 0xFF0000) >> 8 | (color
& 0xFF0000) >> 16;
34 render_color
.green
= (color
& 0xFF00) | (color
& 0xFF00) >> 8;
35 render_color
.blue
= (color
& 0xFF) << 8 | (color
& 0xFF);
37 display
, visual
, colormap
,
38 &render_color
, &indexed_colors
[i
]);
42 static const int greyscale_start
= 16 + 6 * 6 * 6;
43 for (i
= 16; i
< greyscale_start
; ++i
) {
45 render_color
.red
= sixd_to_16bit((color
/ 36) % 6);
46 render_color
.green
= sixd_to_16bit((color
/ 6) % 6);
47 render_color
.blue
= sixd_to_16bit(color
% 6);
49 display
, visual
, colormap
,
50 &render_color
, &indexed_colors
[i
]);
53 // 24 greyscale colors.
54 for (i
= greyscale_start
; i
< 256; ++i
) {
55 int greyness
= i
- greyscale_start
;
56 render_color
.red
= 0x0808 + 0x0A0A * greyness
;
57 render_color
.green
= render_color
.blue
= render_color
.red
;
59 display
, visual
, colormap
,
60 &render_color
, &indexed_colors
[i
]);
72 int screen
= XDefaultScreen(display
);
73 Visual
* visual
= XDefaultVisual(display
, screen
);
74 Colormap colormap
= XDefaultColormap(display
, screen
);
76 for (int i
= 0; i
< 256; ++i
)
77 XftColorFree(display
, visual
, colormap
, &indexed_colors
[i
]);
78 for (auto& color
: true_colors
)
79 XftColorFree(display
, visual
, colormap
, &color
.second
);
83 const XftColor
* Colors::xft_color(uint32_t color
)
86 return &indexed_colors
[color
];
88 // Otherwise, treat it as true color (even if the true_color_bit isn't set).
89 color
&= ~true_color_bit
;
90 if (true_colors
.find(color
) == true_colors
.end()) {
92 XRenderColor render_color
;
93 render_color
.alpha
= 0xFFFF;
94 render_color
.red
= (color
& 0xFF0000) >> 8 | (color
& 0xFF0000) >> 16;
95 render_color
.green
= (color
& 0xFF00) | (color
& 0xFF00) >> 8;
96 render_color
.blue
= (color
& 0xFF) << 8 | (color
& 0xFF);
98 int screen
= XDefaultScreen(display
);
99 Visual
* visual
= XDefaultVisual(display
, screen
);
100 Colormap colormap
= XDefaultColormap(display
, screen
);
102 display
, visual
, colormap
,
103 &render_color
, &true_colors
[color
]);
105 return &true_colors
[color
];