16 #ifndef AGG_GAMMA_LUT_INCLUDED 17 #define AGG_GAMMA_LUT_INCLUDED 20 #include "agg_basics.h" 21 #include "agg_gamma_functions.h" 25 template<
class LoResT=int8u,
27 unsigned GammaShift=8,
35 gamma_shift = GammaShift,
36 gamma_size = 1 << gamma_shift,
37 gamma_mask = gamma_size - 1
42 hi_res_shift = HiResShift,
43 hi_res_size = 1 << hi_res_shift,
44 hi_res_mask = hi_res_size - 1
59 for(i = 0; i < gamma_size; i++)
61 m_dir_gamma[i] = HiResT(i << (hi_res_shift - gamma_shift));
64 for(i = 0; i < hi_res_size; i++)
66 m_inv_gamma[i] = LoResT(i >> (hi_res_shift - gamma_shift));
83 for(i = 0; i < gamma_size; i++)
85 m_dir_gamma[i] = (HiResT)
86 uround(std::pow(i /
double(gamma_mask), m_gamma) * double(hi_res_mask));
89 double inv_g = 1.0 / g;
90 for(i = 0; i < hi_res_size; i++)
92 m_inv_gamma[i] = (LoResT)
93 uround(std::pow(i /
double(hi_res_mask), inv_g) *
double(gamma_mask));
102 HiResT dir(LoResT v)
const 104 return m_dir_gamma[unsigned(v)];
107 LoResT inv(HiResT v)
const 109 return m_inv_gamma[unsigned(v)];
114 const self_type& operator = (
const self_type&);
128 template<
class LinearType>
132 LinearType dir(int8u v)
const 134 return m_dir_table[v];
137 int8u inv(LinearType v)
const 141 if (v > m_inv_table[128]) x = 128;
142 if (v > m_inv_table[x + 64]) x += 64;
143 if (v > m_inv_table[x + 32]) x += 32;
144 if (v > m_inv_table[x + 16]) x += 16;
145 if (v > m_inv_table[x + 8]) x += 8;
146 if (v > m_inv_table[x + 4]) x += 4;
147 if (v > m_inv_table[x + 2]) x += 2;
148 if (v > m_inv_table[x + 1]) x += 1;
153 LinearType m_dir_table[256];
154 LinearType m_inv_table[256];
165 template<
class LinearType>
177 for (
unsigned i = 1; i <= 255; ++i)
180 m_dir_table[i] = float(sRGB_to_linear(i / 255.0));
181 m_inv_table[i] = float(sRGB_to_linear((i - 0.5) / 255.0));
195 for (
int i = 1; i <= 255; ++i)
198 m_dir_table[i] = uround(65535.0 * sRGB_to_linear(i / 255.0));
199 m_inv_table[i] = uround(65535.0 * sRGB_to_linear((i - 0.5) / 255.0));
213 for (
int i = 1; i <= 255; ++i)
216 m_dir_table[i] = uround(255.0 * sRGB_to_linear(i / 255.0));
217 m_inv_table[i] = uround(255.0 * linear_to_sRGB(i / 255.0));
221 int8u inv(int8u v)
const 224 return m_inv_table[v];
234 static T rgb_from_sRGB(int8u x)
239 static int8u rgb_to_sRGB(T x)
262 static float alpha_from_sRGB(int8u x)
264 static const double y = 1 / 255.0;
268 static int8u alpha_to_sRGB(
float x)
271 if (x > 1)
return 255;
272 return int8u(0.5 + x * 255);
280 static int16u alpha_from_sRGB(int8u x)
285 static int8u alpha_to_sRGB(int16u x)
295 static int8u alpha_from_sRGB(int8u x)
300 static int8u alpha_to_sRGB(int8u x)