#include "MagickCore/log.h"
#include "MagickCore/magick.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/nt-base-private.h"
#include "MagickCore/pixel.h"
#include "MagickCore/pixel-accessor.h"
#include "MagickCore/policy.h"
extern "C" {
#endif
+static Cache
+ GetImagePixelCache(Image *,const MagickBooleanType,ExceptionInfo *)
+ magick_hot_spot;
+
static const Quantum
*GetVirtualPixelCache(const Image *,const VirtualPixelMethod,const ssize_t,
const ssize_t,const size_t,const size_t,ExceptionInfo *),
*QueueAuthenticPixelsCache(Image *,const ssize_t,const ssize_t,const size_t,
const size_t,ExceptionInfo *),
*SetPixelCacheNexusPixels(const Image *,const RectangleInfo *,NexusInfo *,
- ExceptionInfo *);
+ ExceptionInfo *) magick_hot_spot;
#if defined(__cplusplus) || defined(c_plusplus)
}
register ssize_t
i;
- nexus_info=(NexusInfo **) AcquireQuantumMemory(number_threads,
+ nexus_info=(NexusInfo **) AcquireAlignedMemory(number_threads,
sizeof(*nexus_info));
if (nexus_info == (NexusInfo **) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
static inline void RelinquishCacheNexusPixels(NexusInfo *nexus_info)
{
if (nexus_info->mapped == MagickFalse)
- (void) RelinquishAlignedMemory(nexus_info->cache);
+ (void) RelinquishMagickMemory(nexus_info->cache);
else
(void) UnmapBlob(nexus_info->cache,(size_t) nexus_info->length);
nexus_info->cache=(Quantum *) NULL;
nexus_info[i]->signature=(~MagickSignature);
}
nexus_info[0]=(NexusInfo *) RelinquishMagickMemory(nexus_info[0]);
- nexus_info=(NexusInfo **) RelinquishMagickMemory(nexus_info);
+ nexus_info=(NexusInfo **) RelinquishAlignedMemory(nexus_info);
return(nexus_info);
}
\f
assert(image->cache != (Cache) NULL);
cache_info=(CacheInfo *) image->cache;
assert(cache_info->signature == MagickSignature);
- if (cache_info->methods.get_virtual_metacontent_from_handler !=
- (GetVirtualMetacontentFromHandler) NULL)
- {
- metacontent=cache_info->methods.get_virtual_metacontent_from_handler(
- image);
- return(metacontent);
- }
+ metacontent=cache_info->methods.get_virtual_metacontent_from_handler(image);
+ if (metacontent != (GetVirtualMetacontentFromHandler) NULL)
+ return(metacontent);
assert(id < (int) cache_info->number_threads);
metacontent=GetVirtualMetacontentFromNexus(cache_info,
cache_info->nexus_info[id]);
length,
number_pixels;
- PixelChannelMap
- *p,
- *q;
-
size_t
columns,
packet_size;
ThrowBinaryException(ResourceLimitError,"PixelCacheAllocationFailed",
image->filename);
cache_info->length=length;
- p=cache_info->channel_map;
- q=source_info.channel_map;
- if ((cache_info->type != UndefinedCache) &&
- (cache_info->columns <= source_info.columns) &&
- (cache_info->rows <= source_info.rows) &&
- (cache_info->number_channels <= source_info.number_channels) &&
- (memcmp(p,q,cache_info->number_channels*sizeof(*p)) == 0) &&
- (cache_info->metacontent_extent <= source_info.metacontent_extent))
- {
- /*
- Inline pixel cache clone optimization.
- */
- if ((cache_info->columns == source_info.columns) &&
- (cache_info->rows == source_info.rows) &&
- (cache_info->number_channels == source_info.number_channels) &&
- (memcmp(p,q,cache_info->number_channels*sizeof(*p)) == 0) &&
- (cache_info->metacontent_extent == source_info.metacontent_extent))
- return(MagickTrue);
- return(ClonePixelCachePixels(cache_info,&source_info,exception));
- }
status=AcquireMagickResource(AreaResource,cache_info->length);
length=number_pixels*(cache_info->number_channels*sizeof(Quantum)+
cache_info->metacontent_extent);
cache_info=(CacheInfo *) image->cache;
assert(cache_info->signature == MagickSignature);
if (cache_info->methods.queue_authentic_pixels_handler !=
- (QueueAuthenticPixelsHandler) NULL)
+ (QueueAuthenticPixelsHandler) NULL)
{
- q=cache_info->methods.queue_authentic_pixels_handler(image,x,y,
- columns,rows,exception);
+ q=cache_info->methods.queue_authentic_pixels_handler(image,x,y,columns,
+ rows,exception);
return(q);
}
assert(id < (int) cache_info->number_threads);
if (nexus_info->length != (MagickSizeType) ((size_t) nexus_info->length))
return(MagickFalse);
nexus_info->mapped=MagickFalse;
- nexus_info->cache=(Quantum *) AcquireAlignedMemory(1,(size_t)
+ nexus_info->cache=(Quantum *) AcquireMagickMemory((size_t)
nexus_info->length);
if (nexus_info->cache == (Quantum *) NULL)
{
static MagickBooleanType SetCacheAlphaChannel(Image *image,const Quantum alpha,
ExceptionInfo *exception)
{
+ CacheView
+ *image_view;
+
CacheInfo
*cache_info;
assert(cache_info->signature == MagickSignature);
image->matte=MagickTrue;
status=MagickTrue;
+ image_view=AcquireCacheView(image);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static,4) shared(status)
#endif
for (y=0; y < (ssize_t) image->rows; y++)
{
- const int
- id = GetOpenMPThreadId();
-
register Quantum
*restrict q;
if (status == MagickFalse)
continue;
- q=GetAuthenticPixelCacheNexus(image,0,y,image->columns,1,
- cache_info->nexus_info[id],exception);
+ q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
SetPixelAlpha(image,alpha,q);
q+=GetPixelChannels(image);
}
- status=SyncAuthenticPixelCacheNexus(image,cache_info->nexus_info[id],
- exception);
+ status=SyncCacheViewAuthenticPixels(image_view,exception);
}
+ image_view=DestroyCacheView(image_view);
return(status);
}