1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
5 // Permission to copy, use, modify, sell and distribute this software
6 // is granted provided this copyright notice appears in all copies.
7 // This software is provided "as is" without express or implied
8 // warranty, and with no claim as to its suitability for any purpose.
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
16 #ifndef AGG_GAMMA_LUT_INCLUDED
17 #define AGG_GAMMA_LUT_INCLUDED
20 #include "agg_basics.h"
24 template<class LoResT
=int8u
,
26 unsigned GammaShift
=8,
27 unsigned HiResShift
=8> class gamma_lut
30 typedef gamma_lut
<LoResT
, HiResT
, GammaShift
, HiResShift
> self_type
;
34 gamma_shift
= GammaShift
,
35 gamma_size
= 1 << gamma_shift
,
36 gamma_mask
= gamma_size
- 1
41 hi_res_shift
= HiResShift
,
42 hi_res_size
= 1 << hi_res_shift
,
43 hi_res_mask
= hi_res_size
- 1
48 pod_allocator
<LoResT
>::deallocate(m_inv_gamma
, hi_res_size
);
49 pod_allocator
<HiResT
>::deallocate(m_dir_gamma
, gamma_size
);
54 m_dir_gamma(pod_allocator
<HiResT
>::allocate(gamma_size
)),
55 m_inv_gamma(pod_allocator
<LoResT
>::allocate(hi_res_size
))
58 for(i
= 0; i
< gamma_size
; i
++)
60 m_dir_gamma
[i
] = HiResT(i
<< (hi_res_shift
- gamma_shift
));
63 for(i
= 0; i
< hi_res_size
; i
++)
65 m_inv_gamma
[i
] = LoResT(i
>> (hi_res_shift
- gamma_shift
));
71 m_dir_gamma(pod_allocator
<HiResT
>::allocate(gamma_size
)),
72 m_inv_gamma(pod_allocator
<LoResT
>::allocate(hi_res_size
))
82 for(i
= 0; i
< gamma_size
; i
++)
84 m_dir_gamma
[i
] = (HiResT
)
85 uround(pow(i
/ double(gamma_mask
), m_gamma
) * double(hi_res_mask
));
88 double inv_g
= 1.0 / g
;
89 for(i
= 0; i
< hi_res_size
; i
++)
91 m_inv_gamma
[i
] = (LoResT
)
92 uround(pow(i
/ double(hi_res_mask
), inv_g
) * double(gamma_mask
));
101 HiResT
dir(LoResT v
) const
103 return m_dir_gamma
[unsigned(v
)];
106 LoResT
inv(HiResT v
) const
108 return m_inv_gamma
[unsigned(v
)];
112 gamma_lut(const self_type
&);
113 const self_type
& operator = (const self_type
&);