diff UnitTestsSources/JpegLossless.cpp @ 845:48016722c770 jpeg

refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 05 Jun 2014 15:58:07 +0200
parents 502c49adb5ad
children 03ea55da7429
line wrap: on
line diff
--- a/UnitTestsSources/JpegLossless.cpp	Thu Jun 05 14:08:23 2014 +0200
+++ b/UnitTestsSources/JpegLossless.cpp	Thu Jun 05 15:58:07 2014 +0200
@@ -33,28 +33,19 @@
 #include "PrecompiledHeadersUnitTests.h"
 #include "gtest/gtest.h"
 
+#include "../OrthancServer/Internals/DicomImageDecoder.h"
+
 #if ORTHANC_JPEG_LOSSLESS_ENABLED == 1
 
-#include <dcmtk/dcmjpls/djlsutil.h>
-#include <dcmtk/dcmjpls/djdecode.h>
 #include <dcmtk/dcmdata/dcfilefo.h>
 
-#include <dcmtk/dcmjpls/djcodecd.h>
-#include <dcmtk/dcmjpls/djcparam.h>
-#include <dcmtk/dcmjpeg/djrplol.h>
-#include <dcmtk/dcmdata/dcstack.h>
-#include <dcmtk/dcmdata/dcpixseq.h>
-
 #include "../OrthancServer/ParsedDicomFile.h"
-#include "../OrthancServer/FromDcmtkBridge.h"
-#include "../OrthancServer/ToDcmtkBridge.h"
 #include "../Core/OrthancException.h"
 #include "../Core/ImageFormats/ImageBuffer.h"
 #include "../Core/ImageFormats/PngWriter.h"
 
-#include <boost/lexical_cast.hpp>
+using namespace Orthanc;
 
-using namespace Orthanc;
 
 TEST(JpegLossless, Basic)
 {
@@ -93,110 +84,27 @@
   //if (fileformat.loadFile("IM-0001-1001-0001.dcm").good())
   if (fileformat.loadFile("tata.dcm").good())
   {
-    DcmDataset *dataset = fileformat.getDataset();
-
-    // <data-set xfer="1.2.840.10008.1.2.4.80" name="JPEG-LS Lossless">
-
-    DcmTag k(DICOM_TAG_PIXEL_DATA.GetGroup(),
-             DICOM_TAG_PIXEL_DATA.GetElement());
-
-    DcmElement *element = NULL;
-    if (dataset->findAndGetElement(k, element).good())
-    {
-      DcmPixelData& pixelData = dynamic_cast<DcmPixelData&>(*element);
-      DcmPixelSequence* pixelSequence = NULL;
-      if (pixelData.getEncapsulatedRepresentation
-          (dataset->getOriginalXfer(), NULL, pixelSequence).good())
-      {
-        OFString value;
-
-        if (!dataset->findAndGetOFString(ToDcmtkBridge::Convert(DICOM_TAG_COLUMNS), value).good())
-        {
-          throw OrthancException(ErrorCode_BadFileFormat);
-        }
-
-        unsigned int width = boost::lexical_cast<unsigned int>(value.c_str());
+    DcmDataset& dataset = *fileformat.getDataset();
 
-        if (!dataset->findAndGetOFString(ToDcmtkBridge::Convert(DICOM_TAG_ROWS), value).good())
-        {
-          throw OrthancException(ErrorCode_BadFileFormat);
-        }
-
-        unsigned int height = boost::lexical_cast<unsigned int>(value.c_str());
-
-        if (!dataset->findAndGetOFString(ToDcmtkBridge::Convert(DICOM_TAG_BITS_STORED), value).good())
-        {
-          throw OrthancException(ErrorCode_BadFileFormat);
-        }
+    ASSERT_TRUE(DicomImageDecoder::IsJpegLossless(dataset));
 
-        unsigned int bitsStored = boost::lexical_cast<unsigned int>(value.c_str());
-
-        if (!dataset->findAndGetOFString(ToDcmtkBridge::Convert(DICOM_TAG_PIXEL_REPRESENTATION), value).good())
-        {
-          throw OrthancException(ErrorCode_BadFileFormat);
-        }
-
-        bool isSigned = (boost::lexical_cast<unsigned int>(value.c_str()) != 0);
-
-        unsigned int samplesPerPixel = 1; // By default
-        if (dataset->findAndGetOFString(ToDcmtkBridge::Convert(DICOM_TAG_SAMPLES_PER_PIXEL), value).good())
-        {
-          samplesPerPixel = boost::lexical_cast<unsigned int>(value.c_str());
-        }
+    ImageBuffer image;
+    DicomImageDecoder::DecodeJpegLossless(image, dataset);
 
-        ImageBuffer buffer;
-        buffer.SetHeight(height);
-        buffer.SetWidth(width);
-
-        if (bitsStored == 8 && samplesPerPixel == 1 && !isSigned)
-        {
-          buffer.SetFormat(PixelFormat_Grayscale8);
-        }
-        else if (bitsStored == 8 && samplesPerPixel == 3 && !isSigned)
-        {
-          buffer.SetFormat(PixelFormat_RGB24);
-        }
-        else if (bitsStored == 16 && samplesPerPixel == 1 && !isSigned)
-        {
-          buffer.SetFormat(PixelFormat_Grayscale16);
-        }
-        else if (bitsStored == 16 && samplesPerPixel == 1 && isSigned)
-        {
-          buffer.SetFormat(PixelFormat_SignedGrayscale16);
-        }
-        else
-        {
-          throw OrthancException(ErrorCode_NotImplemented);
-        }
+    ImageAccessor accessor(image.GetAccessor());
 
-        ImageAccessor accessor(buffer.GetAccessor());
-
-        // http://support.dcmtk.org/docs/classDJLSLosslessDecoder.html
-        DJLSLosslessDecoder bb; DJLSCodecParameter cp;
-        //DJLSNearLosslessDecoder bb; DJLSCodecParameter cp;
-
-        Uint32 startFragment = 0;  // Default 
-        OFString decompressedColorModel;  // Out
-        DJ_RPLossless rp;
-        OFCondition c = bb.decodeFrame(&rp, pixelSequence, &cp, dataset, 0, startFragment, 
-                                       accessor.GetBuffer(), accessor.GetSize(), decompressedColorModel);
-
-
-
-        for (unsigned int y = 0; y < accessor.GetHeight(); y++)
-        {
-          int16_t *p = reinterpret_cast<int16_t*>(accessor.GetRow(y));
-          for (unsigned int x = 0; x < accessor.GetWidth(); x++, p ++)
-          {
-            if (*p < 0)
-              *p = 0;
-          }
-        }
-
-        PngWriter w;
-        w.WriteToFile("tata.png", accessor);
+    for (unsigned int y = 0; y < accessor.GetHeight(); y++)
+    {
+      int16_t *p = reinterpret_cast<int16_t*>(accessor.GetRow(y));
+      for (unsigned int x = 0; x < accessor.GetWidth(); x++, p ++)
+      {
+        if (*p < 0)
+          *p = 0;
       }
     }
+
+    PngWriter w;
+    w.WriteToFile("tata.png", accessor);
   }
 
 #endif