1/*
2 * Copyright 2006, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stephan A��mus <superstippi@gmx.de>
7 */
8
9#include <math.h>
10
11#include "blending.h"
12
13#if GAMMA_BLEND
14
15// speed tests done on Pentium M, 1450 MHz
16// blending two 800x600 bitmaps with "50" on each component (including alpha): 1500000 usecs
17// -"-														  using gamma LUT:  651000 usecs
18// -"-													   no use of floorf():  572000 usecs
19
20// -"-												   uint16 integer version:   72000 usecs
21// -"-																   inline:   60200 usecs
22
23// for comparison:
24// -"-								inline only, no LUTs, no gamma correction:   44000 usecs
25// -"-							   + premultiplied alpha (less MULs, no DIVs):   16500 usecs
26
27
28const float kGamma = 2.2;
29const float kInverseGamma = 1.0 / kGamma;
30
31uint16* kGammaTable = NULL;
32uint8* kInverseGammaTable = NULL;
33
34
35// convert_to_gamma
36uint16
37convert_to_gamma(uint8 value)
38{
39	return kGammaTable[value];
40}
41
42// init_gamma_blending
43void
44init_gamma_blending()
45{
46	// init LUT R'G'B' [0...255] -> RGB [0...25500]
47	if (!kGammaTable)
48		kGammaTable = new uint16[256];
49	for (uint32 i = 0; i < 256; i++)
50		kGammaTable[i] = (uint16)(powf((float)i / 255.0, kGamma) * 25500.0);
51
52	// init LUT RGB [0...25500] -> R'G'B' [0...255]
53	if (!kInverseGammaTable)
54		kInverseGammaTable = new uint8[25501];
55	for (uint32 i = 0; i < 25501; i++)
56		kInverseGammaTable[i] = (uint8)(powf((float)i / 25500.0, kInverseGamma) * 255.0);
57}
58
59// init_gamma_blending
60void
61uninit_gamma_blending()
62{
63	delete[] kGammaTable;
64	kGammaTable = NULL;
65	delete[] kInverseGammaTable;
66	kInverseGammaTable = NULL;
67}
68
69
70#endif // GAMMA_BLEND
71