plug-ins/common/tiff-load.c Implement the proposed scheme for storing

2007-06-05  Simon Budig  <simon@gimp.org>

	* plug-ins/common/tiff-load.c
	* plug-ins/common/tiff-save.c: Implement the proposed scheme for
	storing international path names in TIFF files.


svn path=/trunk/; revision=22712
This commit is contained in:
Simon Budig
2007-06-05 14:26:42 +00:00
committed by Simon Budig
parent c2758fcc61
commit d54d09d050
3 changed files with 60 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2007-06-05 Simon Budig <simon@gimp.org>
* plug-ins/common/tiff-load.c
* plug-ins/common/tiff-save.c: Implement the proposed scheme for
storing international path names in TIFF files.
2007-06-05 Sven Neumann <sven@gimp.org>
* plug-ins/helpbrowser/dialog.c

View File

@ -1115,7 +1115,7 @@ static void
load_paths (TIFF *tif, gint image)
{
guint16 id;
guint32 len, n_bytes, pos;
gsize len, n_bytes, pos;
gchar *bytes, *name;
guint32 *val32;
guint16 *val16;
@ -1126,19 +1126,6 @@ load_paths (TIFF *tif, gint image)
width = gimp_image_width (image);
height = gimp_image_height (image);
#if 0
/* TIFFTAG_CLIPPATH seems to be basically unused */
if (TIFFGetField (tif, TIFFTAG_CLIPPATH, &n_bytes, &bytes) &&
TIFFGetField (tif, TIFFTAG_XCLIPPATHUNITS, &xclipunits) &&
TIFFGetField (tif, TIFFTAG_YCLIPPATHUNITS, &yclipunits))
{
/* Tiff clipping path */
g_printerr ("Tiff clipping path, %d - %d\n", xclipunits, yclipunits);
}
#endif
if (!TIFFGetField (tif, TIFFTAG_PHOTOSHOP, &n_bytes, &bytes))
return;
@ -1163,9 +1150,26 @@ load_paths (TIFF *tif, gint image)
if (n_bytes - pos < len + 1)
break; /* block not big enough */
name = g_strndup (bytes + pos + 1, len);
if (!g_utf8_validate (name, -1, NULL))
name = g_strdup ("imported path");
/*
* do we have the UTF-marker? is it valid UTF-8?
* if so, we assume an utf-8 encoded name, otherwise we
* assume iso8859-1
*/
name = bytes + pos + 1;
if (len >= 3 &&
name[0] == '\xEF' && name[1] == '\xBB' && name[2] == '\xBF' &&
g_utf8_validate (name, len - 3, NULL))
{
name = g_strndup (name + 3, len - 3);
}
else
{
name = g_convert (name, len, "utf-8", "iso8859-1", NULL, NULL, NULL);
}
if (!name)
name = g_strdup ("(imported path)");
pos += len + 1;
if (pos % 2) /* padding */

View File

@ -465,18 +465,46 @@ save_paths (TIFF *tif,
{
GString *data;
gchar *name, *nameend;
gint len, lenpos;
gsize len;
gint lenpos;
gchar pointrecord[26] = { 0, };
gchar *tmpname;
GError *err = NULL;
data = g_string_new ("8BIM");
g_string_append_c (data, id / 256);
g_string_append_c (data, id % 256);
/*
* - use iso8859-1 if possible
* - otherwise use UTF-8, prepended with \xef\xbb\xbf (Byte-Order-Mark)
*/
name = gimp_vectors_get_name (vectors[v]);
len = g_utf8_strlen (name, 255); /* max. 255 chars in a pascal string */
nameend = g_utf8_offset_to_pointer (name, len);
g_string_append_c (data, nameend - name);
g_string_append_len (data, name, nameend - name);
tmpname = g_convert (name, -1, "iso8859-1", "utf-8", NULL, &len, &err);
if (tmpname && err == NULL)
{
g_string_append_c (data, MIN (len, 255));
g_string_append_len (data, tmpname, MIN (len, 255));
g_free (tmpname);
}
else
{
/* conversion failed, we fall back to UTF-8 */
len = g_utf8_strlen (name, 255 - 3); /* need three marker-bytes */
nameend = g_utf8_offset_to_pointer (name, len);
len = nameend - name; /* in bytes */
g_assert (len + 3 <= 255);
g_string_append_c (data, len + 3);
g_string_append_len (data, "\xEF\xBB\xBF", 3); /* Unicode 0xfeff */
g_string_append_len (data, name, len);
if (tmpname)
g_free (tmpname);
}
if (data->len % 2) /* padding to even size */
g_string_append_c (data, 0);
g_free (name);