minor changes; mostly for new Context Help feature
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / greycstoration / CImg.h
1 /*
2  #
3  #  File            : CImg.h
4  #                    ( C++ header file )
5  #
6  #  Description     : The C++ Template Image Processing Toolkit.
7  #                    This file is the main component of the CImg Library project.
8  #                    ( http://cimg.eu )
9  #
10  #  Project manager : David Tschumperle.
11  #                    ( http://tschumperle.users.greyc.fr/ )
12  #
13  #                    A complete list of contributors is available in file 'README.txt'
14  #                    distributed within the CImg package.
15  #
16  #  Licenses        : This file is 'dual-licensed', you have to choose one
17  #                    of the two licenses below to apply.
18  #
19  #                    CeCILL-C
20  #                    The CeCILL-C license is close to the GNU LGPL.
21  #                    ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html )
22  #
23  #                or  CeCILL v2.0
24  #                    The CeCILL license is compatible with the GNU GPL.
25  #                    ( http://www.cecill.info/licences/Licence_CeCILL_V2-en.html )
26  #
27  #  This software is governed either by the CeCILL or the CeCILL-C license
28  #  under French law and abiding by the rules of distribution of free software.
29  #  You can  use, modify and or redistribute the software under the terms of
30  #  the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA
31  #  at the following URL: "http://www.cecill.info".
32  #
33  #  As a counterpart to the access to the source code and  rights to copy,
34  #  modify and redistribute granted by the license, users are provided only
35  #  with a limited warranty  and the software's author,  the holder of the
36  #  economic rights,  and the successive licensors  have only  limited
37  #  liability.
38  #
39  #  In this respect, the user's attention is drawn to the risks associated
40  #  with loading,  using,  modifying and/or developing or reproducing the
41  #  software by the user in light of its specific status of free software,
42  #  that may mean  that it is complicated to manipulate,  and  that  also
43  #  therefore means  that it is reserved for developers  and  experienced
44  #  professionals having in-depth computer knowledge. Users are therefore
45  #  encouraged to load and test the software's suitability as regards their
46  #  requirements in conditions enabling the security of their systems and/or
47  #  data to be ensured and,  more generally, to use and operate it in the
48  #  same conditions as regards security.
49  #
50  #  The fact that you are presently reading this means that you have had
51  #  knowledge of the CeCILL and CeCILL-C licenses and that you accept its terms.
52  #
53 */
54
55 // Set version number of the library.
56 #ifndef cimg_version
57 #define cimg_version 168
58
59 /*-----------------------------------------------------------
60  #
61  # Test and possibly auto-set CImg configuration variables
62  # and include required headers.
63  #
64  # If you find that the default configuration variables are
65  # not adapted to your system, you can override their values
66  # before including the header file "CImg.h"
67  # (use the #define directive).
68  #
69  ------------------------------------------------------------*/
70
71 // Include standard C++ headers.
72 // This is the minimal set of required headers to make CImg-based codes compile.
73 #include <cstdio>
74 #include <cstdlib>
75 #include <cstdarg>
76 #include <cstring>
77 #include <cmath>
78 #include <cfloat>
79 #include <climits>
80 #include <ctime>
81 #include <exception>
82
83 // Detect/configure OS variables.
84 //
85 // Define 'cimg_OS' to: '0' for an unknown OS (will try to minize library dependencies).
86 //                      '1' for a Unix-like OS (Linux, Solaris, BSD, MacOSX, Irix, ...).
87 //                      '2' for Microsoft Windows.
88 //                      (auto-detection is performed if 'cimg_OS' is not set by the user).
89 #ifndef cimg_OS
90 #if defined(unix)        || defined(__unix)      || defined(__unix__) \
91  || defined(linux)       || defined(__linux)     || defined(__linux__) \
92  || defined(sun)         || defined(__sun) \
93  || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
94  || defined(__FreeBSD__) || defined (__DragonFly__) \
95  || defined(sgi)         || defined(__sgi) \
96  || defined(__MACOSX__)  || defined(__APPLE__) \
97  || defined(__CYGWIN__)
98 #define cimg_OS 1
99 #elif defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
100    || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__)
101 #define cimg_OS 2
102 #else
103 #define cimg_OS 0
104 #endif
105 #elif !(cimg_OS==0 || cimg_OS==1 || cimg_OS==2)
106 #error CImg Library: Invalid configuration variable 'cimg_OS'.
107 #error (correct values are '0 = unknown OS', '1 = Unix-like OS', '2 = Microsoft Windows').
108 #endif
109
110 // Disable silly warnings on some Microsoft VC++ compilers.
111 #ifdef _MSC_VER
112 #pragma warning(push)
113 #pragma warning(disable:4127)
114 #pragma warning(disable:4311)
115 #pragma warning(disable:4312)
116 #pragma warning(disable:4512)
117 #pragma warning(disable:4571)
118 #pragma warning(disable:4640)
119 #pragma warning(disable:4706)
120 #pragma warning(disable:4710)
121 #pragma warning(disable:4800)
122 #pragma warning(disable:4804)
123 #pragma warning(disable:4820)
124 #pragma warning(disable:4996)
125 #define _CRT_SECURE_NO_DEPRECATE 1
126 #define _CRT_NONSTDC_NO_DEPRECATE 1
127 #endif
128
129 // Define correct string functions for each compiler and OS.
130 #if cimg_OS==2 && defined(_MSC_VER)
131 #define cimg_sscanf std::sscanf
132 #define cimg_sprintf std::sprintf
133 #define cimg_snprintf cimg::_snprintf
134 #define cimg_vsnprintf cimg::_vsnprintf
135 #else
136 #include <stdio.h>
137 #if defined(__MACOSX__) || defined(__APPLE__)
138 #define cimg_sscanf cimg::_sscanf
139 #define cimg_sprintf cimg::_sprintf
140 #define cimg_snprintf cimg::_snprintf
141 #define cimg_vsnprintf cimg::_vsnprintf
142 #else
143 #define cimg_sscanf std::sscanf
144 #define cimg_sprintf std::sprintf
145 #define cimg_snprintf snprintf
146 #define cimg_vsnprintf vsnprintf
147 #endif
148 #endif
149
150 // Include OS-specific headers.
151 #if cimg_OS==1
152 #include <sys/types.h>
153 #include <sys/time.h>
154 #include <sys/stat.h>
155 #include <unistd.h>
156 #include <dirent.h>
157 #include <fnmatch.h>
158 #elif cimg_OS==2
159 #ifndef NOMINMAX
160 #define NOMINMAX
161 #endif
162 #include <windows.h>
163 #ifndef _WIN32_IE
164 #define _WIN32_IE 0x0400
165 #endif
166 #include <shlobj.h>
167 #include <process.h>
168 #include <io.h>
169 #endif
170
171 // Look for C++11 features
172 #if !defined(cimg_use_cpp11) && __cplusplus>201100
173 #define cimg_use_cpp11 1
174 #endif
175 #if defined(cimg_use_cpp11) && cimg_use_cpp11!=0
176 #include <initializer_list>
177 #include <utility>
178 #endif
179
180 // Configure the 'abort' signal handler (does nothing by default).
181 // A typical signal handler can be defined in your own source like this:
182 // Without OpenMP support: #define cimg_test_abort() if (is_abort) throw CImgAbortException("")
183 //
184 // or
185 //
186 // With OpenMP support: #define cimg_test_abort() if (!omp_get_thread_num() && is_abort) throw CImgAbortException("")
187 //
188 // where 'is_abort' is a boolean variable.
189 #ifndef cimg_test_abort
190 #define cimg_test_abort()
191 #endif
192
193 // Configure filename separator.
194 //
195 // Filename separator is set by default to '/', except for Windows where it is '\'.
196 #ifndef cimg_file_separator
197 #if cimg_OS==2
198 #define cimg_file_separator '\\'
199 #else
200 #define cimg_file_separator '/'
201 #endif
202 #endif
203
204 // Configure verbosity of output messages.
205 //
206 // Define 'cimg_verbosity' to: '0' to hide library messages (quiet mode).
207 //                             '1' to output library messages on the console.
208 //                             '2' to output library messages on a basic dialog window (default behavior).
209 //                             '3' to do as '1' + add extra warnings (may slow down the code!).
210 //                             '4' to do as '2' + add extra warnings (may slow down the code!).
211 //
212 // Define 'cimg_strict_warnings' to replace warning messages by exception throwns.
213 //
214 // Define 'cimg_use_vt100' to allow output of color messages on VT100-compatible terminals.
215 #ifndef cimg_verbosity
216 #if cimg_OS==2
217 #define cimg_verbosity 2
218 #else
219 #define cimg_verbosity 1
220 #endif
221 #elif !(cimg_verbosity==0 || cimg_verbosity==1 || cimg_verbosity==2 || cimg_verbosity==3 || cimg_verbosity==4)
222 #error CImg Library: Configuration variable 'cimg_verbosity' is badly defined.
223 #error (should be { 0=quiet | 1=console | 2=dialog | 3=console+warnings | 4=dialog+warnings }).
224 #endif
225
226 // Configure display framework.
227 //
228 // Define 'cimg_display' to: '0' to disable display capabilities.
229 //                           '1' to use the X-Window framework (X11).
230 //                           '2' to use the Microsoft GDI32 framework.
231 #ifndef cimg_display
232 #if cimg_OS==0
233 #define cimg_display 0
234 #elif cimg_OS==1
235 #define cimg_display 1
236 #elif cimg_OS==2
237 #define cimg_display 2
238 #endif
239 #elif !(cimg_display==0 || cimg_display==1 || cimg_display==2)
240 #error CImg Library: Configuration variable 'cimg_display' is badly defined.
241 #error (should be { 0=none | 1=X-Window (X11) | 2=Microsoft GDI32 }).
242 #endif
243
244 // Include display-specific headers.
245 #if cimg_display==1
246 #include <X11/Xlib.h>
247 #include <X11/Xutil.h>
248 #include <X11/keysym.h>
249 #include <pthread.h>
250 #ifdef cimg_use_xshm
251 #include <sys/ipc.h>
252 #include <sys/shm.h>
253 #include <X11/extensions/XShm.h>
254 #endif
255 #ifdef cimg_use_xrandr
256 #include <X11/extensions/Xrandr.h>
257 #endif
258 #endif
259 #ifndef cimg_appname
260 #define cimg_appname "CImg"
261 #endif
262
263 // Configure OpenMP support.
264 // (http://www.openmp.org)
265 //
266 // Define 'cimg_use_openmp' to enable OpenMP support.
267 //
268 // OpenMP directives may be used in a (very) few CImg functions to get
269 // advantages of multi-core CPUs.
270 #ifdef cimg_use_openmp
271 #include <omp.h>
272 #endif
273
274 // Configure OpenCV support.
275 // (http://opencv.willowgarage.com/wiki/)
276 //
277 // Define 'cimg_use_opencv' to enable OpenCV support.
278 //
279 // OpenCV library may be used to access images from cameras
280 // (see method 'CImg<T>::load_camera()').
281 #ifdef cimg_use_opencv
282 #ifdef True
283 #undef True
284 #define _cimg_redefine_True
285 #endif
286 #ifdef False
287 #undef False
288 #define _cimg_redefine_False
289 #endif
290 #include <cstddef>
291 #include "cv.h"
292 #include "highgui.h"
293 #endif
294
295 // Configure LibPNG support.
296 // (http://www.libpng.org)
297 //
298 // Define 'cimg_use_png' to enable LibPNG support.
299 //
300 // PNG library may be used to get a native support of '.png' files.
301 // (see methods 'CImg<T>::{load,save}_png()'.
302 #ifdef cimg_use_png
303 extern "C" {
304 #include "png.h"
305 }
306 #endif
307
308 // Configure LibJPEG support.
309 // (http://en.wikipedia.org/wiki/Libjpeg)
310 //
311 // Define 'cimg_use_jpeg' to enable LibJPEG support.
312 //
313 // JPEG library may be used to get a native support of '.jpg' files.
314 // (see methods 'CImg<T>::{load,save}_jpeg()').
315 #ifdef cimg_use_jpeg
316 extern "C" {
317 #include "jpeglib.h"
318 #include "setjmp.h"
319 }
320 #endif
321
322 // Configure LibTIFF support.
323 // (http://www.libtiff.org)
324 //
325 // Define 'cimg_use_tiff' to enable LibTIFF support.
326 //
327 // TIFF library may be used to get a native support of '.tif' files.
328 // (see methods 'CImg[List]<T>::{load,save}_tiff()').
329 #ifdef cimg_use_tiff
330 extern "C" {
331 #define uint64 uint64_hack_
332 #define int64 int64_hack_
333 #include "tiffio.h"
334 #undef uint64
335 #undef int64
336 }
337 #endif
338
339 // Configure LibMINC2 support.
340 // (http://en.wikibooks.org/wiki/MINC/Reference/MINC2.0_File_Format_Reference)
341 //
342 // Define 'cimg_use_minc2' to enable LibMINC2 support.
343 //
344 // MINC2 library may be used to get a native support of '.mnc' files.
345 // (see methods 'CImg<T>::{load,save}_minc2()').
346 #ifdef cimg_use_minc2
347 #include "minc_io_simple_volume.h"
348 #include "minc_1_simple.h"
349 #include "minc_1_simple_rw.h"
350 #endif
351
352 // Configure Zlib support.
353 // (http://www.zlib.net)
354 //
355 // Define 'cimg_use_zlib' to enable Zlib support.
356 //
357 // Zlib library may be used to allow compressed data in '.cimgz' files
358 // (see methods 'CImg[List]<T>::{load,save}_cimg()').
359 #ifdef cimg_use_zlib
360 extern "C" {
361 #include "zlib.h"
362 }
363 #endif
364
365 // Configure libcurl support.
366 // (http://curl.haxx.se/libcurl/)
367 //
368 // Define 'cimg_use_curl' to enable libcurl support.
369 //
370 // Libcurl may be used to get a native support of file downloading from the network.
371 // (see method 'cimg::load_network()'.)
372 #ifdef cimg_use_curl
373 #include "curl/curl.h"
374 #endif
375
376 // Configure Magick++ support.
377 // (http://www.imagemagick.org/Magick++)
378 //
379 // Define 'cimg_use_magick' to enable Magick++ support.
380 //
381 // Magick++ library may be used to get a native support of various image file formats.
382 // (see methods 'CImg<T>::{load,save}()').
383 #ifdef cimg_use_magick
384 #include "Magick++.h"
385 #endif
386
387 // Configure FFTW3 support.
388 // (http://www.fftw.org)
389 //
390 // Define 'cimg_use_fftw3' to enable libFFTW3 support.
391 //
392 // FFTW3 library may be used to efficiently compute the Fast Fourier Transform
393 // of image data, without restriction on the image size.
394 // (see method 'CImg[List]<T>::FFT()').
395 #ifdef cimg_use_fftw3
396 extern "C" {
397 #include "fftw3.h"
398 }
399 #endif
400
401 // Configure LibBoard support.
402 // (http://libboard.sourceforge.net/)
403 //
404 // Define 'cimg_use_board' to enable Board support.
405 //
406 // Board library may be used to draw 3d objects in vector-graphics canvas
407 // that can be saved as '.ps' or '.svg' files afterwards.
408 // (see method 'CImg<T>::draw_object3d()').
409 #ifdef cimg_use_board
410 #ifdef None
411 #undef None
412 #define _cimg_redefine_None
413 #endif
414 #include "Board.h"
415 #endif
416
417 // Configure OpenEXR support.
418 // (http://www.openexr.com/)
419 //
420 // Define 'cimg_use_openexr' to enable OpenEXR support.
421 //
422 // OpenEXR library may be used to get a native support of '.exr' files.
423 // (see methods 'CImg<T>::{load,save}_exr()').
424 #ifdef cimg_use_openexr
425 #include "ImfRgbaFile.h"
426 #include "ImfInputFile.h"
427 #include "ImfChannelList.h"
428 #include "ImfMatrixAttribute.h"
429 #include "ImfArray.h"
430 #endif
431
432 // Lapack configuration.
433 // (http://www.netlib.org/lapack)
434 //
435 // Define 'cimg_use_lapack' to enable LAPACK support.
436 //
437 // Lapack library may be used in several CImg methods to speed up
438 // matrix computations (eigenvalues, inverse, ...).
439 #ifdef cimg_use_lapack
440 extern "C" {
441   extern void sgetrf_(int*, int*, float*, int*, int*, int*);
442   extern void sgetri_(int*, float*, int*, int*, float*, int*, int*);
443   extern void sgetrs_(char*, int*, int*, float*, int*, int*, float*, int*, int*);
444   extern void sgesvd_(char*, char*, int*, int*, float*, int*, float*, float*, int*, float*, int*, float*, int*, int*);
445   extern void ssyev_(char*, char*, int*, float*, int*, float*, float*, int*, int*);
446   extern void dgetrf_(int*, int*, double*, int*, int*, int*);
447   extern void dgetri_(int*, double*, int*, int*, double*, int*, int*);
448   extern void dgetrs_(char*, int*, int*, double*, int*, int*, double*, int*, int*);
449   extern void dgesvd_(char*, char*, int*, int*, double*, int*, double*, double*,
450                       int*, double*, int*, double*, int*, int*);
451   extern void dsyev_(char*, char*, int*, double*, int*, double*, double*, int*, int*);
452   extern void dgels_(char*, int*,int*,int*,double*,int*,double*,int*,double*,int*,int*);
453   extern void sgels_(char*, int*,int*,int*,float*,int*,float*,int*,float*,int*,int*);
454 }
455 #endif
456
457 // Check if min/max/PI macros are defined.
458 //
459 // CImg does not compile if macros 'min', 'max' or 'PI' are defined,
460 // because it redefines functions min(), max() and const variable PI in the cimg:: namespace.
461 // so it '#undef' these macros if necessary, and restore them to reasonable
462 // values at the end of this file.
463 #ifdef min
464 #undef min
465 #define _cimg_redefine_min
466 #endif
467 #ifdef max
468 #undef max
469 #define _cimg_redefine_max
470 #endif
471 #ifdef PI
472 #undef PI
473 #define _cimg_redefine_PI
474 #endif
475
476 // Define 'cimg_library' namespace suffix.
477 //
478 // You may want to add a suffix to the 'cimg_library' namespace, for instance if you need to work
479 // with several versions of the library at the same time.
480 #ifdef cimg_namespace_suffix
481 #define __cimg_library_suffixed(s) cimg_library_##s
482 #define _cimg_library_suffixed(s) __cimg_library_suffixed(s)
483 #define cimg_library_suffixed _cimg_library_suffixed(cimg_namespace_suffix)
484 #else
485 #define cimg_library_suffixed cimg_library
486 #endif
487
488 /*------------------------------------------------------------------------------
489   #
490   # Define user-friendly macros.
491   #
492   # These CImg macros are prefixed by 'cimg_' and can be used safely in your own
493   # code. They are useful to parse command line options, or to write image loops.
494   #
495   ------------------------------------------------------------------------------*/
496
497 // Macros to define program usage, and retrieve command line arguments.
498 #define cimg_usage(usage) cimg_library_suffixed::cimg::option((char*)0,argc,argv,(char*)0,usage,false)
499 #define cimg_help(str) cimg_library_suffixed::cimg::option((char*)0,argc,argv,str,(char*)0)
500 #define cimg_option(name,defaut,usage) cimg_library_suffixed::cimg::option(name,argc,argv,defaut,usage)
501
502 // Macros to define and manipulate local neighborhoods.
503 #define CImg_2x2(I,T) T I[4]; \
504                       T& I##cc = I[0]; T& I##nc = I[1]; \
505                       T& I##cn = I[2]; T& I##nn = I[3]; \
506                       I##cc = I##nc = \
507                       I##cn = I##nn = 0
508
509 #define CImg_3x3(I,T) T I[9]; \
510                       T& I##pp = I[0]; T& I##cp = I[1]; T& I##np = I[2]; \
511                       T& I##pc = I[3]; T& I##cc = I[4]; T& I##nc = I[5]; \
512                       T& I##pn = I[6]; T& I##cn = I[7]; T& I##nn = I[8]; \
513                       I##pp = I##cp = I##np = \
514                       I##pc = I##cc = I##nc = \
515                       I##pn = I##cn = I##nn = 0
516
517 #define CImg_4x4(I,T) T I[16]; \
518                       T& I##pp = I[0]; T& I##cp = I[1]; T& I##np = I[2]; T& I##ap = I[3]; \
519                       T& I##pc = I[4]; T& I##cc = I[5]; T& I##nc = I[6]; T& I##ac = I[7]; \
520                       T& I##pn = I[8]; T& I##cn = I[9]; T& I##nn = I[10]; T& I##an = I[11]; \
521                       T& I##pa = I[12]; T& I##ca = I[13]; T& I##na = I[14]; T& I##aa = I[15]; \
522                       I##pp = I##cp = I##np = I##ap = \
523                       I##pc = I##cc = I##nc = I##ac = \
524                       I##pn = I##cn = I##nn = I##an = \
525                       I##pa = I##ca = I##na = I##aa = 0
526
527 #define CImg_5x5(I,T) T I[25]; \
528                       T& I##bb = I[0]; T& I##pb = I[1]; T& I##cb = I[2]; T& I##nb = I[3]; T& I##ab = I[4]; \
529                       T& I##bp = I[5]; T& I##pp = I[6]; T& I##cp = I[7]; T& I##np = I[8]; T& I##ap = I[9]; \
530                       T& I##bc = I[10]; T& I##pc = I[11]; T& I##cc = I[12]; T& I##nc = I[13]; T& I##ac = I[14]; \
531                       T& I##bn = I[15]; T& I##pn = I[16]; T& I##cn = I[17]; T& I##nn = I[18]; T& I##an = I[19]; \
532                       T& I##ba = I[20]; T& I##pa = I[21]; T& I##ca = I[22]; T& I##na = I[23]; T& I##aa = I[24]; \
533                       I##bb = I##pb = I##cb = I##nb = I##ab = \
534                       I##bp = I##pp = I##cp = I##np = I##ap = \
535                       I##bc = I##pc = I##cc = I##nc = I##ac = \
536                       I##bn = I##pn = I##cn = I##nn = I##an = \
537                       I##ba = I##pa = I##ca = I##na = I##aa = 0
538
539 #define CImg_2x2x2(I,T) T I[8]; \
540                       T& I##ccc = I[0]; T& I##ncc = I[1]; \
541                       T& I##cnc = I[2]; T& I##nnc = I[3]; \
542                       T& I##ccn = I[4]; T& I##ncn = I[5]; \
543                       T& I##cnn = I[6]; T& I##nnn = I[7]; \
544                       I##ccc = I##ncc = \
545                       I##cnc = I##nnc = \
546                       I##ccn = I##ncn = \
547                       I##cnn = I##nnn = 0
548
549 #define CImg_3x3x3(I,T) T I[27]; \
550                       T& I##ppp = I[0]; T& I##cpp = I[1]; T& I##npp = I[2]; \
551                       T& I##pcp = I[3]; T& I##ccp = I[4]; T& I##ncp = I[5]; \
552                       T& I##pnp = I[6]; T& I##cnp = I[7]; T& I##nnp = I[8]; \
553                       T& I##ppc = I[9]; T& I##cpc = I[10]; T& I##npc = I[11]; \
554                       T& I##pcc = I[12]; T& I##ccc = I[13]; T& I##ncc = I[14]; \
555                       T& I##pnc = I[15]; T& I##cnc = I[16]; T& I##nnc = I[17]; \
556                       T& I##ppn = I[18]; T& I##cpn = I[19]; T& I##npn = I[20]; \
557                       T& I##pcn = I[21]; T& I##ccn = I[22]; T& I##ncn = I[23]; \
558                       T& I##pnn = I[24]; T& I##cnn = I[25]; T& I##nnn = I[26]; \
559                       I##ppp = I##cpp = I##npp = \
560                       I##pcp = I##ccp = I##ncp = \
561                       I##pnp = I##cnp = I##nnp = \
562                       I##ppc = I##cpc = I##npc = \
563                       I##pcc = I##ccc = I##ncc = \
564                       I##pnc = I##cnc = I##nnc = \
565                       I##ppn = I##cpn = I##npn = \
566                       I##pcn = I##ccn = I##ncn = \
567                       I##pnn = I##cnn = I##nnn = 0
568
569 #define cimg_get2x2(img,x,y,z,c,I,T) \
570   I[0] = (T)(img)(x,y,z,c), I[1] = (T)(img)(_n1##x,y,z,c), I[2] = (T)(img)(x,_n1##y,z,c), \
571   I[3] = (T)(img)(_n1##x,_n1##y,z,c)
572
573 #define cimg_get3x3(img,x,y,z,c,I,T) \
574   I[0] = (T)(img)(_p1##x,_p1##y,z,c), I[1] = (T)(img)(x,_p1##y,z,c), I[2] = (T)(img)(_n1##x,_p1##y,z,c), \
575   I[3] = (T)(img)(_p1##x,y,z,c), I[4] = (T)(img)(x,y,z,c), I[5] = (T)(img)(_n1##x,y,z,c), \
576   I[6] = (T)(img)(_p1##x,_n1##y,z,c), I[7] = (T)(img)(x,_n1##y,z,c), I[8] = (T)(img)(_n1##x,_n1##y,z,c)
577
578 #define cimg_get4x4(img,x,y,z,c,I,T) \
579   I[0] = (T)(img)(_p1##x,_p1##y,z,c), I[1] = (T)(img)(x,_p1##y,z,c), I[2] = (T)(img)(_n1##x,_p1##y,z,c), \
580   I[3] = (T)(img)(_n2##x,_p1##y,z,c), I[4] = (T)(img)(_p1##x,y,z,c), I[5] = (T)(img)(x,y,z,c), \
581   I[6] = (T)(img)(_n1##x,y,z,c), I[7] = (T)(img)(_n2##x,y,z,c), I[8] = (T)(img)(_p1##x,_n1##y,z,c), \
582   I[9] = (T)(img)(x,_n1##y,z,c), I[10] = (T)(img)(_n1##x,_n1##y,z,c), I[11] = (T)(img)(_n2##x,_n1##y,z,c), \
583   I[12] = (T)(img)(_p1##x,_n2##y,z,c), I[13] = (T)(img)(x,_n2##y,z,c), I[14] = (T)(img)(_n1##x,_n2##y,z,c), \
584   I[15] = (T)(img)(_n2##x,_n2##y,z,c)
585
586 #define cimg_get5x5(img,x,y,z,c,I,T) \
587   I[0] = (T)(img)(_p2##x,_p2##y,z,c), I[1] = (T)(img)(_p1##x,_p2##y,z,c), I[2] = (T)(img)(x,_p2##y,z,c), \
588   I[3] = (T)(img)(_n1##x,_p2##y,z,c), I[4] = (T)(img)(_n2##x,_p2##y,z,c), I[5] = (T)(img)(_p2##x,_p1##y,z,c), \
589   I[6] = (T)(img)(_p1##x,_p1##y,z,c), I[7] = (T)(img)(x,_p1##y,z,c), I[8] = (T)(img)(_n1##x,_p1##y,z,c), \
590   I[9] = (T)(img)(_n2##x,_p1##y,z,c), I[10] = (T)(img)(_p2##x,y,z,c), I[11] = (T)(img)(_p1##x,y,z,c), \
591   I[12] = (T)(img)(x,y,z,c), I[13] = (T)(img)(_n1##x,y,z,c), I[14] = (T)(img)(_n2##x,y,z,c), \
592   I[15] = (T)(img)(_p2##x,_n1##y,z,c), I[16] = (T)(img)(_p1##x,_n1##y,z,c), I[17] = (T)(img)(x,_n1##y,z,c), \
593   I[18] = (T)(img)(_n1##x,_n1##y,z,c), I[19] = (T)(img)(_n2##x,_n1##y,z,c), I[20] = (T)(img)(_p2##x,_n2##y,z,c), \
594   I[21] = (T)(img)(_p1##x,_n2##y,z,c), I[22] = (T)(img)(x,_n2##y,z,c), I[23] = (T)(img)(_n1##x,_n2##y,z,c), \
595   I[24] = (T)(img)(_n2##x,_n2##y,z,c)
596
597 #define cimg_get6x6(img,x,y,z,c,I,T) \
598   I[0] = (T)(img)(_p2##x,_p2##y,z,c), I[1] = (T)(img)(_p1##x,_p2##y,z,c), I[2] = (T)(img)(x,_p2##y,z,c), \
599   I[3] = (T)(img)(_n1##x,_p2##y,z,c), I[4] = (T)(img)(_n2##x,_p2##y,z,c), I[5] = (T)(img)(_n3##x,_p2##y,z,c), \
600   I[6] = (T)(img)(_p2##x,_p1##y,z,c), I[7] = (T)(img)(_p1##x,_p1##y,z,c), I[8] = (T)(img)(x,_p1##y,z,c), \
601   I[9] = (T)(img)(_n1##x,_p1##y,z,c), I[10] = (T)(img)(_n2##x,_p1##y,z,c), I[11] = (T)(img)(_n3##x,_p1##y,z,c), \
602   I[12] = (T)(img)(_p2##x,y,z,c), I[13] = (T)(img)(_p1##x,y,z,c), I[14] = (T)(img)(x,y,z,c), \
603   I[15] = (T)(img)(_n1##x,y,z,c), I[16] = (T)(img)(_n2##x,y,z,c), I[17] = (T)(img)(_n3##x,y,z,c), \
604   I[18] = (T)(img)(_p2##x,_n1##y,z,c), I[19] = (T)(img)(_p1##x,_n1##y,z,c), I[20] = (T)(img)(x,_n1##y,z,c), \
605   I[21] = (T)(img)(_n1##x,_n1##y,z,c), I[22] = (T)(img)(_n2##x,_n1##y,z,c), I[23] = (T)(img)(_n3##x,_n1##y,z,c), \
606   I[24] = (T)(img)(_p2##x,_n2##y,z,c), I[25] = (T)(img)(_p1##x,_n2##y,z,c), I[26] = (T)(img)(x,_n2##y,z,c), \
607   I[27] = (T)(img)(_n1##x,_n2##y,z,c), I[28] = (T)(img)(_n2##x,_n2##y,z,c), I[29] = (T)(img)(_n3##x,_n2##y,z,c), \
608   I[30] = (T)(img)(_p2##x,_n3##y,z,c), I[31] = (T)(img)(_p1##x,_n3##y,z,c), I[32] = (T)(img)(x,_n3##y,z,c), \
609   I[33] = (T)(img)(_n1##x,_n3##y,z,c), I[34] = (T)(img)(_n2##x,_n3##y,z,c), I[35] = (T)(img)(_n3##x,_n3##y,z,c)
610
611 #define cimg_get7x7(img,x,y,z,c,I,T) \
612   I[0] = (T)(img)(_p3##x,_p3##y,z,c), I[1] = (T)(img)(_p2##x,_p3##y,z,c), I[2] = (T)(img)(_p1##x,_p3##y,z,c), \
613   I[3] = (T)(img)(x,_p3##y,z,c), I[4] = (T)(img)(_n1##x,_p3##y,z,c), I[5] = (T)(img)(_n2##x,_p3##y,z,c), \
614   I[6] = (T)(img)(_n3##x,_p3##y,z,c), I[7] = (T)(img)(_p3##x,_p2##y,z,c), I[8] = (T)(img)(_p2##x,_p2##y,z,c), \
615   I[9] = (T)(img)(_p1##x,_p2##y,z,c), I[10] = (T)(img)(x,_p2##y,z,c), I[11] = (T)(img)(_n1##x,_p2##y,z,c), \
616   I[12] = (T)(img)(_n2##x,_p2##y,z,c), I[13] = (T)(img)(_n3##x,_p2##y,z,c), I[14] = (T)(img)(_p3##x,_p1##y,z,c), \
617   I[15] = (T)(img)(_p2##x,_p1##y,z,c), I[16] = (T)(img)(_p1##x,_p1##y,z,c), I[17] = (T)(img)(x,_p1##y,z,c), \
618   I[18] = (T)(img)(_n1##x,_p1##y,z,c), I[19] = (T)(img)(_n2##x,_p1##y,z,c), I[20] = (T)(img)(_n3##x,_p1##y,z,c), \
619   I[21] = (T)(img)(_p3##x,y,z,c), I[22] = (T)(img)(_p2##x,y,z,c), I[23] = (T)(img)(_p1##x,y,z,c), \
620   I[24] = (T)(img)(x,y,z,c), I[25] = (T)(img)(_n1##x,y,z,c), I[26] = (T)(img)(_n2##x,y,z,c), \
621   I[27] = (T)(img)(_n3##x,y,z,c), I[28] = (T)(img)(_p3##x,_n1##y,z,c), I[29] = (T)(img)(_p2##x,_n1##y,z,c), \
622   I[30] = (T)(img)(_p1##x,_n1##y,z,c), I[31] = (T)(img)(x,_n1##y,z,c), I[32] = (T)(img)(_n1##x,_n1##y,z,c), \
623   I[33] = (T)(img)(_n2##x,_n1##y,z,c), I[34] = (T)(img)(_n3##x,_n1##y,z,c), I[35] = (T)(img)(_p3##x,_n2##y,z,c), \
624   I[36] = (T)(img)(_p2##x,_n2##y,z,c), I[37] = (T)(img)(_p1##x,_n2##y,z,c), I[38] = (T)(img)(x,_n2##y,z,c), \
625   I[39] = (T)(img)(_n1##x,_n2##y,z,c), I[40] = (T)(img)(_n2##x,_n2##y,z,c), I[41] = (T)(img)(_n3##x,_n2##y,z,c), \
626   I[42] = (T)(img)(_p3##x,_n3##y,z,c), I[43] = (T)(img)(_p2##x,_n3##y,z,c), I[44] = (T)(img)(_p1##x,_n3##y,z,c), \
627   I[45] = (T)(img)(x,_n3##y,z,c), I[46] = (T)(img)(_n1##x,_n3##y,z,c), I[47] = (T)(img)(_n2##x,_n3##y,z,c), \
628   I[48] = (T)(img)(_n3##x,_n3##y,z,c)
629
630 #define cimg_get8x8(img,x,y,z,c,I,T) \
631   I[0] = (T)(img)(_p3##x,_p3##y,z,c), I[1] = (T)(img)(_p2##x,_p3##y,z,c), I[2] = (T)(img)(_p1##x,_p3##y,z,c), \
632   I[3] = (T)(img)(x,_p3##y,z,c), I[4] = (T)(img)(_n1##x,_p3##y,z,c), I[5] = (T)(img)(_n2##x,_p3##y,z,c), \
633   I[6] = (T)(img)(_n3##x,_p3##y,z,c), I[7] = (T)(img)(_n4##x,_p3##y,z,c), I[8] = (T)(img)(_p3##x,_p2##y,z,c), \
634   I[9] = (T)(img)(_p2##x,_p2##y,z,c), I[10] = (T)(img)(_p1##x,_p2##y,z,c), I[11] = (T)(img)(x,_p2##y,z,c), \
635   I[12] = (T)(img)(_n1##x,_p2##y,z,c), I[13] = (T)(img)(_n2##x,_p2##y,z,c), I[14] = (T)(img)(_n3##x,_p2##y,z,c), \
636   I[15] = (T)(img)(_n4##x,_p2##y,z,c), I[16] = (T)(img)(_p3##x,_p1##y,z,c), I[17] = (T)(img)(_p2##x,_p1##y,z,c), \
637   I[18] = (T)(img)(_p1##x,_p1##y,z,c), I[19] = (T)(img)(x,_p1##y,z,c), I[20] = (T)(img)(_n1##x,_p1##y,z,c), \
638   I[21] = (T)(img)(_n2##x,_p1##y,z,c), I[22] = (T)(img)(_n3##x,_p1##y,z,c), I[23] = (T)(img)(_n4##x,_p1##y,z,c), \
639   I[24] = (T)(img)(_p3##x,y,z,c), I[25] = (T)(img)(_p2##x,y,z,c), I[26] = (T)(img)(_p1##x,y,z,c), \
640   I[27] = (T)(img)(x,y,z,c), I[28] = (T)(img)(_n1##x,y,z,c), I[29] = (T)(img)(_n2##x,y,z,c), \
641   I[30] = (T)(img)(_n3##x,y,z,c), I[31] = (T)(img)(_n4##x,y,z,c), I[32] = (T)(img)(_p3##x,_n1##y,z,c), \
642   I[33] = (T)(img)(_p2##x,_n1##y,z,c), I[34] = (T)(img)(_p1##x,_n1##y,z,c), I[35] = (T)(img)(x,_n1##y,z,c), \
643   I[36] = (T)(img)(_n1##x,_n1##y,z,c), I[37] = (T)(img)(_n2##x,_n1##y,z,c), I[38] = (T)(img)(_n3##x,_n1##y,z,c), \
644   I[39] = (T)(img)(_n4##x,_n1##y,z,c), I[40] = (T)(img)(_p3##x,_n2##y,z,c), I[41] = (T)(img)(_p2##x,_n2##y,z,c), \
645   I[42] = (T)(img)(_p1##x,_n2##y,z,c), I[43] = (T)(img)(x,_n2##y,z,c), I[44] = (T)(img)(_n1##x,_n2##y,z,c), \
646   I[45] = (T)(img)(_n2##x,_n2##y,z,c), I[46] = (T)(img)(_n3##x,_n2##y,z,c), I[47] = (T)(img)(_n4##x,_n2##y,z,c), \
647   I[48] = (T)(img)(_p3##x,_n3##y,z,c), I[49] = (T)(img)(_p2##x,_n3##y,z,c), I[50] = (T)(img)(_p1##x,_n3##y,z,c), \
648   I[51] = (T)(img)(x,_n3##y,z,c), I[52] = (T)(img)(_n1##x,_n3##y,z,c), I[53] = (T)(img)(_n2##x,_n3##y,z,c), \
649   I[54] = (T)(img)(_n3##x,_n3##y,z,c), I[55] = (T)(img)(_n4##x,_n3##y,z,c), I[56] = (T)(img)(_p3##x,_n4##y,z,c), \
650   I[57] = (T)(img)(_p2##x,_n4##y,z,c), I[58] = (T)(img)(_p1##x,_n4##y,z,c), I[59] = (T)(img)(x,_n4##y,z,c), \
651   I[60] = (T)(img)(_n1##x,_n4##y,z,c), I[61] = (T)(img)(_n2##x,_n4##y,z,c), I[62] = (T)(img)(_n3##x,_n4##y,z,c), \
652   I[63] = (T)(img)(_n4##x,_n4##y,z,c);
653
654 #define cimg_get9x9(img,x,y,z,c,I,T) \
655   I[0] = (T)(img)(_p4##x,_p4##y,z,c), I[1] = (T)(img)(_p3##x,_p4##y,z,c), I[2] = (T)(img)(_p2##x,_p4##y,z,c), \
656   I[3] = (T)(img)(_p1##x,_p4##y,z,c), I[4] = (T)(img)(x,_p4##y,z,c), I[5] = (T)(img)(_n1##x,_p4##y,z,c), \
657   I[6] = (T)(img)(_n2##x,_p4##y,z,c), I[7] = (T)(img)(_n3##x,_p4##y,z,c), I[8] = (T)(img)(_n4##x,_p4##y,z,c), \
658   I[9] = (T)(img)(_p4##x,_p3##y,z,c), I[10] = (T)(img)(_p3##x,_p3##y,z,c), I[11] = (T)(img)(_p2##x,_p3##y,z,c), \
659   I[12] = (T)(img)(_p1##x,_p3##y,z,c), I[13] = (T)(img)(x,_p3##y,z,c), I[14] = (T)(img)(_n1##x,_p3##y,z,c), \
660   I[15] = (T)(img)(_n2##x,_p3##y,z,c), I[16] = (T)(img)(_n3##x,_p3##y,z,c), I[17] = (T)(img)(_n4##x,_p3##y,z,c), \
661   I[18] = (T)(img)(_p4##x,_p2##y,z,c), I[19] = (T)(img)(_p3##x,_p2##y,z,c), I[20] = (T)(img)(_p2##x,_p2##y,z,c), \
662   I[21] = (T)(img)(_p1##x,_p2##y,z,c), I[22] = (T)(img)(x,_p2##y,z,c), I[23] = (T)(img)(_n1##x,_p2##y,z,c), \
663   I[24] = (T)(img)(_n2##x,_p2##y,z,c), I[25] = (T)(img)(_n3##x,_p2##y,z,c), I[26] = (T)(img)(_n4##x,_p2##y,z,c), \
664   I[27] = (T)(img)(_p4##x,_p1##y,z,c), I[28] = (T)(img)(_p3##x,_p1##y,z,c), I[29] = (T)(img)(_p2##x,_p1##y,z,c), \
665   I[30] = (T)(img)(_p1##x,_p1##y,z,c), I[31] = (T)(img)(x,_p1##y,z,c), I[32] = (T)(img)(_n1##x,_p1##y,z,c), \
666   I[33] = (T)(img)(_n2##x,_p1##y,z,c), I[34] = (T)(img)(_n3##x,_p1##y,z,c), I[35] = (T)(img)(_n4##x,_p1##y,z,c), \
667   I[36] = (T)(img)(_p4##x,y,z,c), I[37] = (T)(img)(_p3##x,y,z,c), I[38] = (T)(img)(_p2##x,y,z,c), \
668   I[39] = (T)(img)(_p1##x,y,z,c), I[40] = (T)(img)(x,y,z,c), I[41] = (T)(img)(_n1##x,y,z,c), \
669   I[42] = (T)(img)(_n2##x,y,z,c), I[43] = (T)(img)(_n3##x,y,z,c), I[44] = (T)(img)(_n4##x,y,z,c), \
670   I[45] = (T)(img)(_p4##x,_n1##y,z,c), I[46] = (T)(img)(_p3##x,_n1##y,z,c), I[47] = (T)(img)(_p2##x,_n1##y,z,c), \
671   I[48] = (T)(img)(_p1##x,_n1##y,z,c), I[49] = (T)(img)(x,_n1##y,z,c), I[50] = (T)(img)(_n1##x,_n1##y,z,c), \
672   I[51] = (T)(img)(_n2##x,_n1##y,z,c), I[52] = (T)(img)(_n3##x,_n1##y,z,c), I[53] = (T)(img)(_n4##x,_n1##y,z,c), \
673   I[54] = (T)(img)(_p4##x,_n2##y,z,c), I[55] = (T)(img)(_p3##x,_n2##y,z,c), I[56] = (T)(img)(_p2##x,_n2##y,z,c), \
674   I[57] = (T)(img)(_p1##x,_n2##y,z,c), I[58] = (T)(img)(x,_n2##y,z,c), I[59] = (T)(img)(_n1##x,_n2##y,z,c), \
675   I[60] = (T)(img)(_n2##x,_n2##y,z,c), I[61] = (T)(img)(_n3##x,_n2##y,z,c), I[62] = (T)(img)(_n4##x,_n2##y,z,c), \
676   I[63] = (T)(img)(_p4##x,_n3##y,z,c), I[64] = (T)(img)(_p3##x,_n3##y,z,c), I[65] = (T)(img)(_p2##x,_n3##y,z,c), \
677   I[66] = (T)(img)(_p1##x,_n3##y,z,c), I[67] = (T)(img)(x,_n3##y,z,c), I[68] = (T)(img)(_n1##x,_n3##y,z,c), \
678   I[69] = (T)(img)(_n2##x,_n3##y,z,c), I[70] = (T)(img)(_n3##x,_n3##y,z,c), I[71] = (T)(img)(_n4##x,_n3##y,z,c), \
679   I[72] = (T)(img)(_p4##x,_n4##y,z,c), I[73] = (T)(img)(_p3##x,_n4##y,z,c), I[74] = (T)(img)(_p2##x,_n4##y,z,c), \
680   I[75] = (T)(img)(_p1##x,_n4##y,z,c), I[76] = (T)(img)(x,_n4##y,z,c), I[77] = (T)(img)(_n1##x,_n4##y,z,c), \
681   I[78] = (T)(img)(_n2##x,_n4##y,z,c), I[79] = (T)(img)(_n3##x,_n4##y,z,c), I[80] = (T)(img)(_n4##x,_n4##y,z,c)
682
683 #define cimg_get2x2x2(img,x,y,z,c,I,T) \
684   I[0] = (T)(img)(x,y,z,c), I[1] = (T)(img)(_n1##x,y,z,c), I[2] = (T)(img)(x,_n1##y,z,c), \
685   I[3] = (T)(img)(_n1##x,_n1##y,z,c), I[4] = (T)(img)(x,y,_n1##z,c), I[5] = (T)(img)(_n1##x,y,_n1##z,c), \
686   I[6] = (T)(img)(x,_n1##y,_n1##z,c), I[7] = (T)(img)(_n1##x,_n1##y,_n1##z,c)
687
688 #define cimg_get3x3x3(img,x,y,z,c,I,T) \
689   I[0] = (T)(img)(_p1##x,_p1##y,_p1##z,c), I[1] = (T)(img)(x,_p1##y,_p1##z,c), \
690   I[2] = (T)(img)(_n1##x,_p1##y,_p1##z,c), I[3] = (T)(img)(_p1##x,y,_p1##z,c), I[4] = (T)(img)(x,y,_p1##z,c), \
691   I[5] = (T)(img)(_n1##x,y,_p1##z,c), I[6] = (T)(img)(_p1##x,_n1##y,_p1##z,c), I[7] = (T)(img)(x,_n1##y,_p1##z,c), \
692   I[8] = (T)(img)(_n1##x,_n1##y,_p1##z,c), I[9] = (T)(img)(_p1##x,_p1##y,z,c), I[10] = (T)(img)(x,_p1##y,z,c), \
693   I[11] = (T)(img)(_n1##x,_p1##y,z,c), I[12] = (T)(img)(_p1##x,y,z,c), I[13] = (T)(img)(x,y,z,c), \
694   I[14] = (T)(img)(_n1##x,y,z,c), I[15] = (T)(img)(_p1##x,_n1##y,z,c), I[16] = (T)(img)(x,_n1##y,z,c), \
695   I[17] = (T)(img)(_n1##x,_n1##y,z,c), I[18] = (T)(img)(_p1##x,_p1##y,_n1##z,c), I[19] = (T)(img)(x,_p1##y,_n1##z,c), \
696   I[20] = (T)(img)(_n1##x,_p1##y,_n1##z,c), I[21] = (T)(img)(_p1##x,y,_n1##z,c), I[22] = (T)(img)(x,y,_n1##z,c), \
697   I[23] = (T)(img)(_n1##x,y,_n1##z,c), I[24] = (T)(img)(_p1##x,_n1##y,_n1##z,c), I[25] = (T)(img)(x,_n1##y,_n1##z,c), \
698   I[26] = (T)(img)(_n1##x,_n1##y,_n1##z,c)
699
700 // Macros to perform various image loops.
701 //
702 // These macros are simpler to use than loops with C++ iterators.
703 #define cimg_for(img,ptrs,T_ptrs) \
704   for (T_ptrs *ptrs = (img)._data, *_max##ptrs = (img)._data + (img).size(); ptrs<_max##ptrs; ++ptrs)
705 #define cimg_rof(img,ptrs,T_ptrs) for (T_ptrs *ptrs = (img)._data + (img).size() - 1; ptrs>=(img)._data; --ptrs)
706 #define cimg_foroff(img,off) for (unsigned long off = 0, _max##off = (img).size(); off<_max##off; ++off)
707
708 #define cimg_for1(bound,i) for (int i = 0; i<(int)(bound); ++i)
709 #define cimg_forX(img,x) cimg_for1((img)._width,x)
710 #define cimg_forY(img,y) cimg_for1((img)._height,y)
711 #define cimg_forZ(img,z) cimg_for1((img)._depth,z)
712 #define cimg_forC(img,c) cimg_for1((img)._spectrum,c)
713 #define cimg_forXY(img,x,y) cimg_forY(img,y) cimg_forX(img,x)
714 #define cimg_forXZ(img,x,z) cimg_forZ(img,z) cimg_forX(img,x)
715 #define cimg_forYZ(img,y,z) cimg_forZ(img,z) cimg_forY(img,y)
716 #define cimg_forXC(img,x,c) cimg_forC(img,c) cimg_forX(img,x)
717 #define cimg_forYC(img,y,c) cimg_forC(img,c) cimg_forY(img,y)
718 #define cimg_forZC(img,z,c) cimg_forC(img,c) cimg_forZ(img,z)
719 #define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y)
720 #define cimg_forXYC(img,x,y,c) cimg_forC(img,c) cimg_forXY(img,x,y)
721 #define cimg_forXZC(img,x,z,c) cimg_forC(img,c) cimg_forXZ(img,x,z)
722 #define cimg_forYZC(img,y,z,c) cimg_forC(img,c) cimg_forYZ(img,y,z)
723 #define cimg_forXYZC(img,x,y,z,c) cimg_forC(img,c) cimg_forXYZ(img,x,y,z)
724
725 #define cimg_rof1(bound,i) for (int i = (int)(bound) - 1; i>=0; --i)
726 #define cimg_rofX(img,x) cimg_rof1((img)._width,x)
727 #define cimg_rofY(img,y) cimg_rof1((img)._height,y)
728 #define cimg_rofZ(img,z) cimg_rof1((img)._depth,z)
729 #define cimg_rofC(img,c) cimg_rof1((img)._spectrum,c)
730 #define cimg_rofXY(img,x,y) cimg_rofY(img,y) cimg_rofX(img,x)
731 #define cimg_rofXZ(img,x,z) cimg_rofZ(img,z) cimg_rofX(img,x)
732 #define cimg_rofYZ(img,y,z) cimg_rofZ(img,z) cimg_rofY(img,y)
733 #define cimg_rofXC(img,x,c) cimg_rofC(img,c) cimg_rofX(img,x)
734 #define cimg_rofYC(img,y,c) cimg_rofC(img,c) cimg_rofY(img,y)
735 #define cimg_rofZC(img,z,c) cimg_rofC(img,c) cimg_rofZ(img,z)
736 #define cimg_rofXYZ(img,x,y,z) cimg_rofZ(img,z) cimg_rofXY(img,x,y)
737 #define cimg_rofXYC(img,x,y,c) cimg_rofC(img,c) cimg_rofXY(img,x,y)
738 #define cimg_rofXZC(img,x,z,c) cimg_rofC(img,c) cimg_rofXZ(img,x,z)
739 #define cimg_rofYZC(img,y,z,c) cimg_rofC(img,c) cimg_rofYZ(img,y,z)
740 #define cimg_rofXYZC(img,x,y,z,c) cimg_rofC(img,c) cimg_rofXYZ(img,x,y,z)
741
742 #define cimg_for_in1(bound,i0,i1,i) \
743  for (int i = (int)(i0)<0?0:(int)(i0), _max##i = (int)(i1)<(int)(bound)?(int)(i1):(int)(bound) - 1; i<=_max##i; ++i)
744 #define cimg_for_inX(img,x0,x1,x) cimg_for_in1((img)._width,x0,x1,x)
745 #define cimg_for_inY(img,y0,y1,y) cimg_for_in1((img)._height,y0,y1,y)
746 #define cimg_for_inZ(img,z0,z1,z) cimg_for_in1((img)._depth,z0,z1,z)
747 #define cimg_for_inC(img,c0,c1,c) cimg_for_in1((img)._spectrum,c0,c1,c)
748 #define cimg_for_inXY(img,x0,y0,x1,y1,x,y) cimg_for_inY(img,y0,y1,y) cimg_for_inX(img,x0,x1,x)
749 #define cimg_for_inXZ(img,x0,z0,x1,z1,x,z) cimg_for_inZ(img,z0,z1,z) cimg_for_inX(img,x0,x1,x)
750 #define cimg_for_inXC(img,x0,c0,x1,c1,x,c) cimg_for_inC(img,c0,c1,c) cimg_for_inX(img,x0,x1,x)
751 #define cimg_for_inYZ(img,y0,z0,y1,z1,y,z) cimg_for_inZ(img,x0,z1,z) cimg_for_inY(img,y0,y1,y)
752 #define cimg_for_inYC(img,y0,c0,y1,c1,y,c) cimg_for_inC(img,c0,c1,c) cimg_for_inY(img,y0,y1,y)
753 #define cimg_for_inZC(img,z0,c0,z1,c1,z,c) cimg_for_inC(img,c0,c1,c) cimg_for_inZ(img,z0,z1,z)
754 #define cimg_for_inXYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_inZ(img,z0,z1,z) cimg_for_inXY(img,x0,y0,x1,y1,x,y)
755 #define cimg_for_inXYC(img,x0,y0,c0,x1,y1,c1,x,y,c) cimg_for_inC(img,c0,c1,c) cimg_for_inXY(img,x0,y0,x1,y1,x,y)
756 #define cimg_for_inXZC(img,x0,z0,c0,x1,z1,c1,x,z,c) cimg_for_inC(img,c0,c1,c) cimg_for_inXZ(img,x0,z0,x1,z1,x,z)
757 #define cimg_for_inYZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_inC(img,c0,c1,c) cimg_for_inYZ(img,y0,z0,y1,z1,y,z)
758 #define cimg_for_inXYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
759   cimg_for_inC(img,c0,c1,c) cimg_for_inXYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
760 #define cimg_for_insideX(img,x,n) cimg_for_inX(img,n,(img)._width - 1 - (n),x)
761 #define cimg_for_insideY(img,y,n) cimg_for_inY(img,n,(img)._height - 1 - (n),y)
762 #define cimg_for_insideZ(img,z,n) cimg_for_inZ(img,n,(img)._depth  - 1 - (n),z)
763 #define cimg_for_insideC(img,c,n) cimg_for_inC(img,n,(img)._spectrum - 1 - (n),c)
764 #define cimg_for_insideXY(img,x,y,n) cimg_for_inXY(img,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),x,y)
765 #define cimg_for_insideXYZ(img,x,y,z,n) \
766   cimg_for_inXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
767 #define cimg_for_insideXYZC(img,x,y,z,c,n) \
768   cimg_for_inXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
769
770 #define cimg_for_out1(boundi,i0,i1,i) \
771  for (int i = (int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); ++i, i = i==(int)(i0)?(int)(i1) + 1:i)
772 #define cimg_for_out2(boundi,boundj,i0,j0,i1,j1,i,j) \
773  for (int j = 0; j<(int)(boundj); ++j) \
774  for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j?0:(int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); \
775   ++i, i = _n1j?i:(i==(int)(i0)?(int)(i1) + 1:i))
776 #define cimg_for_out3(boundi,boundj,boundk,i0,j0,k0,i1,j1,k1,i,j,k) \
777  for (int k = 0; k<(int)(boundk); ++k) \
778  for (int _n1k = (int)(k<(int)(k0) || k>(int)(k1)), j = 0; j<(int)(boundj); ++j) \
779  for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j || _n1k?0:(int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); \
780   ++i, i = _n1j || _n1k?i:(i==(int)(i0)?(int)(i1) + 1:i))
781 #define cimg_for_out4(boundi,boundj,boundk,boundl,i0,j0,k0,l0,i1,j1,k1,l1,i,j,k,l) \
782  for (int l = 0; l<(int)(boundl); ++l) \
783  for (int _n1l = (int)(l<(int)(l0) || l>(int)(l1)), k = 0; k<(int)(boundk); ++k) \
784  for (int _n1k = (int)(k<(int)(k0) || k>(int)(k1)), j = 0; j<(int)(boundj); ++j) \
785  for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j || _n1k || _n1l?0:(int)(i0)>0?0:(int)(i1) + 1; \
786   i<(int)(boundi); ++i, i = _n1j || _n1k || _n1l?i:(i==(int)(i0)?(int)(i1) + 1:i))
787 #define cimg_for_outX(img,x0,x1,x) cimg_for_out1((img)._width,x0,x1,x)
788 #define cimg_for_outY(img,y0,y1,y) cimg_for_out1((img)._height,y0,y1,y)
789 #define cimg_for_outZ(img,z0,z1,z) cimg_for_out1((img)._depth,z0,z1,z)
790 #define cimg_for_outC(img,c0,c1,c) cimg_for_out1((img)._spectrum,c0,c1,c)
791 #define cimg_for_outXY(img,x0,y0,x1,y1,x,y) cimg_for_out2((img)._width,(img)._height,x0,y0,x1,y1,x,y)
792 #define cimg_for_outXZ(img,x0,z0,x1,z1,x,z) cimg_for_out2((img)._width,(img)._depth,x0,z0,x1,z1,x,z)
793 #define cimg_for_outXC(img,x0,c0,x1,c1,x,c) cimg_for_out2((img)._width,(img)._spectrum,x0,c0,x1,c1,x,c)
794 #define cimg_for_outYZ(img,y0,z0,y1,z1,y,z) cimg_for_out2((img)._height,(img)._depth,y0,z0,y1,z1,y,z)
795 #define cimg_for_outYC(img,y0,c0,y1,c1,y,c) cimg_for_out2((img)._height,(img)._spectrum,y0,c0,y1,c1,y,c)
796 #define cimg_for_outZC(img,z0,c0,z1,c1,z,c) cimg_for_out2((img)._depth,(img)._spectrum,z0,c0,z1,c1,z,c)
797 #define cimg_for_outXYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) \
798   cimg_for_out3((img)._width,(img)._height,(img)._depth,x0,y0,z0,x1,y1,z1,x,y,z)
799 #define cimg_for_outXYC(img,x0,y0,c0,x1,y1,c1,x,y,c) \
800   cimg_for_out3((img)._width,(img)._height,(img)._spectrum,x0,y0,c0,x1,y1,c1,x,y,c)
801 #define cimg_for_outXZC(img,x0,z0,c0,x1,z1,c1,x,z,c) \
802   cimg_for_out3((img)._width,(img)._depth,(img)._spectrum,x0,z0,c0,x1,z1,c1,x,z,c)
803 #define cimg_for_outYZC(img,y0,z0,c0,y1,z1,c1,y,z,c) \
804   cimg_for_out3((img)._height,(img)._depth,(img)._spectrum,y0,z0,c0,y1,z1,c1,y,z,c)
805 #define cimg_for_outXYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
806  cimg_for_out4((img)._width,(img)._height,(img)._depth,(img)._spectrum,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c)
807 #define cimg_for_borderX(img,x,n) cimg_for_outX(img,n,(img)._width - 1 - (n),x)
808 #define cimg_for_borderY(img,y,n) cimg_for_outY(img,n,(img)._height - 1 - (n),y)
809 #define cimg_for_borderZ(img,z,n) cimg_for_outZ(img,n,(img)._depth - 1 - (n),z)
810 #define cimg_for_borderC(img,c,n) cimg_for_outC(img,n,(img)._spectrum - 1 - (n),c)
811 #define cimg_for_borderXY(img,x,y,n) cimg_for_outXY(img,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),x,y)
812 #define cimg_for_borderXYZ(img,x,y,z,n) \
813   cimg_for_outXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
814 #define cimg_for_borderXYZC(img,x,y,z,c,n) \
815  cimg_for_outXYZC(img,n,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n), \
816                   (img)._depth - 1 - (n),(img)._spectrum - 1 - (n),x,y,z,c)
817
818 #define cimg_for_spiralXY(img,x,y) \
819  for (int x = 0, y = 0, _n1##x = 1, _n1##y = (img).width()*(img).height(); _n1##y; \
820       --_n1##y, _n1##x+=(_n1##x>>2) - ((!(_n1##x&3)?--y:((_n1##x&3)==1?(img)._width - 1 - ++x:\
821       ((_n1##x&3)==2?(img)._height - 1 - ++y:--x))))?0:1)
822
823 #define cimg_for_lineXY(x,y,x0,y0,x1,y1) \
824  for (int x = (int)(x0), y = (int)(y0), _sx = 1, _sy = 1, _steep = 0, \
825       _dx=(x1)>(x0)?(int)(x1) - (int)(x0):(_sx=-1,(int)(x0) - (int)(x1)), \
826       _dy=(y1)>(y0)?(int)(y1) - (int)(y0):(_sy=-1,(int)(y0) - (int)(y1)), \
827       _counter = _dx, \
828       _err = _dx>_dy?(_dy>>1):((_steep=1),(_counter=_dy),(_dx>>1)); \
829       _counter>=0; \
830       --_counter, x+=_steep? \
831       (y+=_sy,(_err-=_dx)<0?_err+=_dy,_sx:0): \
832       (y+=(_err-=_dy)<0?_err+=_dx,_sy:0,_sx))
833
834 #define cimg_for2(bound,i) \
835  for (int i = 0, _n1##i = 1>=(bound)?(int)(bound) - 1:1; \
836       _n1##i<(int)(bound) || i==--_n1##i; \
837       ++i, ++_n1##i)
838 #define cimg_for2X(img,x) cimg_for2((img)._width,x)
839 #define cimg_for2Y(img,y) cimg_for2((img)._height,y)
840 #define cimg_for2Z(img,z) cimg_for2((img)._depth,z)
841 #define cimg_for2C(img,c) cimg_for2((img)._spectrum,c)
842 #define cimg_for2XY(img,x,y) cimg_for2Y(img,y) cimg_for2X(img,x)
843 #define cimg_for2XZ(img,x,z) cimg_for2Z(img,z) cimg_for2X(img,x)
844 #define cimg_for2XC(img,x,c) cimg_for2C(img,c) cimg_for2X(img,x)
845 #define cimg_for2YZ(img,y,z) cimg_for2Z(img,z) cimg_for2Y(img,y)
846 #define cimg_for2YC(img,y,c) cimg_for2C(img,c) cimg_for2Y(img,y)
847 #define cimg_for2ZC(img,z,c) cimg_for2C(img,c) cimg_for2Z(img,z)
848 #define cimg_for2XYZ(img,x,y,z) cimg_for2Z(img,z) cimg_for2XY(img,x,y)
849 #define cimg_for2XZC(img,x,z,c) cimg_for2C(img,c) cimg_for2XZ(img,x,z)
850 #define cimg_for2YZC(img,y,z,c) cimg_for2C(img,c) cimg_for2YZ(img,y,z)
851 #define cimg_for2XYZC(img,x,y,z,c) cimg_for2C(img,c) cimg_for2XYZ(img,x,y,z)
852
853 #define cimg_for_in2(bound,i0,i1,i) \
854  for (int i = (int)(i0)<0?0:(int)(i0), \
855       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1; \
856       i<=(int)(i1) && (_n1##i<(int)(bound) || i==--_n1##i); \
857       ++i, ++_n1##i)
858 #define cimg_for_in2X(img,x0,x1,x) cimg_for_in2((img)._width,x0,x1,x)
859 #define cimg_for_in2Y(img,y0,y1,y) cimg_for_in2((img)._height,y0,y1,y)
860 #define cimg_for_in2Z(img,z0,z1,z) cimg_for_in2((img)._depth,z0,z1,z)
861 #define cimg_for_in2C(img,c0,c1,c) cimg_for_in2((img)._spectrum,c0,c1,c)
862 #define cimg_for_in2XY(img,x0,y0,x1,y1,x,y) cimg_for_in2Y(img,y0,y1,y) cimg_for_in2X(img,x0,x1,x)
863 #define cimg_for_in2XZ(img,x0,z0,x1,z1,x,z) cimg_for_in2Z(img,z0,z1,z) cimg_for_in2X(img,x0,x1,x)
864 #define cimg_for_in2XC(img,x0,c0,x1,c1,x,c) cimg_for_in2C(img,c0,c1,c) cimg_for_in2X(img,x0,x1,x)
865 #define cimg_for_in2YZ(img,y0,z0,y1,z1,y,z) cimg_for_in2Z(img,z0,z1,z) cimg_for_in2Y(img,y0,y1,y)
866 #define cimg_for_in2YC(img,y0,c0,y1,c1,y,c) cimg_for_in2C(img,c0,c1,c) cimg_for_in2Y(img,y0,y1,y)
867 #define cimg_for_in2ZC(img,z0,c0,z1,c1,z,c) cimg_for_in2C(img,c0,c1,c) cimg_for_in2Z(img,z0,z1,z)
868 #define cimg_for_in2XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in2Z(img,z0,z1,z) cimg_for_in2XY(img,x0,y0,x1,y1,x,y)
869 #define cimg_for_in2XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in2C(img,c0,c1,c) cimg_for_in2XZ(img,x0,y0,x1,y1,x,z)
870 #define cimg_for_in2YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in2C(img,c0,c1,c) cimg_for_in2YZ(img,y0,z0,y1,z1,y,z)
871 #define cimg_for_in2XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
872   cimg_for_in2C(img,c0,c1,c) cimg_for_in2XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
873
874 #define cimg_for3(bound,i) \
875  for (int i = 0, _p1##i = 0, \
876       _n1##i = 1>=(bound)?(int)(bound) - 1:1; \
877       _n1##i<(int)(bound) || i==--_n1##i; \
878       _p1##i = i++, ++_n1##i)
879 #define cimg_for3X(img,x) cimg_for3((img)._width,x)
880 #define cimg_for3Y(img,y) cimg_for3((img)._height,y)
881 #define cimg_for3Z(img,z) cimg_for3((img)._depth,z)
882 #define cimg_for3C(img,c) cimg_for3((img)._spectrum,c)
883 #define cimg_for3XY(img,x,y) cimg_for3Y(img,y) cimg_for3X(img,x)
884 #define cimg_for3XZ(img,x,z) cimg_for3Z(img,z) cimg_for3X(img,x)
885 #define cimg_for3XC(img,x,c) cimg_for3C(img,c) cimg_for3X(img,x)
886 #define cimg_for3YZ(img,y,z) cimg_for3Z(img,z) cimg_for3Y(img,y)
887 #define cimg_for3YC(img,y,c) cimg_for3C(img,c) cimg_for3Y(img,y)
888 #define cimg_for3ZC(img,z,c) cimg_for3C(img,c) cimg_for3Z(img,z)
889 #define cimg_for3XYZ(img,x,y,z) cimg_for3Z(img,z) cimg_for3XY(img,x,y)
890 #define cimg_for3XZC(img,x,z,c) cimg_for3C(img,c) cimg_for3XZ(img,x,z)
891 #define cimg_for3YZC(img,y,z,c) cimg_for3C(img,c) cimg_for3YZ(img,y,z)
892 #define cimg_for3XYZC(img,x,y,z,c) cimg_for3C(img,c) cimg_for3XYZ(img,x,y,z)
893
894 #define cimg_for_in3(bound,i0,i1,i) \
895  for (int i = (int)(i0)<0?0:(int)(i0), \
896       _p1##i = i - 1<0?0:i - 1, \
897       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1; \
898       i<=(int)(i1) && (_n1##i<(int)(bound) || i==--_n1##i); \
899       _p1##i = i++, ++_n1##i)
900 #define cimg_for_in3X(img,x0,x1,x) cimg_for_in3((img)._width,x0,x1,x)
901 #define cimg_for_in3Y(img,y0,y1,y) cimg_for_in3((img)._height,y0,y1,y)
902 #define cimg_for_in3Z(img,z0,z1,z) cimg_for_in3((img)._depth,z0,z1,z)
903 #define cimg_for_in3C(img,c0,c1,c) cimg_for_in3((img)._spectrum,c0,c1,c)
904 #define cimg_for_in3XY(img,x0,y0,x1,y1,x,y) cimg_for_in3Y(img,y0,y1,y) cimg_for_in3X(img,x0,x1,x)
905 #define cimg_for_in3XZ(img,x0,z0,x1,z1,x,z) cimg_for_in3Z(img,z0,z1,z) cimg_for_in3X(img,x0,x1,x)
906 #define cimg_for_in3XC(img,x0,c0,x1,c1,x,c) cimg_for_in3C(img,c0,c1,c) cimg_for_in3X(img,x0,x1,x)
907 #define cimg_for_in3YZ(img,y0,z0,y1,z1,y,z) cimg_for_in3Z(img,z0,z1,z) cimg_for_in3Y(img,y0,y1,y)
908 #define cimg_for_in3YC(img,y0,c0,y1,c1,y,c) cimg_for_in3C(img,c0,c1,c) cimg_for_in3Y(img,y0,y1,y)
909 #define cimg_for_in3ZC(img,z0,c0,z1,c1,z,c) cimg_for_in3C(img,c0,c1,c) cimg_for_in3Z(img,z0,z1,z)
910 #define cimg_for_in3XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in3Z(img,z0,z1,z) cimg_for_in3XY(img,x0,y0,x1,y1,x,y)
911 #define cimg_for_in3XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in3C(img,c0,c1,c) cimg_for_in3XZ(img,x0,y0,x1,y1,x,z)
912 #define cimg_for_in3YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in3C(img,c0,c1,c) cimg_for_in3YZ(img,y0,z0,y1,z1,y,z)
913 #define cimg_for_in3XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
914   cimg_for_in3C(img,c0,c1,c) cimg_for_in3XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
915
916 #define cimg_for4(bound,i) \
917  for (int i = 0, _p1##i = 0, _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
918       _n2##i = 2>=(bound)?(int)(bound) - 1:2; \
919       _n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i); \
920       _p1##i = i++, ++_n1##i, ++_n2##i)
921 #define cimg_for4X(img,x) cimg_for4((img)._width,x)
922 #define cimg_for4Y(img,y) cimg_for4((img)._height,y)
923 #define cimg_for4Z(img,z) cimg_for4((img)._depth,z)
924 #define cimg_for4C(img,c) cimg_for4((img)._spectrum,c)
925 #define cimg_for4XY(img,x,y) cimg_for4Y(img,y) cimg_for4X(img,x)
926 #define cimg_for4XZ(img,x,z) cimg_for4Z(img,z) cimg_for4X(img,x)
927 #define cimg_for4XC(img,x,c) cimg_for4C(img,c) cimg_for4X(img,x)
928 #define cimg_for4YZ(img,y,z) cimg_for4Z(img,z) cimg_for4Y(img,y)
929 #define cimg_for4YC(img,y,c) cimg_for4C(img,c) cimg_for4Y(img,y)
930 #define cimg_for4ZC(img,z,c) cimg_for4C(img,c) cimg_for4Z(img,z)
931 #define cimg_for4XYZ(img,x,y,z) cimg_for4Z(img,z) cimg_for4XY(img,x,y)
932 #define cimg_for4XZC(img,x,z,c) cimg_for4C(img,c) cimg_for4XZ(img,x,z)
933 #define cimg_for4YZC(img,y,z,c) cimg_for4C(img,c) cimg_for4YZ(img,y,z)
934 #define cimg_for4XYZC(img,x,y,z,c) cimg_for4C(img,c) cimg_for4XYZ(img,x,y,z)
935
936 #define cimg_for_in4(bound,i0,i1,i) \
937  for (int i = (int)(i0)<0?0:(int)(i0), \
938       _p1##i = i - 1<0?0:i - 1, \
939       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
940       _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2; \
941       i<=(int)(i1) && (_n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i)); \
942       _p1##i = i++, ++_n1##i, ++_n2##i)
943 #define cimg_for_in4X(img,x0,x1,x) cimg_for_in4((img)._width,x0,x1,x)
944 #define cimg_for_in4Y(img,y0,y1,y) cimg_for_in4((img)._height,y0,y1,y)
945 #define cimg_for_in4Z(img,z0,z1,z) cimg_for_in4((img)._depth,z0,z1,z)
946 #define cimg_for_in4C(img,c0,c1,c) cimg_for_in4((img)._spectrum,c0,c1,c)
947 #define cimg_for_in4XY(img,x0,y0,x1,y1,x,y) cimg_for_in4Y(img,y0,y1,y) cimg_for_in4X(img,x0,x1,x)
948 #define cimg_for_in4XZ(img,x0,z0,x1,z1,x,z) cimg_for_in4Z(img,z0,z1,z) cimg_for_in4X(img,x0,x1,x)
949 #define cimg_for_in4XC(img,x0,c0,x1,c1,x,c) cimg_for_in4C(img,c0,c1,c) cimg_for_in4X(img,x0,x1,x)
950 #define cimg_for_in4YZ(img,y0,z0,y1,z1,y,z) cimg_for_in4Z(img,z0,z1,z) cimg_for_in4Y(img,y0,y1,y)
951 #define cimg_for_in4YC(img,y0,c0,y1,c1,y,c) cimg_for_in4C(img,c0,c1,c) cimg_for_in4Y(img,y0,y1,y)
952 #define cimg_for_in4ZC(img,z0,c0,z1,c1,z,c) cimg_for_in4C(img,c0,c1,c) cimg_for_in4Z(img,z0,z1,z)
953 #define cimg_for_in4XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in4Z(img,z0,z1,z) cimg_for_in4XY(img,x0,y0,x1,y1,x,y)
954 #define cimg_for_in4XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in4C(img,c0,c1,c) cimg_for_in4XZ(img,x0,y0,x1,y1,x,z)
955 #define cimg_for_in4YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in4C(img,c0,c1,c) cimg_for_in4YZ(img,y0,z0,y1,z1,y,z)
956 #define cimg_for_in4XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
957   cimg_for_in4C(img,c0,c1,c) cimg_for_in4XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
958
959 #define cimg_for5(bound,i) \
960  for (int i = 0, _p2##i = 0, _p1##i = 0, \
961       _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
962       _n2##i = 2>=(bound)?(int)(bound) - 1:2; \
963       _n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i); \
964       _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i)
965 #define cimg_for5X(img,x) cimg_for5((img)._width,x)
966 #define cimg_for5Y(img,y) cimg_for5((img)._height,y)
967 #define cimg_for5Z(img,z) cimg_for5((img)._depth,z)
968 #define cimg_for5C(img,c) cimg_for5((img)._spectrum,c)
969 #define cimg_for5XY(img,x,y) cimg_for5Y(img,y) cimg_for5X(img,x)
970 #define cimg_for5XZ(img,x,z) cimg_for5Z(img,z) cimg_for5X(img,x)
971 #define cimg_for5XC(img,x,c) cimg_for5C(img,c) cimg_for5X(img,x)
972 #define cimg_for5YZ(img,y,z) cimg_for5Z(img,z) cimg_for5Y(img,y)
973 #define cimg_for5YC(img,y,c) cimg_for5C(img,c) cimg_for5Y(img,y)
974 #define cimg_for5ZC(img,z,c) cimg_for5C(img,c) cimg_for5Z(img,z)
975 #define cimg_for5XYZ(img,x,y,z) cimg_for5Z(img,z) cimg_for5XY(img,x,y)
976 #define cimg_for5XZC(img,x,z,c) cimg_for5C(img,c) cimg_for5XZ(img,x,z)
977 #define cimg_for5YZC(img,y,z,c) cimg_for5C(img,c) cimg_for5YZ(img,y,z)
978 #define cimg_for5XYZC(img,x,y,z,c) cimg_for5C(img,c) cimg_for5XYZ(img,x,y,z)
979
980 #define cimg_for_in5(bound,i0,i1,i) \
981  for (int i = (int)(i0)<0?0:(int)(i0), \
982       _p2##i = i - 2<0?0:i - 2, \
983       _p1##i = i - 1<0?0:i - 1, \
984       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
985       _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2; \
986       i<=(int)(i1) && (_n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i)); \
987       _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i)
988 #define cimg_for_in5X(img,x0,x1,x) cimg_for_in5((img)._width,x0,x1,x)
989 #define cimg_for_in5Y(img,y0,y1,y) cimg_for_in5((img)._height,y0,y1,y)
990 #define cimg_for_in5Z(img,z0,z1,z) cimg_for_in5((img)._depth,z0,z1,z)
991 #define cimg_for_in5C(img,c0,c1,c) cimg_for_in5((img)._spectrum,c0,c1,c)
992 #define cimg_for_in5XY(img,x0,y0,x1,y1,x,y) cimg_for_in5Y(img,y0,y1,y) cimg_for_in5X(img,x0,x1,x)
993 #define cimg_for_in5XZ(img,x0,z0,x1,z1,x,z) cimg_for_in5Z(img,z0,z1,z) cimg_for_in5X(img,x0,x1,x)
994 #define cimg_for_in5XC(img,x0,c0,x1,c1,x,c) cimg_for_in5C(img,c0,c1,c) cimg_for_in5X(img,x0,x1,x)
995 #define cimg_for_in5YZ(img,y0,z0,y1,z1,y,z) cimg_for_in5Z(img,z0,z1,z) cimg_for_in5Y(img,y0,y1,y)
996 #define cimg_for_in5YC(img,y0,c0,y1,c1,y,c) cimg_for_in5C(img,c0,c1,c) cimg_for_in5Y(img,y0,y1,y)
997 #define cimg_for_in5ZC(img,z0,c0,z1,c1,z,c) cimg_for_in5C(img,c0,c1,c) cimg_for_in5Z(img,z0,z1,z)
998 #define cimg_for_in5XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in5Z(img,z0,z1,z) cimg_for_in5XY(img,x0,y0,x1,y1,x,y)
999 #define cimg_for_in5XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in5C(img,c0,c1,c) cimg_for_in5XZ(img,x0,y0,x1,y1,x,z)
1000 #define cimg_for_in5YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in5C(img,c0,c1,c) cimg_for_in5YZ(img,y0,z0,y1,z1,y,z)
1001 #define cimg_for_in5XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
1002   cimg_for_in5C(img,c0,c1,c) cimg_for_in5XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
1003
1004 #define cimg_for6(bound,i) \
1005  for (int i = 0, _p2##i = 0, _p1##i = 0, \
1006       _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
1007       _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
1008       _n3##i = 3>=(bound)?(int)(bound) - 1:3; \
1009       _n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i); \
1010       _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
1011 #define cimg_for6X(img,x) cimg_for6((img)._width,x)
1012 #define cimg_for6Y(img,y) cimg_for6((img)._height,y)
1013 #define cimg_for6Z(img,z) cimg_for6((img)._depth,z)
1014 #define cimg_for6C(img,c) cimg_for6((img)._spectrum,c)
1015 #define cimg_for6XY(img,x,y) cimg_for6Y(img,y) cimg_for6X(img,x)
1016 #define cimg_for6XZ(img,x,z) cimg_for6Z(img,z) cimg_for6X(img,x)
1017 #define cimg_for6XC(img,x,c) cimg_for6C(img,c) cimg_for6X(img,x)
1018 #define cimg_for6YZ(img,y,z) cimg_for6Z(img,z) cimg_for6Y(img,y)
1019 #define cimg_for6YC(img,y,c) cimg_for6C(img,c) cimg_for6Y(img,y)
1020 #define cimg_for6ZC(img,z,c) cimg_for6C(img,c) cimg_for6Z(img,z)
1021 #define cimg_for6XYZ(img,x,y,z) cimg_for6Z(img,z) cimg_for6XY(img,x,y)
1022 #define cimg_for6XZC(img,x,z,c) cimg_for6C(img,c) cimg_for6XZ(img,x,z)
1023 #define cimg_for6YZC(img,y,z,c) cimg_for6C(img,c) cimg_for6YZ(img,y,z)
1024 #define cimg_for6XYZC(img,x,y,z,c) cimg_for6C(img,c) cimg_for6XYZ(img,x,y,z)
1025
1026 #define cimg_for_in6(bound,i0,i1,i) \
1027  for (int i = (int)(i0)<0?0:(int)(i0), \
1028       _p2##i = i - 2<0?0:i - 2, \
1029       _p1##i = i - 1<0?0:i - 1, \
1030       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
1031       _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
1032       _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3; \
1033       i<=(int)(i1) && \
1034       (_n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i)); \
1035       _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
1036 #define cimg_for_in6X(img,x0,x1,x) cimg_for_in6((img)._width,x0,x1,x)
1037 #define cimg_for_in6Y(img,y0,y1,y) cimg_for_in6((img)._height,y0,y1,y)
1038 #define cimg_for_in6Z(img,z0,z1,z) cimg_for_in6((img)._depth,z0,z1,z)
1039 #define cimg_for_in6C(img,c0,c1,c) cimg_for_in6((img)._spectrum,c0,c1,c)
1040 #define cimg_for_in6XY(img,x0,y0,x1,y1,x,y) cimg_for_in6Y(img,y0,y1,y) cimg_for_in6X(img,x0,x1,x)
1041 #define cimg_for_in6XZ(img,x0,z0,x1,z1,x,z) cimg_for_in6Z(img,z0,z1,z) cimg_for_in6X(img,x0,x1,x)
1042 #define cimg_for_in6XC(img,x0,c0,x1,c1,x,c) cimg_for_in6C(img,c0,c1,c) cimg_for_in6X(img,x0,x1,x)
1043 #define cimg_for_in6YZ(img,y0,z0,y1,z1,y,z) cimg_for_in6Z(img,z0,z1,z) cimg_for_in6Y(img,y0,y1,y)
1044 #define cimg_for_in6YC(img,y0,c0,y1,c1,y,c) cimg_for_in6C(img,c0,c1,c) cimg_for_in6Y(img,y0,y1,y)
1045 #define cimg_for_in6ZC(img,z0,c0,z1,c1,z,c) cimg_for_in6C(img,c0,c1,c) cimg_for_in6Z(img,z0,z1,z)
1046 #define cimg_for_in6XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in6Z(img,z0,z1,z) cimg_for_in6XY(img,x0,y0,x1,y1,x,y)
1047 #define cimg_for_in6XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in6C(img,c0,c1,c) cimg_for_in6XZ(img,x0,y0,x1,y1,x,z)
1048 #define cimg_for_in6YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in6C(img,c0,c1,c) cimg_for_in6YZ(img,y0,z0,y1,z1,y,z)
1049 #define cimg_for_in6XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
1050   cimg_for_in6C(img,c0,c1,c) cimg_for_in6XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
1051
1052 #define cimg_for7(bound,i) \
1053  for (int i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
1054       _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
1055       _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
1056       _n3##i = 3>=(bound)?(int)(bound) - 1:3; \
1057       _n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i); \
1058       _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
1059 #define cimg_for7X(img,x) cimg_for7((img)._width,x)
1060 #define cimg_for7Y(img,y) cimg_for7((img)._height,y)
1061 #define cimg_for7Z(img,z) cimg_for7((img)._depth,z)
1062 #define cimg_for7C(img,c) cimg_for7((img)._spectrum,c)
1063 #define cimg_for7XY(img,x,y) cimg_for7Y(img,y) cimg_for7X(img,x)
1064 #define cimg_for7XZ(img,x,z) cimg_for7Z(img,z) cimg_for7X(img,x)
1065 #define cimg_for7XC(img,x,c) cimg_for7C(img,c) cimg_for7X(img,x)
1066 #define cimg_for7YZ(img,y,z) cimg_for7Z(img,z) cimg_for7Y(img,y)
1067 #define cimg_for7YC(img,y,c) cimg_for7C(img,c) cimg_for7Y(img,y)
1068 #define cimg_for7ZC(img,z,c) cimg_for7C(img,c) cimg_for7Z(img,z)
1069 #define cimg_for7XYZ(img,x,y,z) cimg_for7Z(img,z) cimg_for7XY(img,x,y)
1070 #define cimg_for7XZC(img,x,z,c) cimg_for7C(img,c) cimg_for7XZ(img,x,z)
1071 #define cimg_for7YZC(img,y,z,c) cimg_for7C(img,c) cimg_for7YZ(img,y,z)
1072 #define cimg_for7XYZC(img,x,y,z,c) cimg_for7C(img,c) cimg_for7XYZ(img,x,y,z)
1073
1074 #define cimg_for_in7(bound,i0,i1,i) \
1075  for (int i = (int)(i0)<0?0:(int)(i0), \
1076       _p3##i = i - 3<0?0:i - 3, \
1077       _p2##i = i - 2<0?0:i - 2, \
1078       _p1##i = i - 1<0?0:i - 1, \
1079       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
1080       _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
1081       _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3; \
1082       i<=(int)(i1) && \
1083       (_n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i)); \
1084       _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
1085 #define cimg_for_in7X(img,x0,x1,x) cimg_for_in7((img)._width,x0,x1,x)
1086 #define cimg_for_in7Y(img,y0,y1,y) cimg_for_in7((img)._height,y0,y1,y)
1087 #define cimg_for_in7Z(img,z0,z1,z) cimg_for_in7((img)._depth,z0,z1,z)
1088 #define cimg_for_in7C(img,c0,c1,c) cimg_for_in7((img)._spectrum,c0,c1,c)
1089 #define cimg_for_in7XY(img,x0,y0,x1,y1,x,y) cimg_for_in7Y(img,y0,y1,y) cimg_for_in7X(img,x0,x1,x)
1090 #define cimg_for_in7XZ(img,x0,z0,x1,z1,x,z) cimg_for_in7Z(img,z0,z1,z) cimg_for_in7X(img,x0,x1,x)
1091 #define cimg_for_in7XC(img,x0,c0,x1,c1,x,c) cimg_for_in7C(img,c0,c1,c) cimg_for_in7X(img,x0,x1,x)
1092 #define cimg_for_in7YZ(img,y0,z0,y1,z1,y,z) cimg_for_in7Z(img,z0,z1,z) cimg_for_in7Y(img,y0,y1,y)
1093 #define cimg_for_in7YC(img,y0,c0,y1,c1,y,c) cimg_for_in7C(img,c0,c1,c) cimg_for_in7Y(img,y0,y1,y)
1094 #define cimg_for_in7ZC(img,z0,c0,z1,c1,z,c) cimg_for_in7C(img,c0,c1,c) cimg_for_in7Z(img,z0,z1,z)
1095 #define cimg_for_in7XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in7Z(img,z0,z1,z) cimg_for_in7XY(img,x0,y0,x1,y1,x,y)
1096 #define cimg_for_in7XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in7C(img,c0,c1,c) cimg_for_in7XZ(img,x0,y0,x1,y1,x,z)
1097 #define cimg_for_in7YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in7C(img,c0,c1,c) cimg_for_in7YZ(img,y0,z0,y1,z1,y,z)
1098 #define cimg_for_in7XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
1099   cimg_for_in7C(img,c0,c1,c) cimg_for_in7XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
1100
1101 #define cimg_for8(bound,i) \
1102  for (int i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
1103       _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
1104       _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
1105       _n3##i = 3>=(bound)?(int)(bound) - 1:3, \
1106       _n4##i = 4>=(bound)?(int)(bound) - 1:4; \
1107       _n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
1108       i==(_n4##i = _n3##i = _n2##i = --_n1##i); \
1109       _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
1110 #define cimg_for8X(img,x) cimg_for8((img)._width,x)
1111 #define cimg_for8Y(img,y) cimg_for8((img)._height,y)
1112 #define cimg_for8Z(img,z) cimg_for8((img)._depth,z)
1113 #define cimg_for8C(img,c) cimg_for8((img)._spectrum,c)
1114 #define cimg_for8XY(img,x,y) cimg_for8Y(img,y) cimg_for8X(img,x)
1115 #define cimg_for8XZ(img,x,z) cimg_for8Z(img,z) cimg_for8X(img,x)
1116 #define cimg_for8XC(img,x,c) cimg_for8C(img,c) cimg_for8X(img,x)
1117 #define cimg_for8YZ(img,y,z) cimg_for8Z(img,z) cimg_for8Y(img,y)
1118 #define cimg_for8YC(img,y,c) cimg_for8C(img,c) cimg_for8Y(img,y)
1119 #define cimg_for8ZC(img,z,c) cimg_for8C(img,c) cimg_for8Z(img,z)
1120 #define cimg_for8XYZ(img,x,y,z) cimg_for8Z(img,z) cimg_for8XY(img,x,y)
1121 #define cimg_for8XZC(img,x,z,c) cimg_for8C(img,c) cimg_for8XZ(img,x,z)
1122 #define cimg_for8YZC(img,y,z,c) cimg_for8C(img,c) cimg_for8YZ(img,y,z)
1123 #define cimg_for8XYZC(img,x,y,z,c) cimg_for8C(img,c) cimg_for8XYZ(img,x,y,z)
1124
1125 #define cimg_for_in8(bound,i0,i1,i) \
1126  for (int i = (int)(i0)<0?0:(int)(i0), \
1127       _p3##i = i - 3<0?0:i - 3, \
1128       _p2##i = i - 2<0?0:i - 2, \
1129       _p1##i = i - 1<0?0:i - 1, \
1130       _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
1131       _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
1132       _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3, \
1133       _n4##i = i + 4>=(int)(bound)?(int)(bound) - 1:i + 4; \
1134       i<=(int)(i1) && (_n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
1135       i==(_n4##i = _n3##i = _n2##i = --_n1##i)); \
1136       _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
1137 #define cimg_for_in8X(img,x0,x1,x) cimg_for_in8((img)._width,x0,x1,x)
1138 #define cimg_for_in8Y(img,y0,y1,y) cimg_for_in8((img)._height,y0,y1,y)
1139 #define cimg_for_in8Z(img,z0,z1,z) cimg_for_in8((img)._depth,z0,z1,z)
1140 #define cimg_for_in8C(img,c0,c1,c) cimg_for_in8((img)._spectrum,c0,c1,c)
1141 #define cimg_for_in8XY(img,x0,y0,x1,y1,x,y) cimg_for_in8Y(img,y0,y1,y) cimg_for_in8X(img,x0,x1,x)
1142 #define cimg_for_in8XZ(img,x0,z0,x1,z1,x,z) cimg_for_in8Z(img,z0,z1,z) cimg_for_in8X(img,x0,x1,x)
1143 #define cimg_for_in8XC(img,x0,c0,x1,c1,x,c) cimg_for_in8C(img,c0,c1,c) cimg_for_in8X(img,x0,x1,x)
1144 #define cimg_for_in8YZ(img,y0,z0,y1,z1,y,z) cimg_for_in8Z(img,z0,z1,z) cimg_for_in8Y(img,y0,y1,y)
1145 #define cimg_for_in8YC(img,y0,c0,y1,c1,y,c) cimg_for_in8C(img,c0,c1,c) cimg_for_in8Y(img,y0,y1,y)
1146 #define cimg_for_in8ZC(img,z0,c0,z1,c1,z,c) cimg_for_in8C(img,c0,c1,c) cimg_for_in8Z(img,z0,z1,z)
1147 #define cimg_for_in8XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in8Z(img,z0,z1,z) cimg_for_in8XY(img,x0,y0,x1,y1,x,y)
1148 #define cimg_for_in8XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in8C(img,c0,c1,c) cimg_for_in8XZ(img,x0,y0,x1,y1,x,z)
1149 #define cimg_for_in8YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in8C(img,c0,c1,c) cimg_for_in8YZ(img,y0,z0,y1,z1,y,z)
1150 #define cimg_for_in8XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
1151   cimg_for_in8C(img,c0,c1,c) cimg_for_in8XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
1152
1153 #define cimg_for9(bound,i) \
1154   for (int i = 0, _p4##i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
1155        _n1##i = 1>=(int)(bound)?(int)(bound) - 1:1, \
1156        _n2##i = 2>=(int)(bound)?(int)(bound) - 1:2, \
1157        _n3##i = 3>=(int)(bound)?(int)(bound) - 1:3, \
1158        _n4##i = 4>=(int)(bound)?(int)(bound) - 1:4; \
1159        _n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
1160        i==(_n4##i = _n3##i = _n2##i = --_n1##i); \
1161        _p4##i = _p3##i, _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
1162 #define cimg_for9X(img,x) cimg_for9((img)._width,x)
1163 #define cimg_for9Y(img,y) cimg_for9((img)._height,y)
1164 #define cimg_for9Z(img,z) cimg_for9((img)._depth,z)
1165 #define cimg_for9C(img,c) cimg_for9((img)._spectrum,c)
1166 #define cimg_for9XY(img,x,y) cimg_for9Y(img,y) cimg_for9X(img,x)
1167 #define cimg_for9XZ(img,x,z) cimg_for9Z(img,z) cimg_for9X(img,x)
1168 #define cimg_for9XC(img,x,c) cimg_for9C(img,c) cimg_for9X(img,x)
1169 #define cimg_for9YZ(img,y,z) cimg_for9Z(img,z) cimg_for9Y(img,y)
1170 #define cimg_for9YC(img,y,c) cimg_for9C(img,c) cimg_for9Y(img,y)
1171 #define cimg_for9ZC(img,z,c) cimg_for9C(img,c) cimg_for9Z(img,z)
1172 #define cimg_for9XYZ(img,x,y,z) cimg_for9Z(img,z) cimg_for9XY(img,x,y)
1173 #define cimg_for9XZC(img,x,z,c) cimg_for9C(img,c) cimg_for9XZ(img,x,z)
1174 #define cimg_for9YZC(img,y,z,c) cimg_for9C(img,c) cimg_for9YZ(img,y,z)
1175 #define cimg_for9XYZC(img,x,y,z,c) cimg_for9C(img,c) cimg_for9XYZ(img,x,y,z)
1176
1177 #define cimg_for_in9(bound,i0,i1,i) \
1178   for (int i = (int)(i0)<0?0:(int)(i0), \
1179        _p4##i = i - 4<0?0:i - 4, \
1180        _p3##i = i - 3<0?0:i - 3, \
1181        _p2##i = i - 2<0?0:i - 2, \
1182        _p1##i = i - 1<0?0:i - 1, \
1183        _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
1184        _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
1185        _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3, \
1186        _n4##i = i + 4>=(int)(bound)?(int)(bound) - 1:i + 4; \
1187        i<=(int)(i1) && (_n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
1188        i==(_n4##i = _n3##i = _n2##i = --_n1##i)); \
1189        _p4##i = _p3##i, _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
1190 #define cimg_for_in9X(img,x0,x1,x) cimg_for_in9((img)._width,x0,x1,x)
1191 #define cimg_for_in9Y(img,y0,y1,y) cimg_for_in9((img)._height,y0,y1,y)
1192 #define cimg_for_in9Z(img,z0,z1,z) cimg_for_in9((img)._depth,z0,z1,z)
1193 #define cimg_for_in9C(img,c0,c1,c) cimg_for_in9((img)._spectrum,c0,c1,c)
1194 #define cimg_for_in9XY(img,x0,y0,x1,y1,x,y) cimg_for_in9Y(img,y0,y1,y) cimg_for_in9X(img,x0,x1,x)
1195 #define cimg_for_in9XZ(img,x0,z0,x1,z1,x,z) cimg_for_in9Z(img,z0,z1,z) cimg_for_in9X(img,x0,x1,x)
1196 #define cimg_for_in9XC(img,x0,c0,x1,c1,x,c) cimg_for_in9C(img,c0,c1,c) cimg_for_in9X(img,x0,x1,x)
1197 #define cimg_for_in9YZ(img,y0,z0,y1,z1,y,z) cimg_for_in9Z(img,z0,z1,z) cimg_for_in9Y(img,y0,y1,y)
1198 #define cimg_for_in9YC(img,y0,c0,y1,c1,y,c) cimg_for_in9C(img,c0,c1,c) cimg_for_in9Y(img,y0,y1,y)
1199 #define cimg_for_in9ZC(img,z0,c0,z1,c1,z,c) cimg_for_in9C(img,c0,c1,c) cimg_for_in9Z(img,z0,z1,z)
1200 #define cimg_for_in9XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) cimg_for_in9Z(img,z0,z1,z) cimg_for_in9XY(img,x0,y0,x1,y1,x,y)
1201 #define cimg_for_in9XZC(img,x0,z0,c0,x1,y1,c1,x,z,c) cimg_for_in9C(img,c0,c1,c) cimg_for_in9XZ(img,x0,y0,x1,y1,x,z)
1202 #define cimg_for_in9YZC(img,y0,z0,c0,y1,z1,c1,y,z,c) cimg_for_in9C(img,c0,c1,c) cimg_for_in9YZ(img,y0,z0,y1,z1,y,z)
1203 #define cimg_for_in9XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
1204   cimg_for_in9C(img,c0,c1,c) cimg_for_in9XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
1205
1206 #define cimg_for2x2(img,x,y,z,c,I,T) \
1207   cimg_for2((img)._height,y) for (int x = 0, \
1208    _n1##x = (int)( \
1209    (I[0] = (T)(img)(0,y,z,c)), \
1210    (I[2] = (T)(img)(0,_n1##y,z,c)), \
1211    1>=(img)._width?(img).width() - 1:1);  \
1212    (_n1##x<(img).width() && ( \
1213    (I[1] = (T)(img)(_n1##x,y,z,c)), \
1214    (I[3] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
1215    x==--_n1##x; \
1216    I[0] = I[1], \
1217    I[2] = I[3], \
1218    ++x, ++_n1##x)
1219
1220 #define cimg_for_in2x2(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1221   cimg_for_in2((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1222    _n1##x = (int)( \
1223    (I[0] = (T)(img)(x,y,z,c)), \
1224    (I[2] = (T)(img)(x,_n1##y,z,c)), \
1225    x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
1226    x<=(int)(x1) && ((_n1##x<(img).width() && (  \
1227    (I[1] = (T)(img)(_n1##x,y,z,c)), \
1228    (I[3] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
1229    x==--_n1##x); \
1230    I[0] = I[1], \
1231    I[2] = I[3], \
1232    ++x, ++_n1##x)
1233
1234 #define cimg_for3x3(img,x,y,z,c,I,T) \
1235   cimg_for3((img)._height,y) for (int x = 0, \
1236    _p1##x = 0, \
1237    _n1##x = (int)( \
1238    (I[0] = I[1] = (T)(img)(_p1##x,_p1##y,z,c)), \
1239    (I[3] = I[4] = (T)(img)(0,y,z,c)), \
1240    (I[6] = I[7] = (T)(img)(0,_n1##y,z,c)), \
1241    1>=(img)._width?(img).width() - 1:1); \
1242    (_n1##x<(img).width() && ( \
1243    (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
1244    (I[5] = (T)(img)(_n1##x,y,z,c)), \
1245    (I[8] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
1246    x==--_n1##x; \
1247    I[0] = I[1], I[1] = I[2], \
1248    I[3] = I[4], I[4] = I[5], \
1249    I[6] = I[7], I[7] = I[8], \
1250    _p1##x = x++, ++_n1##x)
1251
1252 #define cimg_for_in3x3(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1253   cimg_for_in3((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1254    _p1##x = x - 1<0?0:x - 1, \
1255    _n1##x = (int)( \
1256    (I[0] = (T)(img)(_p1##x,_p1##y,z,c)), \
1257    (I[3] = (T)(img)(_p1##x,y,z,c)), \
1258    (I[6] = (T)(img)(_p1##x,_n1##y,z,c)), \
1259    (I[1] = (T)(img)(x,_p1##y,z,c)), \
1260    (I[4] = (T)(img)(x,y,z,c)), \
1261    (I[7] = (T)(img)(x,_n1##y,z,c)), \
1262    x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
1263    x<=(int)(x1) && ((_n1##x<(img).width() && ( \
1264    (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
1265    (I[5] = (T)(img)(_n1##x,y,z,c)), \
1266    (I[8] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
1267    x==--_n1##x);            \
1268    I[0] = I[1], I[1] = I[2], \
1269    I[3] = I[4], I[4] = I[5], \
1270    I[6] = I[7], I[7] = I[8], \
1271    _p1##x = x++, ++_n1##x)
1272
1273 #define cimg_for4x4(img,x,y,z,c,I,T) \
1274   cimg_for4((img)._height,y) for (int x = 0, \
1275    _p1##x = 0, \
1276    _n1##x = 1>=(img)._width?(img).width() - 1:1, \
1277    _n2##x = (int)( \
1278    (I[0] = I[1] = (T)(img)(_p1##x,_p1##y,z,c)), \
1279    (I[4] = I[5] = (T)(img)(0,y,z,c)), \
1280    (I[8] = I[9] = (T)(img)(0,_n1##y,z,c)), \
1281    (I[12] = I[13] = (T)(img)(0,_n2##y,z,c)), \
1282    (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
1283    (I[6] = (T)(img)(_n1##x,y,z,c)), \
1284    (I[10] = (T)(img)(_n1##x,_n1##y,z,c)), \
1285    (I[14] = (T)(img)(_n1##x,_n2##y,z,c)), \
1286    2>=(img)._width?(img).width() - 1:2); \
1287    (_n2##x<(img).width() && ( \
1288    (I[3] = (T)(img)(_n2##x,_p1##y,z,c)), \
1289    (I[7] = (T)(img)(_n2##x,y,z,c)), \
1290    (I[11] = (T)(img)(_n2##x,_n1##y,z,c)), \
1291    (I[15] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
1292    _n1##x==--_n2##x || x==(_n2##x = --_n1##x); \
1293    I[0] = I[1], I[1] = I[2], I[2] = I[3], \
1294    I[4] = I[5], I[5] = I[6], I[6] = I[7], \
1295    I[8] = I[9], I[9] = I[10], I[10] = I[11], \
1296    I[12] = I[13], I[13] = I[14], I[14] = I[15], \
1297    _p1##x = x++, ++_n1##x, ++_n2##x)
1298
1299 #define cimg_for_in4x4(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1300   cimg_for_in4((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1301    _p1##x = x - 1<0?0:x - 1, \
1302    _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
1303    _n2##x = (int)( \
1304    (I[0] = (T)(img)(_p1##x,_p1##y,z,c)), \
1305    (I[4] = (T)(img)(_p1##x,y,z,c)), \
1306    (I[8] = (T)(img)(_p1##x,_n1##y,z,c)), \
1307    (I[12] = (T)(img)(_p1##x,_n2##y,z,c)), \
1308    (I[1] = (T)(img)(x,_p1##y,z,c)), \
1309    (I[5] = (T)(img)(x,y,z,c)), \
1310    (I[9] = (T)(img)(x,_n1##y,z,c)), \
1311    (I[13] = (T)(img)(x,_n2##y,z,c)), \
1312    (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
1313    (I[6] = (T)(img)(_n1##x,y,z,c)), \
1314    (I[10] = (T)(img)(_n1##x,_n1##y,z,c)), \
1315    (I[14] = (T)(img)(_n1##x,_n2##y,z,c)), \
1316    x + 2>=(int)(img)._width?(img).width() - 1:x + 2); \
1317    x<=(int)(x1) && ((_n2##x<(img).width() && ( \
1318    (I[3] = (T)(img)(_n2##x,_p1##y,z,c)), \
1319    (I[7] = (T)(img)(_n2##x,y,z,c)), \
1320    (I[11] = (T)(img)(_n2##x,_n1##y,z,c)), \
1321    (I[15] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
1322    _n1##x==--_n2##x || x==(_n2##x = --_n1##x)); \
1323    I[0] = I[1], I[1] = I[2], I[2] = I[3], \
1324    I[4] = I[5], I[5] = I[6], I[6] = I[7], \
1325    I[8] = I[9], I[9] = I[10], I[10] = I[11], \
1326    I[12] = I[13], I[13] = I[14], I[14] = I[15], \
1327    _p1##x = x++, ++_n1##x, ++_n2##x)
1328
1329 #define cimg_for5x5(img,x,y,z,c,I,T) \
1330  cimg_for5((img)._height,y) for (int x = 0, \
1331    _p2##x = 0, _p1##x = 0, \
1332    _n1##x = 1>=(img)._width?(img).width() - 1:1, \
1333    _n2##x = (int)( \
1334    (I[0] = I[1] = I[2] = (T)(img)(_p2##x,_p2##y,z,c)), \
1335    (I[5] = I[6] = I[7] = (T)(img)(0,_p1##y,z,c)), \
1336    (I[10] = I[11] = I[12] = (T)(img)(0,y,z,c)), \
1337    (I[15] = I[16] = I[17] = (T)(img)(0,_n1##y,z,c)), \
1338    (I[20] = I[21] = I[22] = (T)(img)(0,_n2##y,z,c)), \
1339    (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
1340    (I[8] = (T)(img)(_n1##x,_p1##y,z,c)), \
1341    (I[13] = (T)(img)(_n1##x,y,z,c)), \
1342    (I[18] = (T)(img)(_n1##x,_n1##y,z,c)), \
1343    (I[23] = (T)(img)(_n1##x,_n2##y,z,c)),  \
1344    2>=(img)._width?(img).width() - 1:2); \
1345    (_n2##x<(img).width() && ( \
1346    (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
1347    (I[9] = (T)(img)(_n2##x,_p1##y,z,c)), \
1348    (I[14] = (T)(img)(_n2##x,y,z,c)), \
1349    (I[19] = (T)(img)(_n2##x,_n1##y,z,c)), \
1350    (I[24] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
1351    _n1##x==--_n2##x || x==(_n2##x = --_n1##x); \
1352    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], \
1353    I[5] = I[6], I[6] = I[7], I[7] = I[8], I[8] = I[9], \
1354    I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], \
1355    I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], \
1356    I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
1357    _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x)
1358
1359 #define cimg_for_in5x5(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1360  cimg_for_in5((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1361    _p2##x = x - 2<0?0:x - 2, \
1362    _p1##x = x - 1<0?0:x - 1, \
1363    _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
1364    _n2##x = (int)( \
1365    (I[0] = (T)(img)(_p2##x,_p2##y,z,c)), \
1366    (I[5] = (T)(img)(_p2##x,_p1##y,z,c)), \
1367    (I[10] = (T)(img)(_p2##x,y,z,c)), \
1368    (I[15] = (T)(img)(_p2##x,_n1##y,z,c)), \
1369    (I[20] = (T)(img)(_p2##x,_n2##y,z,c)), \
1370    (I[1] = (T)(img)(_p1##x,_p2##y,z,c)), \
1371    (I[6] = (T)(img)(_p1##x,_p1##y,z,c)), \
1372    (I[11] = (T)(img)(_p1##x,y,z,c)), \
1373    (I[16] = (T)(img)(_p1##x,_n1##y,z,c)), \
1374    (I[21] = (T)(img)(_p1##x,_n2##y,z,c)), \
1375    (I[2] = (T)(img)(x,_p2##y,z,c)), \
1376    (I[7] = (T)(img)(x,_p1##y,z,c)), \
1377    (I[12] = (T)(img)(x,y,z,c)), \
1378    (I[17] = (T)(img)(x,_n1##y,z,c)), \
1379    (I[22] = (T)(img)(x,_n2##y,z,c)), \
1380    (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
1381    (I[8] = (T)(img)(_n1##x,_p1##y,z,c)), \
1382    (I[13] = (T)(img)(_n1##x,y,z,c)), \
1383    (I[18] = (T)(img)(_n1##x,_n1##y,z,c)), \
1384    (I[23] = (T)(img)(_n1##x,_n2##y,z,c)), \
1385    x + 2>=(int)(img)._width?(img).width() - 1:x + 2); \
1386    x<=(int)(x1) && ((_n2##x<(img).width() && ( \
1387    (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
1388    (I[9] = (T)(img)(_n2##x,_p1##y,z,c)), \
1389    (I[14] = (T)(img)(_n2##x,y,z,c)), \
1390    (I[19] = (T)(img)(_n2##x,_n1##y,z,c)), \
1391    (I[24] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
1392    _n1##x==--_n2##x || x==(_n2##x = --_n1##x)); \
1393    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], \
1394    I[5] = I[6], I[6] = I[7], I[7] = I[8], I[8] = I[9], \
1395    I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], \
1396    I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], \
1397    I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
1398    _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x)
1399
1400 #define cimg_for6x6(img,x,y,z,c,I,T) \
1401  cimg_for6((img)._height,y) for (int x = 0, \
1402    _p2##x = 0, _p1##x = 0, \
1403    _n1##x = 1>=(img)._width?(img).width() - 1:1, \
1404    _n2##x = 2>=(img)._width?(img).width() - 1:2, \
1405    _n3##x = (int)( \
1406    (I[0] = I[1] = I[2] = (T)(img)(_p2##x,_p2##y,z,c)), \
1407    (I[6] = I[7] = I[8] = (T)(img)(0,_p1##y,z,c)), \
1408    (I[12] = I[13] = I[14] = (T)(img)(0,y,z,c)), \
1409    (I[18] = I[19] = I[20] = (T)(img)(0,_n1##y,z,c)), \
1410    (I[24] = I[25] = I[26] = (T)(img)(0,_n2##y,z,c)), \
1411    (I[30] = I[31] = I[32] = (T)(img)(0,_n3##y,z,c)), \
1412    (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
1413    (I[9] = (T)(img)(_n1##x,_p1##y,z,c)), \
1414    (I[15] = (T)(img)(_n1##x,y,z,c)), \
1415    (I[21] = (T)(img)(_n1##x,_n1##y,z,c)), \
1416    (I[27] = (T)(img)(_n1##x,_n2##y,z,c)), \
1417    (I[33] = (T)(img)(_n1##x,_n3##y,z,c)), \
1418    (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
1419    (I[10] = (T)(img)(_n2##x,_p1##y,z,c)), \
1420    (I[16] = (T)(img)(_n2##x,y,z,c)), \
1421    (I[22] = (T)(img)(_n2##x,_n1##y,z,c)), \
1422    (I[28] = (T)(img)(_n2##x,_n2##y,z,c)), \
1423    (I[34] = (T)(img)(_n2##x,_n3##y,z,c)), \
1424    3>=(img)._width?(img).width() - 1:3); \
1425    (_n3##x<(img).width() && ( \
1426    (I[5] = (T)(img)(_n3##x,_p2##y,z,c)), \
1427    (I[11] = (T)(img)(_n3##x,_p1##y,z,c)), \
1428    (I[17] = (T)(img)(_n3##x,y,z,c)), \
1429    (I[23] = (T)(img)(_n3##x,_n1##y,z,c)), \
1430    (I[29] = (T)(img)(_n3##x,_n2##y,z,c)), \
1431    (I[35] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
1432    _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3## x = _n2##x = --_n1##x); \
1433    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], \
1434    I[6] = I[7], I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], \
1435    I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], I[16] = I[17], \
1436    I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
1437    I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], \
1438    I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], I[34] = I[35], \
1439    _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
1440
1441 #define cimg_for_in6x6(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1442   cimg_for_in6((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)x0, \
1443    _p2##x = x - 2<0?0:x - 2, \
1444    _p1##x = x - 1<0?0:x - 1, \
1445    _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
1446    _n2##x = x + 2>=(int)(img)._width?(img).width() - 1:x + 2, \
1447    _n3##x = (int)( \
1448    (I[0] = (T)(img)(_p2##x,_p2##y,z,c)), \
1449    (I[6] = (T)(img)(_p2##x,_p1##y,z,c)), \
1450    (I[12] = (T)(img)(_p2##x,y,z,c)), \
1451    (I[18] = (T)(img)(_p2##x,_n1##y,z,c)), \
1452    (I[24] = (T)(img)(_p2##x,_n2##y,z,c)), \
1453    (I[30] = (T)(img)(_p2##x,_n3##y,z,c)), \
1454    (I[1] = (T)(img)(_p1##x,_p2##y,z,c)), \
1455    (I[7] = (T)(img)(_p1##x,_p1##y,z,c)), \
1456    (I[13] = (T)(img)(_p1##x,y,z,c)), \
1457    (I[19] = (T)(img)(_p1##x,_n1##y,z,c)), \
1458    (I[25] = (T)(img)(_p1##x,_n2##y,z,c)), \
1459    (I[31] = (T)(img)(_p1##x,_n3##y,z,c)), \
1460    (I[2] = (T)(img)(x,_p2##y,z,c)), \
1461    (I[8] = (T)(img)(x,_p1##y,z,c)), \
1462    (I[14] = (T)(img)(x,y,z,c)), \
1463    (I[20] = (T)(img)(x,_n1##y,z,c)), \
1464    (I[26] = (T)(img)(x,_n2##y,z,c)), \
1465    (I[32] = (T)(img)(x,_n3##y,z,c)), \
1466    (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
1467    (I[9] = (T)(img)(_n1##x,_p1##y,z,c)), \
1468    (I[15] = (T)(img)(_n1##x,y,z,c)), \
1469    (I[21] = (T)(img)(_n1##x,_n1##y,z,c)), \
1470    (I[27] = (T)(img)(_n1##x,_n2##y,z,c)), \
1471    (I[33] = (T)(img)(_n1##x,_n3##y,z,c)), \
1472    (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
1473    (I[10] = (T)(img)(_n2##x,_p1##y,z,c)), \
1474    (I[16] = (T)(img)(_n2##x,y,z,c)), \
1475    (I[22] = (T)(img)(_n2##x,_n1##y,z,c)), \
1476    (I[28] = (T)(img)(_n2##x,_n2##y,z,c)), \
1477    (I[34] = (T)(img)(_n2##x,_n3##y,z,c)), \
1478    x + 3>=(int)(img)._width?(img).width() - 1:x + 3); \
1479    x<=(int)(x1) && ((_n3##x<(img).width() && ( \
1480    (I[5] = (T)(img)(_n3##x,_p2##y,z,c)), \
1481    (I[11] = (T)(img)(_n3##x,_p1##y,z,c)), \
1482    (I[17] = (T)(img)(_n3##x,y,z,c)), \
1483    (I[23] = (T)(img)(_n3##x,_n1##y,z,c)), \
1484    (I[29] = (T)(img)(_n3##x,_n2##y,z,c)), \
1485    (I[35] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
1486    _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3## x = _n2##x = --_n1##x)); \
1487    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], \
1488    I[6] = I[7], I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], \
1489    I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], I[16] = I[17], \
1490    I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
1491    I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], \
1492    I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], I[34] = I[35], \
1493    _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
1494
1495 #define cimg_for7x7(img,x,y,z,c,I,T) \
1496   cimg_for7((img)._height,y) for (int x = 0, \
1497    _p3##x = 0, _p2##x = 0, _p1##x = 0, \
1498    _n1##x = 1>=(img)._width?(img).width() - 1:1, \
1499    _n2##x = 2>=(img)._width?(img).width() - 1:2, \
1500    _n3##x = (int)( \
1501    (I[0] = I[1] = I[2] = I[3] = (T)(img)(_p3##x,_p3##y,z,c)), \
1502    (I[7] = I[8] = I[9] = I[10] = (T)(img)(0,_p2##y,z,c)), \
1503    (I[14] = I[15] = I[16] = I[17] = (T)(img)(0,_p1##y,z,c)), \
1504    (I[21] = I[22] = I[23] = I[24] = (T)(img)(0,y,z,c)), \
1505    (I[28] = I[29] = I[30] = I[31] = (T)(img)(0,_n1##y,z,c)), \
1506    (I[35] = I[36] = I[37] = I[38] = (T)(img)(0,_n2##y,z,c)), \
1507    (I[42] = I[43] = I[44] = I[45] = (T)(img)(0,_n3##y,z,c)), \
1508    (I[4] = (T)(img)(_n1##x,_p3##y,z,c)), \
1509    (I[11] = (T)(img)(_n1##x,_p2##y,z,c)), \
1510    (I[18] = (T)(img)(_n1##x,_p1##y,z,c)), \
1511    (I[25] = (T)(img)(_n1##x,y,z,c)), \
1512    (I[32] = (T)(img)(_n1##x,_n1##y,z,c)), \
1513    (I[39] = (T)(img)(_n1##x,_n2##y,z,c)), \
1514    (I[46] = (T)(img)(_n1##x,_n3##y,z,c)), \
1515    (I[5] = (T)(img)(_n2##x,_p3##y,z,c)), \
1516    (I[12] = (T)(img)(_n2##x,_p2##y,z,c)), \
1517    (I[19] = (T)(img)(_n2##x,_p1##y,z,c)), \
1518    (I[26] = (T)(img)(_n2##x,y,z,c)), \
1519    (I[33] = (T)(img)(_n2##x,_n1##y,z,c)), \
1520    (I[40] = (T)(img)(_n2##x,_n2##y,z,c)), \
1521    (I[47] = (T)(img)(_n2##x,_n3##y,z,c)), \
1522    3>=(img)._width?(img).width() - 1:3); \
1523    (_n3##x<(img).width() && ( \
1524    (I[6] = (T)(img)(_n3##x,_p3##y,z,c)), \
1525    (I[13] = (T)(img)(_n3##x,_p2##y,z,c)), \
1526    (I[20] = (T)(img)(_n3##x,_p1##y,z,c)), \
1527    (I[27] = (T)(img)(_n3##x,y,z,c)), \
1528    (I[34] = (T)(img)(_n3##x,_n1##y,z,c)), \
1529    (I[41] = (T)(img)(_n3##x,_n2##y,z,c)), \
1530    (I[48] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
1531    _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3##x = _n2##x = --_n1##x); \
1532    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], \
1533    I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], \
1534    I[14] = I[15], I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], I[19] = I[20], \
1535    I[21] = I[22], I[22] = I[23], I[23] = I[24], I[24] = I[25], I[25] = I[26], I[26] = I[27], \
1536    I[28] = I[29], I[29] = I[30], I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], \
1537    I[35] = I[36], I[36] = I[37], I[37] = I[38], I[38] = I[39], I[39] = I[40], I[40] = I[41], \
1538    I[42] = I[43], I[43] = I[44], I[44] = I[45], I[45] = I[46], I[46] = I[47], I[47] = I[48], \
1539    _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
1540
1541 #define cimg_for_in7x7(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1542   cimg_for_in7((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1543    _p3##x = x - 3<0?0:x - 3, \
1544    _p2##x = x - 2<0?0:x - 2, \
1545    _p1##x = x - 1<0?0:x - 1, \
1546    _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
1547    _n2##x = x + 2>=(int)(img)._width?(img).width() - 1:x + 2, \
1548    _n3##x = (int)( \
1549    (I[0] = (T)(img)(_p3##x,_p3##y,z,c)), \
1550    (I[7] = (T)(img)(_p3##x,_p2##y,z,c)), \
1551    (I[14] = (T)(img)(_p3##x,_p1##y,z,c)), \
1552    (I[21] = (T)(img)(_p3##x,y,z,c)), \
1553    (I[28] = (T)(img)(_p3##x,_n1##y,z,c)), \
1554    (I[35] = (T)(img)(_p3##x,_n2##y,z,c)), \
1555    (I[42] = (T)(img)(_p3##x,_n3##y,z,c)), \
1556    (I[1] = (T)(img)(_p2##x,_p3##y,z,c)), \
1557    (I[8] = (T)(img)(_p2##x,_p2##y,z,c)), \
1558    (I[15] = (T)(img)(_p2##x,_p1##y,z,c)), \
1559    (I[22] = (T)(img)(_p2##x,y,z,c)), \
1560    (I[29] = (T)(img)(_p2##x,_n1##y,z,c)), \
1561    (I[36] = (T)(img)(_p2##x,_n2##y,z,c)), \
1562    (I[43] = (T)(img)(_p2##x,_n3##y,z,c)), \
1563    (I[2] = (T)(img)(_p1##x,_p3##y,z,c)), \
1564    (I[9] = (T)(img)(_p1##x,_p2##y,z,c)), \
1565    (I[16] = (T)(img)(_p1##x,_p1##y,z,c)), \
1566    (I[23] = (T)(img)(_p1##x,y,z,c)), \
1567    (I[30] = (T)(img)(_p1##x,_n1##y,z,c)), \
1568    (I[37] = (T)(img)(_p1##x,_n2##y,z,c)), \
1569    (I[44] = (T)(img)(_p1##x,_n3##y,z,c)), \
1570    (I[3] = (T)(img)(x,_p3##y,z,c)), \
1571    (I[10] = (T)(img)(x,_p2##y,z,c)), \
1572    (I[17] = (T)(img)(x,_p1##y,z,c)), \
1573    (I[24] = (T)(img)(x,y,z,c)), \
1574    (I[31] = (T)(img)(x,_n1##y,z,c)), \
1575    (I[38] = (T)(img)(x,_n2##y,z,c)), \
1576    (I[45] = (T)(img)(x,_n3##y,z,c)), \
1577    (I[4] = (T)(img)(_n1##x,_p3##y,z,c)), \
1578    (I[11] = (T)(img)(_n1##x,_p2##y,z,c)), \
1579    (I[18] = (T)(img)(_n1##x,_p1##y,z,c)), \
1580    (I[25] = (T)(img)(_n1##x,y,z,c)), \
1581    (I[32] = (T)(img)(_n1##x,_n1##y,z,c)), \
1582    (I[39] = (T)(img)(_n1##x,_n2##y,z,c)), \
1583    (I[46] = (T)(img)(_n1##x,_n3##y,z,c)), \
1584    (I[5] = (T)(img)(_n2##x,_p3##y,z,c)), \
1585    (I[12] = (T)(img)(_n2##x,_p2##y,z,c)), \
1586    (I[19] = (T)(img)(_n2##x,_p1##y,z,c)), \
1587    (I[26] = (T)(img)(_n2##x,y,z,c)), \
1588    (I[33] = (T)(img)(_n2##x,_n1##y,z,c)), \
1589    (I[40] = (T)(img)(_n2##x,_n2##y,z,c)), \
1590    (I[47] = (T)(img)(_n2##x,_n3##y,z,c)), \
1591    x + 3>=(int)(img)._width?(img).width() - 1:x + 3); \
1592    x<=(int)(x1) && ((_n3##x<(img).width() && ( \
1593    (I[6] = (T)(img)(_n3##x,_p3##y,z,c)), \
1594    (I[13] = (T)(img)(_n3##x,_p2##y,z,c)), \
1595    (I[20] = (T)(img)(_n3##x,_p1##y,z,c)), \
1596    (I[27] = (T)(img)(_n3##x,y,z,c)), \
1597    (I[34] = (T)(img)(_n3##x,_n1##y,z,c)), \
1598    (I[41] = (T)(img)(_n3##x,_n2##y,z,c)), \
1599    (I[48] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
1600    _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3##x = _n2##x = --_n1##x)); \
1601    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], \
1602    I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], \
1603    I[14] = I[15], I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], I[19] = I[20], \
1604    I[21] = I[22], I[22] = I[23], I[23] = I[24], I[24] = I[25], I[25] = I[26], I[26] = I[27], \
1605    I[28] = I[29], I[29] = I[30], I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], \
1606    I[35] = I[36], I[36] = I[37], I[37] = I[38], I[38] = I[39], I[39] = I[40], I[40] = I[41], \
1607    I[42] = I[43], I[43] = I[44], I[44] = I[45], I[45] = I[46], I[46] = I[47], I[47] = I[48], \
1608    _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
1609
1610 #define cimg_for8x8(img,x,y,z,c,I,T) \
1611   cimg_for8((img)._height,y) for (int x = 0, \
1612    _p3##x = 0, _p2##x = 0, _p1##x = 0, \
1613    _n1##x = 1>=((img)._width)?(img).width() - 1:1, \
1614    _n2##x = 2>=((img)._width)?(img).width() - 1:2, \
1615    _n3##x = 3>=((img)._width)?(img).width() - 1:3, \
1616    _n4##x = (int)( \
1617    (I[0] = I[1] = I[2] = I[3] = (T)(img)(_p3##x,_p3##y,z,c)), \
1618    (I[8] = I[9] = I[10] = I[11] = (T)(img)(0,_p2##y,z,c)), \
1619    (I[16] = I[17] = I[18] = I[19] = (T)(img)(0,_p1##y,z,c)), \
1620    (I[24] = I[25] = I[26] = I[27] = (T)(img)(0,y,z,c)), \
1621    (I[32] = I[33] = I[34] = I[35] = (T)(img)(0,_n1##y,z,c)), \
1622    (I[40] = I[41] = I[42] = I[43] = (T)(img)(0,_n2##y,z,c)), \
1623    (I[48] = I[49] = I[50] = I[51] = (T)(img)(0,_n3##y,z,c)), \
1624    (I[56] = I[57] = I[58] = I[59] = (T)(img)(0,_n4##y,z,c)), \
1625    (I[4] = (T)(img)(_n1##x,_p3##y,z,c)), \
1626    (I[12] = (T)(img)(_n1##x,_p2##y,z,c)), \
1627    (I[20] = (T)(img)(_n1##x,_p1##y,z,c)), \
1628    (I[28] = (T)(img)(_n1##x,y,z,c)), \
1629    (I[36] = (T)(img)(_n1##x,_n1##y,z,c)), \
1630    (I[44] = (T)(img)(_n1##x,_n2##y,z,c)), \
1631    (I[52] = (T)(img)(_n1##x,_n3##y,z,c)), \
1632    (I[60] = (T)(img)(_n1##x,_n4##y,z,c)), \
1633    (I[5] = (T)(img)(_n2##x,_p3##y,z,c)), \
1634    (I[13] = (T)(img)(_n2##x,_p2##y,z,c)), \
1635    (I[21] = (T)(img)(_n2##x,_p1##y,z,c)), \
1636    (I[29] = (T)(img)(_n2##x,y,z,c)), \
1637    (I[37] = (T)(img)(_n2##x,_n1##y,z,c)), \
1638    (I[45] = (T)(img)(_n2##x,_n2##y,z,c)), \
1639    (I[53] = (T)(img)(_n2##x,_n3##y,z,c)), \
1640    (I[61] = (T)(img)(_n2##x,_n4##y,z,c)), \
1641    (I[6] = (T)(img)(_n3##x,_p3##y,z,c)), \
1642    (I[14] = (T)(img)(_n3##x,_p2##y,z,c)), \
1643    (I[22] = (T)(img)(_n3##x,_p1##y,z,c)), \
1644    (I[30] = (T)(img)(_n3##x,y,z,c)), \
1645    (I[38] = (T)(img)(_n3##x,_n1##y,z,c)), \
1646    (I[46] = (T)(img)(_n3##x,_n2##y,z,c)), \
1647    (I[54] = (T)(img)(_n3##x,_n3##y,z,c)), \
1648    (I[62] = (T)(img)(_n3##x,_n4##y,z,c)), \
1649    4>=((img)._width)?(img).width() - 1:4); \
1650    (_n4##x<(img).width() && ( \
1651    (I[7] = (T)(img)(_n4##x,_p3##y,z,c)), \
1652    (I[15] = (T)(img)(_n4##x,_p2##y,z,c)), \
1653    (I[23] = (T)(img)(_n4##x,_p1##y,z,c)), \
1654    (I[31] = (T)(img)(_n4##x,y,z,c)), \
1655    (I[39] = (T)(img)(_n4##x,_n1##y,z,c)), \
1656    (I[47] = (T)(img)(_n4##x,_n2##y,z,c)), \
1657    (I[55] = (T)(img)(_n4##x,_n3##y,z,c)), \
1658    (I[63] = (T)(img)(_n4##x,_n4##y,z,c)),1)) || \
1659    _n3##x==--_n4##x || _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n4##x = _n3##x = _n2##x = --_n1##x); \
1660    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], I[6] = I[7], \
1661    I[8] = I[9], I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], I[14] = I[15], \
1662    I[16] = I[17], I[17] = I[18], I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
1663    I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], I[29] = I[30], I[30] = I[31], \
1664    I[32] = I[33], I[33] = I[34], I[34] = I[35], I[35] = I[36], I[36] = I[37], I[37] = I[38], I[38] = I[39], \
1665    I[40] = I[41], I[41] = I[42], I[42] = I[43], I[43] = I[44], I[44] = I[45], I[45] = I[46], I[46] = I[47], \
1666    I[48] = I[49], I[49] = I[50], I[50] = I[51], I[51] = I[52], I[52] = I[53], I[53] = I[54], I[54] = I[55], \
1667    I[56] = I[57], I[57] = I[58], I[58] = I[59], I[59] = I[60], I[60] = I[61], I[61] = I[62], I[62] = I[63], \
1668    _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x, ++_n4##x)
1669
1670 #define cimg_for_in8x8(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1671   cimg_for_in8((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1672    _p3##x = x - 3<0?0:x - 3, \
1673    _p2##x = x - 2<0?0:x - 2, \
1674    _p1##x = x - 1<0?0:x - 1, \
1675    _n1##x = x + 1>=(img).width()?(img).width() - 1:x + 1, \
1676    _n2##x = x + 2>=(img).width()?(img).width() - 1:x + 2, \
1677    _n3##x = x + 3>=(img).width()?(img).width() - 1:x + 3, \
1678    _n4##x = (int)( \
1679    (I[0] = (T)(img)(_p3##x,_p3##y,z,c)), \
1680    (I[8] = (T)(img)(_p3##x,_p2##y,z,c)), \
1681    (I[16] = (T)(img)(_p3##x,_p1##y,z,c)), \
1682    (I[24] = (T)(img)(_p3##x,y,z,c)), \
1683    (I[32] = (T)(img)(_p3##x,_n1##y,z,c)), \
1684    (I[40] = (T)(img)(_p3##x,_n2##y,z,c)), \
1685    (I[48] = (T)(img)(_p3##x,_n3##y,z,c)), \
1686    (I[56] = (T)(img)(_p3##x,_n4##y,z,c)), \
1687    (I[1] = (T)(img)(_p2##x,_p3##y,z,c)), \
1688    (I[9] = (T)(img)(_p2##x,_p2##y,z,c)), \
1689    (I[17] = (T)(img)(_p2##x,_p1##y,z,c)), \
1690    (I[25] = (T)(img)(_p2##x,y,z,c)), \
1691    (I[33] = (T)(img)(_p2##x,_n1##y,z,c)), \
1692    (I[41] = (T)(img)(_p2##x,_n2##y,z,c)), \
1693    (I[49] = (T)(img)(_p2##x,_n3##y,z,c)), \
1694    (I[57] = (T)(img)(_p2##x,_n4##y,z,c)), \
1695    (I[2] = (T)(img)(_p1##x,_p3##y,z,c)), \
1696    (I[10] = (T)(img)(_p1##x,_p2##y,z,c)), \
1697    (I[18] = (T)(img)(_p1##x,_p1##y,z,c)), \
1698    (I[26] = (T)(img)(_p1##x,y,z,c)), \
1699    (I[34] = (T)(img)(_p1##x,_n1##y,z,c)), \
1700    (I[42] = (T)(img)(_p1##x,_n2##y,z,c)), \
1701    (I[50] = (T)(img)(_p1##x,_n3##y,z,c)), \
1702    (I[58] = (T)(img)(_p1##x,_n4##y,z,c)), \
1703    (I[3] = (T)(img)(x,_p3##y,z,c)), \
1704    (I[11] = (T)(img)(x,_p2##y,z,c)), \
1705    (I[19] = (T)(img)(x,_p1##y,z,c)), \
1706    (I[27] = (T)(img)(x,y,z,c)), \
1707    (I[35] = (T)(img)(x,_n1##y,z,c)), \
1708    (I[43] = (T)(img)(x,_n2##y,z,c)), \
1709    (I[51] = (T)(img)(x,_n3##y,z,c)), \
1710    (I[59] = (T)(img)(x,_n4##y,z,c)), \
1711    (I[4] = (T)(img)(_n1##x,_p3##y,z,c)), \
1712    (I[12] = (T)(img)(_n1##x,_p2##y,z,c)), \
1713    (I[20] = (T)(img)(_n1##x,_p1##y,z,c)), \
1714    (I[28] = (T)(img)(_n1##x,y,z,c)), \
1715    (I[36] = (T)(img)(_n1##x,_n1##y,z,c)), \
1716    (I[44] = (T)(img)(_n1##x,_n2##y,z,c)), \
1717    (I[52] = (T)(img)(_n1##x,_n3##y,z,c)), \
1718    (I[60] = (T)(img)(_n1##x,_n4##y,z,c)), \
1719    (I[5] = (T)(img)(_n2##x,_p3##y,z,c)), \
1720    (I[13] = (T)(img)(_n2##x,_p2##y,z,c)), \
1721    (I[21] = (T)(img)(_n2##x,_p1##y,z,c)), \
1722    (I[29] = (T)(img)(_n2##x,y,z,c)), \
1723    (I[37] = (T)(img)(_n2##x,_n1##y,z,c)), \
1724    (I[45] = (T)(img)(_n2##x,_n2##y,z,c)), \
1725    (I[53] = (T)(img)(_n2##x,_n3##y,z,c)), \
1726    (I[61] = (T)(img)(_n2##x,_n4##y,z,c)), \
1727    (I[6] = (T)(img)(_n3##x,_p3##y,z,c)), \
1728    (I[14] = (T)(img)(_n3##x,_p2##y,z,c)), \
1729    (I[22] = (T)(img)(_n3##x,_p1##y,z,c)), \
1730    (I[30] = (T)(img)(_n3##x,y,z,c)), \
1731    (I[38] = (T)(img)(_n3##x,_n1##y,z,c)), \
1732    (I[46] = (T)(img)(_n3##x,_n2##y,z,c)), \
1733    (I[54] = (T)(img)(_n3##x,_n3##y,z,c)), \
1734    (I[62] = (T)(img)(_n3##x,_n4##y,z,c)), \
1735    x + 4>=(img).width()?(img).width() - 1:x + 4); \
1736    x<=(int)(x1) && ((_n4##x<(img).width() && ( \
1737    (I[7] = (T)(img)(_n4##x,_p3##y,z,c)), \
1738    (I[15] = (T)(img)(_n4##x,_p2##y,z,c)), \
1739    (I[23] = (T)(img)(_n4##x,_p1##y,z,c)), \
1740    (I[31] = (T)(img)(_n4##x,y,z,c)), \
1741    (I[39] = (T)(img)(_n4##x,_n1##y,z,c)), \
1742    (I[47] = (T)(img)(_n4##x,_n2##y,z,c)), \
1743    (I[55] = (T)(img)(_n4##x,_n3##y,z,c)), \
1744    (I[63] = (T)(img)(_n4##x,_n4##y,z,c)),1)) || \
1745    _n3##x==--_n4##x || _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n4##x = _n3##x = _n2##x = --_n1##x)); \
1746    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], I[6] = I[7], \
1747    I[8] = I[9], I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], I[14] = I[15], \
1748    I[16] = I[17], I[17] = I[18], I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
1749    I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], I[29] = I[30], I[30] = I[31], \
1750    I[32] = I[33], I[33] = I[34], I[34] = I[35], I[35] = I[36], I[36] = I[37], I[37] = I[38], I[38] = I[39], \
1751    I[40] = I[41], I[41] = I[42], I[42] = I[43], I[43] = I[44], I[44] = I[45], I[45] = I[46], I[46] = I[47], \
1752    I[48] = I[49], I[49] = I[50], I[50] = I[51], I[51] = I[52], I[52] = I[53], I[53] = I[54], I[54] = I[55], \
1753    I[56] = I[57], I[57] = I[58], I[58] = I[59], I[59] = I[60], I[60] = I[61], I[61] = I[62], I[62] = I[63], \
1754    _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x, ++_n4##x)
1755
1756 #define cimg_for9x9(img,x,y,z,c,I,T) \
1757   cimg_for9((img)._height,y) for (int x = 0, \
1758    _p4##x = 0, _p3##x = 0, _p2##x = 0, _p1##x = 0, \
1759    _n1##x = 1>=((img)._width)?(img).width() - 1:1, \
1760    _n2##x = 2>=((img)._width)?(img).width() - 1:2, \
1761    _n3##x = 3>=((img)._width)?(img).width() - 1:3, \
1762    _n4##x = (int)( \
1763    (I[0] = I[1] = I[2] = I[3] = I[4] = (T)(img)(_p4##x,_p4##y,z,c)), \
1764    (I[9] = I[10] = I[11] = I[12] = I[13] = (T)(img)(0,_p3##y,z,c)), \
1765    (I[18] = I[19] = I[20] = I[21] = I[22] = (T)(img)(0,_p2##y,z,c)), \
1766    (I[27] = I[28] = I[29] = I[30] = I[31] = (T)(img)(0,_p1##y,z,c)), \
1767    (I[36] = I[37] = I[38] = I[39] = I[40] = (T)(img)(0,y,z,c)), \
1768    (I[45] = I[46] = I[47] = I[48] = I[49] = (T)(img)(0,_n1##y,z,c)), \
1769    (I[54] = I[55] = I[56] = I[57] = I[58] = (T)(img)(0,_n2##y,z,c)), \
1770    (I[63] = I[64] = I[65] = I[66] = I[67] = (T)(img)(0,_n3##y,z,c)), \
1771    (I[72] = I[73] = I[74] = I[75] = I[76] = (T)(img)(0,_n4##y,z,c)), \
1772    (I[5] = (T)(img)(_n1##x,_p4##y,z,c)), \
1773    (I[14] = (T)(img)(_n1##x,_p3##y,z,c)), \
1774    (I[23] = (T)(img)(_n1##x,_p2##y,z,c)), \
1775    (I[32] = (T)(img)(_n1##x,_p1##y,z,c)), \
1776    (I[41] = (T)(img)(_n1##x,y,z,c)), \
1777    (I[50] = (T)(img)(_n1##x,_n1##y,z,c)), \
1778    (I[59] = (T)(img)(_n1##x,_n2##y,z,c)), \
1779    (I[68] = (T)(img)(_n1##x,_n3##y,z,c)), \
1780    (I[77] = (T)(img)(_n1##x,_n4##y,z,c)), \
1781    (I[6] = (T)(img)(_n2##x,_p4##y,z,c)), \
1782    (I[15] = (T)(img)(_n2##x,_p3##y,z,c)), \
1783    (I[24] = (T)(img)(_n2##x,_p2##y,z,c)), \
1784    (I[33] = (T)(img)(_n2##x,_p1##y,z,c)), \
1785    (I[42] = (T)(img)(_n2##x,y,z,c)), \
1786    (I[51] = (T)(img)(_n2##x,_n1##y,z,c)), \
1787    (I[60] = (T)(img)(_n2##x,_n2##y,z,c)), \
1788    (I[69] = (T)(img)(_n2##x,_n3##y,z,c)), \
1789    (I[78] = (T)(img)(_n2##x,_n4##y,z,c)), \
1790    (I[7] = (T)(img)(_n3##x,_p4##y,z,c)), \
1791    (I[16] = (T)(img)(_n3##x,_p3##y,z,c)), \
1792    (I[25] = (T)(img)(_n3##x,_p2##y,z,c)), \
1793    (I[34] = (T)(img)(_n3##x,_p1##y,z,c)), \
1794    (I[43] = (T)(img)(_n3##x,y,z,c)), \
1795    (I[52] = (T)(img)(_n3##x,_n1##y,z,c)), \
1796    (I[61] = (T)(img)(_n3##x,_n2##y,z,c)), \
1797    (I[70] = (T)(img)(_n3##x,_n3##y,z,c)), \
1798    (I[79] = (T)(img)(_n3##x,_n4##y,z,c)), \
1799    4>=((img)._width)?(img).width() - 1:4); \
1800    (_n4##x<(img).width() && ( \
1801    (I[8] = (T)(img)(_n4##x,_p4##y,z,c)), \
1802    (I[17] = (T)(img)(_n4##x,_p3##y,z,c)), \
1803    (I[26] = (T)(img)(_n4##x,_p2##y,z,c)), \
1804    (I[35] = (T)(img)(_n4##x,_p1##y,z,c)), \
1805    (I[44] = (T)(img)(_n4##x,y,z,c)), \
1806    (I[53] = (T)(img)(_n4##x,_n1##y,z,c)), \
1807    (I[62] = (T)(img)(_n4##x,_n2##y,z,c)), \
1808    (I[71] = (T)(img)(_n4##x,_n3##y,z,c)), \
1809    (I[80] = (T)(img)(_n4##x,_n4##y,z,c)),1)) || \
1810    _n3##x==--_n4##x || _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n4##x = _n3##x = _n2##x = --_n1##x); \
1811    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], I[6] = I[7], I[7] = I[8], \
1812    I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], \
1813    I[16] = I[17], I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
1814    I[24] = I[25], I[25] = I[26], I[27] = I[28], I[28] = I[29], I[29] = I[30], I[30] = I[31], I[31] = I[32], \
1815    I[32] = I[33], I[33] = I[34], I[34] = I[35], I[36] = I[37], I[37] = I[38], I[38] = I[39], I[39] = I[40], \
1816    I[40] = I[41], I[41] = I[42], I[42] = I[43], I[43] = I[44], I[45] = I[46], I[46] = I[47], I[47] = I[48], \
1817    I[48] = I[49], I[49] = I[50], I[50] = I[51], I[51] = I[52], I[52] = I[53], I[54] = I[55], I[55] = I[56], \
1818    I[56] = I[57], I[57] = I[58], I[58] = I[59], I[59] = I[60], I[60] = I[61], I[61] = I[62], I[63] = I[64], \
1819    I[64] = I[65], I[65] = I[66], I[66] = I[67], I[67] = I[68], I[68] = I[69], I[69] = I[70], I[70] = I[71], \
1820    I[72] = I[73], I[73] = I[74], I[74] = I[75], I[75] = I[76], I[76] = I[77], I[77] = I[78], I[78] = I[79], \
1821    I[79] = I[80], \
1822    _p4##x = _p3##x, _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x, ++_n4##x)
1823
1824 #define cimg_for_in9x9(img,x0,y0,x1,y1,x,y,z,c,I,T) \
1825   cimg_for_in9((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1826    _p4##x = x - 4<0?0:x - 4, \
1827    _p3##x = x - 3<0?0:x - 3, \
1828    _p2##x = x - 2<0?0:x - 2, \
1829    _p1##x = x - 1<0?0:x - 1, \
1830    _n1##x = x + 1>=(img).width()?(img).width() - 1:x + 1, \
1831    _n2##x = x + 2>=(img).width()?(img).width() - 1:x + 2, \
1832    _n3##x = x + 3>=(img).width()?(img).width() - 1:x + 3, \
1833    _n4##x = (int)( \
1834    (I[0] = (T)(img)(_p4##x,_p4##y,z,c)), \
1835    (I[9] = (T)(img)(_p4##x,_p3##y,z,c)), \
1836    (I[18] = (T)(img)(_p4##x,_p2##y,z,c)), \
1837    (I[27] = (T)(img)(_p4##x,_p1##y,z,c)), \
1838    (I[36] = (T)(img)(_p4##x,y,z,c)), \
1839    (I[45] = (T)(img)(_p4##x,_n1##y,z,c)), \
1840    (I[54] = (T)(img)(_p4##x,_n2##y,z,c)), \
1841    (I[63] = (T)(img)(_p4##x,_n3##y,z,c)), \
1842    (I[72] = (T)(img)(_p4##x,_n4##y,z,c)), \
1843    (I[1] = (T)(img)(_p3##x,_p4##y,z,c)), \
1844    (I[10] = (T)(img)(_p3##x,_p3##y,z,c)), \
1845    (I[19] = (T)(img)(_p3##x,_p2##y,z,c)), \
1846    (I[28] = (T)(img)(_p3##x,_p1##y,z,c)), \
1847    (I[37] = (T)(img)(_p3##x,y,z,c)), \
1848    (I[46] = (T)(img)(_p3##x,_n1##y,z,c)), \
1849    (I[55] = (T)(img)(_p3##x,_n2##y,z,c)), \
1850    (I[64] = (T)(img)(_p3##x,_n3##y,z,c)), \
1851    (I[73] = (T)(img)(_p3##x,_n4##y,z,c)), \
1852    (I[2] = (T)(img)(_p2##x,_p4##y,z,c)), \
1853    (I[11] = (T)(img)(_p2##x,_p3##y,z,c)), \
1854    (I[20] = (T)(img)(_p2##x,_p2##y,z,c)), \
1855    (I[29] = (T)(img)(_p2##x,_p1##y,z,c)), \
1856    (I[38] = (T)(img)(_p2##x,y,z,c)), \
1857    (I[47] = (T)(img)(_p2##x,_n1##y,z,c)), \
1858    (I[56] = (T)(img)(_p2##x,_n2##y,z,c)), \
1859    (I[65] = (T)(img)(_p2##x,_n3##y,z,c)), \
1860    (I[74] = (T)(img)(_p2##x,_n4##y,z,c)), \
1861    (I[3] = (T)(img)(_p1##x,_p4##y,z,c)), \
1862    (I[12] = (T)(img)(_p1##x,_p3##y,z,c)), \
1863    (I[21] = (T)(img)(_p1##x,_p2##y,z,c)), \
1864    (I[30] = (T)(img)(_p1##x,_p1##y,z,c)), \
1865    (I[39] = (T)(img)(_p1##x,y,z,c)), \
1866    (I[48] = (T)(img)(_p1##x,_n1##y,z,c)), \
1867    (I[57] = (T)(img)(_p1##x,_n2##y,z,c)), \
1868    (I[66] = (T)(img)(_p1##x,_n3##y,z,c)), \
1869    (I[75] = (T)(img)(_p1##x,_n4##y,z,c)), \
1870    (I[4] = (T)(img)(x,_p4##y,z,c)), \
1871    (I[13] = (T)(img)(x,_p3##y,z,c)), \
1872    (I[22] = (T)(img)(x,_p2##y,z,c)), \
1873    (I[31] = (T)(img)(x,_p1##y,z,c)), \
1874    (I[40] = (T)(img)(x,y,z,c)), \
1875    (I[49] = (T)(img)(x,_n1##y,z,c)), \
1876    (I[58] = (T)(img)(x,_n2##y,z,c)), \
1877    (I[67] = (T)(img)(x,_n3##y,z,c)), \
1878    (I[76] = (T)(img)(x,_n4##y,z,c)), \
1879    (I[5] = (T)(img)(_n1##x,_p4##y,z,c)), \
1880    (I[14] = (T)(img)(_n1##x,_p3##y,z,c)), \
1881    (I[23] = (T)(img)(_n1##x,_p2##y,z,c)), \
1882    (I[32] = (T)(img)(_n1##x,_p1##y,z,c)), \
1883    (I[41] = (T)(img)(_n1##x,y,z,c)), \
1884    (I[50] = (T)(img)(_n1##x,_n1##y,z,c)), \
1885    (I[59] = (T)(img)(_n1##x,_n2##y,z,c)), \
1886    (I[68] = (T)(img)(_n1##x,_n3##y,z,c)), \
1887    (I[77] = (T)(img)(_n1##x,_n4##y,z,c)), \
1888    (I[6] = (T)(img)(_n2##x,_p4##y,z,c)), \
1889    (I[15] = (T)(img)(_n2##x,_p3##y,z,c)), \
1890    (I[24] = (T)(img)(_n2##x,_p2##y,z,c)), \
1891    (I[33] = (T)(img)(_n2##x,_p1##y,z,c)), \
1892    (I[42] = (T)(img)(_n2##x,y,z,c)), \
1893    (I[51] = (T)(img)(_n2##x,_n1##y,z,c)), \
1894    (I[60] = (T)(img)(_n2##x,_n2##y,z,c)), \
1895    (I[69] = (T)(img)(_n2##x,_n3##y,z,c)), \
1896    (I[78] = (T)(img)(_n2##x,_n4##y,z,c)), \
1897    (I[7] = (T)(img)(_n3##x,_p4##y,z,c)), \
1898    (I[16] = (T)(img)(_n3##x,_p3##y,z,c)), \
1899    (I[25] = (T)(img)(_n3##x,_p2##y,z,c)), \
1900    (I[34] = (T)(img)(_n3##x,_p1##y,z,c)), \
1901    (I[43] = (T)(img)(_n3##x,y,z,c)), \
1902    (I[52] = (T)(img)(_n3##x,_n1##y,z,c)), \
1903    (I[61] = (T)(img)(_n3##x,_n2##y,z,c)), \
1904    (I[70] = (T)(img)(_n3##x,_n3##y,z,c)), \
1905    (I[79] = (T)(img)(_n3##x,_n4##y,z,c)), \
1906    x + 4>=(img).width()?(img).width() - 1:x + 4); \
1907    x<=(int)(x1) && ((_n4##x<(img).width() && ( \
1908    (I[8] = (T)(img)(_n4##x,_p4##y,z,c)), \
1909    (I[17] = (T)(img)(_n4##x,_p3##y,z,c)), \
1910    (I[26] = (T)(img)(_n4##x,_p2##y,z,c)), \
1911    (I[35] = (T)(img)(_n4##x,_p1##y,z,c)), \
1912    (I[44] = (T)(img)(_n4##x,y,z,c)), \
1913    (I[53] = (T)(img)(_n4##x,_n1##y,z,c)), \
1914    (I[62] = (T)(img)(_n4##x,_n2##y,z,c)), \
1915    (I[71] = (T)(img)(_n4##x,_n3##y,z,c)), \
1916    (I[80] = (T)(img)(_n4##x,_n4##y,z,c)),1)) || \
1917    _n3##x==--_n4##x || _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n4##x = _n3##x = _n2##x = --_n1##x)); \
1918    I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], I[6] = I[7], I[7] = I[8], \
1919    I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], \
1920    I[16] = I[17], I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
1921    I[24] = I[25], I[25] = I[26], I[27] = I[28], I[28] = I[29], I[29] = I[30], I[30] = I[31], I[31] = I[32], \
1922    I[32] = I[33], I[33] = I[34], I[34] = I[35], I[36] = I[37], I[37] = I[38], I[38] = I[39], I[39] = I[40], \
1923    I[40] = I[41], I[41] = I[42], I[42] = I[43], I[43] = I[44], I[45] = I[46], I[46] = I[47], I[47] = I[48], \
1924    I[48] = I[49], I[49] = I[50], I[50] = I[51], I[51] = I[52], I[52] = I[53], I[54] = I[55], I[55] = I[56], \
1925    I[56] = I[57], I[57] = I[58], I[58] = I[59], I[59] = I[60], I[60] = I[61], I[61] = I[62], I[63] = I[64], \
1926    I[64] = I[65], I[65] = I[66], I[66] = I[67], I[67] = I[68], I[68] = I[69], I[69] = I[70], I[70] = I[71], \
1927    I[72] = I[73], I[73] = I[74], I[74] = I[75], I[75] = I[76], I[76] = I[77], I[77] = I[78], I[78] = I[79], \
1928    I[79] = I[80], \
1929    _p4##x = _p3##x, _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x, ++_n4##x)
1930
1931 #define cimg_for2x2x2(img,x,y,z,c,I,T) \
1932  cimg_for2((img)._depth,z) cimg_for2((img)._height,y) for (int x = 0, \
1933    _n1##x = (int)( \
1934    (I[0] = (T)(img)(0,y,z,c)), \
1935    (I[2] = (T)(img)(0,_n1##y,z,c)), \
1936    (I[4] = (T)(img)(0,y,_n1##z,c)), \
1937    (I[6] = (T)(img)(0,_n1##y,_n1##z,c)), \
1938    1>=(img)._width?(img).width() - 1:1); \
1939    (_n1##x<(img).width() && ( \
1940    (I[1] = (T)(img)(_n1##x,y,z,c)), \
1941    (I[3] = (T)(img)(_n1##x,_n1##y,z,c)), \
1942    (I[5] = (T)(img)(_n1##x,y,_n1##z,c)), \
1943    (I[7] = (T)(img)(_n1##x,_n1##y,_n1##z,c)),1)) || \
1944    x==--_n1##x; \
1945    I[0] = I[1], I[2] = I[3], I[4] = I[5], I[6] = I[7], \
1946    ++x, ++_n1##x)
1947
1948 #define cimg_for_in2x2x2(img,x0,y0,z0,x1,y1,z1,x,y,z,c,I,T) \
1949  cimg_for_in2((img)._depth,z0,z1,z) cimg_for_in2((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1950    _n1##x = (int)( \
1951    (I[0] = (T)(img)(x,y,z,c)), \
1952    (I[2] = (T)(img)(x,_n1##y,z,c)), \
1953    (I[4] = (T)(img)(x,y,_n1##z,c)), \
1954    (I[6] = (T)(img)(x,_n1##y,_n1##z,c)), \
1955    x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
1956    x<=(int)(x1) && ((_n1##x<(img).width() && ( \
1957    (I[1] = (T)(img)(_n1##x,y,z,c)), \
1958    (I[3] = (T)(img)(_n1##x,_n1##y,z,c)), \
1959    (I[5] = (T)(img)(_n1##x,y,_n1##z,c)), \
1960    (I[7] = (T)(img)(_n1##x,_n1##y,_n1##z,c)),1)) || \
1961    x==--_n1##x); \
1962    I[0] = I[1], I[2] = I[3], I[4] = I[5], I[6] = I[7], \
1963    ++x, ++_n1##x)
1964
1965 #define cimg_for3x3x3(img,x,y,z,c,I,T) \
1966  cimg_for3((img)._depth,z) cimg_for3((img)._height,y) for (int x = 0, \
1967    _p1##x = 0, \
1968    _n1##x = (int)( \
1969    (I[0] = I[1] = (T)(img)(_p1##x,_p1##y,_p1##z,c)), \
1970    (I[3] = I[4] = (T)(img)(0,y,_p1##z,c)),  \
1971    (I[6] = I[7] = (T)(img)(0,_n1##y,_p1##z,c)), \
1972    (I[9] = I[10] = (T)(img)(0,_p1##y,z,c)), \
1973    (I[12] = I[13] = (T)(img)(0,y,z,c)), \
1974    (I[15] = I[16] = (T)(img)(0,_n1##y,z,c)), \
1975    (I[18] = I[19] = (T)(img)(0,_p1##y,_n1##z,c)), \
1976    (I[21] = I[22] = (T)(img)(0,y,_n1##z,c)), \
1977    (I[24] = I[25] = (T)(img)(0,_n1##y,_n1##z,c)), \
1978    1>=(img)._width?(img).width() - 1:1); \
1979    (_n1##x<(img).width() && ( \
1980    (I[2] = (T)(img)(_n1##x,_p1##y,_p1##z,c)), \
1981    (I[5] = (T)(img)(_n1##x,y,_p1##z,c)), \
1982    (I[8] = (T)(img)(_n1##x,_n1##y,_p1##z,c)), \
1983    (I[11] = (T)(img)(_n1##x,_p1##y,z,c)), \
1984    (I[14] = (T)(img)(_n1##x,y,z,c)), \
1985    (I[17] = (T)(img)(_n1##x,_n1##y,z,c)), \
1986    (I[20] = (T)(img)(_n1##x,_p1##y,_n1##z,c)), \
1987    (I[23] = (T)(img)(_n1##x,y,_n1##z,c)), \
1988    (I[26] = (T)(img)(_n1##x,_n1##y,_n1##z,c)),1)) || \
1989    x==--_n1##x; \
1990    I[0] = I[1], I[1] = I[2], I[3] = I[4], I[4] = I[5], I[6] = I[7], I[7] = I[8], \
1991    I[9] = I[10], I[10] = I[11], I[12] = I[13], I[13] = I[14], I[15] = I[16], I[16] = I[17], \
1992    I[18] = I[19], I[19] = I[20], I[21] = I[22], I[22] = I[23], I[24] = I[25], I[25] = I[26], \
1993    _p1##x = x++, ++_n1##x)
1994
1995 #define cimg_for_in3x3x3(img,x0,y0,z0,x1,y1,z1,x,y,z,c,I,T) \
1996  cimg_for_in3((img)._depth,z0,z1,z) cimg_for_in3((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
1997    _p1##x = x - 1<0?0:x - 1, \
1998    _n1##x = (int)( \
1999    (I[0] = (T)(img)(_p1##x,_p1##y,_p1##z,c)), \
2000    (I[3] = (T)(img)(_p1##x,y,_p1##z,c)),  \
2001    (I[6] = (T)(img)(_p1##x,_n1##y,_p1##z,c)), \
2002    (I[9] = (T)(img)(_p1##x,_p1##y,z,c)), \
2003    (I[12] = (T)(img)(_p1##x,y,z,c)), \
2004    (I[15] = (T)(img)(_p1##x,_n1##y,z,c)), \
2005    (I[18] = (T)(img)(_p1##x,_p1##y,_n1##z,c)), \
2006    (I[21] = (T)(img)(_p1##x,y,_n1##z,c)), \
2007    (I[24] = (T)(img)(_p1##x,_n1##y,_n1##z,c)), \
2008    (I[1] = (T)(img)(x,_p1##y,_p1##z,c)), \
2009    (I[4] = (T)(img)(x,y,_p1##z,c)),  \
2010    (I[7] = (T)(img)(x,_n1##y,_p1##z,c)), \
2011    (I[10] = (T)(img)(x,_p1##y,z,c)), \
2012    (I[13] = (T)(img)(x,y,z,c)), \
2013    (I[16] = (T)(img)(x,_n1##y,z,c)), \
2014    (I[19] = (T)(img)(x,_p1##y,_n1##z,c)), \
2015    (I[22] = (T)(img)(x,y,_n1##z,c)), \
2016    (I[25] = (T)(img)(x,_n1##y,_n1##z,c)), \
2017    x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
2018    x<=(int)(x1) && ((_n1##x<(img).width() && ( \
2019    (I[2] = (T)(img)(_n1##x,_p1##y,_p1##z,c)), \
2020    (I[5] = (T)(img)(_n1##x,y,_p1##z,c)), \
2021    (I[8] = (T)(img)(_n1##x,_n1##y,_p1##z,c)), \
2022    (I[11] = (T)(img)(_n1##x,_p1##y,z,c)), \
2023    (I[14] = (T)(img)(_n1##x,y,z,c)), \
2024    (I[17] = (T)(img)(_n1##x,_n1##y,z,c)), \
2025    (I[20] = (T)(img)(_n1##x,_p1##y,_n1##z,c)), \
2026    (I[23] = (T)(img)(_n1##x,y,_n1##z,c)), \
2027    (I[26] = (T)(img)(_n1##x,_n1##y,_n1##z,c)),1)) || \
2028    x==--_n1##x); \
2029    I[0] = I[1], I[1] = I[2], I[3] = I[4], I[4] = I[5], I[6] = I[7], I[7] = I[8], \
2030    I[9] = I[10], I[10] = I[11], I[12] = I[13], I[13] = I[14], I[15] = I[16], I[16] = I[17], \
2031    I[18] = I[19], I[19] = I[20], I[21] = I[22], I[22] = I[23], I[24] = I[25], I[25] = I[26], \
2032    _p1##x = x++, ++_n1##x)
2033
2034 #define cimglist_for(list,l) for (int l = 0; l<(int)(list)._width; ++l)
2035 #define cimglist_for_in(list,l0,l1,l) \
2036   for (int l = (int)(l0)<0?0:(int)(l0), _max##l = (unsigned int)l1<(list)._width?(int)(l1):(int)(list)._width - 1; \
2037   l<=_max##l; ++l)
2038
2039 #define cimglist_apply(list,fn) cimglist_for(list,__##fn) (list)[__##fn].fn
2040
2041 // Macros used to display error messages when exceptions are thrown.
2042 // You should not use these macros is your own code.
2043 #define _cimgdisplay_instance "[instance(%u,%u,%u,%c%s%c)] CImgDisplay::"
2044 #define cimgdisplay_instance _width,_height,_normalization,_title?'\"':'[',_title?_title:"untitled",_title?'\"':']'
2045 #define _cimg_instance "[instance(%u,%u,%u,%u,%p,%sshared)] CImg<%s>::"
2046 #define cimg_instance _width,_height,_depth,_spectrum,_data,_is_shared?"":"non-",pixel_type()
2047 #define _cimglist_instance "[instance(%u,%u,%p)] CImgList<%s>::"
2048 #define cimglist_instance _width,_allocated_width,_data,pixel_type()
2049
2050 /*------------------------------------------------
2051  #
2052  #
2053  #  Define cimg_library:: namespace
2054  #
2055  #
2056  -------------------------------------------------*/
2057 //! Contains <i>all classes and functions</i> of the \CImg library.
2058 /**
2059    This namespace is defined to avoid functions and class names collisions
2060    that could happen with the inclusion of other C++ header files.
2061    Anyway, it should not happen often and you should reasonnably start most of your
2062    \CImg-based programs with
2063    \code
2064    #include "CImg.h"
2065    using namespace cimg_library;
2066    \endcode
2067    to simplify the declaration of \CImg Library objects afterwards.
2068 **/
2069 namespace cimg_library_suffixed {
2070
2071   // Declare the four classes of the CImg Library.
2072   template<typename T=float> struct CImg;
2073   template<typename T=float> struct CImgList;
2074   struct CImgDisplay;
2075   struct CImgException;
2076
2077   // Declare cimg:: namespace.
2078   // This is an uncomplete namespace definition here. It only contains some
2079   // necessary stuff to ensure a correct declaration order of the classes and functions
2080   // defined afterwards.
2081   namespace cimg {
2082
2083     // Define ascii sequences for colored terminal output.
2084 #ifdef cimg_use_vt100
2085     static const char t_normal[] = { 0x1b, '[', '0', ';', '0', ';', '0', 'm', 0 };
2086     static const char t_black[] = { 0x1b, '[', '0', ';', '3', '0', ';', '5', '9', 'm', 0 };
2087     static const char t_red[] = { 0x1b, '[', '0', ';', '3', '1', ';', '5', '9', 'm', 0 };
2088     static const char t_green[] = { 0x1b, '[', '0', ';', '3', '2', ';', '5', '9', 'm', 0 };
2089     static const char t_yellow[] = { 0x1b, '[', '0', ';', '3', '3', ';', '5', '9', 'm', 0 };
2090     static const char t_blue[] = { 0x1b, '[', '0', ';', '3', '4', ';', '5', '9', 'm', 0 };
2091     static const char t_magenta[] = { 0x1b, '[', '0', ';', '3', '5', ';', '5', '9', 'm', 0 };
2092     static const char t_cyan[] = { 0x1b, '[', '0', ';', '3', '6', ';', '5', '9', 'm', 0 };
2093     static const char t_white[] = { 0x1b, '[', '0', ';', '3', '7', ';', '5', '9', 'm', 0 };
2094     static const char t_bold[] = { 0x1b, '[', '1', 'm', 0 };
2095     static const char t_underscore[] = { 0x1b, '[', '4', 'm', 0 };
2096 #else
2097     static const char t_normal[] = { 0 };
2098     static const char *const t_black = cimg::t_normal,
2099       *const t_red = cimg::t_normal,
2100       *const t_green = cimg::t_normal,
2101       *const t_yellow = cimg::t_normal,
2102       *const t_blue = cimg::t_normal,
2103       *const t_magenta = cimg::t_normal,
2104       *const t_cyan = cimg::t_normal,
2105       *const t_white = cimg::t_normal,
2106       *const t_bold = cimg::t_normal,
2107       *const t_underscore = cimg::t_normal;
2108 #endif
2109
2110     inline std::FILE* output(std::FILE *file=0);
2111     inline void info();
2112
2113     //! Avoid warning messages due to unused parameters. Do nothing actually.
2114     template<typename T>
2115     inline void unused(const T&, ...) {}
2116
2117     // [internal] Lock/unlock a mutex for managing concurrent threads.
2118     // 'lock_mode' can be { 0=unlock | 1=lock | 2=trylock }.
2119     // 'n' can be in [0,31] but mutex range [0,15] is reserved by CImg.
2120     inline int mutex(const unsigned int n, const int lock_mode=1);
2121
2122     inline unsigned int& _exception_mode(const unsigned int value, const bool is_set) {
2123       static unsigned int mode = cimg_verbosity;
2124       if (is_set) { cimg::mutex(0); mode = value<4?value:4; cimg::mutex(0,0); }
2125       return mode;
2126     }
2127
2128     // Mandatory because Microsoft's _snprintf() and _vsnprintf() do not add the '\0' character
2129     // at the end of the string.
2130 #if cimg_OS==2 && defined(_MSC_VER)
2131     inline int _snprintf(char *const s, const size_t size, const char *const format, ...) {
2132       va_list ap;
2133       va_start(ap,format);
2134       const int result = _vsnprintf(s,size,format,ap);
2135       va_end(ap);
2136       return result;
2137     }
2138
2139     inline int _vsnprintf(char *const s, const size_t size, const char *const format, va_list ap) {
2140       int result = -1;
2141       cimg::mutex(6);
2142       if (size) result = _vsnprintf_s(s,size,_TRUNCATE,format,ap);
2143       if (result==-1) result = _vscprintf(format,ap);
2144       cimg::mutex(6,0);
2145       return result;
2146     }
2147
2148     // Mutex-protected version of sscanf, sprintf and snprintf.
2149     // Used only MacOSX, as it seems those functions are not re-entrant on MacOSX.
2150 #elif defined(__MACOSX__) || defined(__APPLE__)
2151     inline int _sscanf(const char *const s, const char *const format, ...) {
2152       cimg::mutex(6);
2153       va_list args;
2154       va_start(args,format);
2155       const int result = std::vsscanf(s,format,args);
2156       va_end(args);
2157       cimg::mutex(6,0);
2158       return result;
2159     }
2160
2161     inline int _sprintf(char *const s, const char *const format, ...) {
2162       cimg::mutex(6);
2163       va_list args;
2164       va_start(args,format);
2165       const int result = std::vsprintf(s,format,args);
2166       va_end(args);
2167       cimg::mutex(6,0);
2168       return result;
2169     }
2170
2171     inline int _snprintf(char *const s, const size_t n, const char *const format, ...) {
2172       cimg::mutex(6);
2173       va_list args;
2174       va_start(args,format);
2175       const int result = std::vsnprintf(s,n,format,args);
2176       va_end(args);
2177       cimg::mutex(6,0);
2178       return result;
2179     }
2180
2181     inline int _vsnprintf(char *const s, const size_t size, const char* format, va_list ap) {
2182       cimg::mutex(6);
2183       const int result = std::vsnprintf(s,size,format,ap);
2184       cimg::mutex(6,0);
2185       return result;
2186     }
2187 #endif
2188
2189     //! Set current \CImg exception mode.
2190     /**
2191        The way error messages are handled by \CImg can be changed dynamically, using this function.
2192        \param mode Desired exception mode. Possible values are:
2193        - \c 0: Hide library messages (quiet mode).
2194        - \c 1: Print library messages on the console.
2195        - \c 2: Display library messages on a dialog window (default behavior).
2196        - \c 3: Do as \c 1 + add extra debug warnings (slow down the code!).
2197        - \c 4: Do as \c 2 + add extra debug warnings (slow down the code!).
2198      **/
2199     inline unsigned int& exception_mode(const unsigned int mode) {
2200       return _exception_mode(mode,true);
2201     }
2202
2203     //! Return current \CImg exception mode.
2204     /**
2205        \note By default, return the value of configuration macro \c cimg_verbosity
2206     **/
2207     inline unsigned int& exception_mode() {
2208       return _exception_mode(0,false);
2209     }
2210
2211     //! Set current \CImg openmp mode.
2212     /**
2213        The way openmp-based methods are handled by \CImg can be changed dynamically, using this function.
2214        \param mode Desired openmp mode. Possible values are:
2215        - \c 0: Never parallelize (quiet mode).
2216        - \c 1: Always parallelize.
2217        - \c 2: Adaptive parallelization mode (default behavior).
2218      **/
2219     inline unsigned int& _openmp_mode(const unsigned int value, const bool is_set) {
2220       static unsigned int mode = 2;
2221       if (is_set)  { cimg::mutex(0); mode = value<2?value:2; cimg::mutex(0,0); }
2222       return mode;
2223     }
2224
2225     inline unsigned int& openmp_mode(const unsigned int mode) {
2226       return _openmp_mode(mode,true);
2227     }
2228
2229     //! Return current \CImg openmp mode.
2230     inline unsigned int& openmp_mode() {
2231       return _openmp_mode(0,false);
2232     }
2233
2234 #define cimg_openmp_if(cond) if (cimg::openmp_mode()==1 || (cimg::openmp_mode()>1 && (cond)))
2235
2236     // Display a simple dialog box, and wait for the user's response.
2237     inline int dialog(const char *const title, const char *const msg, const char *const button1_label="OK",
2238                       const char *const button2_label=0, const char *const button3_label=0,
2239                       const char *const button4_label=0, const char *const button5_label=0,
2240                       const char *const button6_label=0, const bool centering=false);
2241
2242     // Evaluate math expression.
2243     inline double eval(const char *const expression,
2244                        const double x=0, const double y=0, const double z=0, const double c=0);
2245   }
2246
2247   /*---------------------------------------
2248     #
2249     # Define the CImgException structures
2250     #
2251     --------------------------------------*/
2252   //! Instances of \c CImgException are thrown when errors are encountered in a \CImg function call.
2253   /**
2254      \par Overview
2255
2256       CImgException is the base class of all exceptions thrown by \CImg (except \b CImgAbortException).
2257       CImgException is never thrown itself. Derived classes that specify the type of errord are thrown instead.
2258       These classes can be:
2259
2260       - \b CImgAbortException: Thrown when a computationally-intensive function is aborted by an external signal.
2261         This is the only \c non-derived exception class.
2262
2263       - \b CImgArgumentException: Thrown when one argument of a called \CImg function is invalid.
2264       This is probably one of the most thrown exception by \CImg.
2265       For instance, the following example throws a \c CImgArgumentException:
2266       \code
2267       CImg<float> img(100,100,1,3); // Define a 100x100 color image with float-valued pixels.
2268       img.mirror('e');              // Try to mirror image along the (non-existing) 'e'-axis.
2269       \endcode
2270
2271       - \b CImgDisplayException: Thrown when something went wrong during the display of images in CImgDisplay instances.
2272
2273       - \b CImgInstanceException: Thrown when an instance associated to a called \CImg method does not fit
2274       the function requirements. For instance, the following example throws a \c CImgInstanceException:
2275       \code
2276       const CImg<float> img;           // Define an empty image.
2277       const float value = img.at(0);   // Try to read first pixel value (does not exist).
2278       \endcode
2279
2280       - \b CImgIOException: Thrown when an error occured when trying to load or save image files.
2281       This happens when trying to read files that do not exist or with invalid formats.
2282       For instance, the following example throws a \c CImgIOException:
2283       \code
2284       const CImg<float> img("missing_file.jpg");  // Try to load a file that does not exist.
2285       \endcode
2286
2287       - \b CImgWarningException: Thrown only if configuration macro \c cimg_strict_warnings is set, and
2288       when a \CImg function has to display a warning message (see cimg::warn()).
2289
2290       It is not recommended to throw CImgException instances by yourself,
2291       since they are expected to be thrown only by \CImg.
2292       When an error occurs in a library function call, \CImg may display error messages on the screen or on the
2293       standard output, depending on the current \CImg exception mode.
2294       The \CImg exception mode can be get and set by functions cimg::exception_mode() and
2295       cimg::exception_mode(unsigned int).
2296
2297       \par Exceptions handling
2298
2299       In all cases, when an error occurs in \CImg, an instance of the corresponding exception class is thrown.
2300       This may lead the program to break (this is the default behavior), but you can bypass this behavior by
2301       handling the exceptions by yourself,
2302       using a usual <tt>try { ... } catch () { ... }</tt> bloc, as in the following example:
2303       \code
2304       #define "CImg.h"
2305       using namespace cimg_library;
2306       int main() {
2307         cimg::exception_mode(0);                                    // Enable quiet exception mode.
2308         try {
2309           ...                                                       // Here, do what you want to stress CImg.
2310         } catch (CImgException &e) {                                // You succeeded: something went wrong!
2311           std::fprintf(stderr,"CImg Library Error: %s",e.what());   // Display your custom error message.
2312           ...                                                       // Do what you want now to save the ship!
2313           }
2314         }
2315       \endcode
2316   **/
2317   struct CImgException : public std::exception {
2318 #define _cimg_exception_err(etype,disp_flag) \
2319   std::va_list ap, ap2; \
2320   va_start(ap,format); va_start(ap2,format); \
2321   int size = cimg_vsnprintf(0,0,format,ap2); \
2322   if (size++>=0) { \
2323     delete[] _message; \
2324     _message = new char[size]; \
2325     cimg_vsnprintf(_message,size,format,ap); \
2326     if (cimg::exception_mode()) { \
2327       std::fprintf(cimg::output(),"\n%s[CImg] *** %s ***%s %s\n",cimg::t_red,etype,cimg::t_normal,_message); \
2328       if (cimg_display && disp_flag && !(cimg::exception_mode()%2)) try { cimg::dialog(etype,_message,"Abort"); } \
2329       catch (CImgException&) {} \
2330       if (cimg::exception_mode()>=3) cimg_library_suffixed::cimg::info(); \
2331     } \
2332   } \
2333   va_end(ap); va_end(ap2); \
2334
2335     char *_message;
2336     CImgException() { _message = new char[1]; *_message = 0; }
2337     CImgException(const char *const format, ...):_message(0) { _cimg_exception_err("CImgException",true); }
2338     CImgException(const CImgException& e) {
2339       const int size = std::strlen(e._message);
2340       _message = new char[size + 1];
2341       std::strncpy(_message,e._message,size);
2342       _message[size] = 0;
2343     }
2344     ~CImgException() throw() { delete[] _message; }
2345     CImgException& operator=(const CImgException& e) {
2346       const int size = std::strlen(e._message);
2347       _message = new char[size + 1];
2348       std::strncpy(_message,e._message,size);
2349       _message[size] = 0;
2350       return *this;
2351     }
2352     //! Return a C-string containing the error message associated to the thrown exception.
2353     const char *what() const throw() { return _message; }
2354   };
2355
2356   // The CImgAbortException class is used to throw an exception when
2357   // a computationally-intensive function has been aborted by an external signal.
2358   struct CImgAbortException : public std::exception {
2359     char *_message;
2360     CImgAbortException() { _message = new char[1]; *_message = 0; }
2361     CImgAbortException(const char *const format, ...):_message(0) { _cimg_exception_err("CImgAbortException",true); }
2362     CImgAbortException(const CImgAbortException& e) {
2363       const int size = std::strlen(e._message);
2364       _message = new char[size + 1];
2365       std::strncpy(_message,e._message,size);
2366       _message[size] = 0;
2367     }
2368     ~CImgAbortException() throw() { delete[] _message; }
2369     CImgAbortException& operator=(const CImgAbortException& e) {
2370       const int size = std::strlen(e._message);
2371       _message = new char[size + 1];
2372       std::strncpy(_message,e._message,size);
2373       _message[size] = 0;
2374       return *this;
2375     }
2376     //! Return a C-string containing the error message associated to the thrown exception.
2377     const char *what() const throw() { return _message; }
2378   };
2379
2380   // The CImgArgumentException class is used to throw an exception related
2381   // to invalid arguments encountered in a library function call.
2382   struct CImgArgumentException : public CImgException {
2383     CImgArgumentException(const char *const format, ...) { _cimg_exception_err("CImgArgumentException",true); }
2384   };
2385
2386   // The CImgDisplayException class is used to throw an exception related
2387   // to display problems encountered in a library function call.
2388   struct CImgDisplayException : public CImgException {
2389     CImgDisplayException(const char *const format, ...) { _cimg_exception_err("CImgDisplayException",false); }
2390   };
2391
2392   // The CImgInstanceException class is used to throw an exception related
2393   // to an invalid instance encountered in a library function call.
2394   struct CImgInstanceException : public CImgException {
2395     CImgInstanceException(const char *const format, ...) { _cimg_exception_err("CImgInstanceException",true); }
2396   };
2397
2398   // The CImgIOException class is used to throw an exception related
2399   // to input/output file problems encountered in a library function call.
2400   struct CImgIOException : public CImgException {
2401     CImgIOException(const char *const format, ...) { _cimg_exception_err("CImgIOException",true); }
2402   };
2403
2404   // The CImgWarningException class is used to throw an exception for warnings
2405   // encountered in a library function call.
2406   struct CImgWarningException : public CImgException {
2407     CImgWarningException(const char *const format, ...) { _cimg_exception_err("CImgWarningException",false); }
2408   };
2409
2410   /*-------------------------------------
2411     #
2412     # Define cimg:: namespace
2413     #
2414     -----------------------------------*/
2415   //! Contains \a low-level functions and variables of the \CImg Library.
2416   /**
2417      Most of the functions and variables within this namespace are used by the \CImg library for low-level operations.
2418      You may use them to access specific const values or environment variables internally used by \CImg.
2419      \warning Never write <tt>using namespace cimg_library::cimg;</tt> in your source code. Lot of functions in the
2420      <tt>cimg:: namespace</tt> have the same names as standard C functions that may be defined in the global
2421      namespace <tt>::</tt>.
2422   **/
2423   namespace cimg {
2424
2425     // Define traits that will be used to determine the best data type to work in CImg functions.
2426     //
2427     template<typename T> struct type {
2428       static const char* string() {
2429         static const char* s[] = { "unknown",   "unknown8",   "unknown16",  "unknown24",
2430                                    "unknown32", "unknown40",  "unknown48",  "unknown56",
2431                                    "unknown64", "unknown72",  "unknown80",  "unknown88",
2432                                    "unknown96", "unknown104", "unknown112", "unknown120",
2433                                    "unknown128" };
2434         return s[(sizeof(T)<17)?sizeof(T):0];
2435       }
2436       static bool is_float() { return false; }
2437       static bool is_inf(const T) { return false; }
2438       static bool is_nan(const T) { return false; }
2439       static T min() { return ~max(); }
2440       static T max() { return (T)(1UL<<(8*sizeof(T) - 1)); }
2441       static T inf() { return max(); }
2442       static T cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(T)val; }
2443       static const char* format() { return "%s"; }
2444       static const char* format(const T& val) { static const char *const s = "unknown"; cimg::unused(val); return s; }
2445     };
2446
2447     template<> struct type<bool> {
2448       static const char* string() { static const char *const s = "bool"; return s; }
2449       static bool is_float() { return false; }
2450       static bool is_inf(const bool) { return false; }
2451       static bool is_nan(const bool) { return false; }
2452       static bool min() { return false; }
2453       static bool max() { return true; }
2454       static bool inf() { return max(); }
2455       static bool is_inf() { return false; }
2456       static bool cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(bool)val; }
2457       static const char* format() { return "%s"; }
2458       static const char* format(const bool val) { static const char* s[] = { "false", "true" }; return s[val?1:0]; }
2459     };
2460
2461     template<> struct type<unsigned char> {
2462       static const char* string() { static const char *const s = "unsigned char"; return s; }
2463       static bool is_float() { return false; }
2464       static bool is_inf(const unsigned char) { return false; }
2465       static bool is_nan(const unsigned char) { return false; }
2466       static unsigned char min() { return 0; }
2467       static unsigned char max() { return (unsigned char)-1; }
2468       static unsigned char inf() { return max(); }
2469       static unsigned char cut(const double val) {
2470         return val<(double)min()?min():val>(double)max()?max():(unsigned char)val; }
2471       static const char* format() { return "%u"; }
2472       static unsigned int format(const unsigned char val) { return (unsigned int)val; }
2473     };
2474
2475 #if defined(CHAR_MAX) && CHAR_MAX==255
2476     template<> struct type<char> {
2477       static const char* string() { static const char *const s = "char"; return s; }
2478       static bool is_float() { return false; }
2479       static bool is_inf(const char) { return false; }
2480       static bool is_nan(const char) { return false; }
2481       static char min() { return 0; }
2482       static char max() { return (char)-1; }
2483       static char inf() { return max(); }
2484       static char cut(const double val) {
2485         return val<(double)min()?min():val>(double)max()?max():(unsigned char)val; }
2486       static const char* format() { return "%u"; }
2487       static unsigned int format(const char val) { return (unsigned int)val; }
2488     };
2489 #else
2490     template<> struct type<char> {
2491       static const char* string() { static const char *const s = "char"; return s; }
2492       static bool is_float() { return false; }
2493       static bool is_inf(const char) { return false; }
2494       static bool is_nan(const char) { return false; }
2495       static char min() { return ~max(); }
2496       static char max() { return (char)((unsigned char)-1>>1); }
2497       static char inf() { return max(); }
2498       static char cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(char)val; }
2499       static const char* format() { return "%d"; }
2500       static int format(const char val) { return (int)val; }
2501     };
2502 #endif
2503
2504     template<> struct type<signed char> {
2505       static const char* string() { static const char *const s = "signed char"; return s; }
2506       static bool is_float() { return false; }
2507       static bool is_inf(const signed char) { return false; }
2508       static bool is_nan(const signed char) { return false; }
2509       static signed char min() { return ~max(); }
2510       static signed char max() { return (signed char)((unsigned char)-1>>1); }
2511       static signed char inf() { return max(); }
2512       static signed char cut(const double val) {
2513         return val<(double)min()?min():val>(double)max()?max():(signed char)val; }
2514       static const char* format() { return "%d"; }
2515       static int format(const signed char val) { return (int)val; }
2516     };
2517
2518     template<> struct type<unsigned short> {
2519       static const char* string() { static const char *const s = "unsigned short"; return s; }
2520       static bool is_float() { return false; }
2521       static bool is_inf(const unsigned short) { return false; }
2522       static bool is_nan(const unsigned short) { return false; }
2523       static unsigned short min() { return 0; }
2524       static unsigned short max() { return (unsigned short)-1; }
2525       static unsigned short inf() { return max(); }
2526       static unsigned short cut(const double val) {
2527         return val<(double)min()?min():val>(double)max()?max():(unsigned short)val; }
2528       static const char* format() { return "%u"; }
2529       static unsigned int format(const unsigned short val) { return (unsigned int)val; }
2530     };
2531
2532     template<> struct type<short> {
2533       static const char* string() { static const char *const s = "short"; return s; }
2534       static bool is_float() { return false; }
2535       static bool is_inf(const short) { return false; }
2536       static bool is_nan(const short) { return false; }
2537       static short min() { return ~max(); }
2538       static short max() { return (short)((unsigned short)-1>>1); }
2539       static short inf() { return max(); }
2540       static short cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(short)val; }
2541       static const char* format() { return "%d"; }
2542       static int format(const short val) { return (int)val; }
2543     };
2544
2545     template<> struct type<unsigned int> {
2546       static const char* string() { static const char *const s = "unsigned int"; return s; }
2547       static bool is_float() { return false; }
2548       static bool is_inf(const unsigned int) { return false; }
2549       static bool is_nan(const unsigned int) { return false; }
2550       static unsigned int min() { return 0; }
2551       static unsigned int max() { return (unsigned int)-1; }
2552       static unsigned int inf() { return max(); }
2553       static unsigned int cut(const double val) {
2554         return val<(double)min()?min():val>(double)max()?max():(unsigned int)val; }
2555       static const char* format() { return "%u"; }
2556       static unsigned int format(const unsigned int val) { return val; }
2557     };
2558
2559     template<> struct type<int> {
2560       static const char* string() { static const char *const s = "int"; return s; }
2561       static bool is_float() { return false; }
2562       static bool is_inf(const int) { return false; }
2563       static bool is_nan(const int) { return false; }
2564       static int min() { return ~max(); }
2565       static int max() { return (int)((unsigned int)-1>>1); }
2566       static int inf() { return max(); }
2567       static int cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(int)val; }
2568       static const char* format() { return "%d"; }
2569       static int format(const int val) { return val; }
2570     };
2571
2572     template<> struct type<unsigned long> {
2573       static const char* string() { static const char *const s = "unsigned long"; return s; }
2574       static bool is_float() { return false; }
2575       static bool is_inf(const unsigned long) { return false; }
2576       static bool is_nan(const unsigned long) { return false; }
2577       static unsigned long min() { return 0; }
2578       static unsigned long max() { return (unsigned long)-1; }
2579       static unsigned long inf() { return max(); }
2580       static unsigned long cut(const double val) {
2581         return val<(double)min()?min():val>(double)max()?max():(unsigned long)val; }
2582       static const char* format() { return "%lu"; }
2583       static unsigned long format(const unsigned long val) { return val; }
2584     };
2585
2586     template<> struct type<long> {
2587       static const char* string() { static const char *const s = "long"; return s; }
2588       static bool is_float() { return false; }
2589       static bool is_inf(const long) { return false; }
2590       static bool is_nan(const long) { return false; }
2591       static long min() { return ~max(); }
2592       static long max() { return (long)((unsigned long)-1>>1); }
2593       static long inf() { return max(); }
2594       static long cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(long)val; }
2595       static const char* format() { return "%ld"; }
2596       static long format(const long val) { return val; }
2597     };
2598
2599     template<> struct type<double> {
2600       static const char* string() { static const char *const s = "double"; return s; }
2601       static bool is_float() { return true; }
2602       static bool is_inf(const double val) {
2603 #ifdef isinf
2604         return (bool)isinf(val);
2605 #else
2606         return !is_nan(val) && (val<cimg::type<double>::min() || val>cimg::type<double>::max());
2607 #endif
2608       }
2609       static bool is_nan(const double val) {
2610 #ifdef isnan
2611         return (bool)isnan(val);
2612 #else
2613         return !(val==val);
2614 #endif
2615       }
2616       static double min() { return -DBL_MAX; }
2617       static double max() { return DBL_MAX; }
2618       static double inf() {
2619 #ifdef INFINITY
2620         return (double)INFINITY;
2621 #else
2622         return max()*max();
2623 #endif
2624       }
2625       static double nan() {
2626 #ifdef NAN
2627         return (double)NAN;
2628 #else
2629         const double val_nan = -std::sqrt(-1.0); return val_nan;
2630 #endif
2631       }
2632       static double cut(const double val) { return val<min()?min():val>max()?max():val; }
2633       static const char* format() { return "%.16g"; }
2634       static double format(const double val) { return val; }
2635     };
2636
2637     template<> struct type<float> {
2638       static const char* string() { static const char *const s = "float"; return s; }
2639       static bool is_float() { return true; }
2640       static bool is_inf(const float val) {
2641 #ifdef isinf
2642         return (bool)isinf(val);
2643 #else
2644         return !is_nan(val) && (val<cimg::type<float>::min() || val>cimg::type<float>::max());
2645 #endif
2646       }
2647       static bool is_nan(const float val) {
2648 #ifdef isnan
2649         return (bool)isnan(val);
2650 #else
2651         return !(val==val);
2652 #endif
2653       }
2654       static float min() { return -FLT_MAX; }
2655       static float max() { return FLT_MAX; }
2656       static float inf() { return (float)cimg::type<double>::inf(); }
2657       static float nan() { return (float)cimg::type<double>::nan(); }
2658       static float cut(const double val) { return val<(double)min()?min():val>(double)max()?max():(float)val; }
2659       static const char* format() { return "%.16g"; }
2660       static double format(const float val) { return (double)val; }
2661     };
2662
2663     template<> struct type<long double> {
2664       static const char* string() { static const char *const s = "long double"; return s; }
2665       static bool is_float() { return true; }
2666       static bool is_inf(const long double val) {
2667 #ifdef isinf
2668         return (bool)isinf(val);
2669 #else
2670         return !is_nan(val) && (val<cimg::type<long double>::min() || val>cimg::type<long double>::max());
2671 #endif
2672       }
2673       static bool is_nan(const long double val) {
2674 #ifdef isnan
2675         return (bool)isnan(val);
2676 #else
2677         return !(val==val);
2678 #endif
2679       }
2680       static long double min() { return -LDBL_MAX; }
2681       static long double max() { return LDBL_MAX; }
2682       static long double inf() { return max()*max(); }
2683       static long double nan() { const long double val_nan = -std::sqrt(-1.0L); return val_nan; }
2684       static long double cut(const long double val) { return val<min()?min():val>max()?max():val; }
2685       static const char* format() { return "%.16g"; }
2686       static double format(const long double val) { return (double)val; }
2687     };
2688
2689     template<typename T, typename t> struct superset { typedef T type; };
2690     template<> struct superset<bool,unsigned char> { typedef unsigned char type; };
2691     template<> struct superset<bool,char> { typedef char type; };
2692     template<> struct superset<bool,signed char> { typedef signed char type; };
2693     template<> struct superset<bool,unsigned short> { typedef unsigned short type; };
2694     template<> struct superset<bool,short> { typedef short type; };
2695     template<> struct superset<bool,unsigned int> { typedef unsigned int type; };
2696     template<> struct superset<bool,int> { typedef int type; };
2697     template<> struct superset<bool,unsigned long> { typedef unsigned long type; };
2698     template<> struct superset<bool,long> { typedef long type; };
2699     template<> struct superset<bool,float> { typedef float type; };
2700     template<> struct superset<bool,double> { typedef double type; };
2701     template<> struct superset<unsigned char,char> { typedef short type; };
2702     template<> struct superset<unsigned char,signed char> { typedef short type; };
2703     template<> struct superset<unsigned char,unsigned short> { typedef unsigned short type; };
2704     template<> struct superset<unsigned char,short> { typedef short type; };
2705     template<> struct superset<unsigned char,unsigned int> { typedef unsigned int type; };
2706     template<> struct superset<unsigned char,int> { typedef int type; };
2707     template<> struct superset<unsigned char,unsigned long> { typedef unsigned long type; };
2708     template<> struct superset<unsigned char,long> { typedef long type; };
2709     template<> struct superset<unsigned char,float> { typedef float type; };
2710     template<> struct superset<unsigned char,double> { typedef double type; };
2711     template<> struct superset<signed char,unsigned char> { typedef short type; };
2712     template<> struct superset<signed char,char> { typedef short type; };
2713     template<> struct superset<signed char,unsigned short> { typedef int type; };
2714     template<> struct superset<signed char,short> { typedef short type; };
2715     template<> struct superset<signed char,unsigned int> { typedef long type; };
2716     template<> struct superset<signed char,int> { typedef int type; };
2717     template<> struct superset<signed char,unsigned long> { typedef long type; };
2718     template<> struct superset<signed char,long> { typedef long type; };
2719     template<> struct superset<signed char,float> { typedef float type; };
2720     template<> struct superset<signed char,double> { typedef double type; };
2721     template<> struct superset<char,unsigned char> { typedef short type; };
2722     template<> struct superset<char,signed char> { typedef short type; };
2723     template<> struct superset<char,unsigned short> { typedef int type; };
2724     template<> struct superset<char,short> { typedef short type; };
2725     template<> struct superset<char,unsigned int> { typedef long type; };
2726     template<> struct superset<char,int> { typedef int type; };
2727     template<> struct superset<char,unsigned long> { typedef long type; };
2728     template<> struct superset<char,long> { typedef long type; };
2729     template<> struct superset<char,float> { typedef float type; };
2730     template<> struct superset<char,double> { typedef double type; };
2731     template<> struct superset<unsigned short,char> { typedef int type; };
2732     template<> struct superset<unsigned short,signed char> { typedef int type; };
2733     template<> struct superset<unsigned short,short> { typedef int type; };
2734     template<> struct superset<unsigned short,unsigned int> { typedef unsigned int type; };
2735     template<> struct superset<unsigned short,int> { typedef int type; };
2736     template<> struct superset<unsigned short,unsigned long> { typedef unsigned long type; };
2737     template<> struct superset<unsigned short,long> { typedef long type; };
2738     template<> struct superset<unsigned short,float> { typedef float type; };
2739     template<> struct superset<unsigned short,double> { typedef double type; };
2740     template<> struct superset<short,unsigned short> { typedef int type; };
2741     template<> struct superset<short,unsigned int> { typedef long type; };
2742     template<> struct superset<short,int> { typedef int type; };
2743     template<> struct superset<short,unsigned long> { typedef long type; };
2744     template<> struct superset<short,long> { typedef long type; };
2745     template<> struct superset<short,float> { typedef float type; };
2746     template<> struct superset<short,double> { typedef double type; };
2747     template<> struct superset<unsigned int,char> { typedef long type; };
2748     template<> struct superset<unsigned int,signed char> { typedef long type; };
2749     template<> struct superset<unsigned int,short> { typedef long type; };
2750     template<> struct superset<unsigned int,int> { typedef long type; };
2751     template<> struct superset<unsigned int,unsigned long> { typedef unsigned long type; };
2752     template<> struct superset<unsigned int,long> { typedef long type; };
2753     template<> struct superset<unsigned int,float> { typedef float type; };
2754     template<> struct superset<unsigned int,double> { typedef double type; };
2755     template<> struct superset<int,unsigned int> { typedef long type; };
2756     template<> struct superset<int,unsigned long> { typedef long type; };
2757     template<> struct superset<int,long> { typedef long type; };
2758     template<> struct superset<int,float> { typedef float type; };
2759     template<> struct superset<int,double> { typedef double type; };
2760     template<> struct superset<unsigned long,char> { typedef long type; };
2761     template<> struct superset<unsigned long,signed char> { typedef long type; };
2762     template<> struct superset<unsigned long,short> { typedef long type; };
2763     template<> struct superset<unsigned long,int> { typedef long type; };
2764     template<> struct superset<unsigned long,long> { typedef long type; };
2765     template<> struct superset<unsigned long,float> { typedef double type; };
2766     template<> struct superset<unsigned long,double> { typedef double type; };
2767     template<> struct superset<long,float> { typedef double type; };
2768     template<> struct superset<long,double> { typedef double type; };
2769     template<> struct superset<float,double> { typedef double type; };
2770
2771     template<typename t1, typename t2, typename t3> struct superset2 {
2772       typedef typename superset<t1, typename superset<t2,t3>::type>::type type;
2773     };
2774
2775     template<typename t1, typename t2, typename t3, typename t4> struct superset3 {
2776       typedef typename superset<t1, typename superset2<t2,t3,t4>::type>::type type;
2777     };
2778
2779     template<typename t1, typename t2> struct last { typedef t2 type; };
2780
2781 #define _cimg_Tt       typename cimg::superset<T,t>::type
2782 #define _cimg_Tfloat   typename cimg::superset<T,float>::type
2783 #define _cimg_Ttfloat  typename cimg::superset2<T,t,float>::type
2784 #define _cimg_Ttdouble typename cimg::superset2<T,t,double>::type
2785
2786     // Define variables used internally by CImg.
2787 #if cimg_display==1
2788     struct X11_info {
2789       unsigned int nb_wins;
2790       pthread_t *events_thread;
2791       pthread_cond_t wait_event;
2792       pthread_mutex_t wait_event_mutex;
2793       CImgDisplay **wins;
2794       Display *display;
2795       unsigned int nb_bits;
2796       bool is_blue_first;
2797       bool is_shm_enabled;
2798       bool byte_order;
2799 #ifdef cimg_use_xrandr
2800       XRRScreenSize *resolutions;
2801       Rotation curr_rotation;
2802       unsigned int curr_resolution;
2803       unsigned int nb_resolutions;
2804 #endif
2805       X11_info():nb_wins(0),events_thread(0),display(0),
2806                  nb_bits(0),is_blue_first(false),is_shm_enabled(false),byte_order(false) {
2807 #ifdef __FreeBSD__
2808         XInitThreads();
2809 #endif
2810         wins = new CImgDisplay*[1024];
2811         pthread_mutex_init(&wait_event_mutex,0);
2812         pthread_cond_init(&wait_event,0);
2813 #ifdef cimg_use_xrandr
2814         resolutions = 0;
2815         curr_rotation = 0;
2816         curr_resolution = nb_resolutions = 0;
2817 #endif
2818       }
2819
2820       ~X11_info() {
2821         delete[] wins;
2822         /*
2823           if (events_thread) {
2824           pthread_cancel(*events_thread);
2825           delete events_thread;
2826           }
2827           if (display) { } // XCloseDisplay(display); }
2828           pthread_cond_destroy(&wait_event);
2829           pthread_mutex_unlock(&wait_event_mutex);
2830           pthread_mutex_destroy(&wait_event_mutex);
2831         */
2832       }
2833     };
2834 #if defined(cimg_module)
2835     X11_info& X11_attr();
2836 #elif defined(cimg_main)
2837     X11_info& X11_attr() { static X11_info val; return val; }
2838 #else
2839     inline X11_info& X11_attr() { static X11_info val; return val; }
2840 #endif
2841 #define cimg_lock_display() cimg::mutex(15)
2842 #define cimg_unlock_display() cimg::mutex(15,0)
2843
2844 #elif cimg_display==2
2845     struct Win32_info {
2846       HANDLE wait_event;
2847       Win32_info() { wait_event = CreateEvent(0,FALSE,FALSE,0); }
2848     };
2849 #if defined(cimg_module)
2850     Win32_info& Win32_attr();
2851 #elif defined(cimg_main)
2852     Win32_info& Win32_attr() { static Win32_info val; return val; }
2853 #else
2854     inline Win32_info& Win32_attr() { static Win32_info val; return val; }
2855 #endif
2856 #endif
2857
2858     struct Mutex_info {
2859 #if cimg_OS==2
2860       HANDLE mutex[32];
2861       Mutex_info() { for (unsigned int i = 0; i<32; ++i) mutex[i] = CreateMutex(0,FALSE,0); }
2862       void lock(const unsigned int n) { WaitForSingleObject(mutex[n],INFINITE); }
2863       void unlock(const unsigned int n) { ReleaseMutex(mutex[n]); }
2864       int trylock(const unsigned int) { return 0; }
2865 #elif defined(_PTHREAD_H)
2866       pthread_mutex_t mutex[32];
2867       Mutex_info() { for (unsigned int i = 0; i<32; ++i) pthread_mutex_init(&mutex[i],0); }
2868       void lock(const unsigned int n) { pthread_mutex_lock(&mutex[n]); }
2869       void unlock(const unsigned int n) { pthread_mutex_unlock(&mutex[n]); }
2870       int trylock(const unsigned int n) { return pthread_mutex_trylock(&mutex[n]); }
2871 #else
2872       Mutex_info() {}
2873       void lock(const unsigned int) {}
2874       void unlock(const unsigned int) {}
2875       int trylock(const unsigned int) { return 0; }
2876 #endif
2877     };
2878 #if defined(cimg_module)
2879     Mutex_info& Mutex_attr();
2880 #elif defined(cimg_main)
2881     Mutex_info& Mutex_attr() { static Mutex_info val; return val; }
2882 #else
2883     inline Mutex_info& Mutex_attr() { static Mutex_info val; return val; }
2884 #endif
2885
2886 #if defined(cimg_use_magick)
2887     static struct Magick_info {
2888       Magick_info() {
2889         Magick::InitializeMagick("");
2890       }
2891     } _Magick_info;
2892 #endif
2893
2894 #if cimg_display==1
2895     // Define keycodes for X11-based graphical systems.
2896     const unsigned int keyESC        = XK_Escape;
2897     const unsigned int keyF1         = XK_F1;
2898     const unsigned int keyF2         = XK_F2;
2899     const unsigned int keyF3         = XK_F3;
2900     const unsigned int keyF4         = XK_F4;
2901     const unsigned int keyF5         = XK_F5;
2902     const unsigned int keyF6         = XK_F6;
2903     const unsigned int keyF7         = XK_F7;
2904     const unsigned int keyF8         = XK_F8;
2905     const unsigned int keyF9         = XK_F9;
2906     const unsigned int keyF10        = XK_F10;
2907     const unsigned int keyF11        = XK_F11;
2908     const unsigned int keyF12        = XK_F12;
2909     const unsigned int keyPAUSE      = XK_Pause;
2910     const unsigned int key1          = XK_1;
2911     const unsigned int key2          = XK_2;
2912     const unsigned int key3          = XK_3;
2913     const unsigned int key4          = XK_4;
2914     const unsigned int key5          = XK_5;
2915     const unsigned int key6          = XK_6;
2916     const unsigned int key7          = XK_7;
2917     const unsigned int key8          = XK_8;
2918     const unsigned int key9          = XK_9;
2919     const unsigned int key0          = XK_0;
2920     const unsigned int keyBACKSPACE  = XK_BackSpace;
2921     const unsigned int keyINSERT     = XK_Insert;
2922     const unsigned int keyHOME       = XK_Home;
2923     const unsigned int keyPAGEUP     = XK_Page_Up;
2924     const unsigned int keyTAB        = XK_Tab;
2925     const unsigned int keyQ          = XK_q;
2926     const unsigned int keyW          = XK_w;
2927     const unsigned int keyE          = XK_e;
2928     const unsigned int keyR          = XK_r;
2929     const unsigned int keyT          = XK_t;
2930     const unsigned int keyY          = XK_y;
2931     const unsigned int keyU          = XK_u;
2932     const unsigned int keyI          = XK_i;
2933     const unsigned int keyO          = XK_o;
2934     const unsigned int keyP          = XK_p;
2935     const unsigned int keyDELETE     = XK_Delete;
2936     const unsigned int keyEND        = XK_End;
2937     const unsigned int keyPAGEDOWN   = XK_Page_Down;
2938     const unsigned int keyCAPSLOCK   = XK_Caps_Lock;
2939     const unsigned int keyA          = XK_a;
2940     const unsigned int keyS          = XK_s;
2941     const unsigned int keyD          = XK_d;
2942     const unsigned int keyF          = XK_f;
2943     const unsigned int keyG          = XK_g;
2944     const unsigned int keyH          = XK_h;
2945     const unsigned int keyJ          = XK_j;
2946     const unsigned int keyK          = XK_k;
2947     const unsigned int keyL          = XK_l;
2948     const unsigned int keyENTER      = XK_Return;
2949     const unsigned int keySHIFTLEFT  = XK_Shift_L;
2950     const unsigned int keyZ          = XK_z;
2951     const unsigned int keyX          = XK_x;
2952     const unsigned int keyC          = XK_c;
2953     const unsigned int keyV          = XK_v;
2954     const unsigned int keyB          = XK_b;
2955     const unsigned int keyN          = XK_n;
2956     const unsigned int keyM          = XK_m;
2957     const unsigned int keySHIFTRIGHT = XK_Shift_R;
2958     const unsigned int keyARROWUP    = XK_Up;
2959     const unsigned int keyCTRLLEFT   = XK_Control_L;
2960     const unsigned int keyAPPLEFT    = XK_Super_L;
2961     const unsigned int keyALT        = XK_Alt_L;
2962     const unsigned int keySPACE      = XK_space;
2963     const unsigned int keyALTGR      = XK_Alt_R;
2964     const unsigned int keyAPPRIGHT   = XK_Super_R;
2965     const unsigned int keyMENU       = XK_Menu;
2966     const unsigned int keyCTRLRIGHT  = XK_Control_R;
2967     const unsigned int keyARROWLEFT  = XK_Left;
2968     const unsigned int keyARROWDOWN  = XK_Down;
2969     const unsigned int keyARROWRIGHT = XK_Right;
2970     const unsigned int keyPAD0       = XK_KP_0;
2971     const unsigned int keyPAD1       = XK_KP_1;
2972     const unsigned int keyPAD2       = XK_KP_2;
2973     const unsigned int keyPAD3       = XK_KP_3;
2974     const unsigned int keyPAD4       = XK_KP_4;
2975     const unsigned int keyPAD5       = XK_KP_5;
2976     const unsigned int keyPAD6       = XK_KP_6;
2977     const unsigned int keyPAD7       = XK_KP_7;
2978     const unsigned int keyPAD8       = XK_KP_8;
2979     const unsigned int keyPAD9       = XK_KP_9;
2980     const unsigned int keyPADADD     = XK_KP_Add;
2981     const unsigned int keyPADSUB     = XK_KP_Subtract;
2982     const unsigned int keyPADMUL     = XK_KP_Multiply;
2983     const unsigned int keyPADDIV     = XK_KP_Divide;
2984
2985 #elif cimg_display==2
2986     // Define keycodes for Windows.
2987     const unsigned int keyESC        = VK_ESCAPE;
2988     const unsigned int keyF1         = VK_F1;
2989     const unsigned int keyF2         = VK_F2;
2990     const unsigned int keyF3         = VK_F3;
2991     const unsigned int keyF4         = VK_F4;
2992     const unsigned int keyF5         = VK_F5;
2993     const unsigned int keyF6         = VK_F6;
2994     const unsigned int keyF7         = VK_F7;
2995     const unsigned int keyF8         = VK_F8;
2996     const unsigned int keyF9         = VK_F9;
2997     const unsigned int keyF10        = VK_F10;
2998     const unsigned int keyF11        = VK_F11;
2999     const unsigned int keyF12        = VK_F12;
3000     const unsigned int keyPAUSE      = VK_PAUSE;
3001     const unsigned int key1          = '1';
3002     const unsigned int key2          = '2';
3003     const unsigned int key3          = '3';
3004     const unsigned int key4          = '4';
3005     const unsigned int key5          = '5';
3006     const unsigned int key6          = '6';
3007     const unsigned int key7          = '7';
3008     const unsigned int key8          = '8';
3009     const unsigned int key9          = '9';
3010     const unsigned int key0          = '0';
3011     const unsigned int keyBACKSPACE  = VK_BACK;
3012     const unsigned int keyINSERT     = VK_INSERT;
3013     const unsigned int keyHOME       = VK_HOME;
3014     const unsigned int keyPAGEUP     = VK_PRIOR;
3015     const unsigned int keyTAB        = VK_TAB;
3016     const unsigned int keyQ          = 'Q';
3017     const unsigned int keyW          = 'W';
3018     const unsigned int keyE          = 'E';
3019     const unsigned int keyR          = 'R';
3020     const unsigned int keyT          = 'T';
3021     const unsigned int keyY          = 'Y';
3022     const unsigned int keyU          = 'U';
3023     const unsigned int keyI          = 'I';
3024     const unsigned int keyO          = 'O';
3025     const unsigned int keyP          = 'P';
3026     const unsigned int keyDELETE     = VK_DELETE;
3027     const unsigned int keyEND        = VK_END;
3028     const unsigned int keyPAGEDOWN   = VK_NEXT;
3029     const unsigned int keyCAPSLOCK   = VK_CAPITAL;
3030     const unsigned int keyA          = 'A';
3031     const unsigned int keyS          = 'S';
3032     const unsigned int keyD          = 'D';
3033     const unsigned int keyF          = 'F';
3034     const unsigned int keyG          = 'G';
3035     const unsigned int keyH          = 'H';
3036     const unsigned int keyJ          = 'J';
3037     const unsigned int keyK          = 'K';
3038     const unsigned int keyL          = 'L';
3039     const unsigned int keyENTER      = VK_RETURN;
3040     const unsigned int keySHIFTLEFT  = VK_SHIFT;
3041     const unsigned int keyZ          = 'Z';
3042     const unsigned int keyX          = 'X';
3043     const unsigned int keyC          = 'C';
3044     const unsigned int keyV          = 'V';
3045     const unsigned int keyB          = 'B';
3046     const unsigned int keyN          = 'N';
3047     const unsigned int keyM          = 'M';
3048     const unsigned int keySHIFTRIGHT = VK_SHIFT;
3049     const unsigned int keyARROWUP    = VK_UP;
3050     const unsigned int keyCTRLLEFT   = VK_CONTROL;
3051     const unsigned int keyAPPLEFT    = VK_LWIN;
3052     const unsigned int keyALT        = VK_LMENU;
3053     const unsigned int keySPACE      = VK_SPACE;
3054     const unsigned int keyALTGR      = VK_CONTROL;
3055     const unsigned int keyAPPRIGHT   = VK_RWIN;
3056     const unsigned int keyMENU       = VK_APPS;
3057     const unsigned int keyCTRLRIGHT  = VK_CONTROL;
3058     const unsigned int keyARROWLEFT  = VK_LEFT;
3059     const unsigned int keyARROWDOWN  = VK_DOWN;
3060     const unsigned int keyARROWRIGHT = VK_RIGHT;
3061     const unsigned int keyPAD0       = 0x60;
3062     const unsigned int keyPAD1       = 0x61;
3063     const unsigned int keyPAD2       = 0x62;
3064     const unsigned int keyPAD3       = 0x63;
3065     const unsigned int keyPAD4       = 0x64;
3066     const unsigned int keyPAD5       = 0x65;
3067     const unsigned int keyPAD6       = 0x66;
3068     const unsigned int keyPAD7       = 0x67;
3069     const unsigned int keyPAD8       = 0x68;
3070     const unsigned int keyPAD9       = 0x69;
3071     const unsigned int keyPADADD     = VK_ADD;
3072     const unsigned int keyPADSUB     = VK_SUBTRACT;
3073     const unsigned int keyPADMUL     = VK_MULTIPLY;
3074     const unsigned int keyPADDIV     = VK_DIVIDE;
3075
3076 #else
3077     // Define random keycodes when no display is available.
3078     // (should rarely be used then!).
3079     const unsigned int keyESC        = 1U;   //!< Keycode for the \c ESC key (architecture-dependent).
3080     const unsigned int keyF1         = 2U;   //!< Keycode for the \c F1 key (architecture-dependent).
3081     const unsigned int keyF2         = 3U;   //!< Keycode for the \c F2 key (architecture-dependent).
3082     const unsigned int keyF3         = 4U;   //!< Keycode for the \c F3 key (architecture-dependent).
3083     const unsigned int keyF4         = 5U;   //!< Keycode for the \c F4 key (architecture-dependent).
3084     const unsigned int keyF5         = 6U;   //!< Keycode for the \c F5 key (architecture-dependent).
3085     const unsigned int keyF6         = 7U;   //!< Keycode for the \c F6 key (architecture-dependent).
3086     const unsigned int keyF7         = 8U;   //!< Keycode for the \c F7 key (architecture-dependent).
3087     const unsigned int keyF8         = 9U;   //!< Keycode for the \c F8 key (architecture-dependent).
3088     const unsigned int keyF9         = 10U;  //!< Keycode for the \c F9 key (architecture-dependent).
3089     const unsigned int keyF10        = 11U;  //!< Keycode for the \c F10 key (architecture-dependent).
3090     const unsigned int keyF11        = 12U;  //!< Keycode for the \c F11 key (architecture-dependent).
3091     const unsigned int keyF12        = 13U;  //!< Keycode for the \c F12 key (architecture-dependent).
3092     const unsigned int keyPAUSE      = 14U;  //!< Keycode for the \c PAUSE key (architecture-dependent).
3093     const unsigned int key1          = 15U;  //!< Keycode for the \c 1 key (architecture-dependent).
3094     const unsigned int key2          = 16U;  //!< Keycode for the \c 2 key (architecture-dependent).
3095     const unsigned int key3          = 17U;  //!< Keycode for the \c 3 key (architecture-dependent).
3096     const unsigned int key4          = 18U;  //!< Keycode for the \c 4 key (architecture-dependent).
3097     const unsigned int key5          = 19U;  //!< Keycode for the \c 5 key (architecture-dependent).
3098     const unsigned int key6          = 20U;  //!< Keycode for the \c 6 key (architecture-dependent).
3099     const unsigned int key7          = 21U;  //!< Keycode for the \c 7 key (architecture-dependent).
3100     const unsigned int key8          = 22U;  //!< Keycode for the \c 8 key (architecture-dependent).
3101     const unsigned int key9          = 23U;  //!< Keycode for the \c 9 key (architecture-dependent).
3102     const unsigned int key0          = 24U;  //!< Keycode for the \c 0 key (architecture-dependent).
3103     const unsigned int keyBACKSPACE  = 25U;  //!< Keycode for the \c BACKSPACE key (architecture-dependent).
3104     const unsigned int keyINSERT     = 26U;  //!< Keycode for the \c INSERT key (architecture-dependent).
3105     const unsigned int keyHOME       = 27U;  //!< Keycode for the \c HOME key (architecture-dependent).
3106     const unsigned int keyPAGEUP     = 28U;  //!< Keycode for the \c PAGEUP key (architecture-dependent).
3107     const unsigned int keyTAB        = 29U;  //!< Keycode for the \c TAB key (architecture-dependent).
3108     const unsigned int keyQ          = 30U;  //!< Keycode for the \c Q key (architecture-dependent).
3109     const unsigned int keyW          = 31U;  //!< Keycode for the \c W key (architecture-dependent).
3110     const unsigned int keyE          = 32U;  //!< Keycode for the \c E key (architecture-dependent).
3111     const unsigned int keyR          = 33U;  //!< Keycode for the \c R key (architecture-dependent).
3112     const unsigned int keyT          = 34U;  //!< Keycode for the \c T key (architecture-dependent).
3113     const unsigned int keyY          = 35U;  //!< Keycode for the \c Y key (architecture-dependent).
3114     const unsigned int keyU          = 36U;  //!< Keycode for the \c U key (architecture-dependent).
3115     const unsigned int keyI          = 37U;  //!< Keycode for the \c I key (architecture-dependent).
3116     const unsigned int keyO          = 38U;  //!< Keycode for the \c O key (architecture-dependent).
3117     const unsigned int keyP          = 39U;  //!< Keycode for the \c P key (architecture-dependent).
3118     const unsigned int keyDELETE     = 40U;  //!< Keycode for the \c DELETE key (architecture-dependent).
3119     const unsigned int keyEND        = 41U;  //!< Keycode for the \c END key (architecture-dependent).
3120     const unsigned int keyPAGEDOWN   = 42U;  //!< Keycode for the \c PAGEDOWN key (architecture-dependent).
3121     const unsigned int keyCAPSLOCK   = 43U;  //!< Keycode for the \c CAPSLOCK key (architecture-dependent).
3122     const unsigned int keyA          = 44U;  //!< Keycode for the \c A key (architecture-dependent).
3123     const unsigned int keyS          = 45U;  //!< Keycode for the \c S key (architecture-dependent).
3124     const unsigned int keyD          = 46U;  //!< Keycode for the \c D key (architecture-dependent).
3125     const unsigned int keyF          = 47U;  //!< Keycode for the \c F key (architecture-dependent).
3126     const unsigned int keyG          = 48U;  //!< Keycode for the \c G key (architecture-dependent).
3127     const unsigned int keyH          = 49U;  //!< Keycode for the \c H key (architecture-dependent).
3128     const unsigned int keyJ          = 50U;  //!< Keycode for the \c J key (architecture-dependent).
3129     const unsigned int keyK          = 51U;  //!< Keycode for the \c K key (architecture-dependent).
3130     const unsigned int keyL          = 52U;  //!< Keycode for the \c L key (architecture-dependent).
3131     const unsigned int keyENTER      = 53U;  //!< Keycode for the \c ENTER key (architecture-dependent).
3132     const unsigned int keySHIFTLEFT  = 54U;  //!< Keycode for the \c SHIFTLEFT key (architecture-dependent).
3133     const unsigned int keyZ          = 55U;  //!< Keycode for the \c Z key (architecture-dependent).
3134     const unsigned int keyX          = 56U;  //!< Keycode for the \c X key (architecture-dependent).
3135     const unsigned int keyC          = 57U;  //!< Keycode for the \c C key (architecture-dependent).
3136     const unsigned int keyV          = 58U;  //!< Keycode for the \c V key (architecture-dependent).
3137     const unsigned int keyB          = 59U;  //!< Keycode for the \c B key (architecture-dependent).
3138     const unsigned int keyN          = 60U;  //!< Keycode for the \c N key (architecture-dependent).
3139     const unsigned int keyM          = 61U;  //!< Keycode for the \c M key (architecture-dependent).
3140     const unsigned int keySHIFTRIGHT = 62U;  //!< Keycode for the \c SHIFTRIGHT key (architecture-dependent).
3141     const unsigned int keyARROWUP    = 63U;  //!< Keycode for the \c ARROWUP key (architecture-dependent).
3142     const unsigned int keyCTRLLEFT   = 64U;  //!< Keycode for the \c CTRLLEFT key (architecture-dependent).
3143     const unsigned int keyAPPLEFT    = 65U;  //!< Keycode for the \c APPLEFT key (architecture-dependent).
3144     const unsigned int keyALT        = 66U;  //!< Keycode for the \c ALT key (architecture-dependent).
3145     const unsigned int keySPACE      = 67U;  //!< Keycode for the \c SPACE key (architecture-dependent).
3146     const unsigned int keyALTGR      = 68U;  //!< Keycode for the \c ALTGR key (architecture-dependent).
3147     const unsigned int keyAPPRIGHT   = 69U;  //!< Keycode for the \c APPRIGHT key (architecture-dependent).
3148     const unsigned int keyMENU       = 70U;  //!< Keycode for the \c MENU key (architecture-dependent).
3149     const unsigned int keyCTRLRIGHT  = 71U;  //!< Keycode for the \c CTRLRIGHT key (architecture-dependent).
3150     const unsigned int keyARROWLEFT  = 72U;  //!< Keycode for the \c ARROWLEFT key (architecture-dependent).
3151     const unsigned int keyARROWDOWN  = 73U;  //!< Keycode for the \c ARROWDOWN key (architecture-dependent).
3152     const unsigned int keyARROWRIGHT = 74U;  //!< Keycode for the \c ARROWRIGHT key (architecture-dependent).
3153     const unsigned int keyPAD0       = 75U;  //!< Keycode for the \c PAD0 key (architecture-dependent).
3154     const unsigned int keyPAD1       = 76U;  //!< Keycode for the \c PAD1 key (architecture-dependent).
3155     const unsigned int keyPAD2       = 77U;  //!< Keycode for the \c PAD2 key (architecture-dependent).
3156     const unsigned int keyPAD3       = 78U;  //!< Keycode for the \c PAD3 key (architecture-dependent).
3157     const unsigned int keyPAD4       = 79U;  //!< Keycode for the \c PAD4 key (architecture-dependent).
3158     const unsigned int keyPAD5       = 80U;  //!< Keycode for the \c PAD5 key (architecture-dependent).
3159     const unsigned int keyPAD6       = 81U;  //!< Keycode for the \c PAD6 key (architecture-dependent).
3160     const unsigned int keyPAD7       = 82U;  //!< Keycode for the \c PAD7 key (architecture-dependent).
3161     const unsigned int keyPAD8       = 83U;  //!< Keycode for the \c PAD8 key (architecture-dependent).
3162     const unsigned int keyPAD9       = 84U;  //!< Keycode for the \c PAD9 key (architecture-dependent).
3163     const unsigned int keyPADADD     = 85U;  //!< Keycode for the \c PADADD key (architecture-dependent).
3164     const unsigned int keyPADSUB     = 86U;  //!< Keycode for the \c PADSUB key (architecture-dependent).
3165     const unsigned int keyPADMUL     = 87U;  //!< Keycode for the \c PADMUL key (architecture-dependent).
3166     const unsigned int keyPADDIV     = 88U;  //!< Keycode for the \c PADDDIV key (architecture-dependent).
3167 #endif
3168
3169     const double PI = 3.14159265358979323846;   //!< Value of the mathematical constant PI
3170
3171     // Define a 12x13 font (small size).
3172     static const char *const data_font12x13 =
3173 "                          .wjwlwmyuw>wjwkwbwjwkwRxuwmwjwkwmyuwJwjwlx`w      Fw                         mwlwlwuwnwuynwuwmyTwlwkwuwmwuwnwlwkwuwmwuw_wuxl"
3174 "wlwkwuwnwuynwuwTwlwlwtwnwtwnw my     Qw   +wlw   b{ \\w  Wx`xTw_w[wbxawSwkw  nynwky<x1w `y    ,w  Xwuw   CxlwiwlwmyuwbwuwUwiwlwbwiwrwqw^wuwmxuwnwiwlwmy"
3175 "uwJwiwlw^wnwEymymymymy1w^wkxnxtxnw<| gybwkwuwjwtwowmxswnxnwkxlxkw:wlymxlymykwn{myo{nymy2ykwqwqwm{myozn{o{mzpwrwpwkwkwswowkwqwqxswnyozlyozmzp}pwrwqwqwq"
3176 "wswswsxsxqwqwp}qwlwiwjybw`w[wcw_wkwkwkwkw mw\"wlwiw=wtw`xIw awuwlwm{o{mylwn|pwtwtwoy`w_w_wbwiwkxcwqwpwkznwuwjzpyGzqymyaxlylw_zWxkxaxrwqxrwqyswowkwkwkwk"
3177 "wkwkwk}qyo{o{o{o{owkwkwkwkznxswnymymymymyayuwqwrwpwrwpwrwpwrwqwqwpwkwtwlwkwlwuwnwuynwuwmyTwkwlwuwmwuwnwkwlwuwmwuwkxlwuxmwkwlwuwnwuynwuwTwkwlwuwmwuwlwm"
3178 "wkwtwUwuwuwowswowswowswowsw;wqwtw_ymzp~py>w bwswcwkwuwjwuwozpwtwuwnwtwowkwjwmwuwuwkwIxmxuxowuwmwswowswmxnwjwhwowswowsw0wmwowswuwnwrwowswpwswowkwjwrwqw"
3179 "rwpwkwkwtwnwkxsxqxswowswpwswnwswpwswowrwnwmwrwqwqwqwswswrwswowswjwpwlxjwkxuxLw[wcw_wSwkw mw\"wlwiw=wtwmxlwFw cwswnwuwnwkwjwswo{pwrwpwtwtwpwswby`w`yUwlw"
3180 "twpwqwpwswowlw\\wrwrxuwHwrwfwuwjwlwlwTyuwVwlwtwawswowswowswcwuwmwuwmwuwmwuwmwuwlwkwuwnwswpwkwkwkwkwkwkwkwkwswoxswowswowswowswowswowswowrwpwswpwrwpwrwpw"
3181 "rwpwrwpwswoznwtw  Ww (wGwtwtwqwqwqwuwuwuwqwswuwqwqw=wqxtw`{nzp~q{ozowrwnxmwtwow bzawkwuwl}rwuwnwtwuwnwtwowkwjwlyjwIwlwswmwiwkwnwuwnwkwhwnwswowswowkwew"
3182 "ewixnwsytwswuwnwrwpwkwrwpwkwkwkwrwpwkwkwuwmwkxsxqwuwtwpwqwqwswowqwqwswowiwmwrwpwswowtwtwpwuwmwuwjwowkwjwlxsxXynzmymznyozlzoznwkwkwtwnwkzuyrzmynzmzowux"
3183 "myozmwswpwrwowtwtwrwrwpwrwp{mwlwiwHyuwpwtwkwmxlynzoxswmwmwswnwswowtxq|owtwtwpym{p{owswnwuwmwlwkwqwqxuwuxqwrwpwtwtwqwqwowlwuwuwkwmwlwtwowuwuwdwjznwl{nw"
3184 "uwnwkx_wtxtwswtwlwtwWwuytwgyjwmwjwawswoyuwVwlwtwnwtwmwtwnwtwmwuwmwlwuwmwuwmwuwmwuwmwuwmwuwmxuwowkwkwkwkwkwkwkwkwkwrwpwuwtwpwqwqwqwqwqwqwqwqwqwowtwpwsw"
3185 "uwqwrwpwrwpwrwpwrwowuwnwswowuwlymymymymymymyuyqymymymymynwkwkwkwjynzmymymymymykwmzowswowswowswowswpwrwozowrwW}q}qwtwtwqwtwtwqwtwtwA}rwuw_{p~r~r}pwtwow"
3186 "rwnxmwtwow aw_w]wtwpwuwmxuwmybwjwlyjwIwlwswmwiwnynwtwnznzkwmynwswTyp}pylwmwtwtwtwswuwn{owkwrwp{o{owk|pwkwkxlwkwuwuwuwqwuwtwpwqwqwswowqwqwswoykwmwrwpws"
3187 "wowuwuwuwowkwjwnwkwjwDwowswowkwswowswowkwswowswowkwkwuwmwkwswswswswowswowswowswoxlwswowkwswpwrwowtwtwqwtwowrwlwoxkwhxVxuxpwtypwuwjwnwtwnwkwswowtxnxmws"
3188 "wowqwqwtwuxqwtwnwtwtwqwswowswmwm{nwuwlxnwkwqwqwtwtwqwrwpwtwtwqwuyuwpwiwhwnwmwrwnwbwkwuwlwlwswoxuxowlwtw`wuwrwszmwtwo}dwuwtwuw[}qymx`wswoyuwow_ylxlwtwo"
3189 "yuwoyuwoyuwmwlwuwmwuwmwuwmwuwmwuwmwuwmwt{swk{o{o{o{owkwkwkwlztwpwuwtwpwqwqwqwqwqwqwqwqwqwnxowtwtwqwrwpwrwpwrwpwrwnwmwswowuwiwkwkwkwkwkwkwswswkwswowswo"
3190 "wswowswowkwkwkwkwswowswowswowswowswowswowswcwtxowswowswowswowswpwrwowswpwrwWwtwtwqwqwqwuwuwuwqwuwswqwqw>wowuw`}q~q|q}qwrwpwrwowtwnwtwo~ izaw]wtwoykwux"
3191 "qwtwswfwjwmwuwuwn}eyaxlwswmwjwjwpwswjwowswmwmwswnzWy]ypwlwtwtwuwswswowrwpwkwrwpwkwkwsyqwrwpwkwkwuwmwkwuwuwuwqwtwuwpwqwqznwqwqzkynwmwrwowuwnwuwuwuwowkw"
3192 "jwnwkxkwGzowswowkwswo{owkwswowswowkwkxlwkwswswswswowswowswowswowjxmwkwswowtwnwuwuwuwpxmwtwlwlwlwiwlytwewtwtwqwswowtxoznwswnxmwswnwuwmwuwnwswowtwtwqwtw"
3193 "twqwtwnwtwtwqwswowswmwmwswowswmwmwkwqwqwtwtwqwrwowuwuwpwuyuwq~own~own~owbwkwuwmznwswmwbwswawuwrwgwtwhwdwuytwXwJwswnxuw=wtwmwswowtxowswqxmwswowswowswow"
3194 "swowswowswnwtwowkwkwkwkwkwkwkwkwkwrwpwtwuwpwqwqwqwqwqwqwqwqwqwnxowtwtwqwrwpwrwpwrwpwrwnwmwswowtwmznznznznznzn~swk{o{o{o{owkwkwkwkwswowswowswowswowswow"
3195 "swowswo}qwuwuwowswowswowswowswowtwnwswowtwUwuwuwowswowswowswowsw@}qx`}q~pzo{pwrwpwrwowtwnwtwow aw_w_}owuwmwuwtwrwswuwewjwkwiwJwkwswmwkwiwp|kwowswmwmws"
3196 "wkwWym}mypwlwszr{owrwpwkwrwpwkwkwqwqwrwpwkwkwtwnwkwtwtwqwtwuwpwqwqwkwqwqwtwiwnwmwrwowuwnwuwuwuwpwuwlwkwmwjwkwHwswowswowkwswowkwkwswowswowkwkwuwmwkwsws"
3197 "wswswowswowswowswowhwnwkwswowtwnwuwuwuwpxmwtwmwkwlwiwmwtydwtwtwqwswowswowtwnwswowkwswnwuwnwtwnwswowtwtwqwtwtwqwtwnwtwtwqwswowswmwmwswowswnwlwkwqwqxuwu"
3198 "xqwrwnyowqwpwiwhwpwuwuwowrwpwuwuwdwkwuwlwlwswo{owkxuwawtxtwszmwtwiwdwuwtwuwXwJwswmwuwKzmwtwlwtxowrwpwtxrxl{o{o{o{o{o{o{owkwkwkwkwkwkwkwkwkwrwpwtwuwpwq"
3199 "wqwqwqwqwqwqwqwqwowtwpwuwswqwrwpwrwpwrwpwrwnwmznwswowswowswowswowswowswowswowswowkwkwkwkwkwkwkwkwkwswowswowswowswowswowswowswcwuwuwowswowswowswowswowt"
3200 "wnwswowtwTymymymymy=wmw^wuwuwmxlxmyowrwowtwnwtwmxmw bwswIwuwmwuwmwuwtwrxswdwjw]wJwkxuxmwlwlwswlwjwowswmwmwswlwSycyawlwswowrwowswpwswowkwjwrwqwrwpwkwkw"
3201 "swowkwqwqwsxowswpwjwswpwswowrwnwmxtxnwlwswpwswmwlwlwjwkwHwswowswowkwswowswowkwswowswowkwkwtwnwkwswswswswowswowswowswowkwswowkwswnxlwswpwtwmxmwjwlwiwTx"
3202 "uxpwtxowswowtwnwswowkwswnynwtwnwswowtwtwqxuwuxqwtwnwtwtwqwswowswmwlwuwnwswowkwjwswo{pwrwmwmwswnwjwiwnymwtwnycwkwuwlwl{mwmwiw_wrwdwtwVwrw*wswmwuw?wtwlw"
3203 "tzqwrwpwtzswkwswowswowswowswowswowswowswnwswpwkwkwkwkwkwkwkwkwswowsxowswowswowswowswowswowrwpwswpxtxpxtxpxtxpxtxnwmwkwswowswowswowswowswowswowswowtxow"
3204 "kwswowswowswowswowkwkwkwkwswowswowswowswowswowswowswlwnxtwowswowswowswowswnxmwswnx >wlw\\wkx`wnwrwoznwtwmxl| gybw^wtwozmwsxpzuxfxlx]wnw_wlxjyn{o{nykwnz"
3205 "mymwkynymwkwewewjwjwrwswqwp{myozn{owizpwrwpwkwkwrwp{owqwqwsxnyowiyowrwozmwlzmwlwswqxsxnwm}qwjxlwGzozmymznynwjzowswowkwkwswowkwswswswswnynzmzowjymxlznx"
3206 "lwswqwrwnwm{mwlwiwHxuxpzmxlymynwswmwnwrwozmxuxo{pwtxn{pzmykwmyo}p{owkyuynwnwrwmwly`w_w_wbwjzo{pwqwnwmwhw_z>zY}M|nwuw2wqwqwryrwqwqyowqwqwqwqwqwqwqwqwqw"
3207 "qwqwqwr{qyo{o{o{o{owkwkwkwkznwsxnymymymymycwuynznznznzmwmwkwuynznznznznznznyuzrymymymymynwkwkwkwjynwswnymymymymybzmznznznznwlzmw     hwHwlwSwTw <w8z ]"
3208 "x tx Zxjwmx RwWw/wgw pw_ynwky=wCwmwaw\\w_wnw  1wIwlz 'wiwuwaw  mw    Pw   swlwjw     hw        f| pyWx/wgw rxSw/wCwmwaw\\w_wnw  1w  AwRx  nw    Pw   txk"
3209 "wlxm";
3210
3211     // Define a 20x23 font (normal size).
3212     static const char *const data_font20x23 =
3213 "                                                9q\\q^r_rnp`qnq`plp7q\\q^q_qmqbq\\q^q_qmqHqmp_q\\q^r_rnp`qnq7q\\q^q_qmq_q \"r                               "
3214 "                        Mq^q^qnq`pnr`qnq`plp6q^q^pmp`qmqaq^q^pmp`qmqIpmq]q^q^qnq`pnr`qnq6q^q^pmp`qmq`q \"plp         'q     5qmq               Vq      "
3215 "               Xq    [plp      3qYq_p^rnpLplp8qYq_qNqYq_q4rmpaqYq_q_rmp%qYq^pGq  Irc|!pKp]raqjq`p   HtNq_qmq\\plqbp_shpdscq[q^q[p [q]s_r`uau]rbv`tcxbua"
3216 "t LsZucrav_udwcxdw`udqiqeq]q]qjreq]sksgrjqbtcv_tcvaud{eqiqgqfqgqjsjqlrjrhrirfzfs`q[sZqMqJqCqNsLq]q]q]q]q   .scq]s \\sKt%r  [s^raxdxat_qazgqlqlqctJqIqIq"
3217 "LqHsOqiqOtaqmq\\uft nufu`sLs`t\\qKv<r\\rLrepirepitgpeq]r^r^r^r^r^r^{gudxdxdxdxdq]q]q]q]wcrjqbt`t`t`t`tLtlpgqiqeqiqeqiqeqiqgrireq[s_q[q_pnp_pnr`qnq`plp7q["
3218 "q_s`qmqcq[q_s`qmq]pkpbpmr`q[q_s`pmraqmq8q[q^pnp_qnq^qaq\\qnq !pnqd{!pJp^tdunucr _y  dvOq_qmq\\plpap_pmpipdudq[p\\p_plplp _q^ubtawcw^rbvavdxcwcw Ou]yerawb"
3219 "xeyexdwbxeqiqeq]q]qkrdq]sksgrjqdxewbxewcwe{eqiqfqhqfqjsjqkqjqfqiqezfs`q[s[sMpJqCqOtLq]q]q]q]q  q 1tcq]t ^vaq_w&r  \\u_raxdxcxcuczgqlqlqexMsJqJsMq[p^uPq"
3220 "iqdq]uaqmq]qkqcq!qkqguaqmqNpkp\\p]pKtmp:p]plpKpfpfpfpcpipdq]r^r^r^r^r^r^{ixexdxdxdxdq]q]q]q]yerjqdxdxdxdxdxPwnpfqiqeqiqeqiqeqiqfqiqdq\\u_p[p^pnpKqnq_r5p"
3221 "[p^pmp`qmqbp[p^pmp`qmq]tKp[p^pmpLqmq7p[p]pnp_qnq^p`q\\qnq5uauauauaucq`qhq4p]pKr_ueunucr `q  \\rkpOq_qmq\\plpctbqmqkqerlpdq\\q\\q_qnpnq\\q%q^qkqcqnqapjrdpjr`"
3222 "sbq]rkp^qcrkrerkq Oplr`sirgtbqkrdripeqjsfq]q]ripeqiqeq]q]qlrcq]sksgskqerjrfqkrdrjrfqkrerjp`q`qiqfqhqeqkskqiqlqdqkq\\qeq]qZq\\qmqNqKqCqOqIq5q]q  q 1q`qZq"
3223 " _rlqbtaqjp$q  ^qkqatbr^q]rjrewdqhqgqlqlqfrjrOuKqKu8p_rlpOqkqcq]qFpgpcp\"pgpTpkp\\q^p\\p^qLump:p^pjpLpgpepgpbpjpPt`t`t`t`t`qnq_qnqcripeq]q]q]q]q]q]q]q]qj"
3224 "sfskqerjrfrjrfrjrfrjrfrjrRrjrfqiqeqiqeqiqeqiqeqkqcvbrlq`q]q_plp Iq]q_qmqNq]q_qmqKtIq]q_qmq ^q]q^plpKq`q mqkqcqkqcqkqcqkqcqkqdq`qhq5q^qLt`ueunudtasbqip"
3225 "`q`pipcq  [qIq_qmq`{gvcqmqkpdq_q\\q\\q]rZq%q_rkraqZq]qaqnqbq]qXqcqiqeqiq1pSpXq`qfrhqnqbqjqdq]qhqfq]q]q]qiqeq]q]qmrbq]qnqmqnqgskqeqhqfqjqdqhqfqjqeqYq`qiq"
3226 "frjreqkskqirnrdrmr]qdq]qZq]qkq)qCqOqIq5q]q  q 1q`qZq _qkq_qaq mq  ^qkqaqnqar_q]qhqfrnqnreqhqgqlqlqfqhqPwLqLw9p_q_phqdqkqcq]qGplslpiu#pmtlpUpkp\\q_q_r8u"
3227 "mp:p^pjpLpgpepgperipcq^qnq`qnq`qnq`qnq`qnq`qnq`qmqcq]q]q]q]q]q]q]q]q]qhqfskqeqhqfqhqfqhqfqhqfqhqdphpfqirfqiqeqiqeqiqeqiqermrcwcqkq    [q 3qZp Oq nqmqm"
3228 "qeqiqeqiqeqiqeqiqeq_piq4q^pLvatd|evdvcqipasaqkqdq  [qHq_qmq`{hrnpmpcqmqlpcq_q\\pZp]rZq%q_qiqaqZq]qapmqbq^qWqcqiqeqiqdq]qUsSs[qaqdqhqnqbqjqeq\\qgqgq]q^q\\"
3229 "qiqeq]q]qnraq]qnqmqnqgqnqlqfqfqgqjqeqfqgqjqeqYq`qiqeqjqdqlqmqlqhqnqbqmq]rdq]qZq^pgp=taqns`s`snqatdv_snqcqnsbq]q]qkqcq]qnsmshqns`saqnsasnqcqnr`tbvaqjqe"
3230 "qiqdqkqkqjrkreqiqdw`q`qZq#tnreqkq^qatauaqnsdqiq`raqjqdqiqdpmrcxdqmqmqatbxfyeqiqbqnq`r`q^qfqhrmqmrfqhqgqlqlqgqfqep[pnqnp[p`q`pipbpnqnpNq]taq^qnqnqbqmqb"
3231 "q\\qIqmpkpmqkqkp$qmpkpmqVqmq\\q`q[pLqjqeump:p^pjpLphpdphpapkpbq^qnq`qnq`qnq`qnq`qnq`qnq`qmqdq\\q]q]q]q]q]q]q]q]qgqgqnqlqfqfqhqfqhqfqhqfqhqfqfrjrhqiqnqgqi"
3232 "qeqiqeqiqeqiqdqmqbqkrdqmsbt`t`t`t`t`t`tlsfs_t`t`t`tbq]q]q]q[tbqns`s_s_s_s_s\\q`smpdqjqdqjqdqjqdqjqeqiqdqnscqiq;qlqlqgqgqgqnqmqnqgqjqnqgqgqfq_qjq<{fpjpL"
3233 "vatd|fxeqkqdqipasaqkqdp  \\yNqGplqeqmp`qmqmqcrLqZq`qnpnq\\q%q_qiqaqZq^rbqmqbubqms^qaqkqdqiqdq]qXuf{fu_q`qlrnqlqjqlqcqkreq\\qgqgq]q^q\\qiqeq]q]t`q]qnqmqnqg"
3234 "qnqlqfqfqgqkreqfqgqkres[q`qiqeqjqdqlqmqlqhs`s]rcq]qZq#vbwcvbwcwev`wcwcq]q]qlqbq]vnthwcwcwcwcubwcvaqjqdqkqcqkqkqiqkqdqiqdw`q`qZq7smsfxdqlr^qavdvawdqkq_"
3235 "raqjqdpgpeqntdxdqmqmqcwdyfyeqiqcqlq`raq^qfqhqlqlqfqhqgqlqlqgqfqfrZqZraqarkraqLq^vbq^wbqmqbq]tKpmpfpkpjp_plp9plpkplpUs[qaqZpLqjqeump:p^pjpaplp_piqdpiqa"
3236 "plqbq_qlqbqlqbqlqbqlqbqlqbqlqbrmqdq\\q]q]q]q]q]q]q]q]qgqgqnqlqfqfqhqfqhqfqhqfqhqfqerlrgqjqmqgqiqeqiqeqiqeqiqcsaqjqdqnq`vbvbvbvbvbvbvnuivbwcwcwcwcq]q]q]"
3237 "q]wcwcwcwcwcwcwOwcqjqdqjqdqjqdqjqeqiqdwdqiq;pkqkpgpepgpmumpgpjrmpgpepfq_qkq;{hrkpLxdxf|fxepipdqipas`pkpcp  ZqHqGplpdt_pmplpmshsMqZqaplplp]q&q^qiqaq[qa"
3238 "t`plqbvcx_q`ucrkr:uc{cucq`qlvlqjqlqcwdq\\qgqgxdvcqjtfyeq]q]s_q]qmsmqgqmqmqfqfqgwdqfqgwcv_q`qiqdqlqbqmqmqmqfr`s]qbq\\q[q#pjqcrlrdqkpcrlrcqkrdq^rlrcrlrdq]"
3239 "q]qmqaq]rlrlqirlrdqkqcrlrerlrcr_qjpbq]qjqdqkqcqlslqhqmqbqkq^q_q`qZq_tjpSqmsmpgrlsdqnsaqmqbqkqdq\\rlrdqlq_raqjqeqgqgrnqnrdqlqcqmqmqcqkqerkq`qaycqlq_rbq^"
3240 "qfqhqlqlqfqhqgqlqlqgqnvnqgrYqYrbqbrirbqLq_rnpmpdwaqmqcydq^qlqLpmpfpkpkq`plpa{RpltkpB{gpXpLqjqdtmpcqHp]plp_plp`pipjpipipmsfplpjphr_qlqbqlqbqlqbqlqbqlqb"
3241 "qlqbqlxkq\\xdxdxdxdq]q]q]q_vjqgqmqmqfqfqhqfqhqfqhqfqhqfqdrnrfqkqlqgqiqeqiqeqiqeqiqcsaqjqdqnq`pjqcpjqcpjqcpjqcpjqcpjqcpjrlrjqkpbqkrdqkrdqkrdqkrdq]q]q]q]"
3242 "qkrdrlrdqkqcqkqcqkqcqkqcqkqOqkqcqjqdqjqdqjqdqjqdqkqcrlrdqkq:pnwnpgpnwnpgplslpgpkrlpgpkqkpfq^qlq6qaqlpMzfzfzfzgqipdqipbqmp`qmqc|  fqHqHqlpcuasmplpmpiul"
3243 "qSqZq]p^{+q^qiqaq\\q`ubqlqbpkrdrkrarawcx<tEteq`qlqlqlqjqlqcwdq\\qgqgxdvcqjtfyeq]q]t`q]qmsmqgqmqmqfqfqgvcqfqgv_t`q`qiqdqlqbqmqmqmqgs_q]qaq\\q[q\"vcqjqeq]qj"
3244 "qdqiqdq^qjqcqjqdq]q]qnq`q]qkqkqiqjqeqiqdqjqeqjqcq^s^q]qjqdqkqbqmsmqgqmqbqkq_qas_qYsc{Spkqkphqkrcqntcvcqiqeq\\qjqdqmr`tbqjqeqgqgqmqmqdqlqcqmqmqdqiqfqiqa"
3245 "qaycqlq_qaq^qfqhqlqlqfqhqfqmqmqfqnvnqh}cqc}cqc}cqLq_qmpawbqkqasaq^qkqMpmpfpjsnpaplp`{RplpmqkpB{huatKqjqbrmpcqJt^r]plpctlpjqktlpmpkpltlpjqhq^qlqbqlqbql"
3246 "qbqlqbqlqcrlrcqlxkq\\xdxdxdxdq]q]q]q_vjqgqmqmqfqfqhqfqhqfqhqfqhqfqcteqlqkqgqiqeqiqeqiqeqiqbq`qkrdqmravbvbvbvbvbvbvjqkq]qiqeqiqeqiqeqiqdq]q]q]q^qiqdqjqe"
3247 "qiqeqiqeqiqeqiqeqiqd{hqkpnqdqjqdqjqdqjqdqjqdqkqcqjqdqkq:pnwnpgpnwnpgplslpgplrkpgpkqkpfq^qlq6qaqmqMzg|fxdxfqipdqipbqmqaqmqcp  \\wLqK{dt]qmqmqkrmrnrSqZqK"
3248 "{TtKq^qiqaq]r\\rdqkq\\qdqiqaqarkrcsmq<tEtfq_qlqlqlqkqjqdqjqeq\\qgqgq]q^qgqfqiqeq]q]qnraq]qmsmqgqlqnqfqfqgq^qfqgqkq]raq`qiqdqlqbqnqkqnqgt`q^raq\\q[q#wcqjqe"
3249 "q]qjqdydq^qjqcqjqdq]q]s_q]qkqkqiqjqeqiqdqjqeqjqcq]uaq]qjqcqmqaqmpmpmqfs`qmq_ras_qYscpjtRpkqkphqkrcqkreqlrcqiqcr_qjqdqmq_qnqbqjqeqlqlqgqmqmqdqlqcqmqmqd"
3250 "qiqfqiqaqaqiqdqjqaq`q^qfqhqlqlqfqhqfrnqnrfqfqh}cqc}cqc}cqLq_qmp_q^qkq`qMrlqMpmpfpWplpUqRplplqlp=q&qjq`pmp _plp]qkpnpdqhpeqkpnpiq^qjqdqjqdqjqdqjqdqjqdq"
3251 "jqdqkqdq\\q]q]q]q]q]q]q]q]qgqgqlqnqfqfqhqfqhqfqhqfqhqfqbrdqmqjqgqiqeqiqeqiqeqiqbq`wcqlrcwcwcwcwcwcwc~kq]yeyeyeydq]q]q]q^qiqdqjqeqiqeqiqeqiqeqiqeqiqd{hq"
3252 "lpmqdqjqdqjqdqjqdqjqcqmqbqjqcqmq9pkqkpgpepgpmumpgpmrjpgpepfq]pmq:{epmpLzg|evbveqipdqipbqmqaqmpbq  [qHqK{cpmq^plqmqkqktRqZqFqOtKq^qiqaq^rZqdy^qdqiqaqaq"
3253 "iq]q:uc{cudq_qlqlqmqjxdqiqfq\\qgqgq]q^qgqfqiqeq]q]qmrbq]qlqlqgqlqnqfqfqgq^qfqgqkr]qaq`qiqcqnqaqnqkqnqhrnq`q_r`q\\q[q$qjqcqjqeq]qjqdydq^qjqcqjqdq]q]s_q]q"
3254 "kqkqiqjqeqiqdqjqeqjqcqZsbq]qjqcqmqaqnqmqnqfs`qmq`r^r`qZr9pkqkphqkrcqjqeqkqcqiqet_qjqcqnq`rnqbqjqeqlqlqgqmqmqdqlqcqmqmqdqiqfqiqaqaqiqdqjqbr`q]qhqgrmqmr"
3255 "fqhqeweqfqgrYqYrdpnqnpdrirdpnqnpNq_qmp_q]qmqcyPrmqMqmpkpmqkvaplpVqRqmpkpmq=q&qjq`pmp(v_plp\\pkpmpdphqepkpmpjq]xdxdxdxdxdxdwdq\\q]q]q]q]q]q]q]q]qgqgqlqnq"
3256 "fqfqhqfqhqfqhqfqhqfqcteqnqiqgqiqeqiqeqiqeqiqbq`vbqjqeqjqdqjqdqjqdqjqdqjqdqjqdqjxkq]yeyeyeydq]q]q]q^qiqdqjqeqiqeqiqeqiqeqiqeqiqQqmplqdqjqdqjqdqjqdqjqcq"
3257 "mqbqjqcqmq9qlqlqgqgqgqnqmqnqgqnqjqgqgqfq]qnq:{eqnpLzg|dt`tdqipcpipbpkp`sbq  Zq plq`pmq_pkqmqkqjrQqZqFq'q]rkraq_rYqdy^qdqiqbq`qiq^q6uf{fuaq_qlyjzeqiqeq"
3258 "]qhqfq]q]qhqfqiqeq]q]qlrcq]qlqlqgqkseqhqfq]qhqfqjq]qaq`qiqcqnq`skshrmraq_q_q[q\\q$qjqcqjqeq]qjqdq\\q^qjqcqjqdq]q]qnq`q]qkqkqiqjqeqiqdqjqeqjqcqXqbq]qjqcq"
3259 "mqaqnqmqnqgqmq`s_q\\q`qZq7pmpnqmpgqkrcqjqeqkpbqiqeq\\qjqcs_qlqcqjqeqlqlqgqmqmqdqlqcqmqmqdqiqfqiqaq`qkqdrjrdr_q]riqfrnqnreqhqducqhqerZqZrdwdrkrdwOq_qmp_q"
3260 "^w`q`q[sKplslpTplpWqQpmpkqnp<q&qjq`pmp aplp\\pkplpephqepkplpjq^zfzfzfzfzfzfxcq]q]q]q]q]q]q]q]q]qhqfqkseqhqfqhqfqhqfqhqfqhqcrnreriqfqiqeqiqeqiqeqiqbq`q]"
3261 "qjqeqjqdqjqdqjqdqjqdqjqdqjqdqjqdq]q]q]q]q\\q]q]q]q^qiqdqjqeqiqeqiqeqiqeqiqeqiqQqnpkqdqjqdqjqdqjqdqjqbsaqjqbs7qmqmqeqiqeqiqeqiqeqiqeq]qnp7q]rJrnpnresnpn"
3262 "sct_rcqipcqkqcqkqasaq  [rkp&plpcplpnr`qkqmqkrltRqZqFq'q\\qkq`q`r_pjr^qcpjrcqkrbq`rkrdpkr3sSsLrlrnrhqhqeqjreripeqjsfq]q]riqfqiqeq]q]qkrdq]qgqgqkserjrfq]"
3263 "rjrfqjrfpiraq_qkqbt`skshqkqaq`q^q[q\\q$qkrcrlrdqkpcrlrcqipdq^rlrcqjqdq]q]qmqaq]qkqkqiqjqdqkqcrlrerlrcq^pjqbq]rlrbs_rkrfqmq`s`r\\q`qZq6qlrfrmscrlrepkqbrk"
3264 "qdqkpaqjqcs`rlqcrlrernsnrgrnqnrdqlqcrnqnrdrkqdqkraq`qkqdqhqer^q\\rkqdwdqhqbqarjrdpYqYpbubpipbuNq_rnpmpbq^qnqnq`q`qZqIpgpRplp7pgp;q&rlr`pmp bplp[pkufpiq"
3265 "dpkukrlpcqhqfqhqfqhqfqhqfqhqfqhqfqjqcripeq]q]q]q]q]q]q]q]qjsfqkserjrfrjrfrjrfrjrfrjrdrlrfrjreqkqcqkqcqkqcqkqaq`q]qnplqeqkrdqkrdqkrdqkrdqkrdqkrdqksjpjq"
3266 "kpbqipdqipdqipdqipdq]q]q]q]qkqcqjqdqkqcqkqcqkqcqkqcqkq^qbqkqcrlrdrlrdrlrdrlrbsarlrbs6qkqcqkqcqkqcqkqcqkqdq\\r7q\\qFp\\p]r^rcqipcvbqkqas`r  \\vOqIqlpcw_pip"
3267 "mpivnrRpZpEqbqIq^q[ubwdxdw]qcwbwaq_wcvbq]qRpSp[q^q^qhqexcxeyexdq\\xeqiqeq]q]qjrexdqgqgqjrdxeq\\xeqiqfx`q_war_ririqiqbqazfq[q\\q$xcwcvbwcxdq]wcqjqdq]q]qlq"
3268 "bq]qkqkqiqjqdwcwcwcq^wbu`wbs_rkrgqkq`q`w`q`qZq$yewdqmq`wdvaqjqbr`qkqcyeyewcqlsdwcxdw`sauczexdq^umteucqhqbq`xLqJsKsMq^vdxdpgpaq`qYqIqkq bqkq?{+yapmp Jp"
3269 "fpfpipcpfpiucqhqfqhqfqhqfqhqfqhqfqhqfqjxixexdxdxdxdq]q]q]q]yeqjrdxdxdxdxdxdrjrgpnwdwcwcwcwaq`q]qnuexdxdxdxdxdxdvnwjvbxdxdxdxdq]q]q]q]wcqjqdwcwcwcwcw^q"
3270 "bwbwcwcwcwaq`w`q4uauauauaucq\\r7p[qFp\\p\\p\\pbqipasapip`q^y  ctNqIqmqbu_phsgslrSq\\qEqbqIq^qZsawdxcu\\qbt^taq]uataq]q q]qgpiqfqfw`udwcxdqZudqiqeq]q]qirfxdq"
3271 "gqgqjrbtcqZtcqirfv_q]s_r_rirjrircqazfq[q\\q#tnqcqns`s`snqaucq\\snqcqjqdq]q]qkqcq]qkqkqiqjqbsaqnsasnqcq]t_t_snqaq^rkrhrkraq`w`q`qZq#smrevbs^t`s`qjqbq`qiq"
3272 "dqnrmqdrmrcubqkrcubqntat^r`sc|fxdq^umtcqaqhqbq^tJqIqIqLq]tcxLq`qYqHu `u>{+qnrmqapmp Kpepgpiuhpephscqfqhqfqhqfqhqfqhqfqhqfqhqixgudxdxdxdxdq]q]q]q]wcqjr"
3273 "bt`t`t`t`taphpgplt`s_s_s_s_q`q]qmsctnqctnqctnqctnqctnqctnqbsktgs_uauauaucq]q]q]q[saqjqbs_s_s_s_sNpms_snqbsnqbsnqbsnqaq`qns_q !p Zp      jp#q\\q6q7q   l"
3274 "q [sjq  Qq -q  OqZq]q  Cq;q HqWq $rIq`qZq _q iqbqKqFqIq`q     hp$q]u   JqYpmpLp   .p        jp    ]p Xr`q[r !p       Tp\"p\\p6q6q   mq Yx  Qr -r  Ps\\q_s"
3275 "  Ipkq:q HqWq $qHq`qZq _q iqbqKqFqIq`q     hp$q]t   IqYpmpLq   /q        kq     Fq_q[q #s       Tp\"q^q6p   1p Vu  Rs    YsJsMy &v<s HqWq &sHtcq]t _q i"
3276 "qbqKqFqIq`q     hp$q   2q2q   /q        kq     Hs_q]s \"q                (r     Xy %t;r GqWq &rFscq]s ^q iqbqKqFqIq`q         ,q4r   0r        lr     G"
3277 "r^q                               *q                                                                                   kr               i";
3278
3279     // Define a 47x53 font (extra-large size).
3280     static const char *const data_font47x53 =
3281 "                                                                                                                                                      "
3282 "        9])]2_2]T\\8^U^3]  E])]2`4^U^>])]2_4^U^ 6^T\\5])]1_2]T\\8^U^  K])]2`4^V^3]                                                                       "
3283 "                                                                                                                    U]*\\2a4`V\\8^U^5a  F]*\\1\\X\\4^U^=]*\\"
3284 "2a5^U^ 7aV\\4]*\\1a4`V\\8^U^  J]*\\1\\X\\4^V^3\\                                                                                                             "
3285 "                                                                              S],\\1\\W\\5g8^U^6c  F],\\1\\V\\5^U^<],\\2]W]6^U^ 8h3],\\0\\W\\5g8^U^  I],\\1\\V\\5^V"
3286 "^4\\      ;]                                                                                                                                           "
3287 "                                         :\\-]2\\U\\6\\V`7^U^7]U]  F\\-]2\\T\\6^U^;\\-]3]U]7^U^ 8\\Va1\\-]1\\U\\6\\V`7^U^  H\\-]2\\T\\6^V^5]      =a                  "
3288 "              J]                                                                                                                                      "
3289 "              N\\/]2\\S\\7\\T]6^U^7\\S\\  E\\/]2\\R\\7^U^:\\/]3]S]8^U^ 8\\T^/\\/]1\\S\\7\\T]6^U^  G\\/]2\\R\\7^V^6]      =c                                L^           "
3290 "                                                         *^                            U`                                         O^             )\\S\\ "
3291 "                    !^$^3\\  E]U\\  K^$^4^ G^$^4]   J^$^3\\   #^$^3\\ 4^            B[                                                                    "
3292 "&^                            Xe                                         S^             (\\S\\               )Z      Q^&^3^2]S\\ A\\S\\  K^&^3^ F^&^4_  >]S"
3293 "\\9^&^3^2]S\\   W^&^3^ 6^        Q]    M[               ?`   ![1^H]?` =]4](\\    %` >b4c  Bb ?`2a    .a   Ib   Pb      Aa <a @b      Fb =b  F^ :] '] Da A"
3294 "].].].].]            <_:]._    Xh ?c   W^       @`   La   Pa        Sa   Va5^U^ @`   \"f4_ >`0`*^   $^.` <^F]F^F]G`G]     F\\S\\ ;b        %a2a2a2a2a <bR"
3295 "\\     D`4^(^3`4`U\\8^V^6\\S\\  J^(^3`4^U^@^(^3_4^U^/^/`U\\8^(^3`4`U\\8^V^  K^(^3`4^V^1^9]+^V^      ?`    O\\  D\\6]M]            We D]1]T] 9[3bJ\\@e<])]2])\\  "
3296 "  T]0d3_7h9i/_;k5f?n:f7e    3g :_8i3h@h9n?l5iB]H]C].].]J^B].`I`H_J]<g?g1g?g4hAuB]H]G]C]F]K_K]S^J^F^G^CrBb7]*b'_ D] :] '] Fc A].].].].]            >a:]"
3297 ".a   !^T_ Bg   `       Dd2_8n?m7g3]:rD]P]P]@g <] 8] 8] B] 3e J^K^ If7^U^+b@d   Fb@f5a Ad4e-] :f  Ra0d AaF\\HaF\\HeJ\\?]._0_0_0_0_2\\U\\0tHh@n?n?n?n?].].].]"
3298 "-h:_J]<g8g8g8g8g BhV]G]H]C]H]C]H]C]H]G^G^B]*d5](]2\\X\\4aW]8^V^6\\S\\  I](]3]X]5^U^?](]3\\W\\5^U^.^R[9aW]7](]2\\X\\4aW]8^V^  J](]2\\X\\4^V^1]8]+^V^      ?a>w   "
3299 "P[ 9[/a:aQa7[    Wl      \"h E]1]T]+\\R\\;[4dL]Ag=])]2])\\    U^1f8c8k;j1`;k7h?n;h9g    5i*b:_8k6kBl=n?l7mD]H]C].].]L_A].`I`H`K]>kAj6kAj9kBuB]H]F]E]E^L_L^"
3300 "R^L^D^I^BrBb7^+b(a D] ;] '] Gd A].].].].]      ;]     (b:].b   #^Q] Dj  !a       Ff3_8n?m8i4]:rD]P]P]Bk ?_ 9] 9_ C]&[0f I]K]=]0g7^U^-fC\\S]   IfBf6c B["
3301 "S]5[S].] <i  R\\W\\1]T] B\\W\\G]H\\W\\G]H[S]K]?]._0_0_0_0_2c1uIkBn?n?n?n?].].].]-l>`K]>k<k<k<k<k EoF]H]C]H]C]H]C]H]F^I^A],h6]*]2\\V\\6]Wa7^V^6\\S\\  H]*]2\\V]6^U"
3302 "^>]*]3]W]6^U^._V_;]Wa5]*]2\\V\\6]Wa7^V^  I]*]2\\V\\5^V^2]7]+^V^      @]W\\=v   P[ 9\\1c<cSd:]   \"o      #_S^ F]1]T],]S];[5^V^N]A_T]=]*]0]*\\    U]1^T^;e8`S_<"
3303 "^R_2`;k8^R]?n<_T_;^S^    6^S_.i>_8m:`R`Cn?n?l9`QaE]H]C].].]M_@].aKaH`K]?`S`Bk8`S`Bk;_R_BuB]H]F]E]D]MaM]P]L]B^K^ArB]1]&])c D] <] '] G] :].].].].]      "
3304 ";]     (^6]*^   #]P^ E^P\\   V^       H^T^4_8n?m:`S`6]:rD]P]P]C`S` Aa :] :a D]&[1^S\\ I^M^=]0^R[7^U^/^R^EZO\\   L^R^ N]U] :],\\0] <j  M\\2]R] >\\H]B\\H]=\\M]>"
3305 "]._0_0_0_0_0_/uK`R`Cn?n?n?n?].].].]-n@`K]?`S`>`S`>`S`>`S`>`S` H`ScE]H]C]H]C]H]C]H]E^K^@],^T^5],]1\\V\\6\\U`7^V^6]U\\  F],]2\\T\\6^U^=],]2\\U\\6^U^-e9\\U`4],]1\\"
3306 "V\\6\\U`7^V^  H],]1\\V\\5^V^3]6]+^V^  B`1`1`1`1`6]W]>u   P[ 9]2e>eUf;^   %q      $^O\\ F]1]T],]S];[5]T]N\\@]P[=]*]0]2ZR\\RZ   $]2]P]<_W]8]N]<ZL^4a;]+]MZ/]<^P"
3307 "^=^Q^    7\\O]1nAa9]N_<_M]C]NaA].]+_L^E]H]C].].]N_?].aKaHaL]@^M^C]P_:^M^C]P_=^M\\6]6]H]F^G^D]MaM]P^N^B^K^-^B]1]&]*e D] =] '] H] 9].].].].]      ;]     )"
3308 "^5])^   %^O]8^3]LZ   U]       I^R^6a9_0]+^M^7]:]H]D]P]P]D^M^ Cc ;] ;c E]&[2^PZ H]M]<]1^-^U^1]L];[   N]L] Q]S] :\\,\\1] <dU\\  M\\2\\P\\ >\\H\\A\\H\\<\\M\\=]/a2a2a"
3309 "2a2a1_/]V];_M]C].].].].].].].]-]ObBaL]@^M^@^M^@^M^@^M^@^M^ J^N`D]H]C]H]C]H]C]H]E^K^@]-^Q]5].]1\\T\\7\\S]6^V^5c  E].]2]S\\7^U^<].]2\\S\\7^U^,a6\\S]2].]1\\T\\7\\S"
3310 "]6^V^  G].]1\\T\\6^V^4]5]+^V^  De6e6e6e6e9\\U\\>u   P[ :_3f@gVf<_   &r      $]M[ F]1]T],\\R]>d<^T^P]A^OZ=]+].]4]T\\T]   &^3^P^=[S]8[K].]4\\X];],]!]<]N]>^O^  "
3311 "  8ZM^3`P`Ba9]M^=^J\\C]K_B].],^H\\E]H]C].].]O_>].aKaHaL]A^K^D]N^<^K^D]N^>]JZ6]6]H]E]G]C]MaM]O^P^@^M^-^A]1]&]+_W_ D] >] '] H] 9]  B].]      ;]     )]4](]"
3312 "   %]N]:c6]   G]       J^P^7a8_1],^K^;c=]H]D]P]P]E^K^ Ee <] <e F]&[2] =^O^<]1] 0\\H\\<\\   P\\H\\ R\\Q\\+]3\\,\\2] <eU\\  M\\3]P\\ >\\I]A\\I]<\\N]=]/a2a2a2a2a2a1]U]<"
3313 "^J\\C].].].].].].].]-]K_CaL]A^K^B^K^B^K^B^K^B^K^ K]K^D]H]C]H]C]H]C]H]D^M^?]-]P]4]0]1\\R\\  Ha  C]0]2]R] E]0]2\\Q\\ 9c 9]0]1\\R\\   !]0]1\\R\\ ?]4]   Di:i:i:i:i"
3314 ";\\6]G]   P\\ :`5g@gWh>a   (_       J]KZ F]1]T],\\R\\?h>]R]P\\@]1]+].]3^V\\V^.]   T]2]N]5]8ZJ]-]6]X];]-]!^=]L]?]M]    *]5_J_Ec:]L^>]H[C]I^C].],]F[E]H]C].].]"
3315 "P_=].]X]M]X]HbM]A]I]D]M]<]I]D]M]?]%]6]H]E]G]C^NaN^N]Q^>^O^-^@]0]'],_U_  &] '] H] 9]  B].]      ;]     )]4](]   %]N]:d7]   F]       K]N]8c8^1],]I]>i@]H"
3316 "]D]P]P]E]I] Fg =] =g G]&[2] <]O];]1] 1\\F\\=\\   Q\\F\\ S\\Q\\+]3\\.]  IeU\\  M\\3\\N\\ ?\\I\\@\\I\\=]M\\<]0c4c4c4c4c3a1]U]<]H[C].].].].].].].]-]J_DbM]A]I]B]I]B]I]B]I]"
3317 "B]I] L]J_E]H]C]H]C]H]C]H]C^O^>].]N]    .]        '`X_           I]   FbWa=bWa=bWa=bWa=bWa<\\6^I^  ?Z2[ :a5gAiXh?c   *^       H] 7]1]T]-]S]Aj>]R]Q]@]1],"
3318 "],\\1^X\\X^,]   T]3]L]6]'].]7]W];]-]!]<]L]?]M^    +]6^F^F]W]:]K]?]FZC]H^D].]-]DZE]H]C].].]Q_<].]X]M]X]H]X]M]B]G]E]M^>]G]E]M^@]%]6]H]E^I^B]O^X]O]M^R^=]O^"
3319 "-^@]0]']-_S_  '] '] H] 9]  B].]      ;]     )]4](]   %]N]:e8_   H]       L]M]8]W]7^2]-]G]AmB]H]D]P]P]F]G] Hi >] >i  J[3] ;^Q^;]1] 2\\RbT\\Ge   R\\VdR\\ T\\"
3320 "Q\\+]4\\2a  IfU\\  M\\3\\N\\ ?\\J\\?\\J\\AaM\\ G]W]4]W]4]W]4]W]4]W]4c3^U]=]FZC].].].].].].].]-]H]D]X]M]B]G]D]G]D]G]D]G]D]G]A[H[B]J`E]H]C]H]C]H]C]H]B]O^>g8]N]    "
3321 "         1]T_      3[    9]   G_O^?_O^?_O^?_O^?_O^=\\5]I^  @\\3[ ;c6gAy?d7`8]L]7^7]L]>^       H] 6]1]T]-]S]B_W[U]>]R]R]?]1],],]0d*]   T]3]L]6]'].]7\\V];]"
3322 ".] ]<]L]@]K]  7Z PZ X]7^D^G]W]:]K]?]/]G]D].]-]/]H]C].].]R_;].]X^O^X]H]X^N]B]G]E]L]>]G]E]L]@]%]6]H]D]I]A]O]W]O]L^T^<^Q^-^?]0]'].^O^  Sb7]U`2b4`U]8a8])`"
3323 "7]T_  M].]%_O_@_2`0`3`/_3c9]     )]4](]   N_6]N]3^7a/c0_ <^  D[U^  Ga  N]L]9]W]6^3]-]G]B`W]W`C]H]D]P]P]F]G] I_X]X_ ?] ?_X]X_  Nb7]2ZFZ=]Q]:]0] 3[SfU[I"
3324 "g   R[UfS[ T\\Q\\+]5]2a  IfU\\  M\\3\\N\\ ?\\K]?\\K]AaN] G]W]4]W]4]W]4]W]4]W]4]W]3]T]=]/].].].].].].].]-]G]E]X^N]B]G]D]G]D]G]D]G]D]G]B]J]C]KbF]H]C]H]C]H]C]H]B"
3325 "^Q^=j;]P_9b3b3b3b3b3b3bN`Bb3a2a2a2a    V_2_2`1`1`1`1` ;aU]    :]U`   S^T]U^A^L^A^L^A^L^A^L^?]5]I]  @^5\\ <e7gAy@f;e:]L]8`8^N^?^       G] 6]1]T]-\\R\\A]U["
3326 "RZ>]R]R\\>]1],],].`(]   U^3]L]6]'].]8]V];].]!^<]L]@]K]  :] P]#^8^A]I^W^;]K]@].]G^E].].].]H]C].].]S_:].]W]O]W]H]W]N]C]E]F]L]?]E]F]L]@]%]6]H]D]J^A]O]W]O]"
3327 "L^U^:^S^-^>]0^(]/^M^  Wh:]Wd6f8dW]:e>h2dW]?]Vd<].].]O_>].]WdScK]Vd8f;]Wd7dW]?]Wa6h>h6]L]B]I]A]P`P]K^L^B^K^@l4]4](]   PdU]A]N]2^8e5g;]Vd?^J^8]6]L] E]V`"
3328 ">pA]S]S]:e6kDo>]L]:^W^6^4].]E]D_U]U_D]H]D]P]P]G]E] K_W]W_ @] @_W]W_  Qf9]3\\H\\>^S^:]0_ 6[ThT[K]Q\\   S[T\\R]S[ U]S]+]6],] ?]L]@fU\\  M\\3\\N\\ ?\\K\\>\\K\\;]O\\ G"
3329 "^W^6^W^6^W^6^W^6^W^5]W]4^T]>].].].].].].].].]-]G^F]W]N]C]E]F]E]F]E]F]E]F]E]D_L_E]K]W]F]H]C]H]C]H]C]H]A^S^<k<]Ra<h9h9h9h9h9h9hTeFf7e6e6e6e;].].].]\"^;]V"
3330 "d8f7f7f7f7f/^6eX]@]L]?]L]?]L]?]L]B^K^?]Wd>^K^  O]S]S]B]I]B]I]B]I]B]I]@]5^K^  @]4[ ;f8gAyAg<h<]L]8`7]N]>]       F] 6]1]T]-\\R\\B]T[6]R]S]>^2]-]*\\.`(]   U"
3331 "]2]L]6]'].]9]U];].]!];]L]@]K]  =` P`'^7]?\\I]U];]K]@].]F]E].].].]H]C].].]T_9].]W]O]W]H]W^O]C]E]F]L]?]E]F]L]@]%]6]H]C]K]@^P]W]P^K^V^9]S]-^=]/](]0^K^  Xi"
3332 ";]Xf9h9fX]<h?h3fX]?]Xg=].].]P_=].]XfVfL]Xg:h<]Xf9fX]?]Xb7i>h6]L]A]K]@^Q`Q^J^N^@]K]?l4]4](]   QfW^A]O^1]6f9h;]Xg@_K]7]6]L]=]G]C^Wc@pA]S]S]<h9mDo>]L]:]U"
3333 "]5^5].]E]E^S]S^E]H]D]P]P]G]E]@Z+]V]V^-Z4]5ZKZ:]V]V^  Sh9]4^J^>]S]9]._ 8[U_Q[T[L]P\\   S[T\\Q]T[ T]U]*]7]*] @]L]@fU\\  M\\3\\N\\ ?\\L]>\\L]:]Q]:]1]U]6]U]6]U]6]"
3334 "U]6]U]6^W^5]S]>].].].].].].].].]-]F]F]W^O]C]E]F]E]F]E]F]E]F]E]C_N_D]L^W]F]H]C]H]C]H]C]H]@]S];]P_=]S^8i:i:i:i:i:i:iVgIh9h9h9h9h<].].].]'d<]Xg:h9h9h9h9h"
3335 "0^8k?]L]?]L]?]L]?]L]A]K]>]Xf>]K]  O]R]R]D]G]D]VZOZV]D]KZV]D]G]A]4]K]  @]3[ <g7fAyBi>j=]L]8`7]N]?]       F^ 6]1]T]5uI]T[6]R]S\\<^3]-]*]1d*]   U]3]J]7]']"
3336 ".]9\\T];].\\Ua-^;]L]@]K^?].] Uc Pc+_8]>]J]U];]K]@].]F]E].].].]H]C].].]U_8].]W^Q^W]H]V]O]C]E]F]L]?]E]F]L]@^&]6]H]C]K]?]Q^V]Q]I^X^8^U^.^<]/](]1^I^  ]R_<aT"
3337 "_;_R\\:^Tb=_S^@h4_Ub?bT^=].].]Q_<].aT_X]T^LbT^;_T_=aT_;^Tb?aTZ8_R]>h6]L]A]K]?]Q`Q]H^P^?]K]?l4]4](]   R^U^W]@]O]0^7g;_S];bT^@`L]8_7]L]>]E]E^W]V]@pA]S]S]"
3338 "=_T_<oDo?]K^;]U]5_6].\\D]E]R]R]E]H]D]P]P]G]E]A\\+[U]U\\,\\6]6\\L\\;[U]U\\  S_W[V\\9]3^V`V^=^U^9]/a :[T]G[M\\O\\1ZQZ  M[S\\P\\S[ Ud)]8](\\ @]L]@fU\\  M\\3\\N\\9ZQZ0\\L\\="
3339 "\\L\\8\\Q\\9]1]U]6]U]6]U]6]U]6]U]6]U]5]S]>].].].].].].].].]-]F]F]V]O]C]E]F]E]F]E]F]E]F]E]B_P_C]L]V^G]H]C]H]C]H]C]H]@^U^;]N^>]T]6]R_;]R_;]R_;]R_;]R_;]R_;]R"
3340 "_X_T^K_R\\:_S^;_S^;_S^;_S^=].].