[babl] babl-icc: detect sRGB LUT TRC and use babl's native sRGB TRC
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] babl-icc: detect sRGB LUT TRC and use babl's native sRGB TRC
- Date: Wed, 23 Aug 2017 19:53:57 +0000 (UTC)
commit 73536c706606dc85a767d721cd92270f69fd77b3
Author: Øyvind Kolås <pippin gimp org>
Date: Wed Aug 23 21:52:28 2017 +0200
babl-icc: detect sRGB LUT TRC and use babl's native sRGB TRC
Also add serialization of sRGB as an on-the fly generated 1024 element LUT.
babl/babl-icc.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 65 insertions(+), 3 deletions(-)
---
diff --git a/babl/babl-icc.c b/babl/babl-icc.c
index 8a94336..e526480 100644
--- a/babl/babl-icc.c
+++ b/babl/babl-icc.c
@@ -299,6 +299,46 @@ static int icc_tag (ICC *state,
return 0;
}
+static const Babl *babl_trc_lut_find (float *lut, int lut_size)
+{
+ int i;
+ int match = 1;
+
+ /* look for linear match */
+ for (i = 0; match && i < lut_size; i++)
+ if (fabs (lut[i] - i / (lut_size-1.0)) > 0.015)
+ match = 0;
+ if (match)
+ return babl_trc_gamma (1.0);
+
+ /* look for sRGB match: */
+ match = 1;
+ if (lut_size > 1024)
+ {
+ for (i = 0; match && i < lut_size; i++)
+ {
+ if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.00001)
+ match = 0;
+ }
+ }
+ else
+ {
+ for (i = 0; match && i < lut_size; i++)
+ {
+ fprintf (stderr, "%i: %f %f\n",
+ i, lut[i], gamma_2_2_to_linear (i / (lut_size-1.0)));
+
+ if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.015)
+ match = 0;
+ }
+ }
+ if (match)
+ return babl_trc ("sRGB");
+
+
+ return NULL;
+}
+
static const Babl *babl_trc_from_icc (ICC *state, int offset,
char **error)
{
@@ -317,13 +357,19 @@ static const Babl *babl_trc_from_icc (ICC *state, int offset,
else
{
const Babl *ret;
- float *lut = babl_malloc (sizeof (float) * count);
+ float *lut;
+
+ lut = babl_malloc (sizeof (float) * count);
- for (i = 0; i < count && i < 10; i ++)
+ for (i = 0; i < count; i ++)
{
lut[i] = icc_read (u16, offset + 12 + i * 2) / 65535.0;
}
+ ret = babl_trc_lut_find (lut, count);
+ if (ret)
+ return ret;
+
ret = babl_trc_lut (NULL, count, lut);
babl_free (lut);
return ret;
@@ -368,6 +414,23 @@ switch (trc->type)
icc_write (u32, state->o + 8, 1);
icc_write (u8f8, state->o + 12, trc->gamma);
break;
+
+ case BABL_TRC_SRGB:
+ {
+ int lut_size = 1024;
+ icc_allocate_tag (state, name, 13 + lut_size * 2);
+ icc_write (sign, state->o, "curv");
+ icc_write (u32, state->o + 4, 0);
+ icc_write (u32, state->o + 8, lut_size);
+ {
+ int j;
+ for (j = 0; j < lut_size; j ++)
+ icc_write (u16, state->o + 12 + j * 2,
+ gamma_2_2_to_linear (j / (lut_size-1.0)) * 65535.5);
+ }
+ }
+ break;
+
case BABL_TRC_LUT:
icc_allocate_tag (state, name, 13 + trc->lut_size * 2);
icc_write (sign, state->o, "curv");
@@ -475,7 +538,6 @@ const char *babl_space_rgb_to_icc (const Babl *babl, int *ret_length)
}
else
{
- fprintf (stderr, "!!!!!!!!\n");
write_trc (state, "gTRC", &space->trc[1]->trc);
write_trc (state, "bTRC", &space->trc[2]->trc);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]