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"
111 MagickExport
CacheView *AcquireAuthenticCacheView(
const Image *image,
115 *magick_restrict cache_view;
117 cache_view=AcquireVirtualCacheView(image,exception);
150 return(AcquireVirtualCacheView(image,&((
Image *) image)->exception));
153 MagickExport
CacheView *AcquireVirtualCacheView(
const Image *image,
157 *magick_restrict cache_view;
159 magick_unreferenced(exception);
160 assert(image != (
Image *) NULL);
161 assert(image->signature == MagickCoreSignature);
162 if (IsEventLogging() != MagickFalse)
163 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
164 #if defined(MAGICKCORE_OPENCL_SUPPORT)
165 SyncAuthenticOpenCLBuffer(image);
167 cache_view=(
CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
168 sizeof(*cache_view)));
170 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
171 (void) memset(cache_view,0,
sizeof(*cache_view));
172 cache_view->image=ReferenceImage((
Image *) image);
173 cache_view->number_threads=GetOpenMPMaximumThreads();
174 if (GetMagickResourceLimit(ThreadResource) > cache_view->number_threads)
175 cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource);
176 if (cache_view->number_threads == 0)
177 cache_view->number_threads=1;
178 cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
179 cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image);
180 cache_view->debug=GetLogEventMask() & CacheEvent ? MagickTrue : MagickFalse;
181 cache_view->signature=MagickCoreSignature;
182 if (cache_view->nexus_info == (
NexusInfo **) NULL)
183 ThrowFatalException(CacheFatalError,
"UnableToAcquireCacheView");
212 *magick_restrict clone_view;
214 assert(cache_view != (
CacheView *) NULL);
215 assert(cache_view->signature == MagickCoreSignature);
216 if (IsEventLogging() != MagickFalse)
217 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
218 cache_view->image->filename);
219 clone_view=(
CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
220 sizeof(*clone_view)));
222 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
223 (void) memset(clone_view,0,
sizeof(*clone_view));
224 clone_view->image=ReferenceImage(cache_view->image);
225 clone_view->number_threads=cache_view->number_threads;
226 clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
227 clone_view->virtual_pixel_method=cache_view->virtual_pixel_method;
228 clone_view->debug=cache_view->debug;
229 clone_view->signature=MagickCoreSignature;
258 assert(cache_view != (
CacheView *) NULL);
259 assert(cache_view->signature == MagickCoreSignature);
260 if (IsEventLogging() != MagickFalse)
261 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
262 cache_view->image->filename);
263 if (cache_view->nexus_info != (
NexusInfo **) NULL)
264 cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info,
265 cache_view->number_threads);
266 cache_view->image=DestroyImage(cache_view->image);
267 cache_view->signature=(~MagickCoreSignature);
268 cache_view=(
CacheView *) RelinquishAlignedMemory(cache_view);
295 MagickExport
size_t GetCacheViewChannels(
const CacheView *cache_view)
297 assert(cache_view != (
CacheView *) NULL);
298 assert(cache_view->signature == MagickCoreSignature);
299 if (IsEventLogging() != MagickFalse)
300 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
301 cache_view->image->filename);
302 return(GetPixelCacheChannels(cache_view->image->cache));
328 MagickExport ColorspaceType GetCacheViewColorspace(
const CacheView *cache_view)
330 assert(cache_view != (
CacheView *) NULL);
331 assert(cache_view->signature == MagickCoreSignature);
332 if (IsEventLogging() != MagickFalse)
333 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
334 cache_view->image->filename);
335 return(GetPixelCacheColorspace(cache_view->image->cache));
363 assert(cache_view != (
CacheView *) NULL);
364 assert(cache_view->signature == MagickCoreSignature);
365 if (IsEventLogging() != MagickFalse)
366 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
367 cache_view->image->filename);
368 return(&cache_view->image->exception);
395 MagickExport MagickSizeType GetCacheViewExtent(
const CacheView *cache_view)
398 id = GetOpenMPThreadId();
400 assert(cache_view != (
CacheView *) NULL);
401 assert(cache_view->signature == MagickCoreSignature);
402 if (IsEventLogging() != MagickFalse)
403 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
404 cache_view->image->filename);
405 assert(cache_view->image->cache != (Cache) NULL);
406 assert(
id < (
int) cache_view->number_threads);
407 return(GetPixelCacheNexusExtent(cache_view->image->cache,
408 cache_view->nexus_info[
id]));
434 MagickExport ClassType GetCacheViewStorageClass(
const CacheView *cache_view)
436 assert(cache_view != (
CacheView *) NULL);
437 assert(cache_view->signature == MagickCoreSignature);
438 if (IsEventLogging() != MagickFalse)
439 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
440 cache_view->image->filename);
441 return(GetPixelCacheStorageClass(cache_view->image->cache));
474 const ssize_t x,
const ssize_t y,
const size_t columns,
const size_t rows,
478 id = GetOpenMPThreadId();
480 assert(cache_view != (
CacheView *) NULL);
481 assert(cache_view->signature == MagickCoreSignature);
482 assert(
id < (
int) cache_view->number_threads);
483 return(GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
484 cache_view->nexus_info[
id],exception));
518 MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
519 const CacheView *magick_restrict cache_view,
const ssize_t x,
const ssize_t y,
523 id = GetOpenMPThreadId();
526 *magick_restrict pixels;
528 assert(cache_view != (
CacheView *) NULL);
529 assert(cache_view->signature == MagickCoreSignature);
530 *pixel=cache_view->image->background_color;
531 assert(
id < (
int) cache_view->number_threads);
532 pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1,
533 cache_view->nexus_info[
id],exception);
564 MagickExport IndexPacket *GetCacheViewAuthenticIndexQueue(
CacheView *cache_view)
567 id = GetOpenMPThreadId();
569 assert(cache_view != (
CacheView *) NULL);
570 assert(cache_view->signature == MagickCoreSignature);
571 assert(cache_view->image->cache != (Cache) NULL);
572 assert(
id < (
int) cache_view->number_threads);
573 return(cache_view->nexus_info[
id]->indexes);
604 id = GetOpenMPThreadId();
606 assert(cache_view != (
CacheView *) NULL);
607 assert(cache_view->signature == MagickCoreSignature);
608 assert(cache_view->image->cache != (Cache) NULL);
609 assert(
id < (
int) cache_view->number_threads);
610 return(cache_view->nexus_info[
id]->pixels);
638 MagickExport
const IndexPacket *GetCacheViewVirtualIndexQueue(
642 id = GetOpenMPThreadId();
644 assert(cache_view != (
const CacheView *) NULL);
645 assert(cache_view->signature == MagickCoreSignature);
646 assert(cache_view->image->cache != (Cache) NULL);
647 assert(
id < (
int) cache_view->number_threads);
648 return(GetVirtualIndexesFromNexus(cache_view->image->cache,
649 cache_view->nexus_info[
id]));
677 MagickExport
const PixelPacket *GetCacheViewVirtualPixelQueue(
681 id = GetOpenMPThreadId();
683 assert(cache_view != (
const CacheView *) NULL);
684 assert(cache_view->signature == MagickCoreSignature);
685 assert(cache_view->image->cache != (Cache) NULL);
686 assert(
id < (
int) cache_view->number_threads);
687 return(GetVirtualPixelsNexus(cache_view->image->cache,
688 cache_view->nexus_info[
id]));
723 MagickExport
const PixelPacket *GetCacheViewVirtualPixels(
724 const CacheView *cache_view,
const ssize_t x,
const ssize_t y,
725 const size_t columns,
const size_t rows,
ExceptionInfo *exception)
728 id = GetOpenMPThreadId();
730 assert(cache_view != (
CacheView *) NULL);
731 assert(cache_view->signature == MagickCoreSignature);
732 assert(
id < (
int) cache_view->number_threads);
733 return(GetVirtualPixelCacheNexus(cache_view->image,
734 cache_view->virtual_pixel_method,x,y,columns,rows,
735 cache_view->nexus_info[
id],exception));
770 MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
771 const CacheView *magick_restrict cache_view,
const ssize_t x,
const ssize_t y,
775 id = GetOpenMPThreadId();
778 *magick_restrict pixels;
780 assert(cache_view != (
CacheView *) NULL);
781 assert(cache_view->signature == MagickCoreSignature);
782 *pixel=cache_view->image->background_color;
783 assert(
id < (
int) cache_view->number_threads);
784 pixels=GetVirtualPixelCacheNexus(cache_view->image,
785 cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[
id],
829 MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
830 const CacheView *cache_view,
const VirtualPixelMethod virtual_pixel_method,
834 id = GetOpenMPThreadId();
837 *magick_restrict pixels;
839 assert(cache_view != (
CacheView *) NULL);
840 assert(cache_view->signature == MagickCoreSignature);
841 *pixel=cache_view->image->background_color;
842 assert(
id < (
int) cache_view->number_threads);
843 pixels=GetVirtualPixelCacheNexus(cache_view->image,virtual_pixel_method,x,y,1,
844 1,cache_view->nexus_info[
id],exception);
884 const ssize_t x,
const ssize_t y,
const size_t columns,
const size_t rows,
888 id = GetOpenMPThreadId();
890 assert(cache_view != (
CacheView *) NULL);
891 assert(cache_view->signature == MagickCoreSignature);
892 assert(
id < (
int) cache_view->number_threads);
893 return(QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
894 MagickFalse,cache_view->nexus_info[
id],exception));
923 MagickExport MagickBooleanType SetCacheViewStorageClass(
CacheView *cache_view,
924 const ClassType storage_class)
926 assert(cache_view != (
CacheView *) NULL);
927 assert(cache_view->signature == MagickCoreSignature);
928 if (IsEventLogging() != MagickFalse)
929 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
930 cache_view->image->filename);
931 return(SetImageStorageClass(cache_view->image,storage_class));
960 MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod(
962 const VirtualPixelMethod virtual_pixel_method)
964 assert(cache_view != (
CacheView *) NULL);
965 assert(cache_view->signature == MagickCoreSignature);
966 if (IsEventLogging() != MagickFalse)
967 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
968 cache_view->image->filename);
969 cache_view->virtual_pixel_method=virtual_pixel_method;
1000 MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(
1004 id = GetOpenMPThreadId();
1006 assert(cache_view != (
CacheView *) NULL);
1007 assert(cache_view->signature == MagickCoreSignature);
1008 assert(
id < (
int) cache_view->number_threads);
1009 return(SyncAuthenticPixelCacheNexus(cache_view->image,
1010 cache_view->nexus_info[
id],exception));