зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
b3365668ec
Коммит
3de99c3be7
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче