[babl] babl: icc implement ascii decoding of mluc
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] babl: icc implement ascii decoding of mluc
- Date: Sat, 2 Sep 2017 16:19:28 +0000 (UTC)
commit 60dfe68fd527820eefd29008e380f5d09ad95060
Author: Øyvind Kolås <pippin gimp org>
Date: Sat Sep 2 18:18:49 2017 +0200
babl: icc implement ascii decoding of mluc
babl/babl-icc.c | 55 +++++++++++++++++++++++++++++++++++++++++++--
tools/babl-icc-rewrite.c | 8 ++++++
2 files changed, 60 insertions(+), 3 deletions(-)
---
diff --git a/babl/babl-icc.c b/babl/babl-icc.c
index debbc69..2fece0f 100644
--- a/babl/babl-icc.c
+++ b/babl/babl-icc.c
@@ -597,6 +597,48 @@ const char *babl_space_to_icc (const Babl *babl, int *ret_length)
return icc;
}
+static char *icc_decode_mluc (ICC *state, int offset, int element_length, char *lang, char *country)
+{
+ int n_records = icc_read (u32, offset + 8);
+ int record_size = icc_read (u32, offset + 12);
+ int i;
+ int o = 16;
+ for (i = 0; i < n_records; i++)
+ {
+ char icountry[3]=" ";
+ char ilang[3]=" ";
+
+ ilang[0] = icc_read(u8, offset + o + 0);
+ ilang[1] = icc_read(u8, offset + o + 1);
+ icountry[0] = icc_read(u8, offset + o + 2);
+ icountry[1] = icc_read(u8, offset + o + 3);
+
+ if (((!lang || !strcmp (lang, ilang)) &&
+ (!country || !strcmp (country, icountry))) ||
+ (i == n_records - 1))
+ {
+ int slength = icc_read(u32, offset + o + 4);
+ int soffset = icc_read(u32, offset + o + 8);
+ char *ret = babl_malloc (slength * 2);
+ int j;
+
+ for (j = 0; j < slength/2; j++)
+ {
+ int hi = icc_read(u8, offset + soffset + j * 2 + 0);
+ int lo = icc_read(u8, offset + soffset + j * 2 + 1);
+
+ ret[j] = lo + hi * 0; // only ASCII survives this
+ // brute utf16 decoding, so it is
+ // good we ask for english.
+ }
+ ret[j] = 0;
+ return ret;
+ }
+ o+=record_size;
+ }
+ return babl_strdup ("");
+}
+
const Babl *
babl_space_from_icc (const char *icc_data,
int icc_length,
@@ -663,13 +705,12 @@ babl_space_from_icc (const char *icc_data,
return NULL;
}
-
{
int offset, element_size;
icc_tag (state, "desc", &offset, &element_size);
if (!strcmp (state->data + offset, "mluc"))
{
- descr = babl_strdup ("[babl-icc doesnt decode unicode]");
+ descr = icc_decode_mluc (state, offset, element_size, "en", NULL);
}
else
if (!strcmp (state->data + offset, "desc"))
@@ -681,7 +722,15 @@ babl_space_from_icc (const char *icc_data,
{
int offset, element_size;
icc_tag (state, "cprt", &offset, &element_size);
- copyright = babl_strdup (state->data + offset + 8);
+ if (!strcmp (state->data + offset, "mluc"))
+ {
+ copyright = icc_decode_mluc (state, offset, element_size, "en", NULL);
+ }
+ else
+ if (!strcmp (state->data + offset, "desc"))
+ {
+ copyright = babl_strdup (state->data + offset + 8);
+ }
}
if (icc_tag (state, "rXYZ", NULL, NULL) &&
diff --git a/tools/babl-icc-rewrite.c b/tools/babl-icc-rewrite.c
index bb1bc64..af9d46e 100644
--- a/tools/babl-icc-rewrite.c
+++ b/tools/babl-icc-rewrite.c
@@ -55,6 +55,14 @@ main (int argc,
return -1;
}
+ {
+ BablSpace *space = (void*)babl;
+ if (space->description)
+ fprintf (stderr, "description: %s\n", space->description);
+ if (space->copyright)
+ fprintf (stderr, "copyright: %s\n", space->copyright);
+ }
+
icc_data = (char *)babl_space_to_icc (babl, &genlen);
if (icc_data)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]