diff options
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)" + +#---------------------------------# |