blob: 526486338dafb5a6f1ecb3dc6e2d6fca4b28f598 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
cristy1454be72011-12-19 01:52:48 +00002 Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization
cristy3ed852e2009-09-05 21:47:34 +00003 dedicated to making software imaging solutions freely available.
cristyd2fe6cb2009-11-19 19:00:50 +00004
cristy3ed852e2009-09-05 21:47:34 +00005 You may not use this file except in compliance with the License.
6 obtain a copy of the License at
cristyd2fe6cb2009-11-19 19:00:50 +00007
cristy3ed852e2009-09-05 21:47:34 +00008 http://www.imagemagick.org/script/license.php
cristyd2fe6cb2009-11-19 19:00:50 +00009
cristy3ed852e2009-09-05 21:47:34 +000010 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 private application programming interface declarations.
17*/
18#ifndef _MAGICKCORE_STUDIO_H
19#define _MAGICKCORE_STUDIO_H
20
21#if defined(__cplusplus) || defined(c_plusplus)
22extern "C" {
23#endif
24
cristy0157aea2010-04-24 21:12:18 +000025#if defined(WIN32) || defined(WIN64)
26# define MAGICKCORE_WINDOWS_SUPPORT
27#else
28# define MAGICKCORE_POSIX_SUPPORT
cristy3ed852e2009-09-05 21:47:34 +000029#endif
30
31#define MAGICKCORE_IMPLEMENTATION 1
32
33#if !defined(_MAGICKCORE_CONFIG_H)
34# define _MAGICKCORE_CONFIG_H
35# if !defined(vms) && !defined(macintosh)
cristy4c08aed2011-07-01 19:47:50 +000036# include "MagickCore/magick-config.h"
cristy3ed852e2009-09-05 21:47:34 +000037# else
38# include "magick-config.h"
39# endif
40#if defined(MAGICKCORE__FILE_OFFSET_BITS) && !defined(_FILE_OFFSET_BITS)
41# define _FILE_OFFSET_BITS MAGICKCORE__FILE_OFFSET_BITS
42#endif
43#if defined(_magickcore_const) && !defined(const)
cristyc47d1f82009-11-26 01:44:43 +000044# define const _magickcore_const
cristy3ed852e2009-09-05 21:47:34 +000045#endif
46#if defined(_magickcore_inline) && !defined(inline)
cristyc47d1f82009-11-26 01:44:43 +000047# define inline _magickcore_inline
cristy3ed852e2009-09-05 21:47:34 +000048#endif
cristyc47d1f82009-11-26 01:44:43 +000049#if defined(_magickcore_restrict) && !defined(restrict)
50# define restrict _magickcore_restrict
cristy3ed852e2009-09-05 21:47:34 +000051#endif
cristyba56db52011-05-20 02:08:11 +000052# if defined(__cplusplus) || defined(c_plusplus)
53# undef inline
54# endif
cristy3ed852e2009-09-05 21:47:34 +000055#endif
56
57#if defined(MAGICKCORE_NAMESPACE_PREFIX)
cristy4c08aed2011-07-01 19:47:50 +000058# include "MagickCore/methods.h"
cristy3ed852e2009-09-05 21:47:34 +000059#endif
60
61#if !defined(const)
62# define STDC
63#endif
64
65#if defined(__BORLANDC__) && defined(_DLL)
66# pragma message("BCBMagick lib DLL export interface")
67# define _MAGICKDLL_
68# define _MAGICKLIB_
69# define MAGICKCORE_MODULES_SUPPORT
70# undef MAGICKCORE_BUILD_MODULES
71#endif
72
cristycc883f92012-02-05 23:10:51 +000073#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__CYGWIN__)
cristy0a4d92f2011-08-31 19:25:00 +000074# define MagickPrivate
cristy3ed852e2009-09-05 21:47:34 +000075# if defined(_MT) && defined(_DLL) && !defined(_MAGICKDLL_) && !defined(_LIB)
76# define _MAGICKDLL_
77# endif
78# if defined(_MAGICKDLL_)
79# if defined(_VISUALC_)
80# pragma warning( disable: 4273 ) /* Disable the dll linkage warnings */
81# endif
82# if !defined(_MAGICKLIB_)
cristy7b8e0c32011-08-31 16:57:19 +000083# if defined(__GNUC__)
cristy73380532012-02-18 20:26:28 +000084# define MagickExport __attribute__ ((__dllimport__))
cristy7b8e0c32011-08-31 16:57:19 +000085# else
86# define MagickExport __declspec(dllimport)
87# endif
cristy3ed852e2009-09-05 21:47:34 +000088# if defined(_VISUALC_)
89# pragma message( "MagickCore lib DLL import interface" )
90# endif
91# else
cristy7b8e0c32011-08-31 16:57:19 +000092# if defined(__GNUC__)
cristy73380532012-02-18 20:26:28 +000093# define MagickExport __attribute__ ((__dllexport__))
cristy7b8e0c32011-08-31 16:57:19 +000094# else
95# define MagickExport __declspec(dllexport)
96# endif
cristy3ed852e2009-09-05 21:47:34 +000097# if defined(_VISUALC_)
98# pragma message( "MagickCore lib DLL export interface" )
99# endif
100# endif
101# else
102# define MagickExport
103# if defined(_VISUALC_)
104# pragma message( "MagickCore lib static interface" )
105# endif
106# endif
107
108# if defined(_DLL) && !defined(_LIB)
cristy7b8e0c32011-08-31 16:57:19 +0000109# if defined(__GNUC__)
cristy73380532012-02-18 20:26:28 +0000110# define ModuleExport __attribute__ ((__dllexport__))
cristy7b8e0c32011-08-31 16:57:19 +0000111# else
112# define ModuleExport __declspec(dllexport)
113# endif
cristy3ed852e2009-09-05 21:47:34 +0000114# if defined(_VISUALC_)
115# pragma message( "MagickCore module DLL export interface" )
116# endif
117# else
118# define ModuleExport
119# if defined(_VISUALC_)
120# pragma message( "MagickCore module static interface" )
121# endif
122
123# endif
124# define MagickGlobal __declspec(thread)
125# if defined(_VISUALC_)
126# pragma warning(disable : 4018)
127# pragma warning(disable : 4068)
128# pragma warning(disable : 4244)
129# pragma warning(disable : 4142)
130# pragma warning(disable : 4800)
131# pragma warning(disable : 4786)
132# pragma warning(disable : 4996)
133# endif
134#else
cristy7b8e0c32011-08-31 16:57:19 +0000135# if __GNUC__ >= 4
cristy73380532012-02-18 20:26:28 +0000136# define MagickExport __attribute__ ((__visibility__ ("default")))
137# define MagickPrivate __attribute__ ((__visibility__ ("hidden")))
cristy7b8e0c32011-08-31 16:57:19 +0000138# else
139# define MagickExport
140# define MagickPrivate
141# endif
142# define ModuleExport MagickExport
cristy3ed852e2009-09-05 21:47:34 +0000143# define MagickGlobal
144#endif
145
146#define MagickSignature 0xabacadabUL
147#if !defined(MaxTextExtent)
148# define MaxTextExtent 4096
149#endif
150
151#include <stdarg.h>
152#include <stdio.h>
cristya0b81c32010-01-22 02:54:33 +0000153#if defined(MAGICKCORE_HAVE_SYS_STAT_H)
154# include <sys/stat.h>
155#endif
156#if defined(MAGICKCORE_STDC_HEADERS)
157# include <stdlib.h>
158# include <stddef.h>
159#else
160# if defined(MAGICKCORE_HAVE_STDLIB_H)
161# include <stdlib.h>
162# endif
163#endif
164#if defined(MAGICKCORE_HAVE_STRING_H)
165# if !defined(STDC_HEADERS) && defined(MAGICKCORE_HAVE_MEMORY_H)
166# include <memory.h>
167# endif
168# include <string.h>
169#endif
170#if defined(MAGICKCORE_HAVE_STRINGS_H)
171# include <strings.h>
172#endif
173#if defined(MAGICKCORE_HAVE_INTTYPES_H)
174# include <inttypes.h>
175#endif
176#if defined(MAGICKCORE_HAVE_STDINT_H)
177# include <stdint.h>
178#endif
179#if defined(MAGICKCORE_HAVE_UNISTD_H)
180# include <unistd.h>
181#endif
cristy0157aea2010-04-24 21:12:18 +0000182#if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DEBUG)
cristy3ed852e2009-09-05 21:47:34 +0000183#define _CRTDBG_MAP_ALLOC
184#endif
cristy0157aea2010-04-24 21:12:18 +0000185#if defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000186# include <direct.h>
187# if !defined(MAGICKCORE_HAVE_STRERROR)
188# define HAVE_STRERROR
189# endif
190#endif
191
cristy3ed852e2009-09-05 21:47:34 +0000192#include <ctype.h>
193#include <locale.h>
194#include <errno.h>
195#include <fcntl.h>
196#include <math.h>
197#include <time.h>
198#include <limits.h>
199#include <signal.h>
200#include <assert.h>
201
cristy38d73d62011-05-19 01:55:37 +0000202#if defined(MAGICKCORE_HAVE_XLOCALE_H)
203# include <xlocale.h>
204#endif
cristy55bf91c2010-09-24 00:29:41 +0000205#if defined(MAGICKCORE_THREAD_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000206# include <pthread.h>
cristy0157aea2010-04-24 21:12:18 +0000207#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
cristyfe092d82009-10-11 04:00:45 +0000208# define MAGICKCORE_HAVE_WINTHREADS 1
cristy3ed852e2009-09-05 21:47:34 +0000209#include <windows.h>
210#endif
211#if defined(MAGICKCORE_HAVE_SYS_SYSLIMITS_H)
212# include <sys/syslimits.h>
213#endif
214#if defined(MAGICKCORE_HAVE_ARM_LIMITS_H)
215# include <arm/limits.h>
216#endif
217
cristy1579d812010-01-22 15:45:14 +0000218#if defined(MAGICKCORE__OPENCL)
cristyfe2e68f2010-01-09 19:16:03 +0000219#if defined(MAGICKCORE_HAVE_CL_CL_H)
cristy07425aa2009-09-20 22:59:24 +0000220# include <CL/cl.h>
cristy07425aa2009-09-20 22:59:24 +0000221#endif
cristyfe2e68f2010-01-09 19:16:03 +0000222#if defined(MAGICKCORE_HAVE_OPENCL_CL_H)
cristy07425aa2009-09-20 22:59:24 +0000223# include <OpenCL/cl.h>
cristy99cc3002010-01-21 14:50:11 +0000224#endif
cristy68cc9c72010-01-22 14:40:18 +0000225# define MAGICKCORE_OPENCL_SUPPORT 1
cristy07425aa2009-09-20 22:59:24 +0000226#endif
227
cristybffe7d32012-01-20 01:46:17 +0000228#if defined(_OPENMP) && ((_OPENMP >= 200203) || defined(__OPENCC__))
cristy3ed852e2009-09-05 21:47:34 +0000229# include <omp.h>
cristyb28d6472009-10-17 20:13:35 +0000230# define MAGICKCORE_OPENMP_SUPPORT 1
cristy3ed852e2009-09-05 21:47:34 +0000231#endif
232
233#if defined(MAGICKCORE_HAVE_PREAD) && defined(MAGICKCORE_HAVE_DECL_PREAD) && !MAGICKCORE_HAVE_DECL_PREAD
234ssize_t pread(int,void *,size_t,off_t);
235#endif
236
237#if defined(MAGICKCORE_HAVE_PWRITE) && defined(MAGICKCORE_HAVE_DECL_PWRITE) && !MAGICKCORE_HAVE_DECL_PWRITE
238ssize_t pwrite(int,const void *,size_t,off_t);
239#endif
240
241#if defined(MAGICKCORE_HAVE_STRLCPY) && defined(MAGICKCORE_HAVE_DECL_STRLCPY) && !MAGICKCORE_HAVE_DECL_STRLCPY
242extern size_t strlcpy(char *,const char *,size_t);
243#endif
244
245#if defined(MAGICKCORE_HAVE_VSNPRINTF) && defined(MAGICKCORE_HAVE_DECL_VSNPRINTF) && !MAGICKCORE_HAVE_DECL_VSNPRINTF
246extern int vsnprintf(char *,size_t,const char *,va_list);
247#endif
248
cristy92703d82010-04-26 00:18:18 +0000249#if defined(MAGICKCORE_HAVE___ATTRIBUTE__)
cristy73380532012-02-18 20:26:28 +0000250# define magick_aligned(x) __attribute__((__aligned__(x)))
cristy92703d82010-04-26 00:18:18 +0000251# define magick_attribute __attribute__
cristy73380532012-02-18 20:26:28 +0000252# define magick_unused(x) magick_unused_ ## x __attribute__((__unused__))
cristy92703d82010-04-26 00:18:18 +0000253#else
cristyee74ae72010-05-17 19:32:45 +0000254# define magick_aligned(x) /* nothing */
cristy92703d82010-04-26 00:18:18 +0000255# define magick_attribute(x) /* nothing */
256# define magick_unused(x) x
cristy3ed852e2009-09-05 21:47:34 +0000257#endif
258
cristy8b8d5c62012-02-18 21:34:08 +0000259#if defined(MAGICKCORE_HAVE___ALLOC_SIZE__)
cristy73380532012-02-18 20:26:28 +0000260# define magick_alloc_size(x) __attribute__((__alloc_size__(x)))
261# define magick_alloc_sizes(x,y) __attribute__((__alloc_size__(x,y)))
262# define magick_cold __attribute__((__cold__))
263# define magick_hot __attribute__((__hot__))
264#else
265# define magick_alloc_size(x) /* nothing */
cristy8b8d5c62012-02-18 21:34:08 +0000266# define magick_alloc_sizes(x,y) /* nothing */
cristy73380532012-02-18 20:26:28 +0000267# define magick_cold
268# define magick_hot
269#endif
270
cristy0157aea2010-04-24 21:12:18 +0000271#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(MAGICKCORE_POSIX_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000272# include <sys/types.h>
273# include <sys/stat.h>
274# if defined(MAGICKCORE_HAVE_FTIME)
275# include <sys/timeb.h>
276# endif
277# if defined(MAGICKCORE_POSIX_SUPPORT)
278# if defined(MAGICKCORE_HAVE_SYS_NDIR_H) || defined(MAGICKCORE_HAVE_SYS_DIR_H) || defined(MAGICKCORE_HAVE_NDIR_H)
279# define dirent direct
280# define NAMLEN(dirent) (dirent)->d_namlen
281# if defined(MAGICKCORE_HAVE_SYS_NDIR_H)
282# include <sys/ndir.h>
283# endif
284# if defined(MAGICKCORE_HAVE_SYS_DIR_H)
285# include <sys/dir.h>
286# endif
287# if defined(MAGICKCORE_HAVE_NDIR_H)
288# include <ndir.h>
289# endif
290# else
291# include <dirent.h>
292# define NAMLEN(dirent) strlen((dirent)->d_name)
293# endif
294# include <sys/wait.h>
295# include <pwd.h>
296# endif
297# if !defined(S_ISDIR)
298# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
299# endif
300# if !defined(S_ISREG)
301# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
302# endif
cristy4c08aed2011-07-01 19:47:50 +0000303# include "MagickCore/magick-type.h"
cristy0157aea2010-04-24 21:12:18 +0000304# if !defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000305# include <sys/time.h>
306# if defined(MAGICKCORE_HAVE_SYS_TIMES_H)
307# include <sys/times.h>
308# endif
309# if defined(MAGICKCORE_HAVE_SYS_RESOURCE_H)
310# include <sys/resource.h>
311# endif
312#endif
313#else
314# include <types.h>
315# include <stat.h>
316# if defined(macintosh)
317# if !defined(DISABLE_SIOUX)
318# include <SIOUX.h>
319# include <console.h>
320# endif
321# include <unix.h>
322# endif
cristy4c08aed2011-07-01 19:47:50 +0000323# include "MagickCore/magick-type.h"
cristy3ed852e2009-09-05 21:47:34 +0000324#endif
325
326#if defined(S_IRUSR) && defined(S_IWUSR)
327# define S_MODE (S_IRUSR | S_IWUSR)
cristy0157aea2010-04-24 21:12:18 +0000328#elif defined (MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000329# define S_MODE (_S_IREAD | _S_IWRITE)
330#else
331# define S_MODE 0600
332#endif
333
cristy0157aea2010-04-24 21:12:18 +0000334#if defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy4c08aed2011-07-01 19:47:50 +0000335# include "MagickCore/nt-base.h"
cristy3ed852e2009-09-05 21:47:34 +0000336#endif
337#if defined(macintosh)
cristy4c08aed2011-07-01 19:47:50 +0000338# include "MagickCore/mac.h"
cristy3ed852e2009-09-05 21:47:34 +0000339#endif
340#if defined(vms)
cristy4c08aed2011-07-01 19:47:50 +0000341# include "MagickCore/vms.h"
cristy3ed852e2009-09-05 21:47:34 +0000342#endif
343
344#undef HAVE_CONFIG_H
345#undef gamma
346#undef index
347#undef pipe
348#undef y1
349
350/*
351 Review these platform specific definitions.
352*/
353#if defined(MAGICKCORE_POSIX_SUPPORT) && !defined(__OS2__)
354# define DirectorySeparator "/"
355# define DirectoryListSeparator ':'
356# define EditorOptions " -title \"Edit Image Comment\" -e vi"
357# define Exit exit
358# define IsBasenameSeparator(c) ((c) == '/' ? MagickTrue : MagickFalse)
359# define X11_PREFERENCES_PATH "~/."
360# define ProcessPendingEvents(text)
361# define ReadCommandlLine(argc,argv)
362# define SetNotifyHandlers
363#else
364# if defined(vms)
365# define X11_APPLICATION_PATH "decw$system_defaults:"
366# define DirectorySeparator ""
367# define DirectoryListSeparator ';'
368# define EditorOptions ""
369# define Exit exit
370# define IsBasenameSeparator(c) \
371 (((c) == ']') || ((c) == ':') || ((c) == '/') ? MagickTrue : MagickFalse)
372# define MAGICKCORE_LIBRARY_PATH "sys$login:"
373# define MAGICKCORE_CODER_PATH "sys$login:"
374# define MAGICKCORE_FILTER_PATH "sys$login:"
375# define MAGICKCORE_SHARE_PATH "sys$login:"
376# define X11_PREFERENCES_PATH "decw$user_defaults:"
377# define ProcessPendingEvents(text)
378# define ReadCommandlLine(argc,argv)
379# define SetNotifyHandlers
380# endif
381# if defined(__OS2__)
382# define DirectorySeparator "\\"
383# define DirectoryListSeparator ';'
384# define EditorOptions " -title \"Edit Image Comment\" -e vi"
385# define Exit exit
386# define IsBasenameSeparator(c) \
387 (((c) == '/') || ((c) == '\\') ? MagickTrue : MagickFalse)
388# define PreferencesDefaults "~\."
389# define ProcessPendingEvents(text)
390# define ReadCommandlLine(argc,argv)
391# define SetNotifyHandlers
392#endif
393# if defined(macintosh)
394# define X11_APPLICATION_PATH "/usr/lib/X11/app-defaults/"
395# define DirectorySeparator ":"
396# define DirectoryListSeparator ';'
397# define EditorOptions ""
398# define IsBasenameSeparator(c) ((c) == ':' ? MagickTrue : MagickFalse)
399# define MAGICKCORE_LIBRARY_PATH ""
400# define MAGICKCORE_CODER_PATH ""
401# define MAGICKCORE_FILTER_PATH ""
402# define MAGICKCORE_SHARE_PATH ""
403# define X11_PREFERENCES_PATH "~/."
404# if defined(DISABLE_SIOUX)
405# define ReadCommandlLine(argc,argv)
406# define SetNotifyHandlers \
407 SetFatalErrorHandler(MacFatalErrorHandler); \
408 SetErrorHandler(MACErrorHandler); \
409 SetWarningHandler(MACWarningHandler)
410# else
411# define ReadCommandlLine(argc,argv) argc=ccommand(argv); puts(MagickVersion);
412# define SetNotifyHandlers \
413 SetErrorHandler(MACErrorHandler); \
414 SetWarningHandler(MACWarningHandler)
415# endif
416# endif
cristy0157aea2010-04-24 21:12:18 +0000417# if defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000418# define DirectorySeparator "\\"
419# define DirectoryListSeparator ';'
420# define EditorOptions ""
421# define IsBasenameSeparator(c) \
422 (((c) == '/') || ((c) == '\\') ? MagickTrue : MagickFalse)
423# define ProcessPendingEvents(text)
424# if !defined(X11_PREFERENCES_PATH)
425# define X11_PREFERENCES_PATH "~\\."
426# endif
427# define ReadCommandlLine(argc,argv)
428# define SetNotifyHandlers \
429 SetErrorHandler(NTErrorHandler); \
430 SetWarningHandler(NTWarningHandler)
431# undef sleep
432# define sleep(seconds) Sleep(seconds*1000)
433# if !defined(MAGICKCORE_HAVE_TIFFCONF_H)
434# define HAVE_TIFFCONF_H
435# endif
436# endif
437
438#endif
439
440/*
441 Define system symbols if not already defined.
442*/
443#if !defined(STDIN_FILENO)
444#define STDIN_FILENO 0x00
445#endif
446
447#if !defined(O_BINARY)
448#define O_BINARY 0x00
449#endif
450
cristy104cea82009-10-25 02:26:51 +0000451#if !defined(PATH_MAX)
452#define PATH_MAX 4096
453#endif
454
cristy0157aea2010-04-24 21:12:18 +0000455#if defined(MAGICKCORE_LTDL_DELEGATE) || (defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DLL) && !defined(_LIB))
cristy3ed852e2009-09-05 21:47:34 +0000456# define MAGICKCORE_MODULES_SUPPORT
457#endif
458
459#if defined(_MAGICKMOD_)
460# undef MAGICKCORE_BUILD_MODULES
461# define MAGICKCORE_BUILD_MODULES
462#endif
463
464/*
cristy3ed852e2009-09-05 21:47:34 +0000465 Magick defines.
466*/
467#define Swap(x,y) ((x)^=(y), (y)^=(x), (x)^=(y))
468
469#if defined(__cplusplus) || defined(c_plusplus)
470}
471#endif
472
473#endif