Removed IfMagickTrue
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);