]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/cache-view.c
(no commit message)
[imagemagick] / MagickCore / cache-view.c
index 25fe60b653e35d2af8ae59d4effda0c03d1332ca..e26d2ee9907be53d2d8dd6295fc1c8c58c0c7192 100644 (file)
@@ -23,7 +23,7 @@
 %                               February 2000                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2012 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  %
 #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"
 \f
@@ -86,25 +88,70 @@ struct _CacheView
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   A c q u i r e C a c h e V i e w                                           %
+%   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                         %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  AcquireCacheView() acquires a view into the pixel cache, using the
-%  VirtualPixelMethod that is defined within the given image itself.
+%  AcquireAuthenticCacheView() acquires an authentic view into the pixel cache.
 %
-%  The format of the AcquireCacheView method is:
+%  The format of the AcquireAuthenticCacheView method is:
 %
-%      CacheView *AcquireCacheView(const Image *image)
+%      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
+    *cache_view;
+
+  MagickBooleanType
+    status;
+
+  cache_view=AcquireVirtualCacheView(image,exception);
+  status=SyncImagePixelCache(cache_view->image,exception);
+  if (status == MagickFalse)
+    ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView");
+  return(cache_view);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   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.
+%
+%  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 *AcquireCacheView(const Image *image)
+MagickExport CacheView *AcquireVirtualCacheView(const Image *image,
+  ExceptionInfo *exception)
 {
   CacheView
     *cache_view;
@@ -113,12 +160,14 @@ MagickExport CacheView *AcquireCacheView(const Image *image)
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  cache_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*cache_view));
+  (void) exception;
+  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();
+  cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource);
   cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
   cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image);
   cache_view->debug=IsEventLogging();
@@ -160,7 +209,8 @@ MagickExport CacheView *CloneCacheView(const CacheView *cache_view)
   if (cache_view->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       cache_view->image->filename);
-  clone_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*clone_view));
+  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));
@@ -208,7 +258,7 @@ MagickExport CacheView *DestroyCacheView(CacheView *cache_view)
       cache_view->number_threads);
   cache_view->image=DestroyImage(cache_view->image);
   cache_view->signature=(~MagickSignature);
-  cache_view=(CacheView *) RelinquishMagickMemory(cache_view);
+  cache_view=(CacheView *) RelinquishAlignedMemory(cache_view);
   return(cache_view);
 }
 \f
@@ -217,32 +267,48 @@ MagickExport CacheView *DestroyCacheView(CacheView *cache_view)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   G e t C a c h e V i e w C o l o r s p a c e                               %
+%   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                     %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewColorspace() returns the image colorspace associated with the
-%  specified view.
+%  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 GetCacheViewColorspace method is:
+%  The format of the GetCacheViewAuthenticPixels method is:
 %
-%      ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
+%      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 ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
+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
+    *pixels;
+
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  if (cache_view->debug != MagickFalse)
-    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
-      cache_view->image->filename);
-  return(GetPixelCacheColorspace(cache_view->image->cache));
+  assert(id < (int) cache_view->number_threads);
+  pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
+    cache_view->nexus_info[id],exception);
+  return(pixels);
 }
 \f
 /*
@@ -250,32 +316,41 @@ MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   G e t C a c h e V i e w E x c e p t i o n                                 %
+%   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           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewException() returns the image exception associated with the
-%  specified view.
+%  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 GetCacheViewException method is:
+%  The format of the GetCacheViewAuthenticMetacontent() method is:
 %
-%      ExceptionInfo GetCacheViewException(const CacheView *cache_view)
+%      void *GetCacheViewAuthenticMetacontent(CacheView *cache_view)
 %
 %  A description of each parameter follows:
 %
 %    o cache_view: the cache view.
 %
 */
-MagickExport ExceptionInfo *GetCacheViewException(const CacheView *cache_view)
+MagickExport void *GetCacheViewAuthenticMetacontent(CacheView *cache_view)
 {
+  const int
+    id = GetOpenMPThreadId();
+
+  void
+    *metacontent;
+
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  if (cache_view->debug != MagickFalse)
-    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
-      cache_view->image->filename);
-  return(&cache_view->image->exception);
+  assert(cache_view->image->cache != (Cache) NULL);
+  assert(id < (int) cache_view->number_threads);
+  metacontent=GetPixelCacheNexusMetacontent(cache_view->image->cache,
+    cache_view->nexus_info[id]);
+  return(metacontent);
 }
 \f
 /*
@@ -283,43 +358,41 @@ MagickExport ExceptionInfo *GetCacheViewException(const CacheView *cache_view)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+   G e t C a c h e V i e w E x t e n t                                       %
+%   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             %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewExtent() returns the extent of the pixels associated with the
+%  GetCacheViewAuthenticPixelQueue() returns the pixels associated with the
 %  last call to QueueCacheViewAuthenticPixels() or
-%  GetCacheViewAuthenticPixels().
+%  GetCacheViewAuthenticPixels().  The pixels are authentic and therefore can be
+%  updated.
 %
-%  The format of the GetCacheViewExtent() method is:
+%  The format of the GetCacheViewAuthenticPixelQueue() method is:
 %
-%      MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
+%      Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
 %
 %  A description of each parameter follows:
 %
 %    o cache_view: the cache view.
 %
 */
-MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
+MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
 {
   const int
     id = GetOpenMPThreadId();
 
-  MagickSizeType
-    extent;
+  Quantum
+    *pixels;
 
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  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,
+  pixels=GetPixelCacheNexusPixels(cache_view->image->cache,
     cache_view->nexus_info[id]);
-  return(extent);
+  return(pixels);
 }
 \f
 /*
@@ -327,32 +400,32 @@ MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   G e t C a c h e V i e w S t o r a g e C l a s s                           %
+%   G e t C a c h e V i e w C o l o r s p a c e                               %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewStorageClass() returns the image storage class  associated with
-%  the specified view.
+%  GetCacheViewColorspace() returns the image colorspace associated with the
+%  specified view.
 %
-%  The format of the GetCacheViewStorageClass method is:
+%  The format of the GetCacheViewColorspace method is:
 %
-%      ClassType GetCacheViewStorageClass(const CacheView *cache_view)
+%      ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
 %
 %  A description of each parameter follows:
 %
 %    o cache_view: the cache view.
 %
 */
-MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view)
+MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
 {
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
   if (cache_view->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       cache_view->image->filename);
-  return(GetPixelCacheStorageClass(cache_view->image->cache));
+  return(GetPixelCacheColorspace(cache_view->image->cache));
 }
 \f
 /*
@@ -360,46 +433,43 @@ MagickExport ClassType GetCacheViewStorageClass(const CacheView *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                     %
++   G e t C a c h e V i e w E x t e n t                                       %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  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.
+%  GetCacheViewExtent() returns the extent of the pixels associated with the
+%  last call to QueueCacheViewAuthenticPixels() or
+%  GetCacheViewAuthenticPixels().
 %
-%  The format of the GetCacheViewAuthenticPixels method is:
+%  The format of the GetCacheViewExtent() 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)
+%      MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
 %
 %  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.
-%
 */
-MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
-  const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
-  ExceptionInfo *exception)
+MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
 {
   const int
     id = GetOpenMPThreadId();
 
-  Quantum
-    *pixels;
+  MagickSizeType
+    extent;
 
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
+  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);
-  pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
-    cache_view->nexus_info[id],exception);
-  return(pixels);
+  extent=GetPixelCacheNexusExtent(cache_view->image->cache,
+    cache_view->nexus_info[id]);
+  return(extent);
 }
 \f
 /*
@@ -407,42 +477,31 @@ MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   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           %
+%   G e t C a c h e V i e w I m a g e                                         %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewAuthenticMetacontent() returns the meta-content corresponding
-%  with the last call to SetCacheViewIndexes() or
-%  GetCacheViewAuthenticMetacontent().  The meta-content are authentic and can
-%  be updated.
+%  GetCacheViewImage() returns the image associated with the specified view.
 %
-%  The format of the GetCacheViewAuthenticMetacontent() method is:
+%  The format of the GetCacheViewImage method is:
 %
-%      void *GetCacheViewAuthenticMetacontent(CacheView *cache_view)
+%      const Image *GetCacheViewImage(const CacheView *cache_view)
 %
 %  A description of each parameter follows:
 %
 %    o cache_view: the cache view.
 %
 */
-MagickExport void *GetCacheViewAuthenticMetacontent(
-  CacheView *cache_view)
+MagickExport const Image *GetCacheViewImage(const CacheView *cache_view)
 {
-  const int
-    id = GetOpenMPThreadId();
-
-  void
-    *metacontent;
-
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  assert(cache_view->image->cache != (Cache) NULL);
-  assert(id < (int) cache_view->number_threads);
-  metacontent=GetPixelCacheNexusMetacontent(cache_view->image->cache,
-    cache_view->nexus_info[id]);
-  return(metacontent);
+  if (cache_view->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+      cache_view->image->filename);
+  return(cache_view->image);
 }
 \f
 /*
@@ -450,41 +509,32 @@ MagickExport void *GetCacheViewAuthenticMetacontent(
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   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             %
+%   G e t C a c h e V i e w S t o r a g e C l a s s                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetCacheViewAuthenticPixelQueue() returns the pixels associated with the
-%  last call to QueueCacheViewAuthenticPixels() or
-%  GetCacheViewAuthenticPixels().  The pixels are authentic and therefore can be
-%  updated.
+%  GetCacheViewStorageClass() returns the image storage class associated with
+%  the specified view.
 %
-%  The format of the GetCacheViewAuthenticPixelQueue() method is:
+%  The format of the GetCacheViewStorageClass method is:
 %
-%      Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
+%      ClassType GetCacheViewStorageClass(const CacheView *cache_view)
 %
 %  A description of each parameter follows:
 %
 %    o cache_view: the cache view.
 %
 */
-MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
+MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view)
 {
-  const int
-    id = GetOpenMPThreadId();
-
-  Quantum
-    *pixels;
-
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  assert(cache_view->image->cache != (Cache) NULL);
-  assert(id < (int) cache_view->number_threads);
-  pixels=GetPixelCacheNexusPixels(cache_view->image->cache,
-    cache_view->nexus_info[id]);
-  return(pixels);
+  if (cache_view->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+      cache_view->image->filename);
+  return(GetPixelCacheStorageClass(cache_view->image->cache));
 }
 \f
 /*
@@ -642,7 +692,7 @@ MagickExport const Quantum *GetCacheViewVirtualPixels(
 %
 %      MagickBooleaNType GetOneCacheViewAuthenticPixel(
 %        const CacheView *cache_view,const ssize_t x,const ssize_t y,
-%        PixelPacket *pixel,ExceptionInfo *exception)
+%        Quantum *pixel,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -656,8 +706,8 @@ MagickExport const Quantum *GetCacheViewVirtualPixels(
 %
 */
 MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
-  const CacheView *cache_view,const ssize_t x,const ssize_t y,
-  PixelPacket *pixel,ExceptionInfo *exception)
+  const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel,
+  ExceptionInfo *exception)
 {
   const int
     id = GetOpenMPThreadId();
@@ -665,17 +715,36 @@ MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
   Quantum
     *p;
 
+  register ssize_t
+    i;
+
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  *pixel=cache_view->image->background_color;
   assert(id < (int) cache_view->number_threads);
+  (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel));
   p=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1,
     cache_view->nexus_info[id],exception);
   if (p == (const Quantum *) NULL)
-    return(MagickFalse);
-  GetPixelPacket(cache_view->image,p,pixel);
-  if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
-    pixel->black=GetPixelBlack(cache_view->image,p);
+    {
+      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;
+
+    channel=GetPixelChannelMapChannel(cache_view->image,i);
+    pixel[channel]=p[i];
+  }
   return(MagickTrue);
 }
 \f
@@ -698,7 +767,7 @@ MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
 %
 %      MagickBooleanType GetOneCacheViewVirtualPixel(
 %        const CacheView *cache_view,const ssize_t x,const ssize_t y,
-%        PixelPacket *pixel,ExceptionInfo *exception)
+%        Quantum *pixel,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -712,27 +781,101 @@ MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
 %
 */
 MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
-  const CacheView *cache_view,const ssize_t x,const ssize_t y,
-  PixelPacket *pixel,ExceptionInfo *exception)
+  const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel,
+  ExceptionInfo *exception)
 {
   const int
     id = GetOpenMPThreadId();
 
-  const Quantum
+  register const Quantum
     *p;
 
+  register ssize_t
+    i;
+
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  *pixel=cache_view->image->background_color;
   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;
+
+    channel=GetPixelChannelMapChannel(cache_view->image,i);
+    pixel[channel]=p[i];
+  }
+  return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   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
+    *p;
+
+  assert(cache_view != (CacheView *) NULL);
+  assert(cache_view->signature == MagickSignature);
+  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);
-  GetPixelPacket(cache_view->image,p,pixel);
-  if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
-    pixel->black=GetPixelBlack(cache_view->image,p);
+  GetPixelInfoPixel(cache_view->image,p,pixel);
   return(MagickTrue);
 }
 \f
@@ -757,7 +900,7 @@ MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
 %      MagickBooleanType GetOneCacheViewVirtualMethodPixel(
 %        const CacheView *cache_view,
 %        const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
-%        const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
+%        const ssize_t y,Quantum *pixel,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -774,7 +917,7 @@ MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
 */
 MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
   const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method,
-  const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
+  const ssize_t x,const ssize_t y,Quantum *pixel,ExceptionInfo *exception)
 {
   const int
     id = GetOpenMPThreadId();
@@ -782,17 +925,36 @@ MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
   const Quantum
     *p;
 
+  register ssize_t
+    i;
+
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
-  *pixel=cache_view->image->background_color;
   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)
-    return(MagickFalse);
-  GetPixelPacket(cache_view->image,p,pixel);
-  if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
-    pixel->black=GetPixelBlack(cache_view->image,p);
+    {
+      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;
+
+    channel=GetPixelChannelMapChannel(cache_view->image,i);
+    pixel[channel]=p[i];
+  }
   return(MagickTrue);
 }
 \f
@@ -841,8 +1003,8 @@ MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
   assert(id < (int) cache_view->number_threads);
-  pixels=QueueAuthenticNexus(cache_view->image,x,y,columns,rows,
-    cache_view->nexus_info[id],exception);
+  pixels=QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
+    MagickFalse,cache_view->nexus_info[id],exception);
   return(pixels);
 }
 \f
@@ -863,7 +1025,7 @@ MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
 %  The format of the SetCacheViewStorageClass method is:
 %
 %      MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
-%        const ClassType storage_class)
+%        const ClassType storage_class,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -871,16 +1033,18 @@ MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *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)
+  const ClassType storage_class,ExceptionInfo *exception)
 {
   assert(cache_view != (CacheView *) NULL);
   assert(cache_view->signature == MagickSignature);
   if (cache_view->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       cache_view->image->filename);
-  return(SetImageStorageClass(cache_view->image,storage_class));
+  return(SetImageStorageClass(cache_view->image,storage_class,exception));
 }
 \f
 /*