cache-view.c revision e2a912b6c9086c98ec838baa0824cd8deca55538
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%                      CCCC   AAA    CCCC  H   H  EEEEE                       %
7%                     C      A   A  C      H   H  E                           %
8%                     C      AAAAA  C      HHHHH  EEE                         %
9%                     C      A   A  C      H   H  E                           %
10%                      CCCC  A   A   CCCC  H   H  EEEEE                       %
11%                                                                             %
12%                        V   V  IIIII  EEEEE  W   W                           %
13%                        V   V    I    E      W   W                           %
14%                        V   V    I    EEE    W W W                           %
15%                         V V     I    E      WW WW                           %
16%                          V    IIIII  EEEEE  W   W                           %
17%                                                                             %
18%                                                                             %
19%                        MagickCore Cache View Methods                        %
20%                                                                             %
21%                              Software Design                                %
22%                                John Cristy                                  %
23%                               February 2000                                 %
24%                                                                             %
25%                                                                             %
26%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
27%  dedicated to making software imaging solutions freely available.           %
28%                                                                             %
29%  You may not use this file except in compliance with the License.  You may  %
30%  obtain a copy of the License at                                            %
31%                                                                             %
32%    http://www.imagemagick.org/script/license.php                            %
33%                                                                             %
34%  Unless required by applicable law or agreed to in writing, software        %
35%  distributed under the License is distributed on an "AS IS" BASIS,          %
36%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
37%  See the License for the specific language governing permissions and        %
38%  limitations under the License.                                             %
39%                                                                             %
40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41%
42%
43%
44*/
45
46/*
47  Include declarations.
48*/
49#include "MagickCore/studio.h"
50#include "MagickCore/cache.h"
51#include "MagickCore/cache-private.h"
52#include "MagickCore/cache-view.h"
53#include "MagickCore/memory_.h"
54#include "MagickCore/exception.h"
55#include "MagickCore/exception-private.h"
56#include "MagickCore/pixel-accessor.h"
57#include "MagickCore/string_.h"
58#include "MagickCore/thread-private.h"
59
60/*
61  Typedef declarations.
62*/
63struct _CacheView
64{
65  Image
66    *image;
67
68  VirtualPixelMethod
69    virtual_pixel_method;
70
71  size_t
72    number_threads;
73
74  NexusInfo
75    **nexus_info;
76
77  MagickBooleanType
78    debug;
79
80  size_t
81    signature;
82};
83
84/*
85%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86%                                                                             %
87%                                                                             %
88%                                                                             %
89%   A c q u i r e C a c h e V i e w                                           %
90%                                                                             %
91%                                                                             %
92%                                                                             %
93%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94%
95%  AcquireCacheView() acquires a view into the pixel cache, using the
96%  VirtualPixelMethod that is defined within the given image itself.
97%
98%  The format of the AcquireCacheView method is:
99%
100%      CacheView *AcquireCacheView(const Image *image)
101%
102%  A description of each parameter follows:
103%
104%    o image: the image.
105%
106*/
107MagickExport CacheView *AcquireCacheView(const Image *image)
108{
109  CacheView
110    *cache_view;
111
112  assert(image != (Image *) NULL);
113  assert(image->signature == MagickSignature);
114  if (image->debug != MagickFalse)
115    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
116  cache_view=(CacheView *) AcquireQuantumMemory(1,sizeof(*cache_view));
117  if (cache_view == (CacheView *) NULL)
118    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
119  (void) ResetMagickMemory(cache_view,0,sizeof(*cache_view));
120  cache_view->image=ReferenceImage((Image *) image);
121  cache_view->number_threads=GetOpenMPMaximumThreads();
122  cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
123  cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image);
124  cache_view->debug=IsEventLogging();
125  cache_view->signature=MagickSignature;
126  if (cache_view->nexus_info == (NexusInfo **) NULL)
127    ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView");
128  return(cache_view);
129}
130
131/*
132%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
133%                                                                             %
134%                                                                             %
135%                                                                             %
136%   C l o n e C a c h e V i e w                                               %
137%                                                                             %
138%                                                                             %
139%                                                                             %
140%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141%
142%  CloneCacheView()  makes an exact copy of the specified cache view.
143%
144%  The format of the CloneCacheView method is:
145%
146%      CacheView *CloneCacheView(const CacheView *cache_view)
147%
148%  A description of each parameter follows:
149%
150%    o cache_view: the cache view.
151%
152*/
153MagickExport CacheView *CloneCacheView(const CacheView *cache_view)
154{
155  CacheView
156    *clone_view;
157
158  assert(cache_view != (CacheView *) NULL);
159  assert(cache_view->signature == MagickSignature);
160  if (cache_view->debug != MagickFalse)
161    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
162      cache_view->image->filename);
163  clone_view=(CacheView *) AcquireQuantumMemory(1,sizeof(*clone_view));
164  if (clone_view == (CacheView *) NULL)
165    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
166  (void) ResetMagickMemory(clone_view,0,sizeof(*clone_view));
167  clone_view->image=ReferenceImage(cache_view->image);
168  clone_view->number_threads=cache_view->number_threads;
169  clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads);
170  clone_view->virtual_pixel_method=cache_view->virtual_pixel_method;
171  clone_view->debug=cache_view->debug;
172  clone_view->signature=MagickSignature;
173  return(clone_view);
174}
175
176/*
177%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
178%                                                                             %
179%                                                                             %
180%                                                                             %
181%   D e s t r o y C a c h e V i e w                                           %
182%                                                                             %
183%                                                                             %
184%                                                                             %
185%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186%
187%  DestroyCacheView() destroys the specified view returned by a previous call
188%  to AcquireCacheView().
189%
190%  The format of the DestroyCacheView method is:
191%
192%      CacheView *DestroyCacheView(CacheView *cache_view)
193%
194%  A description of each parameter follows:
195%
196%    o cache_view: the cache view.
197%
198*/
199MagickExport CacheView *DestroyCacheView(CacheView *cache_view)
200{
201  assert(cache_view != (CacheView *) NULL);
202  assert(cache_view->signature == MagickSignature);
203  if (cache_view->debug != MagickFalse)
204    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
205      cache_view->image->filename);
206  if (cache_view->nexus_info != (NexusInfo **) NULL)
207    cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info,
208      cache_view->number_threads);
209  cache_view->image=DestroyImage(cache_view->image);
210  cache_view->signature=(~MagickSignature);
211  cache_view=(CacheView *) RelinquishMagickMemory(cache_view);
212  return(cache_view);
213}
214
215/*
216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
217%                                                                             %
218%                                                                             %
219%                                                                             %
220%   G e t C a c h e V i e w C o l o r s p a c e                               %
221%                                                                             %
222%                                                                             %
223%                                                                             %
224%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
225%
226%  GetCacheViewColorspace() returns the image colorspace associated with the
227%  specified view.
228%
229%  The format of the GetCacheViewColorspace method is:
230%
231%      ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
232%
233%  A description of each parameter follows:
234%
235%    o cache_view: the cache view.
236%
237*/
238MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view)
239{
240  assert(cache_view != (CacheView *) NULL);
241  assert(cache_view->signature == MagickSignature);
242  if (cache_view->debug != MagickFalse)
243    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
244      cache_view->image->filename);
245  return(GetPixelCacheColorspace(cache_view->image->cache));
246}
247
248/*
249%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
250%                                                                             %
251%                                                                             %
252%                                                                             %
253+   G e t C a c h e V i e w E x t e n t                                       %
254%                                                                             %
255%                                                                             %
256%                                                                             %
257%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
258%
259%  GetCacheViewExtent() returns the extent of the pixels associated with the
260%  last call to QueueCacheViewAuthenticPixels() or
261%  GetCacheViewAuthenticPixels().
262%
263%  The format of the GetCacheViewExtent() method is:
264%
265%      MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
266%
267%  A description of each parameter follows:
268%
269%    o cache_view: the cache view.
270%
271*/
272MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
273{
274  const int
275    id = GetOpenMPThreadId();
276
277  MagickSizeType
278    extent;
279
280  assert(cache_view != (CacheView *) NULL);
281  assert(cache_view->signature == MagickSignature);
282  if (cache_view->debug != MagickFalse)
283    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
284      cache_view->image->filename);
285  assert(cache_view->image->cache != (Cache) NULL);
286  assert(id < (int) cache_view->number_threads);
287  extent=GetPixelCacheNexusExtent(cache_view->image->cache,
288    cache_view->nexus_info[id]);
289  return(extent);
290}
291
292/*
293%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
294%                                                                             %
295%                                                                             %
296%                                                                             %
297%   G e t C a c h e V i e w S t o r a g e C l a s s                           %
298%                                                                             %
299%                                                                             %
300%                                                                             %
301%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
302%
303%  GetCacheViewStorageClass() returns the image storage class  associated with
304%  the specified view.
305%
306%  The format of the GetCacheViewStorageClass method is:
307%
308%      ClassType GetCacheViewStorageClass(const CacheView *cache_view)
309%
310%  A description of each parameter follows:
311%
312%    o cache_view: the cache view.
313%
314*/
315MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view)
316{
317  assert(cache_view != (CacheView *) NULL);
318  assert(cache_view->signature == MagickSignature);
319  if (cache_view->debug != MagickFalse)
320    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
321      cache_view->image->filename);
322  return(GetPixelCacheStorageClass(cache_view->image->cache));
323}
324
325/*
326%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
327%                                                                             %
328%                                                                             %
329%                                                                             %
330%   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                     %
331%                                                                             %
332%                                                                             %
333%                                                                             %
334%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
335%
336%  GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel
337%  cache as defined by the geometry parameters.   A pointer to the pixels is
338%  returned if the pixels are transferred, otherwise a NULL is returned.
339%
340%  The format of the GetCacheViewAuthenticPixels method is:
341%
342%      Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
343%        const ssize_t x,const ssize_t y,const size_t columns,
344%        const size_t rows,ExceptionInfo *exception)
345%
346%  A description of each parameter follows:
347%
348%    o cache_view: the cache view.
349%
350%    o x,y,columns,rows:  These values define the perimeter of a region of
351%      pixels.
352%
353*/
354MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
355  const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
356  ExceptionInfo *exception)
357{
358  const int
359    id = GetOpenMPThreadId();
360
361  Quantum
362    *pixels;
363
364  assert(cache_view != (CacheView *) NULL);
365  assert(cache_view->signature == MagickSignature);
366  assert(id < (int) cache_view->number_threads);
367  pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
368    cache_view->nexus_info[id],exception);
369  return(pixels);
370}
371
372/*
373%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
374%                                                                             %
375%                                                                             %
376%                                                                             %
377%   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           %
378%                                                                             %
379%                                                                             %
380%                                                                             %
381%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
382%
383%  GetCacheViewAuthenticMetacontent() returns the meta-content corresponding
384%  with the last call to SetCacheViewIndexes() or
385%  GetCacheViewAuthenticMetacontent().  The meta-content are authentic and can
386%  be updated.
387%
388%  The format of the GetCacheViewAuthenticMetacontent() method is:
389%
390%      void *GetCacheViewAuthenticMetacontent(CacheView *cache_view)
391%
392%  A description of each parameter follows:
393%
394%    o cache_view: the cache view.
395%
396*/
397MagickExport void *GetCacheViewAuthenticMetacontent(
398  CacheView *cache_view)
399{
400  const int
401    id = GetOpenMPThreadId();
402
403  void
404    *metacontent;
405
406  assert(cache_view != (CacheView *) NULL);
407  assert(cache_view->signature == MagickSignature);
408  assert(cache_view->image->cache != (Cache) NULL);
409  assert(id < (int) cache_view->number_threads);
410  metacontent=GetPixelCacheNexusMetacontent(cache_view->image->cache,
411    cache_view->nexus_info[id]);
412  return(metacontent);
413}
414
415/*
416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
417%                                                                             %
418%                                                                             %
419%                                                                             %
420%   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             %
421%                                                                             %
422%                                                                             %
423%                                                                             %
424%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
425%
426%  GetCacheViewAuthenticPixelQueue() returns the pixels associated with the
427%  last call to QueueCacheViewAuthenticPixels() or
428%  GetCacheViewAuthenticPixels().  The pixels are authentic and therefore can be
429%  updated.
430%
431%  The format of the GetCacheViewAuthenticPixelQueue() method is:
432%
433%      Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
434%
435%  A description of each parameter follows:
436%
437%    o cache_view: the cache view.
438%
439*/
440MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
441{
442  const int
443    id = GetOpenMPThreadId();
444
445  Quantum
446    *pixels;
447
448  assert(cache_view != (CacheView *) NULL);
449  assert(cache_view->signature == MagickSignature);
450  assert(cache_view->image->cache != (Cache) NULL);
451  assert(id < (int) cache_view->number_threads);
452  pixels=GetPixelCacheNexusPixels(cache_view->image->cache,
453    cache_view->nexus_info[id]);
454  return(pixels);
455}
456
457/*
458%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
459%                                                                             %
460%                                                                             %
461%                                                                             %
462%   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               %
463%                                                                             %
464%                                                                             %
465%                                                                             %
466%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
467%
468%  GetCacheViewVirtualMetacontent() returns the meta-content corresponding
469%  with the last call to GetCacheViewVirtualMetacontent().  The meta-content
470%  is virtual and therefore cannot be updated.
471%
472%  The format of the GetCacheViewVirtualMetacontent() method is:
473%
474%      const void *GetCacheViewVirtualMetacontent(
475%        const CacheView *cache_view)
476%
477%  A description of each parameter follows:
478%
479%    o cache_view: the cache view.
480%
481*/
482MagickExport const void *GetCacheViewVirtualMetacontent(
483  const CacheView *cache_view)
484{
485  const int
486    id = GetOpenMPThreadId();
487
488  const void
489    *metacontent;
490
491  assert(cache_view != (const CacheView *) NULL);
492  assert(cache_view->signature == MagickSignature);
493  assert(cache_view->image->cache != (Cache) NULL);
494  assert(id < (int) cache_view->number_threads);
495  metacontent=GetVirtualMetacontentFromNexus(cache_view->image->cache,
496    cache_view->nexus_info[id]);
497  return(metacontent);
498}
499
500/*
501%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
502%                                                                             %
503%                                                                             %
504%                                                                             %
505%   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                 %
506%                                                                             %
507%                                                                             %
508%                                                                             %
509%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
510%
511%  GetCacheViewVirtualPixelQueue() returns the the pixels associated with
512%  the last call to GetCacheViewVirtualPixels().  The pixels are virtual
513%  and therefore cannot be updated.
514%
515%  The format of the GetCacheViewVirtualPixelQueue() method is:
516%
517%      const Quantum *GetCacheViewVirtualPixelQueue(
518%        const CacheView *cache_view)
519%
520%  A description of each parameter follows:
521%
522%    o cache_view: the cache view.
523%
524*/
525MagickExport const Quantum *GetCacheViewVirtualPixelQueue(
526  const CacheView *cache_view)
527{
528  const int
529    id = GetOpenMPThreadId();
530
531  const Quantum
532    *pixels;
533
534  assert(cache_view != (const CacheView *) NULL);
535  assert(cache_view->signature == MagickSignature);
536  assert(cache_view->image->cache != (Cache) NULL);
537  assert(id < (int) cache_view->number_threads);
538  pixels=GetVirtualPixelsNexus(cache_view->image->cache,
539    cache_view->nexus_info[id]);
540  return(pixels);
541}
542
543/*
544%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
545%                                                                             %
546%                                                                             %
547%                                                                             %
548%   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                         %
549%                                                                             %
550%                                                                             %
551%                                                                             %
552%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
553%
554%  GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or
555%  disk pixel cache as defined by the geometry parameters.   A pointer to the
556%  pixels is returned if the pixels are transferred, otherwise a NULL is
557%  returned.
558%
559%  The format of the GetCacheViewVirtualPixels method is:
560%
561%      const Quantum *GetCacheViewVirtualPixels(
562%        const CacheView *cache_view,const ssize_t x,const ssize_t y,
563%        const size_t columns,const size_t rows,ExceptionInfo *exception)
564%
565%  A description of each parameter follows:
566%
567%    o cache_view: the cache view.
568%
569%    o x,y,columns,rows:  These values define the perimeter of a region of
570%      pixels.
571%
572%    o exception: return any errors or warnings in this structure.
573%
574*/
575MagickExport const Quantum *GetCacheViewVirtualPixels(
576  const CacheView *cache_view,const ssize_t x,const ssize_t y,
577  const size_t columns,const size_t rows,ExceptionInfo *exception)
578{
579  const int
580    id = GetOpenMPThreadId();
581
582  const Quantum
583    *pixels;
584
585  assert(cache_view != (CacheView *) NULL);
586  assert(cache_view->signature == MagickSignature);
587  assert(id < (int) cache_view->number_threads);
588  pixels=GetVirtualPixelsFromNexus(cache_view->image,
589    cache_view->virtual_pixel_method,x,y,columns,rows,
590    cache_view->nexus_info[id],exception);
591  return(pixels);
592}
593
594/*
595%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
596%                                                                             %
597%                                                                             %
598%                                                                             %
599%   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                 %
600%                                                                             %
601%                                                                             %
602%                                                                             %
603%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
604%
605%  GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y)
606%  location.  The image background color is returned if an error occurs.
607%
608%  The format of the GetOneCacheViewAuthenticPixel method is:
609%
610%      MagickBooleaNType GetOneCacheViewAuthenticPixel(
611%        const CacheView *cache_view,const ssize_t x,const ssize_t y,
612%        Quantum *pixel,ExceptionInfo *exception)
613%
614%  A description of each parameter follows:
615%
616%    o cache_view: the cache view.
617%
618%    o x,y:  These values define the offset of the pixel.
619%
620%    o pixel: return a pixel at the specified (x,y) location.
621%
622%    o exception: return any errors or warnings in this structure.
623%
624*/
625MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
626  const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel,
627  ExceptionInfo *exception)
628{
629  const int
630    id = GetOpenMPThreadId();
631
632  Quantum
633    *p;
634
635  register ssize_t
636    i;
637
638  assert(cache_view != (CacheView *) NULL);
639  assert(cache_view->signature == MagickSignature);
640  assert(id < (int) cache_view->number_threads);
641  (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel));
642  p=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1,
643    cache_view->nexus_info[id],exception);
644  if (p == (const Quantum *) NULL)
645    {
646      pixel[RedPixelChannel]=cache_view->image->background_color.red;
647      pixel[GreenPixelChannel]=cache_view->image->background_color.green;
648      pixel[BluePixelChannel]=cache_view->image->background_color.blue;
649      pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha;
650      return(MagickFalse);
651    }
652  for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++)
653  {
654    PixelChannel
655      channel;
656
657    channel=GetPixelChannelMapChannel(cache_view->image,i);
658    pixel[channel]=p[i];
659  }
660  return(MagickTrue);
661}
662
663/*
664%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
665%                                                                             %
666%                                                                             %
667%                                                                             %
668%   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                     %
669%                                                                             %
670%                                                                             %
671%                                                                             %
672%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
673%
674%  GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y)
675%  location.  The image background color is returned if an error occurs.  If
676%  you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
677%
678%  The format of the GetOneCacheViewVirtualPixel method is:
679%
680%      MagickBooleanType GetOneCacheViewVirtualPixel(
681%        const CacheView *cache_view,const ssize_t x,const ssize_t y,
682%        Quantum *pixel,ExceptionInfo *exception)
683%
684%  A description of each parameter follows:
685%
686%    o cache_view: the cache view.
687%
688%    o x,y:  These values define the offset of the pixel.
689%
690%    o pixel: return a pixel at the specified (x,y) location.
691%
692%    o exception: return any errors or warnings in this structure.
693%
694*/
695MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
696  const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel,
697  ExceptionInfo *exception)
698{
699  const int
700    id = GetOpenMPThreadId();
701
702  const Quantum
703    *p;
704
705  register ssize_t
706    i;
707
708  assert(cache_view != (CacheView *) NULL);
709  assert(cache_view->signature == MagickSignature);
710  assert(id < (int) cache_view->number_threads);
711  (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel));
712  p=GetVirtualPixelsFromNexus(cache_view->image,
713    cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id],
714    exception);
715  if (p == (const Quantum *) NULL)
716    {
717      pixel[RedPixelChannel]=cache_view->image->background_color.red;
718      pixel[GreenPixelChannel]=cache_view->image->background_color.green;
719      pixel[BluePixelChannel]=cache_view->image->background_color.blue;
720      pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha;
721      return(MagickFalse);
722    }
723  for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++)
724  {
725    PixelChannel
726      channel;
727
728    channel=GetPixelChannelMapChannel(cache_view->image,i);
729    pixel[channel]=p[i];
730  }
731  return(MagickTrue);
732}
733
734/*
735%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
736%                                                                             %
737%                                                                             %
738%                                                                             %
739%   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                     %
740%                                                                             %
741%                                                                             %
742%                                                                             %
743%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
744%
745%  GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at
746%  the specified (x,y) location.  The image background color is returned if an
747%  error occurs.  If you plan to modify the pixel, use
748%  GetOneCacheViewAuthenticPixel() instead.
749%
750%  The format of the GetOneCacheViewVirtualPixel method is:
751%
752%      MagickBooleanType GetOneCacheViewVirtualMethodPixel(
753%        const CacheView *cache_view,
754%        const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
755%        const ssize_t y,Quantum *pixel,ExceptionInfo *exception)
756%
757%  A description of each parameter follows:
758%
759%    o cache_view: the cache view.
760%
761%    o virtual_pixel_method: the virtual pixel method.
762%
763%    o x,y:  These values define the offset of the pixel.
764%
765%    o pixel: return a pixel at the specified (x,y) location.
766%
767%    o exception: return any errors or warnings in this structure.
768%
769*/
770MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
771  const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method,
772  const ssize_t x,const ssize_t y,Quantum *pixel,ExceptionInfo *exception)
773{
774  const int
775    id = GetOpenMPThreadId();
776
777  const Quantum
778    *p;
779
780  register ssize_t
781    i;
782
783  assert(cache_view != (CacheView *) NULL);
784  assert(cache_view->signature == MagickSignature);
785  assert(id < (int) cache_view->number_threads);
786  (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel));
787  p=GetVirtualPixelsFromNexus(cache_view->image,virtual_pixel_method,x,y,1,1,
788    cache_view->nexus_info[id],exception);
789  if (p == (const Quantum *) NULL)
790    {
791      pixel[RedPixelChannel]=cache_view->image->background_color.red;
792      pixel[GreenPixelChannel]=cache_view->image->background_color.green;
793      pixel[BluePixelChannel]=cache_view->image->background_color.blue;
794      pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha;
795      return(MagickFalse);
796    }
797  for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++)
798  {
799    PixelChannel
800      channel;
801
802    channel=GetPixelChannelMapChannel(cache_view->image,i);
803    pixel[channel]=p[i];
804  }
805  return(MagickTrue);
806}
807
808/*
809%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
810%                                                                             %
811%                                                                             %
812%                                                                             %
813%   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                 %
814%                                                                             %
815%                                                                             %
816%                                                                             %
817%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
818%
819%  QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or
820%  disk pixel cache as defined by the geometry parameters.   A pointer to the
821%  pixels is returned if the pixels are transferred, otherwise a NULL is
822%  returned.
823%
824%  The format of the QueueCacheViewAuthenticPixels method is:
825%
826%      Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
827%        const ssize_t x,const ssize_t y,const size_t columns,
828%        const size_t rows,ExceptionInfo *exception)
829%
830%  A description of each parameter follows:
831%
832%    o cache_view: the cache view.
833%
834%    o x,y,columns,rows:  These values define the perimeter of a region of
835%      pixels.
836%
837%    o exception: return any errors or warnings in this structure.
838%
839*/
840MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
841  const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
842  ExceptionInfo *exception)
843{
844  const int
845    id = GetOpenMPThreadId();
846
847  Quantum
848    *pixels;
849
850  assert(cache_view != (CacheView *) NULL);
851  assert(cache_view->signature == MagickSignature);
852  assert(id < (int) cache_view->number_threads);
853  pixels=QueueAuthenticNexus(cache_view->image,x,y,columns,rows,MagickFalse,
854    cache_view->nexus_info[id],exception);
855  return(pixels);
856}
857
858/*
859%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
860%                                                                             %
861%                                                                             %
862%                                                                             %
863%   S e t C a c h e V i e w S t o r a g e C l a s s                           %
864%                                                                             %
865%                                                                             %
866%                                                                             %
867%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
868%
869%  SetCacheViewStorageClass() sets the image storage class associated with
870%  the specified view.
871%
872%  The format of the SetCacheViewStorageClass method is:
873%
874%      MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
875%        const ClassType storage_class,ExceptionInfo *exception)
876%
877%  A description of each parameter follows:
878%
879%    o cache_view: the cache view.
880%
881%    o storage_class: the image storage class: PseudoClass or DirectClass.
882%
883%    o exception: return any errors or warnings in this structure.
884%
885*/
886MagickExport MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
887  const ClassType storage_class,ExceptionInfo *exception)
888{
889  assert(cache_view != (CacheView *) NULL);
890  assert(cache_view->signature == MagickSignature);
891  if (cache_view->debug != MagickFalse)
892    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
893      cache_view->image->filename);
894  return(SetImageStorageClass(cache_view->image,storage_class,exception));
895}
896
897/*
898%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
899%                                                                             %
900%                                                                             %
901%                                                                             %
902%   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               %
903%                                                                             %
904%                                                                             %
905%                                                                             %
906%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
907%
908%  SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated
909%  with the specified cache view.
910%
911%  The format of the SetCacheViewVirtualPixelMethod method is:
912%
913%      MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view,
914%        const VirtualPixelMethod virtual_pixel_method)
915%
916%  A description of each parameter follows:
917%
918%    o cache_view: the cache view.
919%
920%    o virtual_pixel_method: the virtual pixel method.
921%
922*/
923MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod(
924  CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method)
925{
926  assert(cache_view != (CacheView *) NULL);
927  assert(cache_view->signature == MagickSignature);
928  if (cache_view->debug != MagickFalse)
929    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
930      cache_view->image->filename);
931  cache_view->virtual_pixel_method=virtual_pixel_method;
932  return(MagickTrue);
933}
934
935/*
936%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
937%                                                                             %
938%                                                                             %
939%                                                                             %
940%   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                   %
941%                                                                             %
942%                                                                             %
943%                                                                             %
944%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
945%
946%  SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory
947%  or disk cache.  It returns MagickTrue if the pixel region is flushed,
948%  otherwise MagickFalse.
949%
950%  The format of the SyncCacheViewAuthenticPixels method is:
951%
952%      MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view,
953%        ExceptionInfo *exception)
954%
955%  A description of each parameter follows:
956%
957%    o cache_view: the cache view.
958%
959%    o exception: return any errors or warnings in this structure.
960%
961*/
962MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(
963  CacheView *cache_view,ExceptionInfo *exception)
964{
965  const int
966    id = GetOpenMPThreadId();
967
968  MagickBooleanType
969    status;
970
971  assert(cache_view != (CacheView *) NULL);
972  assert(cache_view->signature == MagickSignature);
973  assert(id < (int) cache_view->number_threads);
974  status=SyncAuthenticPixelCacheNexus(cache_view->image,
975    cache_view->nexus_info[id],exception);
976  return(status);
977}
978