From b724b616f2bd44ca920458c8654c3673111d35e1 Mon Sep 17 00:00:00 2001 From: Ingo Date: Sun, 22 Feb 2015 23:36:28 +0100 Subject: [PATCH] 16-bit tiff and png saving broken on big endian, Issue 2675 --- rtengine/imageio.cc | 6 ++++++ rtexif/rtexif.cc | 6 +++--- rtexif/rtexif.h | 7 ++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index eea9685f4..fbb99cccd 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -802,11 +802,13 @@ int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) { getScanline (i, row, bps); if (bps==16) { // convert to network byte order +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ for (int j=0; j0 && size<165530) fwrite (buffer, size, 1, file); +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ bool needsReverse = bps==16 && exifRoot->getOrder()==rtexif::MOTOROLA; +#else + bool needsReverse = bps==16 && exifRoot->getOrder()==rtexif::INTEL; +#endif for (int i=0; igetOrder (); sset2 ((unsigned short)order, buffer+offs, order); offs += 2; @@ -2255,7 +2255,7 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro if (root) cl = (const_cast(root))->clone (NULL); else - cl = new TagDirectory (NULL, ifdAttribs, INTEL); + cl = new TagDirectory (NULL, ifdAttribs, HOSTORDER); // add tiff strip data int rps = 8; diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 7604e7d79..d89d6d5ea 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -44,6 +44,11 @@ enum ActionCode { AC_INVALID=100, // invalid state }; enum ByteOrder {INTEL=0x4949, MOTOROLA=0x4D4D}; +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ +const enum ByteOrder HOSTORDER = INTEL; +#else +const enum ByteOrder HOSTORDER = MOTOROLA; +#endif enum MNKind {NOMK, IFD, HEADERIFD, NIKON3, OLYMPUS2, FUJI,TABLESUBDIR}; bool extractLensInfo(std::string &fullname,double &minFocal, double &maxFocal, double &maxApertureAtMinFocal, double &maxApertureAtMaxFocal); @@ -193,7 +198,7 @@ class Tag { unsigned char* getValue () const { return value; } signed char* getSignedValue () const { return reinterpret_cast(value); } const TagAttrib* getAttrib () const { return attrib; } - inline ByteOrder getOrder () const { return parent ? parent->getOrder() : INTEL; } + inline ByteOrder getOrder () const { return parent ? parent->getOrder() : HOSTORDER; } inline TagDirectory* getParent () const { return parent; } int getValueSize () const { return valuesize; } bool getOwnMemory () const { return allocOwnMemory; }