/src/mozilla-central/gfx/qcms/transform_util.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* vim: set ts=8 sw=8 noexpandtab: */ |
2 | | // qcms |
3 | | // Copyright (C) 2009 Mozilla Foundation |
4 | | // Copyright (C) 1998-2007 Marti Maria |
5 | | // |
6 | | // Permission is hereby granted, free of charge, to any person obtaining |
7 | | // a copy of this software and associated documentation files (the "Software"), |
8 | | // to deal in the Software without restriction, including without limitation |
9 | | // the rights to use, copy, modify, merge, publish, distribute, sublicense, |
10 | | // and/or sell copies of the Software, and to permit persons to whom the Software |
11 | | // is furnished to do so, subject to the following conditions: |
12 | | // |
13 | | // The above copyright notice and this permission notice shall be included in |
14 | | // all copies or substantial portions of the Software. |
15 | | // |
16 | | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
17 | | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO |
18 | | // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
19 | | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
20 | | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
21 | | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
22 | | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
23 | | |
24 | | #ifndef _QCMS_TRANSFORM_UTIL_H |
25 | | #define _QCMS_TRANSFORM_UTIL_H |
26 | | |
27 | | #include <stdlib.h> |
28 | | #include <math.h> |
29 | | |
30 | 0 | #define CLU(table,x,y,z) table[(x*len + y*x_len + z*xy_len)*3] |
31 | | |
32 | | //XXX: could use a bettername |
33 | | typedef uint16_t uint16_fract_t; |
34 | | |
35 | | float lut_interp_linear(double value, uint16_t *table, int length); |
36 | | float lut_interp_linear_float(float value, float *table, int length); |
37 | | uint16_t lut_interp_linear16(uint16_t input_value, uint16_t *table, int length); |
38 | | |
39 | | |
40 | | static inline float lerp(float a, float b, float t) |
41 | 0 | { |
42 | 0 | return a*(1.f-t) + b*t; |
43 | 0 | } Unexecuted instantiation: chain.c:lerp Unexecuted instantiation: transform.c:lerp Unexecuted instantiation: transform_util.c:lerp Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:lerp(float, float, float) |
44 | | |
45 | | static inline unsigned char clamp_u8(float v) |
46 | 0 | { |
47 | 0 | if (v > 255.) |
48 | 0 | return 255; |
49 | 0 | else if (v < 0) |
50 | 0 | return 0; |
51 | 0 | else |
52 | 0 | return floorf(v+.5); |
53 | 0 | } Unexecuted instantiation: chain.c:clamp_u8 Unexecuted instantiation: transform.c:clamp_u8 Unexecuted instantiation: transform_util.c:clamp_u8 Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:clamp_u8(float) |
54 | | |
55 | | static inline float clamp_float(float a) |
56 | 0 | { |
57 | 0 | /* One would naturally write this function as the following: |
58 | 0 | if (a > 1.) |
59 | 0 | return 1.; |
60 | 0 | else if (a < 0) |
61 | 0 | return 0; |
62 | 0 | else |
63 | 0 | return a; |
64 | 0 |
|
65 | 0 | However, that version will let NaNs pass through which is undesirable |
66 | 0 | for most consumers. |
67 | 0 | */ |
68 | 0 |
|
69 | 0 | if (a > 1.) |
70 | 0 | return 1.; |
71 | 0 | else if (a >= 0) |
72 | 0 | return a; |
73 | 0 | else // a < 0 or a is NaN |
74 | 0 | return 0; |
75 | 0 | } Unexecuted instantiation: chain.c:clamp_float Unexecuted instantiation: transform.c:clamp_float Unexecuted instantiation: transform_util.c:clamp_float Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:clamp_float(float) |
76 | | |
77 | | static inline float u8Fixed8Number_to_float(uint16_t x) |
78 | 0 | { |
79 | 0 | // 0x0000 = 0. |
80 | 0 | // 0x0100 = 1. |
81 | 0 | // 0xffff = 255 + 255/256 |
82 | 0 | return x/256.; |
83 | 0 | } Unexecuted instantiation: chain.c:u8Fixed8Number_to_float Unexecuted instantiation: transform.c:u8Fixed8Number_to_float Unexecuted instantiation: transform_util.c:u8Fixed8Number_to_float Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:u8Fixed8Number_to_float(unsigned short) |
84 | | |
85 | | float *build_input_gamma_table(struct curveType *TRC); |
86 | | struct matrix build_colorant_matrix(qcms_profile *p); |
87 | | void build_output_lut(struct curveType *trc, |
88 | | uint16_t **output_gamma_lut, size_t *output_gamma_lut_length); |
89 | | |
90 | | struct matrix matrix_invert(struct matrix mat); |
91 | | qcms_bool compute_precache(struct curveType *trc, uint8_t *output); |
92 | | |
93 | | // Tested by GTest |
94 | | #ifdef __cplusplus |
95 | | extern "C" { |
96 | | #endif |
97 | | |
98 | | uint16_fract_t lut_inverse_interp16(uint16_t Value, uint16_t LutTable[], int length); |
99 | | |
100 | | #ifdef __cplusplus |
101 | | } |
102 | | #endif |
103 | | |
104 | | #endif |