Package: orthanc
Version: 0.6.1-1
Severity: serious
Tags: patch
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu trusty ubuntu-patch



In Ubuntu, the attached patch was applied to achieve the following:

  * detect-endian.patch: Patch to correctly detect endianness of the
    current host architecture, inspired by upstream's incomplete fix.
  * fix-endian-png.patch: Patch from upstream to fix PngWriter and
    the associated tests on above detected big-endian architectures.

The second patch in the series is a straight backport from upstream
of their PngWriter and testsuite fix, and should be self-evident as
such.

The first patch was heavily inspired by upstream's fix[1] for endian
detection, except that it does it correctly for all arches, instead
of bizarrely assuming that only __powerpc__ is big-endian.  Please
forward this one to them as a more complete fix.

If upstream is concerned that <endian.h> might not exist on Win32 (I
have no way of checking this, so don't know), the extra include could
be dropped, as <ctype.h> includes <endian.h> on Linux anyway.  I just
prefer to be explicit in my includes when using features, as implicit
includes tend to bite you when linux or glibc upstream decide to move
things around. :)

... Adam Conrad

-- System Information:
Debian Release: wheezy/sid
  APT prefers trusty-updates
  APT policy: (500, 'trusty-updates'), (500, 'trusty-security'), (500, 'trusty')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.12.0-1-generic (SMP w/4 CPU cores)
Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru orthanc-0.6.1/debian/changelog orthanc-0.6.1/debian/changelog
diff -Nru orthanc-0.6.1/debian/patches/detect-endian.patch orthanc-0.6.1/debian/patches/detect-endian.patch
--- orthanc-0.6.1/debian/patches/detect-endian.patch	1969-12-31 17:00:00.000000000 -0700
+++ orthanc-0.6.1/debian/patches/detect-endian.patch	2013-11-05 14:47:35.000000000 -0700
@@ -0,0 +1,29 @@
+Description: Detect correct endianness of the host machine
+Author: Adam Conrad <adcon...@ubuntu.com>
+Forwarded: no
+
+--- orthanc-0.6.1.orig/UnitTests/main.cpp
++++ orthanc-0.6.1/UnitTests/main.cpp
+@@ -3,6 +3,7 @@
+ #include "gtest/gtest.h"
+ 
+ #include <ctype.h>
++#include <endian.h>
+ 
+ #include "../Core/Compression/ZlibCompressor.h"
+ #include "../Core/DicomFormat/DicomTag.h"
+@@ -479,6 +480,14 @@ TEST(Toolbox, WriteFile)
+   ASSERT_THROW(Toolbox::ReadFile(u, path.c_str()), OrthancException);
+ }
+ 
++TEST(Toolbox, Endianness)
++{
++#if __BYTE_ORDER == __BIG_ENDIAN
++  ASSERT_EQ(Endianness_Big, Toolbox::DetectEndianness());
++#else // __LITTLE_ENDIAN
++  ASSERT_EQ(Endianness_Little, Toolbox::DetectEndianness());
++#endif
++}
+ 
+ int main(int argc, char **argv)
+ {
diff -Nru orthanc-0.6.1/debian/patches/fix-endian-png.patch orthanc-0.6.1/debian/patches/fix-endian-png.patch
--- orthanc-0.6.1/debian/patches/fix-endian-png.patch	1969-12-31 17:00:00.000000000 -0700
+++ orthanc-0.6.1/debian/patches/fix-endian-png.patch	2013-11-05 14:46:54.000000000 -0700
@@ -0,0 +1,75 @@
+Description: Fix PngWriter and associated test on big-endian arches
+Author: Adam Conrad <adcon...@ubuntu.com>
+Origin: https://code.google.com/p/orthanc/source/detail?r=51892be15618cc934f099bf90c1180215d5778eb
+
+--- orthanc-0.6.1.orig/UnitTests/Png.cpp
++++ orthanc-0.6.1/UnitTests/Png.cpp
+@@ -3,6 +3,7 @@
+ #include <stdint.h>
+ #include "../Core/FileFormats/PngReader.h"
+ #include "../Core/FileFormats/PngWriter.h"
++#include "../Core/Toolbox.h"
+ 
+ TEST(PngWriter, ColorPattern)
+ {
+@@ -24,6 +25,11 @@ TEST(PngWriter, ColorPattern)
+   }
+ 
+   w.WriteToFile("ColorPattern.png", width, height, pitch, Orthanc::PixelFormat_RGB24, &image[0]);
++
++  std::string f, md5;
++  Orthanc::Toolbox::ReadFile(f, "ColorPattern.png");
++  Orthanc::Toolbox::ComputeMD5(md5, f);
++  ASSERT_EQ("604e785f53c99cae6ea4584870b2c41d", md5);
+ }
+ 
+ TEST(PngWriter, Gray8Pattern)
+@@ -44,6 +50,11 @@ TEST(PngWriter, Gray8Pattern)
+   }
+ 
+   w.WriteToFile("Gray8Pattern.png", width, height, pitch, Orthanc::PixelFormat_Grayscale8, &image[0]);
++
++  std::string f, md5;
++  Orthanc::Toolbox::ReadFile(f, "Gray8Pattern.png");
++  Orthanc::Toolbox::ComputeMD5(md5, f);
++  ASSERT_EQ("5a9b98bea3d0a6d983980cc38bfbcdb3", md5);
+ }
+ 
+ TEST(PngWriter, Gray16Pattern)
+@@ -66,6 +77,11 @@ TEST(PngWriter, Gray16Pattern)
+   }
+ 
+   w.WriteToFile("Gray16Pattern.png", width, height, pitch, Orthanc::PixelFormat_Grayscale16, &image[0]);
++
++  std::string f, md5;
++  Orthanc::Toolbox::ReadFile(f, "Gray16Pattern.png");
++  Orthanc::Toolbox::ComputeMD5(md5, f);
++  ASSERT_EQ("0785866a08bf0a02d2eeff87f658571c", md5);
+ }
+ 
+ TEST(PngWriter, EndToEnd)
+--- orthanc-0.6.1.orig/Core/FileFormats/PngWriter.cpp
++++ orthanc-0.6.1/Core/FileFormats/PngWriter.cpp
+@@ -174,15 +174,18 @@ namespace Orthanc
+       {
+       case PixelFormat_Grayscale16:
+       case PixelFormat_SignedGrayscale16:
+-        png_set_rows(pimpl_->png_, pimpl_->info_, &pimpl_->rows_[0]);
+-
++      {
++        int transforms = 0;
+         if (Toolbox::DetectEndianness() == Endianness_Little)
+         {
+-          // Must swap the endianness!!
+-          png_write_png(pimpl_->png_, pimpl_->info_, PNG_TRANSFORM_SWAP_ENDIAN, NULL);
++          transforms = PNG_TRANSFORM_SWAP_ENDIAN;
+         }
+ 
++        png_set_rows(pimpl_->png_, pimpl_->info_, &pimpl_->rows_[0]);
++        png_write_png(pimpl_->png_, pimpl_->info_, transforms, NULL);
++
+         break;
++      }
+ 
+       default:
+         png_write_image(pimpl_->png_, &pimpl_->rows_[0]);
diff -Nru orthanc-0.6.1/debian/patches/series orthanc-0.6.1/debian/patches/series
--- orthanc-0.6.1/debian/patches/series	2013-09-16 07:39:57.000000000 -0600
+++ orthanc-0.6.1/debian/patches/series	2013-11-05 14:36:43.000000000 -0700
@@ -0,0 +1,2 @@
+detect-endian.patch
+fix-endian-png.patch

Reply via email to