diff options
| author | Pixel <pixel@nobis-crew.org> | 2010-06-14 23:47:31 -0700 | 
|---|---|---|
| committer | Pixel <pixel@nobis-crew.org> | 2010-06-14 23:47:31 -0700 | 
| commit | 7c0c85a86aa73c0c495523f994f8412e377a8195 (patch) | |
| tree | 29929fdc4390224b3a4f8b728d50ae5dfc3589ce /im/src | |
| parent | 5000908b9b2761854951cea3e7dad90be76ffd59 (diff) | |
Upgrading im to 3.6
Diffstat (limited to 'im/src')
| -rwxr-xr-x | im/src/COPYRIGHT | 2 | ||||
| -rwxr-xr-x | im/src/config.mak | 2 | ||||
| -rwxr-xr-x | im/src/im.def | 2 | ||||
| -rwxr-xr-x | im/src/im_binfile.cpp | 4 | ||||
| -rwxr-xr-x | im/src/im_dib.cpp | 4 | ||||
| -rwxr-xr-x | im/src/im_file.cpp | 3 | ||||
| -rwxr-xr-x | im/src/im_format.cpp | 23 | ||||
| -rwxr-xr-x | im/src/im_image.cpp | 44 | ||||
| -rwxr-xr-x | im/src/im_lib.cpp | 6 | ||||
| -rwxr-xr-x | im/src/im_process.def | 1 | ||||
| -rw-r--r-- | im/src/lua5/clua/im_process.clua | 344 | ||||
| -rwxr-xr-x | im/src/lua5/im_process.lua | 1 | ||||
| -rwxr-xr-x | im/src/lua5/imlua_aux.c | 4 | ||||
| -rwxr-xr-x | im/src/lua5/imlua_image.c | 46 | ||||
| -rwxr-xr-x | im/src/lua5/imlua_process.c | 41 | ||||
| -rwxr-xr-x | im/src/process/im_analyze.cpp | 23 | ||||
| -rwxr-xr-x | im/src/process/im_arithmetic_bin.cpp | 144 | ||||
| -rwxr-xr-x | im/src/process/im_color.cpp | 6 | ||||
| -rwxr-xr-x | im/src/process/im_geometric.cpp | 37 | ||||
| -rwxr-xr-x | im/src/process/im_resize.cpp | 24 | ||||
| -rw-r--r-- | im/src/tecmake.mak | 1253 | 
21 files changed, 1777 insertions, 237 deletions
diff --git a/im/src/COPYRIGHT b/im/src/COPYRIGHT index ca0b899..4aae86e 100755 --- a/im/src/COPYRIGHT +++ b/im/src/COPYRIGHT @@ -7,7 +7,7 @@ and commercial purposes at absolutely no cost.  =============================================================================== -Copyright (C) 1994-2009 Tecgraf, PUC-Rio. +Copyright (C) 1994-2010 Tecgraf, PUC-Rio.  Permission is hereby granted, free of charge, to any person obtaining a copy  of this software and associated documentation files (the "Software"), to deal diff --git a/im/src/config.mak b/im/src/config.mak index a938100..f0b7966 100755 --- a/im/src/config.mak +++ b/im/src/config.mak @@ -60,7 +60,7 @@ ifneq ($(findstring Win, $(TEC_SYSNAME)), )        USE_EXIF = Yes      endif  else -    SRC += im_sysfile_unix.cpp +  SRC += im_sysfile_unix.cpp  endif  ifdef USE_EXIF diff --git a/im/src/im.def b/im/src/im.def index 41aa175..9c448d5 100755 --- a/im/src/im.def +++ b/im/src/im.def @@ -118,8 +118,10 @@ EXPORTS    imImageSetPalette    imImageCopy    imImageCopyData +  imImageCopyPlane    imImageCreateBased    imImageAddAlpha +  imImageSetAlpha    imDibToHBitmap    imDibLogicalPalette    imDibCaptureScreen diff --git a/im/src/im_binfile.cpp b/im/src/im_binfile.cpp index 7171032..636a9a5 100755 --- a/im/src/im_binfile.cpp +++ b/im/src/im_binfile.cpp @@ -2,7 +2,7 @@   * \brief Binary File Access   *   * See Copyright Notice in im_lib.h - * $Id: im_binfile.cpp,v 1.2 2009/10/01 14:15:47 scuri Exp $ + * $Id: im_binfile.cpp,v 1.3 2010/01/26 19:13:02 scuri Exp $   */ @@ -499,7 +499,7 @@ int imBinFileSetCurrentModule(int pModule)    return old_module;  } -int imBinFileRegisterModule(imBinFileNewFunc pNewFunc) +extern "C" int imBinFileRegisterModule(imBinFileNewFunc pNewFunc)  {    if (iBinFileModuleCount == MAX_MODULES) return -1;    int id = iBinFileModuleCount; diff --git a/im/src/im_dib.cpp b/im/src/im_dib.cpp index 3dd6780..4057f3e 100755 --- a/im/src/im_dib.cpp +++ b/im/src/im_dib.cpp @@ -2,7 +2,7 @@   * \brief Windows DIB   *   * See Copyright Notice in im_lib.h - * $Id: im_dib.cpp,v 1.1 2008/10/17 06:10:16 scuri Exp $ + * $Id: im_dib.cpp,v 1.2 2010/01/26 18:06:01 scuri Exp $   */ @@ -964,7 +964,7 @@ void imDibDecodeToMap(const imDib* dib, unsigned char* map, long* palette)    DIB <-> File  *******************/ -int imDibSaveFile(const imDib* dib, char* filename) +int imDibSaveFile(const imDib* dib, const char* filename)  {     DWORD dwTmp;     HANDLE hFile;                 /* file handle */  diff --git a/im/src/im_file.cpp b/im/src/im_file.cpp index 3bfa779..9a4519a 100755 --- a/im/src/im_file.cpp +++ b/im/src/im_file.cpp @@ -2,7 +2,7 @@   * \brief File Access   *   * See Copyright Notice in im_lib.h - * $Id: im_file.cpp,v 1.5 2009/08/23 23:57:51 scuri Exp $ + * $Id: im_file.cpp,v 1.6 2009/11/23 17:13:05 scuri Exp $   */  #include <stdlib.h> @@ -125,6 +125,7 @@ void imFileClose(imFile* ifile)    if (ifile->line_buffer) free(ifile->line_buffer);    delete attrib_table; +  delete ifileformat;  }  void* imFileHandle(imFile* ifile, int index) diff --git a/im/src/im_format.cpp b/im/src/im_format.cpp index d389743..ad04a3b 100755 --- a/im/src/im_format.cpp +++ b/im/src/im_format.cpp @@ -2,7 +2,7 @@   * \brief File Format Access   *   * See Copyright Notice in im_lib.h - * $Id: im_format.cpp,v 1.2 2008/12/03 15:45:34 scuri Exp $ + * $Id: im_format.cpp,v 1.3 2009/11/23 17:13:05 scuri Exp $   */ @@ -194,7 +194,7 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)          imFileFormatBase* ifileformat = iformat->Create();          *error = ifileformat->Open(file_name);                                                         if (*error != IM_ERR_NONE && *error != IM_ERR_FORMAT)  // Error situation that must abort -        {                                                      // Only IM_ERR_FORMAT is a valid error here +        {                                                      // Only IM_ERR_FORMAT is considered here            free(extension);            delete [] ext_mark;            delete ifileformat; @@ -206,6 +206,11 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)            delete [] ext_mark;            return ifileformat;          } +        else +        { +          /* Other errors, release the format and test another one */ +          delete ifileformat; +        }        }      } @@ -233,6 +238,11 @@ imFileFormatBase* imFileFormatBaseOpen(const char* file_name, int *error)          delete [] ext_mark;          return ifileformat;        } +      else +      { +        /* Other errors, release the format and test another one */ +        delete ifileformat; +      }      }    } @@ -269,9 +279,12 @@ imFileFormatBase* imFileFormatBaseOpenAs(const char* file_name, const char* form    }    else if (*error == IM_ERR_NONE) // Sucessfully oppened the file      return ifileformat; - -  *error = IM_ERR_FORMAT; -  return NULL; +  else +  { +    *error = IM_ERR_FORMAT; +    delete ifileformat; +    return NULL; +  }  }  imFileFormatBase* imFileFormatBaseNew(const char* file_name, const char* format, int *error) diff --git a/im/src/im_image.cpp b/im/src/im_image.cpp index 1fb993d..5f865f8 100755 --- a/im/src/im_image.cpp +++ b/im/src/im_image.cpp @@ -2,7 +2,7 @@   * \brief Image Manipulation   *   * See Copyright Notice in im_lib.h - * $Id: im_image.cpp,v 1.4 2009/08/13 22:34:25 scuri Exp $ + * $Id: im_image.cpp,v 1.7 2010/01/17 18:18:12 scuri Exp $   */  #include <stdlib.h> @@ -273,6 +273,39 @@ void imImageClear(imImage* image)      memset(image->data[image->depth], 0, image->plane_size);  } +template <class T>  +inline void iSet(T *map, T value, int count) +{ +  for (int i = 0; i < count; i++) +  { +    *map++ = value; +  } +} +   +void imImageSetAlpha(imImage* image, float alpha) +{ +  assert(image); + +  if (image->has_alpha) +  { +    switch(image->data_type) +    { +    case IM_BYTE: +      memset(image->data[image->depth], (imbyte)alpha, image->plane_size); +      break;                                                                                 +    case IM_USHORT:                                                                            +      iSet((imushort*)image->data[image->depth], (imushort)alpha, image->plane_size); +      break;                                                                                 +    case IM_INT:                                                                            +      iSet((int*)image->data[image->depth], (int)alpha, image->plane_size); +      break;                                                                                 +    case IM_FLOAT:                                                                            +      iSet((float*)image->data[image->depth], (float)alpha, image->plane_size); +      break;                                                                                 +    } +  } +} +  int imImageIsBitmap(const imImage* image)  {    assert(image); @@ -302,6 +335,15 @@ void imImageCopyData(const imImage* src_image, imImage* dst_image)    }  } +void imImageCopyPlane(const imImage* src_image, int src_plane, imImage* dst_image, int dst_plane) +{ +  assert(src_image); +  assert(dst_image); +  assert(imImageMatchDataType(src_image, dst_image)); + +  memcpy(dst_image->data[dst_plane], src_image->data[src_plane], src_image->plane_size); +} +  imImage* imImageDuplicate(const imImage* image)  {    assert(image); diff --git a/im/src/im_lib.cpp b/im/src/im_lib.cpp index 05a71d8..4860ea7 100755 --- a/im/src/im_lib.cpp +++ b/im/src/im_lib.cpp @@ -2,7 +2,7 @@   * \brief Library Management   *   * See Copyright Notice in im_lib.h - * $Id: im_lib.cpp,v 1.5 2009/10/01 14:43:42 scuri Exp $ + * $Id: im_lib.cpp,v 1.6 2010/04/23 17:45:44 scuri Exp $   */  #include <stdlib.h> @@ -11,8 +11,8 @@  #include "im_lib.h"  /* This appears only here to avoid changing the im_lib.h header for bug fixes */ -#define IM_VERSION_FIX "" -#define IM_VERSION_FIX_NUMBER 0 +#define IM_VERSION_FIX ".1" +#define IM_VERSION_FIX_NUMBER 1  static char *iVersion = "TECVERID.str:IM:LIB:" IM_VERSION IM_VERSION_FIX; diff --git a/im/src/im_process.def b/im/src/im_process.def index 07bba47..7e637e9 100755 --- a/im/src/im_process.def +++ b/im/src/im_process.def @@ -73,6 +73,7 @@ EXPORTS    imProcessBitwiseOp    imProcessBlendConst    imProcessBlend +  imProcessCompose    imProcessCalcRotateSize    imProcessDifusionErrThreshold    imProcessDirectConv diff --git a/im/src/lua5/clua/im_process.clua b/im/src/lua5/clua/im_process.clua index b5274f7..bb91893 100644 --- a/im/src/lua5/clua/im_process.clua +++ b/im/src/lua5/clua/im_process.clua @@ -605,192 +605,194 @@ static const unsigned char B1[] = {  	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x43,   	0x6f, 0x6e, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f, 0x75, 0x72,   	0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63,  -	0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f,  -	0x75, 0x72, 0x63, 0x65, 0x54, 0x77, 0x6f, 0x44, 0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72,  -	0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65,  -	0x78, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e,  -	0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65,  -	0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  -	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x43,  -	0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,  -	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69,  -	0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f,  -	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f,  -	0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64,  -	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d,  -	0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73,  -	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d,  -	0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75,  -	0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64,  -	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75,  -	0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,  -	0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x4e,  -	0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69,  -	0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a,  -	0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67,  -	0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61,  -	0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67,  -	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e,  -	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53,  -	0x74, 0x64, 0x44, 0x65, 0x76, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f,  -	0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,  -	0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72,  -	0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a,  -	0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f,  -	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x41,  -	0x75, 0x74, 0x6f, 0x43, 0x6f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x29, 0x0a,  -	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74,  -	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c,  -	0x79, 0x43, 0x6f, 0x6e, 0x6a, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63,  -	0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,  -	0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x52, 0x47, 0x42, 0x55, 0x6e, 0x69, 0x66,  -	0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  -	0x69, 0x6d, 0x2e, 0x4d, 0x41, 0x50, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65,  -	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50,  -	0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x47, 0x72,  -	0x61, 0x79, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53,  -	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  -	0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f,  -	0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  -	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  -	0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61,  -	0x6d, 0x22, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d,  -	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x59, 0x43, 0x68,  -	0x72, 0x6f, 0x6d, 0x61, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61,  -	0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x5f, 0x69, 0x6d,  -	0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72,  -	0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d,  -	0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69,  -	0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29,  -	0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f,  -	0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65,  -	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f,  -	0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c,  -	0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45,  -	0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70,  -	0x6c, 0x69, 0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63,  -	0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72,  -	0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63,  -	0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a,  -	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x44,  -	0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c,  -	0x69, 0x74, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  -	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c,  -	0x4f, 0x41, 0x54, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  -	0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,  -	0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c,  -	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d,  -	0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,  -	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74,  -	0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73,  -	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61,  -	0x6c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d,  -	0x61, 0x67, 0x65, 0x3a, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f,  -	0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d,  -	0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c,  -	0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61,  -	0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43,  -	0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  -	0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,  -	0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69,  -	0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f,  -	0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,  -	0x73, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x70, 0x61,  -	0x63, 0x6b, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x29, 0x0a, 0x65,  -	0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e,  -	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70,  -	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69,  -	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63,  +	0x65, 0x73, 0x73, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  +	0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x4f,  +	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x77, 0x6f, 0x44, 0x65, 0x73, 0x74, 0x73,  +	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f,  +	0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63,  +	0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65,  +	0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x22, 0x2c,  +	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  +	0x69, 0x6d, 0x2e, 0x43, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63,  +	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d,  +	0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x4e, 0x65, 0x77, 0x20, 0x28,  +	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20,  +	0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63,   	0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69,   	0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73,   	0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73,  -	0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  -	0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f,  -	0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65,  -	0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69,  -	0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20,  -	0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67,  -	0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  +	0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65,  +	0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x28, 0x73,  +	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64,  +	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,  +	0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64,  +	0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72,  +	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x64,  +	0x44, 0x65, 0x76, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6d, 0x61,  +	0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f,  +	0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65,  +	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f,  +	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20,  +	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69,  +	0x70, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d,  +	0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69,  +	0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29,  +	0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d,  +	0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72,  +	0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63,  +	0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63,  +	0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65,  +	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c,  +	0x74, 0x69, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x6a, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53,  +	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  +	0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x52, 0x47, 0x42,  +	0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x4d, 0x41, 0x50, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29,  +	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73,  +	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69,  +	0x7a, 0x65, 0x47, 0x72, 0x61, 0x79, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a,  +	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74,  +	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x48,  +	0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f,  +	0x63, 0x65, 0x73, 0x73, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x48, 0x69, 0x73, 0x74,  +	0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,  +	0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x6c, 0x69,  +	0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73, 0x72, 0x63,  +	0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,  +	0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61,  +	0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72,  +	0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69,  +	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42,  +	0x59, 0x54, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x72,  +	0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49,  +	0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28,  +	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  +	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x69, 0x6d, 0x2e,  +	0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65,  +	0x73, 0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x59, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x28, 0x73,  +	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x2c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29,  +	0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x2c, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a,  +	0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68,  +	0x72, 0x65, 0x65, 0x44, 0x65, 0x73, 0x74, 0x73, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,  +	0x73, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c,  +	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x2c, 0x20, 0x69,  +	0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  +	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x48, 0x53, 0x49, 0x22, 0x2c, 0x20,  +	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42,  +	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63,  +	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53,  +	0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65,  +	0x77, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x20, 0x20,  +	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x72,  +	0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x0a,  +	0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20,  +	0x3d, 0x20, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20,  +	0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x64,  +	0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d,  +	0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73,  +	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x47, 0x52, 0x41, 0x59, 0x29, 0x29, 0x0a, 0x20, 0x20,  +	0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  +	0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28,  +	0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69,  +	0x6d, 0x61, 0x67, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,  +	0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,  +	0x73, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,  +	0x20, 0x69, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65,  +	0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x28, 0x73,  +	0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20,  +	0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,  +	0x20, 0x3d, 0x20, 0x69, 0x6d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74,  +	0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,  +	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x52, 0x47, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x6d,  +	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x6d,  +	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67,  +	0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x73, 0x74, 0x5f,  +	0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f,  +	0x63, 0x65, 0x73, 0x73, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d,  +	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41,  +	0x54, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44,  +	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c,  +	0x61, 0x63, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  +	0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4f, 0x70, 0x22, 0x29,  +	0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73,  +	0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73,  +	0x65, 0x4e, 0x6f, 0x74, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,   	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  -	0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65,  -	0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  -	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x29, 0x0a, 0x4f,  -	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28,  -	0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43,  -	0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  -	0x73, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,  -	0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4f, 0x70, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65,  -	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50,  -	0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x4e, 0x6f, 0x74,  -	0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44,  -	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x4d,  -	0x61, 0x73, 0x6b, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f,  -	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42,  -	0x69, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75,  +	0x42, 0x69, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75,   	0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63,  -	0x65, 0x73, 0x73, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x61, 0x6d, 0x75, 0x74, 0x22, 0x29, 0x0a, 0x4f,  -	0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28,  -	0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,  -	0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,  -	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x4f, 0x6e,  +	0x65, 0x73, 0x73, 0x42, 0x69, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e,   	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22,  -	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e,  -	0x76, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69,  -	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53,  -	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  -	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x0a,  +	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x61, 0x6d, 0x75, 0x74,  +	0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44,  +	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x4e, 0x6f,  +	0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45,  +	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65,  +	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63,  +	0x74, 0x43, 0x6f, 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  +	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x59, 0x54, 0x45, 0x29, 0x0a,   	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74,  -	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f,  -	0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22,  -	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42,  -	0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53,  -	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  -	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72,  -	0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69,  -	0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69,  -	0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44,  -	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65,  -	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  -	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  -	0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4f, 0x6e, 0x65, 0x44,  -	0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65,  -	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x79, 0x44, 0x69, 0x66, 0x66, 0x22, 0x29, 0x0a, 0x4f, 0x6e,  -	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22,  -	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69,  -	0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  -	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59,  -	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  -	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  -	0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68,  +	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76,  +	0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65,  +	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e,  +	0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68,   	0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20,   	0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a,   	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74,  -	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x66, 0x75, 0x73, 0x69, 0x6f,  -	0x6e, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a,  +	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61,  +	0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  +	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59,  +	0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,  +	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  +	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c,  +	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c,  +	0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x54, 0x77, 0x6f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,  +	0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,  +	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x79, 0x44, 0x69, 0x66, 0x66, 0x22,  +	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65,  +	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x79, 0x73, 0x74, 0x65,  +	0x72, 0x65, 0x73, 0x69, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c,  +	0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49,  +	0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f,  +	0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f,  +	0x63, 0x65, 0x73, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, 0x54, 0x68,  +	0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e,  +	0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65,  +	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x69, 0x66,  +	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c,  +	0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65,  +	0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72,  +	0x63, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a,   	0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74,  -	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74,  -	0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53,  -	0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72,  -	0x6f, 0x63, 0x65, 0x73, 0x73, 0x4f, 0x74, 0x73, 0x75, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f,  -	0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e,  -	0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x69,  -	0x6e, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20,  -	0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e,  -	0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75,  -	0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63,  -	0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c,  +	0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4f, 0x74, 0x73, 0x75, 0x54, 0x68, 0x72,  +	0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72,  +	0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65,  +	0x73, 0x73, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c,   	0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6d,   	0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x4f, 0x6e,   	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22,  -	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x22,  +	0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65,  +	0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c,  +	0x2c, 0x20, 0x69, 0x6d, 0x2e, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x6e, 0x69, 0x6c,   	0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x65, 0x44, 0x65,  -	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x73, 0x74, 0x65,  -	0x72, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0a,  +	0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c,  +	0x61, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x4f, 0x6e, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f,  +	0x6e, 0x65, 0x44, 0x65, 0x73, 0x74, 0x28, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50,  +	0x6f, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0a,   };   if (luaL_loadbuffer(L, (const char *)B1, sizeof(B1), "im_process.lua") == 0) lua_call(L, 0, 0); diff --git a/im/src/lua5/im_process.lua b/im/src/lua5/im_process.lua index eefac4b..5c73b29 100755 --- a/im/src/lua5/im_process.lua +++ b/im/src/lua5/im_process.lua @@ -255,6 +255,7 @@ end  TwoSourcesOneDest("ProcessBlendConst")  ThreeSourcesOneDest("ProcessBlend") +TwoSourcesOneDest("ProcessCompose")  OneSourceTwoDests("ProcessSplitComplex")  TwoSourcesOneDest("ProcessMergeComplex", nil, nil, nil, im.CFLOAT) diff --git a/im/src/lua5/imlua_aux.c b/im/src/lua5/imlua_aux.c index e472dca..b26df93 100755 --- a/im/src/lua5/imlua_aux.c +++ b/im/src/lua5/imlua_aux.c @@ -2,7 +2,7 @@   * \brief IM Lua 5 Binding   *   * See Copyright Notice in im_lib.h - * $Id: imlua_aux.c,v 1.2 2009/08/04 21:35:26 scuri Exp $ + * $Id: imlua_aux.c,v 1.3 2010/01/21 18:24:22 scuri Exp $   */  #include <memory.h> @@ -46,7 +46,7 @@ int imlua_newarrayint (lua_State *L, int *value, int count, int start)    lua_newtable(L);    for (i = 0; i < count; i++)    { -    lua_pushnumber(L, value[i]); +    lua_pushinteger(L, value[i]);      lua_rawseti(L, -2, i+start);    }    return 1; diff --git a/im/src/lua5/imlua_image.c b/im/src/lua5/imlua_image.c index 55dcc82..0e8676d 100755 --- a/im/src/lua5/imlua_image.c +++ b/im/src/lua5/imlua_image.c @@ -2,7 +2,7 @@   * \brief IM Lua 5 Binding   *   * See Copyright Notice in im_lib.h - * $Id: imlua_image.c,v 1.5 2009/09/25 18:40:31 scuri Exp $ + * $Id: imlua_image.c,v 1.9 2010/01/17 18:18:12 scuri Exp $   */  #include <string.h> @@ -128,6 +128,15 @@ static int imluaImageAddAlpha (lua_State *L)  }  /*****************************************************************************\ + image:SetAlpha() +\*****************************************************************************/ +static int imluaImageSetAlpha (lua_State *L) +{ +  imImageSetAlpha(imlua_checkimage(L, 1), (float)luaL_checknumber(L, 2)); +  return 0; +} + +/*****************************************************************************\   image:Reshape()  \*****************************************************************************/  static int imluaImageReshape (lua_State *L) @@ -167,6 +176,31 @@ static int imluaImageCopyData (lua_State *L)  }  /*****************************************************************************\ + image:CopyPlane() +\*****************************************************************************/ +static int imluaImageCopyPlane(lua_State *L) +{ +  imImage* src_image = imlua_checkimage(L, 1); +  int src_plane = luaL_checkint(L, 2); +  imImage* dst_image = imlua_checkimage(L, 3); +  int dst_plane = luaL_checkint(L, 4); +  int src_depth, dst_depth; + +  imlua_matchdatatype(L, src_image, dst_image); + +  src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  if (src_plane < 0 || src_plane >= src_depth) +    luaL_argerror(L, 2, "invalid source channel, out of bounds"); + +  dst_depth = dst_image->has_alpha? dst_image->depth+1: dst_image->depth; +  if (dst_plane < 0 || dst_plane >= dst_depth) +    luaL_argerror(L, 4, "invalid destiny channel, out of bounds"); + +  imImageCopyPlane(src_image, src_plane, dst_image, dst_plane); +  return 0; +} + +/*****************************************************************************\   image:Duplicate()  \*****************************************************************************/  static int imluaImageDuplicate (lua_State *L) @@ -751,13 +785,14 @@ static int imluaImage_tostring (lua_State *L)    if (*image_p)    {      imImage *image = *image_p; -    lua_pushfstring(L, "imImage(%p) [width=%d,height=%d,color_space=%s,data_type=%s,depth=%d]",  +    lua_pushfstring(L, "imImage(%p) [width=%d,height=%d,color_space=%s,data_type=%s,depth=%d,has_alpha=%d]",         image_p,        image->width,         image->height,        imColorModeSpaceName(image->color_space),        imDataTypeName(image->data_type), -      image->depth +      image->depth, +      image->has_alpha      );    }    else @@ -956,7 +991,8 @@ static int imluaImage_index (lua_State *L)      int channel = luaL_checkint(L, 2);      /* create channel */ -    if (channel < 0 || channel >= image->depth) +    int depth = image->has_alpha? image->depth+1: image->depth; +    if (channel < 0 || channel >= depth)        luaL_argerror(L, 2, "invalid channel, out of bounds");      imlua_newimagechannel(L, image, channel); @@ -989,9 +1025,11 @@ static const luaL_reg imimage_lib[] = {  static const luaL_reg imimage_metalib[] = {    {"Destroy", imluaImageDestroy},    {"AddAlpha", imluaImageAddAlpha}, +  {"SetAlpha", imluaImageSetAlpha},    {"Reshape", imluaImageReshape},    {"Copy", imluaImageCopy},    {"CopyData", imluaImageCopyData}, +  {"CopyPlane", imluaImageCopyPlane},    {"Duplicate", imluaImageDuplicate},    {"Clone", imluaImageClone},    {"SetAttribute", imluaImageSetAttribute}, diff --git a/im/src/lua5/imlua_process.c b/im/src/lua5/imlua_process.c index 38d39e9..978428b 100755 --- a/im/src/lua5/imlua_process.c +++ b/im/src/lua5/imlua_process.c @@ -2,7 +2,7 @@   * \brief IM Lua 5 Binding   *   * See Copyright Notice in im_lib.h - * $Id: imlua_process.c,v 1.8 2009/10/01 02:56:58 scuri Exp $ + * $Id: imlua_process.c,v 1.11 2010/03/21 22:29:10 scuri Exp $   */  #include <memory.h> @@ -1703,6 +1703,22 @@ static int imluaProcessBlend (lua_State *L)  }  /*****************************************************************************\ + im.ProcessCompose +\*****************************************************************************/ +static int imluaProcessCompose(lua_State *L) +{ +  imImage *src_image1 = imlua_checkimage(L, 1); +  imImage *src_image2 = imlua_checkimage(L, 2); +  imImage *dst_image = imlua_checkimage(L, 3); + +  imlua_match(L, src_image1, src_image2); +  imlua_match(L, src_image1, dst_image); + +  imProcessCompose(src_image1, src_image2, dst_image); +  return 0; +} + +/*****************************************************************************\   im.ProcessSplitComplex  \*****************************************************************************/  static int imluaProcessSplitComplex (lua_State *L) @@ -2009,18 +2025,19 @@ static int imluaProcessMergeHSI (lua_State *L)  \*****************************************************************************/  static int imluaProcessSplitComponents (lua_State *L)  { -  int i; +  int i, src_depth;    imImage *src_image = imlua_checkimage(L, 1);    imImage **dst_image_list;    luaL_checktype(L, 2, LUA_TTABLE); -  if (imlua_getn(L, 2) != src_image->depth) +  src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  if (imlua_getn(L, 2) != src_depth)      luaL_error(L, "number of destiny images must match the depth of the source image"); -  dst_image_list = (imImage**)malloc(sizeof(imImage*)*src_image->depth); +  dst_image_list = (imImage**)malloc(sizeof(imImage*)*src_depth); -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      lua_pushnumber(L, i+1);      lua_gettable(L, 2); @@ -2029,7 +2046,7 @@ static int imluaProcessSplitComponents (lua_State *L)      lua_pop(L, 1);    } -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      int check = imImageMatchDataType(src_image, dst_image_list[i]);      if (!check) free(dst_image_list); @@ -2048,19 +2065,20 @@ static int imluaProcessSplitComponents (lua_State *L)  \*****************************************************************************/  static int imluaProcessMergeComponents (lua_State *L)  { -  int i; +  int i, dst_depth;    imImage** src_image_list;    imImage *dst_image;    luaL_checktype(L, 1, LUA_TTABLE);    dst_image = imlua_checkimage(L, 2); -  if (imlua_getn(L, 1) != dst_image->depth) +  dst_depth = dst_image->has_alpha? dst_image->depth+1: dst_image->depth; +  if (imlua_getn(L, 1) != dst_depth)      luaL_error(L, "number of source images must match the depth of the destination image"); -  src_image_list = (imImage**)malloc(sizeof(imImage*)*dst_image->depth); +  src_image_list = (imImage**)malloc(sizeof(imImage*)*dst_depth); -  for (i = 0; i < dst_image->depth; i++) +  for (i = 0; i < dst_depth; i++)    {      lua_pushnumber(L, i+1);      lua_gettable(L, 1); @@ -2069,7 +2087,7 @@ static int imluaProcessMergeComponents (lua_State *L)      lua_pop(L, 1);    } -  for (i = 0; i < dst_image->depth; i++) +  for (i = 0; i < dst_depth; i++)    {      int check = imImageMatchDataType(src_image_list[i], dst_image);      if (!check) free(src_image_list); @@ -2988,6 +3006,7 @@ static const luaL_reg improcess_lib[] = {    {"ProcessArithmeticConstOp", imluaProcessArithmeticConstOp},    {"ProcessBlendConst", imluaProcessBlendConst},    {"ProcessBlend", imluaProcessBlend}, +  {"ProcessCompose", imluaProcessCompose},    {"ProcessSplitComplex", imluaProcessSplitComplex},    {"ProcessMergeComplex", imluaProcessMergeComplex},    {"ProcessMultipleMean", imluaProcessMultipleMean}, diff --git a/im/src/process/im_analyze.cpp b/im/src/process/im_analyze.cpp index 6fa9405..5a775a0 100755 --- a/im/src/process/im_analyze.cpp +++ b/im/src/process/im_analyze.cpp @@ -2,7 +2,7 @@   * \brief Image Analysis   *   * See Copyright Notice in im_lib.h - * $Id: im_analyze.cpp,v 1.2 2009/09/28 20:19:09 scuri Exp $ + * $Id: im_analyze.cpp,v 1.5 2010/01/22 19:47:56 scuri Exp $   */ @@ -139,7 +139,7 @@ static int DoAnalyzeFindRegions(int width, int height, imbyte* map, imushort* ne    int region_count = 2;  // 0- background, 1-border    imushort* alias_table = new imushort [MAX_COUNT]; -  memset(alias_table, 0, MAX_COUNT); // aliases are all zero at start (not used) +  memset(alias_table, 0, MAX_COUNT*sizeof(imushort)); // aliases are all zero at start (not used)    for (i = 1; i < height; i++)    { @@ -273,7 +273,7 @@ static int DoAnalyzeFindRegionsBorder(int width, int height, imbyte* map, imusho    int region_count = 2;  // still consider: 0- background, 1-border    imushort* alias_table = new imushort [MAX_COUNT]; -  memset(alias_table, 0, MAX_COUNT); // aliases are all zero at start (not used) +  memset(alias_table, 0, MAX_COUNT*sizeof(imushort)); // aliases are all zero at start (not used)    for (i = 0; i < height; i++)    { @@ -981,7 +981,7 @@ void imAnalyzeMeasurePerimeter(const imImage* image, float* perim_data, int regi    imushort* map = (imushort*)image->data[0]; -  memset(perim_data, 0, region_count*sizeof(int)); +  memset(perim_data, 0, region_count*sizeof(float));    int width = image->width;    int height = image->height; @@ -1203,8 +1203,19 @@ void imProcessRemoveByArea(const imImage* image, imImage* NewImage, int connect,    if (end_size == 0)      end_size = image->width*image->height; -  int outside=0; -  if (!inside) outside = 1; +  int outside; +  if (inside) +  { +    /* remove from inside */ +    inside = 0; +    outside = 1; +  } +  else +  { +    /* remove from outside */ +    inside = 1; +    outside = 0; +  }    int* area_data = (int*)malloc(region_count*sizeof(int));    imAnalyzeMeasureArea(region_image, area_data, region_count); diff --git a/im/src/process/im_arithmetic_bin.cpp b/im/src/process/im_arithmetic_bin.cpp index 494b6c0..575e650 100755 --- a/im/src/process/im_arithmetic_bin.cpp +++ b/im/src/process/im_arithmetic_bin.cpp @@ -2,7 +2,7 @@   * \brief Binary Arithmetic Operations   *   * See Copyright Notice in im_lib.h - * $Id: im_arithmetic_bin.cpp,v 1.2 2009/10/01 02:56:58 scuri Exp $ + * $Id: im_arithmetic_bin.cpp,v 1.3 2010/01/08 03:49:05 scuri Exp $   */ @@ -262,6 +262,148 @@ void imProcessBlend(const imImage* src_image1, const imImage* src_image2, const    }  } +#define COMPOSE_OVER(_SRC, _SRC_ALPHA, _DST, _TMP_MULTI, _TMP_ALPHA) (T)(((_SRC_ALPHA)*(_SRC) + (_TMP_MULTI)*(_DST)) / (_TMP_ALPHA)) +#define ALPHA_BLEND(_src,_dst,_alpha) (T)(((_src) * (_alpha) + (_dst) * (max - (_alpha))) / max) + +template <class T, class TA> +static inline T compose_op(const T& v1, const T& v2, const T& alpha1, const T& alpha2, const TA& max) +{ +  if (alpha1 != max)   /* some transparency */                                                                      +  {                                                                                                                     +    if (alpha1 != 0) /* source not full transparent */                                                              +    {                                                                                                                   +      if (alpha2 == 0) /* destiny full transparent */                                                             +      {                                                                                                                 +        return v1;                                                                                            +      }                                                                                                                 +      else if (alpha2 == max) /* destiny opaque */                                                                +      {                                                                                                                 +        return ALPHA_BLEND(v1, v2, alpha1);                                                    +      }                                                                                                                 +      else /* (0<alpha2<max && 0<alpha1<max) destiny and source are semi-transparent */                       +      {                                                                                                                 +        /* Closed Compositing SRC over DST  (see smith95a.pdf)        */                                                +        /* Colors NOT Premultiplied by Alpha                          */                                                +        /* DST = SRC * SRC_ALPHA + DST * DST_ALPHA * (1 - SRC_ALPHA)  */                                                +        /* DST_ALPHA = SRC_ALPHA + DST_ALPHA * (1 - SRC_ALPHA)        */                                                +        /* DST /= DST_ALPHA */                                                                                          +        TA _tmp_multi = alpha2 * (max - alpha1);                                                             +        TA _tmp_src_alpha = alpha1*max;                                                                            +        TA _tmp_alpha = _tmp_src_alpha + _tmp_multi;                                                                   +        return COMPOSE_OVER(v1, _tmp_src_alpha, v2, _tmp_multi, _tmp_alpha);                      +      }                                                                                                                 +    }                                                                                                                   +    else  /* (alpha1 == 0) source full transparent */                                                               +    {                                                                                                                   +      return v2;                                                                                            +    }                                                                                                                   +  }                                                                                                                     +  else  /* (alpha1 == max) source has no alpha = opaque */                                                          +  {                                                                                                                     +    return v1;                                                                                                +  }                                                                                                                     +} + +template <class T, class TA> +static inline T compose_alpha_op(const T& alpha1, const T& alpha2, const TA& max) +{ +  if (alpha1 != max)   /* some transparency */                                                                      +  {                                                                                                                     +    if (alpha1 != 0) /* source not full transparent */                                                              +    {                                                                                                                   +      if (alpha2 == 0) /* destiny full transparent */                                                             +      {                                                                                                                 +        return alpha1;                                                                                      +      }                                                                                                                 +      else if (alpha2 == max) /* destiny opaque */                                                                +      {                                                                                                                 +        /* alpha2 is not changed */                                                                               +        return alpha2; +      }                                                                                                                 +      else /* (0<alpha2<max && 0<alpha1<max) destiny and source are semi-transparent */                       +      {                                                                                                                 +        /* Closed Compositing SRC over DST  (see smith95a.pdf)        */                                                +        /* Colors NOT Premultiplied by Alpha                          */                                                +        /* DST = SRC * SRC_ALPHA + DST * DST_ALPHA * (1 - SRC_ALPHA)  */                                                +        /* DST_ALPHA = SRC_ALPHA + DST_ALPHA * (1 - SRC_ALPHA)        */                                                +        /* DST /= DST_ALPHA */                                                                                          +        TA _tmp_multi = alpha2 * (max - alpha1);                                                             +        TA _tmp_src_alpha = alpha1*max;                                                                            +        TA _tmp_alpha = _tmp_src_alpha + _tmp_multi;                                                                   +        return (T)(_tmp_alpha / max); +      }                                                                                                                 +    }                                                                                                                   +    else  /* (alpha1 == 0) source full transparent */                                                               +    {                                                                                                                   +      /* alpha2 is not changed */                                                                                 +      return alpha2; +    }                                                                                                                   +  }                                                                                                                     +  else  /* (alpha1 == max) source has no alpha = opaque */                                                          +  {                                                                                                                     +    return (unsigned char)max;   /* set destiny as opaque */                                                    +  }                                                                                                                     +} + +template <class T, class TA>  +static void DoCompose(T *map1, T *map2, T *alpha1, T *alpha2, T *map, int count, TA max) +{ +  for (int i = 0; i < count; i++) +    map[i] = compose_op(map1[i], map2[i], alpha1[i], alpha2[i], max); +} + +template <class T, class TA>  +static void DoComposeAlpha(T *alpha1, T *alpha2, T *dst_alpha, int count, TA max) +{ +  for (int i = 0; i < count; i++) +    dst_alpha[i] = compose_alpha_op(alpha1[i], alpha2[i], max); +} + +void imProcessCompose(const imImage* src_image1, const imImage* src_image2, imImage* dst_image) +{ +  int count = src_image1->count,  +      src_alpha = src_image1->depth; + +  if (!src_image1->has_alpha || !src_image2->has_alpha || !dst_image->has_alpha) +    return; + +  for (int i = 0; i < src_image1->depth; i++) +  { +    switch(src_image1->data_type) +    { +    case IM_BYTE: +      DoCompose((imbyte*)src_image1->data[i], (imbyte*)src_image2->data[i], (imbyte*)src_image1->data[src_alpha], (imbyte*)src_image2->data[src_alpha], (imbyte*)dst_image->data[i], count, (int)255); +      break; +    case IM_USHORT: +      DoCompose((imushort*)src_image1->data[i], (imushort*)src_image2->data[i], (imushort*)src_image1->data[src_alpha], (imushort*)src_image2->data[src_alpha], (imushort*)dst_image->data[i], count, (int)65535); +      break; +    case IM_INT: +      DoCompose((int*)src_image1->data[i], (int*)src_image2->data[i], (int*)src_image1->data[src_alpha], (int*)src_image2->data[src_alpha], (int*)dst_image->data[i], count, (int)2147483647); +      break; +    case IM_FLOAT: +      DoCompose((float*)src_image1->data[i], (float*)src_image2->data[i], (float*)src_image1->data[src_alpha], (float*)src_image2->data[src_alpha], (float*)dst_image->data[i], count, 1.0f); +      break; +    } +  } + +  /* one more for the alpha channel */ +  switch(src_image1->data_type) +  { +  case IM_BYTE: +    DoComposeAlpha((imbyte*)src_image1->data[src_alpha], (imbyte*)src_image2->data[src_alpha], (imbyte*)dst_image->data[src_alpha], count, (int)255); +    break; +  case IM_USHORT: +    DoComposeAlpha((imushort*)src_image1->data[src_alpha], (imushort*)src_image2->data[src_alpha], (imushort*)dst_image->data[src_alpha], count, (int)65535); +    break; +  case IM_INT: +    DoComposeAlpha((int*)src_image1->data[src_alpha], (int*)src_image2->data[src_alpha], (int*)dst_image->data[src_alpha], count, (int)2147483647); +    break; +  case IM_FLOAT: +    DoComposeAlpha((float*)src_image1->data[src_alpha], (float*)src_image2->data[src_alpha], (float*)dst_image->data[src_alpha], count, 1.0f); +    break; +  } +} +  static void DoBinaryConstOpCpxReal(imcfloat *map1, float value, imcfloat *map, int count, int op)  {    int i; diff --git a/im/src/process/im_color.cpp b/im/src/process/im_color.cpp index b27d4b3..29933c4 100755 --- a/im/src/process/im_color.cpp +++ b/im/src/process/im_color.cpp @@ -2,7 +2,7 @@   * \brief Color Processing Operations   *   * See Copyright Notice in im_lib.h - * $Id: im_color.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $ + * $Id: im_color.cpp,v 1.2 2010/01/06 20:16:30 scuri Exp $   */  #include <im.h> @@ -142,7 +142,7 @@ void imProcessSplitComponents(const imImage* src_image, imImage** dst_image)    memcpy(dst_image[0]->data[0], src_image->data[0], src_image->plane_size);    memcpy(dst_image[1]->data[0], src_image->data[1], src_image->plane_size);    memcpy(dst_image[2]->data[0], src_image->data[2], src_image->plane_size); -  if (imColorModeDepth(src_image->color_space) == 4)  +  if (imColorModeDepth(src_image->color_space) == 4 || src_image->has_alpha)       memcpy(dst_image[3]->data[0], src_image->data[3], src_image->plane_size);  } @@ -151,7 +151,7 @@ void imProcessMergeComponents(const imImage** src_image, imImage* dst_image)    memcpy(dst_image->data[0], src_image[0]->data[0], dst_image->plane_size);    memcpy(dst_image->data[1], src_image[1]->data[0], dst_image->plane_size);    memcpy(dst_image->data[2], src_image[2]->data[0], dst_image->plane_size); -  if (imColorModeDepth(dst_image->color_space) == 4)  +  if (imColorModeDepth(dst_image->color_space) == 4 || dst_image->has_alpha)       memcpy(dst_image->data[3], src_image[3]->data[0], dst_image->plane_size);  } diff --git a/im/src/process/im_geometric.cpp b/im/src/process/im_geometric.cpp index a0b5129..d4dbed3 100755 --- a/im/src/process/im_geometric.cpp +++ b/im/src/process/im_geometric.cpp @@ -2,7 +2,7 @@   * \brief Geometric Operations   *   * See Copyright Notice in im_lib.h - * $Id: im_geometric.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $ + * $Id: im_geometric.cpp,v 1.2 2010/01/07 19:12:53 scuri Exp $   */ @@ -393,7 +393,8 @@ static void InterlaceSplit(int src_width,  void imProcessRotate90(const imImage* src_image, imImage* dst_image, int dir)  { -  for (int i = 0; i < src_image->depth; i++) +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -418,7 +419,8 @@ void imProcessRotate90(const imImage* src_image, imImage* dst_image, int dir)  void imProcessRotate180(const imImage* src_image, imImage* dst_image)  { -  for (int i = 0; i < src_image->depth; i++) +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -446,9 +448,10 @@ int imProcessRadial(const imImage* src_image, imImage* dst_image, float k1, int    int ret = 0;    int counter = imCounterBegin("Radial Distort"); -  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing..."); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */ -  for (int i = 0; i < src_image->depth; i++) +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -483,9 +486,10 @@ int imProcessSwirl(const imImage* src_image, imImage* dst_image, float k, int or    int ret = 0;    int counter = imCounterBegin("Swirl Distort"); -  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing..."); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */ -  for (int i = 0; i < src_image->depth; i++) +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -559,7 +563,8 @@ int imProcessRotate(const imImage* src_image, imImage* dst_image, double cos0, d    int ret = 0;    int counter = imCounterBegin("Rotate"); -  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing..."); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */    if (src_image->color_space == IM_MAP)    { @@ -567,7 +572,7 @@ int imProcessRotate(const imImage* src_image, imImage* dst_image, double cos0, d    }    else    { -     for (int i = 0; i < src_image->depth; i++) +    for (int i = 0; i < src_depth; i++)      {        switch(src_image->data_type)        { @@ -603,7 +608,8 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0    int ret = 0;    int counter = imCounterBegin("RotateRef"); -  imCounterTotal(counter, dst_image->depth*dst_image->height, "Processing..."); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, "Processing...");  /* size of the destiny image */    if (src_image->color_space == IM_MAP)    { @@ -611,7 +617,7 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0    }    else    { -     for (int i = 0; i < src_image->depth; i++) +    for (int i = 0; i < src_depth; i++)      {        switch(src_image->data_type)        { @@ -645,8 +651,9 @@ int imProcessRotateRef(const imImage* src_image, imImage* dst_image, double cos0  void imProcessMirror(const imImage* src_image, imImage* dst_image)  {    int i; +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -672,8 +679,9 @@ void imProcessMirror(const imImage* src_image, imImage* dst_image)  void imProcessFlip(const imImage* src_image, imImage* dst_image)  {    int i; +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -699,8 +707,9 @@ void imProcessFlip(const imImage* src_image, imImage* dst_image)  void imProcessInterlaceSplit(const imImage* src_image, imImage* dst_image1, imImage* dst_image2)  {    int i; +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { diff --git a/im/src/process/im_resize.cpp b/im/src/process/im_resize.cpp index ddf6e47..4dbaa60 100755 --- a/im/src/process/im_resize.cpp +++ b/im/src/process/im_resize.cpp @@ -2,7 +2,7 @@   * \brief Image Resize   *   * See Copyright Notice in im_lib.h - * $Id: im_resize.cpp,v 1.1 2008/10/17 06:16:33 scuri Exp $ + * $Id: im_resize.cpp,v 1.2 2010/01/07 19:12:53 scuri Exp $   */ @@ -106,9 +106,10 @@ int imProcessReduce(const imImage* src_image, imImage* dst_image, int order)    int ret = 0;    int counter = imCounterBegin("Reduce Size");    const char* int_msg = (order == 1)? "Bilinear Decimation": "Zero Order Decimation"; -  imCounterTotal(counter, src_image->depth*dst_image->height, int_msg); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, int_msg); -  for (int i = 0; i < src_image->depth; i++) +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -149,9 +150,10 @@ int imProcessResize(const imImage* src_image, imImage* dst_image, int order)    int ret = 0;    int counter = imCounterBegin("Resize");    const char* int_msg = (order == 3)? "Bicubic Interpolation": (order == 1)? "Bilinear Interpolation": "Zero Order Interpolation"; -  imCounterTotal(counter, src_image->depth*dst_image->height, int_msg); +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  imCounterTotal(counter, src_depth*dst_image->height, int_msg); -  for (int i = 0; i < src_image->depth; i++) +  for (int i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -219,8 +221,9 @@ static void ReduceBy4(int src_width,  void imProcessReduceBy4(const imImage* src_image, imImage* dst_image)  {    int i; +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; -  for (i = 0; i < src_image->depth; i++) +  for (i = 0; i < src_depth; i++)    {      switch(src_image->data_type)      { @@ -246,7 +249,8 @@ void imProcessReduceBy4(const imImage* src_image, imImage* dst_image)  void imProcessCrop(const imImage* src_image, imImage* dst_image, int xmin, int ymin)  {    int type_size = imDataTypeSize(src_image->data_type); -  for (int i = 0; i < src_image->depth; i++) +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  for (int i = 0; i < src_depth; i++)    {      imbyte *src_map = (imbyte*)src_image->data[i];      imbyte *dst_map = (imbyte*)dst_image->data[i]; @@ -269,6 +273,7 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage    int dst_offset2 = dst_size1+rgn_image->line_size;    int ymax = ymin+rgn_image->height-1;    int rgn_size = rgn_image->line_size; +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth;    if (dst_size2 < 0)    { @@ -280,7 +285,7 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage    if (ymax > src_image->height-1)      ymax = src_image->height-1; -  for (int i = 0; i < src_image->depth; i++) +  for (int i = 0; i < src_depth; i++)    {      imbyte *src_map = (imbyte*)src_image->data[i];      imbyte *rgn_map = (imbyte*)rgn_image->data[i]; @@ -315,7 +320,8 @@ void imProcessInsert(const imImage* src_image, const imImage* rgn_image, imImage  void imProcessAddMargins(const imImage* src_image, imImage* dst_image, int xmin, int ymin)  {    int type_size = imDataTypeSize(src_image->data_type); -  for (int i = 0; i < src_image->depth; i++) +  int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; +  for (int i = 0; i < src_depth; i++)    {      imbyte *dst_map = (imbyte*)dst_image->data[i];      imbyte *src_map = (imbyte*)src_image->data[i]; diff --git a/im/src/tecmake.mak b/im/src/tecmake.mak new file mode 100644 index 0000000..56bd748 --- /dev/null +++ b/im/src/tecmake.mak @@ -0,0 +1,1253 @@ +#-------------------------------------------------------------------------# +#- Tecmake  (POSIX Version)                                              -# +#- Generic Makefile to build applications and libraries at TeCGraf       -# +#- The user makefile usually has the name "config.mak".                  -# +#-------------------------------------------------------------------------# + +#---------------------------------# +# Tecmake Version +VERSION = 4.0 + + +#---------------------------------# +# First target  +.PHONY: build +build: tecmake + + +#---------------------------------# +# System Variables Definitions + +ifndef TEC_UNAME +  # Base Defintions +  TEC_SYSNAME:=$(shell uname -s) +  TEC_SYSVERSION:=$(shell uname -r|cut -f1 -d.) +  TEC_SYSMINOR:=$(shell uname -r|cut -f2 -d.) +  TEC_SYSARCH:=$(shell uname -m) + +  # Fixes +  ifeq ($(TEC_SYSNAME), SunOS) +    TEC_SYSARCH:=$(shell uname -p) +  endif +  ifeq ($(TEC_SYSNAME), IRIX) +    TEC_SYSARCH:=$(shell uname -p) +  endif +  ifeq ($(TEC_SYSNAME), FreeBSD) +    TEC_SYSMINOR:=$(shell uname -r|cut -f2 -d.|cut -f1 -d-) +  endif +  ifeq ($(TEC_SYSNAME), AIX) +    TEC_SYSVERSION:=$(shell uname -v) +    TEC_SYSMINOR:=$(shell uname -r) +    TEC_SYSARCH:=ppc +  endif +  ifeq ($(TEC_SYSNAME), Darwin) +    TEC_SYSARCH:=$(shell uname -p) +  endif + +  ifeq ($(TEC_SYSARCH), i686) +    TEC_SYSARCH:=x86 +  endif +  ifeq ($(TEC_SYSARCH), i386) +    TEC_SYSARCH:=x86 +  endif +  ifeq ($(TEC_SYSARCH), powerpc) +    TEC_SYSARCH:=ppc +  endif +  ifeq ($(TEC_SYSARCH), x86_64) +    TEC_SYSARCH:=x64 +  endif + +  # Compose +  TEC_SYSRELEASE:=$(TEC_SYSVERSION).$(TEC_SYSMINOR) +  TEC_UNAME:=$(TEC_SYSNAME)$(TEC_SYSVERSION)$(TEC_SYSMINOR) + +  # Linux 2.4 and GCC 3.x +  ifeq ($(TEC_UNAME), Linux24) +    GCCVER:=$(shell gcc -dumpversion|cut -f1 -d.) +    ifeq ($(GCCVER), 3) +      TEC_UNAME:=$(TEC_UNAME)g3 +    endif +  endif + +  # Linux 2.6 and GCC 4.x +  ifeq ($(TEC_UNAME), Linux26) +    GCCVER:=$(shell gcc -dumpversion|cut -f1 -d.) +    ifeq ($(GCCVER), 4) +      TEC_UNAME:=$(TEC_UNAME)g4 +    endif +  endif + +  # Linux and PowerPC +  ifeq ($(TEC_SYSNAME), Linux) +    ifeq ($(TEC_SYSARCH), ppc) +      TEC_UNAME:=$(TEC_UNAME)ppc +    endif +  endif + +  # 64-bits Linux +  ifeq ($(TEC_SYSARCH), x64) +    BUILD_64=Yes +    TEC_UNAME:=$(TEC_UNAME)_64 +  endif + +  ifeq ($(TEC_SYSARCH), ia64) +    BUILD_64=Yes +    TEC_UNAME:=$(TEC_UNAME)_ia64 +  endif + +  # Solaris and Intel +  ifeq ($(TEC_SYSNAME), SunOS) +    ifeq ($(TEC_SYSARCH) , x86) +      TEC_UNAME:=$(TEC_UNAME)x86 +    endif +  endif + +  # Darwin and Intel +  ifeq ($(TEC_SYSNAME), Darwin) +  ifeq ($(TEC_SYSARCH), x86) +      TEC_UNAME:=$(TEC_UNAME)x86 +    endif +  endif + +endif + + +#---------------------------------# +# System Info +.PHONY: sysinfo +sysinfo: +	@echo ''; echo 'Tecmake - System Info' +	@echo 'TEC_SYSNAME = $(TEC_SYSNAME)' +	@echo 'TEC_SYSVERSION = $(TEC_SYSVERSION)' +	@echo 'TEC_SYSMINOR = $(TEC_SYSMINOR)' +	@echo 'TEC_SYSARCH = $(TEC_SYSARCH)' +	@echo 'TEC_UNAME = $(TEC_UNAME)'; echo '' + +   +#---------------------------------# +# Known Platforms + +UNAMES = Linux24 Linux24g3 Linux24g3_64 Linux26 Linux26_64 Linux26g4 Linux26g4_64 Linux26_ia64 FreeBSD54 SunOS57 SunOS58 SunOS510 SunOS510_x86 AIX43 IRIX65 IRIX6465 + + +#---------------------------------# +# Directories Definitions + +PROJDIR = .. +SRCDIR  = . +OBJROOT = $(PROJDIR)/obj + + +#---------------------------------# +# Byte Order and Word Size + +ifneq ($(findstring x86, $(TEC_SYSARCH)), ) +   TEC_BYTEORDER = TEC_LITTLEENDIAN +else +ifeq ($(TEC_SYSARCH), arm) +   TEC_BYTEORDER = TEC_LITTLEENDIAN +else +   TEC_BYTEORDER = TEC_BIGENDIAN +endif +endif + +ifeq ($(TEC_SYSARCH), x64) +  TEC_BYTEORDER = TEC_LITTLEENDIAN +  TEC_WORDSIZE = TEC_64 +else +ifdef BUILD_64 +  TEC_WORDSIZE = TEC_64 +else +  TEC_WORDSIZE = TEC_32 +endif +endif + +# Itanium Exception +ifeq ($(TEC_SYSARCH), ia64) +  TEC_BYTEORDER = TEC_LITTLEENDIAN +  TEC_WORDSIZE = TEC_64 +endif + + +#---------------------------------# +# Compilation Flags +STDFLAGS := -Wall +STDDEFS  := -DTEC_UNAME=$(TEC_UNAME) -DTEC_SYSNAME=$(TEC_SYSNAME) -D$(TEC_SYSNAME)=$(TEC_SYSRELEASE) -D$(TEC_BYTEORDER) -D$(TEC_WORDSIZE) -DFUNCPROTO=15 +STDINCS  :=  +OPTFLAGS := -O2 +STDLFLAGS  := r +DEBUGFLAGS := -g   +STDLDFLAGS := -shared +DLIBEXT := so +DLIBPRE := lib +APPEXT := + + +ifneq ($(findstring cygw, $(TEC_UNAME)), ) +  GTK_DEFAULT = Yes +endif   +ifneq ($(findstring Linux, $(TEC_UNAME)), ) +  GTK_DEFAULT = Yes +endif   +ifneq ($(findstring Darwin, $(TEC_UNAME)), ) +  GTK_DEFAULT = Yes +endif   +ifneq ($(findstring FreeBSD, $(TEC_UNAME)), ) +  GTK_DEFAULT = Yes +endif   +ifneq ($(findstring Linux24, $(TEC_UNAME)), ) +  GTK_DEFAULT := +endif   + + +#---------------------------------# +# Tools + +CC       := $(TEC_TOOLCHAIN)gcc +CPPC     := $(TEC_TOOLCHAIN)g++ +FF       := $(TEC_TOOLCHAIN)g77 +RANLIB   := $(TEC_TOOLCHAIN)ranlib +AR       := $(TEC_TOOLCHAIN)ar +DEBUGGER := $(TEC_TOOLCHAIN)gdb +RCC      := $(TEC_TOOLCHAIN)windres  + +# Remote build script +REMOTE  = $(TECMAKE_HOME)/remote + +# Packed LOHs script +LUAPRE = $(TECMAKE_HOME)/luapre.lua + + +#---------------------------------# +# User Configuration File + +MAKENAME = config.mak + +ifdef MF +  MAKENAME = $(MF).mak +endif + +################### +include $(MAKENAME) +################### + + +#---------------------------------# +# Definitions of public variables  + +ifdef LIBNAME +  TARGETNAME = $(LIBNAME) +  MAKETYPE = LIB +else +  TARGETNAME = $(APPNAME) +  MAKETYPE = APP +endif + +ifndef TARGETNAME +  $(error LIBNAME nor APPNAME defined in $(MAKENAME))  +endif + +PROJNAME ?= $(TARGETNAME) + +DEPEND := $(TARGETNAME).dep + +ifdef DEPENDDIR +  DEPEND := $(DEPENDDIR)/$(TARGETNAME).dep.$(TEC_UNAME) +endif + +SRCLUADIR ?= $(SRCDIR) +LOHDIR ?= $(SRCLUADIR) + +ifeq ($(MAKETYPE), APP) +  TARGETROOT ?= $(PROJDIR)/bin +else +  TARGETROOT ?= $(PROJDIR)/lib +endif + +ifneq ($(PROJNAME), $(TARGETNAME)) +  OBJROOT := $(OBJROOT)/$(TARGETNAME) +endif + +ifdef DBG +  STDFLAGS += $(DEBUGFLAGS) +  STDDEFS += -DDEBUG +else +  STDDEFS += -DNDEBUG +  ifdef OPT +    STDFLAGS += $(OPTFLAGS) +    STRIP ?= Yes +  endif +endif + +ifdef BUILD_64 +  ifneq ($(findstring SunOS, $(TEC_UNAME)), ) +    USE_CC = Yes +    BUILD_64_DIR = Yes    +  endif +  ifneq ($(findstring AIX, $(TEC_UNAME)), ) +    USE_CC = Yes +    BUILD_64_DIR = Yes +  endif +  ifneq ($(findstring IRIX, $(TEC_UNAME)), ) +    USE_CC = Yes +    BUILD_64_DIR = Yes +  endif +endif +   +ifdef USE_CC +  CC := cc +  CPPC := CC +  STDFLAGS =  +  UNAMES := $(UNAMES_CC) +  ifdef USE_CC_DIR +    TEC_UNAME := $(TEC_UNAME)cc +  endif +endif + +ifdef BUILD_64 +  ifdef BUILD_64_DIR +    TEC_UNAME := $(TEC_UNAME)_64 +  endif +endif + +TEC_UNAME_DIR ?= $(TEC_UNAME) +TEC_UNAME_LIB_DIR ?= $(TEC_UNAME) +ifdef DBG +  ifdef DBG_LIB_DIR +    TEC_UNAME_LIB_DIR := $(TEC_UNAME_DIR)d +  endif +  ifdef DBG_DIR +    TEC_UNAME_DIR := $(TEC_UNAME_DIR)d +  endif +endif + +OBJDIR := $(OBJROOT)/$(TEC_UNAME_DIR) +TARGETDIR := $(TARGETROOT)/$(TEC_UNAME_DIR) + +# Change linker if any C++ source +ifndef LINKER +  ifneq "$(findstring .cpp, $(SRC))" "" +    LINKER := $(CPPC) +    LD := $(CPPC) +  else +    LINKER := $(CC) +    LD := $(CC) +  endif +endif + + +#---------------------------------# +# LO and LOH Suffix + +ifeq ($(TEC_BYTEORDER), TEC_BIGENDIAN) +  ifeq ($(TEC_WORDSIZE), TEC_64) +    LO_SUFFIX ?= _be64 +  else +    LO_SUFFIX ?= _be32 +  endif +else +  ifeq ($(TEC_WORDSIZE), TEC_64) +    LO_SUFFIX ?= _le64 +  else +    LO_SUFFIX ?= +  endif +endif + + +#---------------------------------# +#  Platform specific variables + +# Definitions for X11 +X11_LIBS := Xmu Xt Xext X11 +#X11_LIB :=  +#X11_INC :=                     #include <X11/X.h> + +# Definitions for OpenGL +OPENGL_LIBS := GLU GL +#OPENGL_LIB :=  +#OPENGL_INC :=                  #include <GL/gl.h>  and possibly   +MOTIFGL_LIB := GLw              #include <GL/GLwMDrawA.h> + +# Definitions for Motif +#MOTIF_LIB :=  +#MOTIF_INC :=                   #include <Xm/Xm.h> + +# Definitions for GLUT +#GLUT_LIB :=  +#GLUT_INC :=  + + +ifneq ($(findstring Linux, $(TEC_UNAME)), ) +  ifdef BUILD_64 +    ifeq ($(TEC_SYSARCH), ia64) +      STDFLAGS += -fPIC +      X11_LIB := /usr/X11R6/lib +    else +      STDFLAGS += -m64 -fPIC +      X11_LIB := /usr/X11R6/lib64 +    endif +  else +    X11_LIB := /usr/X11R6/lib +  endif +  X11_INC := /usr/X11R6/include +  MOTIFGL_LIB :=  +endif + +ifneq ($(findstring IRIX, $(TEC_UNAME)), ) +  LD = ld +  STDLDFLAGS := -elf -shared -rdata_shared -soname lib$(TARGETNAME).so +  RANLIB := /bin/true +  X11_LIBS := Xmu Xt X11 +  ifdef BUILD_64     +    ifdef USE_CC   +      STDFLAGS += -64 -KPIC +      STDLDFLAGS += -64 +      LINKER += -64 +    endif +    X11_LIB := /usr/lib64 +    MOTIF_LIB := /usr/Motif-2.1/lib64 +  else +    X11_LIB := /usr/lib32 +    MOTIF_LIB := /usr/Motif-2.1/lib32 +  endif +  MOTIF_INC = /usr/Motif-2.1/include +endif + +ifneq ($(findstring AIX, $(TEC_UNAME)), )  +  NO_DYNAMIC ?= Yes +  ifdef BUILD_64 +    ifdef USE_CC   +      STDFLAGS += -q64 # to compilers C and C++ +      STDLFLAGS := -X64 $(STDLFLAGS) # to librarian +      STDLDFLAGS += -64 +      LINKER += -q64 # to linker +    endif +  endif +endif + +ifneq ($(findstring HP-UX, $(TEC_UNAME)), ) +  NO_DYNAMIC ?= Yes +  MOTIF_INC := /usr/include/Motif2.1 +  X11_LIBS := Xt Xext X11 +  OPENGL_LIB := /opt/graphics/OpenGL/lib +  OPENGL_INC := /opt/graphics/OpenGL/include +  STDDEFS := -DTEC_UNAME=$(TEC_UNAME) -DTEC_SYSNAME=$(TEC_SYSNAME) -D$(TEC_BYTEORDER) -D$(TEC_WORDSIZE) -DFUNCPROTO=15 +  CC := aCC +  CPPC := aCC +  LINKER := aCC +endif + +ifneq ($(findstring SunOS, $(TEC_UNAME)), ) +  LD = ld +  STDLDFLAGS := -G +  X11_INC := /usr/openwin/share/include +  X11_LIB := /usr/openwin/lib +  MOTIF_INC := /usr/dt/share/include +  MOTIF_LIB := /usr/dt/lib +  OPENGL_INC := /usr/openwin/share/include/X11 +  GLUT_LIB := /usr/local/glut-3.7/lib/glut +  GLUT_INC := /usr/local/glut-3.7/include +  ifdef BUILD_64 +    ifdef USE_CC   +      STDFLAGS += -xarch=v9 -KPIC +      # have to force these PATHs because of a conflict with standard PATHs +      STDLDFLAGS += -64 -L/usr/lib/64 -L/usr/ucblib/sparcv9   +      LINKER += -xarch=v9 +    endif +  endif +endif + +ifneq ($(findstring Darwin, $(TEC_UNAME)), ) +  X11_LIBS := Xmu Xp Xt Xext X11 +  X11_LIB := /usr/X11R6/lib +  X11_INC := /usr/X11R6/include +  MOTIF_INC := /usr/OpenMotif/include +  MOTIF_LIB := /usr/OpenMotif/lib +  ifdef BUILD_DYLIB +    STDLDFLAGS := -dynamiclib -Wl -fno-common -headerpad_max_install_names -undefined dynamic_lookup -install_name lib$(TARGETNAME).dylib +    DLIBEXT := dylib +    STDFLAGS += -fno-common +  else +    STDLDFLAGS := -bundle -undefined dynamic_lookup +  endif +endif + +ifneq ($(findstring FreeBSD, $(TEC_UNAME)), ) +  X11_LIB := /usr/X11R6/lib +  X11_INC := /usr/X11R6/include +endif + + +#---------------------------------# +# Allows an extra configuration file. +ifdef EXTRA_CONFIG +include $(EXTRA_CONFIG) +endif + + +#---------------------------------# +# Tecgraf Libraries Location +TECTOOLS_HOME ?= ../.. + +IUP   ?= $(TECTOOLS_HOME)/iup +CD    ?= $(TECTOOLS_HOME)/cd +IM    ?= $(TECTOOLS_HOME)/im +LUA   ?= $(TECTOOLS_HOME)/lua +LUA51 ?= $(TECTOOLS_HOME)/lua5.1 +LUA52 ?= $(TECTOOLS_HOME)/lua52 + + +#---------------------------------# +#  Pre-defined libraries + +# Library order: +#   user + iupcd + cd + iup + motif + X +# Library path order is reversed + +ifdef USE_LUA +  LUASUFX := +  LIBLUASUFX := 3 +endif + +ifdef USE_LUA4 +  LUASUFX := 4 +  LIBLUASUFX := 4 +  override USE_LUA = Yes +  LUA := $(LUA4) +endif + +ifdef USE_LUA5 +  LUASUFX := 5 +  LIBLUASUFX := 5 +  override USE_LUA = Yes +  LUA := $(LUA5) +endif + +ifdef USE_LUA50 +  LUASUFX := 50 +  LIBLUASUFX := 5 +  override USE_LUA = Yes +  LUA := $(LUA50) +  NO_LUALIB := Yes +endif + +ifdef USE_LUA51 +  LUASUFX := 5.1 +  LIBLUASUFX := 51 +  override USE_LUA = Yes +  LUA := $(LUA51) +  NO_LUALIB := Yes +endif + +ifdef USE_LUA52 +  LUASUFX := 52 +  LIBLUASUFX := 52 +  override USE_LUA = Yes +  LUA := $(LUA52) +  NO_LUALIB := Yes +endif + +ifdef USE_IUP3 +  override USE_IUP = Yes +# Inside Tecgraf only   +  ifndef IUP3_BUILD +#  IUP := $(IUP)3 +  endif +endif  + +ifdef USE_IUPBETA +  IUP := $(IUP)/beta +endif  + +ifdef USE_CDBETA +  CD := $(CD)/beta +endif  + +ifdef USE_IMBETA +  IM := $(IM)/beta +endif  + +ifdef USE_GLUT +  override USE_OPENGL = Yes +endif + +ifdef USE_GDK +  override USE_GTK = Yes +endif + +ifdef USE_IUPCONTROLS +  override USE_CD = Yes +  override USE_IUP = Yes +  ifdef USE_IUPLUA +    ifdef USE_STATIC +      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluacontrols$(LIBLUASUFX).a +    else +      LIBS += iupluacontrols$(LIBLUASUFX) +    endif +    override USE_CDLUA = Yes +  endif +  ifdef USE_STATIC +    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupcontrols.a +  else +    LIBS += iupcontrols +  endif +endif +   +ifdef USE_IMLUA +  override USE_IM = Yes +  ifdef USE_STATIC +    SLIB += $(IM)/lib/$(TEC_UNAME_LIB_DIR)/libimlua$(LIBLUASUFX).a +  else +    LIBS += imlua$(LIBLUASUFX) +  endif +endif + +ifdef USE_CDLUA +  override USE_CD = Yes +  ifdef USE_STATIC +    ifdef USE_IUP +      ifdef USE_OLDNAMES +        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdluaiup$(LIBLUASUFX).a +      endif +    endif +    SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdlua$(LIBLUASUFX).a +  else +    ifdef USE_IUP +      ifdef USE_OLDNAMES +        LIBS += cdluaiup$(LIBLUASUFX) +      endif +    endif +    LIBS += cdlua$(LIBLUASUFX) +  endif +endif + +ifdef USE_IUPLUA +  override USE_IUP = Yes +  ifdef USE_STATIC +    ifdef USE_CD +      ifndef USE_OLDNAMES +        SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluacd$(LIBLUASUFX).a +      endif +    endif +    ifdef USE_OPENGL +      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupluagl$(LIBLUASUFX).a +    endif +    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiuplua$(LIBLUASUFX).a +  else +    ifdef USE_CD +      ifndef USE_OLDNAMES +        LIBS += iupluacd$(LIBLUASUFX) +      endif +    endif +    ifdef USE_OPENGL +      LIBS += iupluagl$(LIBLUASUFX) +    endif +    LIBS += iuplua$(LIBLUASUFX) +  endif +endif + +ifdef USE_LUA +  LUA_LIB ?= $(LUA)/lib/$(TEC_UNAME_LIB_DIR) +  ifdef USE_STATIC +    ifndef NO_LUALIB +      SLIB += $(LUA_LIB)/liblualib$(LUASUFX).a +    endif +    SLIB += $(LUA_LIB)/liblua$(LUASUFX).a +  else +    ifndef NO_LUALIB +      LIBS += lualib$(LUASUFX) +    endif +    ifndef NO_LUALINK +        LIBS += lua$(LUASUFX) +        LDIR += $(LUA_LIB) +    else +      ifneq ($(findstring cygw, $(TEC_UNAME)), ) +        LIBS += lua$(LUASUFX) +        LDIR += $(LUA_LIB) +      endif +    endif +  endif +   +  LUA_INC   ?= $(LUA)/include +  INCLUDES += $(LUA_INC) +   +  LUA_BIN ?= $(LUA)/bin/$(TEC_UNAME) +  BIN2C     := $(LUA_BIN)/bin2c$(LUASUFX) +  LUAC      := $(LUA_BIN)/luac$(LUASUFX) +  LUABIN    := $(LUA_BIN)/lua$(LUASUFX) +endif + +ifdef USE_IUP    +  IUPSUFX :=  +  ifdef USE_IUP3 +    ifdef GTK_DEFAULT +      ifdef USE_MOTIF +        IUPSUFX := mot +      else +        override USE_GTK = Yes +      endif +    else +      ifdef USE_GTK +        IUPSUFX := gtk +      else +        override USE_MOTIF = Yes +      endif +    endif +  else +    override USE_MOTIF = Yes +  endif +  ifdef USE_STATIC +    ifdef USE_CD +      ifndef USE_OLDNAMES +        SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupcd.a +      endif +    endif +    ifdef USE_OPENGL +      SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiupgl.a +    endif +    SLIB += $(IUP)/lib/$(TEC_UNAME_LIB_DIR)/libiup$(IUPSUFX).a +  else +    ifdef USE_CD +      ifndef USE_OLDNAMES +        LIBS += iupcd +      endif +    endif +    ifdef USE_OPENGL +      LIBS += iupgl +    endif +    LIBS += iup$(IUPSUFX) +    LDIR += $(IUP)/lib/$(TEC_UNAME_LIB_DIR) +  endif +  INCLUDES += $(IUP)/include +endif + +ifdef USE_CD +  override USE_X11 = Yes +  ifdef USE_STATIC +    ifdef USE_IUP +      ifdef USE_OLDNAMES +        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdiup.a +      endif +    endif +    ifdef USE_XRENDER +      ifdef USE_OLDNAMES +        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdxrender.a +      else +        SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdcontextplus.a +      endif +    endif +    ifdef USE_GDK +      SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcdgdk.a +    else +      SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libcd.a +    endif +    ifdef USE_XRENDER +      LIBS += Xrender Xft +    else +      ifndef USE_GTK +        ifndef USE_OLDNAMES +          # Freetype is included in GTK +          SLIB += $(CD)/lib/$(TEC_UNAME_LIB_DIR)/libfreetype.a +        endif  +      endif +    endif +  else +    ifdef USE_IUP +      ifdef USE_OLDNAMES +        LIBS += cdiup +      endif +    endif +    ifdef USE_XRENDER +      ifdef USE_OLDNAMES +        LIBS += cdxrender +      else +        LIBS += cdcontextplus +      endif +    endif +    ifdef USE_GDK +      LIBS += cdgdk +    else +      LIBS += cd +    endif +    LDIR += $(CD)/lib/$(TEC_UNAME_LIB_DIR) +    ifdef USE_XRENDER +      LIBS += Xrender Xft +    else +      ifndef USE_GTK +        ifndef USE_OLDNAMES +          # Freetype is included in GTK +          LIBS += freetype +        endif +      endif +    endif +  endif +  INCLUDES += $(CD)/include +endif + +ifdef USE_IM +  ifdef USE_STATIC +    SLIB += $(IM)/lib/$(TEC_UNAME_LIB_DIR)/libim.a +  else +    LIBS += im +    LDIR += $(IM)/lib/$(TEC_UNAME_LIB_DIR) +  endif +  INCLUDES += $(IM)/include +endif + +ifdef USE_GLUT +  LIBS += glut +  LDIR += $(GLUT_LIB) +  STDINCS += $(GLUT_INC) +endif  + +ifdef USE_OPENGL +  override USE_X11 = Yes +  ifdef USE_MOTIF +    ifndef USE_IUP3 +      LIBS += $(MOTIFGL_LIB) +    endif +  endif +  LIBS += $(OPENGL_LIBS) +  LDIR += $(OPENGL_LIB) +  STDINCS += $(OPENGL_INC) +endif  + +ifdef USE_MOTIF +  override USE_X11 = Yes +  LIBS += Xm +  LDIR += $(MOTIF_LIB) +  STDINCS += $(MOTIF_INC) +  ifneq ($(findstring Linux, $(TEC_UNAME)), ) +    X11_LIBS := Xpm $(X11_LIBS) +  endif +  ifneq ($(findstring cygw, $(TEC_UNAME)), )  +    X11_LIBS := Xpm $(X11_LIBS) +  endif +endif + +ifdef USE_GTK +  ifneq ($(findstring Darwin, $(TEC_UNAME)), ) +# Option 1 - Fink GTK port +    GTK_BASE ?= /sw +    LDIR += $(GTK_BASE)/lib +    override USE_X11 = Yes +    LIBS += gtk-x11-2.0 gdk-x11-2.0 pangox-1.0 +# Option 2 - Imendio Framework +#   STDINCS += /Library/Frameworks/Gtk.framework/Headers +#   STDINCS += /Library/Frameworks/GLib.framework/Headers +#   STDINCS += /Library/Frameworks/Cairo.framework/Headers +#   LFLAGS += -framework Gtk +# Option 3 - GTK-OSX Framework +#   GTK_BASE := /Users/cpts/gtk/inst +#   LDIR += $(GTK_BASE)/lib +#   LFLAGS += -framework Carbon +#   LIBS += gtk-quartz-2.0 gdk-quartz-2.0 pangoft2-1.0 + +    LIBS += freetype +  else +    # if not the default, then include it for linker +    # must be before the default +    ifdef GTK_BASE +      LDIR += $(GTK_BASE)/lib +    endif +    GTK_BASE ?= /usr +    override USE_X11 = Yes +    LIBS += gtk-x11-2.0 gdk-x11-2.0 pangox-1.0 +  endif +   +  LIBS += gdk_pixbuf-2.0 pango-1.0 gobject-2.0 gmodule-2.0 glib-2.0 +  STDINCS += $(GTK_BASE)/include/atk-1.0 $(GTK_BASE)/include/gtk-2.0 $(GTK_BASE)/include/cairo $(GTK_BASE)/include/pango-1.0 $(GTK_BASE)/include/glib-2.0 +   +  ifeq ($(TEC_SYSARCH), x64) +    STDINCS += $(GTK_BASE)/lib64/glib-2.0/include $(GTK_BASE)/lib64/gtk-2.0/include +  else +  ifeq ($(TEC_SYSARCH), ia64) +    STDINCS += $(GTK_BASE)/lib64/glib-2.0/include $(GTK_BASE)/lib64/gtk-2.0/include +  else +    STDINCS += $(GTK_BASE)/lib/glib-2.0/include $(GTK_BASE)/lib/gtk-2.0/include +  endif +  endif +  ifneq ($(findstring FreeBSD, $(TEC_UNAME)), ) +    STDINCS += /lib/X11R6/include/gtk-2.0   +  endif +endif + +ifdef USE_QT +  override USE_X11 = Yes +  LIBS += QtGui QtCore +  QT_BASE_INC := /usr/include/qt4 +  STDINCS += $(QT_BASE_INC) $(QT_BASE_INC)/QtCore $(QT_BASE_INC)/QtGui +  STDDEFS += -DQT_DLL -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT +endif + +ifdef USE_X11 +  LIBS += $(X11_LIBS) +  LDIR += $(X11_LIB) +  STDINCS += $(X11_INC) +endif  + +LIBS += m + +ifneq ($(findstring cygw, $(TEC_UNAME)), ) +  # INCLUDES for dependencies, remove references to "c:" and similars +  DEPINCS := $(patsubst c:%, /cygdrive/c%, $(INCLUDES)) +  DEPINCS := $(patsubst d:%, /cygdrive/d%, $(DEPINCS)) +  DEPINCS := $(patsubst x:%, /cygdrive/x%, $(DEPINCS)) +  DEPINCS := $(patsubst t:%, /cygdrive/t%, $(DEPINCS)) +   +  DLIBEXT := dll +  APPEXT := .exe +  # Use the cyg prefix to indicate that it is a Cygwin Posix DLL   +  DLIBPRE := cyg +   +  STDLDFLAGS += -Wl,--out-implib=$(TARGETDIR)/lib$(TARGETNAME).dll.a +endif  + +#---------------------------------# +#  Building compilation flags that are sets + +DEPINCS ?= $(INCLUDES) +DEPINCS := $(addprefix -I, $(DEPINCS)) + +INCLUDES := $(addprefix -I, $(INCLUDES)) +STDINCS := $(addprefix -I, $(STDINCS)) +EXTRAINCS := $(addprefix -I, $(EXTRAINCS)) +DEFINES := $(addprefix -D, $(DEFINES)) + +LIBS := $(addprefix -l, $(LIBS)) +ifdef LDIR +  LDIR := $(addprefix -L, $(LDIR)) +endif + + +#---------------------------------# +# Definitions of private variables + +# Library flags for application and dynamic library linker +LFLAGS += $(LDIR) $(LIBS) +# C compiler flags +CFLAGS   = $(FLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS) +# C++ compiler flags +CXXFLAGS = $(CPPFLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS) + +# Sources with relative path +SOURCES := $(addprefix $(SRCDIR)/, $(SRC)) + +TARGETAPPNAME := $(TARGETNAME)$(APPEXT) +TARGETSLIBNAME := lib$(TARGETNAME).a +TARGETDLIBNAME := $(DLIBPRE)$(TARGETNAME).$(DLIBEXT) + +# Target for applications or libraries +ifeq ($(MAKETYPE), APP) +  TARGET := $(TARGETDIR)/$(TARGETAPPNAME) +else +  ifeq ($(NO_DYNAMIC), Yes)  +    TARGET := $(TARGETDIR)/$(TARGETSLIBNAME) +  else +    TARGET := $(TARGETDIR)/$(TARGETSLIBNAME) $(TARGETDIR)/$(TARGETDLIBNAME) +  endif +endif + +# OBJ: list of .o, without path +# OBJS: list of .o with relative path +OBJ = $(notdir $(SRC)) +OBJ := $(OBJ:.c=.o) +OBJ := $(OBJ:.cpp=.o) +OBJ := $(OBJ:.cxx=.o) +OBJ := $(OBJ:.cc=.o) +OBJ := $(OBJ:.f=.o) +OBJ := $(OBJ:.for=.o) +OBJ := $(OBJ:.rc=.ro) +OBJS = $(addprefix $(OBJDIR)/, $(OBJ)) + +ifdef LOHPACK +  # Package with all LOHs +  LOHS := $(LOHDIR)/$(LOHPACK) +  LOHDIRS := +else +  # LOH: list of .loh, without path +  # LOHS: list of .loh, with relative path +  LO = $(notdir $(SRCLUA)) +  LO := $(LO:.lua=$(LO_SUFFIX).lo) +  LOS = $(addprefix $(OBJROOT)/, $(LO)) + +  LOH = $(notdir $(SRCLUA)) +  LOH := $(LOH:.lua=$(LO_SUFFIX).loh) +  LOHS = $(addprefix $(LOHDIR)/, $(LOH)) +endif + +# Construct VPATH variable +P-SRC = $(dir $(SRC)) +P-SRC += $(dir $(SRCLUA)) +VPATH = .:$(foreach dir,$(P-SRC),$(if $(dir)="./",:$(dir))) + + +#---------------------------------# +# Main Rule - Build Everything that it is necessary + +.PHONY: tecmake  +ifeq ($(MAKETYPE), APP) +  tecmake: print-start directories application scripts +else +  ifeq ($(NO_DYNAMIC), Yes)  +    tecmake: print-start directories static-lib +  else +    tecmake: print-start directories static-lib dynamic-lib +  endif +endif + +.PHONY: print-start +print-start: +	@echo ''; echo 'Tecmake - Starting [ $(TARGETNAME):$(TEC_UNAME) ]' + +   +#---------------------------------# +# Dynamic Library Build + +.PHONY: dynamic-lib +dynamic-lib: $(TARGETDIR)/$(TARGETDLIBNAME) + +$(TARGETDIR)/$(TARGETDLIBNAME) : $(LOHS) $(OBJS) $(EXTRADEPS) +	$(LD) $(STDLDFLAGS) -o $@ $(OBJS) $(SLIB) $(LFLAGS) +	@echo 'Tecmake - Dynamic Library ($@) Done.'; echo '' + +   +#---------------------------------# +# Static Library Build + +.PHONY: static-lib +static-lib: $(TARGETDIR)/$(TARGETSLIBNAME) + +$(TARGETDIR)/$(TARGETSLIBNAME) : $(LOHS) $(OBJS) $(EXTRADEPS) +	$(AR) $(STDLFLAGS) $@ $(OBJS) $(SLIB) $(LCFLAGS) +	-$(RANLIB) $@ +	@echo 'Tecmake - Static Library ($@) Done.'; echo '' + +   +#---------------------------------# +# Application Build + +.PHONY: application +application: $(TARGETDIR)/$(TARGETAPPNAME) + +$(TARGETDIR)/$(TARGETAPPNAME) : $(LOHS) $(OBJS) $(EXTRADEPS) +	$(LINKER) -o $@ $(OBJS) $(SLIB) $(LFLAGS) +	@if [ ! -z "$(STRIP)" ]; then \ +	   echo "Striping debug information" ;\ +	   strip $@ ;\ +	 fi +	@echo 'Tecmake - Application ($@) Done.'; echo '' + +   +#---------------------------------# +#  Application Scripts + +# Script name +SRELEASE := $(SRCDIR)/$(TARGETNAME) + +.PHONY: scripts +ifdef NO_SCRIPTS +  scripts: ; +else +  scripts: $(SRELEASE) ; +endif +   +$(SRELEASE): $(MAKENAME) +	@echo 'Building script $(@F)' +	@echo "#!/bin/csh" > $@ +	@echo "# Script generated automatically by tecmake v$(VERSION)" >> $@ +	@echo "# Remove the comment bellow to set the LD_LIBRARY_PATH if needed." >> $@ +	@echo '#setenv LD_LIBRARY_PATH $(MYLIB1)/lib/$${TEC_UNAME}:$(MYLIB2)/lib/$${TEC_UNAME}:$$LD_LIBRARY_PATH' >> $@ +	@echo 'if ( -r app.env ) source app.env' >> $@ +	@echo 'exec $(TARGETROOT)/$$TEC_UNAME/$(TARGETNAME) $$*' >> $@ +	@chmod a+x $@ + +   +#---------------------------------# +# Directories Creation + +.PHONY: directories +directories: $(OBJDIR) $(TARGETDIR) $(EXTRADIR) $(LOHDIR) + +$(OBJDIR) $(TARGETDIR): +	if [ ! -d $@ ] ; then mkdir -p $@ ; fi + +ifdef EXTRADIR +  $(EXTRADIR): +	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi +else +  $(EXTRADIR): ; +endif + +ifdef LOHDIR +  $(LOHDIR): +	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi +else +  $(LOHDIR): ; +endif + + +#---------------------------------# +# Compilation Rules + +$(OBJDIR)/%.o:  $(SRCDIR)/%.c +	@echo Compiling $(<F)... +	$(CC) -c $(CFLAGS) -o $@ $< + +$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp +	@echo Compiling $(<F)... +	$(CPPC) -c $(CXXFLAGS) -o $@ $< + +$(OBJDIR)/%.o:  $(SRCDIR)/%.cxx +	@echo Compiling $(<F)... +	$(CPPC) -c $(CXXFLAGS) -o $@ $< + +$(OBJDIR)/%.o:  $(SRCDIR)/%.cc +	@echo Compiling $(<F)... +	$(CPPC) -c $(CXXFLAGS) -o $@ $< + +$(OBJDIR)/%.o: $(SRCDIR)/%.f +	@echo Compiling $(<F)... +	$(FC) -c $(FFLAGS) -o $@ $< + +$(OBJDIR)/%.o: $(SRCDIR)/%.for +	@echo Compiling $(<F)... +	$(FC) -c $(FFLAGS) -o $@ $< + +$(OBJDIR)/%.ro:  $(SRCDIR)/%.rc +	@echo Compiling $(<F)... +	$(RCC) $(RCFLAGS) -O coff -o $@ $< + +$(LOHDIR)/%.loh:  $(OBJROOT)/%.lo +	@echo Generating $(<F)... +	$(BIN2C) $< > $@ + +$(OBJROOT)/%$(LO_SUFFIX).lo:  $(SRCLUADIR)/%.lua +	@echo Compiling $(<F)... +	$(LUAC) -o $@ $< + +ifdef LOHPACK +$(LOHDIR)/$(LOHPACK):  $(SRCLUA) +	@echo Generating $(<F)... +	$(LUABIN) $(LUAPRE) $(LUAPREFLAGS) -l $(SRCLUADIR) -o $@ $(SRCLUA) +endif + +   +#---------------------------------# +# Dependencies + +# make depend +#   Build dependencies +.PHONY: depend +depend: $(DEPEND) + +$(DEPEND): $(MAKENAME) +  ifdef SRC +	  @echo "" > $(DEPEND) +	  @which $(CPPC) 2> /dev/null 1>&2 ;\ +	  if [ $$? -eq 0 ]; then \ +	    echo "Building dependencies... (can be slow)" ;\ +	    $(CPPC) $(DEPINCS) $(DEFINES) $(STDDEFS) -MM $(SOURCES) | \ +	    sed -e '1,$$s/^\([^ ]\)/$$(OBJDIR)\/\1/' > $(DEPEND) ;\ +	  else \ +	    echo "" ;\ +	    echo "$(CPPC) not found. Dependencies can not be built." ;\ +	    echo "Must set USE_NODEPEND=Yes." ;\ +	    echo "" ;\ +	    exit 1 ;\ +	  fi +  endif + +################### +ifndef USE_NODEPEND +include $(DEPEND) +endif +################### + + +#---------------------------------# +# Management Rules + +# make clean-extra +#   Remove extra files +.PHONY: clean-extra +clean-extra: +	rm -f $(DEPEND) $(SRELEASE) so_locations +	 +# make clean-lohs +#   Remove Lua object inclusion files +.PHONY: clean-lohs +clean-lohs: +	rm -f $(LOS) $(LOHS) +	 +# make clean-obj +#   Remove object files +.PHONY: clean-obj +clean-obj: +	rm -f $(OBJS) + +# make clean-target +#   Remove target +.PHONY: clean-target +clean-target: +	rm -f $(TARGET) + +# make clean-dir +.PHONY: clean-dir +clean-dir: +	rm -fr $(OBJROOT) $(TARGETROOT) + +# make clean +#   Remove target and object files +.PHONY: clean +clean: clean-target clean-obj + +# make strip +#   Remove symbols from executables +.PHONY: strip +strip: +	test -r $(TARGETDIR)/$(TARGETAPPNAME) && strip $(TARGETDIR)/$(TARGETAPPNAME) + +# make rebuild +#   Rebuild target and object files  +.PHONY: rebuild +rebuild: clean-extra clean-lohs clean-obj clean-target tecmake + +# make relink +#   Rebuild target without rebuilding object files  +.PHONY: relink +relink: clean-target tecmake + +# make clean-all-obj +#   Remove target and object files +.PHONY: clean-all-obj +clean-all-obj: +	@for d in $(UNAMES); do \ +	  (cd $(OBJROOT)/$$d; echo $(OBJ) | xargs rm -f) ;\ +	done + +# make clean-all-target +#   Remove libraries and executables for all platforms +.PHONY: clean-all-target +clean-all-target: +	@for d in $(UNAMES); do \ +	  (rm -f $(TARGETROOT)/$$d/$(TARGETNAME) $(TARGETROOT)/$$d/$(TARGETSLIBNAME) $(TARGETROOT)/$$d/$(TARGETDLIBNAME)) ;\ +	done +  +#---------------------------------# +# Remote build +# There must be aliases in DNS for the known UNAMES +.PHONY: $(UNAMES) +$(UNAMES): +	@cwd=`csh -c "\\pwd"` ; home=`csh -c "cd;\\pwd"` ;\ +	 dir=`echo $$cwd | sed -e "s|$$home/||"` ;\ +	 xterm -bg black -fg lightblue -T "Tecmake: $@ ($(TARGETNAME))" -e ssh $@ $(REMOTE) $$dir $(TECMAKEFLAGS) $(MAKEFLAGS) & 2> /dev/null + + +#---------------------------------# + +.PHONY: version +version: +	@echo "Tecmake Posix Version $(VERSION)" + +#---------------------------------#  | 
