1/*
2  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization
3  dedicated to making software imaging solutions freely available.
4
5  You may not use this file except in compliance with the License.
6  obtain a copy of the License at
7
8    http://www.imagemagick.org/script/license.php
9
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15
16  MagickCore cache private methods.
17*/
18#ifndef MAGICKCORE_CACHE_PRIVATE_H
19#define MAGICKCORE_CACHE_PRIVATE_H
20
21#include "MagickCore/cache.h"
22#include "MagickCore/distribute-cache.h"
23#include "MagickCore/opencl-private.h"
24#include "MagickCore/pixel.h"
25#include "MagickCore/random_.h"
26#include "MagickCore/thread-private.h"
27#include "MagickCore/semaphore.h"
28
29#if defined(__cplusplus) || defined(c_plusplus)
30extern "C" {
31#endif
32
33typedef void
34  *Cache;
35
36typedef MagickBooleanType
37  (*GetOneAuthenticPixelFromHandler)(Image *,const ssize_t,const ssize_t,
38    Quantum *,ExceptionInfo *),
39  (*GetOneVirtualPixelFromHandler)(const Image *,const VirtualPixelMethod,
40    const ssize_t,const ssize_t,Quantum *,ExceptionInfo *),
41  (*SyncAuthenticPixelsHandler)(Image *,ExceptionInfo *);
42
43typedef const Quantum
44  *(*GetVirtualPixelHandler)(const Image *,const VirtualPixelMethod,
45    const ssize_t,const ssize_t,const size_t,const size_t,ExceptionInfo *),
46  *(*GetVirtualPixelsHandler)(const Image *);
47
48typedef const void
49  *(*GetVirtualMetacontentFromHandler)(const Image *);
50
51typedef Quantum
52  *(*GetAuthenticPixelsHandler)(Image *,const ssize_t,const ssize_t,
53    const size_t,const size_t,ExceptionInfo *);
54
55typedef Quantum
56  *(*GetAuthenticPixelsFromHandler)(const Image *);
57
58typedef Quantum
59  *(*QueueAuthenticPixelsHandler)(Image *,const ssize_t,const ssize_t,
60    const size_t,const size_t,ExceptionInfo *);
61
62typedef void
63  (*DestroyPixelHandler)(Image *);
64
65typedef void
66  *(*GetAuthenticMetacontentFromHandler)(const Image *);
67
68typedef struct _CacheMethods
69{
70  GetVirtualPixelHandler
71    get_virtual_pixel_handler;
72
73  GetVirtualPixelsHandler
74    get_virtual_pixels_handler;
75
76  GetVirtualMetacontentFromHandler
77    get_virtual_metacontent_from_handler;
78
79  GetOneVirtualPixelFromHandler
80    get_one_virtual_pixel_from_handler;
81
82  GetAuthenticPixelsHandler
83    get_authentic_pixels_handler;
84
85  GetAuthenticMetacontentFromHandler
86    get_authentic_metacontent_from_handler;
87
88  GetOneAuthenticPixelFromHandler
89    get_one_authentic_pixel_from_handler;
90
91  GetAuthenticPixelsFromHandler
92    get_authentic_pixels_from_handler;
93
94  QueueAuthenticPixelsHandler
95    queue_authentic_pixels_handler;
96
97  SyncAuthenticPixelsHandler
98    sync_authentic_pixels_handler;
99
100  DestroyPixelHandler
101    destroy_pixel_handler;
102} CacheMethods;
103
104typedef struct _NexusInfo
105{
106  MagickBooleanType
107    mapped;
108
109  RectangleInfo
110    region;
111
112  MagickSizeType
113    length;
114
115  Quantum
116    *cache,
117    *pixels;
118
119  MagickBooleanType
120    authentic_pixel_cache;
121
122  void
123    *metacontent;
124
125  size_t
126    signature;
127} NexusInfo;
128
129typedef struct _CacheInfo
130{
131  ClassType
132    storage_class;
133
134  ColorspaceType
135    colorspace;
136
137  PixelTrait
138    alpha_trait;
139
140  MagickBooleanType
141    read_mask,
142    write_mask;
143
144  size_t
145    columns,
146    rows;
147
148  size_t
149    metacontent_extent,
150    number_channels;
151
152  PixelChannelMap
153    channel_map[MaxPixelChannels];
154
155  CacheType
156    type;
157
158  MapMode
159    mode;
160
161  MagickBooleanType
162    mapped;
163
164  MagickOffsetType
165    offset;
166
167  MagickSizeType
168    length;
169
170  VirtualPixelMethod
171    virtual_pixel_method;
172
173  PixelInfo
174    virtual_pixel_color;
175
176  size_t
177    number_threads;
178
179  NexusInfo
180    **nexus_info;
181
182  Quantum
183    *pixels;
184
185  void
186    *metacontent;
187
188  int
189    file;
190
191  char
192    filename[MagickPathExtent],
193    cache_filename[MagickPathExtent];
194
195  CacheMethods
196    methods;
197
198  RandomInfo
199    *random_info;
200
201  void
202    *server_info;
203
204  MagickBooleanType
205    synchronize,
206    debug;
207
208  MagickThreadType
209    id;
210
211  ssize_t
212    reference_count;
213
214  SemaphoreInfo
215    *semaphore,
216    *file_semaphore;
217
218  time_t
219    timestamp;
220
221  size_t
222    signature;
223
224  MagickCLCacheInfo
225    opencl;
226} CacheInfo;
227
228extern MagickPrivate Cache
229  AcquirePixelCache(const size_t),
230  ClonePixelCache(const Cache),
231  DestroyPixelCache(Cache),
232  ReferencePixelCache(Cache);
233
234extern MagickPrivate ClassType
235  GetPixelCacheStorageClass(const Cache);
236
237extern MagickPrivate ColorspaceType
238  GetPixelCacheColorspace(const Cache);
239
240extern MagickPrivate const Quantum
241  *GetVirtualPixelsFromNexus(const Image *,const VirtualPixelMethod,
242    const ssize_t,const ssize_t,const size_t,const size_t,NexusInfo *,
243    ExceptionInfo *) magick_hot_spot,
244  *GetVirtualPixelsNexus(const Cache,NexusInfo *magick_restrict);
245
246extern MagickPrivate const void
247  *AcquirePixelCachePixels(const Image *,MagickSizeType *,ExceptionInfo *),
248  *GetVirtualMetacontentFromNexus(const Cache,NexusInfo *magick_restrict);
249
250extern MagickPrivate MagickBooleanType
251  CacheComponentGenesis(void),
252  SyncAuthenticPixelCacheNexus(Image *,NexusInfo *magick_restrict,
253    ExceptionInfo *) magick_hot_spot,
254  SyncImagePixelCache(Image *,ExceptionInfo *);
255
256extern MagickPrivate MagickSizeType
257  GetPixelCacheNexusExtent(const Cache,NexusInfo *magick_restrict);
258
259extern MagickPrivate NexusInfo
260  **AcquirePixelCacheNexus(const size_t),
261  **DestroyPixelCacheNexus(NexusInfo **,const size_t);
262
263extern MagickPrivate Quantum
264  *GetAuthenticPixelCacheNexus(Image *,const ssize_t,const ssize_t,
265    const size_t,const size_t,NexusInfo *,ExceptionInfo *) magick_hot_spot,
266  *QueueAuthenticPixelCacheNexus(Image *,const ssize_t,const ssize_t,
267    const size_t,const size_t,const MagickBooleanType,NexusInfo *,
268    ExceptionInfo *) magick_hot_spot;
269
270extern MagickPrivate size_t
271  GetPixelCacheChannels(const Cache);
272
273extern MagickPrivate VirtualPixelMethod
274  GetPixelCacheVirtualMethod(const Image *),
275  SetPixelCacheVirtualMethod(Image *,const VirtualPixelMethod,ExceptionInfo *);
276
277extern MagickPrivate void
278  CacheComponentTerminus(void),
279  ClonePixelCacheMethods(Cache,const Cache),
280  *GetPixelCachePixels(Image *,MagickSizeType *,ExceptionInfo *),
281  GetPixelCacheTileSize(const Image *,size_t *,size_t *),
282  GetPixelCacheMethods(CacheMethods *),
283  ResetPixelCacheEpoch(void),
284  SetPixelCacheMethods(Cache,CacheMethods *);
285
286#if defined(MAGICKCORE_OPENCL_SUPPORT)
287extern MagickPrivate cl_mem
288  GetAuthenticOpenCLBuffer(const Image *,MagickCLDevice,ExceptionInfo *);
289
290extern MagickPrivate void
291  SyncAuthenticOpenCLBuffer(const Image *);
292#endif
293
294#if defined(__cplusplus) || defined(c_plusplus)
295}
296#endif
297
298#endif
299