You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1116 lines
45 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% 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-2021 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://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) memset(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) memset(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 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=GetVirtualPixelCacheNexus(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;
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();
const Quantum
*magick_restrict p;
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=GetVirtualPixelCacheNexus(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();
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=GetVirtualPixelCacheNexus(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;
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=GetVirtualPixelCacheNexus(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);
}