Commit 8718a1a02f0cd15cc633b4a3bc29bdb501354840

Authored by David Mayerich
1 parent 6691c66c

moved back to CImg

Showing 2 changed files with 62441 additions and 165 deletions   Show diff stats
stim/image/CImg.h 0 → 100644
Changes suppressed. Click to show
  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.1
  24 + # The CeCILL license is compatible with the GNU GPL.
  25 + # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-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 253
  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 +#include <algorithm>
  83 +
  84 +// Detect/configure OS variables.
  85 +//
  86 +// Define 'cimg_OS' to: '0' for an unknown OS (will try to minize library dependencies).
  87 +// '1' for a Unix-like OS (Linux, Solaris, BSD, MacOSX, Irix, ...).
  88 +// '2' for Microsoft Windows.
  89 +// (auto-detection is performed if 'cimg_OS' is not set by the user).
  90 +#ifndef cimg_OS
  91 +#if defined(unix) || defined(__unix) || defined(__unix__) \
  92 + || defined(linux) || defined(__linux) || defined(__linux__) \
  93 + || defined(sun) || defined(__sun) \
  94 + || defined(BSD) || defined(__OpenBSD__) || defined(__NetBSD__) \
  95 + || defined(__FreeBSD__) || defined (__DragonFly__) \
  96 + || defined(sgi) || defined(__sgi) \
  97 + || defined(__MACOSX__) || defined(__APPLE__) \
  98 + || defined(__CYGWIN__)
  99 +#define cimg_OS 1
  100 +#elif defined(_MSC_VER) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \
  101 + || defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
  102 +#define cimg_OS 2
  103 +#else
  104 +#define cimg_OS 0
  105 +#endif
  106 +#elif !(cimg_OS==0 || cimg_OS==1 || cimg_OS==2)
  107 +#error CImg Library: Invalid configuration variable 'cimg_OS'.
  108 +#error (correct values are '0 = unknown OS', '1 = Unix-like OS', '2 = Microsoft Windows').
  109 +#endif
  110 +#ifndef cimg_date
  111 +#define cimg_date __DATE__
  112 +#endif
  113 +#ifndef cimg_time
  114 +#define cimg_time __TIME__
  115 +#endif
  116 +
  117 +// Disable silly warnings on some Microsoft VC++ compilers.
  118 +#ifdef _MSC_VER
  119 +#pragma warning(push)
  120 +#pragma warning(disable:4127)
  121 +#pragma warning(disable:4244)
  122 +#pragma warning(disable:4311)
  123 +#pragma warning(disable:4312)
  124 +#pragma warning(disable:4319)
  125 +#pragma warning(disable:4512)
  126 +#pragma warning(disable:4571)
  127 +#pragma warning(disable:4640)
  128 +#pragma warning(disable:4706)
  129 +#pragma warning(disable:4710)
  130 +#pragma warning(disable:4800)
  131 +#pragma warning(disable:4804)
  132 +#pragma warning(disable:4820)
  133 +#pragma warning(disable:4996)
  134 +
  135 +#ifndef _CRT_SECURE_NO_DEPRECATE
  136 +#define _CRT_SECURE_NO_DEPRECATE 1
  137 +#endif
  138 +#ifndef _CRT_SECURE_NO_WARNINGS
  139 +#define _CRT_SECURE_NO_WARNINGS 1
  140 +#endif
  141 +#ifndef _CRT_NONSTDC_NO_DEPRECATE
  142 +#define _CRT_NONSTDC_NO_DEPRECATE 1
  143 +#endif
  144 +#endif
  145 +
  146 +// Define correct string functions for each compiler and OS.
  147 +#if cimg_OS==2 && defined(_MSC_VER)
  148 +#define cimg_sscanf std::sscanf
  149 +#define cimg_sprintf std::sprintf
  150 +#define cimg_snprintf cimg::_snprintf
  151 +#define cimg_vsnprintf cimg::_vsnprintf
  152 +#else
  153 +#include <stdio.h>
  154 +#if defined(__MACOSX__) || defined(__APPLE__)
  155 +#define cimg_sscanf cimg::_sscanf
  156 +#define cimg_sprintf cimg::_sprintf
  157 +#define cimg_snprintf cimg::_snprintf
  158 +#define cimg_vsnprintf cimg::_vsnprintf
  159 +#else
  160 +#define cimg_sscanf std::sscanf
  161 +#define cimg_sprintf std::sprintf
  162 +#define cimg_snprintf snprintf
  163 +#define cimg_vsnprintf vsnprintf
  164 +#endif
  165 +#endif
  166 +
  167 +// Include OS-specific headers.
  168 +#if cimg_OS==1
  169 +#include <sys/types.h>
  170 +#include <sys/time.h>
  171 +#include <sys/stat.h>
  172 +#include <unistd.h>
  173 +#include <dirent.h>
  174 +#include <fnmatch.h>
  175 +#elif cimg_OS==2
  176 +#ifndef NOMINMAX
  177 +#define NOMINMAX
  178 +#endif
  179 +#ifndef WIN32_LEAN_AND_MEAN
  180 +#define WIN32_LEAN_AND_MEAN
  181 +#endif
  182 +#include <windows.h>
  183 +#ifndef _WIN32_IE
  184 +#define _WIN32_IE 0x0400
  185 +#endif
  186 +#include <shlobj.h>
  187 +#include <process.h>
  188 +#include <io.h>
  189 +#endif
  190 +
  191 +// Look for C++11 features.
  192 +#ifndef cimg_use_cpp11
  193 +#if __cplusplus>201100
  194 +#define cimg_use_cpp11 1
  195 +#else
  196 +#define cimg_use_cpp11 0
  197 +#endif
  198 +#endif
  199 +#if cimg_use_cpp11==1
  200 +#include <initializer_list>
  201 +#include <utility>
  202 +#endif
  203 +
  204 +// Convenient macro to define pragma
  205 +#ifdef _MSC_VER
  206 +#define cimg_pragma(x) __pragma(x)
  207 +#else
  208 +#define cimg_pragma(x) _Pragma(#x)
  209 +#endif
  210 +
  211 +// Define own types 'cimg_long/ulong' and 'cimg_int64/uint64' to ensure portability.
  212 +// ( constrained to 'sizeof(cimg_ulong/cimg_long) = sizeof(void*)' and 'sizeof(cimg_int64/cimg_uint64)=8' ).
  213 +#if cimg_OS==2
  214 +
  215 +#define cimg_uint64 unsigned __int64
  216 +#define cimg_int64 __int64
  217 +#define cimg_ulong UINT_PTR
  218 +#define cimg_long INT_PTR
  219 +#ifdef _MSC_VER
  220 +#define cimg_fuint64 "%I64u"
  221 +#define cimg_fint64 "%I64d"
  222 +#else
  223 +#define cimg_fuint64 "%llu"
  224 +#define cimg_fint64 "%lld"
  225 +#endif
  226 +
  227 +#else
  228 +
  229 +#if UINTPTR_MAX==0xffffffff || defined(__arm__) || defined(_M_ARM) || ((ULONG_MAX)==(UINT_MAX))
  230 +#define cimg_uint64 unsigned long long
  231 +#define cimg_int64 long long
  232 +#define cimg_fuint64 "%llu"
  233 +#define cimg_fint64 "%lld"
  234 +#else
  235 +#define cimg_uint64 unsigned long
  236 +#define cimg_int64 long
  237 +#define cimg_fuint64 "%lu"
  238 +#define cimg_fint64 "%ld"
  239 +#endif
  240 +
  241 +#if defined(__arm__) || defined(_M_ARM)
  242 +#define cimg_ulong unsigned long long
  243 +#define cimg_long long long
  244 +#else
  245 +#define cimg_ulong unsigned long
  246 +#define cimg_long long
  247 +#endif
  248 +
  249 +#endif
  250 +
  251 +// Configure filename separator.
  252 +//
  253 +// Filename separator is set by default to '/', except for Windows where it is '\'.
  254 +#ifndef cimg_file_separator
  255 +#if cimg_OS==2
  256 +#define cimg_file_separator '\\'
  257 +#else
  258 +#define cimg_file_separator '/'
  259 +#endif
  260 +#endif
  261 +
  262 +// Configure verbosity of output messages.
  263 +//
  264 +// Define 'cimg_verbosity' to: '0' to hide library messages (quiet mode).
  265 +// '1' to output library messages on the console.
  266 +// '2' to output library messages on a basic dialog window (default behavior).
  267 +// '3' to do as '1' + add extra warnings (may slow down the code!).
  268 +// '4' to do as '2' + add extra warnings (may slow down the code!).
  269 +//
  270 +// Define 'cimg_strict_warnings' to replace warning messages by exception throwns.
  271 +//
  272 +// Define 'cimg_use_vt100' to allow output of color messages on VT100-compatible terminals.
  273 +#ifndef cimg_verbosity
  274 +#if cimg_OS==2
  275 +#define cimg_verbosity 2
  276 +#else
  277 +#define cimg_verbosity 1
  278 +#endif
  279 +#elif !(cimg_verbosity==0 || cimg_verbosity==1 || cimg_verbosity==2 || cimg_verbosity==3 || cimg_verbosity==4)
  280 +#error CImg Library: Configuration variable 'cimg_verbosity' is badly defined.
  281 +#error (should be { 0=quiet | 1=console | 2=dialog | 3=console+warnings | 4=dialog+warnings }).
  282 +#endif
  283 +
  284 +// Configure display framework.
  285 +//
  286 +// Define 'cimg_display' to: '0' to disable display capabilities.
  287 +// '1' to use the X-Window framework (X11).
  288 +// '2' to use the Microsoft GDI32 framework.
  289 +#ifndef cimg_display
  290 +#if cimg_OS==0
  291 +#define cimg_display 0
  292 +#elif cimg_OS==1
  293 +#define cimg_display 1
  294 +#elif cimg_OS==2
  295 +#define cimg_display 2
  296 +#endif
  297 +#elif !(cimg_display==0 || cimg_display==1 || cimg_display==2)
  298 +#error CImg Library: Configuration variable 'cimg_display' is badly defined.
  299 +#error (should be { 0=none | 1=X-Window (X11) | 2=Microsoft GDI32 }).
  300 +#endif
  301 +
  302 +// Configure the 'abort' signal handler (does nothing by default).
  303 +// A typical signal handler can be defined in your own source like this:
  304 +// #define cimg_abort_test if (is_abort) throw CImgAbortException("")
  305 +//
  306 +// where 'is_abort' is a boolean variable defined somewhere in your code and reachable in the method.
  307 +// 'cimg_abort_test2' does the same but is called more often (in inner loops).
  308 +#if defined(cimg_abort_test) && defined(cimg_use_openmp)
  309 +
  310 +// Define abort macros to be used with OpenMP.
  311 +#ifndef _cimg_abort_init_omp
  312 +#define _cimg_abort_init_omp bool _cimg_abort_go_omp = true; cimg::unused(_cimg_abort_go_omp)
  313 +#endif
  314 +#ifndef _cimg_abort_try_omp
  315 +#define _cimg_abort_try_omp if (_cimg_abort_go_omp) try
  316 +#endif
  317 +#ifndef _cimg_abort_catch_omp
  318 +#define _cimg_abort_catch_omp catch (CImgAbortException&) { cimg_pragma(omp atomic) _cimg_abort_go_omp&=false; }
  319 +#endif
  320 +#ifdef cimg_abort_test2
  321 +#ifndef _cimg_abort_try_omp2
  322 +#define _cimg_abort_try_omp2 _cimg_abort_try_omp
  323 +#endif
  324 +#ifndef _cimg_abort_catch_omp2
  325 +#define _cimg_abort_catch_omp2 _cimg_abort_catch_omp
  326 +#endif
  327 +#ifndef _cimg_abort_catch_fill_omp
  328 +#define _cimg_abort_catch_fill_omp \
  329 + catch (CImgException& e) { cimg_pragma(omp critical(abort)) CImg<charT>::string(e._message).move_to(is_error); \
  330 + cimg_pragma(omp atomic) _cimg_abort_go_omp&=false; }
  331 +#endif
  332 +#endif
  333 +#endif
  334 +
  335 +#ifndef _cimg_abort_init_omp
  336 +#define _cimg_abort_init_omp
  337 +#endif
  338 +#ifndef _cimg_abort_try_omp
  339 +#define _cimg_abort_try_omp
  340 +#endif
  341 +#ifndef _cimg_abort_catch_omp
  342 +#define _cimg_abort_catch_omp
  343 +#endif
  344 +#ifndef _cimg_abort_try_omp2
  345 +#define _cimg_abort_try_omp2
  346 +#endif
  347 +#ifndef _cimg_abort_catch_omp2
  348 +#define _cimg_abort_catch_omp2
  349 +#endif
  350 +#ifndef _cimg_abort_catch_fill_omp
  351 +#define _cimg_abort_catch_fill_omp
  352 +#endif
  353 +#ifndef cimg_abort_init
  354 +#define cimg_abort_init
  355 +#endif
  356 +#ifndef cimg_abort_test
  357 +#define cimg_abort_test
  358 +#endif
  359 +#ifndef cimg_abort_test2
  360 +#define cimg_abort_test2
  361 +#endif
  362 +
  363 +// Include display-specific headers.
  364 +#if cimg_display==1
  365 +#include <X11/Xlib.h>
  366 +#include <X11/Xutil.h>
  367 +#include <X11/keysym.h>
  368 +#include <pthread.h>
  369 +#ifdef cimg_use_xshm
  370 +#include <sys/ipc.h>
  371 +#include <sys/shm.h>
  372 +#include <X11/extensions/XShm.h>
  373 +#endif
  374 +#ifdef cimg_use_xrandr
  375 +#include <X11/extensions/Xrandr.h>
  376 +#endif
  377 +#endif
  378 +#ifndef cimg_appname
  379 +#define cimg_appname "CImg"
  380 +#endif
  381 +
  382 +// Configure OpenCV support.
  383 +// (http://opencv.willowgarage.com/wiki/)
  384 +//
  385 +// Define 'cimg_use_opencv' to enable OpenCV support.
  386 +//
  387 +// OpenCV library may be used to access images from cameras
  388 +// (see method 'CImg<T>::load_camera()').
  389 +#ifdef cimg_use_opencv
  390 +#ifdef True
  391 +#undef True
  392 +#define _cimg_redefine_True
  393 +#endif
  394 +#ifdef False
  395 +#undef False
  396 +#define _cimg_redefine_False
  397 +#endif
  398 +#ifdef Status
  399 +#undef Status
  400 +#define _cimg_redefine_Status
  401 +#endif
  402 +#include <cstddef>
  403 +#include <opencv2/opencv.hpp>
  404 +#if CV_MAJOR_VERSION >=3
  405 +#define _cimg_fourcc cv::VideoWriter::fourcc
  406 +#else
  407 +#define _cimg_fourcc CV_FOURCC
  408 +#endif
  409 +#endif
  410 +
  411 +// Configure OpenMP support.
  412 +// (http://www.openmp.org)
  413 +//
  414 +// Define 'cimg_use_openmp' to enable OpenMP support (requires OpenMP 3.0+).
  415 +//
  416 +// OpenMP directives are used in many CImg functions to get
  417 +// advantages of multi-core CPUs.
  418 +#ifdef cimg_use_openmp
  419 +#include <omp.h>
  420 +#define cimg_pragma_openmp(p) cimg_pragma(omp p)
  421 +#else
  422 +#define cimg_pragma_openmp(p)
  423 +#endif
  424 +
  425 +// Configure LibPNG support.
  426 +// (http://www.libpng.org)
  427 +//
  428 +// Define 'cimg_use_png' to enable LibPNG support.
  429 +//
  430 +// PNG library may be used to get a native support of '.png' files.
  431 +// (see methods 'CImg<T>::{load,save}_png()'.
  432 +#ifdef cimg_use_png
  433 +extern "C" {
  434 +#include "png.h"
  435 +}
  436 +#endif
  437 +
  438 +// Configure LibJPEG support.
  439 +// (http://en.wikipedia.org/wiki/Libjpeg)
  440 +//
  441 +// Define 'cimg_use_jpeg' to enable LibJPEG support.
  442 +//
  443 +// JPEG library may be used to get a native support of '.jpg' files.
  444 +// (see methods 'CImg<T>::{load,save}_jpeg()').
  445 +#ifdef cimg_use_jpeg
  446 +extern "C" {
  447 +#include "jpeglib.h"
  448 +#include "setjmp.h"
  449 +}
  450 +#endif
  451 +
  452 +// Configure LibTIFF support.
  453 +// (http://www.libtiff.org)
  454 +//
  455 +// Define 'cimg_use_tiff' to enable LibTIFF support.
  456 +//
  457 +// TIFF library may be used to get a native support of '.tif' files.
  458 +// (see methods 'CImg[List]<T>::{load,save}_tiff()').
  459 +#ifdef cimg_use_tiff
  460 +extern "C" {
  461 +#define uint64 uint64_hack_
  462 +#define int64 int64_hack_
  463 +#include "tiffio.h"
  464 +#undef uint64
  465 +#undef int64
  466 +}
  467 +#endif
  468 +
  469 +// Configure LibMINC2 support.
  470 +// (http://en.wikibooks.org/wiki/MINC/Reference/MINC2.0_File_Format_Reference)
  471 +//
  472 +// Define 'cimg_use_minc2' to enable LibMINC2 support.
  473 +//
  474 +// MINC2 library may be used to get a native support of '.mnc' files.
  475 +// (see methods 'CImg<T>::{load,save}_minc2()').
  476 +#ifdef cimg_use_minc2
  477 +#include "minc_io_simple_volume.h"
  478 +#include "minc_1_simple.h"
  479 +#include "minc_1_simple_rw.h"
  480 +#endif
  481 +
  482 +// Configure Zlib support.
  483 +// (http://www.zlib.net)
  484 +//
  485 +// Define 'cimg_use_zlib' to enable Zlib support.
  486 +//
  487 +// Zlib library may be used to allow compressed data in '.cimgz' files
  488 +// (see methods 'CImg[List]<T>::{load,save}_cimg()').
  489 +#ifdef cimg_use_zlib
  490 +extern "C" {
  491 +#include "zlib.h"
  492 +}
  493 +#endif
  494 +
  495 +// Configure libcurl support.
  496 +// (http://curl.haxx.se/libcurl/)
  497 +//
  498 +// Define 'cimg_use_curl' to enable libcurl support.
  499 +//
  500 +// Libcurl may be used to get a native support of file downloading from the network.
  501 +// (see method 'cimg::load_network()'.)
  502 +#ifdef cimg_use_curl
  503 +#include "curl/curl.h"
  504 +#endif
  505 +
  506 +// Configure Magick++ support.
  507 +// (http://www.imagemagick.org/Magick++)
  508 +//
  509 +// Define 'cimg_use_magick' to enable Magick++ support.
  510 +//
  511 +// Magick++ library may be used to get a native support of various image file formats.
  512 +// (see methods 'CImg<T>::{load,save}()').
  513 +#ifdef cimg_use_magick
  514 +#include "Magick++.h"
  515 +#endif
  516 +
  517 +// Configure FFTW3 support.
  518 +// (http://www.fftw.org)
  519 +//
  520 +// Define 'cimg_use_fftw3' to enable libFFTW3 support.
  521 +//
  522 +// FFTW3 library may be used to efficiently compute the Fast Fourier Transform
  523 +// of image data, without restriction on the image size.
  524 +// (see method 'CImg[List]<T>::FFT()').
  525 +#ifdef cimg_use_fftw3
  526 +extern "C" {
  527 +#include "fftw3.h"
  528 +}
  529 +#endif
  530 +
  531 +// Configure LibBoard support.
  532 +// (http://libboard.sourceforge.net/)
  533 +//
  534 +// Define 'cimg_use_board' to enable Board support.
  535 +//
  536 +// Board library may be used to draw 3D objects in vector-graphics canvas
  537 +// that can be saved as '.ps' or '.svg' files afterwards.
  538 +// (see method 'CImg<T>::draw_object3d()').
  539 +#ifdef cimg_use_board
  540 +#include "Board.h"
  541 +#endif
  542 +
  543 +// Configure OpenEXR support.
  544 +// (http://www.openexr.com/)
  545 +//
  546 +// Define 'cimg_use_openexr' to enable OpenEXR support.
  547 +//
  548 +// OpenEXR library may be used to get a native support of '.exr' files.
  549 +// (see methods 'CImg<T>::{load,save}_exr()').
  550 +#ifdef cimg_use_openexr
  551 +#include "ImfRgbaFile.h"
  552 +#include "ImfInputFile.h"
  553 +#include "ImfChannelList.h"
  554 +#include "ImfMatrixAttribute.h"
  555 +#include "ImfArray.h"
  556 +#endif
  557 +
  558 +// Configure TinyEXR support.
  559 +// (https://github.com/syoyo/tinyexr)
  560 +//
  561 +// Define 'cimg_use_tinyexr' to enable TinyEXR support.
  562 +//
  563 +// TinyEXR is a small, single header-only library to load and save OpenEXR(.exr) images.
  564 +#ifdef cimg_use_tinyexr
  565 +#ifndef TINYEXR_IMPLEMENTATION
  566 +#define TINYEXR_IMPLEMENTATION
  567 +#endif
  568 +#include "tinyexr.h"
  569 +#endif
  570 +
  571 +// Lapack configuration.
  572 +// (http://www.netlib.org/lapack)
  573 +//
  574 +// Define 'cimg_use_lapack' to enable LAPACK support.
  575 +//
  576 +// Lapack library may be used in several CImg methods to speed up
  577 +// matrix computations (eigenvalues, inverse, ...).
  578 +#ifdef cimg_use_lapack
  579 +extern "C" {
  580 + extern void sgetrf_(int*, int*, float*, int*, int*, int*);
  581 + extern void sgetri_(int*, float*, int*, int*, float*, int*, int*);
  582 + extern void sgetrs_(char*, int*, int*, float*, int*, int*, float*, int*, int*);
  583 + extern void sgesvd_(char*, char*, int*, int*, float*, int*, float*, float*, int*, float*, int*, float*, int*, int*);
  584 + extern void ssyev_(char*, char*, int*, float*, int*, float*, float*, int*, int*);
  585 + extern void dgetrf_(int*, int*, double*, int*, int*, int*);
  586 + extern void dgetri_(int*, double*, int*, int*, double*, int*, int*);
  587 + extern void dgetrs_(char*, int*, int*, double*, int*, int*, double*, int*, int*);
  588 + extern void dgesvd_(char*, char*, int*, int*, double*, int*, double*, double*,
  589 + int*, double*, int*, double*, int*, int*);
  590 + extern void dsyev_(char*, char*, int*, double*, int*, double*, double*, int*, int*);
  591 + extern void dgels_(char*, int*,int*,int*,double*,int*,double*,int*,double*,int*,int*);
  592 + extern void sgels_(char*, int*,int*,int*,float*,int*,float*,int*,float*,int*,int*);
  593 +}
  594 +#endif
  595 +
  596 +// Check if min/max/PI macros are defined.
  597 +//
  598 +// CImg does not compile if macros 'min', 'max' or 'PI' are defined,
  599 +// because it redefines functions min(), max() and const variable PI in the cimg:: namespace.
  600 +// so it '#undef' these macros if necessary, and restore them to reasonable
  601 +// values at the end of this file.
  602 +#ifdef min
  603 +#undef min
  604 +#define _cimg_redefine_min
  605 +#endif
  606 +#ifdef max
  607 +#undef max
  608 +#define _cimg_redefine_max
  609 +#endif
  610 +#ifdef PI
  611 +#undef PI
  612 +#define _cimg_redefine_PI
  613 +#endif
  614 +
  615 +// Define 'cimg_library' namespace suffix.
  616 +//
  617 +// You may want to add a suffix to the 'cimg_library' namespace, for instance if you need to work
  618 +// with several versions of the library at the same time.
  619 +#ifdef cimg_namespace_suffix
  620 +#define __cimg_library_suffixed(s) cimg_library_##s
  621 +#define _cimg_library_suffixed(s) __cimg_library_suffixed(s)
  622 +#define cimg_library_suffixed _cimg_library_suffixed(cimg_namespace_suffix)
  623 +#else
  624 +#define cimg_library_suffixed cimg_library
  625 +#endif
  626 +
  627 +/*------------------------------------------------------------------------------
  628 + #
  629 + # Define user-friendly macros.
  630 + #
  631 + # These CImg macros are prefixed by 'cimg_' and can be used safely in your own
  632 + # code. They are useful to parse command line options, or to write image loops.
  633 + #
  634 + ------------------------------------------------------------------------------*/
  635 +
  636 +// Macros to define program usage, and retrieve command line arguments.
  637 +#define cimg_usage(usage) cimg_library_suffixed::cimg::option((char*)0,argc,argv,(char*)0,usage,false)
  638 +#define cimg_help(str) cimg_library_suffixed::cimg::option((char*)0,argc,argv,str,(char*)0)
  639 +#define cimg_option(name,defaut,usage) cimg_library_suffixed::cimg::option(name,argc,argv,defaut,usage)
  640 +
  641 +// Macros to define and manipulate local neighborhoods.
  642 +#define CImg_2x2(I,T) T I[4]; \
  643 + T& I##cc = I[0]; T& I##nc = I[1]; \
  644 + T& I##cn = I[2]; T& I##nn = I[3]; \
  645 + I##cc = I##nc = \
  646 + I##cn = I##nn = 0
  647 +
  648 +#define CImg_3x3(I,T) T I[9]; \
  649 + T& I##pp = I[0]; T& I##cp = I[1]; T& I##np = I[2]; \
  650 + T& I##pc = I[3]; T& I##cc = I[4]; T& I##nc = I[5]; \
  651 + T& I##pn = I[6]; T& I##cn = I[7]; T& I##nn = I[8]; \
  652 + I##pp = I##cp = I##np = \
  653 + I##pc = I##cc = I##nc = \
  654 + I##pn = I##cn = I##nn = 0
  655 +
  656 +#define CImg_4x4(I,T) T I[16]; \
  657 + T& I##pp = I[0]; T& I##cp = I[1]; T& I##np = I[2]; T& I##ap = I[3]; \
  658 + T& I##pc = I[4]; T& I##cc = I[5]; T& I##nc = I[6]; T& I##ac = I[7]; \
  659 + T& I##pn = I[8]; T& I##cn = I[9]; T& I##nn = I[10]; T& I##an = I[11]; \
  660 + T& I##pa = I[12]; T& I##ca = I[13]; T& I##na = I[14]; T& I##aa = I[15]; \
  661 + I##pp = I##cp = I##np = I##ap = \
  662 + I##pc = I##cc = I##nc = I##ac = \
  663 + I##pn = I##cn = I##nn = I##an = \
  664 + I##pa = I##ca = I##na = I##aa = 0
  665 +
  666 +#define CImg_5x5(I,T) T I[25]; \
  667 + 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]; \
  668 + 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]; \
  669 + 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]; \
  670 + 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]; \
  671 + 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]; \
  672 + I##bb = I##pb = I##cb = I##nb = I##ab = \
  673 + I##bp = I##pp = I##cp = I##np = I##ap = \
  674 + I##bc = I##pc = I##cc = I##nc = I##ac = \
  675 + I##bn = I##pn = I##cn = I##nn = I##an = \
  676 + I##ba = I##pa = I##ca = I##na = I##aa = 0
  677 +
  678 +#define CImg_2x2x2(I,T) T I[8]; \
  679 + T& I##ccc = I[0]; T& I##ncc = I[1]; \
  680 + T& I##cnc = I[2]; T& I##nnc = I[3]; \
  681 + T& I##ccn = I[4]; T& I##ncn = I[5]; \
  682 + T& I##cnn = I[6]; T& I##nnn = I[7]; \
  683 + I##ccc = I##ncc = \
  684 + I##cnc = I##nnc = \
  685 + I##ccn = I##ncn = \
  686 + I##cnn = I##nnn = 0
  687 +
  688 +#define CImg_3x3x3(I,T) T I[27]; \
  689 + T& I##ppp = I[0]; T& I##cpp = I[1]; T& I##npp = I[2]; \
  690 + T& I##pcp = I[3]; T& I##ccp = I[4]; T& I##ncp = I[5]; \
  691 + T& I##pnp = I[6]; T& I##cnp = I[7]; T& I##nnp = I[8]; \
  692 + T& I##ppc = I[9]; T& I##cpc = I[10]; T& I##npc = I[11]; \
  693 + T& I##pcc = I[12]; T& I##ccc = I[13]; T& I##ncc = I[14]; \
  694 + T& I##pnc = I[15]; T& I##cnc = I[16]; T& I##nnc = I[17]; \
  695 + T& I##ppn = I[18]; T& I##cpn = I[19]; T& I##npn = I[20]; \
  696 + T& I##pcn = I[21]; T& I##ccn = I[22]; T& I##ncn = I[23]; \
  697 + T& I##pnn = I[24]; T& I##cnn = I[25]; T& I##nnn = I[26]; \
  698 + I##ppp = I##cpp = I##npp = \
  699 + I##pcp = I##ccp = I##ncp = \
  700 + I##pnp = I##cnp = I##nnp = \
  701 + I##ppc = I##cpc = I##npc = \
  702 + I##pcc = I##ccc = I##ncc = \
  703 + I##pnc = I##cnc = I##nnc = \
  704 + I##ppn = I##cpn = I##npn = \
  705 + I##pcn = I##ccn = I##ncn = \
  706 + I##pnn = I##cnn = I##nnn = 0
  707 +
  708 +#define cimg_get2x2(img,x,y,z,c,I,T) \
  709 + 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), \
  710 + I[3] = (T)(img)(_n1##x,_n1##y,z,c)
  711 +
  712 +#define cimg_get3x3(img,x,y,z,c,I,T) \
  713 + 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), \
  714 + 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), \
  715 + 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)
  716 +
  717 +#define cimg_get4x4(img,x,y,z,c,I,T) \
  718 + 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), \
  719 + 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), \
  720 + 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), \
  721 + 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), \
  722 + 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), \
  723 + I[15] = (T)(img)(_n2##x,_n2##y,z,c)
  724 +
  725 +#define cimg_get5x5(img,x,y,z,c,I,T) \
  726 + 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), \
  727 + 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), \
  728 + 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), \
  729 + 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), \
  730 + 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), \
  731 + 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), \
  732 + 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), \
  733 + 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), \
  734 + I[24] = (T)(img)(_n2##x,_n2##y,z,c)
  735 +
  736 +#define cimg_get6x6(img,x,y,z,c,I,T) \
  737 + 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), \
  738 + 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), \
  739 + 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), \
  740 + 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), \
  741 + 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), \
  742 + 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), \
  743 + 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), \
  744 + 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), \
  745 + 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), \
  746 + 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), \
  747 + 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), \
  748 + 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)
  749 +
  750 +#define cimg_get7x7(img,x,y,z,c,I,T) \
  751 + 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), \
  752 + 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), \
  753 + 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), \
  754 + 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), \
  755 + 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), \
  756 + 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), \
  757 + 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), \
  758 + 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), \
  759 + 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), \
  760 + 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), \
  761 + 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), \
  762 + 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), \
  763 + 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), \
  764 + 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), \
  765 + 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), \
  766 + 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), \
  767 + I[48] = (T)(img)(_n3##x,_n3##y,z,c)
  768 +
  769 +#define cimg_get8x8(img,x,y,z,c,I,T) \
  770 + 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), \
  771 + 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), \
  772 + 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), \
  773 + 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), \
  774 + 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), \
  775 + 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), \
  776 + 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), \
  777 + 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), \
  778 + 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), \
  779 + 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), \
  780 + 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), \
  781 + 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), \
  782 + 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), \
  783 + 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), \
  784 + 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), \
  785 + 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), \
  786 + 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), \
  787 + 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), \
  788 + 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), \
  789 + 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), \
  790 + 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), \
  791 + I[63] = (T)(img)(_n4##x,_n4##y,z,c);
  792 +
  793 +#define cimg_get9x9(img,x,y,z,c,I,T) \
  794 + 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), \
  795 + 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), \
  796 + 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), \
  797 + 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), \
  798 + 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), \
  799 + 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), \
  800 + 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), \
  801 + 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), \
  802 + 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), \
  803 + 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), \
  804 + 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), \
  805 + 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), \
  806 + 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), \
  807 + 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), \
  808 + 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), \
  809 + 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), \
  810 + 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), \
  811 + 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), \
  812 + 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), \
  813 + 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), \
  814 + 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), \
  815 + 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), \
  816 + 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), \
  817 + 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), \
  818 + 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), \
  819 + 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), \
  820 + 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)
  821 +
  822 +#define cimg_get2x2x2(img,x,y,z,c,I,T) \
  823 + 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), \
  824 + 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), \
  825 + I[6] = (T)(img)(x,_n1##y,_n1##z,c), I[7] = (T)(img)(_n1##x,_n1##y,_n1##z,c)
  826 +
  827 +#define cimg_get3x3x3(img,x,y,z,c,I,T) \
  828 + I[0] = (T)(img)(_p1##x,_p1##y,_p1##z,c), I[1] = (T)(img)(x,_p1##y,_p1##z,c), \
  829 + 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), \
  830 + 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), \
  831 + 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), \
  832 + 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), \
  833 + 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), \
  834 + 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), \
  835 + 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), \
  836 + 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), \
  837 + I[26] = (T)(img)(_n1##x,_n1##y,_n1##z,c)
  838 +
  839 +// Macros to perform various image loops.
  840 +//
  841 +// These macros are simpler to use than loops with C++ iterators.
  842 +#define cimg_for(img,ptrs,T_ptrs) \
  843 + for (T_ptrs *ptrs = (img)._data, *_max##ptrs = (img)._data + (img).size(); ptrs<_max##ptrs; ++ptrs)
  844 +#define cimg_rof(img,ptrs,T_ptrs) for (T_ptrs *ptrs = (img)._data + (img).size() - 1; ptrs>=(img)._data; --ptrs)
  845 +#define cimg_foroff(img,off) for (cimg_ulong off = 0, _max##off = (img).size(); off<_max##off; ++off)
  846 +#define cimg_rofoff(img,off) for (cimg_long off = (cimg_long)((img).size() - 1); off>=0; --off)
  847 +
  848 +#define cimg_for1(bound,i) for (int i = 0; i<(int)(bound); ++i)
  849 +#define cimg_forX(img,x) cimg_for1((img)._width,x)
  850 +#define cimg_forY(img,y) cimg_for1((img)._height,y)
  851 +#define cimg_forZ(img,z) cimg_for1((img)._depth,z)
  852 +#define cimg_forC(img,c) cimg_for1((img)._spectrum,c)
  853 +#define cimg_forXY(img,x,y) cimg_forY(img,y) cimg_forX(img,x)
  854 +#define cimg_forXZ(img,x,z) cimg_forZ(img,z) cimg_forX(img,x)
  855 +#define cimg_forYZ(img,y,z) cimg_forZ(img,z) cimg_forY(img,y)
  856 +#define cimg_forXC(img,x,c) cimg_forC(img,c) cimg_forX(img,x)
  857 +#define cimg_forYC(img,y,c) cimg_forC(img,c) cimg_forY(img,y)
  858 +#define cimg_forZC(img,z,c) cimg_forC(img,c) cimg_forZ(img,z)
  859 +#define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y)
  860 +#define cimg_forXYC(img,x,y,c) cimg_forC(img,c) cimg_forXY(img,x,y)
  861 +#define cimg_forXZC(img,x,z,c) cimg_forC(img,c) cimg_forXZ(img,x,z)
  862 +#define cimg_forYZC(img,y,z,c) cimg_forC(img,c) cimg_forYZ(img,y,z)
  863 +#define cimg_forXYZC(img,x,y,z,c) cimg_forC(img,c) cimg_forXYZ(img,x,y,z)
  864 +
  865 +#define cimg_rof1(bound,i) for (int i = (int)(bound) - 1; i>=0; --i)
  866 +#define cimg_rofX(img,x) cimg_rof1((img)._width,x)
  867 +#define cimg_rofY(img,y) cimg_rof1((img)._height,y)
  868 +#define cimg_rofZ(img,z) cimg_rof1((img)._depth,z)
  869 +#define cimg_rofC(img,c) cimg_rof1((img)._spectrum,c)
  870 +#define cimg_rofXY(img,x,y) cimg_rofY(img,y) cimg_rofX(img,x)
  871 +#define cimg_rofXZ(img,x,z) cimg_rofZ(img,z) cimg_rofX(img,x)
  872 +#define cimg_rofYZ(img,y,z) cimg_rofZ(img,z) cimg_rofY(img,y)
  873 +#define cimg_rofXC(img,x,c) cimg_rofC(img,c) cimg_rofX(img,x)
  874 +#define cimg_rofYC(img,y,c) cimg_rofC(img,c) cimg_rofY(img,y)
  875 +#define cimg_rofZC(img,z,c) cimg_rofC(img,c) cimg_rofZ(img,z)
  876 +#define cimg_rofXYZ(img,x,y,z) cimg_rofZ(img,z) cimg_rofXY(img,x,y)
  877 +#define cimg_rofXYC(img,x,y,c) cimg_rofC(img,c) cimg_rofXY(img,x,y)
  878 +#define cimg_rofXZC(img,x,z,c) cimg_rofC(img,c) cimg_rofXZ(img,x,z)
  879 +#define cimg_rofYZC(img,y,z,c) cimg_rofC(img,c) cimg_rofYZ(img,y,z)
  880 +#define cimg_rofXYZC(img,x,y,z,c) cimg_rofC(img,c) cimg_rofXYZ(img,x,y,z)
  881 +
  882 +#define cimg_for_in1(bound,i0,i1,i) \
  883 + for (int i = (int)(i0)<0?0:(int)(i0), _max##i = (int)(i1)<(int)(bound)?(int)(i1):(int)(bound) - 1; i<=_max##i; ++i)
  884 +#define cimg_for_inX(img,x0,x1,x) cimg_for_in1((img)._width,x0,x1,x)
  885 +#define cimg_for_inY(img,y0,y1,y) cimg_for_in1((img)._height,y0,y1,y)
  886 +#define cimg_for_inZ(img,z0,z1,z) cimg_for_in1((img)._depth,z0,z1,z)
  887 +#define cimg_for_inC(img,c0,c1,c) cimg_for_in1((img)._spectrum,c0,c1,c)
  888 +#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)
  889 +#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)
  890 +#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)
  891 +#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)
  892 +#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)
  893 +#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)
  894 +#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)
  895 +#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)
  896 +#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)
  897 +#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)
  898 +#define cimg_for_inXYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  899 + cimg_for_inC(img,c0,c1,c) cimg_for_inXYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  900 +#define cimg_for_insideX(img,x,n) cimg_for_inX(img,n,(img)._width - 1 - (n),x)
  901 +#define cimg_for_insideY(img,y,n) cimg_for_inY(img,n,(img)._height - 1 - (n),y)
  902 +#define cimg_for_insideZ(img,z,n) cimg_for_inZ(img,n,(img)._depth - 1 - (n),z)
  903 +#define cimg_for_insideC(img,c,n) cimg_for_inC(img,n,(img)._spectrum - 1 - (n),c)
  904 +#define cimg_for_insideXY(img,x,y,n) cimg_for_inXY(img,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),x,y)
  905 +#define cimg_for_insideXYZ(img,x,y,z,n) \
  906 + cimg_for_inXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
  907 +#define cimg_for_insideXYZC(img,x,y,z,c,n) \
  908 + cimg_for_inXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
  909 +
  910 +#define cimg_for_out1(boundi,i0,i1,i) \
  911 + for (int i = (int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); ++i, i = i==(int)(i0)?(int)(i1) + 1:i)
  912 +#define cimg_for_out2(boundi,boundj,i0,j0,i1,j1,i,j) \
  913 + for (int j = 0; j<(int)(boundj); ++j) \
  914 + for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j?0:(int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); \
  915 + ++i, i = _n1j?i:(i==(int)(i0)?(int)(i1) + 1:i))
  916 +#define cimg_for_out3(boundi,boundj,boundk,i0,j0,k0,i1,j1,k1,i,j,k) \
  917 + for (int k = 0; k<(int)(boundk); ++k) \
  918 + for (int _n1k = (int)(k<(int)(k0) || k>(int)(k1)), j = 0; j<(int)(boundj); ++j) \
  919 + for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j || _n1k?0:(int)(i0)>0?0:(int)(i1) + 1; i<(int)(boundi); \
  920 + ++i, i = _n1j || _n1k?i:(i==(int)(i0)?(int)(i1) + 1:i))
  921 +#define cimg_for_out4(boundi,boundj,boundk,boundl,i0,j0,k0,l0,i1,j1,k1,l1,i,j,k,l) \
  922 + for (int l = 0; l<(int)(boundl); ++l) \
  923 + for (int _n1l = (int)(l<(int)(l0) || l>(int)(l1)), k = 0; k<(int)(boundk); ++k) \
  924 + for (int _n1k = (int)(k<(int)(k0) || k>(int)(k1)), j = 0; j<(int)(boundj); ++j) \
  925 + for (int _n1j = (int)(j<(int)(j0) || j>(int)(j1)), i = _n1j || _n1k || _n1l?0:(int)(i0)>0?0:(int)(i1) + 1; \
  926 + i<(int)(boundi); ++i, i = _n1j || _n1k || _n1l?i:(i==(int)(i0)?(int)(i1) + 1:i))
  927 +#define cimg_for_outX(img,x0,x1,x) cimg_for_out1((img)._width,x0,x1,x)
  928 +#define cimg_for_outY(img,y0,y1,y) cimg_for_out1((img)._height,y0,y1,y)
  929 +#define cimg_for_outZ(img,z0,z1,z) cimg_for_out1((img)._depth,z0,z1,z)
  930 +#define cimg_for_outC(img,c0,c1,c) cimg_for_out1((img)._spectrum,c0,c1,c)
  931 +#define cimg_for_outXY(img,x0,y0,x1,y1,x,y) cimg_for_out2((img)._width,(img)._height,x0,y0,x1,y1,x,y)
  932 +#define cimg_for_outXZ(img,x0,z0,x1,z1,x,z) cimg_for_out2((img)._width,(img)._depth,x0,z0,x1,z1,x,z)
  933 +#define cimg_for_outXC(img,x0,c0,x1,c1,x,c) cimg_for_out2((img)._width,(img)._spectrum,x0,c0,x1,c1,x,c)
  934 +#define cimg_for_outYZ(img,y0,z0,y1,z1,y,z) cimg_for_out2((img)._height,(img)._depth,y0,z0,y1,z1,y,z)
  935 +#define cimg_for_outYC(img,y0,c0,y1,c1,y,c) cimg_for_out2((img)._height,(img)._spectrum,y0,c0,y1,c1,y,c)
  936 +#define cimg_for_outZC(img,z0,c0,z1,c1,z,c) cimg_for_out2((img)._depth,(img)._spectrum,z0,c0,z1,c1,z,c)
  937 +#define cimg_for_outXYZ(img,x0,y0,z0,x1,y1,z1,x,y,z) \
  938 + cimg_for_out3((img)._width,(img)._height,(img)._depth,x0,y0,z0,x1,y1,z1,x,y,z)
  939 +#define cimg_for_outXYC(img,x0,y0,c0,x1,y1,c1,x,y,c) \
  940 + cimg_for_out3((img)._width,(img)._height,(img)._spectrum,x0,y0,c0,x1,y1,c1,x,y,c)
  941 +#define cimg_for_outXZC(img,x0,z0,c0,x1,z1,c1,x,z,c) \
  942 + cimg_for_out3((img)._width,(img)._depth,(img)._spectrum,x0,z0,c0,x1,z1,c1,x,z,c)
  943 +#define cimg_for_outYZC(img,y0,z0,c0,y1,z1,c1,y,z,c) \
  944 + cimg_for_out3((img)._height,(img)._depth,(img)._spectrum,y0,z0,c0,y1,z1,c1,y,z,c)
  945 +#define cimg_for_outXYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  946 + cimg_for_out4((img)._width,(img)._height,(img)._depth,(img)._spectrum,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c)
  947 +#define cimg_for_borderX(img,x,n) cimg_for_outX(img,n,(img)._width - 1 - (n),x)
  948 +#define cimg_for_borderY(img,y,n) cimg_for_outY(img,n,(img)._height - 1 - (n),y)
  949 +#define cimg_for_borderZ(img,z,n) cimg_for_outZ(img,n,(img)._depth - 1 - (n),z)
  950 +#define cimg_for_borderC(img,c,n) cimg_for_outC(img,n,(img)._spectrum - 1 - (n),c)
  951 +#define cimg_for_borderXY(img,x,y,n) cimg_for_outXY(img,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),x,y)
  952 +#define cimg_for_borderXYZ(img,x,y,z,n) \
  953 + cimg_for_outXYZ(img,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n),(img)._depth - 1 - (n),x,y,z)
  954 +#define cimg_for_borderXYZC(img,x,y,z,c,n) \
  955 + cimg_for_outXYZC(img,n,n,n,n,(img)._width - 1 - (n),(img)._height - 1 - (n), \
  956 + (img)._depth - 1 - (n),(img)._spectrum - 1 - (n),x,y,z,c)
  957 +
  958 +#define cimg_for_spiralXY(img,x,y) \
  959 + for (int x = 0, y = 0, _n1##x = 1, _n1##y = (img).width()*(img).height(); _n1##y; \
  960 + --_n1##y, _n1##x+=(_n1##x>>2) - ((!(_n1##x&3)?--y:((_n1##x&3)==1?(img)._width - 1 - ++x:\
  961 + ((_n1##x&3)==2?(img)._height - 1 - ++y:--x))))?0:1)
  962 +
  963 +#define cimg_for_lineXY(x,y,x0,y0,x1,y1) \
  964 + for (int x = (int)(x0), y = (int)(y0), _sx = 1, _sy = 1, _steep = 0, \
  965 + _dx=(x1)>(x0)?(int)(x1) - (int)(x0):(_sx=-1,(int)(x0) - (int)(x1)), \
  966 + _dy=(y1)>(y0)?(int)(y1) - (int)(y0):(_sy=-1,(int)(y0) - (int)(y1)), \
  967 + _counter = _dx, \
  968 + _err = _dx>_dy?(_dy>>1):((_steep=1),(_counter=_dy),(_dx>>1)); \
  969 + _counter>=0; \
  970 + --_counter, x+=_steep? \
  971 + (y+=_sy,(_err-=_dx)<0?_err+=_dy,_sx:0): \
  972 + (y+=(_err-=_dy)<0?_err+=_dx,_sy:0,_sx))
  973 +
  974 +#define cimg_for2(bound,i) \
  975 + for (int i = 0, _n1##i = 1>=(bound)?(int)(bound) - 1:1; \
  976 + _n1##i<(int)(bound) || i==--_n1##i; \
  977 + ++i, ++_n1##i)
  978 +#define cimg_for2X(img,x) cimg_for2((img)._width,x)
  979 +#define cimg_for2Y(img,y) cimg_for2((img)._height,y)
  980 +#define cimg_for2Z(img,z) cimg_for2((img)._depth,z)
  981 +#define cimg_for2C(img,c) cimg_for2((img)._spectrum,c)
  982 +#define cimg_for2XY(img,x,y) cimg_for2Y(img,y) cimg_for2X(img,x)
  983 +#define cimg_for2XZ(img,x,z) cimg_for2Z(img,z) cimg_for2X(img,x)
  984 +#define cimg_for2XC(img,x,c) cimg_for2C(img,c) cimg_for2X(img,x)
  985 +#define cimg_for2YZ(img,y,z) cimg_for2Z(img,z) cimg_for2Y(img,y)
  986 +#define cimg_for2YC(img,y,c) cimg_for2C(img,c) cimg_for2Y(img,y)
  987 +#define cimg_for2ZC(img,z,c) cimg_for2C(img,c) cimg_for2Z(img,z)
  988 +#define cimg_for2XYZ(img,x,y,z) cimg_for2Z(img,z) cimg_for2XY(img,x,y)
  989 +#define cimg_for2XZC(img,x,z,c) cimg_for2C(img,c) cimg_for2XZ(img,x,z)
  990 +#define cimg_for2YZC(img,y,z,c) cimg_for2C(img,c) cimg_for2YZ(img,y,z)
  991 +#define cimg_for2XYZC(img,x,y,z,c) cimg_for2C(img,c) cimg_for2XYZ(img,x,y,z)
  992 +
  993 +#define cimg_for_in2(bound,i0,i1,i) \
  994 + for (int i = (int)(i0)<0?0:(int)(i0), \
  995 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1; \
  996 + i<=(int)(i1) && (_n1##i<(int)(bound) || i==--_n1##i); \
  997 + ++i, ++_n1##i)
  998 +#define cimg_for_in2X(img,x0,x1,x) cimg_for_in2((img)._width,x0,x1,x)
  999 +#define cimg_for_in2Y(img,y0,y1,y) cimg_for_in2((img)._height,y0,y1,y)
  1000 +#define cimg_for_in2Z(img,z0,z1,z) cimg_for_in2((img)._depth,z0,z1,z)
  1001 +#define cimg_for_in2C(img,c0,c1,c) cimg_for_in2((img)._spectrum,c0,c1,c)
  1002 +#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)
  1003 +#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)
  1004 +#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)
  1005 +#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)
  1006 +#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)
  1007 +#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)
  1008 +#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)
  1009 +#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)
  1010 +#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)
  1011 +#define cimg_for_in2XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1012 + cimg_for_in2C(img,c0,c1,c) cimg_for_in2XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1013 +
  1014 +#define cimg_for3(bound,i) \
  1015 + for (int i = 0, _p1##i = 0, \
  1016 + _n1##i = 1>=(bound)?(int)(bound) - 1:1; \
  1017 + _n1##i<(int)(bound) || i==--_n1##i; \
  1018 + _p1##i = i++, ++_n1##i)
  1019 +#define cimg_for3X(img,x) cimg_for3((img)._width,x)
  1020 +#define cimg_for3Y(img,y) cimg_for3((img)._height,y)
  1021 +#define cimg_for3Z(img,z) cimg_for3((img)._depth,z)
  1022 +#define cimg_for3C(img,c) cimg_for3((img)._spectrum,c)
  1023 +#define cimg_for3XY(img,x,y) cimg_for3Y(img,y) cimg_for3X(img,x)
  1024 +#define cimg_for3XZ(img,x,z) cimg_for3Z(img,z) cimg_for3X(img,x)
  1025 +#define cimg_for3XC(img,x,c) cimg_for3C(img,c) cimg_for3X(img,x)
  1026 +#define cimg_for3YZ(img,y,z) cimg_for3Z(img,z) cimg_for3Y(img,y)
  1027 +#define cimg_for3YC(img,y,c) cimg_for3C(img,c) cimg_for3Y(img,y)
  1028 +#define cimg_for3ZC(img,z,c) cimg_for3C(img,c) cimg_for3Z(img,z)
  1029 +#define cimg_for3XYZ(img,x,y,z) cimg_for3Z(img,z) cimg_for3XY(img,x,y)
  1030 +#define cimg_for3XZC(img,x,z,c) cimg_for3C(img,c) cimg_for3XZ(img,x,z)
  1031 +#define cimg_for3YZC(img,y,z,c) cimg_for3C(img,c) cimg_for3YZ(img,y,z)
  1032 +#define cimg_for3XYZC(img,x,y,z,c) cimg_for3C(img,c) cimg_for3XYZ(img,x,y,z)
  1033 +
  1034 +#define cimg_for_in3(bound,i0,i1,i) \
  1035 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1036 + _p1##i = i - 1<0?0:i - 1, \
  1037 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1; \
  1038 + i<=(int)(i1) && (_n1##i<(int)(bound) || i==--_n1##i); \
  1039 + _p1##i = i++, ++_n1##i)
  1040 +#define cimg_for_in3X(img,x0,x1,x) cimg_for_in3((img)._width,x0,x1,x)
  1041 +#define cimg_for_in3Y(img,y0,y1,y) cimg_for_in3((img)._height,y0,y1,y)
  1042 +#define cimg_for_in3Z(img,z0,z1,z) cimg_for_in3((img)._depth,z0,z1,z)
  1043 +#define cimg_for_in3C(img,c0,c1,c) cimg_for_in3((img)._spectrum,c0,c1,c)
  1044 +#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)
  1045 +#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)
  1046 +#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)
  1047 +#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)
  1048 +#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)
  1049 +#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)
  1050 +#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)
  1051 +#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)
  1052 +#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)
  1053 +#define cimg_for_in3XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1054 + cimg_for_in3C(img,c0,c1,c) cimg_for_in3XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1055 +
  1056 +#define cimg_for4(bound,i) \
  1057 + for (int i = 0, _p1##i = 0, _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
  1058 + _n2##i = 2>=(bound)?(int)(bound) - 1:2; \
  1059 + _n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i); \
  1060 + _p1##i = i++, ++_n1##i, ++_n2##i)
  1061 +#define cimg_for4X(img,x) cimg_for4((img)._width,x)
  1062 +#define cimg_for4Y(img,y) cimg_for4((img)._height,y)
  1063 +#define cimg_for4Z(img,z) cimg_for4((img)._depth,z)
  1064 +#define cimg_for4C(img,c) cimg_for4((img)._spectrum,c)
  1065 +#define cimg_for4XY(img,x,y) cimg_for4Y(img,y) cimg_for4X(img,x)
  1066 +#define cimg_for4XZ(img,x,z) cimg_for4Z(img,z) cimg_for4X(img,x)
  1067 +#define cimg_for4XC(img,x,c) cimg_for4C(img,c) cimg_for4X(img,x)
  1068 +#define cimg_for4YZ(img,y,z) cimg_for4Z(img,z) cimg_for4Y(img,y)
  1069 +#define cimg_for4YC(img,y,c) cimg_for4C(img,c) cimg_for4Y(img,y)
  1070 +#define cimg_for4ZC(img,z,c) cimg_for4C(img,c) cimg_for4Z(img,z)
  1071 +#define cimg_for4XYZ(img,x,y,z) cimg_for4Z(img,z) cimg_for4XY(img,x,y)
  1072 +#define cimg_for4XZC(img,x,z,c) cimg_for4C(img,c) cimg_for4XZ(img,x,z)
  1073 +#define cimg_for4YZC(img,y,z,c) cimg_for4C(img,c) cimg_for4YZ(img,y,z)
  1074 +#define cimg_for4XYZC(img,x,y,z,c) cimg_for4C(img,c) cimg_for4XYZ(img,x,y,z)
  1075 +
  1076 +#define cimg_for_in4(bound,i0,i1,i) \
  1077 + for (int i = (int)(i0)<0?0:(int)(i0), \
  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 + i<=(int)(i1) && (_n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i)); \
  1082 + _p1##i = i++, ++_n1##i, ++_n2##i)
  1083 +#define cimg_for_in4X(img,x0,x1,x) cimg_for_in4((img)._width,x0,x1,x)
  1084 +#define cimg_for_in4Y(img,y0,y1,y) cimg_for_in4((img)._height,y0,y1,y)
  1085 +#define cimg_for_in4Z(img,z0,z1,z) cimg_for_in4((img)._depth,z0,z1,z)
  1086 +#define cimg_for_in4C(img,c0,c1,c) cimg_for_in4((img)._spectrum,c0,c1,c)
  1087 +#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)
  1088 +#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)
  1089 +#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)
  1090 +#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)
  1091 +#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)
  1092 +#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)
  1093 +#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)
  1094 +#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)
  1095 +#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)
  1096 +#define cimg_for_in4XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1097 + cimg_for_in4C(img,c0,c1,c) cimg_for_in4XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1098 +
  1099 +#define cimg_for5(bound,i) \
  1100 + for (int i = 0, _p2##i = 0, _p1##i = 0, \
  1101 + _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
  1102 + _n2##i = 2>=(bound)?(int)(bound) - 1:2; \
  1103 + _n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i); \
  1104 + _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i)
  1105 +#define cimg_for5X(img,x) cimg_for5((img)._width,x)
  1106 +#define cimg_for5Y(img,y) cimg_for5((img)._height,y)
  1107 +#define cimg_for5Z(img,z) cimg_for5((img)._depth,z)
  1108 +#define cimg_for5C(img,c) cimg_for5((img)._spectrum,c)
  1109 +#define cimg_for5XY(img,x,y) cimg_for5Y(img,y) cimg_for5X(img,x)
  1110 +#define cimg_for5XZ(img,x,z) cimg_for5Z(img,z) cimg_for5X(img,x)
  1111 +#define cimg_for5XC(img,x,c) cimg_for5C(img,c) cimg_for5X(img,x)
  1112 +#define cimg_for5YZ(img,y,z) cimg_for5Z(img,z) cimg_for5Y(img,y)
  1113 +#define cimg_for5YC(img,y,c) cimg_for5C(img,c) cimg_for5Y(img,y)
  1114 +#define cimg_for5ZC(img,z,c) cimg_for5C(img,c) cimg_for5Z(img,z)
  1115 +#define cimg_for5XYZ(img,x,y,z) cimg_for5Z(img,z) cimg_for5XY(img,x,y)
  1116 +#define cimg_for5XZC(img,x,z,c) cimg_for5C(img,c) cimg_for5XZ(img,x,z)
  1117 +#define cimg_for5YZC(img,y,z,c) cimg_for5C(img,c) cimg_for5YZ(img,y,z)
  1118 +#define cimg_for5XYZC(img,x,y,z,c) cimg_for5C(img,c) cimg_for5XYZ(img,x,y,z)
  1119 +
  1120 +#define cimg_for_in5(bound,i0,i1,i) \
  1121 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1122 + _p2##i = i - 2<0?0:i - 2, \
  1123 + _p1##i = i - 1<0?0:i - 1, \
  1124 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
  1125 + _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2; \
  1126 + i<=(int)(i1) && (_n2##i<(int)(bound) || _n1##i==--_n2##i || i==(_n2##i = --_n1##i)); \
  1127 + _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i)
  1128 +#define cimg_for_in5X(img,x0,x1,x) cimg_for_in5((img)._width,x0,x1,x)
  1129 +#define cimg_for_in5Y(img,y0,y1,y) cimg_for_in5((img)._height,y0,y1,y)
  1130 +#define cimg_for_in5Z(img,z0,z1,z) cimg_for_in5((img)._depth,z0,z1,z)
  1131 +#define cimg_for_in5C(img,c0,c1,c) cimg_for_in5((img)._spectrum,c0,c1,c)
  1132 +#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)
  1133 +#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)
  1134 +#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)
  1135 +#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)
  1136 +#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)
  1137 +#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)
  1138 +#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)
  1139 +#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)
  1140 +#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)
  1141 +#define cimg_for_in5XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1142 + cimg_for_in5C(img,c0,c1,c) cimg_for_in5XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1143 +
  1144 +#define cimg_for6(bound,i) \
  1145 + for (int i = 0, _p2##i = 0, _p1##i = 0, \
  1146 + _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
  1147 + _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
  1148 + _n3##i = 3>=(bound)?(int)(bound) - 1:3; \
  1149 + _n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i); \
  1150 + _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
  1151 +#define cimg_for6X(img,x) cimg_for6((img)._width,x)
  1152 +#define cimg_for6Y(img,y) cimg_for6((img)._height,y)
  1153 +#define cimg_for6Z(img,z) cimg_for6((img)._depth,z)
  1154 +#define cimg_for6C(img,c) cimg_for6((img)._spectrum,c)
  1155 +#define cimg_for6XY(img,x,y) cimg_for6Y(img,y) cimg_for6X(img,x)
  1156 +#define cimg_for6XZ(img,x,z) cimg_for6Z(img,z) cimg_for6X(img,x)
  1157 +#define cimg_for6XC(img,x,c) cimg_for6C(img,c) cimg_for6X(img,x)
  1158 +#define cimg_for6YZ(img,y,z) cimg_for6Z(img,z) cimg_for6Y(img,y)
  1159 +#define cimg_for6YC(img,y,c) cimg_for6C(img,c) cimg_for6Y(img,y)
  1160 +#define cimg_for6ZC(img,z,c) cimg_for6C(img,c) cimg_for6Z(img,z)
  1161 +#define cimg_for6XYZ(img,x,y,z) cimg_for6Z(img,z) cimg_for6XY(img,x,y)
  1162 +#define cimg_for6XZC(img,x,z,c) cimg_for6C(img,c) cimg_for6XZ(img,x,z)
  1163 +#define cimg_for6YZC(img,y,z,c) cimg_for6C(img,c) cimg_for6YZ(img,y,z)
  1164 +#define cimg_for6XYZC(img,x,y,z,c) cimg_for6C(img,c) cimg_for6XYZ(img,x,y,z)
  1165 +
  1166 +#define cimg_for_in6(bound,i0,i1,i) \
  1167 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1168 + _p2##i = i - 2<0?0:i - 2, \
  1169 + _p1##i = i - 1<0?0:i - 1, \
  1170 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
  1171 + _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
  1172 + _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3; \
  1173 + i<=(int)(i1) && \
  1174 + (_n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i)); \
  1175 + _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
  1176 +#define cimg_for_in6X(img,x0,x1,x) cimg_for_in6((img)._width,x0,x1,x)
  1177 +#define cimg_for_in6Y(img,y0,y1,y) cimg_for_in6((img)._height,y0,y1,y)
  1178 +#define cimg_for_in6Z(img,z0,z1,z) cimg_for_in6((img)._depth,z0,z1,z)
  1179 +#define cimg_for_in6C(img,c0,c1,c) cimg_for_in6((img)._spectrum,c0,c1,c)
  1180 +#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)
  1181 +#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)
  1182 +#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)
  1183 +#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)
  1184 +#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)
  1185 +#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)
  1186 +#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)
  1187 +#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)
  1188 +#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)
  1189 +#define cimg_for_in6XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1190 + cimg_for_in6C(img,c0,c1,c) cimg_for_in6XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1191 +
  1192 +#define cimg_for7(bound,i) \
  1193 + for (int i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
  1194 + _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
  1195 + _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
  1196 + _n3##i = 3>=(bound)?(int)(bound) - 1:3; \
  1197 + _n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i); \
  1198 + _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
  1199 +#define cimg_for7X(img,x) cimg_for7((img)._width,x)
  1200 +#define cimg_for7Y(img,y) cimg_for7((img)._height,y)
  1201 +#define cimg_for7Z(img,z) cimg_for7((img)._depth,z)
  1202 +#define cimg_for7C(img,c) cimg_for7((img)._spectrum,c)
  1203 +#define cimg_for7XY(img,x,y) cimg_for7Y(img,y) cimg_for7X(img,x)
  1204 +#define cimg_for7XZ(img,x,z) cimg_for7Z(img,z) cimg_for7X(img,x)
  1205 +#define cimg_for7XC(img,x,c) cimg_for7C(img,c) cimg_for7X(img,x)
  1206 +#define cimg_for7YZ(img,y,z) cimg_for7Z(img,z) cimg_for7Y(img,y)
  1207 +#define cimg_for7YC(img,y,c) cimg_for7C(img,c) cimg_for7Y(img,y)
  1208 +#define cimg_for7ZC(img,z,c) cimg_for7C(img,c) cimg_for7Z(img,z)
  1209 +#define cimg_for7XYZ(img,x,y,z) cimg_for7Z(img,z) cimg_for7XY(img,x,y)
  1210 +#define cimg_for7XZC(img,x,z,c) cimg_for7C(img,c) cimg_for7XZ(img,x,z)
  1211 +#define cimg_for7YZC(img,y,z,c) cimg_for7C(img,c) cimg_for7YZ(img,y,z)
  1212 +#define cimg_for7XYZC(img,x,y,z,c) cimg_for7C(img,c) cimg_for7XYZ(img,x,y,z)
  1213 +
  1214 +#define cimg_for_in7(bound,i0,i1,i) \
  1215 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1216 + _p3##i = i - 3<0?0:i - 3, \
  1217 + _p2##i = i - 2<0?0:i - 2, \
  1218 + _p1##i = i - 1<0?0:i - 1, \
  1219 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
  1220 + _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
  1221 + _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3; \
  1222 + i<=(int)(i1) && \
  1223 + (_n3##i<(int)(bound) || _n2##i==--_n3##i || _n1##i==--_n2##i || i==(_n3##i = _n2##i = --_n1##i)); \
  1224 + _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i)
  1225 +#define cimg_for_in7X(img,x0,x1,x) cimg_for_in7((img)._width,x0,x1,x)
  1226 +#define cimg_for_in7Y(img,y0,y1,y) cimg_for_in7((img)._height,y0,y1,y)
  1227 +#define cimg_for_in7Z(img,z0,z1,z) cimg_for_in7((img)._depth,z0,z1,z)
  1228 +#define cimg_for_in7C(img,c0,c1,c) cimg_for_in7((img)._spectrum,c0,c1,c)
  1229 +#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)
  1230 +#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)
  1231 +#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)
  1232 +#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)
  1233 +#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)
  1234 +#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)
  1235 +#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)
  1236 +#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)
  1237 +#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)
  1238 +#define cimg_for_in7XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1239 + cimg_for_in7C(img,c0,c1,c) cimg_for_in7XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1240 +
  1241 +#define cimg_for8(bound,i) \
  1242 + for (int i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
  1243 + _n1##i = 1>=(bound)?(int)(bound) - 1:1, \
  1244 + _n2##i = 2>=(bound)?(int)(bound) - 1:2, \
  1245 + _n3##i = 3>=(bound)?(int)(bound) - 1:3, \
  1246 + _n4##i = 4>=(bound)?(int)(bound) - 1:4; \
  1247 + _n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
  1248 + i==(_n4##i = _n3##i = _n2##i = --_n1##i); \
  1249 + _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
  1250 +#define cimg_for8X(img,x) cimg_for8((img)._width,x)
  1251 +#define cimg_for8Y(img,y) cimg_for8((img)._height,y)
  1252 +#define cimg_for8Z(img,z) cimg_for8((img)._depth,z)
  1253 +#define cimg_for8C(img,c) cimg_for8((img)._spectrum,c)
  1254 +#define cimg_for8XY(img,x,y) cimg_for8Y(img,y) cimg_for8X(img,x)
  1255 +#define cimg_for8XZ(img,x,z) cimg_for8Z(img,z) cimg_for8X(img,x)
  1256 +#define cimg_for8XC(img,x,c) cimg_for8C(img,c) cimg_for8X(img,x)
  1257 +#define cimg_for8YZ(img,y,z) cimg_for8Z(img,z) cimg_for8Y(img,y)
  1258 +#define cimg_for8YC(img,y,c) cimg_for8C(img,c) cimg_for8Y(img,y)
  1259 +#define cimg_for8ZC(img,z,c) cimg_for8C(img,c) cimg_for8Z(img,z)
  1260 +#define cimg_for8XYZ(img,x,y,z) cimg_for8Z(img,z) cimg_for8XY(img,x,y)
  1261 +#define cimg_for8XZC(img,x,z,c) cimg_for8C(img,c) cimg_for8XZ(img,x,z)
  1262 +#define cimg_for8YZC(img,y,z,c) cimg_for8C(img,c) cimg_for8YZ(img,y,z)
  1263 +#define cimg_for8XYZC(img,x,y,z,c) cimg_for8C(img,c) cimg_for8XYZ(img,x,y,z)
  1264 +
  1265 +#define cimg_for_in8(bound,i0,i1,i) \
  1266 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1267 + _p3##i = i - 3<0?0:i - 3, \
  1268 + _p2##i = i - 2<0?0:i - 2, \
  1269 + _p1##i = i - 1<0?0:i - 1, \
  1270 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
  1271 + _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
  1272 + _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3, \
  1273 + _n4##i = i + 4>=(int)(bound)?(int)(bound) - 1:i + 4; \
  1274 + i<=(int)(i1) && (_n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
  1275 + i==(_n4##i = _n3##i = _n2##i = --_n1##i)); \
  1276 + _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
  1277 +#define cimg_for_in8X(img,x0,x1,x) cimg_for_in8((img)._width,x0,x1,x)
  1278 +#define cimg_for_in8Y(img,y0,y1,y) cimg_for_in8((img)._height,y0,y1,y)
  1279 +#define cimg_for_in8Z(img,z0,z1,z) cimg_for_in8((img)._depth,z0,z1,z)
  1280 +#define cimg_for_in8C(img,c0,c1,c) cimg_for_in8((img)._spectrum,c0,c1,c)
  1281 +#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)
  1282 +#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)
  1283 +#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)
  1284 +#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)
  1285 +#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)
  1286 +#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)
  1287 +#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)
  1288 +#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)
  1289 +#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)
  1290 +#define cimg_for_in8XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1291 + cimg_for_in8C(img,c0,c1,c) cimg_for_in8XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1292 +
  1293 +#define cimg_for9(bound,i) \
  1294 + for (int i = 0, _p4##i = 0, _p3##i = 0, _p2##i = 0, _p1##i = 0, \
  1295 + _n1##i = 1>=(int)(bound)?(int)(bound) - 1:1, \
  1296 + _n2##i = 2>=(int)(bound)?(int)(bound) - 1:2, \
  1297 + _n3##i = 3>=(int)(bound)?(int)(bound) - 1:3, \
  1298 + _n4##i = 4>=(int)(bound)?(int)(bound) - 1:4; \
  1299 + _n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
  1300 + i==(_n4##i = _n3##i = _n2##i = --_n1##i); \
  1301 + _p4##i = _p3##i, _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
  1302 +#define cimg_for9X(img,x) cimg_for9((img)._width,x)
  1303 +#define cimg_for9Y(img,y) cimg_for9((img)._height,y)
  1304 +#define cimg_for9Z(img,z) cimg_for9((img)._depth,z)
  1305 +#define cimg_for9C(img,c) cimg_for9((img)._spectrum,c)
  1306 +#define cimg_for9XY(img,x,y) cimg_for9Y(img,y) cimg_for9X(img,x)
  1307 +#define cimg_for9XZ(img,x,z) cimg_for9Z(img,z) cimg_for9X(img,x)
  1308 +#define cimg_for9XC(img,x,c) cimg_for9C(img,c) cimg_for9X(img,x)
  1309 +#define cimg_for9YZ(img,y,z) cimg_for9Z(img,z) cimg_for9Y(img,y)
  1310 +#define cimg_for9YC(img,y,c) cimg_for9C(img,c) cimg_for9Y(img,y)
  1311 +#define cimg_for9ZC(img,z,c) cimg_for9C(img,c) cimg_for9Z(img,z)
  1312 +#define cimg_for9XYZ(img,x,y,z) cimg_for9Z(img,z) cimg_for9XY(img,x,y)
  1313 +#define cimg_for9XZC(img,x,z,c) cimg_for9C(img,c) cimg_for9XZ(img,x,z)
  1314 +#define cimg_for9YZC(img,y,z,c) cimg_for9C(img,c) cimg_for9YZ(img,y,z)
  1315 +#define cimg_for9XYZC(img,x,y,z,c) cimg_for9C(img,c) cimg_for9XYZ(img,x,y,z)
  1316 +
  1317 +#define cimg_for_in9(bound,i0,i1,i) \
  1318 + for (int i = (int)(i0)<0?0:(int)(i0), \
  1319 + _p4##i = i - 4<0?0:i - 4, \
  1320 + _p3##i = i - 3<0?0:i - 3, \
  1321 + _p2##i = i - 2<0?0:i - 2, \
  1322 + _p1##i = i - 1<0?0:i - 1, \
  1323 + _n1##i = i + 1>=(int)(bound)?(int)(bound) - 1:i + 1, \
  1324 + _n2##i = i + 2>=(int)(bound)?(int)(bound) - 1:i + 2, \
  1325 + _n3##i = i + 3>=(int)(bound)?(int)(bound) - 1:i + 3, \
  1326 + _n4##i = i + 4>=(int)(bound)?(int)(bound) - 1:i + 4; \
  1327 + i<=(int)(i1) && (_n4##i<(int)(bound) || _n3##i==--_n4##i || _n2##i==--_n3##i || _n1##i==--_n2##i || \
  1328 + i==(_n4##i = _n3##i = _n2##i = --_n1##i)); \
  1329 + _p4##i = _p3##i, _p3##i = _p2##i, _p2##i = _p1##i, _p1##i = i++, ++_n1##i, ++_n2##i, ++_n3##i, ++_n4##i)
  1330 +#define cimg_for_in9X(img,x0,x1,x) cimg_for_in9((img)._width,x0,x1,x)
  1331 +#define cimg_for_in9Y(img,y0,y1,y) cimg_for_in9((img)._height,y0,y1,y)
  1332 +#define cimg_for_in9Z(img,z0,z1,z) cimg_for_in9((img)._depth,z0,z1,z)
  1333 +#define cimg_for_in9C(img,c0,c1,c) cimg_for_in9((img)._spectrum,c0,c1,c)
  1334 +#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)
  1335 +#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)
  1336 +#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)
  1337 +#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)
  1338 +#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)
  1339 +#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)
  1340 +#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)
  1341 +#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)
  1342 +#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)
  1343 +#define cimg_for_in9XYZC(img,x0,y0,z0,c0,x1,y1,z1,c1,x,y,z,c) \
  1344 + cimg_for_in9C(img,c0,c1,c) cimg_for_in9XYZ(img,x0,y0,z0,x1,y1,z1,x,y,z)
  1345 +
  1346 +#define cimg_for2x2(img,x,y,z,c,I,T) \
  1347 + cimg_for2((img)._height,y) for (int x = 0, \
  1348 + _n1##x = (int)( \
  1349 + (I[0] = (T)(img)(0,y,z,c)), \
  1350 + (I[2] = (T)(img)(0,_n1##y,z,c)), \
  1351 + 1>=(img)._width?(img).width() - 1:1); \
  1352 + (_n1##x<(img).width() && ( \
  1353 + (I[1] = (T)(img)(_n1##x,y,z,c)), \
  1354 + (I[3] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
  1355 + x==--_n1##x; \
  1356 + I[0] = I[1], \
  1357 + I[2] = I[3], \
  1358 + ++x, ++_n1##x)
  1359 +
  1360 +#define cimg_for_in2x2(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1361 + cimg_for_in2((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
  1362 + _n1##x = (int)( \
  1363 + (I[0] = (T)(img)(x,y,z,c)), \
  1364 + (I[2] = (T)(img)(x,_n1##y,z,c)), \
  1365 + x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
  1366 + x<=(int)(x1) && ((_n1##x<(img).width() && ( \
  1367 + (I[1] = (T)(img)(_n1##x,y,z,c)), \
  1368 + (I[3] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
  1369 + x==--_n1##x); \
  1370 + I[0] = I[1], \
  1371 + I[2] = I[3], \
  1372 + ++x, ++_n1##x)
  1373 +
  1374 +#define cimg_for3x3(img,x,y,z,c,I,T) \
  1375 + cimg_for3((img)._height,y) for (int x = 0, \
  1376 + _p1##x = 0, \
  1377 + _n1##x = (int)( \
  1378 + (I[0] = I[1] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1379 + (I[3] = I[4] = (T)(img)(0,y,z,c)), \
  1380 + (I[6] = I[7] = (T)(img)(0,_n1##y,z,c)), \
  1381 + 1>=(img)._width?(img).width() - 1:1); \
  1382 + (_n1##x<(img).width() && ( \
  1383 + (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1384 + (I[5] = (T)(img)(_n1##x,y,z,c)), \
  1385 + (I[8] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
  1386 + x==--_n1##x; \
  1387 + I[0] = I[1], I[1] = I[2], \
  1388 + I[3] = I[4], I[4] = I[5], \
  1389 + I[6] = I[7], I[7] = I[8], \
  1390 + _p1##x = x++, ++_n1##x)
  1391 +
  1392 +#define cimg_for_in3x3(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1393 + cimg_for_in3((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
  1394 + _p1##x = x - 1<0?0:x - 1, \
  1395 + _n1##x = (int)( \
  1396 + (I[0] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1397 + (I[3] = (T)(img)(_p1##x,y,z,c)), \
  1398 + (I[6] = (T)(img)(_p1##x,_n1##y,z,c)), \
  1399 + (I[1] = (T)(img)(x,_p1##y,z,c)), \
  1400 + (I[4] = (T)(img)(x,y,z,c)), \
  1401 + (I[7] = (T)(img)(x,_n1##y,z,c)), \
  1402 + x + 1>=(int)(img)._width?(img).width() - 1:x + 1); \
  1403 + x<=(int)(x1) && ((_n1##x<(img).width() && ( \
  1404 + (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1405 + (I[5] = (T)(img)(_n1##x,y,z,c)), \
  1406 + (I[8] = (T)(img)(_n1##x,_n1##y,z,c)),1)) || \
  1407 + x==--_n1##x); \
  1408 + I[0] = I[1], I[1] = I[2], \
  1409 + I[3] = I[4], I[4] = I[5], \
  1410 + I[6] = I[7], I[7] = I[8], \
  1411 + _p1##x = x++, ++_n1##x)
  1412 +
  1413 +#define cimg_for4x4(img,x,y,z,c,I,T) \
  1414 + cimg_for4((img)._height,y) for (int x = 0, \
  1415 + _p1##x = 0, \
  1416 + _n1##x = 1>=(img)._width?(img).width() - 1:1, \
  1417 + _n2##x = (int)( \
  1418 + (I[0] = I[1] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1419 + (I[4] = I[5] = (T)(img)(0,y,z,c)), \
  1420 + (I[8] = I[9] = (T)(img)(0,_n1##y,z,c)), \
  1421 + (I[12] = I[13] = (T)(img)(0,_n2##y,z,c)), \
  1422 + (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1423 + (I[6] = (T)(img)(_n1##x,y,z,c)), \
  1424 + (I[10] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1425 + (I[14] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1426 + 2>=(img)._width?(img).width() - 1:2); \
  1427 + (_n2##x<(img).width() && ( \
  1428 + (I[3] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1429 + (I[7] = (T)(img)(_n2##x,y,z,c)), \
  1430 + (I[11] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1431 + (I[15] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
  1432 + _n1##x==--_n2##x || x==(_n2##x = --_n1##x); \
  1433 + I[0] = I[1], I[1] = I[2], I[2] = I[3], \
  1434 + I[4] = I[5], I[5] = I[6], I[6] = I[7], \
  1435 + I[8] = I[9], I[9] = I[10], I[10] = I[11], \
  1436 + I[12] = I[13], I[13] = I[14], I[14] = I[15], \
  1437 + _p1##x = x++, ++_n1##x, ++_n2##x)
  1438 +
  1439 +#define cimg_for_in4x4(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1440 + cimg_for_in4((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
  1441 + _p1##x = x - 1<0?0:x - 1, \
  1442 + _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
  1443 + _n2##x = (int)( \
  1444 + (I[0] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1445 + (I[4] = (T)(img)(_p1##x,y,z,c)), \
  1446 + (I[8] = (T)(img)(_p1##x,_n1##y,z,c)), \
  1447 + (I[12] = (T)(img)(_p1##x,_n2##y,z,c)), \
  1448 + (I[1] = (T)(img)(x,_p1##y,z,c)), \
  1449 + (I[5] = (T)(img)(x,y,z,c)), \
  1450 + (I[9] = (T)(img)(x,_n1##y,z,c)), \
  1451 + (I[13] = (T)(img)(x,_n2##y,z,c)), \
  1452 + (I[2] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1453 + (I[6] = (T)(img)(_n1##x,y,z,c)), \
  1454 + (I[10] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1455 + (I[14] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1456 + x + 2>=(int)(img)._width?(img).width() - 1:x + 2); \
  1457 + x<=(int)(x1) && ((_n2##x<(img).width() && ( \
  1458 + (I[3] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1459 + (I[7] = (T)(img)(_n2##x,y,z,c)), \
  1460 + (I[11] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1461 + (I[15] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
  1462 + _n1##x==--_n2##x || x==(_n2##x = --_n1##x)); \
  1463 + I[0] = I[1], I[1] = I[2], I[2] = I[3], \
  1464 + I[4] = I[5], I[5] = I[6], I[6] = I[7], \
  1465 + I[8] = I[9], I[9] = I[10], I[10] = I[11], \
  1466 + I[12] = I[13], I[13] = I[14], I[14] = I[15], \
  1467 + _p1##x = x++, ++_n1##x, ++_n2##x)
  1468 +
  1469 +#define cimg_for5x5(img,x,y,z,c,I,T) \
  1470 + cimg_for5((img)._height,y) for (int x = 0, \
  1471 + _p2##x = 0, _p1##x = 0, \
  1472 + _n1##x = 1>=(img)._width?(img).width() - 1:1, \
  1473 + _n2##x = (int)( \
  1474 + (I[0] = I[1] = I[2] = (T)(img)(_p2##x,_p2##y,z,c)), \
  1475 + (I[5] = I[6] = I[7] = (T)(img)(0,_p1##y,z,c)), \
  1476 + (I[10] = I[11] = I[12] = (T)(img)(0,y,z,c)), \
  1477 + (I[15] = I[16] = I[17] = (T)(img)(0,_n1##y,z,c)), \
  1478 + (I[20] = I[21] = I[22] = (T)(img)(0,_n2##y,z,c)), \
  1479 + (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
  1480 + (I[8] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1481 + (I[13] = (T)(img)(_n1##x,y,z,c)), \
  1482 + (I[18] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1483 + (I[23] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1484 + 2>=(img)._width?(img).width() - 1:2); \
  1485 + (_n2##x<(img).width() && ( \
  1486 + (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
  1487 + (I[9] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1488 + (I[14] = (T)(img)(_n2##x,y,z,c)), \
  1489 + (I[19] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1490 + (I[24] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
  1491 + _n1##x==--_n2##x || x==(_n2##x = --_n1##x); \
  1492 + I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], \
  1493 + I[5] = I[6], I[6] = I[7], I[7] = I[8], I[8] = I[9], \
  1494 + I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], \
  1495 + I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], \
  1496 + I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
  1497 + _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x)
  1498 +
  1499 +#define cimg_for_in5x5(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1500 + cimg_for_in5((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
  1501 + _p2##x = x - 2<0?0:x - 2, \
  1502 + _p1##x = x - 1<0?0:x - 1, \
  1503 + _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
  1504 + _n2##x = (int)( \
  1505 + (I[0] = (T)(img)(_p2##x,_p2##y,z,c)), \
  1506 + (I[5] = (T)(img)(_p2##x,_p1##y,z,c)), \
  1507 + (I[10] = (T)(img)(_p2##x,y,z,c)), \
  1508 + (I[15] = (T)(img)(_p2##x,_n1##y,z,c)), \
  1509 + (I[20] = (T)(img)(_p2##x,_n2##y,z,c)), \
  1510 + (I[1] = (T)(img)(_p1##x,_p2##y,z,c)), \
  1511 + (I[6] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1512 + (I[11] = (T)(img)(_p1##x,y,z,c)), \
  1513 + (I[16] = (T)(img)(_p1##x,_n1##y,z,c)), \
  1514 + (I[21] = (T)(img)(_p1##x,_n2##y,z,c)), \
  1515 + (I[2] = (T)(img)(x,_p2##y,z,c)), \
  1516 + (I[7] = (T)(img)(x,_p1##y,z,c)), \
  1517 + (I[12] = (T)(img)(x,y,z,c)), \
  1518 + (I[17] = (T)(img)(x,_n1##y,z,c)), \
  1519 + (I[22] = (T)(img)(x,_n2##y,z,c)), \
  1520 + (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
  1521 + (I[8] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1522 + (I[13] = (T)(img)(_n1##x,y,z,c)), \
  1523 + (I[18] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1524 + (I[23] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1525 + x + 2>=(int)(img)._width?(img).width() - 1:x + 2); \
  1526 + x<=(int)(x1) && ((_n2##x<(img).width() && ( \
  1527 + (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
  1528 + (I[9] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1529 + (I[14] = (T)(img)(_n2##x,y,z,c)), \
  1530 + (I[19] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1531 + (I[24] = (T)(img)(_n2##x,_n2##y,z,c)),1)) || \
  1532 + _n1##x==--_n2##x || x==(_n2##x = --_n1##x)); \
  1533 + I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], \
  1534 + I[5] = I[6], I[6] = I[7], I[7] = I[8], I[8] = I[9], \
  1535 + I[10] = I[11], I[11] = I[12], I[12] = I[13], I[13] = I[14], \
  1536 + I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], \
  1537 + I[20] = I[21], I[21] = I[22], I[22] = I[23], I[23] = I[24], \
  1538 + _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x)
  1539 +
  1540 +#define cimg_for6x6(img,x,y,z,c,I,T) \
  1541 + cimg_for6((img)._height,y) for (int x = 0, \
  1542 + _p2##x = 0, _p1##x = 0, \
  1543 + _n1##x = 1>=(img)._width?(img).width() - 1:1, \
  1544 + _n2##x = 2>=(img)._width?(img).width() - 1:2, \
  1545 + _n3##x = (int)( \
  1546 + (I[0] = I[1] = I[2] = (T)(img)(_p2##x,_p2##y,z,c)), \
  1547 + (I[6] = I[7] = I[8] = (T)(img)(0,_p1##y,z,c)), \
  1548 + (I[12] = I[13] = I[14] = (T)(img)(0,y,z,c)), \
  1549 + (I[18] = I[19] = I[20] = (T)(img)(0,_n1##y,z,c)), \
  1550 + (I[24] = I[25] = I[26] = (T)(img)(0,_n2##y,z,c)), \
  1551 + (I[30] = I[31] = I[32] = (T)(img)(0,_n3##y,z,c)), \
  1552 + (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
  1553 + (I[9] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1554 + (I[15] = (T)(img)(_n1##x,y,z,c)), \
  1555 + (I[21] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1556 + (I[27] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1557 + (I[33] = (T)(img)(_n1##x,_n3##y,z,c)), \
  1558 + (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
  1559 + (I[10] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1560 + (I[16] = (T)(img)(_n2##x,y,z,c)), \
  1561 + (I[22] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1562 + (I[28] = (T)(img)(_n2##x,_n2##y,z,c)), \
  1563 + (I[34] = (T)(img)(_n2##x,_n3##y,z,c)), \
  1564 + 3>=(img)._width?(img).width() - 1:3); \
  1565 + (_n3##x<(img).width() && ( \
  1566 + (I[5] = (T)(img)(_n3##x,_p2##y,z,c)), \
  1567 + (I[11] = (T)(img)(_n3##x,_p1##y,z,c)), \
  1568 + (I[17] = (T)(img)(_n3##x,y,z,c)), \
  1569 + (I[23] = (T)(img)(_n3##x,_n1##y,z,c)), \
  1570 + (I[29] = (T)(img)(_n3##x,_n2##y,z,c)), \
  1571 + (I[35] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
  1572 + _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3## x = _n2##x = --_n1##x); \
  1573 + I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], \
  1574 + I[6] = I[7], I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], \
  1575 + I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], I[16] = I[17], \
  1576 + I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
  1577 + I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], \
  1578 + I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], I[34] = I[35], \
  1579 + _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
  1580 +
  1581 +#define cimg_for_in6x6(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1582 + cimg_for_in6((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)x0, \
  1583 + _p2##x = x - 2<0?0:x - 2, \
  1584 + _p1##x = x - 1<0?0:x - 1, \
  1585 + _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
  1586 + _n2##x = x + 2>=(int)(img)._width?(img).width() - 1:x + 2, \
  1587 + _n3##x = (int)( \
  1588 + (I[0] = (T)(img)(_p2##x,_p2##y,z,c)), \
  1589 + (I[6] = (T)(img)(_p2##x,_p1##y,z,c)), \
  1590 + (I[12] = (T)(img)(_p2##x,y,z,c)), \
  1591 + (I[18] = (T)(img)(_p2##x,_n1##y,z,c)), \
  1592 + (I[24] = (T)(img)(_p2##x,_n2##y,z,c)), \
  1593 + (I[30] = (T)(img)(_p2##x,_n3##y,z,c)), \
  1594 + (I[1] = (T)(img)(_p1##x,_p2##y,z,c)), \
  1595 + (I[7] = (T)(img)(_p1##x,_p1##y,z,c)), \
  1596 + (I[13] = (T)(img)(_p1##x,y,z,c)), \
  1597 + (I[19] = (T)(img)(_p1##x,_n1##y,z,c)), \
  1598 + (I[25] = (T)(img)(_p1##x,_n2##y,z,c)), \
  1599 + (I[31] = (T)(img)(_p1##x,_n3##y,z,c)), \
  1600 + (I[2] = (T)(img)(x,_p2##y,z,c)), \
  1601 + (I[8] = (T)(img)(x,_p1##y,z,c)), \
  1602 + (I[14] = (T)(img)(x,y,z,c)), \
  1603 + (I[20] = (T)(img)(x,_n1##y,z,c)), \
  1604 + (I[26] = (T)(img)(x,_n2##y,z,c)), \
  1605 + (I[32] = (T)(img)(x,_n3##y,z,c)), \
  1606 + (I[3] = (T)(img)(_n1##x,_p2##y,z,c)), \
  1607 + (I[9] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1608 + (I[15] = (T)(img)(_n1##x,y,z,c)), \
  1609 + (I[21] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1610 + (I[27] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1611 + (I[33] = (T)(img)(_n1##x,_n3##y,z,c)), \
  1612 + (I[4] = (T)(img)(_n2##x,_p2##y,z,c)), \
  1613 + (I[10] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1614 + (I[16] = (T)(img)(_n2##x,y,z,c)), \
  1615 + (I[22] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1616 + (I[28] = (T)(img)(_n2##x,_n2##y,z,c)), \
  1617 + (I[34] = (T)(img)(_n2##x,_n3##y,z,c)), \
  1618 + x + 3>=(int)(img)._width?(img).width() - 1:x + 3); \
  1619 + x<=(int)(x1) && ((_n3##x<(img).width() && ( \
  1620 + (I[5] = (T)(img)(_n3##x,_p2##y,z,c)), \
  1621 + (I[11] = (T)(img)(_n3##x,_p1##y,z,c)), \
  1622 + (I[17] = (T)(img)(_n3##x,y,z,c)), \
  1623 + (I[23] = (T)(img)(_n3##x,_n1##y,z,c)), \
  1624 + (I[29] = (T)(img)(_n3##x,_n2##y,z,c)), \
  1625 + (I[35] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
  1626 + _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3## x = _n2##x = --_n1##x)); \
  1627 + I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], \
  1628 + I[6] = I[7], I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], \
  1629 + I[12] = I[13], I[13] = I[14], I[14] = I[15], I[15] = I[16], I[16] = I[17], \
  1630 + I[18] = I[19], I[19] = I[20], I[20] = I[21], I[21] = I[22], I[22] = I[23], \
  1631 + I[24] = I[25], I[25] = I[26], I[26] = I[27], I[27] = I[28], I[28] = I[29], \
  1632 + I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], I[34] = I[35], \
  1633 + _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
  1634 +
  1635 +#define cimg_for7x7(img,x,y,z,c,I,T) \
  1636 + cimg_for7((img)._height,y) for (int x = 0, \
  1637 + _p3##x = 0, _p2##x = 0, _p1##x = 0, \
  1638 + _n1##x = 1>=(img)._width?(img).width() - 1:1, \
  1639 + _n2##x = 2>=(img)._width?(img).width() - 1:2, \
  1640 + _n3##x = (int)( \
  1641 + (I[0] = I[1] = I[2] = I[3] = (T)(img)(_p3##x,_p3##y,z,c)), \
  1642 + (I[7] = I[8] = I[9] = I[10] = (T)(img)(0,_p2##y,z,c)), \
  1643 + (I[14] = I[15] = I[16] = I[17] = (T)(img)(0,_p1##y,z,c)), \
  1644 + (I[21] = I[22] = I[23] = I[24] = (T)(img)(0,y,z,c)), \
  1645 + (I[28] = I[29] = I[30] = I[31] = (T)(img)(0,_n1##y,z,c)), \
  1646 + (I[35] = I[36] = I[37] = I[38] = (T)(img)(0,_n2##y,z,c)), \
  1647 + (I[42] = I[43] = I[44] = I[45] = (T)(img)(0,_n3##y,z,c)), \
  1648 + (I[4] = (T)(img)(_n1##x,_p3##y,z,c)), \
  1649 + (I[11] = (T)(img)(_n1##x,_p2##y,z,c)), \
  1650 + (I[18] = (T)(img)(_n1##x,_p1##y,z,c)), \
  1651 + (I[25] = (T)(img)(_n1##x,y,z,c)), \
  1652 + (I[32] = (T)(img)(_n1##x,_n1##y,z,c)), \
  1653 + (I[39] = (T)(img)(_n1##x,_n2##y,z,c)), \
  1654 + (I[46] = (T)(img)(_n1##x,_n3##y,z,c)), \
  1655 + (I[5] = (T)(img)(_n2##x,_p3##y,z,c)), \
  1656 + (I[12] = (T)(img)(_n2##x,_p2##y,z,c)), \
  1657 + (I[19] = (T)(img)(_n2##x,_p1##y,z,c)), \
  1658 + (I[26] = (T)(img)(_n2##x,y,z,c)), \
  1659 + (I[33] = (T)(img)(_n2##x,_n1##y,z,c)), \
  1660 + (I[40] = (T)(img)(_n2##x,_n2##y,z,c)), \
  1661 + (I[47] = (T)(img)(_n2##x,_n3##y,z,c)), \
  1662 + 3>=(img)._width?(img).width() - 1:3); \
  1663 + (_n3##x<(img).width() && ( \
  1664 + (I[6] = (T)(img)(_n3##x,_p3##y,z,c)), \
  1665 + (I[13] = (T)(img)(_n3##x,_p2##y,z,c)), \
  1666 + (I[20] = (T)(img)(_n3##x,_p1##y,z,c)), \
  1667 + (I[27] = (T)(img)(_n3##x,y,z,c)), \
  1668 + (I[34] = (T)(img)(_n3##x,_n1##y,z,c)), \
  1669 + (I[41] = (T)(img)(_n3##x,_n2##y,z,c)), \
  1670 + (I[48] = (T)(img)(_n3##x,_n3##y,z,c)),1)) || \
  1671 + _n2##x==--_n3##x || _n1##x==--_n2##x || x==(_n3##x = _n2##x = --_n1##x); \
  1672 + I[0] = I[1], I[1] = I[2], I[2] = I[3], I[3] = I[4], I[4] = I[5], I[5] = I[6], \
  1673 + I[7] = I[8], I[8] = I[9], I[9] = I[10], I[10] = I[11], I[11] = I[12], I[12] = I[13], \
  1674 + I[14] = I[15], I[15] = I[16], I[16] = I[17], I[17] = I[18], I[18] = I[19], I[19] = I[20], \
  1675 + I[21] = I[22], I[22] = I[23], I[23] = I[24], I[24] = I[25], I[25] = I[26], I[26] = I[27], \
  1676 + I[28] = I[29], I[29] = I[30], I[30] = I[31], I[31] = I[32], I[32] = I[33], I[33] = I[34], \
  1677 + I[35] = I[36], I[36] = I[37], I[37] = I[38], I[38] = I[39], I[39] = I[40], I[40] = I[41], \
  1678 + I[42] = I[43], I[43] = I[44], I[44] = I[45], I[45] = I[46], I[46] = I[47], I[47] = I[48], \
  1679 + _p3##x = _p2##x, _p2##x = _p1##x, _p1##x = x++, ++_n1##x, ++_n2##x, ++_n3##x)
  1680 +
  1681 +#define cimg_for_in7x7(img,x0,y0,x1,y1,x,y,z,c,I,T) \
  1682 + cimg_for_in7((img)._height,y0,y1,y) for (int x = (int)(x0)<0?0:(int)(x0), \
  1683 + _p3##x = x - 3<0?0:x - 3, \
  1684 + _p2##x = x - 2<0?0:x - 2, \
  1685 + _p1##x = x - 1<0?0:x - 1, \
  1686 + _n1##x = x + 1>=(int)(img)._width?(img).width() - 1:x + 1, \
  1687 + _n2##x = x + 2>=(int)(img)._width?(img).width() - 1:x + 2, \
  1688 + _n3##x = (int)( \
  1689 + (I[0] = (T)(img)(_p3##x,_p3##y,z,c)), \
  1690 + (I[7] = (T)(img)(_p3##x,_p2##y,z,c)), \
  1691 + (I[14] = (T)(img)(_p3##x,_p1##y,z,c)), \
  1692 + (I[21] = (T)(img)(_p3##x,y,z,c)), \
  1693 + (I[28] = (T)(img)(_p3##x,_n1##y,z,c)), \
  1694 + (I[35] = (T)(img)(_p3##x,_n2##y,z,c)), \
  1695