diff --git a/MagickCore/color.c b/MagickCore/color.c
index aa221bf..1a68716 100644
--- a/MagickCore/color.c
+++ b/MagickCore/color.c
@@ -1542,7 +1542,7 @@
   assert(tuple != (char *) NULL);
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",tuple);
   *tuple='\0';
-  if (IfMagickTrue(hex))
+  if (hex != MagickFalse)
     {
       /*
         Convert pixel to hex color.
@@ -1912,7 +1912,7 @@
   path=(const char *) NULL;
   for (i=0; i < (ssize_t) number_colors; i++)
   {
-    if (IfMagickTrue(color_info[i]->stealth))
+    if (color_info[i]->stealth != MagickFalse)
       continue;
     if ((path == (const char *) NULL) ||
         (LocaleCompare(path,color_info[i]->path) != 0))
@@ -2119,11 +2119,11 @@
               compliance;
 
             compliance=color_info->compliance;
-            if (IfMagickTrue(GlobExpression(token,"*SVG*",MagickTrue)))
+            if (GlobExpression(token,"*SVG*",MagickTrue) != MagickFalse)
               compliance|=SVGCompliance;
-            if (IfMagickTrue(GlobExpression(token,"*X11*",MagickTrue)))
+            if (GlobExpression(token,"*X11*",MagickTrue) != MagickFalse)
               compliance|=X11Compliance;
-            if (IfMagickTrue(GlobExpression(token,"*XPM*",MagickTrue)))
+            if (GlobExpression(token,"*XPM*",MagickTrue) != MagickFalse)
               compliance|=XPMCompliance;
             color_info->compliance=(ComplianceType) compliance;
             break;
diff --git a/MagickCore/constitute.c b/MagickCore/constitute.c
index 64e28eb..15422de 100644
--- a/MagickCore/constitute.c
+++ b/MagickCore/constitute.c
@@ -1030,7 +1030,7 @@
   (void) SyncImageProfiles(image);
   DisassociateImageStream(image);
   option=GetImageOption(image_info,"delegate:bimodal");
-  if ((IfMagickTrue(IsStringTrue(option))) &&
+  if ((IsStringTrue(option) != MagickFalse) &&
       (write_info->page == (char *) NULL) &&
       (GetPreviousImageInList(image) == (Image *) NULL) &&
       (GetNextImageInList(image) == (Image *) NULL) &&
diff --git a/MagickCore/delegate.c b/MagickCore/delegate.c
index c8afe58..d07f968 100644
--- a/MagickCore/delegate.c
+++ b/MagickCore/delegate.c
@@ -202,7 +202,7 @@
     options=DestroyConfigureOptions(options);
   }
 #endif
-  if (IfMagickTrue(IsLinkedListEmpty(delegate_cache)))
+  if (IsLinkedListEmpty(delegate_cache) != MagickFalse)
     status&=LoadDelegateCache(delegate_cache,DelegateMap,"built-in",0,
       exception);
   return(delegate_cache);
@@ -789,8 +789,8 @@
   for (i=0; p != (const DelegateInfo *) NULL; )
   {
     if( IfMagickFalse(p->stealth) &&
-        ( IfMagickTrue(GlobExpression(p->decode,pattern,MagickFalse)) ||
-          IfMagickTrue(GlobExpression(p->encode,pattern,MagickFalse))) )
+        ( GlobExpression(p->decode,pattern,MagickFalse) != MagickFalse ||
+          GlobExpression(p->encode,pattern,MagickFalse) != MagickFalse) )
       delegates[i++]=p;
     p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_cache);
   }
@@ -883,10 +883,10 @@
   for (i=0; p != (const DelegateInfo *) NULL; )
   {
     if( IfMagickFalse(p->stealth) &&
-        IfMagickTrue(GlobExpression(p->decode,pattern,MagickFalse)) )
+        GlobExpression(p->decode,pattern,MagickFalse) != MagickFalse )
       delegates[i++]=ConstantString(p->decode);
     if( IfMagickFalse(p->stealth) &&
-        IfMagickTrue(GlobExpression(p->encode,pattern,MagickFalse)) )
+        GlobExpression(p->encode,pattern,MagickFalse) != MagickFalse )
       delegates[i++]=ConstantString(p->encode);
     p=(const DelegateInfo *) GetNextValueInLinkedList(delegate_cache);
   }
@@ -1264,7 +1264,7 @@
   commands=StringToList(delegate_info->commands);
   if (commands == (char **) NULL)
     {
-      if( IfMagickTrue(temporary) )
+      if (temporary != MagickFalse)
         (void) RelinquishUniqueFileResource(image->filename);
       (void) ThrowMagickException(exception,GetMagickModule(),
         ResourceLimitError,"MemoryAllocationFailed","`%s'",
@@ -1414,7 +1414,7 @@
   path=(const char *) NULL;
   for (i=0; i < (ssize_t) number_delegates; i++)
   {
-    if( IfMagickTrue(delegate_info[i]->stealth) )
+    if (delegate_info[i]->stealth != MagickFalse)
       continue;
     if ((path == (const char *) NULL) ||
         (LocaleCompare(path,delegate_info[i]->path) != 0))
diff --git a/MagickCore/display.c b/MagickCore/display.c
index 25b1434..a9e921d 100644
--- a/MagickCore/display.c
+++ b/MagickCore/display.c
@@ -1676,7 +1676,7 @@
   assert(image_info->signature == MagickCoreSignature);
   assert(images != (Image *) NULL);
   assert(images->signature == MagickCoreSignature);
-  if (IfMagickTrue(images->debug) )
+  if (images->debug != MagickFalse )
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   display=XOpenDisplay(image_info->server_name);
   if (display == (Display *) NULL)
@@ -1921,7 +1921,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -2014,7 +2014,7 @@
               break;
             transparent_pen=pen_number == (MaxNumberPens-2) ? MagickTrue :
               MagickFalse;
-            if (IfMagickTrue(transparent_pen) )
+            if (transparent_pen != MagickFalse )
               break;
             if (pen_number == (MaxNumberPens-1))
               {
@@ -2059,7 +2059,7 @@
               break;
             transparent_box=pen_number == (MaxNumberPens-2) ? MagickTrue :
               MagickFalse;
-            if (IfMagickTrue(transparent_box) )
+            if (transparent_box != MagickFalse )
               break;
             if (pen_number == (MaxNumberPens-1))
               {
@@ -2210,7 +2210,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -2813,7 +2813,7 @@
   background_resources.backdrop=status != 0 ? MagickTrue : MagickFalse;
   status=XDisplayBackgroundImage(display,&background_resources,*image,
     exception);
-  if (IfMagickTrue(status))
+  if (status != MagickFalse)
     XClientMessage(display,windows->image.id,windows->im_protocols,
       windows->im_retain_colors,CurrentTime);
   XSetCursorState(display,windows,MagickFalse);
@@ -2933,7 +2933,7 @@
   (void) ResetMagickMemory(&segment_info,0,sizeof(segment_info));
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -3072,7 +3072,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -3118,7 +3118,7 @@
           windows->image.highlight_context,&segment_info);
       }
     else
-      if (IfMagickTrue(windows->info.mapped) )
+      if (windows->info.mapped != MagickFalse )
         (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
     /*
       Wait for next event.
@@ -3375,7 +3375,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -3667,7 +3667,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -4010,7 +4010,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -4124,7 +4124,7 @@
     {
       case ButtonPress:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Press: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -4144,7 +4144,7 @@
       }
       case ButtonRelease:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Release: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -4184,7 +4184,7 @@
         length=XLookupString((XKeyEvent *) &event.xkey,command,(int)
           sizeof(command),&key_symbol,(XComposeStatus *) NULL);
         *(command+length)='\0';
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Key press: 0x%lx (%s)",(unsigned long) key_symbol,command);
         switch ((int) key_symbol)
@@ -4226,7 +4226,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -4243,7 +4243,7 @@
       }
       default:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),"Event type: %d",
             event.type);
         break;
@@ -4422,7 +4422,7 @@
   */
   width=(unsigned int) windows->image.window_changes.width;
   height=(unsigned int) windows->image.window_changes.height;
-  if (IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Configure Image: %dx%d=>%.20gx%.20g",windows->image.ximage->width,
       windows->image.ximage->height,(double) width,(double) height);
@@ -4483,7 +4483,7 @@
   /*
     Update Magnify window configuration.
   */
-  if (IfMagickTrue(windows->magnify.mapped) )
+  if (windows->magnify.mapped != MagickFalse )
     XMakeMagnifyImage(display,windows,exception);
   windows->pan.crop_geometry=windows->image.crop_geometry;
   XBestIconSize(display,&windows->pan,image);
@@ -4681,7 +4681,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -4828,7 +4828,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -4889,7 +4889,7 @@
             windows->image.highlight_context,&highlight_info);
         }
       else
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
       /*
         Wait for next event.
@@ -4969,7 +4969,7 @@
     (void) XMapWindow(display,windows->info.id);
     do
     {
-      if (IfMagickTrue(windows->info.mapped) )
+      if (windows->info.mapped != MagickFalse )
         {
           /*
             Display pointer position.
@@ -5234,7 +5234,7 @@
           */
           x=event.xmotion.x;
           y=event.xmotion.y;
-          if (IfMagickTrue(windows->info.mapped) )
+          if (windows->info.mapped != MagickFalse )
             {
               if ((x < (int) (windows->info.x+windows->info.width)) &&
                   (y < (int) (windows->info.y+windows->info.height)))
@@ -5529,7 +5529,7 @@
     state=DefaultState;
     do
     {
-      if (IfMagickTrue(windows->info.mapped) )
+      if (windows->info.mapped != MagickFalse )
         {
           /*
             Display pointer position.
@@ -5608,7 +5608,7 @@
                 break;
               transparent=pen_number == (MaxNumberPens-2) ? MagickTrue :
                 MagickFalse;
-              if (IfMagickTrue(transparent) )
+              if (transparent != MagickFalse )
                 {
                   draw_info.stencil=TransparentStencil;
                   break;
@@ -5889,7 +5889,7 @@
           */
           x=event.xmotion.x;
           y=event.xmotion.y;
-          if (IfMagickTrue(windows->info.mapped) )
+          if (windows->info.mapped != MagickFalse )
             {
               if ((x < (int) (windows->info.x+windows->info.width)) &&
                   (y < (int) (windows->info.y+windows->info.height)))
@@ -5962,7 +5962,7 @@
                 windows->image.highlight_context,&line_info);
             }
           else
-            if (IfMagickTrue(windows->info.mapped) )
+            if (windows->info.mapped != MagickFalse )
               (void) XWithdrawWindow(display,windows->info.id,
                 windows->info.screen);
           break;
@@ -5984,7 +5984,7 @@
                 windows->image.highlight_context,&rectangle_info);
             }
           else
-            if (IfMagickTrue(windows->info.mapped) )
+            if (windows->info.mapped != MagickFalse )
               (void) XWithdrawWindow(display,windows->info.id,
                 windows->info.screen);
           break;
@@ -6008,7 +6008,7 @@
                 windows->image.highlight_context,&rectangle_info);
             }
           else
-            if (IfMagickTrue(windows->info.mapped) )
+            if (windows->info.mapped != MagickFalse )
               (void) XWithdrawWindow(display,windows->info.id,
                 windows->info.screen);
           break;
@@ -6034,7 +6034,7 @@
                 windows->image.highlight_context,&line_info);
             }
           else
-            if (IfMagickTrue(windows->info.mapped) )
+            if (windows->info.mapped != MagickFalse )
               (void) XWithdrawWindow(display,windows->info.id,
                 windows->info.screen);
           break;
@@ -6481,7 +6481,7 @@
       redo_image=(*image);
       *image=cache_image->list;
       cache_image=DestroyImage(cache_image);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         return;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -6647,7 +6647,7 @@
       *image=DestroyImage(*image);
       *image=redo_image;
       redo_image=NewImageList();
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         return;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7251,7 +7251,7 @@
       if (*filename == '\0')
         break;
       status=ShredFile(filename);
-      if (IfMagickTrue(status) )
+      if (status != MagickFalse )
         XNoticeWidget(display,windows,"Unable to delete image file:",filename);
       break;
     }
@@ -7532,7 +7532,7 @@
           (void) FormatLocaleString(windows->image.crop_geometry,MagickPathExtent,
             "%ux%u%+d%+d",width,height,(int) (*image)->columns-(int) width-x,y);
         }
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
       break;
@@ -7567,7 +7567,7 @@
           (void) FormatLocaleString(windows->image.crop_geometry,MagickPathExtent,
             "%ux%u%+d%+d",width,height,x,(int) (*image)->rows-(int) height-y);
         }
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
       break;
@@ -7653,7 +7653,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       windows->image.window_changes.width=(int) (*image)->columns;
       windows->image.window_changes.height=(int) (*image)->rows;
@@ -7694,7 +7694,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       windows->image.window_changes.width=(int) (*image)->columns;
       windows->image.window_changes.height=(int) (*image)->rows;
@@ -7750,7 +7750,7 @@
         MagickPathExtent);
       (void) ModulateImage(*image,modulate_factors,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7778,7 +7778,7 @@
         MagickPathExtent);
       (void) ModulateImage(*image,modulate_factors,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7805,7 +7805,7 @@
         MagickPathExtent);
       (void) ModulateImage(*image,modulate_factors,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7830,7 +7830,7 @@
       XCheckRefreshWindows(display,windows);
       (void) GammaImage(*image,strtod(factor,(char **) NULL),exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7845,7 +7845,7 @@
       XCheckRefreshWindows(display,windows);
       (void) ContrastImage(*image,MagickTrue,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7860,7 +7860,7 @@
       XCheckRefreshWindows(display,windows);
       (void) ContrastImage(*image,MagickFalse,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7899,7 +7899,7 @@
       (void) ContrastStretchImage(*image,black_point,white_point,
         exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7936,7 +7936,7 @@
       (void) SigmoidalContrastImage(*image,MagickTrue,geometry_info.rho,
         geometry_info.sigma,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7951,7 +7951,7 @@
       XCheckRefreshWindows(display,windows);
       (void) NormalizeImage(*image,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7966,7 +7966,7 @@
       XCheckRefreshWindows(display,windows);
       (void) EqualizeImage(*image,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7981,7 +7981,7 @@
       XCheckRefreshWindows(display,windows);
       (void) NegateImage(*image,MagickFalse,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -7997,7 +7997,7 @@
       (void) SetImageType(*image,(*image)->alpha_trait == UndefinedPixelTrait ?
         GrayscaleType : GrayscaleAlphaType,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8031,7 +8031,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8062,7 +8062,7 @@
         NoDitherMethod;
       (void) QuantizeImage(&quantize_info,*image,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8086,7 +8086,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8124,7 +8124,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8160,7 +8160,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8200,7 +8200,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8236,7 +8236,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8272,7 +8272,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8301,7 +8301,7 @@
       threshold=StringToDoubleInterval(factor,(double) QuantumRange+1.0);
       (void) BilevelImage(*image,threshold,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8336,7 +8336,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8371,7 +8371,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8412,7 +8412,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8440,7 +8440,7 @@
         exception);
       (void) RaiseImage(*image,&page_geometry,MagickTrue,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8469,7 +8469,7 @@
       (void) SegmentImage(*image,sRGBColorspace,MagickFalse,geometry_info.rho,
         geometry_info.sigma,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8507,7 +8507,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8536,7 +8536,7 @@
       threshold=StringToDoubleInterval(factor,(double) QuantumRange+1.0);
       (void) SolarizeImage(*image,threshold,exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8572,7 +8572,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8608,7 +8608,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8651,7 +8651,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8689,7 +8689,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8725,7 +8725,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8765,7 +8765,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       XConfigureImageColormap(display,resource_info,windows,*image,exception);
       (void) XConfigureImage(display,resource_info,windows,*image,exception);
@@ -8880,7 +8880,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       windows->image.window_changes.width=(int) (*image)->columns;
       windows->image.window_changes.height=(int) (*image)->rows;
@@ -8936,7 +8936,7 @@
         }
       CatchException(exception);
       XSetCursorState(display,windows,MagickFalse);
-      if (IfMagickTrue(windows->image.orphan) )
+      if (windows->image.orphan != MagickFalse )
         break;
       windows->image.window_changes.width=(int) (*image)->columns;
       windows->image.window_changes.height=(int) (*image)->rows;
@@ -9045,7 +9045,7 @@
       /*
         Zoom image.
       */
-      if (IfMagickTrue(windows->magnify.mapped) )
+      if (windows->magnify.mapped != MagickFalse )
         (void) XRaiseWindow(display,windows->magnify.id);
       else
         {
@@ -9359,7 +9359,7 @@
     /*
       Map and unmap Info widget as text cursor crosses its boundaries.
     */
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         if ((x < (int) (windows->info.x+windows->info.width)) &&
             (y < (int) (windows->info.y+windows->info.height)))
@@ -9369,7 +9369,7 @@
       if ((x > (int) (windows->info.x+windows->info.width)) ||
           (y > (int) (windows->info.y+windows->info.height)))
         (void) XMapWindow(display,windows->info.id);
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -9737,7 +9737,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -10025,7 +10025,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -10681,7 +10681,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -10755,7 +10755,7 @@
     {
       case ButtonPress:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Press: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -10784,7 +10784,7 @@
       }
       case ButtonRelease:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Release: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -10824,7 +10824,7 @@
         length=XLookupString((XKeyEvent *) &event.xkey,command,(int)
           sizeof(command),&key_symbol,(XComposeStatus *) NULL);
         *(command+length)='\0';
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Key press: 0x%lx (%s)",(long) key_symbol,command);
         switch ((int) key_symbol)
@@ -10866,7 +10866,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -10883,7 +10883,7 @@
       }
       default:
       {
-        if (IfMagickTrue(image->debug) )
+        if (image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),"Event type: %d",
             event.type);
         break;
@@ -11327,7 +11327,7 @@
   state=DefaultState;
   do
   {
-    if (IfMagickTrue(windows->info.mapped) )
+    if (windows->info.mapped != MagickFalse )
       {
         /*
           Display pointer position.
@@ -11437,7 +11437,7 @@
         */
         x=event.xmotion.x;
         y=event.xmotion.y;
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           {
             if ((x < (int) (windows->info.x+windows->info.width)) &&
                 (y < (int) (windows->info.y+windows->info.height)))
@@ -11498,7 +11498,7 @@
             windows->image.highlight_context,&highlight_info);
         }
       else
-        if (IfMagickTrue(windows->info.mapped) )
+        if (windows->info.mapped != MagickFalse )
           (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
       /*
         Wait for next event.
@@ -11583,7 +11583,7 @@
     (void) XMapWindow(display,windows->info.id);
     do
     {
-      if (IfMagickTrue(windows->info.mapped) )
+      if (windows->info.mapped != MagickFalse )
         {
           /*
             Display pointer position.
@@ -11905,7 +11905,7 @@
           */
           x=event.xmotion.x;
           y=event.xmotion.y;
-          if (IfMagickTrue(windows->info.mapped) )
+          if (windows->info.mapped != MagickFalse )
             {
               if ((x < (int) (windows->info.x+windows->info.width)) &&
                   (y < (int) (windows->info.y+windows->info.height)))
@@ -12314,7 +12314,7 @@
               windows->image.highlight_context,&rotate_info);
           }
         else
-          if (IfMagickTrue(windows->info.mapped) )
+          if (windows->info.mapped != MagickFalse )
             (void) XWithdrawWindow(display,windows->info.id,
               windows->info.screen);
         /*
@@ -12449,7 +12449,7 @@
         }
       }
     }
-  if (IfMagickTrue(windows->image.orphan) )
+  if (windows->image.orphan != MagickFalse )
     return(MagickTrue);
   if (normalized_degrees != 0.0)
     {
@@ -12560,7 +12560,7 @@
   XFileBrowserWidget(display,windows,"Save",filename);
   if (*filename == '\0')
     return(MagickTrue);
-  if (IfMagickTrue(IsPathAccessible(filename)) )
+  if (IsPathAccessible(filename != MagickFalse) )
     {
       int
         status;
@@ -12634,7 +12634,7 @@
   */
   (void) CopyMagickString(save_image->filename,filename,MagickPathExtent);
   status=WriteImage(image_info,save_image,exception);
-  if (IfMagickTrue(status) )
+  if (status != MagickFalse )
     image->taint=MagickFalse;
   save_image=DestroyImage(save_image);
   image_info=DestroyImageInfo(image_info);
@@ -12873,7 +12873,7 @@
     {
       while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
       if (event->xmotion.window == windows->image.id)
-        if (IfMagickTrue(windows->magnify.mapped) )
+        if (windows->magnify.mapped != MagickFalse )
           {
             /*
               Update magnified image.
@@ -12964,7 +12964,7 @@
     height,
     width;
 
-  if (IfMagickTrue(windows->info.mapped) )
+  if (windows->info.mapped != MagickFalse )
     {
       /*
         Display info on cropping rectangle.
@@ -13211,7 +13211,7 @@
       if (status <= 0)
         break;
       status=ShredFile(filename);
-      if (IfMagickTrue(status) )
+      if (status != MagickFalse )
         {
           XNoticeWidget(display,windows,"Unable to delete image file:",
             filename);
@@ -13248,7 +13248,7 @@
           q++;
         (void) CopyMagickString(filename,p,(size_t) (q-p+1));
         p=q;
-        if (IfMagickTrue(IsPathAccessible(filename)) )
+        if (IsPathAccessible(filename != MagickFalse) )
           {
             tile++;
             continue;
@@ -13818,7 +13818,7 @@
   */
   assert(image != (Image *) NULL);
   assert(image->signature == MagickCoreSignature);
-  if (IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse )
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   resources=(*resource_info);
   window_info.id=(Window) NULL;
@@ -13933,7 +13933,7 @@
       image->filename);
   window_info.x=0;
   window_info.y=0;
-  if (IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse )
     {
       (void) LogMagickEvent(X11Event,GetMagickModule(),
         "Image: %s[%.20g] %.20gx%.20g ",image->filename,(double) image->scene,
@@ -13948,7 +13948,7 @@
   */
   width=(int) window_info.width;
   height=(int) window_info.height;
-  if (IfMagickTrue(resources.backdrop) )
+  if (resources.backdrop != MagickFalse )
     {
       /*
         Center image on window.
@@ -14513,7 +14513,7 @@
 
   assert(image != (Image **) NULL);
   assert((*image)->signature == MagickCoreSignature);
-  if (IfMagickTrue((*image)->debug) )
+  if ((*image != MagickFalse->debug) )
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
   display_image=(*image);
   warning_handler=(WarningHandler) NULL;
@@ -14586,7 +14586,7 @@
   manager_hints=windows->manager_hints;
   root_window=XRootWindow(display,visual_info->screen);
   nexus=NewImageList();
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     {
       (void) LogMagickEvent(X11Event,GetMagickModule(),
         "Image: %s[%.20g] %.20gx%.20g ",display_image->filename,
@@ -14615,7 +14615,7 @@
   manager_hints->initial_state=WithdrawnState;
   XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints,
     &windows->context);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Window id: 0x%lx (context)",windows->context.id);
   context_values.background=pixel->background_color.pixel;
@@ -14666,7 +14666,7 @@
   manager_hints->initial_state=IconicState;
   XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints,
     &windows->icon);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (icon)",
       windows->icon.id);
   /*
@@ -14767,7 +14767,7 @@
         NormalState;
       XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints,
         &windows->backdrop);
-      if (IfMagickTrue(display_image->debug) )
+      if (display_image->debug != MagickFalse )
         (void) LogMagickEvent(X11Event,GetMagickModule(),
           "Window id: 0x%lx (backdrop)",windows->backdrop.id);
       (void) XMapWindow(display,windows->backdrop.id);
@@ -14799,7 +14799,7 @@
       manager_hints->flags|=WindowGroupHint;
       manager_hints->window_group=windows->group_leader.id;
       (void) XSelectInput(display,windows->group_leader.id,StructureNotifyMask);
-      if (IfMagickTrue(display_image->debug) )
+      if (display_image->debug != MagickFalse )
         (void) LogMagickEvent(X11Event,GetMagickModule(),
           "Window id: 0x%lx (group leader)",windows->group_leader.id);
     }
@@ -14811,7 +14811,7 @@
   if (windows->group_leader.id != (Window) NULL)
     (void) XSetTransientForHint(display,windows->image.id,
       windows->group_leader.id);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (image)",
       windows->image.id);
   /*
@@ -14839,9 +14839,9 @@
   windows->info.shadow_stipple=XCreateBitmapFromData(display,
     windows->info.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight);
   (void) XSetTransientForHint(display,windows->info.id,windows->image.id);
-  if (IfMagickTrue(windows->image.mapped) )
+  if (windows->image.mapped != MagickFalse )
     (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (info)",
       windows->info.id);
   /*
@@ -14873,9 +14873,9 @@
   windows->command.shadow_stipple=XCreateBitmapFromData(display,
     windows->command.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight);
   (void) XSetTransientForHint(display,windows->command.id,windows->image.id);
-  if (IfMagickTrue(windows->command.mapped) )
+  if (windows->command.mapped != MagickFalse )
     (void) XMapRaised(display,windows->command.id);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Window id: 0x%lx (command)",windows->command.id);
   /*
@@ -14904,7 +14904,7 @@
   windows->widget.shadow_stipple=XCreateBitmapFromData(display,
     windows->widget.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight);
   (void) XSetTransientForHint(display,windows->widget.id,windows->image.id);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Window id: 0x%lx (widget)",windows->widget.id);
   /*
@@ -14928,7 +14928,7 @@
   windows->popup.shadow_stipple=XCreateBitmapFromData(display,
     windows->popup.id,(char *) ShadowBitmap,ShadowWidth,ShadowHeight);
   (void) XSetTransientForHint(display,windows->popup.id,windows->image.id);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Window id: 0x%lx (pop up)",windows->popup.id);
   /*
@@ -14970,7 +14970,7 @@
   manager_hints->window_group=windows->image.id;
   XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints,
     &windows->magnify);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),
       "Window id: 0x%lx (magnify)",windows->magnify.id);
   (void) XSetTransientForHint(display,windows->magnify.id,windows->image.id);
@@ -14999,11 +14999,11 @@
   manager_hints->window_group=windows->image.id;
   XMakeWindow(display,root_window,argv,argc,class_hints,manager_hints,
     &windows->pan);
-  if (IfMagickTrue(display_image->debug) )
+  if (display_image->debug != MagickFalse )
     (void) LogMagickEvent(X11Event,GetMagickModule(),"Window id: 0x%lx (pan)",
       windows->pan.id);
   (void) XSetTransientForHint(display,windows->pan.id,windows->image.id);
-  if (IfMagickTrue(windows->info.mapped) )
+  if (windows->info.mapped != MagickFalse )
     (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
   if (IfMagickFalse(windows->image.mapped) ||
       (windows->backdrop.id != (Window) NULL))
@@ -15039,9 +15039,9 @@
   if (IfMagickFalse(status))
     ThrowXWindowFatalException(XServerFatalError,"UnableToCreateXImage",
       display_image->filename);
-  if (IfMagickTrue(windows->magnify.mapped) )
+  if (windows->magnify.mapped != MagickFalse )
     (void) XMapRaised(display,windows->magnify.id);
-  if (IfMagickTrue(windows->pan.mapped) )
+  if (windows->pan.mapped != MagickFalse )
     (void) XMapRaised(display,windows->pan.id);
   windows->image.window_changes.width=(int) display_image->columns;
   windows->image.window_changes.height=(int) display_image->rows;
@@ -15054,7 +15054,7 @@
   delay=display_image->delay/MagickMax(display_image->ticks_per_second,1L);
   timer=time((time_t *) NULL)+(delay == 0 ? 1 : delay)+1;
   update_time=0;
-  if (IfMagickTrue(resource_info->update) )
+  if (resource_info->update != MagickFalse )
     {
       MagickBooleanType
         status;
@@ -15063,7 +15063,7 @@
         Determine when file data was last modified.
       */
       status=GetPathAttributes(display_image->filename,&attributes);
-      if (IfMagickTrue(status) )
+      if (status != MagickFalse )
         update_time=attributes.st_mtime;
     }
   *state&=(~FormerImageState);
@@ -15074,7 +15074,7 @@
     /*
       Handle a window event.
     */
-    if (IfMagickTrue(windows->image.mapped) )
+    if (windows->image.mapped != MagickFalse )
       if ((display_image->delay != 0) || (resource_info->update != 0))
         {
           if (timer < time((time_t *) NULL))
@@ -15090,7 +15090,7 @@
                     Determine if image file was modified.
                   */
                   status=GetPathAttributes(display_image->filename,&attributes);
-                  if (IfMagickTrue(status) )
+                  if (status != MagickFalse )
                     if (update_time != attributes.st_mtime)
                       {
                         /*
@@ -15160,7 +15160,7 @@
     {
       case ButtonPress:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Press: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -15200,7 +15200,7 @@
                 /*
                   Map/unmap Command widget.
                 */
-                if (IfMagickTrue(windows->command.mapped) )
+                if (windows->command.mapped != MagickFalse )
                   (void) XWithdrawWindow(display,windows->command.id,
                     windows->command.screen);
                 else
@@ -15355,7 +15355,7 @@
       }
       case ButtonRelease:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Button Release: 0x%lx %u +%d+%d",event.xbutton.window,
             event.xbutton.button,event.xbutton.x,event.xbutton.y);
@@ -15363,7 +15363,7 @@
       }
       case ClientMessage:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Client Message: 0x%lx 0x%lx %d 0x%lx",event.xclient.window,
             event.xclient.message_type,event.xclient.format,(unsigned long)
@@ -15409,7 +15409,7 @@
                     (unsigned long) magick_windows[i]->mask,
                     &magick_windows[i]->attributes);
                 }
-                if (IfMagickTrue(windows->pan.mapped) )
+                if (windows->pan.mapped != MagickFalse )
                   {
                     (void) XSetWindowBackgroundPixmap(display,windows->pan.id,
                       windows->pan.pixmap);
@@ -15526,7 +15526,7 @@
       }
       case ConfigureNotify:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Configure Notify: 0x%lx %dx%d+%d+%d %d",event.xconfigure.window,
             event.xconfigure.width,event.xconfigure.height,event.xconfigure.x,
@@ -15611,8 +15611,8 @@
                 windows->image.x=vid_info.x;
                 windows->image.y=vid_info.y;
               }
-            if (IfMagickTrue(windows->image.mapped) &&
-                IfMagickTrue(windows->image.stasis) )
+            if (windows->image.mapped != MagickFalse &&
+                windows->image.stasis != MagickFalse )
               {
                 /*
                   Update image window configuration.
@@ -15632,7 +15632,7 @@
                 XDrawPanRectangle(display,windows);
               }
             else
-              if (IfMagickTrue(windows->pan.mapped) )
+              if (windows->pan.mapped != MagickFalse )
                 (void) XWithdrawWindow(display,windows->pan.id,
                   windows->pan.screen);
             break;
@@ -15665,8 +15665,8 @@
                   &window_changes);
                 break;
               }
-            if (IfMagickTrue(windows->magnify.mapped) &&
-                IfMagickTrue(windows->magnify.stasis) )
+            if (windows->magnify.mapped != MagickFalse &&
+                windows->magnify.stasis != MagickFalse )
               {
                 status=XMakeImage(display,resource_info,&windows->magnify,
                   display_image,windows->magnify.width,windows->magnify.height,
@@ -15675,7 +15675,7 @@
               }
             break;
           }
-        if (IfMagickTrue(windows->magnify.mapped) &&
+        if (windows->magnify.mapped != MagickFalse &&
             (event.xconfigure.window == windows->pan.id))
           {
             /*
@@ -15706,7 +15706,7 @@
         /*
           Group leader has exited.
         */
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Destroy Notify: 0x%lx",event.xdestroywindow.window);
         if (event.xdestroywindow.window == windows->group_leader.id)
@@ -15728,7 +15728,7 @@
       }
       case Expose:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Expose: 0x%lx %dx%d+%d+%d",event.xexpose.window,
             event.xexpose.width,event.xexpose.height,event.xexpose.x,
@@ -15737,7 +15737,7 @@
           Refresh windows that are now exposed.
         */
         if ((event.xexpose.window == windows->image.id) &&
-            IfMagickTrue(windows->image.mapped) )
+            windows->image.mapped != MagickFalse )
           {
             XRefreshWindow(display,&windows->image,&event);
             delay=display_image->delay/MagickMax(
@@ -15746,7 +15746,7 @@
             break;
           }
         if ((event.xexpose.window == windows->magnify.id) &&
-            IfMagickTrue(windows->magnify.mapped))
+            windows->magnify.mapped != MagickFalse)
           {
             XMakeMagnifyImage(display,windows,exception);
             break;
@@ -15774,7 +15774,7 @@
         length=XLookupString((XKeyEvent *) &event.xkey,command,(int)
           sizeof(command),&key_symbol,(XComposeStatus *) NULL);
         *(command+length)='\0';
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Key press: %d 0x%lx (%s)",event.xkey.state,(unsigned long)
             key_symbol,command);
@@ -15813,7 +15813,7 @@
         */
         (void) XLookupString((XKeyEvent *) &event.xkey,command,(int)
           sizeof(command),&key_symbol,(XComposeStatus *) NULL);
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Key release: 0x%lx (%c)",(unsigned long) key_symbol,*command);
         break;
@@ -15830,7 +15830,7 @@
       }
       case MapNotify:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),"Map Notify: 0x%lx",
             event.xmap.window);
         if (event.xmap.window == windows->backdrop.id)
@@ -15938,7 +15938,7 @@
           after,
           length;
 
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Property Notify: 0x%lx 0x%lx %d",event.xproperty.window,
             event.xproperty.atom,event.xproperty.state);
@@ -15970,7 +15970,7 @@
       }
       case ReparentNotify:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Reparent Notify: 0x%lx=>0x%lx",event.xreparent.parent,
             event.xreparent.window);
@@ -15978,7 +15978,7 @@
       }
       case UnmapNotify:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),
             "Unmap Notify: 0x%lx",event.xunmap.window);
         if (event.xunmap.window == windows->backdrop.id)
@@ -16041,7 +16041,7 @@
       }
       default:
       {
-        if (IfMagickTrue(display_image->debug) )
+        if (display_image->debug != MagickFalse )
           (void) LogMagickEvent(X11Event,GetMagickModule(),"Event type: %d",
             event.type);
         break;
@@ -16052,13 +16052,13 @@
     (void) XMagickCommand(display,resource_info,windows,FreeBuffersCommand,
       &display_image,exception);
   else
-    if (IfMagickTrue(resource_info->confirm_edit) )
+    if (resource_info->confirm_edit != MagickFalse )
       {
         /*
           Query user if image has changed.
         */
         if (IfMagickFalse(resource_info->immutable) &&
-            IfMagickTrue(display_image->taint))
+            display_image->taint != MagickFalse)
           {
             int
               status;
@@ -16080,16 +16080,16 @@
       /*
         Withdraw pan and Magnify window.
       */
-      if (IfMagickTrue(windows->info.mapped) )
+      if (windows->info.mapped != MagickFalse )
         (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
-      if (IfMagickTrue(windows->magnify.mapped) )
+      if (windows->magnify.mapped != MagickFalse )
         (void) XWithdrawWindow(display,windows->magnify.id,
           windows->magnify.screen);
-      if (IfMagickTrue(windows->command.mapped) )
+      if (windows->command.mapped != MagickFalse )
         (void) XWithdrawWindow(display,windows->command.id,
           windows->command.screen);
     }
-  if (IfMagickTrue(windows->pan.mapped) )
+  if (windows->pan.mapped != MagickFalse )
     (void) XWithdrawWindow(display,windows->pan.id,windows->pan.screen);
   if (IfMagickFalse(resource_info->backdrop) )
     if (windows->backdrop.mapped)
@@ -16189,7 +16189,7 @@
   assert(image != (Image *) NULL);
   assert(image->signature == MagickCoreSignature);
   (void) image_info;
-  if (IfMagickTrue(image->debug) )
+  if (image->debug != MagickFalse )
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
     "DelegateLibrarySupportNotBuiltIn","'%s' (X11)",image->filename);
diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c
index 9bdd804..461a129 100644
--- a/MagickCore/enhance.c
+++ b/MagickCore/enhance.c
@@ -326,7 +326,7 @@
   assert(clut_image->signature == MagickCoreSignature);
   if( IfMagickFalse(SetImageStorageClass(image,DirectClass,exception)) )
     return(MagickFalse);
-  if( IfMagickTrue(IsGrayColorspace(image->colorspace)) &&
+  if( IsGrayColorspace(image->colorspace != MagickFalse) &&
       IfMagickFalse(IsGrayColorspace(clut_image->colorspace)))
     (void) SetImageColorspace(image,sRGBColorspace,exception);
   clut_map=(PixelInfo *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*clut_map));
@@ -888,7 +888,7 @@
   assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  sign=IfMagickTrue(sharpen) ? 1 : -1;
+  sign=sharpen != MagickFalse ? 1 : -1;
   if (image->storage_class == PseudoClass)
     {
       /*
@@ -2679,7 +2679,7 @@
   assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  if( IfMagickTrue(IsGrayColorspace(image->colorspace)) &&
+  if( IsGrayColorspace(image->colorspace != MagickFalse) &&
       (IfMagickFalse(IsGrayColorspace(black_color->colorspace)) ||
        IfMagickFalse(IsGrayColorspace(white_color->colorspace))))
     (void) SetImageColorspace(image,sRGBColorspace,exception);
@@ -3423,7 +3423,7 @@
       /*
         Negate colormap.
       */
-      if( IfMagickTrue(grayscale) )
+      if( grayscale != MagickFalse )
         if ((image->colormap[i].red != image->colormap[i].green) ||
             (image->colormap[i].green != image->colormap[i].blue))
           continue;
@@ -3440,7 +3440,7 @@
   status=MagickTrue;
   progress=0;
   image_view=AcquireAuthenticCacheView(image,exception);
-  if( IfMagickTrue(grayscale) )
+  if( grayscale != MagickFalse )
     {
       for (y=0; y < (ssize_t) image->rows; y++)
       {
@@ -3468,7 +3468,7 @@
             j;
 
           if ((GetPixelReadMask(image,q) == 0) ||
-              IfMagickTrue(IsPixelGray(image,q)))
+              IsPixelGray(image,q != MagickFalse))
             {
               q+=GetPixelChannels(image);
               continue;
@@ -3771,7 +3771,7 @@
       register ssize_t
         i;
 
-      if( IfMagickTrue(sharpen) )
+      if( sharpen != MagickFalse )
         for (i=0; i < (ssize_t) image->colors; i++)
         {
           if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
@@ -3846,7 +3846,7 @@
         PixelTrait traits=GetPixelChannelTraits(image,channel);
         if ((traits & UpdatePixelTrait) == 0)
           continue;
-        if( IfMagickTrue(sharpen) )
+        if( sharpen != MagickFalse )
           q[i]=ScaledSig(q[i]);
         else
           q[i]=InverseScaledSig(q[i]);
diff --git a/MagickCore/hashmap.c b/MagickCore/hashmap.c
index 0a63d45..b793755 100644
--- a/MagickCore/hashmap.c
+++ b/MagickCore/hashmap.c
@@ -1,300 +1,300 @@
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%                H   H   AAA   SSSSS  H   H  M   M   AAA   PPPP               %
-%                H   H  A   A  SS     H   H  MM MM  A   A  P   P              %
-%                HHHHH  AAAAA   SSS   HHHHH  M M M  AAAAA  PPPP               %
-%                H   H  A   A     SS  H   H  M   M  A   A  P                  %
-%                H   H  A   A  SSSSS  H   H  M   M  A   A  P                  %
-%                                                                             %
-%                                                                             %
-%                  MagickCore Hash-map and Linked-list Methods                %
-%                                                                             %
-%                              Software Design                                %
-%                                   Cristy                                    %
-%                               December 2002                                 %
-%                                                                             %
-%                                                                             %
-%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
-%  dedicated to making software imaging solutions freely available.           %
-%                                                                             %
-%  You may not use this file except in compliance with the License.  You may  %
-%  obtain a copy of the License at                                            %
-%                                                                             %
-%    http://www.imagemagick.org/script/license.php                            %
-%                                                                             %
-%  Unless required by applicable law or agreed to in writing, software        %
-%  distributed under the License is distributed on an "AS IS" BASIS,          %
-%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
-%  See the License for the specific language governing permissions and        %
-%  limitations under the License.                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  This module implements the standard handy hash and linked-list methods for
-%  storing and retrieving large numbers of data elements.  It is loosely based
-%  on the Java implementation of these algorithms.
-%
-*/
-
-/*
-  Include declarations.
-*/
-#include "MagickCore/studio.h"
-#include "MagickCore/exception.h"
-#include "MagickCore/exception-private.h"
-#include "MagickCore/locale_.h"
-#include "MagickCore/hashmap.h"
-#include "MagickCore/memory_.h"
-#include "MagickCore/semaphore.h"
-#include "MagickCore/signature-private.h"
-#include "MagickCore/string_.h"
-
-/*
-  Typedef declarations.
-*/
-typedef struct _ElementInfo
-{
-  void
-    *value;
-
-  struct _ElementInfo
-    *next;
-} ElementInfo;
-
-typedef struct _EntryInfo
-{
-  size_t
-    hash;
-
-  void
-    *key,
-    *value;
-} EntryInfo;
-
-struct _LinkedListInfo
-{
-  size_t
-    capacity,
-    elements;
-
-  ElementInfo
-    *head,
-    *tail,
-    *next;
-
-  SemaphoreInfo
-    *semaphore;
-
-  size_t
-    signature;
-};
-
-struct _HashmapInfo
-{
-  size_t
-    (*hash)(const void *);
-
-  MagickBooleanType
-    (*compare)(const void *,const void *);
-
-  void
-    *(*relinquish_key)(void *),
-    *(*relinquish_value)(void *);
-
-  size_t
-    capacity,
-    entries,
-    next;
-
-  MagickBooleanType
-    head_of_list;
-
-  LinkedListInfo
-    **map;
-
-  SemaphoreInfo
-    *semaphore;
-
-  size_t
-    signature;
-};
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   A p p e n d V a l u e T o L i n k e d L i s t                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  AppendValueToLinkedList() appends a value to the end of the linked-list.
-%
-%  The format of the AppendValueToLinkedList method is:
-%
-%      MagickBooleanType AppendValueToLinkedList(LinkedListInfo *list_info,
-%        const void *value)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-%    o value: the value.
-%
-*/
-MagickExport MagickBooleanType AppendValueToLinkedList(
-  LinkedListInfo *list_info,const void *value)
-{
-  register ElementInfo
-    *next;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (list_info->elements == list_info->capacity)
-    return(MagickFalse);
-  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
-  if (next == (ElementInfo *) NULL)
-    return(MagickFalse);
-  next->value=(void *) value;
-  next->next=(ElementInfo *) NULL;
-  LockSemaphoreInfo(list_info->semaphore);
-  if (list_info->next == (ElementInfo *) NULL)
-    list_info->next=next;
-  if (list_info->elements == 0)
-    list_info->head=next;
-  else
-    list_info->tail->next=next;
-  list_info->tail=next;
-  list_info->elements++;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(MagickTrue);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   C l e a r L i n k e d L i s t                                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  ClearLinkedList() clears all the elements from the linked-list.
-%
-%  The format of the ClearLinkedList method is:
-%
-%      void ClearLinkedList(LinkedListInfo *list_info,
-%        void *(*relinquish_value)(void *))
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-%    o relinquish_value: the value deallocation method; typically
-%      RelinquishMagickMemory().
-%
-*/
-MagickExport void ClearLinkedList(LinkedListInfo *list_info,
-  void *(*relinquish_value)(void *))
-{
-  ElementInfo
-    *element;
-
-  register ElementInfo
-    *next;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(list_info->semaphore);
-  next=list_info->head;
-  while (next != (ElementInfo *) NULL)
-  {
-    if (relinquish_value != (void *(*)(void *)) NULL)
-      next->value=relinquish_value(next->value);
-    element=next;
-    next=next->next;
-    element=(ElementInfo *) RelinquishMagickMemory(element);
-  }
-  list_info->head=(ElementInfo *) NULL;
-  list_info->tail=(ElementInfo *) NULL;
-  list_info->next=(ElementInfo *) NULL;
-  list_info->elements=0;
-  UnlockSemaphoreInfo(list_info->semaphore);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   C o m p a r e H a s h m a p S t r i n g                                   %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  CompareHashmapString() finds an entry in a hash-map based on the contents
-%  of a string.
-%
-%  The format of the CompareHashmapString method is:
-%
-%      MagickBooleanType CompareHashmapString(const void *target,
-%        const void *source)
-%
-%  A description of each parameter follows:
-%
-%    o target: the target string.
-%
-%    o source: the source string.
-%
-*/
-MagickExport MagickBooleanType CompareHashmapString(const void *target,
-  const void *source)
-{
-  const char
-    *p,
-    *q;
-
-  p=(const char *) target;
-  q=(const char *) source;
-  return(LocaleCompare(p,q) == 0 ? MagickTrue : MagickFalse);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   C o m p a r e H a s h m a p S t r i n g I n f o                           %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  CompareHashmapStringInfo() finds an entry in a hash-map based on the
-%  contents of a string.
-%
-%  The format of the CompareHashmapStringInfo method is:
-%
-%      MagickBooleanType CompareHashmapStringInfo(const void *target,
-%        const void *source)
-%
-%  A description of each parameter follows:
-%
-%    o target: the target string.
-%
-%    o source: the source string.
-%
-*/
-MagickExport MagickBooleanType CompareHashmapStringInfo(const void *target,
-  const void *source)
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                H   H   AAA   SSSSS  H   H  M   M   AAA   PPPP               %
+%                H   H  A   A  SS     H   H  MM MM  A   A  P   P              %
+%                HHHHH  AAAAA   SSS   HHHHH  M M M  AAAAA  PPPP               %
+%                H   H  A   A     SS  H   H  M   M  A   A  P                  %
+%                H   H  A   A  SSSSS  H   H  M   M  A   A  P                  %
+%                                                                             %
+%                                                                             %
+%                  MagickCore Hash-map and Linked-list Methods                %
+%                                                                             %
+%                              Software Design                                %
+%                                   Cristy                                    %
+%                               December 2002                                 %
+%                                                                             %
+%                                                                             %
+%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
+%  dedicated to making software imaging solutions freely available.           %
+%                                                                             %
+%  You may not use this file except in compliance with the License.  You may  %
+%  obtain a copy of the License at                                            %
+%                                                                             %
+%    http://www.imagemagick.org/script/license.php                            %
+%                                                                             %
+%  Unless required by applicable law or agreed to in writing, software        %
+%  distributed under the License is distributed on an "AS IS" BASIS,          %
+%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
+%  See the License for the specific language governing permissions and        %
+%  limitations under the License.                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  This module implements the standard handy hash and linked-list methods for
+%  storing and retrieving large numbers of data elements.  It is loosely based
+%  on the Java implementation of these algorithms.
+%
+*/
+
+/*
+  Include declarations.
+*/
+#include "MagickCore/studio.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/locale_.h"
+#include "MagickCore/hashmap.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/semaphore.h"
+#include "MagickCore/signature-private.h"
+#include "MagickCore/string_.h"
+
+/*
+  Typedef declarations.
+*/
+typedef struct _ElementInfo
+{
+  void
+    *value;
+
+  struct _ElementInfo
+    *next;
+} ElementInfo;
+
+typedef struct _EntryInfo
+{
+  size_t
+    hash;
+
+  void
+    *key,
+    *value;
+} EntryInfo;
+
+struct _LinkedListInfo
+{
+  size_t
+    capacity,
+    elements;
+
+  ElementInfo
+    *head,
+    *tail,
+    *next;
+
+  SemaphoreInfo
+    *semaphore;
+
+  size_t
+    signature;
+};
+
+struct _HashmapInfo
+{
+  size_t
+    (*hash)(const void *);
+
+  MagickBooleanType
+    (*compare)(const void *,const void *);
+
+  void
+    *(*relinquish_key)(void *),
+    *(*relinquish_value)(void *);
+
+  size_t
+    capacity,
+    entries,
+    next;
+
+  MagickBooleanType
+    head_of_list;
+
+  LinkedListInfo
+    **map;
+
+  SemaphoreInfo
+    *semaphore;
+
+  size_t
+    signature;
+};
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   A p p e n d V a l u e T o L i n k e d L i s t                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  AppendValueToLinkedList() appends a value to the end of the linked-list.
+%
+%  The format of the AppendValueToLinkedList method is:
+%
+%      MagickBooleanType AppendValueToLinkedList(LinkedListInfo *list_info,
+%        const void *value)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+%    o value: the value.
+%
+*/
+MagickExport MagickBooleanType AppendValueToLinkedList(
+  LinkedListInfo *list_info,const void *value)
+{
+  register ElementInfo
+    *next;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (list_info->elements == list_info->capacity)
+    return(MagickFalse);
+  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
+  if (next == (ElementInfo *) NULL)
+    return(MagickFalse);
+  next->value=(void *) value;
+  next->next=(ElementInfo *) NULL;
+  LockSemaphoreInfo(list_info->semaphore);
+  if (list_info->next == (ElementInfo *) NULL)
+    list_info->next=next;
+  if (list_info->elements == 0)
+    list_info->head=next;
+  else
+    list_info->tail->next=next;
+  list_info->tail=next;
+  list_info->elements++;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(MagickTrue);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   C l e a r L i n k e d L i s t                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ClearLinkedList() clears all the elements from the linked-list.
+%
+%  The format of the ClearLinkedList method is:
+%
+%      void ClearLinkedList(LinkedListInfo *list_info,
+%        void *(*relinquish_value)(void *))
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+%    o relinquish_value: the value deallocation method; typically
+%      RelinquishMagickMemory().
+%
+*/
+MagickExport void ClearLinkedList(LinkedListInfo *list_info,
+  void *(*relinquish_value)(void *))
+{
+  ElementInfo
+    *element;
+
+  register ElementInfo
+    *next;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(list_info->semaphore);
+  next=list_info->head;
+  while (next != (ElementInfo *) NULL)
+  {
+    if (relinquish_value != (void *(*)(void *)) NULL)
+      next->value=relinquish_value(next->value);
+    element=next;
+    next=next->next;
+    element=(ElementInfo *) RelinquishMagickMemory(element);
+  }
+  list_info->head=(ElementInfo *) NULL;
+  list_info->tail=(ElementInfo *) NULL;
+  list_info->next=(ElementInfo *) NULL;
+  list_info->elements=0;
+  UnlockSemaphoreInfo(list_info->semaphore);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   C o m p a r e H a s h m a p S t r i n g                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  CompareHashmapString() finds an entry in a hash-map based on the contents
+%  of a string.
+%
+%  The format of the CompareHashmapString method is:
+%
+%      MagickBooleanType CompareHashmapString(const void *target,
+%        const void *source)
+%
+%  A description of each parameter follows:
+%
+%    o target: the target string.
+%
+%    o source: the source string.
+%
+*/
+MagickExport MagickBooleanType CompareHashmapString(const void *target,
+  const void *source)
+{
+  const char
+    *p,
+    *q;
+
+  p=(const char *) target;
+  q=(const char *) source;
+  return(LocaleCompare(p,q) == 0 ? MagickTrue : MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   C o m p a r e H a s h m a p S t r i n g I n f o                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  CompareHashmapStringInfo() finds an entry in a hash-map based on the
+%  contents of a string.
+%
+%  The format of the CompareHashmapStringInfo method is:
+%
+%      MagickBooleanType CompareHashmapStringInfo(const void *target,
+%        const void *source)
+%
+%  A description of each parameter follows:
+%
+%    o target: the target string.
+%
+%    o source: the source string.
+%
+*/
+MagickExport MagickBooleanType CompareHashmapStringInfo(const void *target,
+  const void *source)
 {
   const StringInfo
     *p,
@@ -302,1627 +302,1627 @@
 
   p=(const StringInfo *) target;
   q=(const StringInfo *) source;
-  return(CompareStringInfo(p,q) == 0 ? MagickTrue : MagickFalse);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   D e s t r o y H a s h m a p                                               %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  DestroyHashmap() frees the hash-map and all associated resources.
-%
-%  The format of the DestroyHashmap method is:
-%
-%      HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info)
-{
-  LinkedListInfo
-    *list_info;
-
-  register EntryInfo
-    *entry;
-
-  register ssize_t
-    i;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  for (i=0; i < (ssize_t) hashmap_info->capacity; i++)
-  {
-    list_info=hashmap_info->map[i];
-    if (list_info != (LinkedListInfo *) NULL)
-      {
-        list_info->next=list_info->head;
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-        while (entry != (EntryInfo *) NULL)
-        {
-          if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
-            entry->key=hashmap_info->relinquish_key(entry->key);
-          if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL)
-            entry->value=hashmap_info->relinquish_value(entry->value);
-          entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-        }
-      }
-    if (list_info != (LinkedListInfo *) NULL)
-      list_info=DestroyLinkedList(list_info,RelinquishMagickMemory);
-  }
-  hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory(
-    hashmap_info->map);
-  hashmap_info->signature=(~MagickCoreSignature);
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  RelinquishSemaphoreInfo(&hashmap_info->semaphore);
-  hashmap_info=(HashmapInfo *) RelinquishMagickMemory(hashmap_info);
-  return(hashmap_info);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   D e s t r o y L i n k e d L i s t                                         %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  DestroyLinkedList() frees the linked-list and all associated resources.
-%
-%  The format of the DestroyLinkedList method is:
-%
-%      LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info,
-%        void *(*relinquish_value)(void *))
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-%    o relinquish_value: the value deallocation method;  typically
-%      RelinquishMagickMemory().
-%
-*/
-MagickExport LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info,
-  void *(*relinquish_value)(void *))
-{
-  ElementInfo
-    *entry;
-
-  register ElementInfo
-    *next;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(list_info->semaphore);
-  for (next=list_info->head; next != (ElementInfo *) NULL; )
-  {
-    if (relinquish_value != (void *(*)(void *)) NULL)
-      next->value=relinquish_value(next->value);
-    entry=next;
-    next=next->next;
-    entry=(ElementInfo *) RelinquishMagickMemory(entry);
-  }
-  list_info->signature=(~MagickCoreSignature);
-  UnlockSemaphoreInfo(list_info->semaphore);
-  RelinquishSemaphoreInfo(&list_info->semaphore);
-  list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info);
-  return(list_info);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t L a s t V a l u e I n L i n k e d L i s t                           %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetLastValueInLinkedList() gets the last value in the linked-list.
-%
-%  The format of the GetLastValueInLinkedList method is:
-%
-%      void *GetLastValueInLinkedList(LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked_list info.
-%
-*/
-MagickExport void *GetLastValueInLinkedList(LinkedListInfo *list_info)
-{
-  void
-    *value;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (list_info->elements == 0)
-    return((void *) NULL);
-  LockSemaphoreInfo(list_info->semaphore);
-  value=list_info->tail->value;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t N e x t K e y I n H a s h m a p                                     %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetNextKeyInHashmap() gets the next key in the hash-map.
-%
-%  The format of the GetNextKeyInHashmap method is:
-%
-%      void *GetNextKeyInHashmap(HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport void *GetNextKeyInHashmap(HashmapInfo *hashmap_info)
-{
-  LinkedListInfo
-    *list_info;
-
-  register EntryInfo
-    *entry;
-
-  void
-    *key;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  while (hashmap_info->next < hashmap_info->capacity)
-  {
-    list_info=hashmap_info->map[hashmap_info->next];
-    if (list_info != (LinkedListInfo *) NULL)
-      {
-        if (IfMagickFalse(hashmap_info->head_of_list))
-          {
-            list_info->next=list_info->head;
-            hashmap_info->head_of_list=MagickTrue;
-          }
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-        if (entry != (EntryInfo *) NULL)
-          {
-            key=entry->key;
-            UnlockSemaphoreInfo(hashmap_info->semaphore);
-            return(key);
-          }
-        hashmap_info->head_of_list=MagickFalse;
-      }
-    hashmap_info->next++;
-  }
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  return((void *) NULL);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t N e x t V a l u e I n H a s h m a p                                 %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetNextValueInHashmap() gets the next value in the hash-map.
-%
-%  The format of the GetNextValueInHashmap method is:
-%
-%      void *GetNextValueInHashmap(HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport void *GetNextValueInHashmap(HashmapInfo *hashmap_info)
-{
-  LinkedListInfo
-    *list_info;
-
-  register EntryInfo
-    *entry;
-
-  void
-    *value;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  while (hashmap_info->next < hashmap_info->capacity)
-  {
-    list_info=hashmap_info->map[hashmap_info->next];
-    if (list_info != (LinkedListInfo *) NULL)
-      {
-        if (IfMagickFalse(hashmap_info->head_of_list))
-          {
-            list_info->next=list_info->head;
-            hashmap_info->head_of_list=MagickTrue;
-          }
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-        if (entry != (EntryInfo *) NULL)
-          {
-            value=entry->value;
-            UnlockSemaphoreInfo(hashmap_info->semaphore);
-            return(value);
-          }
-        hashmap_info->head_of_list=MagickFalse;
-      }
-    hashmap_info->next++;
-  }
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  return((void *) NULL);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t N e x t V a l u e I n L i n k e d L i s t                           %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetNextValueInLinkedList() gets the next value in the linked-list.
-%
-%  The format of the GetNextValueInLinkedList method is:
-%
-%      void *GetNextValueInLinkedList(LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-*/
-MagickExport void *GetNextValueInLinkedList(LinkedListInfo *list_info)
-{
-  void
-    *value;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(list_info->semaphore);
-  if (list_info->next == (ElementInfo *) NULL)
-    {
-      UnlockSemaphoreInfo(list_info->semaphore);
-      return((void *) NULL);
-    }
-  value=list_info->next->value;
-  list_info->next=list_info->next->next;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t N u m b e r O f E n t r i e s I n H a s h m a p                     %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetNumberOfEntriesInHashmap() returns the number of entries in the hash-map.
-%
-%  The format of the GetNumberOfEntriesInHashmap method is:
-%
-%      size_t GetNumberOfEntriesInHashmap(const HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport size_t GetNumberOfEntriesInHashmap(
-  const HashmapInfo *hashmap_info)
-{
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  return(hashmap_info->entries);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t N u m b e r O f E l e m e n t s I n L i n k e d L i s t             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetNumberOfElementsInLinkedList() returns the number of entries in the
-%  linked-list.
-%
-%  The format of the GetNumberOfElementsInLinkedList method is:
-%
-%      size_t GetNumberOfElementsInLinkedList(
-%        const LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-*/
-MagickExport size_t GetNumberOfElementsInLinkedList(
-  const LinkedListInfo *list_info)
-{
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  return(list_info->elements);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t V a l u e F r o m H a s h m a p                                     %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetValueFromHashmap() gets an entry from the hash-map by its key.
-%
-%  The format of the GetValueFromHashmap method is:
-%
-%      void *GetValueFromHashmap(HashmapInfo *hashmap_info,const void *key)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-%    o key: the key.
-%
-*/
-MagickExport void *GetValueFromHashmap(HashmapInfo *hashmap_info,
-  const void *key)
-{
-  LinkedListInfo
-    *list_info;
-
-  register EntryInfo
-    *entry;
-
-  size_t
-    hash;
-
-  void
-    *value;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  if (key == (const void *) NULL)
-    return((void *) NULL);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  hash=hashmap_info->hash(key);
-  list_info=hashmap_info->map[hash % hashmap_info->capacity];
-  if (list_info != (LinkedListInfo *) NULL)
-    {
-      list_info->next=list_info->head;
-      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      while (entry != (EntryInfo *) NULL)
-      {
-        if (entry->hash == hash)
-          {
-            MagickBooleanType
-              compare;
-
-            compare=MagickTrue;
-            if (hashmap_info->compare !=
-                (MagickBooleanType (*)(const void *,const void *)) NULL)
-              compare=hashmap_info->compare(key,entry->key);
-            if (IfMagickTrue(compare))
-              {
-                value=entry->value;
-                UnlockSemaphoreInfo(hashmap_info->semaphore);
-                return(value);
-              }
-          }
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      }
-    }
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  return((void *) NULL);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   G e t V a l u e F r o m L i n k e d L i s t                               %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  GetValueFromLinkedList() gets a value from the linked-list at the specified
-%  location.
-%
-%  The format of the GetValueFromLinkedList method is:
-%
-%      void *GetValueFromLinkedList(LinkedListInfo *list_info,
-%        const size_t index)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked_list info.
-%
-%    o index: the list index.
-%
-*/
-MagickExport void *GetValueFromLinkedList(LinkedListInfo *list_info,
-  const size_t index)
-{
-  register ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  void
-    *value;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (index >= list_info->elements)
-    return((void *) NULL);
-  LockSemaphoreInfo(list_info->semaphore);
-  if (index == 0)
-    {
-      value=list_info->head->value;
-      UnlockSemaphoreInfo(list_info->semaphore);
-      return(value);
-    }
-  if (index == (list_info->elements-1))
-    {
-      value=list_info->tail->value;
-      UnlockSemaphoreInfo(list_info->semaphore);
-      return(value);
-    }
-  next=list_info->head;
-  for (i=0; i < (ssize_t) index; i++)
-    next=next->next;
-  value=next->value;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   H a s h P o i n t e r T y p e                                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  HashPointerType() finds an entry in a hash-map based on the address of a
-%  pointer.
-%
-%  The format of the HashPointerType method is:
-%
-%      size_t HashPointerType(const void *pointer)
-%
-%  A description of each parameter follows:
-%
-%    o pointer: compute the hash entry location from this pointer address.
-%
-*/
-MagickExport size_t HashPointerType(const void *pointer)
-{
-  size_t
-    hash;
-
-  hash=(size_t) pointer;
-  hash+=(~(hash << 9));
-  hash^=(hash >> 14);
-  hash+=(hash << 4);
-  hash^=(hash >> 10);
-  return(hash);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   H a s h S t r i n g T y p e                                               %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  HashStringType() finds an entry in a hash-map based on the contents of a
-%  string.
-%
-%  The format of the HashStringType method is:
-%
-%      size_t HashStringType(const void *string)
-%
-%  A description of each parameter follows:
-%
-%    o string: compute the hash entry location from this string.
-%
-*/
-MagickExport size_t HashStringType(const void *string)
-{
-  const unsigned char
-    *digest;
-
-  register ssize_t
-    i;
-
-  SignatureInfo
-    *signature_info;
-
-  size_t
-    hash;
-
-  StringInfo
-    *signature;
-
-  signature_info=AcquireSignatureInfo();
-  signature=StringToStringInfo((const char *) string);
-  UpdateSignature(signature_info,signature);
-  FinalizeSignature(signature_info);
-  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
-  hash=0;
-  for (i=0; i < 8; i++)
-    hash^=digest[i];
-  signature=DestroyStringInfo(signature);
-  signature_info=DestroySignatureInfo(signature_info);
-  return(hash);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   H a s h S t r i n g I n f o T y p e                                       %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  Specify the HashStringInfoType() method in NewHashmap() to find an entry
-%  in a hash-map based on the contents of a string.
-%
-%  The format of the HashStringInfoType method is:
-%
-%      size_t HashStringInfoType(const void *string_info)
-%
-%  A description of each parameter follows:
-%
-%    o string_info: compute the hash entry location from this string.
-%
-*/
-MagickExport size_t HashStringInfoType(const void *string_info)
-{
-  const unsigned char
-    *digest;
-
-  register ssize_t
-    i;
-
-  SignatureInfo
-    *signature_info;
-
-  size_t
-    hash;
-
-  signature_info=AcquireSignatureInfo();
-  UpdateSignature(signature_info,(const StringInfo *) string_info);
-  FinalizeSignature(signature_info);
-  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
-  hash=0;
-  for (i=0; i < 8; i++)
-    hash^=digest[i];
-  signature_info=DestroySignatureInfo(signature_info);
-  return(hash);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   I n s e r t V a l u e I n L i n k e d L i s t                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  InsertValueInLinkedList() inserts an element in the linked-list at the
-%  specified location.
-%
-%  The format of the InsertValueInLinkedList method is:
-%
-%      MagickBooleanType InsertValueInLinkedList(ListInfo *list_info,
-%        const size_t index,const void *value)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the hashmap info.
-%
-%    o index: the index.
-%
-%    o value: the value.
-%
-*/
-MagickExport MagickBooleanType InsertValueInLinkedList(
-  LinkedListInfo *list_info,const size_t index,const void *value)
-{
-  register ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (value == (const void *) NULL)
-    return(MagickFalse);
-  if ((index > list_info->elements) ||
-      (list_info->elements == list_info->capacity))
-    return(MagickFalse);
-  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
-  if (next == (ElementInfo *) NULL)
-    return(MagickFalse);
-  next->value=(void *) value;
-  next->next=(ElementInfo *) NULL;
-  LockSemaphoreInfo(list_info->semaphore);
-  if (list_info->elements == 0)
-    {
-      if (list_info->next == (ElementInfo *) NULL)
-        list_info->next=next;
-      list_info->head=next;
-      list_info->tail=next;
-    }
-  else
-    {
-      if (index == 0)
-        {
-          if (list_info->next == list_info->head)
-            list_info->next=next;
-          next->next=list_info->head;
-          list_info->head=next;
-        }
-      else
-        if (index == list_info->elements)
-          {
-            if (list_info->next == (ElementInfo *) NULL)
-              list_info->next=next;
-            list_info->tail->next=next;
-            list_info->tail=next;
-          }
-        else
-          {
-            ElementInfo
-              *element;
-
-            element=list_info->head;
-            next->next=element->next;
-            for (i=1; i < (ssize_t) index; i++)
-            {
-              element=element->next;
-              next->next=element->next;
-            }
-            next=next->next;
-            element->next=next;
-            if (list_info->next == next->next)
-              list_info->next=next;
-          }
-    }
-  list_info->elements++;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(MagickTrue);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   I n s e r t V a l u e I n S o r t e d L i n k e d L i s t                 %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  InsertValueInSortedLinkedList() inserts a value in the sorted linked-list.
-%
-%  The format of the InsertValueInSortedLinkedList method is:
-%
-%      MagickBooleanType InsertValueInSortedLinkedList(ListInfo *list_info,
-%        int (*compare)(const void *,const void *),void **replace,
-%        const void *value)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the hashmap info.
-%
-%    o index: the index.
-%
-%    o compare: the compare method.
-%
-%    o replace: return previous element here.
-%
-%    o value: the value.
-%
-*/
-MagickExport MagickBooleanType InsertValueInSortedLinkedList(
-  LinkedListInfo *list_info,int (*compare)(const void *,const void *),
-  void **replace,const void *value)
-{
-  ElementInfo
-    *element;
-
-  register ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if ((compare == (int (*)(const void *,const void *)) NULL) ||
-      (value == (const void *) NULL))
-    return(MagickFalse);
-  if (list_info->elements == list_info->capacity)
-    return(MagickFalse);
-  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
-  if (next == (ElementInfo *) NULL)
-    return(MagickFalse);
-  next->value=(void *) value;
-  element=(ElementInfo *) NULL;
-  LockSemaphoreInfo(list_info->semaphore);
-  next->next=list_info->head;
-  while (next->next != (ElementInfo *) NULL)
-  {
-    i=(ssize_t) compare(value,next->next->value);
-    if ((i < 0) || ((replace != (void **) NULL) && (i == 0)))
-      {
-        if (i == 0)
-          {
-            *replace=next->next->value;
-            next->next=next->next->next;
-            if (element != (ElementInfo *) NULL)
-              element->next=(ElementInfo *) RelinquishMagickMemory(
-                element->next);
-            list_info->elements--;
-          }
-        if (element != (ElementInfo *) NULL)
-          element->next=next;
-        else
-          list_info->head=next;
-        break;
-      }
-    element=next->next;
-    next->next=next->next->next;
-  }
-  if (next->next == (ElementInfo *) NULL)
-    {
-      if (element != (ElementInfo *) NULL)
-        element->next=next;
-      else
-        list_info->head=next;
-      list_info->tail=next;
-    }
-  list_info->elements++;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(MagickTrue);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   I s H a s h m a p E m p t y                                               %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  IsHashmapEmpty() returns MagickTrue if the hash-map is empty.
-%
-%  The format of the IsHashmapEmpty method is:
-%
-%      MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info)
-{
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  return(hashmap_info->entries == 0 ? MagickTrue : MagickFalse);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   I s L i n k e d L i s t E m p t y                                         %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  IsLinkedListEmpty() returns MagickTrue if the linked-list is empty.
-%
-%  The format of the IsLinkedListEmpty method is:
-%
-%      MagickBooleanType IsLinkedListEmpty(LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-*/
-MagickExport MagickBooleanType IsLinkedListEmpty(
-  const LinkedListInfo *list_info)
-{
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  return(list_info->elements == 0 ? MagickTrue : MagickFalse);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   L i n k e d L i s t T o A r r a y                                         %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  LinkedListToArray() converts the linked-list to an array.
-%
-%  The format of the LinkedListToArray method is:
-%
-%      MagickBooleanType LinkedListToArray(LinkedListInfo *list_info,
-%        void **array)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-%    o array: the array.
-%
-*/
-MagickExport MagickBooleanType LinkedListToArray(LinkedListInfo *list_info,
-  void **array)
-{
-  register ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (array == (void **) NULL)
-    return(MagickFalse);
-  LockSemaphoreInfo(list_info->semaphore);
-  next=list_info->head;
-  for (i=0; next != (ElementInfo *) NULL; i++)
-  {
-    array[i]=next->value;
-    next=next->next;
-  }
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(MagickTrue);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   N e w H a s h m a p                                                       %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  NewHashmap() returns a pointer to a HashmapInfo structure initialized
-%  to default values.  The capacity is an initial estimate.  The hashmap will
-%  increase capacity dynamically as the demand requires.
-%
-%  The format of the NewHashmap method is:
-%
-%      HashmapInfo *NewHashmap(const size_t capacity,
-%        size_t (*hash)(const void *),
-%        MagickBooleanType (*compare)(const void *,const void *),
-%        void *(*relinquish_key)(void *),void *(*relinquish_value)(void *))
-%
-%  A description of each parameter follows:
-%
-%    o capacity: the initial number entries in the hash-map: typically
-%      SmallHashmapSize, MediumHashmapSize, or LargeHashmapSize.  The
-%      hashmap will dynamically increase its capacity on demand.
-%
-%    o hash: the hash method, typically HashPointerType(), HashStringType(),
-%      or HashStringInfoType().
-%
-%    o compare: the compare method, typically NULL, CompareHashmapString(),
-%      or CompareHashmapStringInfo().
-%
-%    o relinquish_key: the key deallocation method, typically
-%      RelinquishMagickMemory(), called whenever a key is removed from the
-%      hash-map.
-%
-%    o relinquish_value: the value deallocation method;  typically
-%      RelinquishMagickMemory(), called whenever a value object is removed from
-%      the hash-map.
-%
-*/
-MagickExport HashmapInfo *NewHashmap(const size_t capacity,
-  size_t (*hash)(const void *),
-  MagickBooleanType (*compare)(const void *,const void *),
-  void *(*relinquish_key)(void *),void *(*relinquish_value)(void *))
-{
-  HashmapInfo
-    *hashmap_info;
-
-  hashmap_info=(HashmapInfo *) AcquireMagickMemory(sizeof(*hashmap_info));
-  if (hashmap_info == (HashmapInfo *) NULL)
-    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  (void) ResetMagickMemory(hashmap_info,0,sizeof(*hashmap_info));
-  hashmap_info->hash=HashPointerType;
-  if (hash != (size_t (*)(const void *)) NULL)
-    hashmap_info->hash=hash;
-  hashmap_info->compare=(MagickBooleanType (*)(const void *,const void *)) NULL;
-  if (compare != (MagickBooleanType (*)(const void *,const void *)) NULL)
-    hashmap_info->compare=compare;
-  hashmap_info->relinquish_key=relinquish_key;
-  hashmap_info->relinquish_value=relinquish_value;
-  hashmap_info->entries=0;
-  hashmap_info->capacity=capacity;
-  hashmap_info->map=(LinkedListInfo **) NULL;
-  if (~capacity >= 1UL)
-    hashmap_info->map=(LinkedListInfo **) AcquireQuantumMemory((size_t)
-      capacity+1UL,sizeof(*hashmap_info->map));
-  if (hashmap_info->map == (LinkedListInfo **) NULL)
-    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  (void) ResetMagickMemory(hashmap_info->map,0,(size_t) capacity*
-    sizeof(*hashmap_info->map));
-  hashmap_info->semaphore=AcquireSemaphoreInfo();
-  hashmap_info->signature=MagickCoreSignature;
-  return(hashmap_info);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   N e w L i n k e d L i s t I n f o                                         %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  NewLinkedList() returns a pointer to a LinkedListInfo structure
-%  initialized to default values.
-%
-%  The format of the NewLinkedList method is:
-%
-%      LinkedListInfo *NewLinkedList(const size_t capacity)
-%
-%  A description of each parameter follows:
-%
-%    o capacity: the maximum number of elements in the list.
-%
-*/
-MagickExport LinkedListInfo *NewLinkedList(const size_t capacity)
-{
-  LinkedListInfo
-    *list_info;
-
-  list_info=(LinkedListInfo *) AcquireMagickMemory(sizeof(*list_info));
-  if (list_info == (LinkedListInfo *) NULL)
-    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  (void) ResetMagickMemory(list_info,0,sizeof(*list_info));
-  list_info->capacity=capacity == 0 ? (size_t) (~0) : capacity;
-  list_info->elements=0;
-  list_info->head=(ElementInfo *) NULL;
-  list_info->tail=(ElementInfo *) NULL;
-  list_info->next=(ElementInfo *) NULL;
-  list_info->semaphore=AcquireSemaphoreInfo();
-  list_info->signature=MagickCoreSignature;
-  return(list_info);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   P u t E n t r y I n H a s h m a p                                         %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  PutEntryInHashmap() puts an entry in the hash-map.  If the key already
-%  exists in the map it is first removed.
-%
-%  The format of the PutEntryInHashmap method is:
-%
-%      MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info,
-%        const void *key,const void *value)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-%    o key: the key.
-%
-%    o value: the value.
-%
-*/
-
-static MagickBooleanType IncreaseHashmapCapacity(HashmapInfo *hashmap_info)
-{
-#define MaxCapacities  20
-
-  const size_t
-    capacities[MaxCapacities] =
-    {
-      17, 31, 61, 131, 257, 509, 1021, 2053, 4099, 8191, 16381, 32771,
-      65537, 131071, 262147, 524287, 1048573, 2097143, 4194301, 8388617
-    };
-
-  ElementInfo
-    *element;
-
-  EntryInfo
-    *entry;
-
-  LinkedListInfo
-    *map_info,
-    **map;
-
-  register ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  size_t
-    capacity;
-
-  /*
-    Increase to the next prime capacity.
-  */
-  for (i=0; i < MaxCapacities; i++)
-    if (hashmap_info->capacity < capacities[i])
-      break;
-  if (i >= (MaxCapacities-1))
-    return(MagickFalse);
-  capacity=capacities[i+1];
-  map=(LinkedListInfo **) AcquireQuantumMemory((size_t) capacity+1UL,
-    sizeof(*map));
-  if (map == (LinkedListInfo **) NULL)
-    return(MagickFalse);
-  (void) ResetMagickMemory(map,0,(size_t) capacity*sizeof(*map));
-  /*
-    Copy entries to new hashmap with increased capacity.
-  */
-  for (i=0; i < (ssize_t) hashmap_info->capacity; i++)
-  {
-    LinkedListInfo
-      *list_info;
-
-    list_info=hashmap_info->map[i];
-    if (list_info == (LinkedListInfo *) NULL)
-      continue;
-    LockSemaphoreInfo(list_info->semaphore);
-    for (next=list_info->head; next != (ElementInfo *) NULL; )
-    {
-      element=next;
-      next=next->next;
-      entry=(EntryInfo *) element->value;
-      map_info=map[entry->hash % capacity];
-      if (map_info == (LinkedListInfo *) NULL)
-        {
-          map_info=NewLinkedList(0);
-          map[entry->hash % capacity]=map_info;
-        }
-      map_info->next=element;
-      element->next=map_info->head;
-      map_info->head=element;
-      map_info->elements++;
-    }
-    list_info->signature=(~MagickCoreSignature);
-    UnlockSemaphoreInfo(list_info->semaphore);
-    RelinquishSemaphoreInfo(&list_info->semaphore);
-    list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info);
-  }
-  hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory(
-    hashmap_info->map);
-  hashmap_info->map=map;
-  hashmap_info->capacity=capacity;
-  return(MagickTrue);
-}
-
-MagickExport MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info,
-  const void *key,const void *value)
-{
-  EntryInfo
-    *entry,
-    *next;
-
-  LinkedListInfo
-    *list_info;
-
-  register size_t
-    i;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  if ((key == (void *) NULL) || (value == (void *) NULL))
-    return(MagickFalse);
-  next=(EntryInfo *) AcquireMagickMemory(sizeof(*next));
-  if (next == (EntryInfo *) NULL)
-    return(MagickFalse);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  next->hash=hashmap_info->hash(key);
-  next->key=(void *) key;
-  next->value=(void *) value;
-  list_info=hashmap_info->map[next->hash % hashmap_info->capacity];
-  if (list_info == (LinkedListInfo *) NULL)
-    {
-      list_info=NewLinkedList(0);
-      hashmap_info->map[next->hash % hashmap_info->capacity]=list_info;
-    }
-  else
-    {
-      list_info->next=list_info->head;
-      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      for (i=0; entry != (EntryInfo *) NULL; i++)
-      {
-        if (entry->hash == next->hash)
-          {
-            MagickBooleanType
-              compare;
-
-            compare=MagickTrue;
-            if (hashmap_info->compare !=
-                (MagickBooleanType (*)(const void *,const void *)) NULL)
-              compare=hashmap_info->compare(key,entry->key);
-            if( IfMagickTrue(compare) )
-              {
-                (void) RemoveElementFromLinkedList(list_info,i);
-                if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
-                  entry->key=hashmap_info->relinquish_key(entry->key);
-                if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL)
-                  entry->value=hashmap_info->relinquish_value(entry->value);
-                entry=(EntryInfo *) RelinquishMagickMemory(entry);
-                break;
-              }
-          }
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      }
-    }
-  if (IfMagickFalse(InsertValueInLinkedList(list_info,0,next)))
-    {
-      next=(EntryInfo *) RelinquishMagickMemory(next);
-      UnlockSemaphoreInfo(hashmap_info->semaphore);
-      return(MagickFalse);
-    }
-  if (list_info->elements >= (hashmap_info->capacity-1))
-    if (IfMagickFalse(IncreaseHashmapCapacity(hashmap_info)))
-      {
-        UnlockSemaphoreInfo(hashmap_info->semaphore);
-        return(MagickFalse);
-      }
-  hashmap_info->entries++;
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  return(MagickTrue);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e m o v e E l e m e n t B y V a l u e F r o m L i n k e d L i s t       %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  RemoveElementByValueFromLinkedList() removes an element from the linked-list
-%  by value.
-%
-%  The format of the RemoveElementByValueFromLinkedList method is:
-%
-%      void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info,
-%        const void *value)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the list info.
-%
-%    o value: the value.
-%
-*/
-MagickExport void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info,
-  const void *value)
-{
-  ElementInfo
-    *next;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if ((list_info->elements == 0) || (value == (const void *) NULL))
-    return((void *) NULL);
-  LockSemaphoreInfo(list_info->semaphore);
-  if (value == list_info->head->value)
-    {
-      if (list_info->next == list_info->head)
-        list_info->next=list_info->head->next;
-      next=list_info->head;
-      list_info->head=list_info->head->next;
-      next=(ElementInfo *) RelinquishMagickMemory(next);
-    }
-  else
-    {
-      ElementInfo
-        *element;
-
-      next=list_info->head;
-      while ((next->next != (ElementInfo *) NULL) &&
-             (next->next->value != value))
-        next=next->next;
-      if (next->next == (ElementInfo *) NULL)
-        {
-          UnlockSemaphoreInfo(list_info->semaphore);
-          return((void *) NULL);
-        }
-      element=next->next;
-      next->next=element->next;
-      if (element == list_info->tail)
-        list_info->tail=next;
-      if (list_info->next == element)
-        list_info->next=element->next;
-      element=(ElementInfo *) RelinquishMagickMemory(element);
-    }
-  list_info->elements--;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return((void *) value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e m o v e E l e m e n t F r o m L i n k e d L i s t                     %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  RemoveElementFromLinkedList() removes an element from the linked-list at the
-%  specified location.
-%
-%  The format of the RemoveElementFromLinkedList method is:
-%
-%      void *RemoveElementFromLinkedList(LinkedListInfo *list_info,
-%        const size_t index)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-%    o index: the index.
-%
-*/
-MagickExport void *RemoveElementFromLinkedList(LinkedListInfo *list_info,
-  const size_t index)
-{
-  ElementInfo
-    *next;
-
-  register ssize_t
-    i;
-
-  void
-    *value;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (index >= list_info->elements)
-    return((void *) NULL);
-  LockSemaphoreInfo(list_info->semaphore);
-  if (index == 0)
-    {
-      if (list_info->next == list_info->head)
-        list_info->next=list_info->head->next;
-      value=list_info->head->value;
-      next=list_info->head;
-      list_info->head=list_info->head->next;
-      next=(ElementInfo *) RelinquishMagickMemory(next);
-    }
-  else
-    {
-      ElementInfo
-        *element;
-
-      next=list_info->head;
-      for (i=1; i < (ssize_t) index; i++)
-        next=next->next;
-      element=next->next;
-      next->next=element->next;
-      if (element == list_info->tail)
-        list_info->tail=next;
-      if (list_info->next == element)
-        list_info->next=element->next;
-      value=element->value;
-      element=(ElementInfo *) RelinquishMagickMemory(element);
-    }
-  list_info->elements--;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e m o v e E n t r y F r o m H a s h m a p                               %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  RemoveEntryFromHashmap() removes an entry from the hash-map by its key.
-%
-%  The format of the RemoveEntryFromHashmap method is:
-%
-%      void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info,void *key)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-%    o key: the key.
-%
-*/
-MagickExport void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info,
-  const void *key)
-{
-  EntryInfo
-    *entry;
-
-  LinkedListInfo
-    *list_info;
-
-  register size_t
-    i;
-
-  size_t
-    hash;
-
-  void
-    *value;
-
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  if (key == (const void *) NULL)
-    return((void *) NULL);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  hash=hashmap_info->hash(key);
-  list_info=hashmap_info->map[hash % hashmap_info->capacity];
-  if (list_info != (LinkedListInfo *) NULL)
-    {
-      list_info->next=list_info->head;
-      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      for (i=0; entry != (EntryInfo *) NULL; i++)
-      {
-        if (entry->hash == hash)
-          {
-            MagickBooleanType
-              compare;
-
-            compare=MagickTrue;
-            if (hashmap_info->compare !=
-                (MagickBooleanType (*)(const void *,const void *)) NULL)
-              compare=hashmap_info->compare(key,entry->key);
-            if( IfMagickTrue(compare) )
-              {
-                entry=(EntryInfo *) RemoveElementFromLinkedList(list_info,i);
-                if (entry == (EntryInfo *) NULL)
-                  {
-                    UnlockSemaphoreInfo(hashmap_info->semaphore);
-                    return((void *) NULL);
-                  }
-                if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
-                  entry->key=hashmap_info->relinquish_key(entry->key);
-                value=entry->value;
-                entry=(EntryInfo *) RelinquishMagickMemory(entry);
-                hashmap_info->entries--;
-                UnlockSemaphoreInfo(hashmap_info->semaphore);
-                return(value);
-              }
-          }
-        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
-      }
-    }
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-  return((void *) NULL);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e m o v e L a s t E l e m e n t F r o m L i n k e d L i s t             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  RemoveLastElementFromLinkedList() removes the last element from the
-%  linked-list.
-%
-%  The format of the RemoveLastElementFromLinkedList method is:
-%
-%      void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-*/
-MagickExport void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info)
-{
-  void
-    *value;
-
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  if (list_info->elements == 0)
-    return((void *) NULL);
-  LockSemaphoreInfo(list_info->semaphore);
-  if (list_info->next == list_info->tail)
-    list_info->next=(ElementInfo *) NULL;
-  if (list_info->elements == 1UL)
-    {
-      value=list_info->head->value;
-      list_info->head=(ElementInfo *) NULL;
-      list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail);
-    }
-  else
-    {
-      ElementInfo
-        *next;
-
-      value=list_info->tail->value;
-      next=list_info->head;
-      while (next->next != list_info->tail)
-        next=next->next;
-      list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail);
-      list_info->tail=next;
-      next->next=(ElementInfo *) NULL;
-    }
-  list_info->elements--;
-  UnlockSemaphoreInfo(list_info->semaphore);
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e s e t H a s h m a p I t e r a t o r                                   %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  ResetHashmapIterator() resets the hash-map iterator.  Use it in conjunction
-%  with GetNextKeyInHashmap() to iterate over all the keys in the hash-map.
-%
-%  The format of the ResetHashmapIterator method is:
-%
-%      ResetHashmapIterator(HashmapInfo *hashmap_info)
-%
-%  A description of each parameter follows:
-%
-%    o hashmap_info: the hashmap info.
-%
-*/
-MagickExport void ResetHashmapIterator(HashmapInfo *hashmap_info)
-{
-  assert(hashmap_info != (HashmapInfo *) NULL);
-  assert(hashmap_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(hashmap_info->semaphore);
-  hashmap_info->next=0;
-  hashmap_info->head_of_list=MagickFalse;
-  UnlockSemaphoreInfo(hashmap_info->semaphore);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%   R e s e t L i n k e d L i s t I t e r a t o r                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  ResetLinkedListIterator() resets the lined-list iterator.  Use it in
-%  conjunction with GetNextValueInLinkedList() to iterate over all the values
-%  in the linked-list.
-%
-%  The format of the ResetLinkedListIterator method is:
-%
-%      ResetLinkedListIterator(LinkedListInfo *list_info)
-%
-%  A description of each parameter follows:
-%
-%    o list_info: the linked-list info.
-%
-*/
-MagickExport void ResetLinkedListIterator(LinkedListInfo *list_info)
-{
-  assert(list_info != (LinkedListInfo *) NULL);
-  assert(list_info->signature == MagickCoreSignature);
-  LockSemaphoreInfo(list_info->semaphore);
-  list_info->next=list_info->head;
-  UnlockSemaphoreInfo(list_info->semaphore);
-}
+  return(CompareStringInfo(p,q) == 0 ? MagickTrue : MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   D e s t r o y H a s h m a p                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  DestroyHashmap() frees the hash-map and all associated resources.
+%
+%  The format of the DestroyHashmap method is:
+%
+%      HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport HashmapInfo *DestroyHashmap(HashmapInfo *hashmap_info)
+{
+  LinkedListInfo
+    *list_info;
+
+  register EntryInfo
+    *entry;
+
+  register ssize_t
+    i;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  for (i=0; i < (ssize_t) hashmap_info->capacity; i++)
+  {
+    list_info=hashmap_info->map[i];
+    if (list_info != (LinkedListInfo *) NULL)
+      {
+        list_info->next=list_info->head;
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+        while (entry != (EntryInfo *) NULL)
+        {
+          if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
+            entry->key=hashmap_info->relinquish_key(entry->key);
+          if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL)
+            entry->value=hashmap_info->relinquish_value(entry->value);
+          entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+        }
+      }
+    if (list_info != (LinkedListInfo *) NULL)
+      list_info=DestroyLinkedList(list_info,RelinquishMagickMemory);
+  }
+  hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory(
+    hashmap_info->map);
+  hashmap_info->signature=(~MagickCoreSignature);
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  RelinquishSemaphoreInfo(&hashmap_info->semaphore);
+  hashmap_info=(HashmapInfo *) RelinquishMagickMemory(hashmap_info);
+  return(hashmap_info);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   D e s t r o y L i n k e d L i s t                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  DestroyLinkedList() frees the linked-list and all associated resources.
+%
+%  The format of the DestroyLinkedList method is:
+%
+%      LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info,
+%        void *(*relinquish_value)(void *))
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+%    o relinquish_value: the value deallocation method;  typically
+%      RelinquishMagickMemory().
+%
+*/
+MagickExport LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info,
+  void *(*relinquish_value)(void *))
+{
+  ElementInfo
+    *entry;
+
+  register ElementInfo
+    *next;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(list_info->semaphore);
+  for (next=list_info->head; next != (ElementInfo *) NULL; )
+  {
+    if (relinquish_value != (void *(*)(void *)) NULL)
+      next->value=relinquish_value(next->value);
+    entry=next;
+    next=next->next;
+    entry=(ElementInfo *) RelinquishMagickMemory(entry);
+  }
+  list_info->signature=(~MagickCoreSignature);
+  UnlockSemaphoreInfo(list_info->semaphore);
+  RelinquishSemaphoreInfo(&list_info->semaphore);
+  list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info);
+  return(list_info);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t L a s t V a l u e I n L i n k e d L i s t                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetLastValueInLinkedList() gets the last value in the linked-list.
+%
+%  The format of the GetLastValueInLinkedList method is:
+%
+%      void *GetLastValueInLinkedList(LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked_list info.
+%
+*/
+MagickExport void *GetLastValueInLinkedList(LinkedListInfo *list_info)
+{
+  void
+    *value;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (list_info->elements == 0)
+    return((void *) NULL);
+  LockSemaphoreInfo(list_info->semaphore);
+  value=list_info->tail->value;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t N e x t K e y I n H a s h m a p                                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetNextKeyInHashmap() gets the next key in the hash-map.
+%
+%  The format of the GetNextKeyInHashmap method is:
+%
+%      void *GetNextKeyInHashmap(HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport void *GetNextKeyInHashmap(HashmapInfo *hashmap_info)
+{
+  LinkedListInfo
+    *list_info;
+
+  register EntryInfo
+    *entry;
+
+  void
+    *key;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  while (hashmap_info->next < hashmap_info->capacity)
+  {
+    list_info=hashmap_info->map[hashmap_info->next];
+    if (list_info != (LinkedListInfo *) NULL)
+      {
+        if (IfMagickFalse(hashmap_info->head_of_list))
+          {
+            list_info->next=list_info->head;
+            hashmap_info->head_of_list=MagickTrue;
+          }
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+        if (entry != (EntryInfo *) NULL)
+          {
+            key=entry->key;
+            UnlockSemaphoreInfo(hashmap_info->semaphore);
+            return(key);
+          }
+        hashmap_info->head_of_list=MagickFalse;
+      }
+    hashmap_info->next++;
+  }
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  return((void *) NULL);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t N e x t V a l u e I n H a s h m a p                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetNextValueInHashmap() gets the next value in the hash-map.
+%
+%  The format of the GetNextValueInHashmap method is:
+%
+%      void *GetNextValueInHashmap(HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport void *GetNextValueInHashmap(HashmapInfo *hashmap_info)
+{
+  LinkedListInfo
+    *list_info;
+
+  register EntryInfo
+    *entry;
+
+  void
+    *value;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  while (hashmap_info->next < hashmap_info->capacity)
+  {
+    list_info=hashmap_info->map[hashmap_info->next];
+    if (list_info != (LinkedListInfo *) NULL)
+      {
+        if (IfMagickFalse(hashmap_info->head_of_list))
+          {
+            list_info->next=list_info->head;
+            hashmap_info->head_of_list=MagickTrue;
+          }
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+        if (entry != (EntryInfo *) NULL)
+          {
+            value=entry->value;
+            UnlockSemaphoreInfo(hashmap_info->semaphore);
+            return(value);
+          }
+        hashmap_info->head_of_list=MagickFalse;
+      }
+    hashmap_info->next++;
+  }
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  return((void *) NULL);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t N e x t V a l u e I n L i n k e d L i s t                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetNextValueInLinkedList() gets the next value in the linked-list.
+%
+%  The format of the GetNextValueInLinkedList method is:
+%
+%      void *GetNextValueInLinkedList(LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+*/
+MagickExport void *GetNextValueInLinkedList(LinkedListInfo *list_info)
+{
+  void
+    *value;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(list_info->semaphore);
+  if (list_info->next == (ElementInfo *) NULL)
+    {
+      UnlockSemaphoreInfo(list_info->semaphore);
+      return((void *) NULL);
+    }
+  value=list_info->next->value;
+  list_info->next=list_info->next->next;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t N u m b e r O f E n t r i e s I n H a s h m a p                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetNumberOfEntriesInHashmap() returns the number of entries in the hash-map.
+%
+%  The format of the GetNumberOfEntriesInHashmap method is:
+%
+%      size_t GetNumberOfEntriesInHashmap(const HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport size_t GetNumberOfEntriesInHashmap(
+  const HashmapInfo *hashmap_info)
+{
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  return(hashmap_info->entries);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t N u m b e r O f E l e m e n t s I n L i n k e d L i s t             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetNumberOfElementsInLinkedList() returns the number of entries in the
+%  linked-list.
+%
+%  The format of the GetNumberOfElementsInLinkedList method is:
+%
+%      size_t GetNumberOfElementsInLinkedList(
+%        const LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+*/
+MagickExport size_t GetNumberOfElementsInLinkedList(
+  const LinkedListInfo *list_info)
+{
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  return(list_info->elements);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t V a l u e F r o m H a s h m a p                                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetValueFromHashmap() gets an entry from the hash-map by its key.
+%
+%  The format of the GetValueFromHashmap method is:
+%
+%      void *GetValueFromHashmap(HashmapInfo *hashmap_info,const void *key)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+%    o key: the key.
+%
+*/
+MagickExport void *GetValueFromHashmap(HashmapInfo *hashmap_info,
+  const void *key)
+{
+  LinkedListInfo
+    *list_info;
+
+  register EntryInfo
+    *entry;
+
+  size_t
+    hash;
+
+  void
+    *value;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  if (key == (const void *) NULL)
+    return((void *) NULL);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  hash=hashmap_info->hash(key);
+  list_info=hashmap_info->map[hash % hashmap_info->capacity];
+  if (list_info != (LinkedListInfo *) NULL)
+    {
+      list_info->next=list_info->head;
+      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      while (entry != (EntryInfo *) NULL)
+      {
+        if (entry->hash == hash)
+          {
+            MagickBooleanType
+              compare;
+
+            compare=MagickTrue;
+            if (hashmap_info->compare !=
+                (MagickBooleanType (*)(const void *,const void *)) NULL)
+              compare=hashmap_info->compare(key,entry->key);
+            if (compare != MagickFalse)
+              {
+                value=entry->value;
+                UnlockSemaphoreInfo(hashmap_info->semaphore);
+                return(value);
+              }
+          }
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      }
+    }
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  return((void *) NULL);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   G e t V a l u e F r o m L i n k e d L i s t                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetValueFromLinkedList() gets a value from the linked-list at the specified
+%  location.
+%
+%  The format of the GetValueFromLinkedList method is:
+%
+%      void *GetValueFromLinkedList(LinkedListInfo *list_info,
+%        const size_t index)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked_list info.
+%
+%    o index: the list index.
+%
+*/
+MagickExport void *GetValueFromLinkedList(LinkedListInfo *list_info,
+  const size_t index)
+{
+  register ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  void
+    *value;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (index >= list_info->elements)
+    return((void *) NULL);
+  LockSemaphoreInfo(list_info->semaphore);
+  if (index == 0)
+    {
+      value=list_info->head->value;
+      UnlockSemaphoreInfo(list_info->semaphore);
+      return(value);
+    }
+  if (index == (list_info->elements-1))
+    {
+      value=list_info->tail->value;
+      UnlockSemaphoreInfo(list_info->semaphore);
+      return(value);
+    }
+  next=list_info->head;
+  for (i=0; i < (ssize_t) index; i++)
+    next=next->next;
+  value=next->value;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   H a s h P o i n t e r T y p e                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  HashPointerType() finds an entry in a hash-map based on the address of a
+%  pointer.
+%
+%  The format of the HashPointerType method is:
+%
+%      size_t HashPointerType(const void *pointer)
+%
+%  A description of each parameter follows:
+%
+%    o pointer: compute the hash entry location from this pointer address.
+%
+*/
+MagickExport size_t HashPointerType(const void *pointer)
+{
+  size_t
+    hash;
+
+  hash=(size_t) pointer;
+  hash+=(~(hash << 9));
+  hash^=(hash >> 14);
+  hash+=(hash << 4);
+  hash^=(hash >> 10);
+  return(hash);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   H a s h S t r i n g T y p e                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  HashStringType() finds an entry in a hash-map based on the contents of a
+%  string.
+%
+%  The format of the HashStringType method is:
+%
+%      size_t HashStringType(const void *string)
+%
+%  A description of each parameter follows:
+%
+%    o string: compute the hash entry location from this string.
+%
+*/
+MagickExport size_t HashStringType(const void *string)
+{
+  const unsigned char
+    *digest;
+
+  register ssize_t
+    i;
+
+  SignatureInfo
+    *signature_info;
+
+  size_t
+    hash;
+
+  StringInfo
+    *signature;
+
+  signature_info=AcquireSignatureInfo();
+  signature=StringToStringInfo((const char *) string);
+  UpdateSignature(signature_info,signature);
+  FinalizeSignature(signature_info);
+  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
+  hash=0;
+  for (i=0; i < 8; i++)
+    hash^=digest[i];
+  signature=DestroyStringInfo(signature);
+  signature_info=DestroySignatureInfo(signature_info);
+  return(hash);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   H a s h S t r i n g I n f o T y p e                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  Specify the HashStringInfoType() method in NewHashmap() to find an entry
+%  in a hash-map based on the contents of a string.
+%
+%  The format of the HashStringInfoType method is:
+%
+%      size_t HashStringInfoType(const void *string_info)
+%
+%  A description of each parameter follows:
+%
+%    o string_info: compute the hash entry location from this string.
+%
+*/
+MagickExport size_t HashStringInfoType(const void *string_info)
+{
+  const unsigned char
+    *digest;
+
+  register ssize_t
+    i;
+
+  SignatureInfo
+    *signature_info;
+
+  size_t
+    hash;
+
+  signature_info=AcquireSignatureInfo();
+  UpdateSignature(signature_info,(const StringInfo *) string_info);
+  FinalizeSignature(signature_info);
+  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
+  hash=0;
+  for (i=0; i < 8; i++)
+    hash^=digest[i];
+  signature_info=DestroySignatureInfo(signature_info);
+  return(hash);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I n s e r t V a l u e I n L i n k e d L i s t                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  InsertValueInLinkedList() inserts an element in the linked-list at the
+%  specified location.
+%
+%  The format of the InsertValueInLinkedList method is:
+%
+%      MagickBooleanType InsertValueInLinkedList(ListInfo *list_info,
+%        const size_t index,const void *value)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the hashmap info.
+%
+%    o index: the index.
+%
+%    o value: the value.
+%
+*/
+MagickExport MagickBooleanType InsertValueInLinkedList(
+  LinkedListInfo *list_info,const size_t index,const void *value)
+{
+  register ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (value == (const void *) NULL)
+    return(MagickFalse);
+  if ((index > list_info->elements) ||
+      (list_info->elements == list_info->capacity))
+    return(MagickFalse);
+  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
+  if (next == (ElementInfo *) NULL)
+    return(MagickFalse);
+  next->value=(void *) value;
+  next->next=(ElementInfo *) NULL;
+  LockSemaphoreInfo(list_info->semaphore);
+  if (list_info->elements == 0)
+    {
+      if (list_info->next == (ElementInfo *) NULL)
+        list_info->next=next;
+      list_info->head=next;
+      list_info->tail=next;
+    }
+  else
+    {
+      if (index == 0)
+        {
+          if (list_info->next == list_info->head)
+            list_info->next=next;
+          next->next=list_info->head;
+          list_info->head=next;
+        }
+      else
+        if (index == list_info->elements)
+          {
+            if (list_info->next == (ElementInfo *) NULL)
+              list_info->next=next;
+            list_info->tail->next=next;
+            list_info->tail=next;
+          }
+        else
+          {
+            ElementInfo
+              *element;
+
+            element=list_info->head;
+            next->next=element->next;
+            for (i=1; i < (ssize_t) index; i++)
+            {
+              element=element->next;
+              next->next=element->next;
+            }
+            next=next->next;
+            element->next=next;
+            if (list_info->next == next->next)
+              list_info->next=next;
+          }
+    }
+  list_info->elements++;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(MagickTrue);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I n s e r t V a l u e I n S o r t e d L i n k e d L i s t                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  InsertValueInSortedLinkedList() inserts a value in the sorted linked-list.
+%
+%  The format of the InsertValueInSortedLinkedList method is:
+%
+%      MagickBooleanType InsertValueInSortedLinkedList(ListInfo *list_info,
+%        int (*compare)(const void *,const void *),void **replace,
+%        const void *value)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the hashmap info.
+%
+%    o index: the index.
+%
+%    o compare: the compare method.
+%
+%    o replace: return previous element here.
+%
+%    o value: the value.
+%
+*/
+MagickExport MagickBooleanType InsertValueInSortedLinkedList(
+  LinkedListInfo *list_info,int (*compare)(const void *,const void *),
+  void **replace,const void *value)
+{
+  ElementInfo
+    *element;
+
+  register ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if ((compare == (int (*)(const void *,const void *)) NULL) ||
+      (value == (const void *) NULL))
+    return(MagickFalse);
+  if (list_info->elements == list_info->capacity)
+    return(MagickFalse);
+  next=(ElementInfo *) AcquireMagickMemory(sizeof(*next));
+  if (next == (ElementInfo *) NULL)
+    return(MagickFalse);
+  next->value=(void *) value;
+  element=(ElementInfo *) NULL;
+  LockSemaphoreInfo(list_info->semaphore);
+  next->next=list_info->head;
+  while (next->next != (ElementInfo *) NULL)
+  {
+    i=(ssize_t) compare(value,next->next->value);
+    if ((i < 0) || ((replace != (void **) NULL) && (i == 0)))
+      {
+        if (i == 0)
+          {
+            *replace=next->next->value;
+            next->next=next->next->next;
+            if (element != (ElementInfo *) NULL)
+              element->next=(ElementInfo *) RelinquishMagickMemory(
+                element->next);
+            list_info->elements--;
+          }
+        if (element != (ElementInfo *) NULL)
+          element->next=next;
+        else
+          list_info->head=next;
+        break;
+      }
+    element=next->next;
+    next->next=next->next->next;
+  }
+  if (next->next == (ElementInfo *) NULL)
+    {
+      if (element != (ElementInfo *) NULL)
+        element->next=next;
+      else
+        list_info->head=next;
+      list_info->tail=next;
+    }
+  list_info->elements++;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(MagickTrue);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I s H a s h m a p E m p t y                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  IsHashmapEmpty() returns MagickTrue if the hash-map is empty.
+%
+%  The format of the IsHashmapEmpty method is:
+%
+%      MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport MagickBooleanType IsHashmapEmpty(const HashmapInfo *hashmap_info)
+{
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  return(hashmap_info->entries == 0 ? MagickTrue : MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I s L i n k e d L i s t E m p t y                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  IsLinkedListEmpty() returns MagickTrue if the linked-list is empty.
+%
+%  The format of the IsLinkedListEmpty method is:
+%
+%      MagickBooleanType IsLinkedListEmpty(LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+*/
+MagickExport MagickBooleanType IsLinkedListEmpty(
+  const LinkedListInfo *list_info)
+{
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  return(list_info->elements == 0 ? MagickTrue : MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   L i n k e d L i s t T o A r r a y                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  LinkedListToArray() converts the linked-list to an array.
+%
+%  The format of the LinkedListToArray method is:
+%
+%      MagickBooleanType LinkedListToArray(LinkedListInfo *list_info,
+%        void **array)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+%    o array: the array.
+%
+*/
+MagickExport MagickBooleanType LinkedListToArray(LinkedListInfo *list_info,
+  void **array)
+{
+  register ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (array == (void **) NULL)
+    return(MagickFalse);
+  LockSemaphoreInfo(list_info->semaphore);
+  next=list_info->head;
+  for (i=0; next != (ElementInfo *) NULL; i++)
+  {
+    array[i]=next->value;
+    next=next->next;
+  }
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(MagickTrue);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   N e w H a s h m a p                                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  NewHashmap() returns a pointer to a HashmapInfo structure initialized
+%  to default values.  The capacity is an initial estimate.  The hashmap will
+%  increase capacity dynamically as the demand requires.
+%
+%  The format of the NewHashmap method is:
+%
+%      HashmapInfo *NewHashmap(const size_t capacity,
+%        size_t (*hash)(const void *),
+%        MagickBooleanType (*compare)(const void *,const void *),
+%        void *(*relinquish_key)(void *),void *(*relinquish_value)(void *))
+%
+%  A description of each parameter follows:
+%
+%    o capacity: the initial number entries in the hash-map: typically
+%      SmallHashmapSize, MediumHashmapSize, or LargeHashmapSize.  The
+%      hashmap will dynamically increase its capacity on demand.
+%
+%    o hash: the hash method, typically HashPointerType(), HashStringType(),
+%      or HashStringInfoType().
+%
+%    o compare: the compare method, typically NULL, CompareHashmapString(),
+%      or CompareHashmapStringInfo().
+%
+%    o relinquish_key: the key deallocation method, typically
+%      RelinquishMagickMemory(), called whenever a key is removed from the
+%      hash-map.
+%
+%    o relinquish_value: the value deallocation method;  typically
+%      RelinquishMagickMemory(), called whenever a value object is removed from
+%      the hash-map.
+%
+*/
+MagickExport HashmapInfo *NewHashmap(const size_t capacity,
+  size_t (*hash)(const void *),
+  MagickBooleanType (*compare)(const void *,const void *),
+  void *(*relinquish_key)(void *),void *(*relinquish_value)(void *))
+{
+  HashmapInfo
+    *hashmap_info;
+
+  hashmap_info=(HashmapInfo *) AcquireMagickMemory(sizeof(*hashmap_info));
+  if (hashmap_info == (HashmapInfo *) NULL)
+    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+  (void) ResetMagickMemory(hashmap_info,0,sizeof(*hashmap_info));
+  hashmap_info->hash=HashPointerType;
+  if (hash != (size_t (*)(const void *)) NULL)
+    hashmap_info->hash=hash;
+  hashmap_info->compare=(MagickBooleanType (*)(const void *,const void *)) NULL;
+  if (compare != (MagickBooleanType (*)(const void *,const void *)) NULL)
+    hashmap_info->compare=compare;
+  hashmap_info->relinquish_key=relinquish_key;
+  hashmap_info->relinquish_value=relinquish_value;
+  hashmap_info->entries=0;
+  hashmap_info->capacity=capacity;
+  hashmap_info->map=(LinkedListInfo **) NULL;
+  if (~capacity >= 1UL)
+    hashmap_info->map=(LinkedListInfo **) AcquireQuantumMemory((size_t)
+      capacity+1UL,sizeof(*hashmap_info->map));
+  if (hashmap_info->map == (LinkedListInfo **) NULL)
+    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+  (void) ResetMagickMemory(hashmap_info->map,0,(size_t) capacity*
+    sizeof(*hashmap_info->map));
+  hashmap_info->semaphore=AcquireSemaphoreInfo();
+  hashmap_info->signature=MagickCoreSignature;
+  return(hashmap_info);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   N e w L i n k e d L i s t I n f o                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  NewLinkedList() returns a pointer to a LinkedListInfo structure
+%  initialized to default values.
+%
+%  The format of the NewLinkedList method is:
+%
+%      LinkedListInfo *NewLinkedList(const size_t capacity)
+%
+%  A description of each parameter follows:
+%
+%    o capacity: the maximum number of elements in the list.
+%
+*/
+MagickExport LinkedListInfo *NewLinkedList(const size_t capacity)
+{
+  LinkedListInfo
+    *list_info;
+
+  list_info=(LinkedListInfo *) AcquireMagickMemory(sizeof(*list_info));
+  if (list_info == (LinkedListInfo *) NULL)
+    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+  (void) ResetMagickMemory(list_info,0,sizeof(*list_info));
+  list_info->capacity=capacity == 0 ? (size_t) (~0) : capacity;
+  list_info->elements=0;
+  list_info->head=(ElementInfo *) NULL;
+  list_info->tail=(ElementInfo *) NULL;
+  list_info->next=(ElementInfo *) NULL;
+  list_info->semaphore=AcquireSemaphoreInfo();
+  list_info->signature=MagickCoreSignature;
+  return(list_info);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   P u t E n t r y I n H a s h m a p                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  PutEntryInHashmap() puts an entry in the hash-map.  If the key already
+%  exists in the map it is first removed.
+%
+%  The format of the PutEntryInHashmap method is:
+%
+%      MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info,
+%        const void *key,const void *value)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+%    o key: the key.
+%
+%    o value: the value.
+%
+*/
+
+static MagickBooleanType IncreaseHashmapCapacity(HashmapInfo *hashmap_info)
+{
+#define MaxCapacities  20
+
+  const size_t
+    capacities[MaxCapacities] =
+    {
+      17, 31, 61, 131, 257, 509, 1021, 2053, 4099, 8191, 16381, 32771,
+      65537, 131071, 262147, 524287, 1048573, 2097143, 4194301, 8388617
+    };
+
+  ElementInfo
+    *element;
+
+  EntryInfo
+    *entry;
+
+  LinkedListInfo
+    *map_info,
+    **map;
+
+  register ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  size_t
+    capacity;
+
+  /*
+    Increase to the next prime capacity.
+  */
+  for (i=0; i < MaxCapacities; i++)
+    if (hashmap_info->capacity < capacities[i])
+      break;
+  if (i >= (MaxCapacities-1))
+    return(MagickFalse);
+  capacity=capacities[i+1];
+  map=(LinkedListInfo **) AcquireQuantumMemory((size_t) capacity+1UL,
+    sizeof(*map));
+  if (map == (LinkedListInfo **) NULL)
+    return(MagickFalse);
+  (void) ResetMagickMemory(map,0,(size_t) capacity*sizeof(*map));
+  /*
+    Copy entries to new hashmap with increased capacity.
+  */
+  for (i=0; i < (ssize_t) hashmap_info->capacity; i++)
+  {
+    LinkedListInfo
+      *list_info;
+
+    list_info=hashmap_info->map[i];
+    if (list_info == (LinkedListInfo *) NULL)
+      continue;
+    LockSemaphoreInfo(list_info->semaphore);
+    for (next=list_info->head; next != (ElementInfo *) NULL; )
+    {
+      element=next;
+      next=next->next;
+      entry=(EntryInfo *) element->value;
+      map_info=map[entry->hash % capacity];
+      if (map_info == (LinkedListInfo *) NULL)
+        {
+          map_info=NewLinkedList(0);
+          map[entry->hash % capacity]=map_info;
+        }
+      map_info->next=element;
+      element->next=map_info->head;
+      map_info->head=element;
+      map_info->elements++;
+    }
+    list_info->signature=(~MagickCoreSignature);
+    UnlockSemaphoreInfo(list_info->semaphore);
+    RelinquishSemaphoreInfo(&list_info->semaphore);
+    list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info);
+  }
+  hashmap_info->map=(LinkedListInfo **) RelinquishMagickMemory(
+    hashmap_info->map);
+  hashmap_info->map=map;
+  hashmap_info->capacity=capacity;
+  return(MagickTrue);
+}
+
+MagickExport MagickBooleanType PutEntryInHashmap(HashmapInfo *hashmap_info,
+  const void *key,const void *value)
+{
+  EntryInfo
+    *entry,
+    *next;
+
+  LinkedListInfo
+    *list_info;
+
+  register size_t
+    i;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  if ((key == (void *) NULL) || (value == (void *) NULL))
+    return(MagickFalse);
+  next=(EntryInfo *) AcquireMagickMemory(sizeof(*next));
+  if (next == (EntryInfo *) NULL)
+    return(MagickFalse);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  next->hash=hashmap_info->hash(key);
+  next->key=(void *) key;
+  next->value=(void *) value;
+  list_info=hashmap_info->map[next->hash % hashmap_info->capacity];
+  if (list_info == (LinkedListInfo *) NULL)
+    {
+      list_info=NewLinkedList(0);
+      hashmap_info->map[next->hash % hashmap_info->capacity]=list_info;
+    }
+  else
+    {
+      list_info->next=list_info->head;
+      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      for (i=0; entry != (EntryInfo *) NULL; i++)
+      {
+        if (entry->hash == next->hash)
+          {
+            MagickBooleanType
+              compare;
+
+            compare=MagickTrue;
+            if (hashmap_info->compare !=
+                (MagickBooleanType (*)(const void *,const void *)) NULL)
+              compare=hashmap_info->compare(key,entry->key);
+            if( compare != MagickFalse )
+              {
+                (void) RemoveElementFromLinkedList(list_info,i);
+                if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
+                  entry->key=hashmap_info->relinquish_key(entry->key);
+                if (hashmap_info->relinquish_value != (void *(*)(void *)) NULL)
+                  entry->value=hashmap_info->relinquish_value(entry->value);
+                entry=(EntryInfo *) RelinquishMagickMemory(entry);
+                break;
+              }
+          }
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      }
+    }
+  if (IfMagickFalse(InsertValueInLinkedList(list_info,0,next)))
+    {
+      next=(EntryInfo *) RelinquishMagickMemory(next);
+      UnlockSemaphoreInfo(hashmap_info->semaphore);
+      return(MagickFalse);
+    }
+  if (list_info->elements >= (hashmap_info->capacity-1))
+    if (IfMagickFalse(IncreaseHashmapCapacity(hashmap_info)))
+      {
+        UnlockSemaphoreInfo(hashmap_info->semaphore);
+        return(MagickFalse);
+      }
+  hashmap_info->entries++;
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  return(MagickTrue);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e m o v e E l e m e n t B y V a l u e F r o m L i n k e d L i s t       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RemoveElementByValueFromLinkedList() removes an element from the linked-list
+%  by value.
+%
+%  The format of the RemoveElementByValueFromLinkedList method is:
+%
+%      void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info,
+%        const void *value)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the list info.
+%
+%    o value: the value.
+%
+*/
+MagickExport void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info,
+  const void *value)
+{
+  ElementInfo
+    *next;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if ((list_info->elements == 0) || (value == (const void *) NULL))
+    return((void *) NULL);
+  LockSemaphoreInfo(list_info->semaphore);
+  if (value == list_info->head->value)
+    {
+      if (list_info->next == list_info->head)
+        list_info->next=list_info->head->next;
+      next=list_info->head;
+      list_info->head=list_info->head->next;
+      next=(ElementInfo *) RelinquishMagickMemory(next);
+    }
+  else
+    {
+      ElementInfo
+        *element;
+
+      next=list_info->head;
+      while ((next->next != (ElementInfo *) NULL) &&
+             (next->next->value != value))
+        next=next->next;
+      if (next->next == (ElementInfo *) NULL)
+        {
+          UnlockSemaphoreInfo(list_info->semaphore);
+          return((void *) NULL);
+        }
+      element=next->next;
+      next->next=element->next;
+      if (element == list_info->tail)
+        list_info->tail=next;
+      if (list_info->next == element)
+        list_info->next=element->next;
+      element=(ElementInfo *) RelinquishMagickMemory(element);
+    }
+  list_info->elements--;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return((void *) value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e m o v e E l e m e n t F r o m L i n k e d L i s t                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RemoveElementFromLinkedList() removes an element from the linked-list at the
+%  specified location.
+%
+%  The format of the RemoveElementFromLinkedList method is:
+%
+%      void *RemoveElementFromLinkedList(LinkedListInfo *list_info,
+%        const size_t index)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+%    o index: the index.
+%
+*/
+MagickExport void *RemoveElementFromLinkedList(LinkedListInfo *list_info,
+  const size_t index)
+{
+  ElementInfo
+    *next;
+
+  register ssize_t
+    i;
+
+  void
+    *value;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (index >= list_info->elements)
+    return((void *) NULL);
+  LockSemaphoreInfo(list_info->semaphore);
+  if (index == 0)
+    {
+      if (list_info->next == list_info->head)
+        list_info->next=list_info->head->next;
+      value=list_info->head->value;
+      next=list_info->head;
+      list_info->head=list_info->head->next;
+      next=(ElementInfo *) RelinquishMagickMemory(next);
+    }
+  else
+    {
+      ElementInfo
+        *element;
+
+      next=list_info->head;
+      for (i=1; i < (ssize_t) index; i++)
+        next=next->next;
+      element=next->next;
+      next->next=element->next;
+      if (element == list_info->tail)
+        list_info->tail=next;
+      if (list_info->next == element)
+        list_info->next=element->next;
+      value=element->value;
+      element=(ElementInfo *) RelinquishMagickMemory(element);
+    }
+  list_info->elements--;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e m o v e E n t r y F r o m H a s h m a p                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RemoveEntryFromHashmap() removes an entry from the hash-map by its key.
+%
+%  The format of the RemoveEntryFromHashmap method is:
+%
+%      void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info,void *key)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+%    o key: the key.
+%
+*/
+MagickExport void *RemoveEntryFromHashmap(HashmapInfo *hashmap_info,
+  const void *key)
+{
+  EntryInfo
+    *entry;
+
+  LinkedListInfo
+    *list_info;
+
+  register size_t
+    i;
+
+  size_t
+    hash;
+
+  void
+    *value;
+
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  if (key == (const void *) NULL)
+    return((void *) NULL);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  hash=hashmap_info->hash(key);
+  list_info=hashmap_info->map[hash % hashmap_info->capacity];
+  if (list_info != (LinkedListInfo *) NULL)
+    {
+      list_info->next=list_info->head;
+      entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      for (i=0; entry != (EntryInfo *) NULL; i++)
+      {
+        if (entry->hash == hash)
+          {
+            MagickBooleanType
+              compare;
+
+            compare=MagickTrue;
+            if (hashmap_info->compare !=
+                (MagickBooleanType (*)(const void *,const void *)) NULL)
+              compare=hashmap_info->compare(key,entry->key);
+            if (compare != MagickFalse)
+              {
+                entry=(EntryInfo *) RemoveElementFromLinkedList(list_info,i);
+                if (entry == (EntryInfo *) NULL)
+                  {
+                    UnlockSemaphoreInfo(hashmap_info->semaphore);
+                    return((void *) NULL);
+                  }
+                if (hashmap_info->relinquish_key != (void *(*)(void *)) NULL)
+                  entry->key=hashmap_info->relinquish_key(entry->key);
+                value=entry->value;
+                entry=(EntryInfo *) RelinquishMagickMemory(entry);
+                hashmap_info->entries--;
+                UnlockSemaphoreInfo(hashmap_info->semaphore);
+                return(value);
+              }
+          }
+        entry=(EntryInfo *) GetNextValueInLinkedList(list_info);
+      }
+    }
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+  return((void *) NULL);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e m o v e L a s t E l e m e n t F r o m L i n k e d L i s t             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RemoveLastElementFromLinkedList() removes the last element from the
+%  linked-list.
+%
+%  The format of the RemoveLastElementFromLinkedList method is:
+%
+%      void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+*/
+MagickExport void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info)
+{
+  void
+    *value;
+
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  if (list_info->elements == 0)
+    return((void *) NULL);
+  LockSemaphoreInfo(list_info->semaphore);
+  if (list_info->next == list_info->tail)
+    list_info->next=(ElementInfo *) NULL;
+  if (list_info->elements == 1UL)
+    {
+      value=list_info->head->value;
+      list_info->head=(ElementInfo *) NULL;
+      list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail);
+    }
+  else
+    {
+      ElementInfo
+        *next;
+
+      value=list_info->tail->value;
+      next=list_info->head;
+      while (next->next != list_info->tail)
+        next=next->next;
+      list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail);
+      list_info->tail=next;
+      next->next=(ElementInfo *) NULL;
+    }
+  list_info->elements--;
+  UnlockSemaphoreInfo(list_info->semaphore);
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e s e t H a s h m a p I t e r a t o r                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ResetHashmapIterator() resets the hash-map iterator.  Use it in conjunction
+%  with GetNextKeyInHashmap() to iterate over all the keys in the hash-map.
+%
+%  The format of the ResetHashmapIterator method is:
+%
+%      ResetHashmapIterator(HashmapInfo *hashmap_info)
+%
+%  A description of each parameter follows:
+%
+%    o hashmap_info: the hashmap info.
+%
+*/
+MagickExport void ResetHashmapIterator(HashmapInfo *hashmap_info)
+{
+  assert(hashmap_info != (HashmapInfo *) NULL);
+  assert(hashmap_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(hashmap_info->semaphore);
+  hashmap_info->next=0;
+  hashmap_info->head_of_list=MagickFalse;
+  UnlockSemaphoreInfo(hashmap_info->semaphore);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e s e t L i n k e d L i s t I t e r a t o r                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ResetLinkedListIterator() resets the lined-list iterator.  Use it in
+%  conjunction with GetNextValueInLinkedList() to iterate over all the values
+%  in the linked-list.
+%
+%  The format of the ResetLinkedListIterator method is:
+%
+%      ResetLinkedListIterator(LinkedListInfo *list_info)
+%
+%  A description of each parameter follows:
+%
+%    o list_info: the linked-list info.
+%
+*/
+MagickExport void ResetLinkedListIterator(LinkedListInfo *list_info)
+{
+  assert(list_info != (LinkedListInfo *) NULL);
+  assert(list_info->signature == MagickCoreSignature);
+  LockSemaphoreInfo(list_info->semaphore);
+  list_info->next=list_info->head;
+  UnlockSemaphoreInfo(list_info->semaphore);
+}
diff --git a/MagickCore/identify.c b/MagickCore/identify.c
index 96858de..1e08272 100644
--- a/MagickCore/identify.c
+++ b/MagickCore/identify.c
@@ -974,7 +974,7 @@
       else
         {
           artifact=GetImageArtifact(image,"identify:unique-colors");
-          if (IfMagickTrue(IsStringTrue(artifact)))
+          if (IsStringTrue(artifact != MagickFalse))
             (void) FormatLocaleFile(file,"  Colors: %.20g\n",(double)
               GetNumberColors(image,(FILE *) NULL,exception));
         }
diff --git a/MagickCore/magick-type.h b/MagickCore/magick-type.h
index b25dbe3..f7d8990 100644
--- a/MagickCore/magick-type.h
+++ b/MagickCore/magick-type.h
@@ -160,11 +160,9 @@
 */
 #if 1
 /* Fast C typing method assumes MagickBooleanType match 0,1 values */
-#  define IfMagickTrue(v)  ((int)(v))
 #  define IfMagickFalse(v) (!(int)(v))
 #else
 /* Do not depend MagickBooleanType's values */
-#  define IfMagickTrue(v)  ((v) != MagickFalse)
 #  define IfMagickFalse(v) ((v) == MagickFalse)
 #endif
 
diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c
index e5b90f7..53923b6 100644
--- a/MagickCore/morphology.c
+++ b/MagickCore/morphology.c
@@ -3732,7 +3732,7 @@
 
       changed=MorphologyPrimitiveDirect(rslt_image,method,kernel,exception);
 
-      if ( IfMagickTrue(verbose) )
+      if (verbose != MagickFalse)
         (void) (void) FormatLocaleFile(stderr,
           "%s:%.20g.%.20g #%.20g => Changed %.20g\n",
           CommandOptionToMnemonic(MagickMorphologyOptions, method),
@@ -3880,7 +3880,7 @@
         assert( this_kernel != (KernelInfo *) NULL );
 
         /* Extra information for debugging compound operations */
-        if ( IfMagickTrue(verbose) ) {
+        if (verbose != MagickFalse) {
           if ( stage_limit > 1 )
             (void) FormatLocaleString(v_info,MagickPathExtent,"%s:%.20g.%.20g -> ",
              CommandOptionToMnemonic(MagickMorphologyOptions,method),(double)
@@ -3914,7 +3914,7 @@
           count++;
           changed = MorphologyPrimitive(curr_image, work_image, primitive,
                        this_kernel, bias, exception);
-          if ( IfMagickTrue(verbose) ) {
+          if (verbose != MagickFalse) {
             if ( kernel_loop > 1 )
               (void) FormatLocaleFile(stderr, "\n"); /* add end-of-line from previous */
             (void) (void) FormatLocaleFile(stderr,
@@ -3939,9 +3939,9 @@
 
         } /* End Loop 4: Iterate the kernel with primitive */
 
-        if ( IfMagickTrue(verbose) && kernel_changed != (size_t)changed )
+        if (verbose != MagickFalse && kernel_changed != (size_t)changed)
           (void) FormatLocaleFile(stderr, "   Total %.20g",(double) kernel_changed);
-        if ( IfMagickTrue(verbose) && stage_loop < stage_limit )
+        if (verbose != MagickFalse && stage_loop < stage_limit)
           (void) FormatLocaleFile(stderr, "\n"); /* add end-of-line before looping */
 
 #if 0
@@ -3966,7 +3966,7 @@
         case EdgeInMorphology:
         case TopHatMorphology:
         case BottomHatMorphology:
-          if ( IfMagickTrue(verbose) )
+          if (verbose != MagickFalse)
             (void) FormatLocaleFile(stderr,
               "\n%s: Difference with original image",CommandOptionToMnemonic(
               MagickMorphologyOptions, method) );
@@ -3974,7 +3974,7 @@
             MagickTrue,0,0,exception);
           break;
         case EdgeMorphology:
-          if ( IfMagickTrue(verbose) )
+          if (verbose != MagickFalse)
             (void) FormatLocaleFile(stderr,
               "\n%s: Difference of Dilate and Erode",CommandOptionToMnemonic(
               MagickMorphologyOptions, method) );
@@ -3990,7 +3990,7 @@
       if ( kernel->next == (KernelInfo *) NULL )
         rslt_image = curr_image;   /* just return the resulting image */
       else if ( rslt_compose == NoCompositeOp )
-        { if ( IfMagickTrue(verbose) ) {
+        { if (verbose != MagickFalse) {
             if ( this_kernel->next != (KernelInfo *) NULL )
               (void) FormatLocaleFile(stderr, " (re-iterate)");
             else
@@ -3999,7 +3999,7 @@
           rslt_image = curr_image; /* return result, and re-iterate */
         }
       else if ( rslt_image == (Image *) NULL)
-        { if ( IfMagickTrue(verbose) )
+        { if (verbose != MagickFalse)
             (void) FormatLocaleFile(stderr, " (save for compose)");
           rslt_image = curr_image;
           curr_image = (Image *) image;  /* continue with original image */
@@ -4012,7 +4012,7 @@
           ** purely mathematical way, and only to the selected channels.
           ** IE: Turn off SVG composition 'alpha blending'.
           */
-          if ( IfMagickTrue(verbose) )
+          if (verbose != MagickFalse)
             (void) FormatLocaleFile(stderr, " (compose \"%s\")",
               CommandOptionToMnemonic(MagickComposeOptions, rslt_compose) );
           (void) CompositeImage(rslt_image,curr_image,rslt_compose,MagickTrue,
@@ -4020,7 +4020,7 @@
           curr_image = DestroyImage(curr_image);
           curr_image = (Image *) image;  /* continue with original image */
         }
-      if ( IfMagickTrue(verbose) )
+      if (verbose != MagickFalse)
         (void) FormatLocaleFile(stderr, "\n");
 
       /* loop to the next kernel in a multi-kernel list */
diff --git a/MagickCore/property.c b/MagickCore/property.c
index 343e260..a13bf5c 100644
--- a/MagickCore/property.c
+++ b/MagickCore/property.c
@@ -139,7 +139,7 @@
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(clone_image != (const Image *) NULL);
   assert(clone_image->signature == MagickCoreSignature);
-  if( IfMagickTrue(clone_image->debug) )
+  if (clone_image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       clone_image->filename);
   (void) CopyMagickString(image->filename,clone_image->filename,MagickPathExtent);
@@ -2084,7 +2084,7 @@
 
   assert(image != (Image *) NULL);
   assert(image->signature == MagickCoreSignature);
-  if (IfMagickTrue(image->debug))
+  if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   p=(const char *) NULL;
   if (image->properties != (void *) NULL)
@@ -2275,9 +2275,9 @@
   const char
     *string;     /* return a string already stored somewher */
 
-  if (image != (Image *) NULL && IfMagickTrue(image->debug))
+  if (image != (Image *) NULL && image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  else if( image_info != (ImageInfo *) NULL && IfMagickTrue(image_info->debug))
+  else if( image_info != (ImageInfo *) NULL && image_info->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s","no-images");
 
   *value='\0';           /* formatted string */
@@ -2401,7 +2401,7 @@
 
       WarnNoImageReturn("\"%%%c\"",letter);
       colorspace=image->colorspace;
-      if (IfMagickTrue(SetImageGray(image,exception)))
+      if (SetImageGray(image,exception != MagickFalse))
         colorspace=GRAYColorspace;   /* FUTURE: this is IMv6 not IMv7 */
       (void) FormatLocaleString(value,MagickPathExtent,"%s %s %s",
         CommandOptionToMnemonic(MagickClassOptions,(ssize_t) image->storage_class),
@@ -2647,9 +2647,9 @@
   if (property[1] == '\0')  /* single letter property request */
     return(GetMagickPropertyLetter(image_info,image,*property,exception));
 
-  if (image != (Image *) NULL && IfMagickTrue(image->debug))
+  if (image != (Image *) NULL && image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  else if( image_info != (ImageInfo *) NULL && IfMagickTrue(image_info->debug))
+  else if( image_info != (ImageInfo *) NULL && image_info->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s","no-images");
 
   *value='\0';           /* formated string */
@@ -3236,9 +3236,9 @@
   assert(image == NULL || image->signature == MagickCoreSignature);
   assert(image_info == NULL || image_info->signature == MagickCoreSignature);
 
-  if (image != (Image *) NULL && IfMagickTrue(image->debug))
+  if (image != (Image *) NULL && image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  else if( image_info != (ImageInfo *) NULL && IfMagickTrue(image_info->debug))
+  else if( image_info != (ImageInfo *) NULL && image_info->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s","no-image");
 
   if (embed_text == (const char *) NULL)
diff --git a/MagickCore/resize.c b/MagickCore/resize.c
index f46cee8..ccfe0cc 100644
--- a/MagickCore/resize.c
+++ b/MagickCore/resize.c
@@ -880,7 +880,7 @@
   window_type=mapping[filter].window;
   resize_filter->blur=1.0;
   /* Promote 1D Windowed Sinc Filters to a 2D Windowed Jinc filters */
-  if ( IfMagickTrue(cylindrical) && (filter_type == SincFastFilter) &&
+  if ( cylindrical != MagickFalse && (filter_type == SincFastFilter) &&
       (filter != SincFastFilter))
     filter_type=JincFilter;  /* 1D Windowed Sinc => 2D Windowed Jinc filters */
 
@@ -918,7 +918,7 @@
           option=ParseCommandOption(MagickFilterOptions,MagickFalse,artifact);
           if ((UndefinedFilter < option) && (option < SentinelFilter))
             {
-              filter_type= IfMagickTrue(cylindrical) ? JincFilter
+              filter_type= cylindrical != MagickFalse ? JincFilter
                                                      : SincFastFilter;
               window_type=(FilterTypes) option;
             }
@@ -3677,7 +3677,7 @@
       image->magick_filename);
   (void) SetImageProperty(thumbnail_image,"Thumb::URI",value,exception);
   (void) CopyMagickString(value,image->magick_filename,MagickPathExtent);
-  if ( IfMagickTrue(GetPathAttributes(image->filename,&attributes)) )
+  if ( GetPathAttributes(image->filename,&attributes) != MagickFalse )
     {
       (void) FormatLocaleString(value,MagickPathExtent,"%.20g",(double)
         attributes.st_mtime);
