f-spot r3819 - in trunk: . src/Imaging
- From: sdelcroix svn gnome org
- To: svn-commits-list gnome org
- Subject: f-spot r3819 - in trunk: . src/Imaging
- Date: Fri, 11 Apr 2008 16:32:03 +0100 (BST)
Author: sdelcroix
Date: Fri Apr 11 16:32:03 2008
New Revision: 3819
URL: http://svn.gnome.org/viewvc/f-spot?rev=3819&view=rev
Log:
2008-04-11 Stephane Delcroix <sdelcroix novell com>
* src/Imaging/Exif.cs: foolow the encoding specified in the exif.
Fixes bgo #524214. Patch from Debajyoti Bera.
Modified:
trunk/ChangeLog
trunk/src/Imaging/Exif.cs
Modified: trunk/src/Imaging/Exif.cs
==============================================================================
--- trunk/src/Imaging/Exif.cs (original)
+++ trunk/src/Imaging/Exif.cs Fri Apr 11 16:32:03 2008
@@ -536,6 +536,58 @@
}
}
}
+
+ private static readonly byte[] USERCOMMENT_ASCII = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00};
+ private static readonly byte[] USERCOMMENT_JIS = { 0x4a, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00};
+ private static readonly byte[] USERCOMMENT_UNICODE = { 0x55, 0x4e, 0x49, 0x43, 0x4f, 0x44, 0x45, 0x00};
+
+ // Some Exif tags are specified in a special encoding
+ private System.Text.Encoding Encoding {
+ get {
+ unsafe {
+ if (Tag == ExifTag.ImageDescription) {
+ // ASCII encoded - use local encoding
+ return System.Text.Encoding.Default;
+
+ } else if (Tag == ExifTag.UserComment) {
+ if ((int)_handle->size < 8)
+ return System.Text.Encoding.UTF8;
+
+ byte[] data = new byte [8];
+ Marshal.Copy (_handle->data, data, 0, 8);
+
+ // ASCII encoded - use local encoding
+ if (data [0] == USERCOMMENT_ASCII [0] &&
+ data [1] == USERCOMMENT_ASCII [1] &&
+ data [2] == USERCOMMENT_ASCII [2] &&
+ data [3] == USERCOMMENT_ASCII [3] &&
+ data [4] == USERCOMMENT_ASCII [4] &&
+ data [5] == USERCOMMENT_ASCII [5] &&
+ data [6] == USERCOMMENT_ASCII [6] &&
+ data [7] == USERCOMMENT_ASCII [7])
+ return System.Text.Encoding.Default;
+
+ if (data [0] == USERCOMMENT_UNICODE [0] &&
+ data [1] == USERCOMMENT_UNICODE [1] &&
+ data [2] == USERCOMMENT_UNICODE [2] &&
+ data [3] == USERCOMMENT_UNICODE [3] &&
+ data [4] == USERCOMMENT_UNICODE [4] &&
+ data [5] == USERCOMMENT_UNICODE [5] &&
+ data [6] == USERCOMMENT_UNICODE [6] &&
+ data [7] == USERCOMMENT_UNICODE [7])
+ return System.Text.Encoding.UTF8;
+
+ // FIXME: Support JIS too
+
+ return System.Text.Encoding.UTF8;
+ } else {
+ // Most of the tags are ASCII encoded, so UTF8 should
+ // work fine
+ return System.Text.Encoding.UTF8;
+ }
+ }
+ }
+ }
public void SetData (byte [] data, int size)
{
@@ -710,6 +762,7 @@
exif_entry_get_value (this.Handle, value, value.Length);
int i;
+
for (i = 0; i < value.Length; i++) {
if (value [i] == 0)
break;
@@ -718,7 +771,15 @@
if (len == 0)
return null;
- return System.Text.Encoding.UTF8.GetString (value, 0, len);
+ System.Text.Encoding encoding = Encoding;
+ byte[] converted = value;
+
+ if (encoding != System.Text.Encoding.UTF8) {
+ converted = System.Text.Encoding.Convert (encoding, System.Text.Encoding.UTF8, value, 0, len);
+ len = converted.Length;
+ }
+
+ return System.Text.Encoding.UTF8.GetString (converted, 0, len);
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]