43#include "magick/studio.h"
44#if defined(MAGICKCORE_WINGDI32_DELEGATE)
45# if defined(__CYGWIN__)
49# include "magick/nt-base-private.h"
53#include "magick/blob.h"
54#include "magick/blob-private.h"
55#include "magick/cache.h"
56#include "magick/cache-view.h"
57#include "magick/channel.h"
58#include "magick/client.h"
59#include "magick/color.h"
60#include "magick/color-private.h"
61#include "magick/colormap.h"
62#include "magick/colormap-private.h"
63#include "magick/colorspace.h"
64#include "magick/colorspace-private.h"
65#include "magick/composite.h"
66#include "magick/composite-private.h"
67#include "magick/constitute.h"
68#include "magick/deprecate.h"
69#include "magick/draw.h"
70#include "magick/draw-private.h"
71#include "magick/effect.h"
72#include "magick/enhance.h"
73#include "magick/exception.h"
74#include "magick/exception-private.h"
76#include "magick/geometry.h"
77#include "magick/identify.h"
78#include "magick/image.h"
79#include "magick/image-private.h"
80#include "magick/list.h"
81#include "magick/log.h"
82#include "magick/memory_.h"
83#include "magick/magick.h"
84#include "magick/monitor.h"
85#include "magick/monitor-private.h"
86#include "magick/morphology.h"
87#include "magick/mutex.h"
88#include "magick/nt-feature.h"
89#include "magick/paint.h"
90#include "magick/pixel.h"
91#include "magick/pixel-accessor.h"
92#include "magick/pixel-private.h"
93#include "magick/property.h"
94#include "magick/quantize.h"
95#include "magick/random_.h"
96#include "magick/resource_.h"
97#include "magick/semaphore.h"
98#include "magick/semaphore-private.h"
99#include "magick/segment.h"
100#include "magick/splay-tree.h"
101#include "magick/statistic.h"
102#include "magick/string_.h"
103#include "magick/threshold.h"
104#include "magick/thread_.h"
105#include "magick/thread-private.h"
106#include "magick/token.h"
107#include "magick/transform.h"
108#include "magick/utility.h"
110#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED)
115 monitor_handler = (MonitorHandler) NULL;
144MagickExport
const IndexPacket *AcquireCacheViewIndexes(
147 return(GetCacheViewVirtualIndexQueue(cache_view));
185MagickExport
const PixelPacket *AcquireCacheViewPixels(
186 const CacheView *cache_view,
const ssize_t x,
const ssize_t y,
187 const size_t columns,
const size_t rows,
ExceptionInfo *exception)
189 return(GetCacheViewVirtualPixels(cache_view,x,y,columns,rows,exception));
245 const ssize_t x,
const ssize_t y,
const size_t columns,
248 return(GetVirtualPixels(image,x,y,columns,rows,exception));
283MagickExport
const IndexPacket *AcquireIndexes(
const Image *image)
285 return(GetVirtualIndexQueue(image));
311MagickExport
void *AcquireMemory(
const size_t size)
317 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
318 allocation=malloc(size);
358MagickExport MagickBooleanType AcquireOneCacheViewPixel(
359 const CacheView *cache_view,
const ssize_t x,
const ssize_t y,
362 return(GetOneCacheViewVirtualPixel(cache_view,x,y,pixel,exception));
405MagickExport MagickBooleanType AcquireOneCacheViewVirtualPixel(
406 const CacheView *cache_view,
const VirtualPixelMethod virtual_pixel_method,
412 status=GetOneCacheViewVirtualMethodPixel(cache_view,virtual_pixel_method,
413 x,y,pixel,exception);
457 (void) GetOneVirtualMagickPixel(image,x,y,&pixel,exception);
501 (void) GetOneVirtualPixel(image,x,y,&pixel,exception);
544 const VirtualPixelMethod virtual_pixel_method,
const ssize_t x,
const ssize_t y,
550 (void) GetOneVirtualMethodPixel(image,virtual_pixel_method,x,y,&pixel,
584 return(GetVirtualPixelQueue(image));
609MagickExport
void AcquireSemaphoreInfo(
SemaphoreInfo **semaphore_info)
614 InitializeMagickMutex();
617 *semaphore_info=AllocateSemaphoreInfo();
654MagickExport MagickBooleanType AffinityImage(
const QuantizeInfo *quantize_info,
657 return(RemapImage(quantize_info,image,affinity_image));
692MagickExport MagickBooleanType AffinityImages(
const QuantizeInfo *quantize_info,
695 return(RemapImages(quantize_info,images,affinity_image));
729 return(AcquireImage(image_info));
764MagickExport MagickBooleanType AllocateImageColormap(
Image *image,
767 return(AcquireImageColormap(image,colors));
802MagickExport
void AllocateNextImage(
const ImageInfo *image_info,
Image *image)
804 AcquireNextImage(image_info,image);
830MagickExport
char *AllocateString(
const char *source)
838 assert(source != (
const char *) NULL);
839 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
840 length=strlen(source)+MaxTextExtent+1;
841 destination=(
char *) AcquireQuantumMemory(length,
sizeof(*destination));
842 if (destination == (
char *) NULL)
843 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
845 (void) CopyMagickString(destination,source,length);
883 return(EvaluateImages(images,MeanEvaluateOperator,exception));
917MagickExport
unsigned int ChannelImage(
Image *image,
const ChannelType channel)
919 return(SeparateImageChannel(image,channel));
947MagickExport
unsigned int ChannelThresholdImage(
Image *image,
const char *level)
959 assert(image != (
Image *) NULL);
960 assert(image->signature == MagickCoreSignature);
961 if (IsEventLogging() != MagickFalse)
963 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
964 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
967 if (level == (
char *) NULL)
969 flags=ParseGeometry(level,&geometry_info);
970 threshold.red=geometry_info.rho;
971 threshold.green=geometry_info.sigma;
972 if ((flags & SigmaValue) == 0)
973 threshold.green=threshold.red;
974 threshold.blue=geometry_info.xi;
975 if ((flags & XiValue) == 0)
976 threshold.blue=threshold.red;
977 status=BilevelImageChannel(image,RedChannel,threshold.red);
978 status&=BilevelImageChannel(image,GreenChannel,threshold.green);
979 status&=BilevelImageChannel(image,BlueChannel,threshold.blue);
1017MagickExport MagickBooleanType ClipPathImage(
Image *image,
const char *pathname,
1018 const MagickBooleanType inside)
1020 return(ClipImagePath(image,pathname,inside));
1052MagickExport MagickBooleanType CloneImageAttributes(
Image *image,
1053 const Image *clone_image)
1055 return(CloneImageProperties(image,clone_image));
1087MagickExport
void *CloneMemory(
void *destination,
const void *source,
1099 assert(destination != (
void *) NULL);
1100 assert(source != (
const void *) NULL);
1101 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
1102 p=(
const unsigned char *) source;
1103 q=(
unsigned char *) destination;
1104 if ((p <= q) || ((p+size) >= q))
1105 return(memcpy(destination,source,size));
1109 p+=(ptrdiff_t) size;
1110 q+=(ptrdiff_t) size;
1111 for (i=(ssize_t) (size-1); i >= 0; i--)
1113 return(destination);
1145 return(DestroyCacheView(view_info));
1191#define MaxStacksize (1UL << 15)
1192#define PushSegmentStack(up,left,right,delta) \
1194 if (s >= (segment_stack+MaxStacksize)) \
1195 ThrowBinaryImageException(DrawError,"SegmentStackOverflow",image->filename) \
1198 if ((((up)+(delta)) >= 0) && (((up)+(delta)) < (ssize_t) image->rows)) \
1200 s->x1=(double) (left); \
1201 s->y1=(double) (up); \
1202 s->x2=(double) (right); \
1203 s->y2=(double) (delta); \
1209MagickExport MagickBooleanType ColorFloodfillImage(
Image *image,
1211 const ssize_t y_offset,
const PaintMethod method)
1239 assert(image != (
Image *) NULL);
1240 assert(image->signature == MagickCoreSignature);
1241 assert(draw_info != (
DrawInfo *) NULL);
1242 assert(draw_info->signature == MagickCoreSignature);
1243 if (IsEventLogging() != MagickFalse)
1244 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1245 if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
1246 return(MagickFalse);
1247 if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
1248 return(MagickFalse);
1249 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
1250 return(MagickFalse);
1251 if (image->matte == MagickFalse)
1252 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
1253 floodplane_image=CloneImage(image,0,0,MagickTrue,&image->exception);
1254 if (floodplane_image == (
Image *) NULL)
1255 return(MagickFalse);
1256 (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
1260 segment_stack=(
SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
1261 sizeof(*segment_stack));
1264 floodplane_image=DestroyImage(floodplane_image);
1265 ThrowBinaryImageException(ResourceLimitError,
"MemoryAllocationFailed",
1275 PushSegmentStack(y,x,x,1);
1276 PushSegmentStack(y+1,x,x,-1);
1277 while (s > segment_stack)
1294 offset=(ssize_t) s->y2;
1295 y=(ssize_t) s->y1+offset;
1299 p=GetVirtualPixels(image,0,y,(
size_t) (x1+1),1,&image->exception);
1300 q=GetAuthenticPixels(floodplane_image,0,y,(
size_t) (x1+1),1,
1306 for (x=x1; x >= 0; x--)
1308 if (q->opacity == (Quantum) TransparentOpacity)
1310 if (method == FloodfillMethod)
1312 if (IsColorSimilar(image,p,&target) == MagickFalse)
1316 if (IsColorSimilar(image,p,&target) != MagickFalse)
1318 q->opacity=(Quantum) TransparentOpacity;
1322 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
1324 skip=x >= x1 ? MagickTrue : MagickFalse;
1325 if (skip == MagickFalse)
1329 PushSegmentStack(y,start,x1-1,-offset);
1334 if (skip == MagickFalse)
1336 if (x < (ssize_t) image->columns)
1338 p=GetVirtualPixels(image,x,y,image->columns-x,1,
1340 q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
1345 for ( ; x < (ssize_t) image->columns; x++)
1347 if (q->opacity == (Quantum) TransparentOpacity)
1349 if (method == FloodfillMethod)
1351 if (IsColorSimilar(image,p,&target) == MagickFalse)
1355 if (IsColorSimilar(image,p,&target) != MagickFalse)
1357 q->opacity=(Quantum) TransparentOpacity;
1361 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
1364 PushSegmentStack(y,start,x-1,offset);
1366 PushSegmentStack(y,x2+1,x-1,-offset);
1372 p=GetVirtualPixels(image,x,y,(
size_t) (x2-x+1),1,
1374 q=GetAuthenticPixels(floodplane_image,x,y,(
size_t) (x2-x+1),1,
1378 for ( ; x <= x2; x++)
1380 if (q->opacity == (Quantum) TransparentOpacity)
1382 if (method == FloodfillMethod)
1384 if (IsColorSimilar(image,p,&target) != MagickFalse)
1388 if (IsColorSimilar(image,p,&target) == MagickFalse)
1397 for (y=0; y < (ssize_t) image->rows; y++)
1411 p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
1413 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
1416 for (x=0; x < (ssize_t) image->columns; x++)
1418 if (GetPixelOpacity(p) != OpaqueOpacity)
1420 (void) GetFillColor(draw_info,x,y,&fill_color);
1421 MagickCompositeOver(&fill_color,(MagickRealType) fill_color.opacity,q,
1422 (MagickRealType) q->opacity,q);
1427 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
1430 segment_stack=(
SegmentInfo *) RelinquishMagickMemory(segment_stack);
1431 floodplane_image=DestroyImage(floodplane_image);
1432 return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
1453MagickExport MagickBooleanType ConstituteComponentGenesis(
void)
1476MagickExport
void ConstituteComponentTerminus(
void)
1480#if defined(MAGICKCORE_WINGDI32_DELEGATE)
1512MagickExport
void *CropImageToHBITMAP(
Image *image,
1515#define CropImageTag "Crop/Image"
1547 assert(image != (
const Image *) NULL);
1548 assert(image->signature == MagickCoreSignature);
1551 assert(exception->signature == MagickCoreSignature);
1552 if (IsEventLogging() != MagickFalse)
1553 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1554 if (((geometry->x+(ssize_t) geometry->width) < 0) ||
1555 ((geometry->y+(ssize_t) geometry->height) < 0) ||
1556 (geometry->x >= (ssize_t) image->columns) ||
1557 (geometry->y >= (ssize_t) image->rows))
1558 ThrowImageException(OptionError,
"GeometryDoesNotContainImage");
1560 if ((page.x+(ssize_t) page.width) > (ssize_t) image->columns)
1561 page.width=image->columns-page.x;
1562 if ((page.y+(ssize_t) page.height) > (ssize_t) image->rows)
1563 page.height=image->rows-page.y;
1571 page.height+=page.y;
1575 if ((page.width == 0) || (page.height == 0))
1576 ThrowImageException(OptionError,
"GeometryDimensionsAreZero");
1581 bitmap.bmWidth = (LONG) page.width;
1582 bitmap.bmHeight = (LONG) page.height;
1583 bitmap.bmWidthBytes = bitmap.bmWidth * 4;
1584 bitmap.bmPlanes = 1;
1585 bitmap.bmBitsPixel = 32;
1586 bitmap.bmBits = NULL;
1588 bitmap_bitsH=(HANDLE) GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,page.width*
1589 page.height*bitmap.bmBitsPixel);
1590 if (bitmap_bitsH == NULL)
1592 bitmap_bits=(RGBQUAD *) GlobalLock((HGLOBAL) bitmap_bitsH);
1593 if ( bitmap.bmBits == NULL )
1594 bitmap.bmBits = bitmap_bits;
1595 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1596 SetImageColorspace(image,sRGBColorspace);
1601 for (y=0; y < (ssize_t) page.height; y++)
1606 p=GetVirtualPixels(image,page.x,page.y+y,page.width,1,exception);
1611 for( x=(ssize_t) page.width ; x> 0 ; x-- )
1613 q->rgbRed = ScaleQuantumToChar(GetPixelRed(p));
1614 q->rgbGreen = ScaleQuantumToChar(GetPixelGreen(p));
1615 q->rgbBlue = ScaleQuantumToChar(GetPixelBlue(p));
1620 proceed=SetImageProgress(image,CropImageTag,y,page.height);
1621 if (proceed == MagickFalse)
1624 if (y < (ssize_t) page.height)
1626 GlobalUnlock((HGLOBAL) bitmap_bitsH);
1627 GlobalFree((HGLOBAL) bitmap_bitsH);
1628 return((
void *) NULL);
1630 bitmap.bmBits=bitmap_bits;
1631 bitmapH=CreateBitmapIndirect(&bitmap);
1632 GlobalUnlock((HGLOBAL) bitmap_bitsH);
1633 GlobalFree((HGLOBAL) bitmap_bitsH);
1634 return((
void *) bitmapH);
1666MagickExport MagickBooleanType DeleteImageAttribute(
Image *image,
1669 return(DeleteImageProperty(image,key));
1696MagickExport
unsigned int DeleteImageList(
Image *images,
const ssize_t offset)
1701 if (images->debug != MagickFalse)
1702 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
1703 while (GetPreviousImageInList(images) != (
Image *) NULL)
1704 images=GetPreviousImageInList(images);
1705 for (i=0; i < offset; i++)
1707 if (GetNextImageInList(images) == (
Image *) NULL)
1708 return(MagickFalse);
1709 images=GetNextImageInList(images);
1711 DeleteImageFromList(&images);
1745MagickExport MagickBooleanType DeleteMagickRegistry(
const ssize_t
id)
1750 (void) FormatLocaleString(key,MaxTextExtent,
"%.20g\n",(
double)
id);
1751 return(DeleteImageRegistry(key));
1772MagickExport
void DestroyConstitute(
void)
1798MagickExport
void DestroyMagickRegistry(
void)
1800 RegistryComponentTerminus();
1836MagickExport MagickBooleanType DescribeImage(
Image *image,FILE *file,
1837 const MagickBooleanType verbose)
1839 return(IdentifyImage(image,file,verbose));
1865MagickExport
void DestroyImageAttributes(
Image *image)
1867 assert(image != (
Image *) NULL);
1868 assert(image->signature == MagickCoreSignature);
1869 if (IsEventLogging() != MagickFalse)
1870 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1871 if (image->attributes != (
void *) NULL)
1872 image->attributes=(
void *) DestroySplayTree((
SplayTreeInfo *)
1902MagickExport
void DestroyImages(
Image *image)
1904 if (image == (
Image *) NULL)
1906 if (IsEventLogging() != MagickFalse)
1907 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.4.3");
1908 image=DestroyImageList(image);
1933MagickExport
void DestroyMagick(
void)
1935 MagickCoreTerminus();
1995MagickExport
unsigned int DispatchImage(
const Image *image,
const ssize_t x_offset,
1996 const ssize_t y_offset,
const size_t columns,
const size_t rows,
1997 const char *map,
const StorageType type,
void *pixels,
ExceptionInfo *exception)
2002 if (IsEventLogging() != MagickFalse)
2003 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.6");
2004 status=ExportImagePixels(image,x_offset,y_offset,columns,rows,map,type,pixels,
2038static double GetSimilarityMetric(
const Image *image,
const Image *reference,
2039 const ssize_t x_offset,
const ssize_t y_offset,
2048 normalized_similarity,
2057 normalized_similarity=1.0;
2060 if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
2062 if ((image->colorspace == CMYKColorspace) &&
2063 (reference->colorspace == CMYKColorspace))
2065 image_view=AcquireVirtualCacheView(image,exception);
2066 reference_view=AcquireVirtualCacheView(reference,exception);
2067 for (y=0; y < (ssize_t) reference->rows; y++)
2080 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset+y,
2081 reference->columns,1,exception);
2082 q=GetCacheViewVirtualPixels(reference_view,0,y,reference->columns,1,
2086 indexes=GetCacheViewVirtualIndexQueue(image_view);
2087 reference_indexes=GetCacheViewVirtualIndexQueue(reference_view);
2088 for (x=0; x < (ssize_t) reference->columns; x++)
2093 pixel=QuantumScale*((double) GetPixelRed(p)-(double) GetPixelRed(q));
2094 similarity+=pixel*pixel;
2095 pixel=QuantumScale*((double) GetPixelGreen(p)-(double) GetPixelGreen(q));
2096 similarity+=pixel*pixel;
2097 pixel=QuantumScale*((double) GetPixelBlue(p)-(double) GetPixelBlue(q));
2098 similarity+=pixel*pixel;
2099 if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
2101 pixel=QuantumScale*((double) GetPixelOpacity(p)-(double)
2102 GetPixelOpacity(q));
2103 similarity+=pixel*pixel;
2105 if ((image->colorspace == CMYKColorspace) &&
2106 (reference->colorspace == CMYKColorspace))
2108 pixel=QuantumScale*((double) GetPixelIndex(indexes+x)-(double)
2109 GetPixelIndex(reference_indexes+x));
2110 similarity+=pixel*pixel;
2115 normalized_similarity=sqrt(similarity)/reference->columns/reference->rows/
2117 if (normalized_similarity > similarity_threshold)
2120 reference_view=DestroyCacheView(reference_view);
2121 image_view=DestroyCacheView(image_view);
2122 return(normalized_similarity);
2125MagickExport
Image *ExtractSubimageFromImage(
Image *image,
2129 similarity_threshold;
2140 if ((reference->columns > image->columns) || (reference->rows > image->rows))
2141 return((
Image *) NULL);
2142 similarity_threshold=(double) image->columns*image->rows;
2143 SetGeometry(reference,&offset);
2144#if defined(MAGICKCORE_OPENMP_SUPPORT)
2145 #pragma omp parallel for schedule(static)
2147 for (y=0; y < (ssize_t) (image->rows-reference->rows); y++)
2155 for (x=0; x < (ssize_t) (image->columns-reference->columns); x++)
2157 similarity=GetSimilarityMetric(image,reference,x,y,similarity_threshold,
2159#if defined(MAGICKCORE_OPENMP_SUPPORT)
2160 #pragma omp critical (MagickCore_ExtractSubimageFromImage)
2162 if (similarity < similarity_threshold)
2164 similarity_threshold=similarity;
2170 if (similarity_threshold > (QuantumScale*reference->fuzz/100.0))
2171 return((
Image *) NULL);
2172 return(CropImage(image,&offset,exception));
2205 return(MergeImageLayers(image,FlattenLayer,exception));
2238MagickExport MagickBooleanType FormatImageAttributeList(
Image *image,
2239 const char *key,
const char *format,va_list operands)
2242 value[MaxTextExtent];
2247#if defined(MAGICKCORE_HAVE_VSNPRINTF)
2248 n=vsnprintf(value,MaxTextExtent,format,operands);
2250 n=vsprintf(value,format,operands);
2253 value[MaxTextExtent-1]=
'\0';
2254 return(SetImageProperty(image,key,value));
2257MagickExport MagickBooleanType FormatImagePropertyList(
Image *image,
2258 const char *property,
const char *format,va_list operands)
2261 value[MaxTextExtent];
2266#if defined(MAGICKCORE_HAVE_VSNPRINTF)
2267 n=vsnprintf(value,MaxTextExtent,format,operands);
2269 n=vsprintf(value,format,operands);
2272 value[MaxTextExtent-1]=
'\0';
2273 return(SetImageProperty(image,property,value));
2276MagickExport MagickBooleanType FormatImageAttribute(
Image *image,
2277 const char *key,
const char *format,...)
2280 value[MaxTextExtent];
2288 va_start(operands,format);
2289 n=FormatLocaleStringList(value,MaxTextExtent,format,operands);
2292 return(SetImageProperty(image,key,value));
2325MagickExport ssize_t FormatMagickStringList(
char *
string,
const size_t length,
2326 const char *format,va_list operands)
2331#if defined(MAGICKCORE_HAVE_VSNPRINTF)
2332 n=vsnprintf(
string,length,format,operands);
2334 n=vsprintf(
string,format,operands);
2337 string[length-1]=
'\0';
2338 return((ssize_t) n);
2341MagickExport ssize_t FormatMagickString(
char *
string,
const size_t length,
2342 const char *format,...)
2350 va_start(operands,format);
2351 n=(ssize_t) FormatMagickStringList(
string,length,format,operands);
2383MagickExport
void FormatStringList(
char *
string,
const char *format,
2389 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
2390#if defined(MAGICKCORE_HAVE_VSNPRINTF)
2391 n=vsnprintf(
string,MaxTextExtent,format,operands);
2393 n=vsprintf(
string,format,operands);
2396 string[MaxTextExtent-1]=
'\0';
2399MagickExport
void FormatString(
char *
string,
const char *format,...)
2404 va_start(operands,format);
2405 (void) FormatLocaleStringList(
string,MaxTextExtent,format,operands);
2438MagickExport
unsigned int FuzzyColorMatch(
const PixelPacket *p,
2447 if ((fuzz == 0.0) && (GetPixelRed(p) == GetPixelRed(q)) &&
2448 (GetPixelGreen(p) == GetPixelGreen(q)) &&
2449 (GetPixelBlue(p) == GetPixelBlue(q)))
2451 pixel.red=(MagickRealType) GetPixelRed(p)-(MagickRealType) GetPixelRed(q);
2452 distance=pixel.red*pixel.red;
2453 if (distance > (fuzz*fuzz))
2454 return(MagickFalse);
2455 pixel.green=(MagickRealType) GetPixelGreen(p)-(MagickRealType)
2457 distance+=pixel.green*pixel.green;
2458 if (distance > (fuzz*fuzz))
2459 return(MagickFalse);
2460 pixel.blue=(MagickRealType) GetPixelBlue(p)-(MagickRealType) GetPixelBlue(q);
2461 distance+=pixel.blue*pixel.blue;
2462 if (distance > (fuzz*fuzz))
2463 return(MagickFalse);
2497MagickExport MagickBooleanType FuzzyColorCompare(
const Image *image,
2500 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.2.5");
2501 return(IsColorSimilar(image,p,q));
2538MagickExport MagickBooleanType FuzzyOpacityCompare(
const Image *image,
2541 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.2.5");
2542 return(IsOpacitySimilar(image,p,q));
2574MagickExport
void *GetConfigureBlob(
const char *filename,
char *path,
2580 assert(filename != (
const char *) NULL);
2581 if (IsEventLogging() != MagickFalse)
2583 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
2584 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
2585 "last use: v5.5.7");
2587 assert(path != (
char *) NULL);
2588 assert(length != (
size_t *) NULL);
2591 (void) CopyMagickString(path,filename,MaxTextExtent);
2592#if defined(MAGICKCORE_INSTALLED_SUPPORT)
2593#if defined(MAGICKCORE_LIBRARY_ABSOLUTE_PATH)
2594 if (blob == (
void *) NULL)
2599 (void) FormatLocaleString(path,MaxTextExtent,
"%s%s",
2600 MAGICKCORE_LIBRARY_ABSOLUTE_PATH,filename);
2601 if (IsPathAccessible(path) != MagickFalse)
2602 blob=FileToBlob(path,~0UL,length,exception);
2605#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !(defined(MAGICKCORE_CONFIGURE_PATH) || defined(MAGICKCORE_SHARE_PATH))
2606 if (blob == (
void *) NULL)
2614 key_value=NTRegistryKeyLookup(
"ConfigurePath");
2615 if (key_value != (
unsigned char *) NULL)
2617 (void) FormatLocaleString(path,MaxTextExtent,
"%s%s%s",(
char *)
2618 key_value,DirectorySeparator,filename);
2619 if (IsPathAccessible(path) != MagickFalse)
2620 blob=FileToBlob(path,~0UL,length,exception);
2625 if (blob == (
void *) NULL)
2630 home=GetEnvironmentValue(
"MAGICK_HOME");
2631 if (home != (
char *) NULL)
2636#if !defined(MAGICKCORE_POSIX_SUPPORT)
2637 (void) FormatLocaleString(path,MaxTextExtent,
"%s%s%s",home,
2638 DirectorySeparator,filename);
2640 (void) FormatLocaleString(path,MaxTextExtent,
"%s/lib/%s/%s",home,
2641 MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
2643 if (IsPathAccessible(path) != MagickFalse)
2644 blob=FileToBlob(path,~0UL,length,exception);
2645 home=DestroyString(home);
2647 home=GetEnvironmentValue(
"HOME");
2648 if (home == (
char *) NULL)
2649 home=GetEnvironmentValue(
"USERPROFILE");
2650 if (home != (
char *) NULL)
2655 (void) FormatLocaleString(path,MaxTextExtent,
"%s%s.magick%s%s",home,
2656 DirectorySeparator,DirectorySeparator,filename);
2657 if ((IsPathAccessible(path) != MagickFalse) && (blob == (
void *) NULL))
2658 blob=FileToBlob(path,~0UL,length,exception);
2659 home=DestroyString(home);
2662 if ((blob == (
void *) NULL) && (*GetClientPath() !=
'\0'))
2664#if !defined(MAGICKCORE_POSIX_SUPPORT)
2665 (void) FormatLocaleString(path,MaxTextExtent,
"%s%s%s",GetClientPath(),
2666 DirectorySeparator,filename);
2669 prefix[MaxTextExtent];
2674 (void) CopyMagickString(prefix,GetClientPath(),
2676 ChopPathComponents(prefix,1);
2677 (void) FormatLocaleString(path,MaxTextExtent,
"%s/lib/%s/%s",prefix,
2678 MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
2680 if (IsPathAccessible(path) != MagickFalse)
2681 blob=FileToBlob(path,~0UL,length,exception);
2686 if ((blob == (
void *) NULL) && (IsPathAccessible(path) != MagickFalse))
2687 blob=FileToBlob(path,~0UL,length,exception);
2688#if defined(MAGICKCORE_WINDOWS_SUPPORT)
2692 if (blob == (
void *) NULL)
2693 blob=NTResourceToBlob(filename);
2696 if (blob == (
void *) NULL)
2697 (void) ThrowMagickException(exception,GetMagickModule(),ConfigureWarning,
2698 "UnableToOpenConfigureFile",
"`%s'",path);
2736 const ssize_t y,
const size_t columns,
const size_t rows)
2741 pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2742 GetCacheViewException(cache_view));
2773MagickExport IndexPacket *GetCacheViewIndexes(
CacheView *cache_view)
2775 return(GetCacheViewAuthenticIndexQueue(cache_view));
2812 const ssize_t y,
const size_t columns,
const size_t rows)
2817 pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2818 GetCacheViewException(cache_view));
2847 (void) memset(exception,0,
sizeof(*exception));
2848 exception->severity=UndefinedException;
2849 exception->exceptions=(
void *) NewLinkedList(0);
2850 exception->semaphore=AllocateSemaphoreInfo();
2851 exception->signature=MagickCoreSignature;
2882static void *DestroyAttribute(
void *attribute)
2888 if (p->value != (
char *) NULL)
2889 p->value=DestroyString(p->value);
2890 return(RelinquishMagickMemory(p));
2902 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.3.1");
2903 value=GetImageProperty(image,key);
2904 if (value == (
const char *) NULL)
2906 if (image->attributes == (
void *) NULL)
2907 ((
Image *) image)->attributes=NewSplayTree(CompareSplayTreeString,
2908 RelinquishMagickMemory,DestroyAttribute);
2915 image->attributes,key);
2919 attribute=(
ImageAttribute *) AcquireMagickMemory(
sizeof(*attribute));
2921 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
2922 (void) memset(attribute,0,
sizeof(*attribute));
2923 attribute->key=ConstantString(key);
2924 attribute->value=ConstantString(value);
2926 attribute->key,attribute);
2962 return(GetImageAttribute(image,
"8BIM:1999,2998"));
2997MagickExport
Image *GetImageFromMagickRegistry(
const char *name,ssize_t *
id,
3001 return((
Image *) GetImageRegistry(ImageRegistryType,name,exception));
3034MagickExport
void *GetMagickRegistry(
const ssize_t
id,RegistryType *type,
3043 *type=UndefinedRegistryType;
3045 (void) FormatLocaleString(key,MaxTextExtent,
"%.20g\n",(
double)
id);
3046 blob=(
void *) GetImageRegistry(ImageRegistryType,key,exception);
3047 if (blob != (
void *) NULL)
3049 blob=(
void *) GetImageRegistry(ImageInfoRegistryType,key,exception);
3050 if (blob != (
void *) NULL)
3052 return((
void *) GetImageRegistry(UndefinedRegistryType,key,exception));
3085MagickExport
void GetMagickToken(
const char *start,
const char **end,
char *token)
3087 (void) GetNextToken(start,end,~0UL,token);
3129MagickExport
int GetImageGeometry(
Image *image,
const char *geometry,
3132 if (IsEventLogging() != MagickFalse)
3133 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.4");
3134 if (size_to_fit != MagickFalse)
3135 return((
int) ParseRegionGeometry(image,geometry,region_info,&image->exception));
3136 return((
int) ParsePageGeometry(image,geometry,region_info,&image->exception));
3171MagickExport
Image *GetImageList(
const Image *images,
const ssize_t offset,
3177 if (images->debug != MagickFalse)
3178 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3179 image=CloneImage(GetImageFromList(images,(ssize_t) offset),0,0,MagickTrue,
3211MagickExport ssize_t GetImageListIndex(
const Image *images)
3213 if (images->debug != MagickFalse)
3214 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3215 return(GetImageIndexInList(images));
3244MagickExport
size_t GetImageListSize(
const Image *images)
3246 if (images->debug != MagickFalse)
3247 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3248 return(GetImageListLength(images));
3298MagickExport
PixelPacket *GetImagePixels(
Image *image,
const ssize_t x,
const ssize_t y,
3299 const size_t columns,
const size_t rows)
3301 return(GetAuthenticPixels(image,x,y,columns,rows,&image->exception));
3335MagickExport IndexPacket *GetIndexes(
const Image *image)
3337 return(GetAuthenticIndexQueue(image));
3376MagickExport
unsigned int GetMagickGeometry(
const char *geometry,ssize_t *x,
3377 ssize_t *y,
size_t *width,
size_t *height)
3379 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.3");
3380 return(ParseMetaGeometry(geometry,x,y,width,height));
3409MagickExport
Image *GetNextImage(
const Image *images)
3411 if (images->debug != MagickFalse)
3412 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3413 return(GetNextImageInList(images));
3450 property=GetNextImageProperty(image);
3451 if (property == (
const char *) NULL)
3453 return(GetImageAttribute(image,property));
3482MagickExport
unsigned int GetNumberScenes(
const Image *image)
3484 if (IsEventLogging() != MagickFalse)
3485 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3486 return((
unsigned int) GetImageListLength(image));
3518MagickExport
PixelPacket GetOnePixel(
Image *image,
const ssize_t x,
const ssize_t y)
3523 (void) GetOneAuthenticPixel(image,x,y,&pixel,&image->exception);
3559 return(GetAuthenticPixelQueue(image));
3588MagickExport
Image *GetPreviousImage(
const Image *images)
3590 if (images->debug != MagickFalse)
3591 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
3592 return(GetPreviousImageInList(images));
3623static inline MagickRealType HueToRGB(MagickRealType m1,MagickRealType m2,
3630 if ((6.0*hue) < 1.0)
3631 return(m1+6.0*(m2-m1)*hue);
3632 if ((2.0*hue) < 1.0)
3634 if ((3.0*hue) < 2.0)
3635 return(m1+6.0*(m2-m1)*(2.0/3.0-hue));
3639MagickExport
void HSLTransform(
const double hue,
const double saturation,
3640 const double lightness,Quantum *red,Quantum *green,Quantum *blue)
3652 assert(red != (Quantum *) NULL);
3653 assert(green != (Quantum *) NULL);
3654 assert(blue != (Quantum *) NULL);
3655 if (lightness <= 0.5)
3656 m2=lightness*(saturation+1.0);
3658 m2=lightness+saturation-lightness*saturation;
3659 m1=2.0*lightness-m2;
3660 r=HueToRGB(m1,m2,hue+1.0/3.0);
3661 g=HueToRGB(m1,m2,hue);
3662 b=HueToRGB(m1,m2,hue-1.0/3.0);
3663 *red=ClampToQuantum((MagickRealType) QuantumRange*r);
3664 *green=ClampToQuantum((MagickRealType) QuantumRange*g);
3665 *blue=ClampToQuantum((MagickRealType) QuantumRange*b);
3693 if (IsEventLogging() != MagickFalse)
3695 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3696 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
3697 "last use: v5.5.7");
3704#if defined(MAGICKCORE_WINGDI32_DELEGATE)
3756 (void) memset(&bitmap,0,
sizeof(bitmap));
3758 bitmap.bmWidth=(LONG) image->columns;
3759 bitmap.bmHeight=(LONG) image->rows;
3760 bitmap.bmWidthBytes=4*bitmap.bmWidth;
3762 bitmap.bmBitsPixel=32;
3764 length=bitmap.bmWidthBytes*bitmap.bmHeight;
3765 bitmap_bitsH=(HANDLE) GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,length);
3766 if (bitmap_bitsH == NULL)
3771 message=GetExceptionMessage(errno);
3772 (void) ThrowMagickException(exception,GetMagickModule(),
3773 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",message);
3774 message=DestroyString(message);
3777 bitmap_bits=(RGBQUAD *) GlobalLock((HGLOBAL) bitmap_bitsH);
3779 if (bitmap.bmBits == NULL)
3780 bitmap.bmBits=bitmap_bits;
3781 (void) SetImageColorspace(image,sRGBColorspace);
3782 for (y=0; y < (ssize_t) image->rows; y++)
3784 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
3787 for (x=0; x < (ssize_t) image->columns; x++)
3789 q->rgbRed=ScaleQuantumToChar(GetPixelRed(p));
3790 q->rgbGreen=ScaleQuantumToChar(GetPixelGreen(p));
3791 q->rgbBlue=ScaleQuantumToChar(GetPixelBlue(p));
3797 bitmap.bmBits=bitmap_bits;
3798 bitmapH=CreateBitmapIndirect(&bitmap);
3799 if (bitmapH == NULL)
3804 message=GetExceptionMessage(errno);
3805 (void) ThrowMagickException(exception,GetMagickModule(),
3806 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",message);
3807 message=DestroyString(message);
3809 GlobalUnlock((HGLOBAL) bitmap_bitsH);
3810 GlobalFree((HGLOBAL) bitmap_bitsH);
3811 return((
void *) bitmapH);
3841MagickExport
void InitializeMagick(
const char *path)
3843 MagickCoreGenesis(path,MagickFalse);
3891 p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
3892 q=(pixels[0].red-pixels[1].red)-p;
3893 r=pixels[2].red-pixels[0].red;
3895 pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3896 p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
3897 q=(pixels[0].green-pixels[1].green)-p;
3898 r=pixels[2].green-pixels[0].green;
3900 pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3901 p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
3902 q=(pixels[0].blue-pixels[1].blue)-p;
3903 r=pixels[2].blue-pixels[0].blue;
3905 pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3906 p=(pixels[3].opacity-pixels[2].opacity)-(pixels[0].opacity-pixels[1].opacity);
3907 q=(pixels[0].opacity-pixels[1].opacity)-p;
3908 r=pixels[2].opacity-pixels[0].opacity;
3909 s=pixels[1].opacity;
3910 pixel->opacity=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3911 if (pixel->colorspace == CMYKColorspace)
3913 p=(pixels[3].index-pixels[2].index)-(pixels[0].index-pixels[1].index);
3914 q=(pixels[0].index-pixels[1].index)-p;
3915 r=pixels[2].index-pixels[0].index;
3917 pixel->index=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3921static inline MagickRealType CubicWeightingFunction(
const MagickRealType x)
3927 alpha=MagickMax(x+2.0,0.0);
3928 gamma=1.0*alpha*alpha*alpha;
3929 alpha=MagickMax(x+1.0,0.0);
3930 gamma-=4.0*alpha*alpha*alpha;
3931 alpha=MagickMax(x+0.0,0.0);
3932 gamma+=6.0*alpha*alpha*alpha;
3933 alpha=MagickMax(x-1.0,0.0);
3934 gamma-=4.0*alpha*alpha*alpha;
3938static inline double MeshInterpolate(
const PointInfo *delta,
const double p,
3939 const double x,
const double y)
3941 return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
3944static inline ssize_t NearestNeighbor(MagickRealType x)
3947 return((ssize_t) (x+0.5));
3948 return((ssize_t) (x-0.5));
3952 CacheView *image_view,
const InterpolatePixelMethod method,
const double x,
3967 assert(image != (
Image *) NULL);
3968 assert(image->signature == MagickCoreSignature);
3969 assert(image_view != (
CacheView *) NULL);
3970 GetMagickPixelPacket(image,&pixel);
3973 case AverageInterpolatePixel:
3984 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
3985 floor(y)-1,4,4,exception);
3988 indexes=GetCacheViewVirtualIndexQueue(image_view);
3989 for (i=0; i < 16L; i++)
3991 GetMagickPixelPacket(image,pixels+i);
3992 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
3994 if (image->matte != MagickFalse)
3996 alpha[i]=QuantumScale*((MagickRealType) GetPixelAlpha(p));
3997 pixels[i].red*=alpha[i];
3998 pixels[i].green*=alpha[i];
3999 pixels[i].blue*=alpha[i];
4000 if (image->colorspace == CMYKColorspace)
4001 pixels[i].index*=alpha[i];
4004 gamma=PerceptibleReciprocal(gamma);
4005 pixel.red+=gamma*0.0625*pixels[i].red;
4006 pixel.green+=gamma*0.0625*pixels[i].green;
4007 pixel.blue+=gamma*0.0625*pixels[i].blue;
4008 pixel.opacity+=0.0625*pixels[i].opacity;
4009 if (image->colorspace == CMYKColorspace)
4010 pixel.index+=gamma*0.0625*pixels[i].index;
4015 case BicubicInterpolatePixel:
4027 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
4028 floor(y)-1,4,4,exception);
4031 indexes=GetCacheViewVirtualIndexQueue(image_view);
4032 for (i=0; i < 4L; i++)
4033 GetMagickPixelPacket(image,u+i);
4034 for (i=0; i < 16L; i++)
4036 GetMagickPixelPacket(image,pixels+i);
4037 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
4039 if (image->matte != MagickFalse)
4041 alpha[i]=QuantumScale*((MagickRealType) GetPixelAlpha(p));
4042 pixels[i].red*=alpha[i];
4043 pixels[i].green*=alpha[i];
4044 pixels[i].blue*=alpha[i];
4045 if (image->colorspace == CMYKColorspace)
4046 pixels[i].index*=alpha[i];
4051 for (i=0; i < 4L; i++)
4053 GetMagickPixelPacket(image,pixels+4*i);
4054 BicubicInterpolate(pixels+4*i,delta.x,u+i);
4057 BicubicInterpolate(u,delta.y,&pixel);
4060 case BilinearInterpolatePixel:
4075 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
4076 floor(y),2,2,exception);
4079 indexes=GetCacheViewVirtualIndexQueue(image_view);
4080 for (i=0; i < 4L; i++)
4082 GetMagickPixelPacket(image,pixels+i);
4083 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
4085 if (image->matte != MagickFalse)
4087 alpha[i]=QuantumScale*((MagickRealType) GetPixelAlpha(p));
4088 pixels[i].red*=alpha[i];
4089 pixels[i].green*=alpha[i];
4090 pixels[i].blue*=alpha[i];
4091 if (image->colorspace == CMYKColorspace)
4092 pixels[i].index*=alpha[i];
4098 gamma=(((1.0-delta.y)*((1.0-delta.x)*alpha[0]+delta.x*alpha[1])+delta.y*
4099 ((1.0-delta.x)*alpha[2]+delta.x*alpha[3])));
4100 gamma=PerceptibleReciprocal(gamma);
4101 pixel.red=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].red+delta.x*
4102 pixels[1].red)+delta.y*((1.0-delta.x)*pixels[2].red+delta.x*
4104 pixel.green=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].green+delta.x*
4105 pixels[1].green)+delta.y*((1.0-delta.x)*pixels[2].green+
4106 delta.x*pixels[3].green));
4107 pixel.blue=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].blue+delta.x*
4108 pixels[1].blue)+delta.y*((1.0-delta.x)*pixels[2].blue+delta.x*
4110 pixel.opacity=((1.0-delta.y)*((1.0-delta.x)*pixels[0].opacity+delta.x*
4111 pixels[1].opacity)+delta.y*((1.0-delta.x)*pixels[2].opacity+delta.x*
4112 pixels[3].opacity));
4113 if (image->colorspace == CMYKColorspace)
4114 pixel.index=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].index+delta.x*
4115 pixels[1].index)+delta.y*((1.0-delta.x)*pixels[2].index+delta.x*
4119 case FilterInterpolatePixel:
4133 geometry.x=(ssize_t) floor(x)-1L;
4134 geometry.y=(ssize_t) floor(y)-1L;
4135 excerpt_image=ExcerptImage(image,&geometry,exception);
4136 if (excerpt_image == (
Image *) NULL)
4138 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
4140 excerpt_image=DestroyImage(excerpt_image);
4141 if (filter_image == (
Image *) NULL)
4143 p=GetVirtualPixels(filter_image,0,0,1,1,exception);
4146 filter_image=DestroyImage(filter_image);
4149 indexes=GetVirtualIndexQueue(filter_image);
4150 GetMagickPixelPacket(image,pixels);
4151 SetMagickPixelPacket(image,p,indexes,&pixel);
4152 filter_image=DestroyImage(filter_image);
4155 case IntegerInterpolatePixel:
4160 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
4161 floor(y),1,1,exception);
4164 indexes=GetCacheViewVirtualIndexQueue(image_view);
4165 GetMagickPixelPacket(image,pixels);
4166 SetMagickPixelPacket(image,p,indexes,&pixel);
4169 case MeshInterpolatePixel:
4184 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
4185 floor(y),2,2,exception);
4188 indexes=GetCacheViewVirtualIndexQueue(image_view);
4189 for (i=0; i < 4L; i++)
4191 GetMagickPixelPacket(image,pixels+i);
4192 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
4194 if (image->matte != MagickFalse)
4196 alpha[i]=QuantumScale*((MagickRealType) GetPixelAlpha(p));
4197 pixels[i].red*=alpha[i];
4198 pixels[i].green*=alpha[i];
4199 pixels[i].blue*=alpha[i];
4200 if (image->colorspace == CMYKColorspace)
4201 pixels[i].index*=alpha[i];
4207 luminance.x=MagickPixelLuma(pixels+0)-MagickPixelLuma(pixels+3);
4208 luminance.y=MagickPixelLuma(pixels+1)-MagickPixelLuma(pixels+2);
4209 if (fabs(luminance.x) < fabs(luminance.y))
4214 if (delta.x <= delta.y)
4219 delta.y=1.0-delta.y;
4220 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4221 gamma=PerceptibleReciprocal(gamma);
4222 pixel.red=gamma*MeshInterpolate(&delta,pixels[2].red,
4223 pixels[3].red,pixels[0].red);
4224 pixel.green=gamma*MeshInterpolate(&delta,pixels[2].green,
4225 pixels[3].green,pixels[0].green);
4226 pixel.blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
4227 pixels[3].blue,pixels[0].blue);
4228 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[2].opacity,
4229 pixels[3].opacity,pixels[0].opacity);
4230 if (image->colorspace == CMYKColorspace)
4231 pixel.index=gamma*MeshInterpolate(&delta,pixels[2].index,
4232 pixels[3].index,pixels[0].index);
4239 delta.x=1.0-delta.x;
4240 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4241 gamma=PerceptibleReciprocal(gamma);
4242 pixel.red=gamma*MeshInterpolate(&delta,pixels[1].red,
4243 pixels[0].red,pixels[3].red);
4244 pixel.green=gamma*MeshInterpolate(&delta,pixels[1].green,
4245 pixels[0].green,pixels[3].green);
4246 pixel.blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
4247 pixels[0].blue,pixels[3].blue);
4248 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[1].opacity,
4249 pixels[0].opacity,pixels[3].opacity);
4250 if (image->colorspace == CMYKColorspace)
4251 pixel.index=gamma*MeshInterpolate(&delta,pixels[1].index,
4252 pixels[0].index,pixels[3].index);
4260 if (delta.x <= (1.0-delta.y))
4265 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4266 gamma=PerceptibleReciprocal(gamma);
4267 pixel.red=gamma*MeshInterpolate(&delta,pixels[0].red,
4268 pixels[1].red,pixels[2].red);
4269 pixel.green=gamma*MeshInterpolate(&delta,pixels[0].green,
4270 pixels[1].green,pixels[2].green);
4271 pixel.blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
4272 pixels[1].blue,pixels[2].blue);
4273 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[0].opacity,
4274 pixels[1].opacity,pixels[2].opacity);
4275 if (image->colorspace == CMYKColorspace)
4276 pixel.index=gamma*MeshInterpolate(&delta,pixels[0].index,
4277 pixels[1].index,pixels[2].index);
4284 delta.x=1.0-delta.x;
4285 delta.y=1.0-delta.y;
4286 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4287 gamma=PerceptibleReciprocal(gamma);
4288 pixel.red=gamma*MeshInterpolate(&delta,pixels[3].red,
4289 pixels[2].red,pixels[1].red);
4290 pixel.green=gamma*MeshInterpolate(&delta,pixels[3].green,
4291 pixels[2].green,pixels[1].green);
4292 pixel.blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
4293 pixels[2].blue,pixels[1].blue);
4294 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[3].opacity,
4295 pixels[2].opacity,pixels[1].opacity);
4296 if (image->colorspace == CMYKColorspace)
4297 pixel.index=gamma*MeshInterpolate(&delta,pixels[3].index,
4298 pixels[2].index,pixels[1].index);
4303 case NearestNeighborInterpolatePixel:
4308 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
4309 NearestNeighbor(y),1,1,exception);
4312 indexes=GetCacheViewVirtualIndexQueue(image_view);
4313 GetMagickPixelPacket(image,pixels);
4314 SetMagickPixelPacket(image,p,indexes,&pixel);
4317 case SplineInterpolatePixel:
4337 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
4338 floor(y)-1,4,4,exception);
4341 indexes=GetCacheViewVirtualIndexQueue(image_view);
4345 for (i=(-1); i < 3L; i++)
4347 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
4348 for (j=(-1); j < 3L; j++)
4350 GetMagickPixelPacket(image,pixels+n);
4351 SetMagickPixelPacket(image,p,indexes+n,pixels+n);
4353 if (image->matte != MagickFalse)
4355 alpha[n]=QuantumScale*((MagickRealType)
4357 pixels[n].red*=alpha[n];
4358 pixels[n].green*=alpha[n];
4359 pixels[n].blue*=alpha[n];
4360 if (image->colorspace == CMYKColorspace)
4361 pixels[n].index*=alpha[n];
4363 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
4365 gamma=PerceptibleReciprocal(gamma);
4366 pixel.red+=gamma*dx*dy*pixels[n].red;
4367 pixel.green+=gamma*dx*dy*pixels[n].green;
4368 pixel.blue+=gamma*dx*dy*pixels[n].blue;
4369 if (image->matte != MagickFalse)
4370 pixel.opacity+=dx*dy*pixels[n].opacity;
4371 if (image->colorspace == CMYKColorspace)
4372 pixel.index+=gamma*dx*dy*pixels[n].index;
4416MagickExport
char *InterpretImageAttributes(
const ImageInfo *image_info,
4417 Image *image,
const char *embed_text)
4419 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.3.1");
4420 return(InterpretImageProperties(image_info,image,embed_text));
4445MagickExport MagickRealType InversesRGBCompandor(
const MagickRealType pixel)
4447 if (pixel <= (0.0404482362771076*(
double) QuantumRange))
4448 return(pixel/12.92);
4449 return((MagickRealType) QuantumRange*pow((QuantumScale*pixel+0.055)/1.055,
4473MagickExport MagickBooleanType IsMagickInstantiated(
void)
4475 return(IsMagickCoreInstantiated());
4504MagickExport
unsigned int IsSubimage(
const char *geometry,
4505 const unsigned int pedantic)
4507 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
4508 if (geometry == (
const char *) NULL)
4509 return(MagickFalse);
4510 if ((strchr(geometry,
'x') != (
char *) NULL) ||
4511 (strchr(geometry,
'X') != (
char *) NULL))
4512 return(MagickFalse);
4513 if ((pedantic != MagickFalse) && (strchr(geometry,
',') != (
char *) NULL))
4514 return(MagickFalse);
4563MagickBooleanType LevelImageColors(
Image *image,
const ChannelType channel,
4565 const MagickBooleanType invert)
4567 return(LevelColorsImageChannel(image,channel,black_color,white_color,invert));
4593MagickExport
void LiberateMemory(
void **memory)
4595 assert(memory != (
void **) NULL);
4596 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
4597 if (*memory == (
void *) NULL)
4600 *memory=(
void *) NULL;
4629MagickExport
void LiberateSemaphoreInfo(
SemaphoreInfo **semaphore_info)
4631 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
4632 UnlockSemaphoreInfo(*semaphore_info);
4662MagickExport
void MagickIncarnate(
const char *path)
4664 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.1");
4665 MagickCoreGenesis(path,MagickFalse);
4700MagickExport MagickBooleanType MagickMonitor(
const char *text,
4701 const MagickOffsetType offset,
const MagickSizeType span,
4702 void *magick_unused(client_data))
4710 magick_unreferenced(client_data);
4712 assert(text != (
const char *) NULL);
4713 if (IsEventLogging() != MagickFalse)
4714 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",text);
4715 ProcessPendingEvents(text);
4717 exception=AcquireExceptionInfo();
4718 if (monitor_handler != (MonitorHandler) NULL)
4719 status=(*monitor_handler)(text,offset,span,exception);
4720 exception=DestroyExceptionInfo(exception);
4761MagickExport MagickBooleanType MapImage(
Image *image,
const Image *map_image,
4762 const MagickBooleanType dither)
4770 assert(image != (
Image *) NULL);
4771 assert(image->signature == MagickCoreSignature);
4772 assert(map_image != (
Image *) NULL);
4773 assert(map_image->signature == MagickCoreSignature);
4774 if (IsEventLogging() != MagickFalse)
4775 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4776 GetQuantizeInfo(&quantize_info);
4777 quantize_info.dither=dither;
4778 return(RemapImage(&quantize_info,image,map_image));
4818MagickExport MagickBooleanType MapImages(
Image *images,
const Image *map_image,
4819 const MagickBooleanType dither)
4824 assert(images != (
Image *) NULL);
4825 assert(images->signature == MagickCoreSignature);
4826 if (IsEventLogging() != MagickFalse)
4827 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",images->filename);
4828 GetQuantizeInfo(&quantize_info);
4829 quantize_info.dither=dither;
4830 return(RemapImages(&quantize_info,images,map_image));
4876MagickExport MagickBooleanType MatteFloodfillImage(
Image *image,
4877 const PixelPacket target,
const Quantum opacity,
const ssize_t x_offset,
4878 const ssize_t y_offset,
const PaintMethod method)
4903 assert(image != (
Image *) NULL);
4904 assert(image->signature == MagickCoreSignature);
4905 if (IsEventLogging() != MagickFalse)
4906 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4907 if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
4908 return(MagickFalse);
4909 if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
4910 return(MagickFalse);
4911 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
4912 return(MagickFalse);
4913 if (image->matte == MagickFalse)
4914 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
4915 floodplane_image=CloneImage(image,0,0,MagickTrue,&image->exception);
4916 if (floodplane_image == (
Image *) NULL)
4917 return(MagickFalse);
4918 (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
4922 segment_stack=(
SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
4923 sizeof(*segment_stack));
4926 floodplane_image=DestroyImage(floodplane_image);
4927 ThrowBinaryImageException(ResourceLimitError,
"MemoryAllocationFailed",
4937 PushSegmentStack(y,x,x,1);
4938 PushSegmentStack(y+1,x,x,-1);
4939 while (s > segment_stack)
4956 offset=(ssize_t) s->y2;
4957 y=(ssize_t) s->y1+offset;
4961 p=GetVirtualPixels(image,0,y,(
size_t) (x1+1),1,&image->exception);
4962 q=GetAuthenticPixels(floodplane_image,0,y,(
size_t) (x1+1),1,
4968 for (x=x1; x >= 0; x--)
4970 if (q->opacity == (Quantum) TransparentOpacity)
4972 if (method == FloodfillMethod)
4974 if (IsColorSimilar(image,p,&target) == MagickFalse)
4978 if (IsColorSimilar(image,p,&target) != MagickFalse)
4980 q->opacity=(Quantum) TransparentOpacity;
4984 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
4986 skip=x >= x1 ? MagickTrue : MagickFalse;
4987 if (skip == MagickFalse)
4991 PushSegmentStack(y,start,x1-1,-offset);
4996 if (skip == MagickFalse)
4998 if (x < (ssize_t) image->columns)
5000 p=GetVirtualPixels(image,x,y,image->columns-x,1,
5002 q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
5007 for ( ; x < (ssize_t) image->columns; x++)
5009 if (q->opacity == (Quantum) TransparentOpacity)
5011 if (method == FloodfillMethod)
5013 if (IsColorSimilar(image,p,&target) == MagickFalse)
5017 if (IsColorSimilar(image,p,&target) != MagickFalse)
5019 q->opacity=(Quantum) TransparentOpacity;
5023 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
5026 PushSegmentStack(y,start,x-1,offset);
5028 PushSegmentStack(y,x2+1,x-1,-offset);
5034 p=GetVirtualPixels(image,x,y,(
size_t) (x2-x+1),1,
5036 q=GetAuthenticPixels(floodplane_image,x,y,(
size_t) (x2-x+1),1,
5040 for ( ; x <= x2; x++)
5042 if (q->opacity == (Quantum) TransparentOpacity)
5044 if (method == FloodfillMethod)
5046 if (IsColorSimilar(image,p,&target) != MagickFalse)
5050 if (IsColorSimilar(image,p,&target) == MagickFalse)
5059 for (y=0; y < (ssize_t) image->rows; y++)
5073 p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
5075 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
5078 for (x=0; x < (ssize_t) image->columns; x++)
5080 if (GetPixelOpacity(p) != OpaqueOpacity)
5085 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
5088 segment_stack=(
SegmentInfo *) RelinquishMagickMemory(segment_stack);
5089 floodplane_image=DestroyImage(floodplane_image);
5090 return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
5123 return(EvaluateImages(images,MinEvaluateOperator,exception));
5156 return(EvaluateImages(images,MinEvaluateOperator,exception));
5193MagickExport
Image *MedianFilterImage(
const Image *image,
const double radius,
5199 median_image=StatisticImage(image,MedianStatistic,(
size_t) radius,(
size_t)
5201 return(median_image);
5232MagickExport
Image *ModeImage(
const Image *image,
const double radius,
5238 mode_image=StatisticImage(image,ModeStatistic,(
size_t) radius,(
size_t) radius,
5273 return(MergeImageLayers(image,MosaicLayer,exception));
5310MagickExport MagickBooleanType OpaqueImage(
Image *image,
5313#define OpaqueImageTag "Opaque/Image"
5327 assert(image != (
Image *) NULL);
5328 assert(image->signature == MagickCoreSignature);
5329 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.1.0");
5330 if (IsEventLogging() != MagickFalse)
5331 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
5332 switch (image->storage_class)
5340 for (y=0; y < (ssize_t) image->rows; y++)
5348 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
5351 for (x=0; x < (ssize_t) image->columns; x++)
5353 if (IsColorSimilar(image,q,&target) != MagickFalse)
5357 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
5359 proceed=SetImageProgress(image,OpaqueImageTag,(MagickOffsetType) y,
5361 if (proceed == MagickFalse)
5371 for (i=0; i < (ssize_t) image->colors; i++)
5373 if (IsColorSimilar(image,&image->colormap[i],&target) != MagickFalse)
5374 image->colormap[i]=fill;
5376 if (fill.opacity != OpaqueOpacity)
5378 for (y=0; y < (ssize_t) image->rows; y++)
5386 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
5389 for (x=0; x < (ssize_t) image->columns; x++)
5391 if (IsColorSimilar(image,q,&target) != MagickFalse)
5392 q->opacity=fill.opacity;
5395 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
5399 (void) SyncImage(image);
5403 if (fill.opacity != OpaqueOpacity)
5404 image->matte=MagickTrue;
5437 return(AcquireVirtualCacheView(image,&((
Image *) image)->exception));
5466#if defined(MAGICKCORE_HAVE__WFOPEN)
5467static size_t UTF8ToUTF16(
const unsigned char *utf8,
wchar_t *utf16)
5472 if (utf16 != (
wchar_t *) NULL)
5484 for (p=utf8; *p !=
'\0'; p++)
5486 if ((*p & 0x80) == 0)
5489 if ((*p & 0xE0) == 0xC0)
5494 if ((*p & 0xC0) != 0x80)
5499 if ((*p & 0xF0) == 0xE0)
5504 if ((*p & 0xC0) != 0x80)
5507 *q|=(c & 0x3F) << 6;
5509 if ((*p & 0xC0) != 0x80)
5523 for (p=utf8; *p !=
'\0'; p++)
5525 if ((*p & 0x80) == 0)
5528 if ((*p & 0xE0) == 0xC0)
5531 if ((*p & 0xC0) != 0x80)
5535 if ((*p & 0xF0) == 0xE0)
5538 if ((*p & 0xC0) != 0x80)
5541 if ((*p & 0xC0) != 0x80)
5550static wchar_t *ConvertUTF8ToUTF16(
const unsigned char *source)
5558 length=UTF8ToUTF16(source,(
wchar_t *) NULL);
5567 length=strlen((
const char *) source);
5568 utf16=(
wchar_t *) AcquireQuantumMemory(length+1,
sizeof(*utf16));
5569 if (utf16 == (
wchar_t *) NULL)
5570 return((
wchar_t *) NULL);
5571 for (i=0; i <= (ssize_t) length; i++)
5575 utf16=(
wchar_t *) AcquireQuantumMemory(length+1,
sizeof(*utf16));
5576 if (utf16 == (
wchar_t *) NULL)
5577 return((
wchar_t *) NULL);
5578 length=UTF8ToUTF16(source,utf16);
5583MagickExport FILE *OpenMagickStream(
const char *path,
const char *mode)
5588 if ((path == (
const char *) NULL) || (mode == (
const char *) NULL))
5591 return((FILE *) NULL);
5594#if defined(MAGICKCORE_HAVE__WFOPEN)
5600 unicode_path=ConvertUTF8ToUTF16((
const unsigned char *) path);
5601 if (unicode_path == (
wchar_t *) NULL)
5602 return((FILE *) NULL);
5603 unicode_mode=ConvertUTF8ToUTF16((
const unsigned char *) mode);
5604 if (unicode_mode == (
wchar_t *) NULL)
5606 unicode_path=(
wchar_t *) RelinquishMagickMemory(unicode_path);
5607 return((FILE *) NULL);
5609 file=_wfopen(unicode_path,unicode_mode);
5610 unicode_mode=(
wchar_t *) RelinquishMagickMemory(unicode_mode);
5611 unicode_path=(
wchar_t *) RelinquishMagickMemory(unicode_path);
5614 if (file == (FILE *) NULL)
5615 file=fopen(path,mode);
5669MagickExport MagickBooleanType PaintFloodfillImage(
Image *image,
5671 const ssize_t y,
const DrawInfo *draw_info,
const PaintMethod method)
5676 status=FloodfillPaintImage(image,channel,draw_info,target,x,y,
5677 method == FloodfillMethod ? MagickFalse : MagickTrue);
5724MagickExport MagickBooleanType PaintOpaqueImage(
Image *image,
5730 status=OpaquePaintImageChannel(image,DefaultChannels,target,fill,MagickFalse);
5734MagickExport MagickBooleanType PaintOpaqueImageChannel(
Image *image,
5738 return(OpaquePaintImageChannel(image,channel,target,fill,MagickFalse));
5779MagickExport MagickBooleanType PaintTransparentImage(
Image *image,
5782 return(TransparentPaintImage(image,target,opacity,MagickFalse));
5824MagickExport
int ParseImageGeometry(
const char *geometry,ssize_t *x,ssize_t *y,
5825 size_t *width,
size_t *height)
5827 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.1");
5828 return((
int) ParseMetaGeometry(geometry,x,y,width,height));
5862MagickExport MagickStatusType ParseSizeGeometry(
const Image *image,
5868 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.4.7");
5869 SetGeometry(image,region_info);
5870 flags=ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y,
5871 ®ion_info->width,®ion_info->height);
5901MagickExport
Image *PopImageList(
Image **images)
5903 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
5904 return(RemoveLastImageFromList(images));
5937MagickExport
size_t PopImagePixels(
Image *image,
const QuantumType quantum,
5938 unsigned char *destination)
5946 quantum_info=AcquireQuantumInfo((
const ImageInfo *) NULL,image);
5949 length=ExportQuantumPixels(image,(
const CacheView *) NULL,quantum_info,
5950 quantum,destination,&image->exception);
5951 quantum_info=DestroyQuantumInfo(quantum_info);
5984MagickExport
char *PostscriptGeometry(
const char *page)
5986 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.1");
5987 return(GetPageGeometry(page));
6021MagickExport
unsigned int PushImageList(
Image **images,
const Image *image,
6024 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
6025 AppendImageToList(images,CloneImageList(image,exception));
6060MagickExport
size_t PushImagePixels(
Image *image,
const QuantumType quantum,
6061 const unsigned char *source)
6069 quantum_info=AcquireQuantumInfo((
const ImageInfo *) NULL,image);
6072 length=ImportQuantumPixels(image,(
CacheView *) NULL,quantum_info,quantum,
6073 source,&image->exception);
6074 quantum_info=DestroyQuantumInfo(quantum_info);
6122MagickExport
unsigned int QuantizationError(
Image *image)
6124 if (IsEventLogging() != MagickFalse)
6125 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.3");
6126 return(GetImageQuantizeError(image));
6163MagickExport
Image *RadialBlurImage(
const Image *image,
const double angle,
6166 return(RotationalBlurImage(image,angle,exception));
6169MagickExport
Image *RadialBlurImageChannel(
const Image *image,
6170 const ChannelType channel,
const double angle,
ExceptionInfo *exception)
6172 return(RotationalBlurImageChannel(image,channel,angle,exception));
6208MagickExport
unsigned int RandomChannelThresholdImage(
Image *image,
6209 const char *channel,
const char *thresholds,
ExceptionInfo *exception)
6211#define RandomChannelThresholdImageText " RandomChannelThreshold image... "
6224 static MagickRealType
6225 o2[4]={0.2f, 0.6f, 0.8f, 0.4f},
6226 o3[9]={0.1f, 0.6f, 0.3f, 0.7f, 0.5f, 0.8f, 0.4f, 0.9f, 0.2f},
6227 o4[16]={0.1f, 0.7f, 1.1f, 0.3f, 1.0f, 0.5f, 1.5f, 0.8f, 1.4f, 1.6f, 0.6f,
6228 1.2f, 0.4f, 0.9f, 1.3f, 0.2f},
6237 assert(image != (
Image *) NULL);
6238 assert(image->signature == MagickCoreSignature);
6239 if (IsEventLogging() != MagickFalse)
6240 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
6242 assert(exception->signature == MagickCoreSignature);
6243 if (IsEventLogging() != MagickFalse)
6244 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
6245 if (thresholds == (
const char *) NULL)
6249 if (LocaleCompare(thresholds,
"2x2") == 0)
6252 if (LocaleCompare(thresholds,
"3x3") == 0)
6255 if (LocaleCompare(thresholds,
"4x4") == 0)
6260 count=(ssize_t) sscanf(thresholds,
"%lf[/x%%]%lf",&lower_threshold,
6262 if (strchr(thresholds,
'%') != (
char *) NULL)
6264 upper_threshold*=(.01*(MagickRealType) QuantumRange);
6265 lower_threshold*=(.01*(MagickRealType) QuantumRange);
6268 upper_threshold=(MagickRealType) QuantumRange-lower_threshold;
6270 if (IsEventLogging() != MagickFalse)
6271 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
6272 " RandomChannelThresholdImage: channel type=%s",channel);
6273 if (IsEventLogging() != MagickFalse)
6274 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
6275 " Thresholds: %s (%fx%f)",thresholds,lower_threshold,upper_threshold);
6276 if (LocaleCompare(channel,
"all") == 0 ||
6277 LocaleCompare(channel,
"intensity") == 0)
6278 if (AcquireImageColormap(image,2) == MagickFalse)
6279 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
6281 random_info=AcquireRandomInfo();
6282 for (y=0; y < (ssize_t) image->rows; y++)
6289 *magick_restrict indexes;
6294 q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
6297 if (LocaleCompare(channel,
"all") == 0 ||
6298 LocaleCompare(channel,
"intensity") == 0)
6300 indexes=GetAuthenticIndexQueue(image);
6301 for (x=0; x < (ssize_t) image->columns; x++)
6306 intensity=GetPixelIntensity(image,q);
6309 if (intensity < lower_threshold)
6310 threshold=lower_threshold;
6311 else if (intensity > upper_threshold)
6312 threshold=upper_threshold;
6314 threshold=(MagickRealType) QuantumRange*
6315 GetPseudoRandomValue(random_info);
6317 else if (order == 2)
6318 threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
6319 else if (order == 3)
6320 threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
6321 else if (order == 4)
6322 threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)];
6323 index=(IndexPacket) (intensity <= threshold ? 0 : 1);
6324 SetPixelIndex(indexes+x,index);
6325 SetPixelRGBO(q,image->colormap+(ssize_t) index);
6329 if (LocaleCompare(channel,
"opacity") == 0 ||
6330 LocaleCompare(channel,
"all") == 0 ||
6331 LocaleCompare(channel,
"matte") == 0)
6333 if (image->matte != MagickFalse)
6334 for (x=0; x < (ssize_t) image->columns; x++)
6338 if ((MagickRealType) q->opacity < lower_threshold)
6339 threshold=lower_threshold;
6340 else if ((MagickRealType) q->opacity > upper_threshold)
6341 threshold=upper_threshold;
6343 threshold=(MagickRealType) QuantumRange*
6344 GetPseudoRandomValue(random_info);
6346 else if (order == 2)
6347 threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
6348 else if (order == 3)
6349 threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
6350 else if (order == 4)
6351 threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)]/1.7;
6352 SetPixelOpacity(q,(MagickRealType) q->opacity <=
6353 threshold ? 0 : QuantumRange);
6360 if (LocaleCompare(channel,
"intensity") != 0)
6361 ThrowBinaryException(OptionError,
"UnrecognizedChannelType",
6364 if (SyncAuthenticPixels(image,exception) == MagickFalse)
6367 random_info=DestroyRandomInfo(random_info);
6398MagickExport
void ReacquireMemory(
void **memory,
const size_t size)
6403 assert(memory != (
void **) NULL);
6404 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
6405 if (*memory == (
void *) NULL)
6407 *memory=AcquireMagickMemory(size);
6410 allocation=realloc(*memory,size);
6411 if (allocation == (
void *) NULL)
6412 *memory=RelinquishMagickMemory(*memory);
6451MagickExport
Image *RecolorImage(
const Image *image,
const size_t order,
6460 kernel_info=AcquireKernelInfo(
"1");
6462 return((
Image *) NULL);
6463 kernel_info->width=order;
6464 kernel_info->height=order;
6465 kernel_info->values=(
double *) color_matrix;
6466 recolor_image=ColorMatrixImage(image,kernel_info,exception);
6467 kernel_info->values=(
double *) NULL;
6468 kernel_info=DestroyKernelInfo(kernel_info);
6469 return(recolor_image);
6502MagickExport
Image *ReduceNoiseImage(
const Image *image,
const double radius,
6508 reduce_image=StatisticImage(image,NonpeakStatistic,(
size_t) radius,(
size_t)
6510 return(reduce_image);
6535MagickExport
void RelinquishSemaphoreInfo(
SemaphoreInfo *semaphore_info)
6538 UnlockSemaphoreInfo(semaphore_info);
6569MagickExport
void ResetImageAttributeIterator(
const Image *image)
6571 ResetImagePropertyIterator(image);
6608 const ssize_t y,
const size_t columns,
const size_t rows)
6613 pixels=QueueCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
6614 GetCacheViewException(cache_view));
6643MagickExport
void SetCacheThreshold(
const size_t size)
6645 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.1");
6646 (void) SetMagickResourceLimit(MemoryResource,size*1024*1024);
6647 (void) SetMagickResourceLimit(MapResource,2*size*1024*1024);
6675MagickExport MagickBooleanType SetExceptionInfo(
ExceptionInfo *exception,
6676 ExceptionType severity)
6679 ClearMagickException(exception);
6680 exception->severity=severity;
6711MagickExport
void SetImage(
Image *image,
const Quantum opacity)
6719 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.2.0");
6720 assert(image != (
Image *) NULL);
6721 if (IsEventLogging() != MagickFalse)
6722 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
6723 assert(image->signature == MagickCoreSignature);
6724 background_color=image->background_color;
6725 if (opacity != OpaqueOpacity)
6726 background_color.opacity=opacity;
6727 if (background_color.opacity != OpaqueOpacity)
6729 (void) SetImageStorageClass(image,DirectClass);
6730 image->matte=MagickTrue;
6732 if ((image->storage_class == PseudoClass) ||
6733 (image->colorspace == CMYKColorspace))
6738 for (y=0; y < (ssize_t) image->rows; y++)
6741 *magick_restrict indexes;
6749 q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
6752 for (x=0; x < (ssize_t) image->columns; x++)
6754 SetPixelRGBO(q,&background_color);
6757 indexes=GetAuthenticIndexQueue(image);
6758 for (x=0; x < (ssize_t) image->columns; x++)
6759 SetPixelIndex(indexes+x,0);
6760 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
6768 for (y=0; y < (ssize_t) image->rows; y++)
6776 q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
6779 for (x=0; x < (ssize_t) image->columns; x++)
6781 SetPixelRGBO(q,&background_color);
6784 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
6822MagickExport MagickBooleanType SetImageAttribute(
Image *image,
const char *key,
6825 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.3.1");
6826 return(SetImageProperty(image,key,value));
6858MagickExport
unsigned int SetImageList(
Image **images,
const Image *image,
6867 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
6868 clone=CloneImageList(image,exception);
6869 while (GetPreviousImageInList(*images) != (
Image *) NULL)
6870 (*images)=GetPreviousImageInList(*images);
6871 for (i=0; i < offset; i++)
6873 if (GetNextImageInList(*images) == (
Image *) NULL)
6874 return(MagickFalse);
6875 (*images)=GetNextImageInList(*images);
6877 InsertImageInList(images,clone);
6941MagickExport
PixelPacket *SetImagePixels(
Image *image,
const ssize_t x,
const ssize_t y,
6942 const size_t columns,
const size_t rows)
6944 return(QueueAuthenticPixels(image,x,y,columns,rows,&image->exception));
6978MagickExport ssize_t SetMagickRegistry(
const RegistryType type,
const void *blob,
6979 const size_t magick_unused(length),
ExceptionInfo *exception)
6990 magick_unreferenced(length);
6992 (void) FormatLocaleString(key,MaxTextExtent,
"%.20g\n",(
double)
id);
6993 status=SetImageRegistry(type,key,blob,exception);
6994 if (status == MagickFalse)
7023MagickExport MonitorHandler GetMonitorHandler(
void)
7025 return(monitor_handler);
7028MagickExport MonitorHandler SetMonitorHandler(MonitorHandler handler)
7033 previous_handler=monitor_handler;
7034 monitor_handler=handler;
7035 return(previous_handler);
7064MagickExport
Image *ShiftImageList(
Image **images)
7066 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
7067 return(RemoveFirstImageFromList(images));
7099MagickExport MagickOffsetType SizeBlob(
Image *image)
7101 if (IsEventLogging() != MagickFalse)
7102 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.4.3");
7103 return((MagickOffsetType) GetBlobSize(image));
7139MagickExport
Image *SpliceImageList(
Image *images,
const ssize_t offset,
7148 if (images->debug != MagickFalse)
7149 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
7150 clone=CloneImageList(splices,exception);
7151 while (GetPreviousImageInList(images) != (
Image *) NULL)
7152 images=GetPreviousImageInList(images);
7153 for (i=0; i < offset; i++)
7155 if (GetNextImageInList(images) == (
Image *) NULL)
7156 return((
Image *) NULL);
7157 images=GetNextImageInList(images);
7159 (void) SpliceImageIntoList(&images,length,clone);
7185MagickExport MagickRealType sRGBCompandor(
const MagickRealType pixel)
7187 if (pixel <= (0.0031306684425005883*(
double) QuantumRange))
7188 return(12.92*pixel);
7189 return((MagickRealType) QuantumRange*(1.055*pow(QuantumScale*pixel,1.0/2.4)-
7216MagickExport
void Strip(
char *message)
7222 assert(message != (
char *) NULL);
7223 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
7224 if (*message ==
'\0')
7226 if (strlen(message) == 1)
7229 while (isspace((
int) ((
unsigned char) *p)) != 0)
7231 if ((*p ==
'\'') || (*p ==
'"'))
7233 q=message+strlen(message)-1;
7234 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
7237 if ((*q ==
'\'') || (*q ==
'"'))
7239 (void) memcpy(message,p,(
size_t) (q-p+1));
7240 message[q-p+1]=
'\0';
7271MagickExport MagickBooleanType SyncCacheView(
CacheView *cache_view)
7276 status=SyncCacheViewAuthenticPixels(cache_view,
7277 GetCacheViewException(cache_view));
7311MagickExport MagickBooleanType SyncCacheViewPixels(
CacheView *cache_view)
7316 status=SyncCacheViewAuthenticPixels(cache_view,
7317 GetCacheViewException(cache_view));
7349MagickExport MagickBooleanType SyncImagePixels(
Image *image)
7351 return(SyncAuthenticPixels(image,&image->exception));
7387MagickExport
int SystemCommand(
const MagickBooleanType asynchronous,
7388 const MagickBooleanType verbose,
const char *command,
ExceptionInfo *exception)
7393 status=ExternalDelegateCommand(asynchronous,verbose,command,(
char *) NULL,
7421MagickExport
void TemporaryFilename(
char *path)
7423 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.6");
7424 (void) AcquireUniqueFilename(path);
7425 (void) RelinquishUniqueFileResource(path);
7454MagickExport
unsigned int ThresholdImage(
Image *image,
const double threshold)
7456#define ThresholdImageTag "Threshold/Image"
7467 assert(image != (
Image *) NULL);
7468 assert(image->signature == MagickCoreSignature);
7469 if (IsEventLogging() != MagickFalse)
7470 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
7471 if (IsEventLogging() != MagickFalse)
7472 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.7");
7473 if (!AcquireImageColormap(image,2))
7474 ThrowBinaryImageException(ResourceLimitError,
"MemoryAllocationFailed",
7475 "UnableToThresholdImage");
7476 for (y=0; y < (ssize_t) image->rows; y++)
7479 *magick_restrict indexes;
7487 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
7490 indexes=GetAuthenticIndexQueue(image);
7491 for (x=0; x < (ssize_t) image->columns; x++)
7493 index=(IndexPacket) (GetPixelIntensity(image,q) <=
7495 SetPixelIndex(indexes+x,index);
7496 SetPixelRGBO(q,image->colormap+(ssize_t) index);
7499 if (!SyncAuthenticPixels(image,&image->exception))
7530MagickExport
unsigned int ThresholdImageChannel(
Image *image,
7531 const char *threshold)
7533#define ThresholdImageTag "Threshold/Image"
7553 assert(image != (
Image *) NULL);
7554 assert(image->signature == MagickCoreSignature);
7555 if (IsEventLogging() != MagickFalse)
7556 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
7557 if (threshold == (
const char *) NULL)
7559 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
7560 return(MagickFalse);
7561 GetMagickPixelPacket(image,&pixel);
7562 flags=ParseGeometry(threshold,&geometry_info);
7563 pixel.red=geometry_info.rho;
7564 if (flags & SigmaValue)
7565 pixel.green=geometry_info.sigma;
7567 pixel.green=pixel.red;
7568 if (flags & XiValue)
7569 pixel.blue=geometry_info.xi;
7571 pixel.blue=pixel.red;
7572 if (flags & PsiValue)
7573 pixel.opacity=geometry_info.psi;
7575 pixel.opacity=(MagickRealType) OpaqueOpacity;
7576 if (flags & PercentValue)
7578 pixel.red*=(MagickRealType) QuantumRange/100.0;
7579 pixel.green*=(MagickRealType) QuantumRange/100.0;
7580 pixel.blue*=(MagickRealType) QuantumRange/100.0;
7581 pixel.opacity*=(MagickRealType) QuantumRange/100.0;
7583 if (!(flags & SigmaValue))
7585 if (!AcquireImageColormap(image,2))
7586 ThrowBinaryImageException(ResourceLimitError,
"MemoryAllocationFailed",
7587 "UnableToThresholdImage");
7589 (void) GetImageDynamicThreshold(image,2.0,2.0,&pixel,&image->exception);
7591 for (y=0; y < (ssize_t) image->rows; y++)
7594 *magick_restrict indexes;
7602 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
7605 indexes=GetAuthenticIndexQueue(image);
7606 if (IsMagickGray(&pixel) != MagickFalse)
7607 for (x=0; x < (ssize_t) image->columns; x++)
7609 index=(IndexPacket) (GetPixelIntensity(image,q) <= pixel.red ? 0 : 1);
7610 SetPixelIndex(indexes+x,index);
7611 SetPixelRed(q,image->colormap[(ssize_t) index].red);
7612 SetPixelGreen(q,image->colormap[(ssize_t) index].green);
7613 SetPixelBlue(q,image->colormap[(ssize_t) index].blue);
7617 for (x=0; x < (ssize_t) image->columns; x++)
7619 SetPixelRed(q,(MagickRealType) q->red <= pixel.red
7620 ? 0 : QuantumRange);
7621 SetPixelGreen(q,(MagickRealType) q->green <= pixel.green
7622 ? 0 : QuantumRange);
7623 SetPixelBlue(q,(MagickRealType) q->blue <= pixel.blue
7624 ? 0 : QuantumRange);
7625 SetPixelOpacity(q,(MagickRealType) q->opacity <= pixel.opacity
7626 ? 0 : QuantumRange);
7629 if (!SyncAuthenticPixels(image,&image->exception))
7669MagickExport
unsigned int TransformColorspace(
Image *image,
7670 const ColorspaceType colorspace)
7672 assert(image != (
Image *) NULL);
7673 assert(image->signature == MagickCoreSignature);
7674 if (IsEventLogging() != MagickFalse)
7675 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.6");
7676 return(TransformImageColorspace(image,colorspace));
7707MagickExport
void TransformHSL(
const Quantum red,
const Quantum green,
7708 const Quantum blue,
double *hue,
double *saturation,
double *lightness)
7721 assert(hue != (
double *) NULL);
7722 assert(saturation != (
double *) NULL);
7723 assert(lightness != (
double *) NULL);
7724 r=QuantumScale*(MagickRealType) red;
7725 g=QuantumScale*(MagickRealType) green;
7726 b=QuantumScale*(MagickRealType) blue;
7727 max=MagickMax(r,MagickMax(g,b));
7728 min=MagickMin(r,MagickMin(g,b));
7731 *lightness=(double) ((min+max)/2.0);
7735 *saturation=(double) (delta/((*lightness < 0.5) ? (min+max) :
7738 *hue=(double) (g == min ? 5.0+(max-b)/delta : 1.0-(max-g)/delta);
7741 *hue=(double) (b == min ? 1.0+(max-r)/delta : 3.0-(max-b)/delta);
7743 *hue=(double) (r == min ? 3.0+(max-g)/delta : 5.0-(max-r)/delta);
7780MagickExport
char *TranslateText(
const ImageInfo *image_info,
Image *image,
7781 const char *embed_text)
7783 assert(image != (
Image *) NULL);
7784 assert(image->signature == MagickCoreSignature);
7785 if (IsEventLogging() != MagickFalse)
7786 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.2.6");
7787 return(InterpretImageProperties(image_info,image,embed_text));
7824MagickExport MagickBooleanType TransparentImage(
Image *image,
7827#define TransparentImageTag "Transparent/Image"
7838 assert(image != (
Image *) NULL);
7839 assert(image->signature == MagickCoreSignature);
7840 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v6.1.0");
7841 if (IsEventLogging() != MagickFalse)
7842 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
7843 if (image->matte == MagickFalse)
7844 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
7845 for (y=0; y < (ssize_t) image->rows; y++)
7853 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
7856 for (x=0; x < (ssize_t) image->columns; x++)
7858 if (IsColorSimilar(image,q,&target) != MagickFalse)
7862 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
7864 proceed=SetImageProgress(image,TransparentImageTag,(MagickOffsetType) y,
7866 if (proceed == MagickFalse)
7903MagickExport
unsigned int UnshiftImageList(
Image **images,
const Image *image,
7906 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.5.2");
7907 PrependImageToList(images,CloneImageList(image,exception));
7944MagickExport IndexPacket ValidateColormapIndex(
Image *image,
7947 if (IsEventLogging() != MagickFalse)
7948 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),
"last use: v5.4.4");
7949 return(ConstrainColormapIndex(image,index));
7991MagickExport
Image *ZoomImage(
const Image *image,
const size_t columns,
7997 assert(image != (
const Image *) NULL);
7998 assert(image->signature == MagickCoreSignature);
8000 assert(exception->signature == MagickCoreSignature);
8001 if (IsEventLogging() != MagickFalse)
8002 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
8003 zoom_image=ResizeImage(image,columns,rows,image->filter,image->blur,