From 74ff88b21380c0df8739581ab24f52652e742270 Mon Sep 17 00:00:00 2001
From: dirk <dirk@git.imagemagick.org>
Date: Thu, 8 Jan 2015 21:46:22 +0000
Subject: [PATCH] Added canReadMultiThreaded and canWriteMultiThreaded to
 CoderInfo.

---
 Magick++/lib/CoderInfo.cpp        | 65 +++++++++++++++++++------------
 Magick++/lib/Magick++/CoderInfo.h | 19 ++++++---
 Magick++/lib/Magick++/Include.h   | 16 ++++++++
 3 files changed, 69 insertions(+), 31 deletions(-)

diff --git a/Magick++/lib/CoderInfo.cpp b/Magick++/lib/CoderInfo.cpp
index 070360768..f3511dd8f 100644
--- a/Magick++/lib/CoderInfo.cpp
+++ b/Magick++/lib/CoderInfo.cpp
@@ -1,7 +1,7 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
 // Copyright Bob Friesenhahn, 2001, 2002
-// Copyright Dirk Lemstra 2013-2014
+// Copyright Dirk Lemstra 2013-2015
 //
 // CoderInfo implementation
 //
@@ -16,32 +16,35 @@
 using namespace std;
 
 Magick::CoderInfo::CoderInfo(void)
-  : _name(),
-    _description(),
-    _mimeType(),
+  : _description(),
+    _isMultiFrame(false),
     _isReadable(false),
     _isWritable(false),
-    _isMultiFrame(false)
+    _mimeType(),
+    _name(),
+    _threadSupport(NoThreadSupport)
 {
 }
 
 Magick::CoderInfo::CoderInfo(const Magick::CoderInfo &coder_)
+  : _description(coder_._description),
+    _isMultiFrame(coder_._isMultiFrame),
+    _isReadable(coder_._isReadable),
+    _isWritable(coder_._isWritable),
+    _mimeType(coder_._mimeType),
+    _name(coder_._name),
+    _threadSupport(coder_._threadSupport)
 {
-  _name=coder_._name;
-  _description=coder_._description;
-  _mimeType=coder_._mimeType;
-  _isReadable=coder_._isReadable;
-  _isWritable=coder_._isWritable;
-  _isMultiFrame=coder_._isMultiFrame;
 }
 
 Magick::CoderInfo::CoderInfo(const std::string &name_)
-  : _name(),
-    _description(),
-    _mimeType(),
+  : _description(),
+    _isMultiFrame(false),
     _isReadable(false),
     _isWritable(false),
-    _isMultiFrame(false)
+    _mimeType(),
+    _name(),
+    _threadSupport(NoThreadSupport)
 {
   const Magick::MagickInfo
     *magickInfo;
@@ -50,17 +53,18 @@ Magick::CoderInfo::CoderInfo(const std::string &name_)
   magickInfo=GetMagickInfo(name_.c_str(),exceptionInfo);
   ThrowPPException;
   if (magickInfo == 0)
-    {
-      throwExceptionExplicit(OptionError,"Coder not found",name_.c_str());
-    }
+    throwExceptionExplicit(OptionError,"Coder not found",name_.c_str());
   else
     {
-      _name=string(magickInfo->name);
       _description=string(magickInfo->description);
+      _isMultiFrame=((magickInfo->adjoin == MagickFalse) ? false : true);
+      _isReadable=((magickInfo->decoder == (MagickCore::DecodeImageHandler *)
+        NULL) ? false : true);
+      _isWritable=((magickInfo->encoder == (MagickCore::EncodeImageHandler *)
+        NULL) ? false : true);
       _mimeType=string(magickInfo->mime_type ? magickInfo->mime_type : "");
-      _isReadable=((magickInfo->decoder == 0) ? false : true);
-      _isWritable=((magickInfo->encoder == 0) ? false : true);
-      _isMultiFrame=((magickInfo->adjoin == 0) ? false : true);
+      _name=string(magickInfo->name);
+      _threadSupport=magickInfo->thread_support;
     }
 }
 
@@ -73,16 +77,27 @@ Magick::CoderInfo& Magick::CoderInfo::operator=(const CoderInfo &coder_)
   // If not being set to ourself
   if (this != &coder_)
     {
-      _name=coder_._name;
       _description=coder_._description;
-      _mimeType=coder_._mimeType;
+      _isMultiFrame=coder_._isMultiFrame;
       _isReadable=coder_._isReadable;
       _isWritable=coder_._isWritable;
-      _isMultiFrame=coder_._isMultiFrame;
+      _mimeType=coder_._mimeType;
+      _name=coder_._name;
+      _threadSupport=coder_._threadSupport;
     }
   return(*this);
 }
 
+bool Magick::CoderInfo::canReadMultiThreaded(void) const
+{
+  return((_threadSupport & DecoderThreadSupport) == DecoderThreadSupport);
+}
+
+bool Magick::CoderInfo::canWriteMultiThreaded(void) const
+{
+  return((_threadSupport & EncoderThreadSupport) == EncoderThreadSupport);
+}
+
 std::string Magick::CoderInfo::description(void) const
 {
   return(_description);
diff --git a/Magick++/lib/Magick++/CoderInfo.h b/Magick++/lib/Magick++/CoderInfo.h
index 7b52f81c6..ede59c089 100644
--- a/Magick++/lib/Magick++/CoderInfo.h
+++ b/Magick++/lib/Magick++/CoderInfo.h
@@ -41,6 +41,12 @@ namespace Magick
     // Assignment operator
     CoderInfo& operator=(const CoderInfo &coder_);
 
+    // Format can read multi-threaded
+    bool canReadMultiThreaded(void) const;
+
+    // Format can write multi-threaded
+    bool canWriteMultiThreaded(void) const;
+
     // Format description
     std::string description(void) const;
 
@@ -63,12 +69,13 @@ namespace Magick
     bool unregister(void) const;
 
   private:
-    std::string _name;
-    std::string _description;
-    std::string _mimeType;
-    bool        _isReadable;
-    bool        _isWritable;
-    bool        _isMultiFrame;
+    std::string      _description;
+    bool             _isMultiFrame;
+    bool             _isReadable;
+    bool             _isWritable;
+    std::string      _mimeType;
+    std::string      _name;
+    MagickStatusType _threadSupport;
   };
 
 } // namespace Magick
diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h
index d65feeebd..3d7d84198 100644
--- a/Magick++/lib/Magick++/Include.h
+++ b/Magick++/lib/Magick++/Include.h
@@ -271,6 +271,7 @@ namespace Magick
   using MagickCore::Quantum;
   using MagickCore::MagickRealType;
   using MagickCore::MagickSizeType;
+  using MagickCore::MagickStatusType;
 
   // Boolean types
   using MagickCore::MagickBooleanType;
@@ -973,8 +974,17 @@ namespace Magick
   using MagickCore::InverseColorInterpolate;
 
   // Statistic type
+  using MagickCore::StatisticType;
+  using MagickCore::UndefinedStatistic;
+  using MagickCore::GradientStatistic;
+  using MagickCore::MaximumStatistic;
+  using MagickCore::MeanStatistic;
   using MagickCore::MedianStatistic;
+  using MagickCore::MinimumStatistic;
+  using MagickCore::ModeStatistic;
   using MagickCore::NonpeakStatistic;
+  using MagickCore::RootMeanSquareStatistic;
+  using MagickCore::StandardDeviationStatistic;
 
   // StorageType type
   using MagickCore::StorageType;
@@ -1009,6 +1019,12 @@ namespace Magick
   using MagickCore::ObliqueStyle;
   using MagickCore::AnyStyle;
 
+  // Thread support type
+  using MagickCore::MagickThreadSupport;
+  using MagickCore::NoThreadSupport;
+  using MagickCore::DecoderThreadSupport;
+  using MagickCore::EncoderThreadSupport;
+
   // Virtual pixel methods
   using MagickCore::VirtualPixelMethod;
   using MagickCore::UndefinedVirtualPixelMethod;
-- 
2.40.0