SDL_image jpeg IPTC patch.
authorRyan C. Gordon <icculus@icculus.org>
Thu, 08 Sep 2005 07:28:12 +0000
changeset 1090d1bd5675598
parent 108 a02f321125f1
child 110 23d7437faa1b
SDL_image jpeg IPTC patch.

--ryan.



Date: Mon, 15 Aug 2005 21:24:39 -0700 (PDT)
From: Jeremy Stanley <stanmuffin@yahoo.com>
To: sdl@libsdl.org
Subject: [SDL] SDL_Image: IMG_isJPG() fails on pictures with IPTC information

I found that SDL_Image fails to load JPEG files to
which I have added a caption using Picasa (a free as
in beer picture organization tool;
http://www.picasa.com). Picasa claims to store its
captions in IPTC format. Photoshop apparently uses
this format too, but I don't have that program so I
can't verify that.

The problem is that the IPTC information block is
stored between the SOI (FF D8) and APP1 (FF E1)
markers in the JPEG file, so that the "JFIF" or "Exif"
constant is not stored at offset 6. Instead, the two
bytes at offset 2 store FF ED and the next two bytes
store the size of the block as a big endian word
(including the size field). The APP1 (FF E1) marker
will immediately follow.

A simple fix could be inserted just after the second
SDL_RWread() in IMG_isJPG(). Instead of throwing
these four bytes away, we can check for the IPTC
header and skip over it. The following code does the
trick for me.
IMG_jpg.c
     1.1 --- a/IMG_jpg.c	Sun Aug 21 07:13:02 2005 +0000
     1.2 +++ b/IMG_jpg.c	Thu Sep 08 07:28:12 2005 +0000
     1.3 @@ -47,6 +47,12 @@
     1.4  	if ( SDL_RWread(src, magic, 2, 1) ) {
     1.5  		if ( (magic[0] == 0xFF) && (magic[1] == 0xD8) ) {
     1.6  			SDL_RWread(src, magic, 4, 1);
     1.7 +
     1.8 +			/* skip IPTC info block if it exists... */
     1.9 +			if ( (magic[0] == 0xFF) && (magic[1] == 0xED) ) {
    1.10 +				SDL_RWseek(src, (((Uint16)magic[2] << 8) |magic[3]) + 2, SEEK_CUR);
    1.11 +			}
    1.12 +
    1.13  			SDL_RWread(src, magic, 4, 1);
    1.14  			if ( memcmp((char *)magic, "JFIF", 4) == 0 ||
    1.15  			     memcmp((char *)magic, "Exif", 4) == 0 ||