aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk/TextureRender.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk/TextureRender.cc')
-rw-r--r--src/FbTk/TextureRender.cc163
1 files changed, 13 insertions, 150 deletions
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