49#include "magick/studio.h"
50#include "magick/cache.h"
51#include "magick/cache-private.h"
52#include "magick/cache-view.h"
53#include "magick/magick.h"
54#include "magick/memory_.h"
55#include "magick/memory-private.h"
56#include "magick/exception.h"
57#include "magick/exception-private.h"
58#include "magick/resource_.h"
59#include "magick/string_.h"
60#include "magick/thread-private.h"
111MagickExport
CacheView *AcquireAuthenticCacheView(
const Image *image,
115 *magick_restrict cache_view;
117 cache_view=AcquireVirtualCacheView(image,exception);
150 return(AcquireVirtualCacheView(image,&((
Image *) image)->exception));
153MagickExport
CacheView *AcquireVirtualCacheView(
const Image *image,
157 *magick_restrict cache_view;
159 assert(image != (
Image *) NULL);
160 assert(image->signature == MagickCoreSignature);
161 if (IsEventLogging() != MagickFalse)
162 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
163#if defined(MAGICKCORE_OPENCL_SUPPORT)
164 SyncAuthenticOpenCLBuffer(image);
166 cache_view=(
CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
167 sizeof(*cache_view)));
169 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
170 (void) memset(cache_view,0,
sizeof(*cache_view));
171 cache_view->image=ReferenceImage((
Image *) image);
172 cache_view->number_threads=GetOpenMPMaximumThreads();
173 if (GetMagickResourceLimit(ThreadResource) > cache_view->number_threads)
174 cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource);
175 if (cache_view->number_threads == 0)
176 cache_view->number_threads=1;
177 cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
178 cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image);
179 cache_view->debug=GetLogEventMask() & CacheEvent ? MagickTrue : MagickFalse;
180 cache_view->signature=MagickCoreSignature;
181 if (cache_view->nexus_info == (
NexusInfo **) NULL)
182 ThrowFatalException(CacheFatalError,
"UnableToAcquireCacheView");
211 *magick_restrict clone_view;
213 assert(cache_view != (
CacheView *) NULL);
214 assert(cache_view->signature == MagickCoreSignature);
215 if (IsEventLogging() != MagickFalse)
216 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
217 cache_view->image->filename);
218 clone_view=(
CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
219 sizeof(*clone_view)));
221 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
222 (void) memset(clone_view,0,
sizeof(*clone_view));
223 clone_view->image=ReferenceImage(cache_view->image);
224 clone_view->number_threads=cache_view->number_threads;
225 clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
226 clone_view->virtual_pixel_method=cache_view->virtual_pixel_method;
227 clone_view->debug=cache_view->debug;
228 clone_view->signature=MagickCoreSignature;
257 assert(cache_view != (
CacheView *) NULL);
258 assert(cache_view->signature == MagickCoreSignature);
259 if (IsEventLogging() != MagickFalse)
260 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
261 cache_view->image->filename);
262 if (cache_view->nexus_info != (
NexusInfo **) NULL)
263 cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info,
264 cache_view->number_threads);
265 cache_view->image=DestroyImage(cache_view->image);
266 cache_view->signature=(~MagickCoreSignature);
267 cache_view=(
CacheView *) RelinquishAlignedMemory(cache_view);
294MagickExport
size_t GetCacheViewChannels(
const CacheView *cache_view)
296 assert(cache_view != (
CacheView *) NULL);
297 assert(cache_view->signature == MagickCoreSignature);
298 if (IsEventLogging() != MagickFalse)
299 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
300 cache_view->image->filename);
301 return(GetPixelCacheChannels(cache_view->image->cache));
327MagickExport ColorspaceType GetCacheViewColorspace(
const CacheView *cache_view)
329 assert(cache_view != (
CacheView *) NULL);
330 assert(cache_view->signature == MagickCoreSignature);
331 if (IsEventLogging() != MagickFalse)
332 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
333 cache_view->image->filename);
334 return(GetPixelCacheColorspace(cache_view->image->cache));
362 assert(cache_view != (
CacheView *) NULL);
363 assert(cache_view->signature == MagickCoreSignature);
364 if (IsEventLogging() != MagickFalse)
365 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
366 cache_view->image->filename);
367 return(&cache_view->image->exception);
394MagickExport MagickSizeType GetCacheViewExtent(
const CacheView *cache_view)
397 id = GetOpenMPThreadId();
399 assert(cache_view != (
CacheView *) NULL);
400 assert(cache_view->signature == MagickCoreSignature);
401 if (IsEventLogging() != MagickFalse)
402 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
403 cache_view->image->filename);
404 assert(cache_view->image->cache != (Cache) NULL);
405 assert(
id < (
int) cache_view->number_threads);
406 return(GetPixelCacheNexusExtent(cache_view->image->cache,
407 cache_view->nexus_info[
id]));
433MagickExport ClassType GetCacheViewStorageClass(
const CacheView *cache_view)
435 assert(cache_view != (
CacheView *) NULL);
436 assert(cache_view->signature == MagickCoreSignature);
437 if (IsEventLogging() != MagickFalse)
438 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
439 cache_view->image->filename);
440 return(GetPixelCacheStorageClass(cache_view->image->cache));
473 const ssize_t x,
const ssize_t y,
const size_t columns,
const size_t rows,
477 id = GetOpenMPThreadId();
479 assert(cache_view != (
CacheView *) NULL);
480 assert(cache_view->signature == MagickCoreSignature);
481 assert(
id < (
int) cache_view->number_threads);
482 return(GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
483 cache_view->nexus_info[
id],exception));
517MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
518 const CacheView *magick_restrict cache_view,
const ssize_t x,
const ssize_t y,
522 id = GetOpenMPThreadId();
525 *magick_restrict pixels;
527 assert(cache_view != (
CacheView *) NULL);
528 assert(cache_view->signature == MagickCoreSignature);
529 *pixel=cache_view->image->background_color;
530 assert(
id < (
int) cache_view->number_threads);
531 pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1,
532 cache_view->nexus_info[
id],exception);
563MagickExport IndexPacket *GetCacheViewAuthenticIndexQueue(
CacheView *cache_view)
566 id = GetOpenMPThreadId();
568 assert(cache_view != (
CacheView *) NULL);
569 assert(cache_view->signature == MagickCoreSignature);
570 assert(cache_view->image->cache != (Cache) NULL);
571 assert(
id < (
int) cache_view->number_threads);
572 return(cache_view->nexus_info[
id]->indexes);
603 id = GetOpenMPThreadId();
605 assert(cache_view != (
CacheView *) NULL);
606 assert(cache_view->signature == MagickCoreSignature);
607 assert(cache_view->image->cache != (Cache) NULL);
608 assert(
id < (
int) cache_view->number_threads);
609 return(cache_view->nexus_info[
id]->pixels);
637MagickExport
const IndexPacket *GetCacheViewVirtualIndexQueue(
641 id = GetOpenMPThreadId();
643 assert(cache_view != (
const CacheView *) NULL);
644 assert(cache_view->signature == MagickCoreSignature);
645 assert(cache_view->image->cache != (Cache) NULL);
646 assert(
id < (
int) cache_view->number_threads);
647 return(GetVirtualIndexesFromNexus(cache_view->image->cache,
648 cache_view->nexus_info[
id]));
676MagickExport
const PixelPacket *GetCacheViewVirtualPixelQueue(
680 id = GetOpenMPThreadId();
682 assert(cache_view != (
const CacheView *) NULL);
683 assert(cache_view->signature == MagickCoreSignature);
684 assert(cache_view->image->cache != (Cache) NULL);
685 assert(
id < (
int) cache_view->number_threads);
686 return(GetVirtualPixelsNexus(cache_view->image->cache,
687 cache_view->nexus_info[
id]));
722MagickExport
const PixelPacket *GetCacheViewVirtualPixels(
723 const CacheView *cache_view,
const ssize_t x,
const ssize_t y,
724 const size_t columns,
const size_t rows,
ExceptionInfo *exception)
727 id = GetOpenMPThreadId();
729 assert(cache_view != (
CacheView *) NULL);
730 assert(cache_view->signature == MagickCoreSignature);
731 assert(
id < (
int) cache_view->number_threads);
732 return(GetVirtualPixelCacheNexus(cache_view->image,
733 cache_view->virtual_pixel_method,x,y,columns,rows,
734 cache_view->nexus_info[
id],exception));
769MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
770 const CacheView *magick_restrict cache_view,
const ssize_t x,
const ssize_t y,
774 id = GetOpenMPThreadId();
777 *magick_restrict pixels;
779 assert(cache_view != (
CacheView *) NULL);
780 assert(cache_view->signature == MagickCoreSignature);
781 *pixel=cache_view->image->background_color;
782 assert(
id < (
int) cache_view->number_threads);
783 pixels=GetVirtualPixelCacheNexus(cache_view->image,
784 cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[
id],
828MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
829 const CacheView *cache_view,
const VirtualPixelMethod virtual_pixel_method,
833 id = GetOpenMPThreadId();
836 *magick_restrict pixels;
838 assert(cache_view != (
CacheView *) NULL);
839 assert(cache_view->signature == MagickCoreSignature);
840 *pixel=cache_view->image->background_color;
841 assert(
id < (
int) cache_view->number_threads);
842 pixels=GetVirtualPixelCacheNexus(cache_view->image,virtual_pixel_method,x,y,1,
843 1,cache_view->nexus_info[
id],exception);
883 const ssize_t x,
const ssize_t y,
const size_t columns,
const size_t rows,
887 id = GetOpenMPThreadId();
889 assert(cache_view != (
CacheView *) NULL);
890 assert(cache_view->signature == MagickCoreSignature);
891 assert(
id < (
int) cache_view->number_threads);
892 return(QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
893 MagickFalse,cache_view->nexus_info[
id],exception));
922MagickExport MagickBooleanType SetCacheViewStorageClass(
CacheView *cache_view,
923 const ClassType storage_class)
925 assert(cache_view != (
CacheView *) NULL);
926 assert(cache_view->signature == MagickCoreSignature);
927 if (IsEventLogging() != MagickFalse)
928 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
929 cache_view->image->filename);
930 return(SetImageStorageClass(cache_view->image,storage_class));
959MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod(
961 const VirtualPixelMethod virtual_pixel_method)
963 assert(cache_view != (
CacheView *) NULL);
964 assert(cache_view->signature == MagickCoreSignature);
965 if (IsEventLogging() != MagickFalse)
966 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
967 cache_view->image->filename);
968 cache_view->virtual_pixel_method=virtual_pixel_method;
999MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(
1003 id = GetOpenMPThreadId();
1005 assert(cache_view != (
CacheView *) NULL);
1006 assert(cache_view->signature == MagickCoreSignature);
1007 assert(
id < (
int) cache_view->number_threads);
1008 return(SyncAuthenticPixelCacheNexus(cache_view->image,
1009 cache_view->nexus_info[
id],exception));