blob: fe7837d7dddbd81277a65ef8eab3fbca6fba0f02 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
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% %
cristy7e41fe82010-12-04 23:12:08 +000026% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000027% 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*/
cristy4c08aed2011-07-01 19:47:50 +000049#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"
cristy3ed852e2009-09-05 21:47:34 +000059
60/*
61 Typedef declarations.
62*/
63struct _CacheView
64{
65 Image
66 *image;
67
68 VirtualPixelMethod
69 virtual_pixel_method;
70
cristybb503372010-05-27 20:51:26 +000071 size_t
cristy3ed852e2009-09-05 21:47:34 +000072 number_threads;
73
74 NexusInfo
75 **nexus_info;
76
77 MagickBooleanType
78 debug;
79
cristybb503372010-05-27 20:51:26 +000080 size_t
cristy3ed852e2009-09-05 21:47:34 +000081 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);
cristy0a922382011-07-16 15:30:34 +0000116 cache_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*cache_view));
cristy3ed852e2009-09-05 21:47:34 +0000117 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);
cristy0a922382011-07-16 15:30:34 +0000163 clone_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*clone_view));
cristy3ed852e2009-09-05 21:47:34 +0000164 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);
cristyb41ee102010-10-04 16:46:15 +0000211 cache_view=(CacheView *) RelinquishMagickMemory(cache_view);
cristy3ed852e2009-09-05 21:47:34 +0000212 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);
cristy0d267172011-04-25 20:13:48 +0000245 return(GetPixelCacheColorspace(cache_view->image->cache));
cristy3ed852e2009-09-05 21:47:34 +0000246}
247
248/*
249%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
250% %
251% %
252% %
253% G e t C a c h e V i e w E x c e p t i o n %
254% %
255% %
256% %
257%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
258%
259% GetCacheViewException() returns the image exception associated with the
260% specified view.
261%
262% The format of the GetCacheViewException method is:
263%
264% ExceptionInfo GetCacheViewException(const CacheView *cache_view)
265%
266% A description of each parameter follows:
267%
268% o cache_view: the cache view.
269%
270*/
271MagickExport ExceptionInfo *GetCacheViewException(const CacheView *cache_view)
272{
273 assert(cache_view != (CacheView *) NULL);
274 assert(cache_view->signature == MagickSignature);
275 if (cache_view->debug != MagickFalse)
276 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
277 cache_view->image->filename);
278 return(&cache_view->image->exception);
279}
280
281/*
282%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
283% %
284% %
285% %
286+ G e t C a c h e V i e w E x t e n t %
287% %
288% %
289% %
290%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291%
292% GetCacheViewExtent() returns the extent of the pixels associated with the
293% last call to QueueCacheViewAuthenticPixels() or
294% GetCacheViewAuthenticPixels().
295%
296% The format of the GetCacheViewExtent() method is:
297%
298% MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
299%
300% A description of each parameter follows:
301%
302% o cache_view: the cache view.
303%
304*/
305MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view)
306{
cristy5c9e6f22010-09-17 17:31:01 +0000307 const int
308 id = GetOpenMPThreadId();
cristy4205a3c2010-09-12 20:19:59 +0000309
cristy4c08aed2011-07-01 19:47:50 +0000310 MagickSizeType
311 extent;
312
cristy3ed852e2009-09-05 21:47:34 +0000313 assert(cache_view != (CacheView *) NULL);
314 assert(cache_view->signature == MagickSignature);
315 if (cache_view->debug != MagickFalse)
316 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
317 cache_view->image->filename);
318 assert(cache_view->image->cache != (Cache) NULL);
cristy4205a3c2010-09-12 20:19:59 +0000319 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000320 extent=GetPixelCacheNexusExtent(cache_view->image->cache,
321 cache_view->nexus_info[id]);
322 return(extent);
cristy3ed852e2009-09-05 21:47:34 +0000323}
324
325/*
326%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
327% %
328% %
329% %
330% G e t C a c h e V i e w S t o r a g e C l a s s %
331% %
332% %
333% %
334%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
335%
336% GetCacheViewStorageClass() returns the image storage class associated with
337% the specified view.
338%
339% The format of the GetCacheViewStorageClass method is:
340%
341% ClassType GetCacheViewStorageClass(const CacheView *cache_view)
342%
343% A description of each parameter follows:
344%
345% o cache_view: the cache view.
346%
347*/
348MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view)
349{
350 assert(cache_view != (CacheView *) NULL);
351 assert(cache_view->signature == MagickSignature);
352 if (cache_view->debug != MagickFalse)
353 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
354 cache_view->image->filename);
cristy0d267172011-04-25 20:13:48 +0000355 return(GetPixelCacheStorageClass(cache_view->image->cache));
cristy3ed852e2009-09-05 21:47:34 +0000356}
357
358/*
359%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
360% %
361% %
362% %
363% 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 %
364% %
365% %
366% %
367%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
368%
369% GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel
370% cache as defined by the geometry parameters. A pointer to the pixels is
371% returned if the pixels are transferred, otherwise a NULL is returned.
372%
373% The format of the GetCacheViewAuthenticPixels method is:
374%
cristy4c08aed2011-07-01 19:47:50 +0000375% Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
cristybb503372010-05-27 20:51:26 +0000376% const ssize_t x,const ssize_t y,const size_t columns,
377% const size_t rows,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000378%
379% A description of each parameter follows:
380%
381% o cache_view: the cache view.
382%
383% o x,y,columns,rows: These values define the perimeter of a region of
384% pixels.
385%
386*/
cristy4c08aed2011-07-01 19:47:50 +0000387MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view,
cristy30097232010-07-01 02:16:30 +0000388 const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
389 ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000390{
cristy5c9e6f22010-09-17 17:31:01 +0000391 const int
392 id = GetOpenMPThreadId();
cristy4205a3c2010-09-12 20:19:59 +0000393
cristy4c08aed2011-07-01 19:47:50 +0000394 Quantum
cristy3ed852e2009-09-05 21:47:34 +0000395 *pixels;
396
397 assert(cache_view != (CacheView *) NULL);
398 assert(cache_view->signature == MagickSignature);
cristy4205a3c2010-09-12 20:19:59 +0000399 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000400 pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows,
cristy3ed852e2009-09-05 21:47:34 +0000401 cache_view->nexus_info[id],exception);
cristy4c08aed2011-07-01 19:47:50 +0000402 return(pixels);
cristy3ed852e2009-09-05 21:47:34 +0000403}
404
405/*
406%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
407% %
408% %
409% %
cristy4c08aed2011-07-01 19:47:50 +0000410% 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 %
cristy3ed852e2009-09-05 21:47:34 +0000411% %
412% %
413% %
414%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
415%
cristy4c08aed2011-07-01 19:47:50 +0000416% GetCacheViewAuthenticMetacontent() returns the meta-content corresponding
417% with the last call to SetCacheViewIndexes() or
418% GetCacheViewAuthenticMetacontent(). The meta-content are authentic and can
419% be updated.
cristy3ed852e2009-09-05 21:47:34 +0000420%
cristy4c08aed2011-07-01 19:47:50 +0000421% The format of the GetCacheViewAuthenticMetacontent() method is:
cristy3ed852e2009-09-05 21:47:34 +0000422%
cristy4c08aed2011-07-01 19:47:50 +0000423% void *GetCacheViewAuthenticMetacontent(CacheView *cache_view)
cristy3ed852e2009-09-05 21:47:34 +0000424%
425% A description of each parameter follows:
426%
427% o cache_view: the cache view.
428%
429*/
cristy4c08aed2011-07-01 19:47:50 +0000430MagickExport void *GetCacheViewAuthenticMetacontent(
431 CacheView *cache_view)
cristy3ed852e2009-09-05 21:47:34 +0000432{
cristy5c9e6f22010-09-17 17:31:01 +0000433 const int
434 id = GetOpenMPThreadId();
435
cristy4c08aed2011-07-01 19:47:50 +0000436 void
437 *metacontent;
438
cristy3ed852e2009-09-05 21:47:34 +0000439 assert(cache_view != (CacheView *) NULL);
440 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000441 assert(cache_view->image->cache != (Cache) NULL);
cristy4205a3c2010-09-12 20:19:59 +0000442 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000443 metacontent=GetPixelCacheNexusMetacontent(cache_view->image->cache,
444 cache_view->nexus_info[id]);
445 return(metacontent);
cristy3ed852e2009-09-05 21:47:34 +0000446}
447
448/*
449%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
450% %
451% %
452% %
453% 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 %
454% %
455% %
456% %
457%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
458%
459% GetCacheViewAuthenticPixelQueue() returns the pixels associated with the
460% last call to QueueCacheViewAuthenticPixels() or
461% GetCacheViewAuthenticPixels(). The pixels are authentic and therefore can be
462% updated.
463%
464% The format of the GetCacheViewAuthenticPixelQueue() method is:
465%
cristy4c08aed2011-07-01 19:47:50 +0000466% Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
cristy3ed852e2009-09-05 21:47:34 +0000467%
468% A description of each parameter follows:
469%
470% o cache_view: the cache view.
471%
472*/
cristy4c08aed2011-07-01 19:47:50 +0000473MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view)
cristy3ed852e2009-09-05 21:47:34 +0000474{
cristy5c9e6f22010-09-17 17:31:01 +0000475 const int
476 id = GetOpenMPThreadId();
cristy4205a3c2010-09-12 20:19:59 +0000477
cristy4c08aed2011-07-01 19:47:50 +0000478 Quantum
479 *pixels;
480
cristy3ed852e2009-09-05 21:47:34 +0000481 assert(cache_view != (CacheView *) NULL);
482 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000483 assert(cache_view->image->cache != (Cache) NULL);
cristy4205a3c2010-09-12 20:19:59 +0000484 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000485 pixels=GetPixelCacheNexusPixels(cache_view->image->cache,
486 cache_view->nexus_info[id]);
487 return(pixels);
cristy3ed852e2009-09-05 21:47:34 +0000488}
489
490/*
491%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
492% %
493% %
494% %
cristy4c08aed2011-07-01 19:47:50 +0000495% 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 %
cristy3ed852e2009-09-05 21:47:34 +0000496% %
497% %
498% %
499%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
500%
cristy4c08aed2011-07-01 19:47:50 +0000501% GetCacheViewVirtualMetacontent() returns the meta-content corresponding
502% with the last call to GetCacheViewVirtualMetacontent(). The meta-content
503% is virtual and therefore cannot be updated.
cristy3ed852e2009-09-05 21:47:34 +0000504%
cristy4c08aed2011-07-01 19:47:50 +0000505% The format of the GetCacheViewVirtualMetacontent() method is:
cristy3ed852e2009-09-05 21:47:34 +0000506%
cristy4c08aed2011-07-01 19:47:50 +0000507% const void *GetCacheViewVirtualMetacontent(
cristy3ed852e2009-09-05 21:47:34 +0000508% const CacheView *cache_view)
509%
510% A description of each parameter follows:
511%
512% o cache_view: the cache view.
513%
514*/
cristy4c08aed2011-07-01 19:47:50 +0000515MagickExport const void *GetCacheViewVirtualMetacontent(
cristy3ed852e2009-09-05 21:47:34 +0000516 const CacheView *cache_view)
517{
cristy5c9e6f22010-09-17 17:31:01 +0000518 const int
519 id = GetOpenMPThreadId();
cristy3ed852e2009-09-05 21:47:34 +0000520
cristy4c08aed2011-07-01 19:47:50 +0000521 const void
522 *metacontent;
523
cristy3ed852e2009-09-05 21:47:34 +0000524 assert(cache_view != (const CacheView *) NULL);
525 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000526 assert(cache_view->image->cache != (Cache) NULL);
cristy4205a3c2010-09-12 20:19:59 +0000527 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000528 metacontent=GetVirtualMetacontentFromNexus(cache_view->image->cache,
529 cache_view->nexus_info[id]);
530 return(metacontent);
cristy3ed852e2009-09-05 21:47:34 +0000531}
532
533/*
534%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
535% %
536% %
537% %
538% 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 %
539% %
540% %
541% %
542%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
543%
544% GetCacheViewVirtualPixelQueue() returns the the pixels associated with
545% the last call to GetCacheViewVirtualPixels(). The pixels are virtual
546% and therefore cannot be updated.
547%
548% The format of the GetCacheViewVirtualPixelQueue() method is:
549%
cristy4c08aed2011-07-01 19:47:50 +0000550% const Quantum *GetCacheViewVirtualPixelQueue(
cristy3ed852e2009-09-05 21:47:34 +0000551% const CacheView *cache_view)
552%
553% A description of each parameter follows:
554%
555% o cache_view: the cache view.
556%
557*/
cristy4c08aed2011-07-01 19:47:50 +0000558MagickExport const Quantum *GetCacheViewVirtualPixelQueue(
cristy3ed852e2009-09-05 21:47:34 +0000559 const CacheView *cache_view)
560{
cristy5c9e6f22010-09-17 17:31:01 +0000561 const int
562 id = GetOpenMPThreadId();
563
cristy4c08aed2011-07-01 19:47:50 +0000564 const Quantum
565 *pixels;
566
cristy3ed852e2009-09-05 21:47:34 +0000567 assert(cache_view != (const CacheView *) NULL);
568 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000569 assert(cache_view->image->cache != (Cache) NULL);
cristy4205a3c2010-09-12 20:19:59 +0000570 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000571 pixels=GetVirtualPixelsNexus(cache_view->image->cache,
572 cache_view->nexus_info[id]);
573 return(pixels);
cristy3ed852e2009-09-05 21:47:34 +0000574}
575
576/*
577%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
578% %
579% %
580% %
581% 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 %
582% %
583% %
584% %
585%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
586%
587% GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or
588% disk pixel cache as defined by the geometry parameters. A pointer to the
589% pixels is returned if the pixels are transferred, otherwise a NULL is
590% returned.
591%
592% The format of the GetCacheViewVirtualPixels method is:
593%
cristy4c08aed2011-07-01 19:47:50 +0000594% const Quantum *GetCacheViewVirtualPixels(
cristybb503372010-05-27 20:51:26 +0000595% const CacheView *cache_view,const ssize_t x,const ssize_t y,
cristye076a6e2010-08-15 19:59:43 +0000596% const size_t columns,const size_t rows,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000597%
598% A description of each parameter follows:
599%
600% o cache_view: the cache view.
601%
602% o x,y,columns,rows: These values define the perimeter of a region of
603% pixels.
604%
605% o exception: return any errors or warnings in this structure.
606%
607*/
cristy4c08aed2011-07-01 19:47:50 +0000608MagickExport const Quantum *GetCacheViewVirtualPixels(
cristybb503372010-05-27 20:51:26 +0000609 const CacheView *cache_view,const ssize_t x,const ssize_t y,
610 const size_t columns,const size_t rows,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000611{
cristy5c9e6f22010-09-17 17:31:01 +0000612 const int
613 id = GetOpenMPThreadId();
614
cristy4c08aed2011-07-01 19:47:50 +0000615 const Quantum
616 *pixels;
617
cristy3ed852e2009-09-05 21:47:34 +0000618 assert(cache_view != (CacheView *) NULL);
619 assert(cache_view->signature == MagickSignature);
cristy4205a3c2010-09-12 20:19:59 +0000620 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000621 pixels=GetVirtualPixelsFromNexus(cache_view->image,
cristy3ed852e2009-09-05 21:47:34 +0000622 cache_view->virtual_pixel_method,x,y,columns,rows,
cristy4c08aed2011-07-01 19:47:50 +0000623 cache_view->nexus_info[id],exception);
624 return(pixels);
625}
626
627/*
628%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
629% %
630% %
631% %
632% 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 %
633% %
634% %
635% %
636%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
637%
638% GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y)
639% location. The image background color is returned if an error occurs.
640%
641% The format of the GetOneCacheViewAuthenticPixel method is:
642%
643% MagickBooleaNType GetOneCacheViewAuthenticPixel(
644% const CacheView *cache_view,const ssize_t x,const ssize_t y,
645% PixelPacket *pixel,ExceptionInfo *exception)
646%
647% A description of each parameter follows:
648%
649% o cache_view: the cache view.
650%
651% o x,y: These values define the offset of the pixel.
652%
653% o pixel: return a pixel at the specified (x,y) location.
654%
655% o exception: return any errors or warnings in this structure.
656%
657*/
658MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel(
659 const CacheView *cache_view,const ssize_t x,const ssize_t y,
660 PixelPacket *pixel,ExceptionInfo *exception)
661{
662 const int
663 id = GetOpenMPThreadId();
664
665 Quantum
666 *p;
667
668 assert(cache_view != (CacheView *) NULL);
669 assert(cache_view->signature == MagickSignature);
670 *pixel=cache_view->image->background_color;
671 assert(id < (int) cache_view->number_threads);
672 p=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1,
673 cache_view->nexus_info[id],exception);
674 if (p == (const Quantum *) NULL)
675 return(MagickFalse);
676 GetPixelPacket(cache_view->image,p,pixel);
677 if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
678 pixel->black=GetPixelBlack(cache_view->image,p);
679 return(MagickTrue);
cristy3ed852e2009-09-05 21:47:34 +0000680}
681
682/*
683%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
684% %
685% %
686% %
687% 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 %
688% %
689% %
690% %
691%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
692%
693% GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y)
694% location. The image background color is returned if an error occurs. If
695% you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
696%
697% The format of the GetOneCacheViewVirtualPixel method is:
698%
699% MagickBooleanType GetOneCacheViewVirtualPixel(
cristybb503372010-05-27 20:51:26 +0000700% const CacheView *cache_view,const ssize_t x,const ssize_t y,
cristy3ed852e2009-09-05 21:47:34 +0000701% PixelPacket *pixel,ExceptionInfo *exception)
702%
703% A description of each parameter follows:
704%
705% o cache_view: the cache view.
706%
707% o x,y: These values define the offset of the pixel.
708%
709% o pixel: return a pixel at the specified (x,y) location.
710%
711% o exception: return any errors or warnings in this structure.
712%
713*/
714MagickExport MagickBooleanType GetOneCacheViewVirtualPixel(
cristy30097232010-07-01 02:16:30 +0000715 const CacheView *cache_view,const ssize_t x,const ssize_t y,
716 PixelPacket *pixel,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000717{
cristy5c9e6f22010-09-17 17:31:01 +0000718 const int
719 id = GetOpenMPThreadId();
720
cristy4c08aed2011-07-01 19:47:50 +0000721 const Quantum
722 *p;
cristy3ed852e2009-09-05 21:47:34 +0000723
cristy3ed852e2009-09-05 21:47:34 +0000724 assert(cache_view != (CacheView *) NULL);
725 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000726 *pixel=cache_view->image->background_color;
cristy4205a3c2010-09-12 20:19:59 +0000727 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000728 p=GetVirtualPixelsFromNexus(cache_view->image,
cristy3ed852e2009-09-05 21:47:34 +0000729 cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id],
730 exception);
cristy4c08aed2011-07-01 19:47:50 +0000731 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000732 return(MagickFalse);
cristy4c08aed2011-07-01 19:47:50 +0000733 GetPixelPacket(cache_view->image,p,pixel);
734 if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
735 pixel->black=GetPixelBlack(cache_view->image,p);
cristy3ed852e2009-09-05 21:47:34 +0000736 return(MagickTrue);
737}
738
739/*
740%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
741% %
742% %
743% %
744% 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 %
745% %
746% %
747% %
748%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
749%
750% GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at
751% the specified (x,y) location. The image background color is returned if an
752% error occurs. If you plan to modify the pixel, use
753% GetOneCacheViewAuthenticPixel() instead.
754%
755% The format of the GetOneCacheViewVirtualPixel method is:
756%
757% MagickBooleanType GetOneCacheViewVirtualMethodPixel(
758% const CacheView *cache_view,
cristybb503372010-05-27 20:51:26 +0000759% const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
760% const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000761%
762% A description of each parameter follows:
763%
764% o cache_view: the cache view.
765%
766% o virtual_pixel_method: the virtual pixel method.
767%
768% o x,y: These values define the offset of the pixel.
769%
770% o pixel: return a pixel at the specified (x,y) location.
771%
772% o exception: return any errors or warnings in this structure.
773%
774*/
775MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel(
776 const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method,
cristybb503372010-05-27 20:51:26 +0000777 const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000778{
cristy5c9e6f22010-09-17 17:31:01 +0000779 const int
780 id = GetOpenMPThreadId();
781
cristy4c08aed2011-07-01 19:47:50 +0000782 const Quantum
783 *p;
cristy3ed852e2009-09-05 21:47:34 +0000784
cristy3ed852e2009-09-05 21:47:34 +0000785 assert(cache_view != (CacheView *) NULL);
786 assert(cache_view->signature == MagickSignature);
cristy3ed852e2009-09-05 21:47:34 +0000787 *pixel=cache_view->image->background_color;
cristy4205a3c2010-09-12 20:19:59 +0000788 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000789 p=GetVirtualPixelsFromNexus(cache_view->image,virtual_pixel_method,x,y,1,1,
790 cache_view->nexus_info[id],exception);
791 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000792 return(MagickFalse);
cristy4c08aed2011-07-01 19:47:50 +0000793 GetPixelPacket(cache_view->image,p,pixel);
794 if (GetPixelCacheColorspace(cache_view->image->cache) == CMYKColorspace)
795 pixel->black=GetPixelBlack(cache_view->image,p);
cristy3ed852e2009-09-05 21:47:34 +0000796 return(MagickTrue);
797}
798
799/*
800%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
801% %
802% %
803% %
804% 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 %
805% %
806% %
807% %
808%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
809%
810% QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or
811% disk pixel cache as defined by the geometry parameters. A pointer to the
812% pixels is returned if the pixels are transferred, otherwise a NULL is
813% returned.
814%
815% The format of the QueueCacheViewAuthenticPixels method is:
816%
cristy4c08aed2011-07-01 19:47:50 +0000817% Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
cristybb503372010-05-27 20:51:26 +0000818% const ssize_t x,const ssize_t y,const size_t columns,
819% const size_t rows,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000820%
821% A description of each parameter follows:
822%
823% o cache_view: the cache view.
824%
825% o x,y,columns,rows: These values define the perimeter of a region of
826% pixels.
827%
828% o exception: return any errors or warnings in this structure.
829%
830*/
cristy4c08aed2011-07-01 19:47:50 +0000831MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view,
cristy30097232010-07-01 02:16:30 +0000832 const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
833 ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000834{
cristy5c9e6f22010-09-17 17:31:01 +0000835 const int
836 id = GetOpenMPThreadId();
cristy4205a3c2010-09-12 20:19:59 +0000837
cristy4c08aed2011-07-01 19:47:50 +0000838 Quantum
839 *pixels;
840
cristy3ed852e2009-09-05 21:47:34 +0000841 assert(cache_view != (CacheView *) NULL);
842 assert(cache_view->signature == MagickSignature);
cristy4205a3c2010-09-12 20:19:59 +0000843 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000844 pixels=QueueAuthenticNexus(cache_view->image,x,y,columns,rows,
845 cache_view->nexus_info[id],exception);
846 return(pixels);
cristy3ed852e2009-09-05 21:47:34 +0000847}
848
849/*
850%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
851% %
852% %
853% %
854% S e t C a c h e V i e w S t o r a g e C l a s s %
855% %
856% %
857% %
858%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
859%
860% SetCacheViewStorageClass() sets the image storage class associated with
861% the specified view.
862%
863% The format of the SetCacheViewStorageClass method is:
864%
865% MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
866% const ClassType storage_class)
867%
868% A description of each parameter follows:
869%
870% o cache_view: the cache view.
871%
872% o storage_class: the image storage class: PseudoClass or DirectClass.
873%
874*/
875MagickExport MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view,
876 const ClassType storage_class)
877{
cristy574cc262011-08-05 01:23:58 +0000878 MagickBooleanType
879 status;
880
cristy3ed852e2009-09-05 21:47:34 +0000881 assert(cache_view != (CacheView *) NULL);
882 assert(cache_view->signature == MagickSignature);
883 if (cache_view->debug != MagickFalse)
884 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
885 cache_view->image->filename);
cristy574cc262011-08-05 01:23:58 +0000886 status=SetImageStorageClass(cache_view->image,storage_class,
887 &cache_view->image->exception);
888 return(status);
cristy3ed852e2009-09-05 21:47:34 +0000889}
890
891/*
892%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
893% %
894% %
895% %
896% 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 %
897% %
898% %
899% %
900%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
901%
902% SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated
903% with the specified cache view.
904%
905% The format of the SetCacheViewVirtualPixelMethod method is:
906%
907% MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view,
908% const VirtualPixelMethod virtual_pixel_method)
909%
910% A description of each parameter follows:
911%
912% o cache_view: the cache view.
913%
914% o virtual_pixel_method: the virtual pixel method.
915%
916*/
917MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod(
918 CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method)
919{
920 assert(cache_view != (CacheView *) NULL);
921 assert(cache_view->signature == MagickSignature);
922 if (cache_view->debug != MagickFalse)
923 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
924 cache_view->image->filename);
925 cache_view->virtual_pixel_method=virtual_pixel_method;
926 return(MagickTrue);
927}
928
929/*
930%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
931% %
932% %
933% %
934% 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 %
935% %
936% %
937% %
938%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
939%
940% SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory
941% or disk cache. It returns MagickTrue if the pixel region is flushed,
942% otherwise MagickFalse.
943%
944% The format of the SyncCacheViewAuthenticPixels method is:
945%
946% MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view,
947% ExceptionInfo *exception)
948%
949% A description of each parameter follows:
950%
951% o cache_view: the cache view.
952%
953% o exception: return any errors or warnings in this structure.
954%
955*/
956MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(
957 CacheView *cache_view,ExceptionInfo *exception)
958{
cristy5c9e6f22010-09-17 17:31:01 +0000959 const int
960 id = GetOpenMPThreadId();
cristy4205a3c2010-09-12 20:19:59 +0000961
cristy4c08aed2011-07-01 19:47:50 +0000962 MagickBooleanType
963 status;
964
cristy3ed852e2009-09-05 21:47:34 +0000965 assert(cache_view != (CacheView *) NULL);
966 assert(cache_view->signature == MagickSignature);
cristy4205a3c2010-09-12 20:19:59 +0000967 assert(id < (int) cache_view->number_threads);
cristy4c08aed2011-07-01 19:47:50 +0000968 status=SyncAuthenticPixelCacheNexus(cache_view->image,
969 cache_view->nexus_info[id],exception);
970 return(status);
cristy3ed852e2009-09-05 21:47:34 +0000971}