aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/ColorLUT.cc166
-rw-r--r--src/FbTk/ColorLUT.hh34
-rw-r--r--src/FbTk/Makefile.am4
-rw-r--r--src/FbTk/Texture.cc34
-rw-r--r--src/FbTk/TextureRender.cc163
5 files changed, 237 insertions, 164 deletions
diff --git a/src/FbTk/ColorLUT.cc b/src/FbTk/ColorLUT.cc
new file mode 100644
index 0000000..97af8aa
--- /dev/null
+++ b/src/FbTk/ColorLUT.cc
@@ -0,0 +1,166 @@
1// ColorLUT.cc for Fluxbox Window Manager
2// Copyright (c) 2013 - Mathias Gumz <akira at fluxbox dot org>
3//
4// Permission is hereby granted, free of charge, to any person obtaining a
5// copy of this software and associated documentation files (the "Software"),
6// to deal in the Software without restriction, including without limitation
7// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8// and/or sell copies of the Software, and to permit persons to whom the
9// Software is furnished to do so, subject to the following conditions:
10//
11// The above copyright notice and this permission notice shall be included in
12// all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE.
21
22
23#include "ColorLUT.hh"
24
25
26// created by:
27//
28// #include <unistd.h>
29// #include <stdlib.h>
30// int main(int argc, char **argv) {
31//
32// double s = 1.0;
33//
34// if (argc > 1) {
35// s = atof(argv[1]);
36// }
37//
38// size_t i; unsigned char c; double v;
39// for (i = 0; i < 256; ++i) {
40// c = 255;
41// v = s * i;
42// if (v < c)
43// c = (unsigned char)v;
44// write(1, &c, 1);
45// }
46//
47// return 0;
48// }
49//
50// and then piped to 'xxd -i'
51
52// ./a.out 1.5 | xxd -i -c 8 # value + (value >> 1))
53//
54
55namespace FbTk {
56
57const unsigned char ColorLUT::PRE_MULTIPLY_1_5[256] = {
58 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a,
59 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x16,
60 0x18, 0x19, 0x1b, 0x1c, 0x1e, 0x1f, 0x21, 0x22,
61 0x24, 0x25, 0x27, 0x28, 0x2a, 0x2b, 0x2d, 0x2e,
62 0x30, 0x31, 0x33, 0x34, 0x36, 0x37, 0x39, 0x3a,
63 0x3c, 0x3d, 0x3f, 0x40, 0x42, 0x43, 0x45, 0x46,
64 0x48, 0x49, 0x4b, 0x4c, 0x4e, 0x4f, 0x51, 0x52,
65 0x54, 0x55, 0x57, 0x58, 0x5a, 0x5b, 0x5d, 0x5e,
66 0x60, 0x61, 0x63, 0x64, 0x66, 0x67, 0x69, 0x6a,
67 0x6c, 0x6d, 0x6f, 0x70, 0x72, 0x73, 0x75, 0x76,
68 0x78, 0x79, 0x7b, 0x7c, 0x7e, 0x7f, 0x81, 0x82,
69 0x84, 0x85, 0x87, 0x88, 0x8a, 0x8b, 0x8d, 0x8e,
70 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x99, 0x9a,
71 0x9c, 0x9d, 0x9f, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6,
72 0xa8, 0xa9, 0xab, 0xac, 0xae, 0xaf, 0xb1, 0xb2,
73 0xb4, 0xb5, 0xb7, 0xb8, 0xba, 0xbb, 0xbd, 0xbe,
74 0xc0, 0xc1, 0xc3, 0xc4, 0xc6, 0xc7, 0xc9, 0xca,
75 0xcc, 0xcd, 0xcf, 0xd0, 0xd2, 0xd3, 0xd5, 0xd6,
76 0xd8, 0xd9, 0xdb, 0xdc, 0xde, 0xdf, 0xe1, 0xe2,
77 0xe4, 0xe5, 0xe7, 0xe8, 0xea, 0xeb, 0xed, 0xee,
78 0xf0, 0xf1, 0xf3, 0xf4, 0xf6, 0xf7, 0xf9, 0xfa,
79 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
81 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
82 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
83 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
84 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
85 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
86 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
87 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
88 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
89 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
90};
91
92// ./a.out 1.125 | xxd -i -c 8 # value + (value >> 3)
93const unsigned char ColorLUT::PRE_MULTIPLY_1_125[256] = {
94 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
95 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
96 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
97 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
98 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
99 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
100 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
101 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
102 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
103 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
104 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61,
105 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
106 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
107 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
108 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
109 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
110 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
111 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0,
112 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
113 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
114 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
115 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4,
116 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
117 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
118 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
119 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
120 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1,
121 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
122 0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
123 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
124 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
126};
127
128
129// ./a.out 0.75 | xxd -i -c 8 # (value >> 1) + (value >> 2))
130const unsigned char ColorLUT::PRE_MULTIPLY_0_75[256] = {
131 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05,
132 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b,
133 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11,
134 0x12, 0x12, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17,
135 0x18, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1c, 0x1d,
136 0x1e, 0x1e, 0x1f, 0x20, 0x21, 0x21, 0x22, 0x23,
137 0x24, 0x24, 0x25, 0x26, 0x27, 0x27, 0x28, 0x29,
138 0x2a, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, 0x2e, 0x2f,
139 0x30, 0x30, 0x31, 0x32, 0x33, 0x33, 0x34, 0x35,
140 0x36, 0x36, 0x37, 0x38, 0x39, 0x39, 0x3a, 0x3b,
141 0x3c, 0x3c, 0x3d, 0x3e, 0x3f, 0x3f, 0x40, 0x41,
142 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47,
143 0x48, 0x48, 0x49, 0x4a, 0x4b, 0x4b, 0x4c, 0x4d,
144 0x4e, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53,
145 0x54, 0x54, 0x55, 0x56, 0x57, 0x57, 0x58, 0x59,
146 0x5a, 0x5a, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5f,
147 0x60, 0x60, 0x61, 0x62, 0x63, 0x63, 0x64, 0x65,
148 0x66, 0x66, 0x67, 0x68, 0x69, 0x69, 0x6a, 0x6b,
149 0x6c, 0x6c, 0x6d, 0x6e, 0x6f, 0x6f, 0x70, 0x71,
150 0x72, 0x72, 0x73, 0x74, 0x75, 0x75, 0x76, 0x77,
151 0x78, 0x78, 0x79, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d,
152 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x83,
153 0x84, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89,
154 0x8a, 0x8a, 0x8b, 0x8c, 0x8d, 0x8d, 0x8e, 0x8f,
155 0x90, 0x90, 0x91, 0x92, 0x93, 0x93, 0x94, 0x95,
156 0x96, 0x96, 0x97, 0x98, 0x99, 0x99, 0x9a, 0x9b,
157 0x9c, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1,
158 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6, 0xa7,
159 0xa8, 0xa8, 0xa9, 0xaa, 0xab, 0xab, 0xac, 0xad,
160 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3,
161 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9,
162 0xba, 0xba, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf
163};
164
165}
166
diff --git a/src/FbTk/ColorLUT.hh b/src/FbTk/ColorLUT.hh
new file mode 100644
index 0000000..66b8493
--- /dev/null
+++ b/src/FbTk/ColorLUT.hh
@@ -0,0 +1,34 @@
1// ColorLUT.hh for Fluxbox Window Manager
2// Copyright (c) 2013 - Mathias Gumz <akira at fluxbox dot org>
3//
4// Permission is hereby granted, free of charge, to any person obtaining a
5// copy of this software and associated documentation files (the "Software"),
6// to deal in the Software without restriction, including without limitation
7// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8// and/or sell copies of the Software, and to permit persons to whom the
9// Software is furnished to do so, subject to the following conditions:
10//
11// The above copyright notice and this permission notice shall be included in
12// all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE.
21
22
23namespace FbTk {
24
25namespace ColorLUT {
26
27extern const unsigned char PRE_MULTIPLY_1_5[256];
28extern const unsigned char PRE_MULTIPLY_1_125[256];
29extern const unsigned char PRE_MULTIPLY_0_75[256];
30
31}
32
33}
34
diff --git a/src/FbTk/Makefile.am b/src/FbTk/Makefile.am
index 298b8c5..d54eaae 100644
--- a/src/FbTk/Makefile.am
+++ b/src/FbTk/Makefile.am
@@ -15,7 +15,9 @@ if IMLIB2
15imlib2_SOURCE= ImageImlib2.hh ImageImlib2.cc 15imlib2_SOURCE= ImageImlib2.hh ImageImlib2.cc
16endif 16endif
17 17
18libFbTk_a_SOURCES = App.hh App.cc Color.cc Color.hh Command.hh \ 18libFbTk_a_SOURCES = App.hh App.cc \
19 Color.cc Color.hh Command.hh \
20 ColorLUT.cc ColorLUT.hh \
19 Accessor.hh DefaultValue.hh \ 21 Accessor.hh DefaultValue.hh \
20 FileUtil.hh FileUtil.cc \ 22 FileUtil.hh FileUtil.cc \
21 EventHandler.hh EventManager.hh EventManager.cc \ 23 EventHandler.hh EventManager.hh EventManager.cc \
diff --git a/src/FbTk/Texture.cc b/src/FbTk/Texture.cc
index 408ff5b..da45bc4 100644
--- a/src/FbTk/Texture.cc
+++ b/src/FbTk/Texture.cc
@@ -32,6 +32,20 @@
32 #include <string.h> 32 #include <string.h>
33#endif 33#endif
34 34
35#include "ColorLUT.hh"
36
37namespace {
38
39unsigned short inline brighten(unsigned short c) {
40 return 0x101 * FbTk::ColorLUT::PRE_MULTIPLY_1_5[c];
41}
42
43unsigned short inline darken(unsigned short c) {
44 return 0x101 * FbTk::ColorLUT::PRE_MULTIPLY_0_75[c];
45}
46
47}
48
35namespace FbTk { 49namespace FbTk {
36 50
37void Texture::setFromString(const char * const texture_str) { 51void Texture::setFromString(const char * const texture_str) {
@@ -100,27 +114,21 @@ void Texture::setFromString(const char * const texture_str) {
100 114
101void Texture::calcHiLoColors(int screen_num) { 115void Texture::calcHiLoColors(int screen_num) {
102 Display *disp = FbTk::App::instance()->display(); 116 Display *disp = FbTk::App::instance()->display();
103 XColor xcol;
104 Colormap colm = DefaultColormap(disp, screen_num); 117 Colormap colm = DefaultColormap(disp, screen_num);
118 XColor xcol;
105 119
106 xcol.red = (unsigned int) (m_color.red() + (m_color.red() >> 1)); 120 xcol.red = ::brighten(m_color.red());
107 if (xcol.red >= 0xff) xcol.red = 0xffff; 121 xcol.green = ::brighten(m_color.green());
108 else xcol.red *= 0x101; 122 xcol.blue = ::brighten(m_color.blue());
109 xcol.green = (unsigned int) (m_color.green() + (m_color.green() >> 1));
110 if (xcol.green >= 0xff) xcol.green = 0xffff;
111 else xcol.green *= 0x101;
112 xcol.blue = (unsigned int) (m_color.blue() + (m_color.blue() >> 1));
113 if (xcol.blue >= 0xff) xcol.blue = 0xffff;
114 else xcol.blue *= 0x101;
115 123
116 if (! XAllocColor(disp, colm, &xcol)) 124 if (! XAllocColor(disp, colm, &xcol))
117 xcol.pixel = 0; 125 xcol.pixel = 0;
118 126
119 m_hicolor.setPixel(xcol.pixel); 127 m_hicolor.setPixel(xcol.pixel);
120 128
121 xcol.red = (unsigned int) ((m_color.red() >> 2) + (m_color.red() >> 1)) * 0x101; 129 xcol.red = ::darken(m_color.red());
122 xcol.green = (unsigned int) ((m_color.green() >> 2) + (m_color.green() >> 1)) * 0x101; 130 xcol.green = ::darken(m_color.green());
123 xcol.blue = (unsigned int) ((m_color.blue() >> 2) + (m_color.blue() >> 1)) * 0x101; 131 xcol.blue = ::darken(m_color.blue());
124 132
125 if (! XAllocColor(disp, colm, &xcol)) 133 if (! XAllocColor(disp, colm, &xcol))
126 xcol.pixel = 0; 134 xcol.pixel = 0;
diff --git a/src/FbTk/TextureRender.cc b/src/FbTk/TextureRender.cc
index 3dd1254..75c937e 100644
--- a/src/FbTk/TextureRender.cc
+++ b/src/FbTk/TextureRender.cc
@@ -32,6 +32,7 @@
32#include "GContext.hh" 32#include "GContext.hh"
33#include "I18n.hh" 33#include "I18n.hh"
34#include "StringUtil.hh" 34#include "StringUtil.hh"
35#include "ColorLUT.hh"
35 36
36#include <X11/Xutil.h> 37#include <X11/Xutil.h>
37#include <iostream> 38#include <iostream>
@@ -48,147 +49,9 @@ using std::endl;
48using std::string; 49using std::string;
49using std::max; 50using std::max;
50using std::min; 51using std::min;
51 52using FbTk::ColorLUT::PRE_MULTIPLY_1_5;
52namespace { 53using FbTk::ColorLUT::PRE_MULTIPLY_1_125;
53 54using FbTk::ColorLUT::PRE_MULTIPLY_0_75;
54// lookup tables to brighten or darken an unsigned char
55//
56// created by:
57//
58// #include <unistd.h>
59// #include <stdlib.h>
60// int main(int argc, char **argv) {
61//
62// double s = 1.0;
63//
64// if (argc > 1) {
65// s = atof(argv[1]);
66// }
67//
68// size_t i; unsigned char c; double v;
69// for (i = 0; i < 256; ++i) {
70// c = 255;
71// v = s * i;
72// if (v < c)
73// c = (unsigned char)v;
74// write(1, &c, 1);
75// }
76//
77// return 0;
78// }
79//
80// and then piped to 'xxd -i'
81
82// ./a.out 1.5 | xxd -i -c 8 # value + (value >> 1))
83const unsigned char LOOKUP_1_5[] = {
84 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a,
85 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x16,
86 0x18, 0x19, 0x1b, 0x1c, 0x1e, 0x1f, 0x21, 0x22,
87 0x24, 0x25, 0x27, 0x28, 0x2a, 0x2b, 0x2d, 0x2e,
88 0x30, 0x31, 0x33, 0x34, 0x36, 0x37, 0x39, 0x3a,
89 0x3c, 0x3d, 0x3f, 0x40, 0x42, 0x43, 0x45, 0x46,
90 0x48, 0x49, 0x4b, 0x4c, 0x4e, 0x4f, 0x51, 0x52,
91 0x54, 0x55, 0x57, 0x58, 0x5a, 0x5b, 0x5d, 0x5e,
92 0x60, 0x61, 0x63, 0x64, 0x66, 0x67, 0x69, 0x6a,
93 0x6c, 0x6d, 0x6f, 0x70, 0x72, 0x73, 0x75, 0x76,
94 0x78, 0x79, 0x7b, 0x7c, 0x7e, 0x7f, 0x81, 0x82,
95 0x84, 0x85, 0x87, 0x88, 0x8a, 0x8b, 0x8d, 0x8e,
96 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x99, 0x9a,
97 0x9c, 0x9d, 0x9f, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6,
98 0xa8, 0xa9, 0xab, 0xac, 0xae, 0xaf, 0xb1, 0xb2,
99 0xb4, 0xb5, 0xb7, 0xb8, 0xba, 0xbb, 0xbd, 0xbe,
100 0xc0, 0xc1, 0xc3, 0xc4, 0xc6, 0xc7, 0xc9, 0xca,
101 0xcc, 0xcd, 0xcf, 0xd0, 0xd2, 0xd3, 0xd5, 0xd6,
102 0xd8, 0xd9, 0xdb, 0xdc, 0xde, 0xdf, 0xe1, 0xe2,
103 0xe4, 0xe5, 0xe7, 0xe8, 0xea, 0xeb, 0xed, 0xee,
104 0xf0, 0xf1, 0xf3, 0xf4, 0xf6, 0xf7, 0xf9, 0xfa,
105 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
106 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
107 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
108 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
109 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
110 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
111 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
112 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
113 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
114 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
115 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
116};
117
118// ./a.out 1.125 | xxd -i -c 8 # value + (value >> 3)
119const unsigned char LOOKUP_1_125[] = {
120 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
121 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
122 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
123 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
124 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
125 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
126 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
127 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
128 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
129 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
130 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61,
131 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
132 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
133 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
134 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
135 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
136 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
137 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0,
138 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
139 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
140 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
141 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4,
142 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
143 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
144 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
145 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
146 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1,
147 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
148 0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
151 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
152};
153
154
155// ./a.out 0.75 | xxd -i -c 8 # (value >> 1) + (value >> 2))
156const unsigned char LOOKUP_0_75[] = {
157 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05,
158 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b,
159 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11,
160 0x12, 0x12, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17,
161 0x18, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1c, 0x1d,
162 0x1e, 0x1e, 0x1f, 0x20, 0x21, 0x21, 0x22, 0x23,
163 0x24, 0x24, 0x25, 0x26, 0x27, 0x27, 0x28, 0x29,
164 0x2a, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, 0x2e, 0x2f,
165 0x30, 0x30, 0x31, 0x32, 0x33, 0x33, 0x34, 0x35,
166 0x36, 0x36, 0x37, 0x38, 0x39, 0x39, 0x3a, 0x3b,
167 0x3c, 0x3c, 0x3d, 0x3e, 0x3f, 0x3f, 0x40, 0x41,
168 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47,
169 0x48, 0x48, 0x49, 0x4a, 0x4b, 0x4b, 0x4c, 0x4d,
170 0x4e, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53,
171 0x54, 0x54, 0x55, 0x56, 0x57, 0x57, 0x58, 0x59,
172 0x5a, 0x5a, 0x5b, 0x5c, 0x5d, 0x5d, 0x5e, 0x5f,
173 0x60, 0x60, 0x61, 0x62, 0x63, 0x63, 0x64, 0x65,
174 0x66, 0x66, 0x67, 0x68, 0x69, 0x69, 0x6a, 0x6b,
175 0x6c, 0x6c, 0x6d, 0x6e, 0x6f, 0x6f, 0x70, 0x71,
176 0x72, 0x72, 0x73, 0x74, 0x75, 0x75, 0x76, 0x77,
177 0x78, 0x78, 0x79, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d,
178 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x83,
179 0x84, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89,
180 0x8a, 0x8a, 0x8b, 0x8c, 0x8d, 0x8d, 0x8e, 0x8f,
181 0x90, 0x90, 0x91, 0x92, 0x93, 0x93, 0x94, 0x95,
182 0x96, 0x96, 0x97, 0x98, 0x99, 0x99, 0x9a, 0x9b,
183 0x9c, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1,
184 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6, 0xa7,
185 0xa8, 0xa8, 0xa9, 0xaa, 0xab, 0xab, 0xac, 0xad,
186 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3,
187 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9,
188 0xba, 0xba, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf
189};
190
191}
192 55
193namespace FbTk { 56namespace FbTk {
194 57
@@ -204,24 +67,24 @@ struct RGBA {
204 67
205 // 1.5 of current value, clamp to ~0 (0xff) 68 // 1.5 of current value, clamp to ~0 (0xff)
206 static void brighten_1_5(RGBA& color) { 69 static void brighten_1_5(RGBA& color) {
207 color.r = LOOKUP_1_5[color.r]; 70 color.r = PRE_MULTIPLY_1_5[color.r];
208 color.g = LOOKUP_1_5[color.g]; 71 color.g = PRE_MULTIPLY_1_5[color.g];
209 color.b = LOOKUP_1_5[color.b]; 72 color.b = PRE_MULTIPLY_1_5[color.b];
210 } 73 }
211 74
212 75
213 // 1.125 of current value 76 // 1.125 of current value
214 static void brighten_1_125(RGBA& color) { 77 static void brighten_1_125(RGBA& color) {
215 color.r = LOOKUP_1_125[color.r]; 78 color.r = PRE_MULTIPLY_1_125[color.r];
216 color.g = LOOKUP_1_125[color.g]; 79 color.g = PRE_MULTIPLY_1_125[color.g];
217 color.b = LOOKUP_1_125[color.b]; 80 color.b = PRE_MULTIPLY_1_125[color.b];
218 } 81 }
219 82
220 // 0.75 of old value 83 // 0.75 of old value
221 static void darken(RGBA& color) { 84 static void darken(RGBA& color) {
222 color.r = LOOKUP_0_75[color.r]; 85 color.r = PRE_MULTIPLY_0_75[color.r];
223 color.g = LOOKUP_0_75[color.g]; 86 color.g = PRE_MULTIPLY_0_75[color.g];
224 color.b = LOOKUP_0_75[color.b]; 87 color.b = PRE_MULTIPLY_0_75[color.b];
225 } 88 }
226 89
227 90