[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - 2 commits - vcl/source
Caolán McNamara
caolanm at redhat.com
Tue Oct 29 13:09:59 CET 2013
vcl/source/filter/jpeg/Exif.cxx | 55 ++++++++++++++++++++++++++++++++++------
vcl/source/filter/jpeg/Exif.hxx | 3 +-
2 files changed, 49 insertions(+), 9 deletions(-)
New commits:
commit 69f026fc37cc5be080c02497e8fe3e0b88efa913
Author: Caolán McNamara <caolanm at redhat.com>
Date: Tue Oct 15 10:21:35 2013 +0100
swap if the host endianness doesn't match the file formats
Change-Id: I0b4c2ba6679c8d2754f2a7cd8b8f693db335e004
Reviewed-on: https://gerrit.libreoffice.org/6408
Tested-by: Caolán McNamara <caolanm at redhat.com>
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/vcl/source/filter/jpeg/Exif.cxx b/vcl/source/filter/jpeg/Exif.cxx
index 3a4b2d3..cf64f9b 100644
--- a/vcl/source/filter/jpeg/Exif.cxx
+++ b/vcl/source/filter/jpeg/Exif.cxx
@@ -156,7 +156,7 @@ bool Exif::processJpeg(SvStream& rStream, bool bSetValue)
return false;
}
-bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto)
+bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bSwap)
{
ExifIFD* ifd = NULL;
@@ -164,7 +164,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
{
ifd = (ExifIFD*) &pExifData[aOffset];
sal_uInt16 tag = ifd->tag;
- if (bMoto)
+ if (bSwap)
{
tag = OSL_SWAPWORD(ifd->tag);
}
@@ -177,7 +177,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
ifd->type = 3;
ifd->count = 1;
ifd->offset = maOrientation;
- if (bMoto)
+ if (bSwap)
{
ifd->tag = OSL_SWAPWORD(ifd->tag);
ifd->offset = OSL_SWAPWORD(ifd->offset);
@@ -186,7 +186,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
else
{
sal_uInt32 nIfdOffset = ifd->offset;
- if (bMoto)
+ if (bSwap)
nIfdOffset = OSL_SWAPWORD(ifd->offset);
maOrientation = convertToOrientation(nIfdOffset);
}
@@ -224,37 +224,46 @@ bool Exif::processExif(SvStream& rStream, sal_uInt16 aSectionLength, bool bSetVa
TiffHeader* aTiffHeader = (TiffHeader*) &aExifData[0];
- if(!(
- (0x4949 == aTiffHeader->byteOrder && 0x2A00 != aTiffHeader->tagAlign ) || // Intel format
- ( 0x4D4D == aTiffHeader->byteOrder && 0x002A != aTiffHeader->tagAlign ) // Motorola format
- )
- )
+ bool bIntel = aTiffHeader->byteOrder == 0x4949; //big-endian
+ bool bMotorola = aTiffHeader->byteOrder == 0x4D4D; //little-endian
+
+ if (!bIntel && !bMotorola)
{
delete[] aExifData;
return false;
}
- bool bMoto = true; // Motorola, big-endian by default
+ bool bSwap = false;
+
+#ifdef OSL_BIGENDIAN
+ if (bIntel)
+ bSwap = true;
+#else
+ if (bMotorola)
+ bSwap = true;
+#endif
- if (aTiffHeader->byteOrder == 0x4949)
+ if (bSwap)
{
- bMoto = false; // little-endian
+ aTiffHeader->tagAlign = OSL_SWAPWORD(aTiffHeader->tagAlign);
+ aTiffHeader->offset = OSL_SWAPDWORD(aTiffHeader->offset);
}
- sal_uInt16 aOffset = 0;
- aOffset = aTiffHeader->offset;
- if (bMoto)
+ if (aTiffHeader->tagAlign != 0x002A) // TIFF tag
{
- aOffset = OSL_SWAPDWORD(aTiffHeader->offset);
+ delete[] aExifData;
+ return false;
}
+ sal_uInt16 aOffset = aTiffHeader->offset;
+
sal_uInt16 aNumberOfTags = aExifData[aOffset];
- if (bMoto)
+ if (bSwap)
{
aNumberOfTags = ((aExifData[aOffset] << 8) | aExifData[aOffset+1]);
}
- processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bMoto);
+ processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bSwap);
if (bSetValue)
{
commit fc7b83af9865bfd937cf45242781a8d7677f6204
Author: Julien Nabet <serval2412 at yahoo.fr>
Date: Tue Oct 15 07:57:52 2013 +0200
fdo#57659: fix exif processing
Change-Id: I93bd132b1d536843d4d8627230bfa9ef22cd623b
Reviewed-on: https://gerrit.libreoffice.org/6245
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
Reviewed-on: https://gerrit.libreoffice.org/6407
diff --git a/vcl/source/filter/jpeg/Exif.cxx b/vcl/source/filter/jpeg/Exif.cxx
index f44b54f..3a4b2d3 100644
--- a/vcl/source/filter/jpeg/Exif.cxx
+++ b/vcl/source/filter/jpeg/Exif.cxx
@@ -156,15 +156,20 @@ bool Exif::processJpeg(SvStream& rStream, bool bSetValue)
return false;
}
-bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue)
+bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto)
{
ExifIFD* ifd = NULL;
while (aOffset <= aLength - 12 && aNumberOfTags > 0)
{
ifd = (ExifIFD*) &pExifData[aOffset];
+ sal_uInt16 tag = ifd->tag;
+ if (bMoto)
+ {
+ tag = OSL_SWAPWORD(ifd->tag);
+ }
- if (ifd->tag == ORIENTATION)
+ if (tag == ORIENTATION)
{
if(bSetValue)
{
@@ -172,10 +177,18 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
ifd->type = 3;
ifd->count = 1;
ifd->offset = maOrientation;
+ if (bMoto)
+ {
+ ifd->tag = OSL_SWAPWORD(ifd->tag);
+ ifd->offset = OSL_SWAPWORD(ifd->offset);
+ }
}
else
{
- maOrientation = convertToOrientation(ifd->offset);
+ sal_uInt32 nIfdOffset = ifd->offset;
+ if (bMoto)
+ nIfdOffset = OSL_SWAPWORD(ifd->offset);
+ maOrientation = convertToOrientation(nIfdOffset);
}
}
@@ -211,20 +224,37 @@ bool Exif::processExif(SvStream& rStream, sal_uInt16 aSectionLength, bool bSetVa
TiffHeader* aTiffHeader = (TiffHeader*) &aExifData[0];
- if( 0x4949 != aTiffHeader->byteOrder || 0x002A != aTiffHeader->tagAlign )
+ if(!(
+ (0x4949 == aTiffHeader->byteOrder && 0x2A00 != aTiffHeader->tagAlign ) || // Intel format
+ ( 0x4D4D == aTiffHeader->byteOrder && 0x002A != aTiffHeader->tagAlign ) // Motorola format
+ )
+ )
{
delete[] aExifData;
return false;
}
- sal_uInt16 aOffset = aTiffHeader->offset;
+ bool bMoto = true; // Motorola, big-endian by default
+
+ if (aTiffHeader->byteOrder == 0x4949)
+ {
+ bMoto = false; // little-endian
+ }
+
+ sal_uInt16 aOffset = 0;
+ aOffset = aTiffHeader->offset;
+ if (bMoto)
+ {
+ aOffset = OSL_SWAPDWORD(aTiffHeader->offset);
+ }
sal_uInt16 aNumberOfTags = aExifData[aOffset];
- aNumberOfTags = aExifData[aOffset + 1];
- aNumberOfTags <<= 8;
- aNumberOfTags += aExifData[aOffset];
+ if (bMoto)
+ {
+ aNumberOfTags = ((aExifData[aOffset] << 8) | aExifData[aOffset+1]);
+ }
- processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue);
+ processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bMoto);
if (bSetValue)
{
diff --git a/vcl/source/filter/jpeg/Exif.hxx b/vcl/source/filter/jpeg/Exif.hxx
index 490f144..40faa58 100644
--- a/vcl/source/filter/jpeg/Exif.hxx
+++ b/vcl/source/filter/jpeg/Exif.hxx
@@ -20,6 +20,7 @@
#ifndef _EXIF_HXX
#define _EXIF_HXX
+#include <osl/endian.h>
#include <vcl/graph.hxx>
#include <vcl/fltcall.hxx>
#include <com/sun/star/uno/Sequence.h>
@@ -53,7 +54,7 @@ private:
bool processJpeg(SvStream& rStream, bool bSetValue);
bool processExif(SvStream& rStream, sal_uInt16 aLength, bool bSetValue);
- bool processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue);
+ bool processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto);
struct ExifIFD {
sal_uInt16 tag;
More information about the Libreoffice-commits
mailing list