/*
 *  libpipi       Proper image processing implementation library
 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
 *                All Rights Reserved
 *
 *  $Id$
 *
 *  This library is free software. It comes without any warranty, to
 *  the extent permitted by applicable law. You can redistribute it
 *  and/or modify it under the terms of the Do What The Fuck You Want
 *  To Public License, Version 2, as published by Sam Hocevar. See
 *  http://sam.zoy.org/wtfpl/COPYING for more details.
 */

/* pipi_template.h: the magic template preprocessing file
 *
 * Define the following macros before including this file:
 *  * TEMPLATE_FLAGS is set to a list of toggle flags, a binary OR of:
 *    - SET_FLAG_GRAY
 *    - SET_FLAG_WRAP
 *  * TEMPLATE_FILE is set to the template file. The following macros
 *    will be defined when including it. Their value depend on the flags
 *    specified above:
 *    - FLAG_GRAY is set to 0 or 1
 *    - FLAG_WRAP is set to 0 or 1
 *    - SUFFIX(x) expands x by adding relevant information, eg. x##_gray_wrap
 */

#if !defined FLAG_GRAY
#   if (TEMPLATE_FLAGS) & SET_FLAG_GRAY
#      define FLAG_GRAY 1
#      include __FILE__
#      undef FLAG_GRAY
#   endif
#   define FLAG_GRAY 0
#   include __FILE__
#   undef FLAG_GRAY

#elif !defined FLAG_WRAP
#   if (TEMPLATE_FLAGS) & SET_FLAG_WRAP
#      define FLAG_WRAP 1
#      include __FILE__
#      undef FLAG_WRAP
#   endif
#   define FLAG_WRAP 0
#   include __FILE__
#   undef FLAG_WRAP

#elif !defined FLAG_8BIT
#   if (TEMPLATE_FLAGS) & SET_FLAG_8BIT
#      define FLAG_8BIT 1
#      include __FILE__
#      undef FLAG_8BIT
#   endif
#   define FLAG_8BIT 0
#   include __FILE__
#   undef FLAG_8BIT

#else
    /* FIXME: I couldn't find a way to do this in one preprocessor pass,
     * too many levels of indirection seem to be needed. */
#   if FLAG_8BIT
#      if FLAG_WRAP
#         if FLAG_GRAY
#            define SUFFIX(x) x##_gray_wrap_8bit
#         else
#            define SUFFIX(x) x##_wrap_8bit
#         endif
#      else
#         if FLAG_GRAY
#            define SUFFIX(x) x##_gray_8bit
#         else
#            define SUFFIX(x) x##_8bit
#         endif
#      endif
#   else
#      if FLAG_WRAP
#         if FLAG_GRAY
#            define SUFFIX(x) x##_gray_wrap
#         else
#            define SUFFIX(x) x##_wrap
#         endif
#      else
#         if FLAG_GRAY
#            define SUFFIX(x) x##_gray
#         else
#            define SUFFIX(x) x
#         endif
#      endif
#   endif
#   include TEMPLATE_FILE
#   undef SUFFIX
#endif