# HG changeset patch # User Sebastien Jodogne # Date 1372940984 -7200 # Node ID 30086c1aca30a0d4b594baaa9b1a1a014199b8ac # Parent 80f7539147a25c914a14ae4645e1ce704c10a48b endianness diff -r 80f7539147a2 -r 30086c1aca30 Core/Enumerations.h --- a/Core/Enumerations.h Thu Jul 04 11:48:02 2013 +0200 +++ b/Core/Enumerations.h Thu Jul 04 14:29:44 2013 +0200 @@ -36,6 +36,13 @@ namespace Orthanc { + enum Endianness + { + Endianness_Unknown, + Endianness_Big, + Endianness_Little + }; + enum ErrorCode { // Generic error codes diff -r 80f7539147a2 -r 30086c1aca30 Core/PngWriter.cpp --- a/Core/PngWriter.cpp Thu Jul 04 11:48:02 2013 +0200 +++ b/Core/PngWriter.cpp Thu Jul 04 14:29:44 2013 +0200 @@ -37,6 +37,7 @@ #include #include "OrthancException.h" #include "ChunkedBuffer.h" +#include "Toolbox.h" // http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-4 @@ -171,9 +172,14 @@ switch (format) { case PixelFormat_Grayscale16: - // Must swap the endianness!! png_set_rows(pimpl_->png_, pimpl_->info_, &pimpl_->rows_[0]); - png_write_png(pimpl_->png_, pimpl_->info_, PNG_TRANSFORM_SWAP_ENDIAN, NULL); + + if (Toolbox::DetectEndianness() == Endianness_Little) + { + // Must swap the endianness!! + png_write_png(pimpl_->png_, pimpl_->info_, PNG_TRANSFORM_SWAP_ENDIAN, NULL); + } + break; default: diff -r 80f7539147a2 -r 30086c1aca30 Core/Toolbox.cpp --- a/Core/Toolbox.cpp Thu Jul 04 11:48:02 2013 +0200 +++ b/Core/Toolbox.cpp Thu Jul 04 14:29:44 2013 +0200 @@ -34,6 +34,7 @@ #include "OrthancException.h" +#include #include #include #include @@ -671,4 +672,29 @@ s.resize(target); } + + + Endianness Toolbox::DetectEndianness() + { + // http://sourceforge.net/p/predef/wiki/Endianness/ + + uint8_t buffer[4]; + + buffer[0] = 0x00; + buffer[1] = 0x01; + buffer[2] = 0x02; + buffer[3] = 0x03; + + switch (*((uint32_t *)buffer)) + { + case 0x00010203: + return Endianness_Big; + + case 0x03020100: + return Endianness_Little; + + default: + throw OrthancException(ErrorCode_NotImplemented); + } + } } diff -r 80f7539147a2 -r 30086c1aca30 Core/Toolbox.h --- a/Core/Toolbox.h Thu Jul 04 11:48:02 2013 +0200 +++ b/Core/Toolbox.h Thu Jul 04 14:29:44 2013 +0200 @@ -32,6 +32,8 @@ #pragma once +#include "Enumerations.h" + #include #include #include @@ -101,5 +103,7 @@ // In-place percent-decoding for URL void UrlDecode(std::string& s); + + Endianness DetectEndianness(); } } diff -r 80f7539147a2 -r 30086c1aca30 UnitTests/main.cpp --- a/UnitTests/main.cpp Thu Jul 04 11:48:02 2013 +0200 +++ b/UnitTests/main.cpp Thu Jul 04 14:29:44 2013 +0200 @@ -461,6 +461,8 @@ // Go to trace-level verbosity //FLAGS_v = 1; + Toolbox::DetectEndianness(); + google::InitGoogleLogging("Orthanc"); OrthancInitialize();