diff options
Diffstat (limited to 'third_party/qcms')
-rw-r--r-- | third_party/qcms/README.chromium | 2 | ||||
-rw-r--r-- | third_party/qcms/src/transform.c | 42 |
2 files changed, 26 insertions, 18 deletions
diff --git a/third_party/qcms/README.chromium b/third_party/qcms/README.chromium index b1845fd..d05e0c1 100644 --- a/third_party/qcms/README.chromium +++ b/third_party/qcms/README.chromium @@ -105,6 +105,8 @@ The following changes have been made since qcms was imported: - https://code.google.com/p/chromium/issues/detail?id=487284 - Caching transform prelude to save computation in V4 profiles - https://code.google.com/p/chromium/issues/detail?id=506607 + - Use the caching transform prelude for non-SSE code in transform.c + - https://code.google.com/p/chromium/issues/detail?id=506607 For the Chromium changes, since the import, in a patch format run: git diff b8456f38 src 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); |