diff Plugins/Samples/GdcmDecoding/OrthancContext.cpp @ 983:80d4f1618b33 plugins

Sample plugin to replace DCMTK by GDCM when decoding images
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 01 Jul 2014 12:01:58 +0200
parents
children 501880d76474
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Samples/GdcmDecoding/OrthancContext.cpp	Tue Jul 01 12:01:58 2014 +0200
@@ -0,0 +1,158 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ **/
+
+
+#include "OrthancContext.h"
+
+#include <stdexcept>
+
+
+void OrthancContext::Check()
+{
+  if (context_ == NULL)
+  {
+    throw std::runtime_error("The Orthanc plugin context is not initialized");
+  }
+}
+
+
+OrthancContext& OrthancContext::GetInstance()
+{
+  static OrthancContext instance;
+  return instance;
+}
+
+
+OrthancContext::~OrthancContext()
+{
+  if (context_ != NULL)
+  {
+    throw std::runtime_error("The Orthanc plugin was not properly finalized");
+  }
+}
+
+
+void OrthancContext::ExtractGetArguments(Arguments& arguments,
+                                         const OrthancPluginHttpRequest& request)
+{
+  Check();
+  arguments.clear();
+
+  for (uint32_t i = 0; i < request.getCount; i++)
+  {
+    arguments[request.getKeys[i]] = request.getValues[i];
+  }
+}
+
+
+void OrthancContext::LogError(const std::string& s)
+{
+  Check();
+  OrthancPluginLogError(context_, s.c_str());
+}
+
+
+void OrthancContext::LogWarning(const std::string& s)
+{
+  Check();
+  OrthancPluginLogWarning(context_, s.c_str());
+}
+
+
+void OrthancContext::LogInfo(const std::string& s)
+{
+  Check();
+  OrthancPluginLogInfo(context_, s.c_str());
+}
+  
+
+void OrthancContext::Register(const std::string& uri,
+                              OrthancPluginRestCallback callback)
+{
+  Check();
+  OrthancPluginRegisterRestCallback(context_, uri.c_str(), callback);
+}
+
+
+void OrthancContext::GetDicomForInstance(std::string& result,
+                                         const std::string& instanceId)
+{
+  Check();
+  OrthancPluginMemoryBuffer buffer;
+    
+  if (OrthancPluginGetDicomForInstance(context_, &buffer, instanceId.c_str()))
+  {
+    throw std::runtime_error("No DICOM instance with Orthanc ID: " + instanceId);
+  }
+
+  if (buffer.size == 0)
+  {
+    result.clear();
+  }
+  else
+  {
+    result.assign(reinterpret_cast<char*>(buffer.data), buffer.size);
+  }
+
+  OrthancPluginFreeMemoryBuffer(context_, &buffer);
+}
+
+
+void OrthancContext::CompressAndAnswerPngImage(OrthancPluginRestOutput* output,
+                                               const Orthanc::ImageAccessor& accessor)
+{
+  Check();
+
+  OrthancPluginPixelFormat format;
+  switch (accessor.GetFormat())
+  {
+    case Orthanc::PixelFormat_Grayscale8:
+      format = OrthancPluginPixelFormat_Grayscale8;
+      break;
+
+    case Orthanc::PixelFormat_Grayscale16:
+      format = OrthancPluginPixelFormat_Grayscale16;
+      break;
+
+    case Orthanc::PixelFormat_SignedGrayscale16:
+      format = OrthancPluginPixelFormat_SignedGrayscale16;
+      break;
+
+    case Orthanc::PixelFormat_RGB24:
+      format = OrthancPluginPixelFormat_RGB24;
+      break;
+
+    case Orthanc::PixelFormat_RGBA32:
+      format = OrthancPluginPixelFormat_RGBA32;
+      break;
+
+    default:
+      throw std::runtime_error("Unsupported pixel format");
+  }
+
+  OrthancPluginCompressAndAnswerPngImage(context_, output, format, accessor.GetWidth(),
+                                         accessor.GetHeight(), accessor.GetPitch(), accessor.GetConstBuffer());
+}