summaryrefslogtreecommitdiffstats
path: root/third_party/qcms/src/transform.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/qcms/src/transform.c')
-rw-r--r--third_party/qcms/src/transform.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/third_party/qcms/src/transform.c b/third_party/qcms/src/transform.c
index cbdfa59..1e707b7 100644
--- a/third_party/qcms/src/transform.c
+++ b/third_party/qcms/src/transform.c
@@ -531,6 +531,9 @@ void qcms_transform_data_tetra_clut_rgba(qcms_transform *transform, unsigned cha
float c0_b, c1_b, c2_b, c3_b;
float clut_r, clut_g, clut_b;
+ if (!(transform->transform_flags & TRANSFORM_FLAG_CLUT_CACHE))
+ qcms_transform_build_clut_cache(transform);
+
for (i = 0; i < length; i++) {
unsigned char in_r = *src++;
unsigned char in_g = *src++;
@@ -539,17 +542,17 @@ void qcms_transform_data_tetra_clut_rgba(qcms_transform *transform, unsigned cha
float linear_r = in_r/255.0f, linear_g=in_g/255.0f, linear_b = in_b/255.0f;
- int x = floor(linear_r * (transform->grid_size-1));
- int y = floor(linear_g * (transform->grid_size-1));
- int z = floor(linear_b * (transform->grid_size-1));
+ int x = transform->floor_cache[in_r];
+ int y = transform->floor_cache[in_g];
+ int z = transform->floor_cache[in_b];
- int x_n = ceil(linear_r * (transform->grid_size-1));
- int y_n = ceil(linear_g * (transform->grid_size-1));
- int z_n = ceil(linear_b * (transform->grid_size-1));
+ int x_n = transform->ceil_cache[in_r];
+ int y_n = transform->ceil_cache[in_g];
+ int z_n = transform->ceil_cache[in_b];
- float rx = linear_r * (transform->grid_size-1) - x;
- float ry = linear_g * (transform->grid_size-1) - y;
- float rz = linear_b * (transform->grid_size-1) - z;
+ float rx = transform->r_cache[in_r];
+ float ry = transform->r_cache[in_g];
+ float rz = transform->r_cache[in_b];
c0_r = CLU(r_table, x, y, z);
c0_g = CLU(g_table, x, y, z);
@@ -655,6 +658,9 @@ static void qcms_transform_data_tetra_clut(qcms_transform *transform, unsigned c
float c0_b, c1_b, c2_b, c3_b;
float clut_r, clut_g, clut_b;
+ if (!(transform->transform_flags & TRANSFORM_FLAG_CLUT_CACHE))
+ qcms_transform_build_clut_cache(transform);
+
for (i = 0; i < length; i++) {
unsigned char in_r = *src++;
unsigned char in_g = *src++;
@@ -662,17 +668,17 @@ static void qcms_transform_data_tetra_clut(qcms_transform *transform, unsigned c
float linear_r = in_r/255.0f, linear_g=in_g/255.0f, linear_b = in_b/255.0f;
- int x = floor(linear_r * (transform->grid_size-1));
- int y = floor(linear_g * (transform->grid_size-1));
- int z = floor(linear_b * (transform->grid_size-1));
+ int x = transform->floor_cache[in_r];
+ int y = transform->floor_cache[in_g];
+ int z = transform->floor_cache[in_b];
- int x_n = ceil(linear_r * (transform->grid_size-1));
- int y_n = ceil(linear_g * (transform->grid_size-1));
- int z_n = ceil(linear_b * (transform->grid_size-1));
+ int x_n = transform->ceil_cache[in_r];
+ int y_n = transform->ceil_cache[in_g];
+ int z_n = transform->ceil_cache[in_b];
- float rx = linear_r * (transform->grid_size-1) - x;
- float ry = linear_g * (transform->grid_size-1) - y;
- float rz = linear_b * (transform->grid_size-1) - z;
+ float rx = transform->r_cache[in_r];
+ float ry = transform->r_cache[in_g];
+ float rz = transform->r_cache[in_b];
c0_r = CLU(r_table, x, y, z);
c0_g = CLU(g_table, x, y, z);