/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % CCCC AAA CCCC H H EEEEE % % C A A C H H E % % C AAAAA C HHHHH EEE % % C A A C H H E % % CCCC A A CCCC H H EEEEE % % % % V V IIIII EEEEE W W % % V V I E W W % % V V I EEE W W W % % V V I E WW WW % % V IIIII EEEEE W W % % % % % % MagickCore Cache View Methods % % % % Software Design % % Cristy % % February 2000 % % % % % % Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % % obtain a copy of the License at % % % % https://www.imagemagick.org/script/license.php % % % % Unless required by applicable law or agreed to in writing, software % % distributed under the License is distributed on an "AS IS" BASIS, % % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % % See the License for the specific language governing permissions and % % limitations under the License. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % */ /* Include declarations. */ #include "MagickCore/studio.h" #include "MagickCore/cache.h" #include "MagickCore/cache-private.h" #include "MagickCore/cache-view.h" #include "MagickCore/memory_.h" #include "MagickCore/memory-private.h" #include "MagickCore/exception.h" #include "MagickCore/exception-private.h" #include "MagickCore/pixel-accessor.h" #include "MagickCore/resource_.h" #include "MagickCore/string_.h" #include "MagickCore/thread-private.h" /* Typedef declarations. */ struct _CacheView { Image *image; VirtualPixelMethod virtual_pixel_method; size_t number_threads; NexusInfo **nexus_info; MagickBooleanType debug; size_t signature; }; /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % A c q u i r e A u t h e n t i c C a c h e V i e w % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AcquireAuthenticCacheView() acquires an authentic view into the pixel cache. % It always succeeds but may return a warning or informational exception. % % The format of the AcquireAuthenticCacheView method is: % % CacheView *AcquireAuthenticCacheView(const Image *image, % ExceptionInfo *exception) % % A description of each parameter follows: % % o image: the image. % % o exception: return any errors or warnings in this structure. % */ MagickExport CacheView *AcquireAuthenticCacheView(const Image *image, ExceptionInfo *exception) { CacheView *magick_restrict cache_view; cache_view=AcquireVirtualCacheView(image,exception); return(cache_view); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % A c q u i r e V i r t u a l C a c h e V i e w % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AcquireVirtualCacheView() acquires a virtual view into the pixel cache, % using the VirtualPixelMethod that is defined within the given image itself. % It always succeeds but may return a warning or informational exception. % % The format of the AcquireVirtualCacheView method is: % % CacheView *AcquireVirtualCacheView(const Image *image, % ExceptionInfo *exception) % % A description of each parameter follows: % % o image: the image. % % o exception: return any errors or warnings in this structure. % */ MagickExport CacheView *AcquireVirtualCacheView(const Image *image, ExceptionInfo *exception) { CacheView *magick_restrict cache_view; magick_unreferenced(exception); assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); #if defined(MAGICKCORE_OPENCL_SUPPORT) SyncAuthenticOpenCLBuffer(image); #endif cache_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1, sizeof(*cache_view))); if (cache_view == (CacheView *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); (void) ResetMagickMemory(cache_view,0,sizeof(*cache_view)); cache_view->image=ReferenceImage((Image *) image); cache_view->number_threads=GetOpenMPMaximumThreads(); if (GetMagickResourceLimit(ThreadResource) > cache_view->number_threads) cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); if (cache_view->number_threads == 0) cache_view->number_threads=1; cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image); cache_view->debug=IsEventLogging(); cache_view->signature=MagickCoreSignature; if (cache_view->nexus_info == (NexusInfo **) NULL) ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView"); return(cache_view); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % C l o n e C a c h e V i e w % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % CloneCacheView() makes an exact copy of the specified cache view. % % The format of the CloneCacheView method is: % % CacheView *CloneCacheView(const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport CacheView *CloneCacheView(const CacheView *cache_view) { CacheView *magick_restrict clone_view; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); clone_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1, sizeof(*clone_view))); if (clone_view == (CacheView *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); (void) ResetMagickMemory(clone_view,0,sizeof(*clone_view)); clone_view->image=ReferenceImage(cache_view->image); clone_view->number_threads=cache_view->number_threads; clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); clone_view->virtual_pixel_method=cache_view->virtual_pixel_method; clone_view->debug=cache_view->debug; clone_view->signature=MagickCoreSignature; return(clone_view); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % D e s t r o y C a c h e V i e w % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DestroyCacheView() destroys the specified view returned by a previous call % to AcquireCacheView(). % % The format of the DestroyCacheView method is: % % CacheView *DestroyCacheView(CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport CacheView *DestroyCacheView(CacheView *cache_view) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); if (cache_view->nexus_info != (NexusInfo **) NULL) cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info, cache_view->number_threads); cache_view->image=DestroyImage(cache_view->image); cache_view->signature=(~MagickCoreSignature); cache_view=(CacheView *) RelinquishAlignedMemory(cache_view); return(cache_view); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w A u t h e n t i c P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel % cache as defined by the geometry parameters. A pointer to the pixels is % returned if the pixels are transferred, otherwise a NULL is returned. % % The format of the GetCacheViewAuthenticPixels method is: % % Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view, % const ssize_t x,const ssize_t y,const size_t columns, % const size_t rows,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y,columns,rows: These values define the perimeter of a region of % pixels. % % o exception: return any errors or warnings in this structure. % */ MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); Quantum *magick_restrict pixels; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, cache_view->nexus_info[id],exception); return(pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w A u t h e n t i c M e t a c o n t e n t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewAuthenticMetacontent() returns the meta-content corresponding % with the last call to SetCacheViewIndexes() or % GetCacheViewAuthenticMetacontent(). The meta-content are authentic and can % be updated. % % The format of the GetCacheViewAuthenticMetacontent() method is: % % void *GetCacheViewAuthenticMetacontent(CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport void *GetCacheViewAuthenticMetacontent(CacheView *cache_view) { const int id = GetOpenMPThreadId(); assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(cache_view->image->cache != (Cache) NULL); assert(id < (int) cache_view->number_threads); return(cache_view->nexus_info[id]->metacontent); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w A u t h e n t i c P i x e l Q u e u e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewAuthenticPixelQueue() returns the pixels associated with the % last call to QueueCacheViewAuthenticPixels() or % GetCacheViewAuthenticPixels(). The pixels are authentic and therefore can be % updated. % % The format of the GetCacheViewAuthenticPixelQueue() method is: % % Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) { const int id = GetOpenMPThreadId(); assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(cache_view->image->cache != (Cache) NULL); assert(id < (int) cache_view->number_threads); return(cache_view->nexus_info[id]->pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w C o l o r s p a c e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewColorspace() returns the image colorspace associated with the % specified view. % % The format of the GetCacheViewColorspace method is: % % ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); return(GetPixelCacheColorspace(cache_view->image->cache)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + G e t C a c h e V i e w E x t e n t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewExtent() returns the extent of the pixels associated with the % last call to QueueCacheViewAuthenticPixels() or % GetCacheViewAuthenticPixels(). % % The format of the GetCacheViewExtent() method is: % % MagickSizeType GetCacheViewExtent(const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view) { const int id = GetOpenMPThreadId(); MagickSizeType extent; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); assert(cache_view->image->cache != (Cache) NULL); assert(id < (int) cache_view->number_threads); extent=GetPixelCacheNexusExtent(cache_view->image->cache, cache_view->nexus_info[id]); return(extent); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w I m a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewImage() returns the image associated with the specified view. % % The format of the GetCacheViewImage method is: % % const Image *GetCacheViewImage(const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport const Image *GetCacheViewImage(const CacheView *cache_view) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); return(cache_view->image); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w S t o r a g e C l a s s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewStorageClass() returns the image storage class associated with % the specified view. % % The format of the GetCacheViewStorageClass method is: % % ClassType GetCacheViewStorageClass(const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); return(GetPixelCacheStorageClass(cache_view->image->cache)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w V i r t u a l M e t a c o n t e n t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewVirtualMetacontent() returns the meta-content corresponding % with the last call to GetCacheViewVirtualMetacontent(). The meta-content % is virtual and therefore cannot be updated. % % The format of the GetCacheViewVirtualMetacontent() method is: % % const void *GetCacheViewVirtualMetacontent( % const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport const void *GetCacheViewVirtualMetacontent( const CacheView *cache_view) { const int id = GetOpenMPThreadId(); const void *magick_restrict metacontent; assert(cache_view != (const CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(cache_view->image->cache != (Cache) NULL); assert(id < (int) cache_view->number_threads); metacontent=GetVirtualMetacontentFromNexus(cache_view->image->cache, cache_view->nexus_info[id]); return(metacontent); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w V i r t u a l P i x e l Q u e u e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewVirtualPixelQueue() returns the the pixels associated with % the last call to GetCacheViewVirtualPixels(). The pixels are virtual % and therefore cannot be updated. % % The format of the GetCacheViewVirtualPixelQueue() method is: % % const Quantum *GetCacheViewVirtualPixelQueue( % const CacheView *cache_view) % % A description of each parameter follows: % % o cache_view: the cache view. % */ MagickExport const Quantum *GetCacheViewVirtualPixelQueue( const CacheView *cache_view) { const int id = GetOpenMPThreadId(); const Quantum *magick_restrict pixels; assert(cache_view != (const CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(cache_view->image->cache != (Cache) NULL); assert(id < (int) cache_view->number_threads); pixels=GetVirtualPixelsNexus(cache_view->image->cache, cache_view->nexus_info[id]); return(pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C a c h e V i e w V i r t u a l P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or % disk pixel cache as defined by the geometry parameters. A pointer to the % pixels is returned if the pixels are transferred, otherwise a NULL is % returned. % % The format of the GetCacheViewVirtualPixels method is: % % const Quantum *GetCacheViewVirtualPixels( % const CacheView *cache_view,const ssize_t x,const ssize_t y, % const size_t columns,const size_t rows,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y,columns,rows: These values define the perimeter of a region of % pixels. % % o exception: return any errors or warnings in this structure. % */ MagickExport const Quantum *GetCacheViewVirtualPixels( const CacheView *cache_view,const ssize_t x,const ssize_t y, const size_t columns,const size_t rows,ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); const Quantum *magick_restrict pixels; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); pixels=GetVirtualPixelsFromNexus(cache_view->image, cache_view->virtual_pixel_method,x,y,columns,rows, cache_view->nexus_info[id],exception); return(pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t O n e C a c h e V i e w A u t h e n t i c P i x e l % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y) % location. The image background color is returned if an error occurs. % % The format of the GetOneCacheViewAuthenticPixel method is: % % MagickBooleaNType GetOneCacheViewAuthenticPixel( % const CacheView *cache_view,const ssize_t x,const ssize_t y, % Quantum *pixel,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y: These values define the offset of the pixel. % % o pixel: return a pixel at the specified (x,y) location. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel( const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel, ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); Quantum *magick_restrict q; register ssize_t i; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); q=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1, cache_view->nexus_info[id],exception); if (q == (const Quantum *) NULL) { PixelInfo background_color; background_color=cache_view->image->background_color; pixel[RedPixelChannel]=ClampToQuantum(background_color.red); pixel[GreenPixelChannel]=ClampToQuantum(background_color.green); pixel[BluePixelChannel]=ClampToQuantum(background_color.blue); pixel[BlackPixelChannel]=ClampToQuantum(background_color.black); pixel[AlphaPixelChannel]=ClampToQuantum(background_color.alpha); return(MagickFalse); } for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) { PixelChannel channel = GetPixelChannelChannel(cache_view->image,i); pixel[channel]=q[i]; } return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t O n e C a c h e V i e w V i r t u a l P i x e l % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y) % location. The image background color is returned if an error occurs. If % you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead. % % The format of the GetOneCacheViewVirtualPixel method is: % % MagickBooleanType GetOneCacheViewVirtualPixel( % const CacheView *cache_view,const ssize_t x,const ssize_t y, % Quantum *pixel,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y: These values define the offset of the pixel. % % o pixel: return a pixel at the specified (x,y) location. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType GetOneCacheViewVirtualPixel( const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel, ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); register const Quantum *magick_restrict p; register ssize_t i; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); p=GetVirtualPixelsFromNexus(cache_view->image, cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id], exception); if (p == (const Quantum *) NULL) { PixelInfo background_color; background_color=cache_view->image->background_color; pixel[RedPixelChannel]=ClampToQuantum(background_color.red); pixel[GreenPixelChannel]=ClampToQuantum(background_color.green); pixel[BluePixelChannel]=ClampToQuantum(background_color.blue); pixel[BlackPixelChannel]=ClampToQuantum(background_color.black); pixel[AlphaPixelChannel]=ClampToQuantum(background_color.alpha); return(MagickFalse); } for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) { PixelChannel channel = GetPixelChannelChannel(cache_view->image,i); pixel[channel]=p[i]; } return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t O n e C a c h e V i e w V i r t u a l P i x e l I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetOneCacheViewVirtualPixelInfo() returns a single pixel at the specified % (x,y) location. The image background color is returned if an error occurs. % If you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead. % % The format of the GetOneCacheViewVirtualPixelInfo method is: % % MagickBooleanType GetOneCacheViewVirtualPixelInfo( % const CacheView *cache_view,const ssize_t x,const ssize_t y, % PixelInfo *pixel,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y: These values define the offset of the pixel. % % o pixel: return a pixel at the specified (x,y) location. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType GetOneCacheViewVirtualPixelInfo( const CacheView *cache_view,const ssize_t x,const ssize_t y,PixelInfo *pixel, ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); register const Quantum *magick_restrict p; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); GetPixelInfo(cache_view->image,pixel); p=GetVirtualPixelsFromNexus(cache_view->image, cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id], exception); if (p == (const Quantum *) NULL) return(MagickFalse); GetPixelInfoPixel(cache_view->image,p,pixel); return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t O n e C a c h e V i e w V i r t u a l P i x e l % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at % the specified (x,y) location. The image background color is returned if an % error occurs. If you plan to modify the pixel, use % GetOneCacheViewAuthenticPixel() instead. % % The format of the GetOneCacheViewVirtualPixel method is: % % MagickBooleanType GetOneCacheViewVirtualMethodPixel( % const CacheView *cache_view, % const VirtualPixelMethod virtual_pixel_method,const ssize_t x, % const ssize_t y,Quantum *pixel,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o virtual_pixel_method: the virtual pixel method. % % o x,y: These values define the offset of the pixel. % % o pixel: return a pixel at the specified (x,y) location. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel( const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method, const ssize_t x,const ssize_t y,Quantum *pixel,ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); const Quantum *magick_restrict p; register ssize_t i; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); p=GetVirtualPixelsFromNexus(cache_view->image,virtual_pixel_method,x,y,1,1, cache_view->nexus_info[id],exception); if (p == (const Quantum *) NULL) { PixelInfo background_color; background_color=cache_view->image->background_color; pixel[RedPixelChannel]=ClampToQuantum(background_color.red); pixel[GreenPixelChannel]=ClampToQuantum(background_color.green); pixel[BluePixelChannel]=ClampToQuantum(background_color.blue); pixel[BlackPixelChannel]=ClampToQuantum(background_color.black); pixel[AlphaPixelChannel]=ClampToQuantum(background_color.alpha); return(MagickFalse); } for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) { PixelChannel channel = GetPixelChannelChannel(cache_view->image,i); pixel[channel]=p[i]; } return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % Q u e u e C a c h e V i e w A u t h e n t i c P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or % disk pixel cache as defined by the geometry parameters. A pointer to the % pixels is returned if the pixels are transferred, otherwise a NULL is % returned. % % The format of the QueueCacheViewAuthenticPixels method is: % % Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view, % const ssize_t x,const ssize_t y,const size_t columns, % const size_t rows,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o x,y,columns,rows: These values define the perimeter of a region of % pixels. % % o exception: return any errors or warnings in this structure. % */ MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); Quantum *magick_restrict pixels; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); pixels=QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, MagickFalse,cache_view->nexus_info[id],exception); return(pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t C a c h e V i e w S t o r a g e C l a s s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetCacheViewStorageClass() sets the image storage class associated with % the specified view. % % The format of the SetCacheViewStorageClass method is: % % MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, % const ClassType storage_class,ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o storage_class: the image storage class: PseudoClass or DirectClass. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, const ClassType storage_class,ExceptionInfo *exception) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); return(SetImageStorageClass(cache_view->image,storage_class,exception)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t C a c h e V i e w V i r t u a l P i x e l M e t h o d % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated % with the specified cache view. % % The format of the SetCacheViewVirtualPixelMethod method is: % % MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view, % const VirtualPixelMethod virtual_pixel_method) % % A description of each parameter follows: % % o cache_view: the cache view. % % o virtual_pixel_method: the virtual pixel method. % */ MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod( CacheView *magick_restrict cache_view, const VirtualPixelMethod virtual_pixel_method) { assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); if (cache_view->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", cache_view->image->filename); cache_view->virtual_pixel_method=virtual_pixel_method; return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S y n c C a c h e V i e w A u t h e n t i c P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory % or disk cache. It returns MagickTrue if the pixel region is flushed, % otherwise MagickFalse. % % The format of the SyncCacheViewAuthenticPixels method is: % % MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view, % ExceptionInfo *exception) % % A description of each parameter follows: % % o cache_view: the cache view. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType SyncCacheViewAuthenticPixels( CacheView *magick_restrict cache_view,ExceptionInfo *exception) { const int id = GetOpenMPThreadId(); MagickBooleanType status; assert(cache_view != (CacheView *) NULL); assert(cache_view->signature == MagickCoreSignature); assert(id < (int) cache_view->number_threads); status=SyncAuthenticPixelCacheNexus(cache_view->image, cache_view->nexus_info[id],exception); return(status); }