Bug 791422. Support more flexibiltiy qcms output format. r=BenWa

This will help support Chrome and should also let us output directly to a cairo
compatible format.
This commit is contained in:
Jeff Muizelaar 2012-10-03 19:04:25 -04:00
Родитель b3365668ec
Коммит 3de99c3be7
4 изменённых файлов: 103 добавлений и 69 удалений

Просмотреть файл

@ -274,3 +274,26 @@ void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform,
size_t length);
extern qcms_bool qcms_supports_iccv4;
#ifdef NATIVE_OUTPUT
# define RGB_OUTPUT_COMPONENTS 4
# define RGBA_OUTPUT_COMPONENTS 4
# ifdef IS_LITTLE_ENDIAN
# define OUTPUT_INDEX_A 3
# define OUTPUT_INDEX_R 2
# define OUTPUT_INDEX_G 1
# define OUTPUT_INDEX_B 0
# else
# define OUTPUT_INDEX_A 0
# define OUTPUT_INDEX_R 1
# define OUTPUT_INDEX_G 2
# define OUTPUT_INDEX_B 3
# endif
#else
# define RGB_OUTPUT_COMPONENTS 3
# define RGBA_OUTPUT_COMPONENTS 4
# define OUTPUT_R_INDEX 0
# define OUTPUT_G_INDEX 1
# define OUTPUT_B_INDEX 2
# define OUTPUT_A_INDEX 3
#endif

Просмотреть файл

@ -95,10 +95,10 @@ void qcms_transform_data_rgb_out_lut_sse1(qcms_transform *transform,
src += 3;
/* use calc'd indices to output RGB values */
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest += 3;
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
dest += RGB_OUTPUT_COMPONENTS;
}
/* handle final (maybe only) pixel */
@ -120,9 +120,9 @@ void qcms_transform_data_rgb_out_lut_sse1(qcms_transform *transform,
result = _mm_movehl_ps(result, result);
*((__m64 *)&output[2]) = _mm_cvtps_pi32(result);
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
_mm_empty();
}
@ -197,7 +197,7 @@ void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform,
vec_b = _mm_mul_ps(vec_b, mat2);
/* store alpha for this pixel; load alpha for next */
dest[3] = alpha;
dest[OUTPUT_A_INDEX] = alpha;
alpha = src[3];
/* crunch, crunch, crunch */
@ -218,9 +218,9 @@ void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform,
src += 4;
/* use calc'd indices to output RGB values */
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
dest += 4;
}
@ -234,7 +234,7 @@ void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform,
vec_g = _mm_mul_ps(vec_g, mat1);
vec_b = _mm_mul_ps(vec_b, mat2);
dest[3] = alpha;
dest[OUTPUT_A_INDEX] = alpha;
vec_r = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
vec_r = _mm_max_ps(min, vec_r);
@ -245,9 +245,9 @@ void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform,
result = _mm_movehl_ps(result, result);
*((__m64 *)&output[2]) = _mm_cvtps_pi32(result);
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
_mm_empty();
}

Просмотреть файл

@ -93,10 +93,10 @@ void qcms_transform_data_rgb_out_lut_sse2(qcms_transform *transform,
src += 3;
/* use calc'd indices to output RGB values */
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest += 3;
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
dest += RGB_OUTPUT_COMPONENTS;
}
/* handle final (maybe only) pixel */
@ -116,9 +116,9 @@ void qcms_transform_data_rgb_out_lut_sse2(qcms_transform *transform,
_mm_store_si128((__m128i*)output, _mm_cvtps_epi32(result));
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
}
void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform,
@ -191,7 +191,7 @@ void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform,
vec_b = _mm_mul_ps(vec_b, mat2);
/* store alpha for this pixel; load alpha for next */
dest[3] = alpha;
dest[OUTPUT_A_INDEX] = alpha;
alpha = src[3];
/* crunch, crunch, crunch */
@ -210,10 +210,10 @@ void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform,
src += 4;
/* use calc'd indices to output RGB values */
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest += 4;
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
dest += RGBA_OUTPUT_COMPONENTS;
}
/* handle final (maybe only) pixel */
@ -226,7 +226,7 @@ void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform,
vec_g = _mm_mul_ps(vec_g, mat1);
vec_b = _mm_mul_ps(vec_b, mat2);
dest[3] = alpha;
dest[OUTPUT_A_INDEX] = alpha;
vec_r = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
vec_r = _mm_max_ps(min, vec_r);
@ -235,9 +235,9 @@ void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform,
_mm_store_si128((__m128i*)output, _mm_cvtps_epi32(result));
dest[0] = otdata_r[output[0]];
dest[1] = otdata_g[output[1]];
dest[2] = otdata_b[output[2]];
dest[OUTPUT_R_INDEX] = otdata_r[output[0]];
dest[OUTPUT_G_INDEX] = otdata_g[output[1]];
dest[OUTPUT_B_INDEX] = otdata_b[output[2]];
}

Просмотреть файл

@ -251,9 +251,10 @@ static void qcms_transform_data_rgb_out_pow(qcms_transform *transform, unsigned
float out_device_g = pow(out_linear_g, transform->out_gamma_g);
float out_device_b = pow(out_linear_b, transform->out_gamma_b);
*dest++ = clamp_u8(255*out_device_r);
*dest++ = clamp_u8(255*out_device_g);
*dest++ = clamp_u8(255*out_device_b);
dest[OUTPUT_R_INDEX] = clamp_u8(255*out_device_r);
dest[OUTPUT_G_INDEX] = clamp_u8(255*out_device_g);
dest[OUTPUT_B_INDEX] = clamp_u8(255*out_device_b);
dest += RGB_OUTPUT_COMPONENTS;
}
}
#endif
@ -271,9 +272,10 @@ static void qcms_transform_data_gray_out_lut(qcms_transform *transform, unsigned
out_device_g = lut_interp_linear(linear, transform->output_gamma_lut_g, transform->output_gamma_lut_g_length);
out_device_b = lut_interp_linear(linear, transform->output_gamma_lut_b, transform->output_gamma_lut_b_length);
*dest++ = clamp_u8(out_device_r*255);
*dest++ = clamp_u8(out_device_g*255);
*dest++ = clamp_u8(out_device_b*255);
dest[OUTPUT_R_INDEX] = clamp_u8(out_device_r*255);
dest[OUTPUT_G_INDEX] = clamp_u8(out_device_g*255);
dest[OUTPUT_B_INDEX] = clamp_u8(out_device_b*255);
dest += RGB_OUTPUT_COMPONENTS;
}
}
@ -297,10 +299,11 @@ static void qcms_transform_data_graya_out_lut(qcms_transform *transform, unsigne
out_device_g = lut_interp_linear(linear, transform->output_gamma_lut_g, transform->output_gamma_lut_g_length);
out_device_b = lut_interp_linear(linear, transform->output_gamma_lut_b, transform->output_gamma_lut_b_length);
*dest++ = clamp_u8(out_device_r*255);
*dest++ = clamp_u8(out_device_g*255);
*dest++ = clamp_u8(out_device_b*255);
*dest++ = alpha;
dest[OUTPUT_R_INDEX] = clamp_u8(out_device_r*255);
dest[OUTPUT_G_INDEX] = clamp_u8(out_device_g*255);
dest[OUTPUT_B_INDEX] = clamp_u8(out_device_b*255);
dest[OUTPUT_A_INDEX] = alpha;
dest += RGBA_OUTPUT_COMPONENTS;
}
}
@ -317,9 +320,10 @@ static void qcms_transform_data_gray_out_precache(qcms_transform *transform, uns
/* we could round here... */
gray = linear * PRECACHE_OUTPUT_MAX;
*dest++ = transform->output_table_r->data[gray];
*dest++ = transform->output_table_g->data[gray];
*dest++ = transform->output_table_b->data[gray];
dest[OUTPUT_R_INDEX] = transform->output_table_r->data[gray];
dest[OUTPUT_G_INDEX] = transform->output_table_g->data[gray];
dest[OUTPUT_B_INDEX] = transform->output_table_b->data[gray];
dest += RGB_OUTPUT_COMPONENTS;
}
}
@ -336,10 +340,11 @@ static void qcms_transform_data_graya_out_precache(qcms_transform *transform, un
/* we could round here... */
gray = linear * PRECACHE_OUTPUT_MAX;
*dest++ = transform->output_table_r->data[gray];
*dest++ = transform->output_table_g->data[gray];
*dest++ = transform->output_table_b->data[gray];
*dest++ = alpha;
dest[OUTPUT_R_INDEX] = transform->output_table_r->data[gray];
dest[OUTPUT_G_INDEX] = transform->output_table_g->data[gray];
dest[OUTPUT_B_INDEX] = transform->output_table_b->data[gray];
dest[OUTPUT_A_INDEX] = alpha;
dest += RGBA_OUTPUT_COMPONENTS;
}
}
@ -370,9 +375,10 @@ static void qcms_transform_data_rgb_out_lut_precache(qcms_transform *transform,
g = out_linear_g * PRECACHE_OUTPUT_MAX;
b = out_linear_b * PRECACHE_OUTPUT_MAX;
*dest++ = transform->output_table_r->data[r];
*dest++ = transform->output_table_g->data[g];
*dest++ = transform->output_table_b->data[b];
dest[OUTPUT_R_INDEX] = transform->output_table_r->data[r];
dest[OUTPUT_G_INDEX] = transform->output_table_g->data[g];
dest[OUTPUT_A_INDEX] = transform->output_table_b->data[b];
dest += RGB_OUTPUT_COMPONENTS;
}
}
@ -404,10 +410,11 @@ static void qcms_transform_data_rgba_out_lut_precache(qcms_transform *transform,
g = out_linear_g * PRECACHE_OUTPUT_MAX;
b = out_linear_b * PRECACHE_OUTPUT_MAX;
*dest++ = transform->output_table_r->data[r];
*dest++ = transform->output_table_g->data[g];
*dest++ = transform->output_table_b->data[b];
*dest++ = alpha;
dest[OUTPUT_R_INDEX] = transform->output_table_r->data[r];
dest[OUTPUT_G_INDEX] = transform->output_table_g->data[g];
dest[OUTPUT_B_INDEX] = transform->output_table_b->data[b];
dest[OUTPUT_A_INDEX] = alpha;
dest += RGBA_OUTPUT_COMPONENTS;
}
}
@ -577,10 +584,11 @@ static void qcms_transform_data_tetra_clut_rgba(qcms_transform *transform, unsig
clut_g = c0_g + c1_g*rx + c2_g*ry + c3_g*rz;
clut_b = c0_b + c1_b*rx + c2_b*ry + c3_b*rz;
*dest++ = clamp_u8(clut_r*255.0f);
*dest++ = clamp_u8(clut_g*255.0f);
*dest++ = clamp_u8(clut_b*255.0f);
*dest++ = in_a;
dest[OUTPUT_R_INDEX] = clamp_u8(clut_r*255.0f);
dest[OUTPUT_G_INDEX] = clamp_u8(clut_g*255.0f);
dest[OUTPUT_B_INDEX] = clamp_u8(clut_b*255.0f);
dest[OUTPUT_A_INDEX] = in_a;
dest += RGBA_OUTPUT_COMPONENTS;
}
}
@ -691,9 +699,10 @@ static void qcms_transform_data_tetra_clut(qcms_transform *transform, unsigned c
clut_g = c0_g + c1_g*rx + c2_g*ry + c3_g*rz;
clut_b = c0_b + c1_b*rx + c2_b*ry + c3_b*rz;
*dest++ = clamp_u8(clut_r*255.0f);
*dest++ = clamp_u8(clut_g*255.0f);
*dest++ = clamp_u8(clut_b*255.0f);
dest[OUTPUT_R_INDEX] = clamp_u8(clut_r*255.0f);
dest[OUTPUT_G_INDEX] = clamp_u8(clut_g*255.0f);
dest[OUTPUT_B_INDEX] = clamp_u8(clut_b*255.0f);
dest += RGB_OUTPUT_COMPONENTS;
}
}
@ -726,9 +735,10 @@ static void qcms_transform_data_rgb_out_lut(qcms_transform *transform, unsigned
out_device_b = lut_interp_linear(out_linear_b,
transform->output_gamma_lut_b, transform->output_gamma_lut_b_length);
*dest++ = clamp_u8(out_device_r*255);
*dest++ = clamp_u8(out_device_g*255);
*dest++ = clamp_u8(out_device_b*255);
dest[OUTPUT_R_INDEX] = clamp_u8(out_device_r*255);
dest[OUTPUT_G_INDEX] = clamp_u8(out_device_g*255);
dest[OUTPUT_B_INDEX] = clamp_u8(out_device_b*255);
dest += RGB_OUTPUT_COMPONENTS;
}
}
@ -762,10 +772,11 @@ static void qcms_transform_data_rgba_out_lut(qcms_transform *transform, unsigned
out_device_b = lut_interp_linear(out_linear_b,
transform->output_gamma_lut_b, transform->output_gamma_lut_b_length);
*dest++ = clamp_u8(out_device_r*255);
*dest++ = clamp_u8(out_device_g*255);
*dest++ = clamp_u8(out_device_b*255);
*dest++ = alpha;
dest[OUTPUT_R_INDEX] = clamp_u8(out_device_r*255);
dest[OUTPUT_G_INDEX] = clamp_u8(out_device_g*255);
dest[OUTPUT_B_INDEX] = clamp_u8(out_device_b*255);
dest[OUTPUT_A_INDEX] = alpha;
dest += RGBA_OUTPUT_COMPONENTS;
}
}