| Index: third_party/qcms/src/transform.c
|
| diff --git a/third_party/qcms/src/transform.c b/third_party/qcms/src/transform.c
|
| index 9fd82389f84c0aef8a0515a6f4616836c9df1b43..f669a6b58d20565b91c22b787806fd2927873a60 100644
|
| --- a/third_party/qcms/src/transform.c
|
| +++ b/third_party/qcms/src/transform.c
|
| @@ -1167,6 +1167,71 @@ qcms_transform* qcms_transform_precacheLUT_float(qcms_transform *transform, qcms
|
| return transform;
|
| }
|
|
|
| +/* Create a transform LUT using the given number of sample points. The transform LUT data is stored
|
| + in the output (cube) in bgra format in zyx sample order. */
|
| +qcms_bool qcms_transform_create_LUT_zyx_bgra(qcms_profile *in, qcms_profile *out, qcms_intent intent,
|
| + int samples, unsigned char* cube)
|
| +{
|
| + uint16_t z,y,x;
|
| + uint32_t l,index;
|
| + uint32_t lutSize = 3 * samples * samples * samples;
|
| +
|
| + float* src = NULL;
|
| + float* dest = NULL;
|
| + float* lut = NULL;
|
| + float inverse;
|
| +
|
| + src = malloc(lutSize*sizeof(float));
|
| + dest = malloc(lutSize*sizeof(float));
|
| +
|
| + if (src && dest) {
|
| + /* Prepare a list of points we want to sample: z, y, x order */
|
| + l = 0;
|
| + inverse = 1 / (float)(samples-1);
|
| + for (z = 0; z < samples; z++) {
|
| + for (y = 0; y < samples; y++) {
|
| + for (x = 0; x < samples; x++) {
|
| + src[l++] = x * inverse; // r
|
| + src[l++] = y * inverse; // g
|
| + src[l++] = z * inverse; // b
|
| + }
|
| + }
|
| + }
|
| +
|
| + lut = qcms_chain_transform(in, out, src, dest, lutSize);
|
| +
|
| + if (lut) {
|
| + index = l = 0;
|
| + for (z = 0; z < samples; z++) {
|
| + for (y = 0; y < samples; y++) {
|
| + for (x = 0; x < samples; x++) {
|
| + cube[index++] = (int)floorf(lut[l + 2] * 255.0f + 0.5f); // b
|
| + cube[index++] = (int)floorf(lut[l + 1] * 255.0f + 0.5f); // g
|
| + cube[index++] = (int)floorf(lut[l + 0] * 255.0f + 0.5f); // r
|
| + cube[index++] = 255; // a
|
| + l += 3;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + // XXX: qcms_modular_transform_data may return the lut data in either the src or
|
| + // dest buffer so free src, dest, and lut with care.
|
| +
|
| + if (src && lut != src)
|
| + free(src);
|
| + if (dest && lut != dest)
|
| + free(dest);
|
| +
|
| + if (lut) {
|
| + free(lut);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| #define NO_MEM_TRANSFORM NULL
|
|
|
| qcms_transform* qcms_transform_create(
|
|
|