From: <dm...@us...> - 2006-11-29 05:18:18
|
Revision: 617 http://svn.sourceforge.net/panotools/?rev=617&view=rev Author: dmg Date: 2006-11-28 21:18:15 -0800 (Tue, 28 Nov 2006) Log Message: ----------- 2006-11-28 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.2. * TODO: Updated it. * tools/PTmender.c: Mimic processing of input filenames to match PTstitcher: -- First use command line options -- If no images, then use filename in "i" lines -- If still no images, then use filename in "o" lines Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/tools/PTmender.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-29 04:02:17 UTC (rev 616) +++ trunk/libpano/ChangeLog 2006-11-29 05:18:15 UTC (rev 617) @@ -1,5 +1,15 @@ 2006-11-28 dmg <dm...@uv...> + * version.h (VERSION), configure.ac Upgraded to version 2.9.2. + + * TODO: Updated it. + + * tools/PTmender.c: Mimic processing of input filenames to match + PTstitcher: + -- First use command line options + -- If no images, then use filename in "i" lines + -- If still no images, then use filename in "o" lines + * version.h (VERSION), configure.ac Upgraded to version 2.9.1, updated copyrights. Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-11-29 04:02:17 UTC (rev 616) +++ trunk/libpano/TODO 2006-11-29 05:18:15 UTC (rev 617) @@ -34,18 +34,10 @@ panoinfo: -- Update it. CRITICAL - ---------------------------------------------------------------------- PTmender: - -- Allow the specification of the images in the command line. CRITICAL - -- Allow filenames to be specified in the 'i' line if they don't exist - in the 'o' line. CRITICAL - DESIRABLE: - PTmender is not properly calculating ROI for some images. In Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-29 04:02:17 UTC (rev 616) +++ trunk/libpano/configure.ac 2006-11-29 05:18:15 UTC (rev 617) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.1], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.2], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-11-29 04:02:17 UTC (rev 616) +++ trunk/libpano/tools/PTmender.c 2006-11-29 05:18:15 UTC (rev 617) @@ -62,12 +62,14 @@ "\t-o <prefix>\tPrefix for output filename, defaults to " DEFAULT_OUTPUT_NAME "\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ + "\t-s\t\tSort the filenames provided in the command line in lexicographical order (and only in the command line)\n"\ "\n" -int sorting_function(const void *, const void *); -int hasPathInfo(char *aName); +static int hasPathInfo(char *aName); +static int panoMenderSortingFunction(const void *p1, const void *p2); + static void panoMenderDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) { FILE* scriptFD; @@ -98,20 +100,154 @@ } +void panoMenderSetFileName(fullPath *ptrImageFileName, char *name, fullPath *scriptFileName) +{ + //Only prepend the path to the script to the filenames if the filenames + //don't already have path information + if ( (hasPathInfo(name)) == 0 ) + strcpy(ptrImageFileName->name, scriptFileName->name); + else + strcpy(ptrImageFileName->name, ""); + + InsertFileName(ptrImageFileName, name); +} +static int panoMenderImageFileNamesReadFromScript(fullPath **ptrImageFileNames, fullPath *scriptFileName) +{ + char *script; + AlignInfo alignInfo; + int counter; + int i; + // We don't have any images yet. We read the Script and load them from it. + if (ptDebug) { + fprintf(stderr, "Loading script [%s]\n", scriptFileName->name); + } + + script = LoadScript(scriptFileName); + + if (script == NULL) { + PrintError("Could not load script [%s]", scriptFileName->name); + return -1; + } + + // parse input script and set up an array of input file names + if (ParseScript(script, &alignInfo) != 0) { + // print error + + PrintError("Panorama script parsing error"); + return 0; + } + + // The parser of panotools is really broken. To retrieve each + // input filename it reads the file, + // finds the first filename, then removes it, and writes the rest of the file again + // This is done recursively + + counter = alignInfo.numIm; + + if (counter != 0) { + + // Try to find filenames in input section + if (ptDebug) { + fprintf(stderr, "Found %d images in script file in INPUT section\n", counter); + } + // Allocate their space + if ((*ptrImageFileNames = malloc(512 * counter)) == NULL) { + PrintError("Not enough memory"); + exit(1); + } + + //Iterate over input images and populate input filename array + for (i = 0; i < counter; i ++) { + //If the image filenames don't appear to have any path information, then + //prepend the path to the script (if any) that was specified on the + //command line (Note: this was the only behavior in the original + //PTStitcher. It has been moved into this conditional block because + //the script path could get prepended to an already fully qualified + //filename...not very useful. + panoMenderSetFileName(&((*ptrImageFileNames)[i]), alignInfo.im[i].name, scriptFileName); + + if (ptDebug) { + fprintf(stderr, "Reading image filename [%s] from 'i' line %d\n", (*ptrImageFileNames)[i].name, i); + } + + + } + DisposeAlignInfo(&alignInfo); + } + if (counter == 0) { + // Sometimes the names of the images are not in the 'o' line, then assume they are + // in the 'i' line. + + + // create a temporary copy we can overwrite + fullPath scriptPathName; + + counter = numLines(script, 'o'); + + if (counter == 0) { + PrintError("No images found input file script file (there are no 'o' lines nor 'i' lines"); + exit(1); + } + // Allocate their space + if ((ptrImageFileNames = malloc(512 * counter)) == NULL) { + PrintError("Not enough memory"); + exit(1); + } + + + panoMenderDuplicateScriptFile(scriptFileName->name, script, &scriptPathName); + + if ((ptrImageFileNames = malloc(counter * 512)) == NULL) { + PrintError("Not enough memory\n"); + exit(1); + } + + for (i = 0; i < counter; i++) { + aPrefs* preferences; + if ( (preferences = readAdjustLine(&scriptPathName)) == NULL) { + PrintError("No 'i' line for image number %d", i); + exit(1); + } + + panoMenderSetFileName(&((*ptrImageFileNames)[i]), preferences->im.name, scriptFileName); + + if (ptDebug) { + fprintf(stderr, "Reading image filename [%s] from 'i' line %d\n", + (*ptrImageFileNames)[i].name, i); + } + if (preferences->td != NULL) + free(preferences->td); + + if (preferences->ts != NULL) + free(preferences->ts); + + free(preferences); + + } // end of for (i = 0; i < counter; i++) { + free(script); + + remove(scriptPathName.name); + + } + return counter; +} + + int main(int argc,char *argv[]) { - char *script; int counter; + int sort = 0; // do we sort command line filenames? fullPath *ptrImageFileNames; - AlignInfo alignInfo; + fullPath scriptFileName; fullPath panoFileName; int i; char opt; + char *currentParm; ptrImageFileNames = NULL; counter = 0; strcpy(panoFileName.name, DEFAULT_OUTPUT_NAME); @@ -133,7 +269,9 @@ return(-1); } break; - + case 's': + sort = 1; + break; case 'd': ptDebug = 1; break; @@ -150,11 +288,17 @@ } } - if (optind != argc - 1) { + + if (ptDebug) { + fprintf(stderr, "Number of options to process %d\n", argc- optind); + } + + + if (optind - argc == 0) { PrintError(PT_MENDER_USAGE); return -1; } - + // First we get the name of the script if (StringtoFullPath(&scriptFileName, argv[optind]) !=0) { // success PrintError("Syntax error: Not a valid pathname"); PrintError(PT_MENDER_USAGE); @@ -169,95 +313,56 @@ } // end of if (scriptFileName[0] != 0) { - // Prompt user to specify output filename if not set via command line + if (ptDebug){ + fprintf(stderr,"Script filename %s\n", scriptFileName.name); + } + + + + // optionally we receive a list of filenames + optind ++; + currentParm = NULL; + while (optind < argc ) { + currentParm = argv[optind]; + optind++; + counter++; + + if((ptrImageFileNames = realloc(ptrImageFileNames, counter * 512)) == NULL) { + PrintError("Not enough memory"); + exit(1); + } + + + if (StringtoFullPath(&ptrImageFileNames[counter-1], currentParm) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + if (ptDebug){ + fprintf(stderr,"Getting file from command line %s index %d\n", ptrImageFileNames[counter-1].name, counter); + } + } // end of while loop while (optind < argc ) { + + if (sort && counter > 0) { + // We have filenames that need to be sorted + qsort(ptrImageFileNames, counter, 512, panoMenderSortingFunction);; + } + + + // Handle some lack of information if (strlen(panoFileName.name) == 0) { PrintError("No output filename specified\n"); PrintError(PT_MENDER_USAGE); return -1; } - // We don't have any images yet. We read the Script and load them from it. - if (ptDebug) { - fprintf(stderr, "Loading script [%s]\n", scriptFileName.name); + if (counter == 0) { + counter = panoMenderImageFileNamesReadFromScript(&ptrImageFileNames, &scriptFileName); } - - script = LoadScript(&scriptFileName); - - if (script == NULL) { - PrintError("Could not load script [%s]", scriptFileName.name); - return -1; + if (counter == 0) { + PrintError("No images found input file script file (there are no 'o' lines nor 'i' lines"); + exit(1); } - - // parse input script and set up an array of input file names - if (ParseScript(script, &alignInfo) != 0) { - PrintError("Unable to parse input script"); - return -1; - } - - // TODO redo - - // The parser of panotools is really broken. To retrieve each - // input filename it reads the file, - // finds the first filename, then removes it, and writes the rest of the file again - // This is done recursively - - //an "o" line represents an input image - counter = numLines(script, 'o'); - if (ptDebug) { - fprintf(stderr, "Found %d images in script\n", counter); - } - - DisposeAlignInfo(&alignInfo); - - - // create a temporary copy we can overwrite - fullPath scriptPathName; - panoMenderDuplicateScriptFile(scriptFileName.name, script, &scriptPathName); - - free(script); - - - if ((ptrImageFileNames = malloc(counter * 512)) == NULL) { - PrintError("Not enough memory\n"); - exit(1); - } - - for (i = 0; i < counter; i++) { - aPrefs* preferences; - - if (ptDebug) { - fprintf(stderr, "Reading image filename %d: ", i); - } - if ( (preferences = readAdjustLine(&scriptPathName)) == NULL) { - PrintError("Could not read ScriptFile"); - exit(1); - } - - //Only prepend the path to the script to the filenames if the filenames - //don't already have path information - if ( (hasPathInfo(preferences->im.name)) == 0 ) - strcpy(ptrImageFileNames[i].name, scriptFileName.name); - else - strcpy(ptrImageFileNames[i].name, ""); - - InsertFileName(&ptrImageFileNames[i], preferences->im.name); - - if (ptDebug) { - fprintf(stderr, "%s\n", ptrImageFileNames[i].name); - } - if (preferences->td != NULL) - free(preferences->td); - - if (preferences->ts != NULL) - free(preferences->ts); - - free(preferences); - - } // end of for (i = 0; i < counter; i++) { - - remove(scriptPathName.name); - // By now we should have loaded up the input filename array, the output // panorama name, and the name of the script file (copied to a temporary // directory). Now we can create the output image. @@ -280,7 +385,12 @@ } -int hasPathInfo(char *aName) +static int hasPathInfo(char *aName) { return ((strchr(aName, PATH_SEP) == NULL) ? 0 : 1); } + +static int panoMenderSortingFunction(const void *p1, const void *p2) +{ + return strcmp(p1, p2); +} Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-29 04:02:17 UTC (rev 616) +++ trunk/libpano/version.h 2006-11-29 05:18:15 UTC (rev 617) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.1 " +#define VERSION "2.9.2 " #endif #ifndef PTVERSION_NAME_LONG @@ -38,7 +38,7 @@ #endif #ifndef PTVERSION_FILEVERSIONNUMBER -#define PTVERSION_FILEVERSIONNUMBER 2,9,1,-1 +#define PTVERSION_FILEVERSIONNUMBER 2,9,2,-1 #endif #ifndef PTVERSION_NAME_FILEVERSION This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-11-29 05:22:51
|
Revision: 618 http://svn.sourceforge.net/panotools/?rev=618&view=rev Author: dmg Date: 2006-11-28 21:22:51 -0800 (Tue, 28 Nov 2006) Log Message: ----------- updated usage of PTmender Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/tools/PTmender.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-29 05:18:15 UTC (rev 617) +++ trunk/libpano/ChangeLog 2006-11-29 05:22:51 UTC (rev 618) @@ -1,5 +1,7 @@ 2006-11-28 dmg <dm...@uv...> + * tools/PTmender.c (PT_MENDER_USAGE): Updated usage message + * version.h (VERSION), configure.ac Upgraded to version 2.9.2. * TODO: Updated it. Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-11-29 05:18:15 UTC (rev 617) +++ trunk/libpano/tools/PTmender.c 2006-11-29 05:22:51 UTC (rev 618) @@ -57,12 +57,14 @@ #define PT_MENDER_VERSION "PTmender Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel German\n" -#define PT_MENDER_USAGE "PTmender [options] <script filename>\n\n"\ +#define PT_MENDER_USAGE "PTmender [options] <script filename> <images>*\n\n"\ "Options:\n"\ "\t-o <prefix>\tPrefix for output filename, defaults to " DEFAULT_OUTPUT_NAME "\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ "\t-s\t\tSort the filenames provided in the command line in lexicographical order (and only in the command line)\n"\ + "\n\nIf no images are specified in the command line, then the 'i' lines are used. If 'i' lines do not contain "\ + "a valid filename then the 'o' lines are used.\n"\ "\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-04 07:03:05
|
Revision: 619 http://svn.sourceforge.net/panotools/?rev=619&view=rev Author: dmg Date: 2006-12-03 23:03:04 -0800 (Sun, 03 Dec 2006) Log Message: ----------- 06-12-03 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.3. * tiff.c (panoTiffDisplayInfo): Added function. * parser.c (panoParserFindOLine): Added function. 2006-12-02 dmg <dm...@uv...> * PTinfo.c, Makefile.am (bin_PROGRAMS): Created new program * metadata.c (panoMetadataCropSizeUpdate), tiff.c (panoImageBoundingRectangleCompute): Fixed a bug in the creation of cropped files. The full size tag was not being created. * file.h, file.c (panoFileDeleteMultiple): Created function. Used with -x option. * PTcommon.h, PTcommon.c: Refactored main function from PTcrop and PTuncrop. * tools/PTcrop.c: allow the multiple files in the command line * tools/PTmasker.c, tools/PTroller.c, tools/PTblender.c, tools/PTcrop.c: Add -x switch 2006-11-30 dmg <dm...@uv...> * parser.c (READ_OPT_VAR): Bug fix: changed a format spec from %k to %d 2006-11-28 dmg <dm...@uv...> * tools/PTmender.c (PT_MENDER_USAGE): Updated usage message Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/PTcommon.h trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/file.h trunk/libpano/filter.h trunk/libpano/metadata.c trunk/libpano/parser.c trunk/libpano/tiff.c trunk/libpano/tools/Makefile.am trunk/libpano/tools/PTblender.c trunk/libpano/tools/PTcrop.c trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTroller.c trunk/libpano/tools/PTuncrop.c trunk/libpano/version.h Added Paths: ----------- trunk/libpano/ptfeather.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/ChangeLog 2006-12-04 07:03:04 UTC (rev 619) @@ -1,3 +1,35 @@ +2006-12-03 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.3. + + * tiff.c (panoTiffDisplayInfo): Added function. + + * parser.c (panoParserFindOLine): Added function. + +2006-12-02 dmg <dm...@uv...> + + * PTinfo.c, Makefile.am (bin_PROGRAMS): Created new program + + * metadata.c (panoMetadataCropSizeUpdate), + tiff.c (panoImageBoundingRectangleCompute): Fixed a bug in the + creation of cropped files. The full size tag was not being + created. + + * file.h, file.c (panoFileDeleteMultiple): Created function. Used + with -x option. + + * PTcommon.h, PTcommon.c: Refactored main function from PTcrop + and PTuncrop. + + * tools/PTcrop.c: allow the multiple files in the command line + + * tools/PTmasker.c, tools/PTroller.c, tools/PTblender.c, tools/PTcrop.c: Add -x switch + +2006-11-30 dmg <dm...@uv...> + + * parser.c (READ_OPT_VAR): Bug fix: changed a format spec from %k + to %d + 2006-11-28 dmg <dm...@uv...> * tools/PTmender.c (PT_MENDER_USAGE): Updated usage message Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/PTcommon.c 2006-12-04 07:03:04 UTC (rev 619) @@ -46,6 +46,7 @@ //#include <unistd.h> //#include <stdint.h> //#include <math.h> +#include <unistd.h> int panoFlattenTIFF(fullPath * fullPathImages, int counterImageFiles, @@ -1064,6 +1065,7 @@ panoTiffClose(tiffFile); +#ifdef UNCROP_FISHEYES if (croppedTIFFIntermediate == 0) { // We can't process (yet) all files in cropped mode // To quite the roar from the masses let them think we @@ -1077,8 +1079,8 @@ return (-1); } } +#endif - ////////////////////////////////////////////////////////////////////// if (image1.data != NULL) { @@ -1664,3 +1666,137 @@ } + + +// the functionality of PTcrop and PTuncrop is essentially identical, except for +// the function that they call + +int panoCroppingMain(int argc,char *argv[], int operation, char *version, char *usage, char *defaultPrefix) +{ + char opt; + int ptForceProcessing = 0; + int filesCount; + int retVal; + FILE *testFile; + pano_cropping_parms croppingParms; + char outputPrefix[MAX_PATH_LENGTH]; + int ptDeleteSources = 0; + fullPath *ptrInputFiles; + fullPath *ptrOutputFiles; + int base; + int i; + + // Set defaults + strcpy(outputPrefix, defaultPrefix); + bzero(&croppingParms, sizeof(croppingParms)); + + printf(version); + + //Need enough space for a message to be returned if something goes wrong + + while ((opt = getopt(argc, argv, "p:fqhx")) != -1) { + + // o overwrite + // h -> help + // q -> quiet? + + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'p': + if (strlen(optarg) < MAX_PATH_LENGTH) { + strcpy(outputPrefix, optarg); + } else { + PrintError("Illegal length for output prefix"); + return -1; + } + break; + case 'f': + ptForceProcessing = 1; + break; + case 'x': + ptDeleteSources = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + case 'h': + printf(usage); + exit(0); + default: + break; + } + } + filesCount = argc - optind; + + if (filesCount < 1) { + PrintError("No files specified in the command line"); + printf(usage); + exit(0); + } + // Allocate memory for filenames + if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || + (ptrOutputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { + PrintError("Not enough memory"); + return -1; + } + + // GET input file names + base = optind; + for (; optind < argc; optind++) { + char *currentParm; + + currentParm = argv[optind]; + + if (StringtoFullPath(&ptrInputFiles[optind-base], currentParm) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + } + // Generate output file names + if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { + return -1; + } + + if (!ptForceProcessing) { + char *temp; + if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { + PrintError("Output filename exists %s. Use -f to overwrite", temp); + return -1; + } + } + if (! ptQuietFlag) printf("Cropping %d files\n", filesCount); + + for (i=0; i< filesCount; i++) { + + + if (!ptQuietFlag) { + PrintError("Processing %d reading %s creating %s", i, ptrInputFiles[i].name, ptrOutputFiles[i].name); + } + croppingParms.forceProcessing = ptForceProcessing; + switch (operation) { + case PANO_CROPPING_CROP: + retVal = panoTiffCrop(ptrInputFiles[i].name, ptrOutputFiles[i].name, &croppingParms); + break; + case PANO_CROPPING_UNCROP: + retVal = panoTiffUnCrop(ptrInputFiles[i].name, ptrOutputFiles[i].name, &croppingParms); + break; + default: + PrintError("Illegal operation in panoCroppingMain. Programming error"); + exit(0); + } + + + if (! retVal ) { + PrintError("Error cropping file %s", ptrInputFiles[i].name); + return -1; + } + } + if (ptDeleteSources) { + panoFileDeleteMultiple(ptrInputFiles, filesCount); + } + if (ptrInputFiles != NULL) + free(ptrInputFiles); + if (ptrOutputFiles != NULL) + free(ptrOutputFiles); + + return 0; +} Modified: trunk/libpano/PTcommon.h =================================================================== --- trunk/libpano/PTcommon.h 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/PTcommon.h 2006-12-04 07:03:04 UTC (rev 619) @@ -74,5 +74,10 @@ int ApplyFeather(fullPath * inputFile, fullPath * outputFile, int featherSize); +/*****************/ +#define PANO_CROPPING_UNCROP 1 +#define PANO_CROPPING_CROP 2 +int panoCroppingMain(int argc,char *argv[], int operation, char *version,char *usage, char *defaultPrefix); + #endif Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/configure.ac 2006-12-04 07:03:04 UTC (rev 619) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.2], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.3], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/file.c =================================================================== --- trunk/libpano/file.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/file.c 2006-12-04 07:03:04 UTC (rev 619) @@ -2407,6 +2407,8 @@ // I am sure we will never have more than 10000 images in a project! #define DEFAULT_PREFIX_NUMBER_FORMAT "%04d" + printf("Output prefix %d %s\n",filesCount, outputPrefix); + if (strchr(outputPrefix, '%') == NULL) { if ((strlen(outputPrefix) + strlen(DEFAULT_PREFIX_NUMBER_FORMAT)) >= MAX_PATH_LENGTH) { PrintError("Output prefix too long [%s]", outputPrefix); @@ -2485,3 +2487,19 @@ } #endif + +int panoFileDeleteMultiple(fullPath* files, int filesCount) +{ + extern int ptQuietFlag; + int i; + assert(files != NULL); + for (i = 0; i < filesCount; i++) { + if (!ptQuietFlag) { + PrintError("Deleting %-th source file %s", i, files[i].name); + } + if(remove(files[i].name) != 0) { + PrintError("Unable to remove file %s. Continuing", files[i].name); + } + } + return 1; +} Modified: trunk/libpano/file.h =================================================================== --- trunk/libpano/file.h 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/file.h 2006-12-04 07:03:04 UTC (rev 619) @@ -85,5 +85,7 @@ char *panoFileExists(fullPath *ptrFiles, int filesCount); +int panoFileDeleteMultiple(fullPath* files, int filesCount); + #endif Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/filter.h 2006-12-04 07:03:04 UTC (rev 619) @@ -727,6 +727,11 @@ void nextLine ( register char* line, char** ch ); int numLines ( char* script, char first ); +char *panoParserFindOLine(char *script, int index); + + + + // Memory void DisposeAlignInfo ( AlignInfo *g ); Modified: trunk/libpano/metadata.c =================================================================== --- trunk/libpano/metadata.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/metadata.c 2006-12-04 07:03:04 UTC (rev 619) @@ -73,7 +73,12 @@ metadata->cropInfo.croppedHeight = cropInfo->croppedHeight; metadata->cropInfo.xOffset += cropInfo->xOffset; metadata->cropInfo.yOffset += cropInfo->yOffset; - + metadata->cropInfo.fullWidth = cropInfo->fullWidth; + metadata->cropInfo.fullHeight = cropInfo->fullHeight; + + metadata->isCropped = (cropInfo->croppedWidth != cropInfo->fullWidth) || + (cropInfo->croppedHeight != cropInfo->fullHeight); + // The full size remains the same, // The rest of the metadata should be the same } Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/parser.c 2006-12-04 07:03:04 UTC (rev 619) @@ -78,7 +78,7 @@ } \ if( gl->opt[k].var ) \ { \ - PrintError("Conflict in script: Line %d\n\nMultiple Instances of Variable\n\nImage number: %k", lineNum, k);\ + PrintError("Conflict in script: Line %d\n\nMultiple Instances of Variable\n\nImage number: %d", lineNum, k);\ return -1; \ } \ gl->opt[k].var = 1; \ @@ -1769,3 +1769,45 @@ } +char *panoParserFindOLine(char *script, int index) +{ + char ch; + char *ptr; + int count = 0; + + + ptr = script; + while (ptr != NULL) { + if (*ptr == 'o') { + if (count == index) { + // we have found it + int length; + char *temp; + char *result; + // how big is it? + temp = strchr(ptr, '\n'); + if (temp == NULL) + length = strlen(ptr); + else + length = temp -ptr; + //allocate it + + result = calloc(length + 1, 1); + if (result == NULL) { + PrintError("Not enought memory"); + return NULL; + } else { + strncpy(result, ptr, length); + } + return result; + } else { + count++; + } + } + // find next beginning of line + ptr = strchr(ptr, '\n'); + ptr++; + + } + return NULL; +} Added: trunk/libpano/ptfeather.h =================================================================== --- trunk/libpano/ptfeather.h (rev 0) +++ trunk/libpano/ptfeather.h 2006-12-04 07:03:04 UTC (rev 619) @@ -0,0 +1,37 @@ +/* + * PTfeather.h + * + * Routines related to feathering + * + * Copyright Helmut Dersch and Daniel M. German + * + * Nov 2006 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * Author: Daniel M German dmgerman at uvic doooot ca + * + */ + +#ifndef __PTFEATHER_H__ + +#define __PTFEATHER_H__ + +int panoFeatherFile(fullPath * inputFile, fullPath * outputFile, + int featherSize); + + +#endif Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tiff.c 2006-12-04 07:03:04 UTC (rev 619) @@ -1851,6 +1851,8 @@ // Fill return struct + cropInfo->fullWidth = width; + cropInfo->fullHeight = height; cropInfo->xOffset = xLeft; cropInfo->yOffset = yTop; cropInfo->croppedWidth = 1 + xRight - xLeft ; @@ -1945,6 +1947,7 @@ remove(outputFile); if (rename(tempFile.name, outputFile) != 0) { PrintError("Unable to create output file %s", outputFile); + goto error; } @@ -1961,3 +1964,52 @@ return 0; } + + +int panoTiffDisplayInfo(char *fileName) +{ + pano_Tiff *imageFile; + pano_ImageMetadata *meta; + + char *line = NULL; + + if ((imageFile = panoTiffOpen(fileName)) == NULL) { + PrintError("Could not open TIFF-file %s", fileName); + return 0; + } + meta = &(imageFile->metadata); + printf("Dimensions: %d,%d\n", meta->imageWidth, meta->imageHeight); + if (meta->isCropped) { + printf("Cropped tiff. Full size: %d,%d Offset: %d,%d\n", + meta->cropInfo.fullWidth, meta->cropInfo.fullHeight, + meta->cropInfo.xOffset, meta->cropInfo.yOffset); + } + printf("Samples per pixel: %d\n", meta->samplesPerPixel); + printf("Bits per sample: %d\n", meta->bitsPerSample); + printf("Compression: %d\n", meta->compression); + + if (meta->iccProfile.size == 0) { + printf("Contains ICC profile\n"); + } + if (meta->copyright != NULL){ + printf("Copyright: %s\n", meta->copyright); + } + if (meta->datetime != NULL){ + printf("Date created: %s\n", meta->datetime); + } + if (meta->artist != NULL){ + printf("Photographer: %s\n", meta->artist); + } + printf("Image: %d out of %d\n", meta->imageNumber, meta->imageTotalNumber); + + line = panoParserFindOLine(meta->imageDescription, meta->imageNumber); + if (line != NULL) { + printf("Image Spec: %s\n", line); + free(line); + if (meta->imageDescription) { + printf("Script that created it:\n%s\n", meta->imageDescription); + } + } + + +} Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/Makefile.am 2006-12-04 07:03:04 UTC (rev 619) @@ -35,8 +35,11 @@ AM_CPPFLAGS = $(JAVA_FLAGS) $(LIN_DEFS) $(DAR_DEFS) $(TIFF_FLAGS) $(JPEG_FLAGS) AM_LDFLAGS = -L${top_builddir} -bin_PROGRAMS = panoinfo PToptimizer PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTcrop PTmasker +bin_PROGRAMS = panoinfo PToptimizer PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTcrop PTmasker PTinfo +PTinfo_SOURCES = PTinfo.c +PTinfo_LDADD = -l${PANOLIB} -ltiff + PTmasker_SOURCES = PTmasker.c PTmasker_LDADD = -l${PANOLIB} -ltiff Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/PTblender.c 2006-12-04 07:03:04 UTC (rev 619) @@ -54,6 +54,7 @@ "\t-c\t\tOutput curves smooth\t\t(Output one per each corrected file)\n"\ "\t-m\t\tOutput curves arbitrary map\t(Output one per each corrected file)\n"\ "\t-f\t\fForce processing (ignore warnings)\n"\ + "\t-x\t\tDelete source files (use with care)\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ "\n" @@ -77,6 +78,7 @@ int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) int typeCorrection = 0; int ptForceProcessing; + int ptDeleteSources = 0; ptrInputFiles = NULL; @@ -136,6 +138,9 @@ } outputCurvesType = CB_OUTPUT_CURVE_ARBITRARY; break; + case 'x': + ptDeleteSources = 1; + break; case 'h': printf(PT_BLENDER_USAGE); exit(0); @@ -210,6 +215,12 @@ ptrInputFiles = ptrOutputFiles; ptrOutputFiles = NULL; + if (ptDeleteSources) { + int i; + for (i = 0; i < filesCount; i++) { + remove(ptrInputFiles[i].name); + } + } return 0; } Modified: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/PTcrop.c 2006-12-04 07:03:04 UTC (rev 619) @@ -29,10 +29,16 @@ * */ -#define PT_CROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n" \ +#define DEFAULT_PREFIX "cropped" + + +#define PT_CROP_USAGE "PTuncrop [options] <inputFiles+>\n\n" \ "Options:\n" \ - "-f\t\tForce processing: Overwrite output file if it exists\n" \ - "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n" \ + "\t-p <prefix>\tPrefix for output files (defaults to " DEFAULT_PREFIX "%%4d)\n" \ + "\t-f\t\tForce processing: Overwrite output files if they exists (use with care)\n" \ + "\t-x\t\tDelete source files (use with care)\n"\ + "\t-q\t\tQuiet run\n"\ + "\t-h\t\tShow this message\n"\ "\n" #define PT_CROP_VERSION "PTcrop Version " VERSION ", by Daniel M German\n" @@ -46,69 +52,10 @@ #include "panorama.h" #include "filter.h" #include "PTcommon.h" -#include "pttiff.h" -#include "file.h" + int main(int argc,char *argv[]) { - char opt; - int overwrite = 0; - int filesCount; - int retVal; - char *inputFile, *outputFile; - FILE *testFile; - pano_cropping_parms croppingParms; - - bzero(&croppingParms, sizeof(croppingParms)); - - //Need enough space for a message to be returned if something goes wrong - - printf(PT_CROP_VERSION); - - while ((opt = getopt(argc, argv, "fhq")) != -1) { - - // o overwrite - // h -> help - // q -> quiet? - - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'f': - overwrite = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - case 'h': - printf(PT_CROP_USAGE); - exit(0); - default: - break; - } - } - filesCount = argc - optind; - - if (filesCount != 2) { - printf(PT_CROP_USAGE); - exit(0); - } - - inputFile = argv[optind]; - outputFile = argv[optind+1]; - - if (!overwrite) { - if ((testFile = fopen(outputFile, "r"))!= NULL) { - fprintf(stderr, "Output file already exists. Use -f to overwrite\n"); - fclose(testFile); - exit(1); - } - } - - retVal = panoTiffCrop(inputFile, outputFile, &croppingParms); - - if (retVal == 0) { - return 1; - } - - return 0; + return panoCroppingMain(argc, argv, PANO_CROPPING_CROP, PT_CROP_VERSION, PT_CROP_USAGE, DEFAULT_PREFIX); } Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/PTmasker.c 2006-12-04 07:03:04 UTC (rev 619) @@ -43,11 +43,12 @@ #include "ptstitch.h" #include "pttiff.h" -#define PT_MASKER_USAGE "PTmasker [options] <tiffFiles>+\n\n"\ +#define PT_MASKER_USAGE "PTmasker [options] <tiffFiles>+\n\n" \ "Options:\n"\ "\t-p <prefix>\tPrefix for output files (defaults to masked%%4d)\n"\ "\t-e <feather>\tSize of the feather (defaults to zero)\n"\ "\t-f\t\tForce processing (do not stop at warnings)\n"\ + "\t-x\t\tDelete source files (use with care)\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ "\n" @@ -68,6 +69,7 @@ int base = 0; int ptForceProcessing = 0; int feather = 0; + int ptDeleteSources = 0; ptrInputFiles = NULL; @@ -75,7 +77,7 @@ printf(PT_MASKER_VERSION); - while ((opt = getopt(argc, argv, "p:fqhe:")) != -1) { + while ((opt = getopt(argc, argv, "p:fqhxe:")) != -1) { // o and f -> set output file // h -> help @@ -105,6 +107,9 @@ case 'q': ptQuietFlag = 1; break; + case 'x': + ptDeleteSources = 1; + break; case 'h': printf(PT_MASKER_USAGE); exit(0); @@ -115,6 +120,11 @@ filesCount = argc - optind; + if (filesCount < 1) { + PrintError("No files specified in the command line"); + fprintf(stderr, PT_MASKER_USAGE); + return -1; + } // Allocate memory for filenames if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || (ptrOutputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { @@ -135,12 +145,6 @@ } } - if (filesCount <= 0) { - PrintError("No files specified in the command line"); - fprintf(stderr, PT_MASKER_USAGE); - return -1; - } - // Generate output file names if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { return -1; @@ -173,6 +177,14 @@ if (ptrInputFiles) free(ptrInputFiles); if (ptrOutputFiles) free(ptrOutputFiles); + if (ptDeleteSources) { + int i; + for (i = 0; i < filesCount; i++) { + remove(ptrInputFiles[i].name); + } + } + + return 0; } Modified: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/PTroller.c 2006-12-04 07:03:04 UTC (rev 619) @@ -47,6 +47,7 @@ "Options:\n"\ "\t-o <filename>\tOutput filename (defaults to merged.tif)\n"\ "\t-f\t\tForce processing (do not stop at warnings)\n"\ + "\t-x\t\tDelete source files (use with care)\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ "\n" @@ -67,6 +68,7 @@ int base = 0; fullPath pathName; int ptForceProcessing = 0; + int ptDeleteSources = 0; ptrInputFiles = NULL; @@ -97,6 +99,9 @@ case 'q': ptQuietFlag = 1; break; + case 'x': + ptDeleteSources = 1; + break; case 'h': printf(PT_ROLLER_USAGE); exit(0); @@ -159,6 +164,14 @@ if (ptrInputFiles) free(ptrInputFiles); if (ptrOutputFiles) free(ptrOutputFiles); + if (ptDeleteSources) { + int i; + for (i = 0; i < filesCount; i++) { + remove(ptrInputFiles[i].name); + } + } + + return 0; } Modified: trunk/libpano/tools/PTuncrop.c =================================================================== --- trunk/libpano/tools/PTuncrop.c 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/tools/PTuncrop.c 2006-12-04 07:03:04 UTC (rev 619) @@ -24,85 +24,30 @@ * */ -#define PT_UNCROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n"\ - "Options:\n"\ - "-f\t\tForce processing (do not stop at warnings)\n"\ - "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ - "\n" -#define PT_UNCROP_VERSION "PTuncrop Version " VERSION ", by Daniel M German\n" - #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include "tiffio.h" -#include "panorama.h" -#include "filter.h" #include "PTcommon.h" -#include "pttiff.h" -int main(int argc,char *argv[]) -{ - char opt; - int filesCount; - char *inputFile, *outputFile; - FILE *testFile; - int ptForceProcessing = 0; - pano_cropping_parms cropParms; +#define DEFAULT_PREFIX "uncropped" - - printf(PT_UNCROP_VERSION); +#define PT_UNCROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n"\ + "Options:\n" \ + "\t-p <prefix>\tPrefix for output files (defaults to " DEFAULT_PREFIX "%%4d)\n" \ + "-f\t\tForce processing: Overwrite output file if it exists\n" \ + "\t-x\t\tDelete source files (use with care)\n"\ + "\t-q\t\tQuiet run\n"\ + "\t-h\t\tShow this message\n"\ + "\n" - while ((opt = getopt(argc, argv, "fhq")) != -1) { +#define PT_UNCROP_VERSION "PTuncrop Version " VERSION ", by Daniel M German\n" -// o overwrite -// h -> help -// q -> quiet? - - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'f': - ptForceProcessing = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - case 'h': - printf(PT_UNCROP_USAGE); - exit(0); - default: - break; - } - } - filesCount = argc - optind; - if (filesCount != 2) { - printf(PT_UNCROP_USAGE); - exit(0); - } - - inputFile = argv[optind]; - outputFile = argv[optind+1]; - - if (!ptForceProcessing) { - if ((testFile = fopen(outputFile, "r"))!= NULL) { - fprintf(stderr, "Output file already exists. Use -f to overwrite\n"); - fclose(testFile); - exit(1); - } - } - - // prepare cropping parms - - bzero(&cropParms, sizeof(cropParms)); - cropParms.forceProcessing = ptForceProcessing; - - if (panoTiffUnCrop(inputFile, outputFile, &cropParms)) - return 0; - - - return -1; - +int main(int argc, char *argv[]) +{ + return panoCroppingMain(argc, argv, PANO_CROPPING_UNCROP, PT_UNCROP_VERSION, PT_UNCROP_USAGE, DEFAULT_PREFIX); } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-29 05:22:51 UTC (rev 618) +++ trunk/libpano/version.h 2006-12-04 07:03:04 UTC (rev 619) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.2 " +#define VERSION "2.9.3 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-04 17:52:40
|
Revision: 620 http://svn.sourceforge.net/panotools/?rev=620&view=rev Author: dmg Date: 2006-12-04 09:52:32 -0800 (Mon, 04 Dec 2006) Log Message: ----------- added missing files Added Paths: ----------- trunk/libpano/ptfeather.c trunk/libpano/tools/PTinfo.c Added: trunk/libpano/ptfeather.c =================================================================== --- trunk/libpano/ptfeather.c (rev 0) +++ trunk/libpano/ptfeather.c 2006-12-04 17:52:32 UTC (rev 620) @@ -0,0 +1,543 @@ +/* + * PTfeather.c + * + * Many of the routines are based on the program PTStitcher by Helmut + * Dersch. + * + * Copyright Helmut Dersch and Daniel M. German + * + * Nov 2006 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * Author: Daniel M German dmgerman at uvic doooot ca + * + */ + + +#include "filter.h" + +#include "pttiff.h" +#include "file.h" +#include "PTcommon.h" +#include "ptstitch.h" +#include "metadata.h" + +#include <assert.h> +#include <float.h> + +static void panoFeatherSnowPixel8Bit(unsigned char *pixel, int featherSize, int contribution) +{ + int newPixel = 0; + int randomComponent; + + contribution = contribution / 0x100; + + // TODO: check this expression. It needs to be evaluated in the order specified by the + // parenthesis + + // THIS IS LIKELY TO OVERFLOW a few times... Make sure we do the arithmetic in long long to avoid overflows + randomComponent = ((rand() - RAND_MAX/2) * (0xfeLL /featherSize)) / RAND_MAX; + + newPixel = *pixel - contribution + randomComponent; + + if ( newPixel <= 0 ) + // we can't make it zero. We rely on value 1 to know where the actual edge of an image is + newPixel = 1; + else if (newPixel > 0xff) + *pixel = 0xff; + else + *pixel = newPixel; +} + +static void panoFeatherSnowPixel16Bit(unsigned char *pixel, int featherSize, int contribution) +{ + int newPixel = 0; + int randomComponent; + + uint16_t *pixel16; + + pixel16 = (uint16_t *) pixel; + + // TODO: check this expression. It needs to be evaluated in the order specified by the + // parenthesis + + // THIS IS LIKELY TO OVERFLOW a few times... Make sure we do the arithmetic in long long to avoid overflows + randomComponent = ((rand() - RAND_MAX/2) * (0xfe00LL /featherSize)) / RAND_MAX; + + newPixel = *pixel16 - contribution + randomComponent; + + if ( newPixel <= 0 ) + // we can't make it zero. We rely on value 1 to know where the actual edge of an image is + newPixel = 1; + else if (newPixel > 0xffff) + *pixel16 = 0xffff; + else + *pixel16 = newPixel; +} + +static void panoFeatherSnowPixel(unsigned char *pixel, int featherSize, int contribution, int bitsPerSample) +{ + if (bitsPerSample == 8) + panoFeatherSnowPixel8Bit(pixel, featherSize, contribution); + else if (bitsPerSample == 16) + panoFeatherSnowPixel16Bit(pixel, featherSize, contribution); + else + assert(0); +} + + + +static void panoFeatherSnowingHorizontalLeft(int edi, int ratio, int column, int featherSize, unsigned char *ptrData, Image *image) +{ + int index; + int currentColumn; + + unsigned char *ptrPixel; + int bytesPerPixel = panoImageBytesPerPixel(image); + int bitsPerSample = panoImageBitsPerSample(image); + + for (currentColumn = column + edi/2 + 1, index=1; currentColumn >= column - edi/2; currentColumn--, index++ ) { + + // only operate within the image + // and IF the mask is not zero + // We do not want to "feather" outside the boundary + ptrPixel = ptrData + currentColumn * bytesPerPixel; + + if (currentColumn < 0 || currentColumn >= panoImageWidth(image) || + *ptrPixel == 0) { + continue; + } + + panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + + } ///for (currentColumn = column - edi/2; currentColumn <= column; currentColumn++, index++ ) { + + +} + +static void panoFeatherSnowingVerticalTop(int edi, int ratio, int row, int featherSize, unsigned char *ptrData, Image *image) +{ + int index; + int currentRow; + + unsigned char *ptrPixel; + + int bytesPerLine = panoImageBytesPerLine(image); + int bitsPerSample = panoImageBitsPerSample(image); + + for (currentRow = row + edi/2 + 1, index=1; currentRow >= row - edi/2; currentRow--, index++ ) { + + // only operate within the image + // and IF the mask is not zero + // We do not want to "feather" outside the boundary + ptrPixel = ptrData + currentRow * bytesPerLine; + + if (currentRow < 0 || currentRow >= panoImageHeight(image) || + *ptrPixel == 0) { + continue; + } + + panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + + } ///for (currentRow = row - edi/2; currentRow <= row; currentRow++, index++ ) { + + +} + + +static void panoFeatherSnowingVerticalBottom(int edi, int ratio, int row, int featherSize, unsigned char *ptrData, Image *image) +{ + int index; + int currentRow; + + unsigned char *ptrPixel; + + int bytesPerLine = panoImageBytesPerLine(image); + int bitsPerSample = panoImageBitsPerSample(image); + + + for (currentRow = row - edi/2, index=1; currentRow <= row + edi/2; currentRow++, index++ ) { + + // only operate within the image + // and IF the mask is not zero + // We do not want to "feather" outside the boundary + ptrPixel = ptrData + currentRow * bytesPerLine; + + if (currentRow < 0 || currentRow >= panoImageHeight(image) || + *ptrPixel == 0) { + continue; + } + + panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + + } ///for (currentRow = row - edi/2; currentRow <= row; currentRow++, index++ ) { + + +} + + + + +static void panoFeatherSnowingHorizontalRight(int edi, int ratio, int column, int featherSize, unsigned char *ptrData, Image *image) +{ + int index; + int currentColumn; + int bitsPerSample = panoImageBitsPerSample(image); + unsigned char *ptrPixel; + + int bytesPerPixel = panoImageBytesPerPixel(image); + + for (currentColumn = column - edi/2, index=1; currentColumn <= column + edi/2; currentColumn++, index++ ) { + + // only operate within the image + // and IF the mask is not zero + // We do not want to "feather" outside the boundary + ptrPixel = ptrData + currentColumn * bytesPerPixel; + + if (currentColumn < 0 || currentColumn >= panoImageWidth(image) || + *ptrPixel == 0) { + continue; + } + + panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + + } ///for (currentColumn = column - edi/2; currentColumn <= column; currentColumn++, index++ ) { + +} + +static void panoFeatherMaskReplace(Image* image, unsigned int from, unsigned int to) +{ + + // Replace a given value in the first channel with the desired value + + int row; + int column; + uint16_t *pixel16; + + int bitsPerSample = panoImageBitsPerSample(image); + + int bytesPerPixel = panoImageBytesPerPixel(image); + + int bytesPerLine = panoImageBytesPerLine(image); + + int imageHeight = panoImageHeight(image); + + int imageWidth = panoImageWidth(image); + + unsigned char *pixel = panoImageData(image); + + + for (row = 0; row < imageHeight; row ++) { + + pixel = panoImageData(image) + row * bytesPerLine; + + for (column = 0; column < imageWidth; column ++, pixel += bytesPerPixel) { + if (bitsPerSample == 8) { + if ( *pixel == from ) { + *pixel = to; + } + } + else if (bitsPerSample == 16) { + pixel16 = (uint16_t *) pixel; + if (*pixel16 == from) { + *pixel16 = to; + } + } else { + assert(0); + } + } // for column + + } // for row + +} + +static void panoFeatherImage(Image * image, int featherSize) +{ + + int ratio; + int difference; + unsigned char *pixelPtr; + unsigned char *ptrData; + int column; + int row; + int gradient; + + int bytesPerPixel; + int bytesPerLine; + int imageWidth; + int imageHeight; + int imageIsCropped; + int imageLeftOffset; + int imageTopOffset; + int imageFullWidth; + int imageFullHeight; + int bitsPerSample; + + unsigned char *imageData; + + if (featherSize == 0) + return; + + + // Use local variables so we don't have to make function calls for each + // iteration + bitsPerSample = panoImageBitsPerSample(image); + bytesPerPixel = panoImageBytesPerPixel(image); + bytesPerLine = panoImageBytesPerLine(image); + imageHeight = panoImageHeight(image); + imageWidth = panoImageWidth(image); + imageIsCropped = panoImageIsCropped(image); + imageData = panoImageData(image); + imageFullWidth = panoImageFullWidth(image); + imageFullHeight = panoImageFullHeight(image); + + imageLeftOffset = panoImageOffsetX(image); + imageTopOffset = panoImageOffsetY(image); + + // This is sort of a hack. We replace 0's in the mask with 1's + // we have to "undo" it at the end + + panoFeatherMaskReplace(image, 0, 1); + + ratio = 0xfe00 / featherSize; + + // Horizontal first + + assert(bitsPerSample == 8 || + bitsPerSample == 16); + + ptrData = imageData; + + for ( row = 0; row < imageHeight; row++, ptrData += bytesPerLine) { + int widthToProcess; + + column = 0; + + pixelPtr = ptrData; + + // The following code deals with images that are cropped. We should feather edges only + // if they are not the absolute edge of an image. + + // by default we start in column zero + column = 0; + widthToProcess = imageWidth; + if (imageIsCropped) { + // we need to deal with edges that are not "real" edges (as in the uncropped image + + if ( imageLeftOffset > 0) { + // we have a mask to the left... so we start in column "-1" + column = -1; + } + + if (imageLeftOffset + widthToProcess < imageFullWidth) { + // then "add" one pixel to the right */ + widthToProcess ++; + } + } + + + for (/*empty, see initialization above */; column < widthToProcess -1; + column ++, pixelPtr+=bytesPerPixel) { + + // Values of mask in this pixel and next + int thisPixel; + int nextPixel; + + + if (column < 0) { + // this is the imaginary pixel to the left of the edge that should be feathered + thisPixel = 1; + } else { + thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerPixel, 0); + } + + if (column >= imageWidth -1) { + // this is the imaginary pixel to the right of the edge that should be feathered + nextPixel = 1; + } else { + nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerPixel, bytesPerPixel, 0); + } + + if (thisPixel != 0 && nextPixel != 0) { + + difference = thisPixel - nextPixel; + + // This operation needs to be done here, otherwise 0x100/ratio will underflow + if (bitsPerSample == 8) { + gradient = (abs(difference) * 0x100LL) / ratio; + } + else if (bitsPerSample == 16) { + gradient = abs(difference) / ratio; + } else + assert(0); + + if ( gradient > 1 ) { // + + // if difference is positive, which means we are moving from a darker are to a softer area + if ( difference > 0 ) { + + panoFeatherSnowingHorizontalRight(gradient, ratio, column, featherSize, ptrData, image); + + } else if ( difference < 0 ) { + panoFeatherSnowingHorizontalLeft(gradient, ratio, column, featherSize, ptrData, image); + + } else { // difference == 0 + ; // do nothing in this case + } + + } // + + } // + + } // for column... + + } // for row + + // We need to do the same in the orthogonal direction + // Sometimes I wished I had iterators over an image... + + + ptrData = imageData; + + for (column = 0; column < image->width; column ++, ptrData+=bytesPerPixel) { + int heightToProcess; + + // The following code deals with images that are cropped. We should feather edges only + // if they are not the absolute edge of an image. + + // by default we start in column zero + row = 0; + heightToProcess = imageHeight; + + if (imageIsCropped) { + // we need to deal with edges that are not "real" edges (as in the uncropped image + int imageTopOffset; + + imageTopOffset = panoImageOffsetY(image); + + if ( imageTopOffset > 0) { + // we have a mask to the left... so we start in column "-1" + row = -1; + } + + if (imageTopOffset + heightToProcess < imageFullHeight) { + // then "add" one pixel to the right */ + heightToProcess ++; + } + } + + pixelPtr = ptrData; + for (/*empty, see initialization above */; row < heightToProcess - 1; + row++, pixelPtr += bytesPerLine) { + int thisPixel; + int nextPixel; + + // get pixel in current row + // with pixel in the next row + + if (row < 0) { + // this is the imaginary pixel to the left of the edge that should be feathered + thisPixel = 1; + } else { + thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerPixel, 0); + } + + if (row >= imageHeight -1) { + // this is the imaginary pixel to the right of the edge that should be feathered + nextPixel = 1; + } else { + nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerLine, bytesPerPixel, 0); + } + + + if (thisPixel != 0 && nextPixel != 0) { + + difference = thisPixel - nextPixel; + + // This operation needs to be done here, otherwise 0x100/ratio will underflow + if (bitsPerSample == 8) { + gradient = (abs(difference) * 0x100LL) / ratio; + } + else if (bitsPerSample == 16) { + gradient = abs(difference) / ratio; + } else + assert(0); + + if ( gradient > 1 ) { // + + // if difference is positive, which means we are moving from a darker are to a softer area + if ( difference > 0 ) { + + panoFeatherSnowingVerticalBottom(gradient, ratio, row, featherSize, ptrData, image); + + } else if ( difference < 0 ) { + + panoFeatherSnowingVerticalTop(gradient, ratio, row, featherSize, ptrData, image); + + } else { // difference == 0 + ; // do nothing in this case + } + + } // + + } // + + } // for column... + + } // for row + + + panoFeatherMaskReplace(image, 1, 0); + +} + + +int panoFeatherFile(fullPath * inputFile, fullPath * outputFile, + int featherSize) +{ + Image image; + if (panoTiffRead(&image, inputFile->name) == 0) { + PrintError("Could not open TIFF-file [%s]", inputFile->name); + return 0; + } + + if (panoImageBitsPerSample(&image) == 8 || + panoImageBitsPerSample(&image) == 16) { + panoFeatherImage(&image, featherSize); + } + else { + fprintf(stderr, + "Apply feather not supported for this image type (%d bitsPerPixel)\n", + (int) image.bitsPerPixel); + exit(1); + } + + if (panoTiffWrite(&image, outputFile->name) == 0) { + PrintError("Could not write TIFF-file [%s]", outputFile->name); + return 0; + } + + ///XXXXXXXXXXXXX we need to properly release the memory allocated + // including themetatada + + + myfree((void **) image.data); + + return 1; + +} + Added: trunk/libpano/tools/PTinfo.c =================================================================== --- trunk/libpano/tools/PTinfo.c (rev 0) +++ trunk/libpano/tools/PTinfo.c 2006-12-04 17:52:32 UTC (rev 620) @@ -0,0 +1,127 @@ +/* + * PTinfo + * + * Based on the program PTStitcher by Helmut Dersch. + * + * Displays information about an image created with panotools + * + * Nov 2006 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * Author: Daniel M German dmgerman at uvic doooot ca + * + */ + + +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <dirent.h> +#include <unistd.h> +#include <errno.h> + + +#include "filter.h" +#include "panorama.h" +#include "PTcommon.h" +#include "ptstitch.h" +#include "pttiff.h" + +#define PT_INFO_USAGE "PTinfo [options] <tiffFiles>+\n\n"\ + "Options:\n"\ + "\t-h\t\tShow this message\n"\ + "\n" + +#define PT_INFO_VERSION "PTinfo Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" + +int main(int argc,char *argv[]) +{ + char opt; + fullPath *ptrInputFiles; + fullPath *ptrOutputFiles; + int i; + + int counter; + char outputPrefix[MAX_PATH_LENGTH]; + int filesCount; + int base = 0; + int ptForceProcessing = 0; + int feather = 0; + int ptDeleteSources = 0; + + ptrInputFiles = NULL; + + counter = 0; + + printf(PT_INFO_VERSION); + + while ((opt = getopt(argc, argv, "p:fqhxe:")) != -1) { + + // o and f -> set output file + // h -> help + // q -> quiet? + // k -> base image, defaults to first + // s -> compute seams + + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'q': + ptQuietFlag = 1; + break; + case 'h': + printf(PT_INFO_USAGE); + exit(0); + default: + break; + } + } + + filesCount = argc - optind; + + if (filesCount < 1) { + PrintError("No files specified in the command line"); + fprintf(stderr, PT_INFO_USAGE); + return -1; + } + // Allocate memory for filenames + if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { + PrintError("Not enough memory"); + return -1; + } + + base = optind; + for (; optind < argc; optind++) { + char *currentParm; + + currentParm = argv[optind]; + + if (StringtoFullPath(&ptrInputFiles[optind-base], currentParm) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + } + + for (i=0; i< filesCount ; i++) { + PrintError("Filename %d %s", i, ptrInputFiles[i].name); + panoTiffDisplayInfo(ptrInputFiles[i].name); + } + + return 0; + +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-04 18:01:32
|
Revision: 621 http://svn.sourceforge.net/panotools/?rev=621&view=rev Author: dmg Date: 2006-12-04 10:01:29 -0800 (Mon, 04 Dec 2006) Log Message: ----------- Uncommented getCropInformation Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-04 17:52:32 UTC (rev 620) +++ trunk/libpano/ChangeLog 2006-12-04 18:01:29 UTC (rev 621) @@ -1,3 +1,8 @@ +2006-12-04 dmg <dm...@uv...> + + * PTcommon.c: Uncommented getCropInformation. It is still being + used in the PDF code. + 2006-12-03 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.3. Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-04 17:52:32 UTC (rev 620) +++ trunk/libpano/PTcommon.c 2006-12-04 18:01:29 UTC (rev 621) @@ -529,7 +529,6 @@ //printf("ROI: %d,%d - %d, %d\n", ROIRect->left, ROIRect->top, ROIRect->right, ROIRect->bottom); } -#if 0 // NO LONGER NEEDED @@ -552,6 +551,8 @@ } +#if 0 + void setFullSizeImageParameters(pt_tiff_parms * imageParameters, CropInfo * crop_info) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-12 07:07:12
|
Revision: 622 http://svn.sourceforge.net/panotools/?rev=622&view=rev Author: dmg Date: 2006-12-11 23:07:12 -0800 (Mon, 11 Dec 2006) Log Message: ----------- 2006-12-11 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.4. * tools/PTmender.c: Fixed a bug in the processing of the input files. * queryfeature.c: Added lambert projection * math.c (erect_lambert, lambert_erect): Added lambert projection * filter.h: Added Lambert projection * panorama.h (enum): Added Lambert projection * adjust.c (SetMakeParams, SetInvMakeParams): Added Lambert projection * parser.c (readAdjust,ParseScript): Added Lambert projection. * adjust.c (SetInvMakeParams): Corrected error message. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/adjust.c trunk/libpano/configure.ac trunk/libpano/filter.h trunk/libpano/math.c trunk/libpano/panorama.h trunk/libpano/parser.c trunk/libpano/queryfeature.c trunk/libpano/tools/PTmender.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/ChangeLog 2006-12-12 07:07:12 UTC (rev 622) @@ -1,3 +1,23 @@ +2006-12-11 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.4. + + * tools/PTmender.c: Fixed a bug in the processing of the input files. + + * queryfeature.c: Added lambert projection + + * math.c (erect_lambert, lambert_erect): Added lambert projection + + * filter.h: Added Lambert projection + + * panorama.h (enum): Added Lambert projection + + * adjust.c (SetMakeParams, SetInvMakeParams): Added Lambert projection + + * parser.c (readAdjust,ParseScript): Added Lambert projection. + + * adjust.c (SetInvMakeParams): Corrected error message. + 2006-12-04 dmg <dm...@uv...> * PTcommon.c: Uncommented getCropInformation. It is still being Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/adjust.c 2006-12-12 07:07:12 UTC (rev 622) @@ -674,6 +674,7 @@ case _equirectangular: case _fisheye_ff: case _panorama: + case _lambert: case _mercator: case _sinusoidal: // horizontal pixels per degree @@ -770,6 +771,10 @@ { SetDesc(stack[i], erect_mercator, &(mp->distance) ); i++; // Convert mercator to sphere } + else if(pn->format == _lambert) + { + SetDesc(stack[i], erect_lambert, &(mp->distance) ); i++; // Convert lambert to sphere + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], erect_transmercator, &(mp->distance) ); i++; // Convert transverse mercator to sphere @@ -915,6 +920,7 @@ case _equirectangular: case _fisheye_ff: case _panorama: + case _lambert: case _mercator: case _sinusoidal: // horizontal pixels per degree @@ -932,7 +938,7 @@ break; default: // unknown - PrintError ("SetMakeParams: Unsupported panorama projection"); + PrintError ("SetInvMakeParams: Unsupported panorama projection"); // no way to report an error back to the caller... mp->distance = 1; } @@ -952,7 +958,7 @@ mp->scale[0] = ((double) im->width) / a / mp->distance; break; default: - PrintError ("SetMakeParams: Unsupported input image projection"); + PrintError ("SetInvMakeParams: Unsupported input image projection"); // no way to report an error back to the caller... mp->scale[1] = 1; } @@ -1079,6 +1085,10 @@ { SetDesc(stack[i], mercator_erect, &(mp->distance) ); i++; // Convert sphere to sphere } + else if(pn->format == _lambert) + { + SetDesc(stack[i], lambert_erect, &(mp->distance) ); i++; // Convert sphere to lambert + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], transmercator_erect, &(mp->distance) ); i++; // Convert sphere to transverse mercator @@ -2474,7 +2484,9 @@ if( g->pano.format != _rectilinear && g->pano.format != _panorama && g->pano.format != _equirectangular && g->pano.format != _fisheye_ff && g->pano.format != _stereographic && g->pano.format != _mercator && - g->pano.format != _trans_mercator && g->pano.format != _sinusoidal) + g->pano.format != _trans_mercator && g->pano.format != _sinusoidal && + g->pano.format != _lambert + ) err=11; // Check Control Points Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/configure.ac 2006-12-12 07:07:12 UTC (rev 622) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.3], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.4], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/filter.h 2006-12-12 07:07:12 UTC (rev 622) @@ -831,6 +831,8 @@ int mirror_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int mercator_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_mercator ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int lambert_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int erect_lambert ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int transmercator_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_transmercator ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int sinusoidal_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/math.c 2006-12-12 07:07:12 UTC (rev 622) @@ -568,7 +568,7 @@ #endif return 1; } - +// This is the cylindrical projection int pano_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { // params: double distance @@ -606,6 +606,25 @@ } +/** convert from erect to lambert */ +int lambert_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + // params: distance + *x_src = x_dest; + *y_src = distance*sin(y_dest/distance); + return 1; +} + +/** convert from lambert to erect */ +int erect_lambert( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + // params: distance + *x_src = x_dest; + *y_src = distance*asin(y_dest/distance); + return 1; +} + + /** convert from erect to transverse mercator */ int transmercator_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { Modified: trunk/libpano/panorama.h =================================================================== --- trunk/libpano/panorama.h 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/panorama.h 2006-12-12 07:07:12 UTC (rev 622) @@ -247,7 +247,8 @@ _mercator = 11, _trans_mercator = 12, _trans_panorama = 13, - _sinusoidal = 14 + _sinusoidal = 14, + _lambert = 15, }; // A large rectangle Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/parser.c 2006-12-12 07:07:12 UTC (rev 622) @@ -468,6 +468,9 @@ case 7: gl->pano.format = _sinusoidal; break; + case 8: + gl->pano.format = _lambert; + break; default: PrintError( "Unknown panorama projection: %d", gl->pano.format ); return -1; @@ -931,6 +934,9 @@ case 7: p->pano.format = _sinusoidal; break; + case 8: + p->pano.format = _lambert; + break; default: PrintError( "Unknown panorama projection: %d", p->pano.format ); return -1; Modified: trunk/libpano/queryfeature.c =================================================================== --- trunk/libpano/queryfeature.c 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/queryfeature.c 2006-12-12 07:07:12 UTC (rev 622) @@ -64,6 +64,7 @@ {"PanoType5","Mercator"}, {"PanoType6","Transverse mercator"}, {"PanoType7","Sinusoidal"}, + {"PanoType8","Lambert"}, // Filter Types // fix: Fixed Windowsize // aa: Antialiasing filter with adaptive filter size Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/tools/PTmender.c 2006-12-12 07:07:12 UTC (rev 622) @@ -106,6 +106,10 @@ { //Only prepend the path to the script to the filenames if the filenames //don't already have path information + assert(ptrImageFileName != NULL); + assert(name != NULL); + assert(scriptFileName != NULL); + if ( (hasPathInfo(name)) == 0 ) strcpy(ptrImageFileName->name, scriptFileName->name); else @@ -168,6 +172,10 @@ //PTStitcher. It has been moved into this conditional block because //the script path could get prepended to an already fully qualified //filename...not very useful. + if (ptDebug) { + fprintf(stderr, "Processing image [%s] from 'i' line %d\n", alignInfo.im[i].name, i); + } + panoMenderSetFileName(&((*ptrImageFileNames)[i]), alignInfo.im[i].name, scriptFileName); if (ptDebug) { @@ -193,7 +201,7 @@ exit(1); } // Allocate their space - if ((ptrImageFileNames = malloc(512 * counter)) == NULL) { + if ((*ptrImageFileNames = malloc(512 * counter)) == NULL) { PrintError("Not enough memory"); exit(1); } @@ -201,11 +209,6 @@ panoMenderDuplicateScriptFile(scriptFileName->name, script, &scriptPathName); - if ((ptrImageFileNames = malloc(counter * 512)) == NULL) { - PrintError("Not enough memory\n"); - exit(1); - } - for (i = 0; i < counter; i++) { aPrefs* preferences; if ( (preferences = readAdjustLine(&scriptPathName)) == NULL) { @@ -213,6 +216,10 @@ exit(1); } + if (ptDebug) { + fprintf(stderr, "Processing image [%s] from 'o' line %d\n", preferences->im.name, i); + } + panoMenderSetFileName(&((*ptrImageFileNames)[i]), preferences->im.name, scriptFileName); if (ptDebug) { Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-12-04 18:01:29 UTC (rev 621) +++ trunk/libpano/version.h 2006-12-12 07:07:12 UTC (rev 622) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.3 " +#define VERSION "2.9.4 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-12 15:08:10
|
Revision: 623 http://svn.sourceforge.net/panotools/?rev=623&view=rev Author: dangelo Date: 2006-12-12 07:08:05 -0800 (Tue, 12 Dec 2006) Log Message: ----------- make trunk buildable with MSVC 2003. Instructions at: http://wiki.panotools.org/Build_pano12_from_sourcecode_MSVC Modified Paths: -------------- trunk/libpano/ColourBrightness.c trunk/libpano/PTcommon.c trunk/libpano/libpano.vcproj trunk/libpano/tools/PTblender.c trunk/libpano/tools/PTcrop.c trunk/libpano/tools/PTinfo.c trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTmender.c trunk/libpano/tools/PTtiff2psd.c trunk/libpano/tools/PTtiffdump.c trunk/libpano/tools/PTuncrop.c Added Paths: ----------- trunk/libpano/libpano.sln trunk/libpano/tools/PTOptimizer.vcproj trunk/libpano/tools/PTblender.vcproj trunk/libpano/tools/PTcrop.vcproj trunk/libpano/tools/PTinfo.vcproj trunk/libpano/tools/PTmasker.vcproj trunk/libpano/tools/PTmender.vcproj trunk/libpano/tools/PTroller.vcproj trunk/libpano/tools/PTtiff2psd.vcproj trunk/libpano/tools/PTtiffdump.vcproj trunk/libpano/tools/PTuncrop.vcproj trunk/libpano/tools/compat_win32/ trunk/libpano/tools/compat_win32/dirent.h trunk/libpano/tools/compat_win32/getopt.c trunk/libpano/tools/compat_win32/getopt.h Property Changed: ---------------- trunk/libpano/ trunk/libpano/tools/ Property changes on: trunk/libpano ___________________________________________________________________ Name: svn:ignore - COPYING INSTALL aclocal.m4 autom4te.cache config config.log config.status configure libtool Makefile Makefile.in .obj *.o *.lo *.la .deps .libs config.h config.h.in stamp-h* + COPYING INSTALL aclocal.m4 autom4te.cache config config.log config.status configure libtool Makefile Makefile.in .obj *.o *.lo *.la .deps .libs config.h config.h.in stamp-h* Debug Release *.ncb *.suo Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/ColourBrightness.c 2006-12-12 15:08:05 UTC (rev 623) @@ -30,12 +30,18 @@ #include "filter.h" #include "PTcommon.h" #include "ColourBrightness.h" +#include "pt_stdint.h" #include "tiffio.h" #include <assert.h> #include "pttiff.h" +// MSVC doesn't support round() +#ifdef _MSC_VER +//#define round(x) ( (int) (x+0.5) ) +#define round(x) x +#endif FILE *debugFile; @@ -359,6 +365,7 @@ int OutputPhotoshopCurve(FILE *output, int size, double *curve) { uint16_t shortValue; + uint16_t x; int i; // so far we only support size == 256 @@ -403,7 +410,7 @@ } // Write the very last point - uint16_t x=htons(255); + x=htons(255); if (fwrite(&x, 2, 1, output) != 1 || fwrite(&x, 2, 1, output) != 1 ) { goto error; @@ -2263,7 +2270,9 @@ double delta; + double sumR, sumH; + double contribution; // fprintf(stderr, "Doubles remappedHistogram: \n"); @@ -2291,7 +2300,8 @@ index = 0; - double sumR = 0, sumH = 0; + sumR = 0; + sumH = 0; for (index = 0; index < 0x100; index++) { sumH += histogram[index]; } @@ -2481,8 +2491,6 @@ assert(value < 255); - double contribution; - contribution = (1 - delta) *histogram[index]; // contribution2 = delta * histogram[index]; Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/PTcommon.c 2006-12-12 15:08:05 UTC (rev 623) @@ -46,7 +46,13 @@ //#include <unistd.h> //#include <stdint.h> //#include <math.h> + +#ifndef _MSC_VER #include <unistd.h> +#else +#define isnan _isnan +#include "tools/compat_win32/getopt.h" +#endif int panoFlattenTIFF(fullPath * fullPathImages, int counterImageFiles, Added: trunk/libpano/libpano.sln =================================================================== --- trunk/libpano/libpano.sln (rev 0) +++ trunk/libpano/libpano.sln 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,144 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Panotools", "libpano.vcproj", "{9B19A5C0-8DB0-448B-BF99-DC6374E9751B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTblender", "tools\PTblender.vcproj", "{20D1E094-A4B5-4294-85CE-229529065789}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTcrop", "tools\PTcrop.vcproj", "{20D1E094-A4B5-4294-85CE-229529065781}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTinfo", "tools\PTinfo.vcproj", "{20D1E094-A4B5-4294-85CE-229529065782}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTmasker", "tools\PTmasker.vcproj", "{20D1E094-A4B5-4294-85CE-229529065783}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTmender", "tools\PTmender.vcproj", "{20D1E094-A4B5-4294-85CE-229529065784}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PToptimizer", "tools\PTOptimizer.vcproj", "{20D1E094-A4B5-4294-85CE-229529065785}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTtiff2psd", "tools\PTtiff2psd.vcproj", "{20D1E094-A4B5-4294-85CE-229529065716}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTtiffdump", "tools\PTtiffdump.vcproj", "{20D1E094-A4B5-4294-85CE-229529065711}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTuncrop", "tools\PTuncrop.vcproj", "{20D1E094-A4B5-4294-85CE-229529065712}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + DLL Debug = DLL Debug + DLL Release = DLL Release + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.Debug.ActiveCfg = Debug|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.Debug.Build.0 = Debug|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.DLL Debug.Build.0 = DLL Debug|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.DLL Release.ActiveCfg = DLL Release|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.DLL Release.Build.0 = DLL Release|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.Release.ActiveCfg = Release|Win32 + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065789}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065781}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065782}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065783}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065784}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065785}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065716}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065711}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065712}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal Modified: trunk/libpano/libpano.vcproj =================================================================== --- trunk/libpano/libpano.vcproj 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/libpano.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -2,7 +2,7 @@ <VisualStudioProject ProjectType="Visual C++" Version="7.10" - Name="2 Panotools" + Name="Panotools" ProjectGUID="{9B19A5C0-8DB0-448B-BF99-DC6374E9751B}" RootNamespace="Panotools" Keyword="MakeFileProj"> @@ -26,8 +26,6 @@ PreprocessorDefinitions="WIN32;__Win__;HasJava" RuntimeLibrary="2" StructMemberAlignment="4" - ObjectFile="$(IntDir)/" - ProgramDataBaseFileName="$(IntDir)/vc70.pdb" WarningLevel="3" Detect64BitPortabilityProblems="FALSE" DebugInformationFormat="0" @@ -54,8 +52,7 @@ <Tool Name="VCMIDLTool"/> <Tool - Name="VCPostBuildEventTool" - CommandLine="copy "$(OutDir)\pano12.dll" "c:\windows\system32\pano12.dll" /y"/> + Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool @@ -87,8 +84,6 @@ PreprocessorDefinitions="WIN32;__Win__;HasJava" RuntimeLibrary="3" StructMemberAlignment="4" - ObjectFile="$(IntDir)/" - ProgramDataBaseFileName="$(IntDir)/vc70.pdb" WarningLevel="3" Detect64BitPortabilityProblems="FALSE" DebugInformationFormat="3" @@ -100,11 +95,11 @@ <Tool Name="VCLinkerTool" AdditionalDependencies="wxtiffd.lib wxzlibd.lib wxjpegd.lib wxpngd.lib" - OutputFile="$(OutDir)/pano12.dll" + OutputFile="$(OutDir)/pano12d.dll" AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" IgnoreAllDefaultLibraries="FALSE" IgnoreDefaultLibraryNames="" - ModuleDefinitionFile="pano12vc.def" + ModuleDefinitionFile="pano12vcd.def" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb" EntryPointSymbol="" @@ -113,8 +108,7 @@ <Tool Name="VCMIDLTool"/> <Tool - Name="VCPostBuildEventTool" - CommandLine="copy "$(OutDir)\pano12.dll" "c:\windows\system32\pano12.dll" /y"/> + Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool @@ -133,6 +127,94 @@ <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + CharacterSet="0"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src";"$(JDK_HOME)\include";"$(JDK_HOME)\include\win32"" + PreprocessorDefinitions="WIN32;__Win__;HasJava" + RuntimeLibrary="1" + StructMemberAlignment="4" + WarningLevel="3" + Detect64BitPortabilityProblems="FALSE" + DebugInformationFormat="3" + CallingConvention="0" + CompileAs="0" + DisableSpecificWarnings="4068;4244;4267"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLibrarianTool"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool" + ResourceOutputFileName="$(IntDir)/pano12d.res"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + CharacterSet="0"> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="0" + FavorSizeOrSpeed="0" + AdditionalIncludeDirectories=""$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src";"$(JDK_HOME)\include";"$(JDK_HOME)\include\win32"" + PreprocessorDefinitions="WIN32;__Win__;HasJava" + RuntimeLibrary="0" + StructMemberAlignment="4" + WarningLevel="3" + Detect64BitPortabilityProblems="FALSE" + DebugInformationFormat="0" + CallingConvention="0" + CompileAs="0" + DisableSpecificWarnings="4068;4244;4267"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLibrarianTool"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool" + ResourceOutputFileName="$(IntDir)/pano12.res"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> </Configurations> <References> </References> @@ -142,487 +224,121 @@ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File - RelativePath="adjust.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\adjust.c"> </File> <File - RelativePath="bmp.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\bmp.c"> </File> <File - RelativePath="ColourBrightness.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\ColourBrightness.c"> </File> <File - RelativePath="correct.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\correct.c"> </File> <File - RelativePath="fftn.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\fftn.c"> </File> <File - RelativePath="file.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\file.c"> </File> <File - RelativePath="filter.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\filter.c"> </File> <File - RelativePath="fourier.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\fourier.c"> </File> <File - RelativePath="hdrfile.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\tools\compat_win32\getopt.c"> </File> <File - RelativePath="jpeg.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\hdrfile.c"> </File> <File - RelativePath="jpegicc.c"> + RelativePath=".\jpeg.c"> </File> <File - RelativePath="lmdif.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\jpegicc.c"> </File> <File - RelativePath="math.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\lmdif.c"> </File> <File - RelativePath="metadata.c"> + RelativePath=".\math.c"> </File> <File - RelativePath="morpher.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\metadata.c"> </File> <File - RelativePath="multilayer.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\morpher.c"> </File> <File - RelativePath="optimize.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\multilayer.c"> </File> <File - RelativePath="pan.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\optimize.c"> </File> <File - RelativePath="parser.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\pan.c"> </File> <File - RelativePath="perspect.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\parser.c"> </File> <File - RelativePath="png.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\perspect.c"> </File> <File - RelativePath="ppm.c"> + RelativePath=".\png.c"> </File> <File - RelativePath="PTcommon.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\ppm.c"> </File> <File - RelativePath="PTDialogs.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\PTcommon.c"> </File> <File + RelativePath=".\PTDialogs.c"> + </File> + <File RelativePath=".\pteditor.c"> </File> <File + RelativePath=".\ptfeather.c"> + </File> + <File RelativePath=".\ptpicker.c"> </File> <File RelativePath=".\ptstitch.c"> </File> <File - RelativePath="queryfeature.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\queryfeature.c"> </File> <File - RelativePath="remap.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\remap.c"> </File> <File - RelativePath="resample.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\resample.c"> </File> <File - RelativePath="rgbe.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\rgbe.c"> </File> <File - RelativePath="seamer.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\seamer.c"> </File> <File - RelativePath="sys_common.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\sys_common.c"> </File> <File - RelativePath="sys_win.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\sys_win.c"> </File> <File - RelativePath="tiff.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\tiff.c"> </File> <File - RelativePath="Triangulate.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\Triangulate.c"> </File> <File - RelativePath="ZComb.c"> - <FileConfiguration - Name="DLL Release|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> - <FileConfiguration - Name="DLL Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)/$(InputName)1.obj"/> - </FileConfiguration> + RelativePath=".\ZComb.c"> </File> </Filter> <Filter @@ -630,88 +346,67 @@ Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> <File - RelativePath="adjust.h"> + RelativePath=".\ColourBrightness.h"> </File> <File - RelativePath="ColourBrightness.h"> + RelativePath=".\f2c.h"> </File> <File - RelativePath="f2c.h"> + RelativePath=".\fftn.h"> </File> <File - RelativePath="fftn.h"> + RelativePath=".\filter.h"> </File> <File - RelativePath="file.h"> + RelativePath=".\tools\compat_win32\getopt.h"> </File> <File - RelativePath="filter.h"> + RelativePath=".\panorama.h"> </File> <File - RelativePath="jpegicc.h"> + RelativePath=".\pt_stdint.h"> </File> <File - RelativePath="metadata.h"> + RelativePath=".\PTcommon.h"> </File> <File - RelativePath="panorama.h"> + RelativePath=".\pteditor.h"> </File> <File - RelativePath="panotypes.h"> + RelativePath=".\ptutils.h"> </File> <File - RelativePath="pt_stdint.h"> + RelativePath=".\resource.h"> </File> <File - RelativePath="PTcommon.h"> + RelativePath=".\rgbe.h"> </File> <File - RelativePath="pttiff.h"> + RelativePath=".\seamer.h"> </File> <File - RelativePath="ptutils.h"> + RelativePath=".\sys_win.h"> </File> <File - RelativePath="queryfeature.h"> + RelativePath=".\version.h"> </File> <File - RelativePath="rgbe.h"> + RelativePath=".\ZComb.h"> </File> - <File - RelativePath="sys_win.h"> - </File> - <File - RelativePath="version.h"> - </File> - <File - RelativePath="ZComb.h"> - </File> </Filter> <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> <File - RelativePath=".\Authors"> + RelativePath=".\pano12.rc"> </File> <File - RelativePath=".\ChangeLog"> + RelativePath=".\pano12vc.def"> </File> <File - RelativePath=".\News"> + RelativePath=".\pano12vcd.def"> </File> - <File - RelativePath="pano12.rc"> - </File> - <File - RelativePath="pano12vc.def"> - </File> - <File - RelativePath=".\Readme"> - </File> - <File - RelativePath=".\Todo"> - </File> </Filter> </Files> <Globals> Property changes on: trunk/libpano/tools ___________________________________________________________________ Name: svn:ignore - .cvsignore .deps working Makefile.in .libs Makefile PTOptimizer PTblender PTmender PTtiff2psd panoinfo PTuncrop + .cvsignore .deps working Makefile.in .libs Makefile PTOptimizer PTblender PTmender PTtiff2psd panoinfo PTuncrop Debug Release Added: trunk/libpano/tools/PTOptimizer.vcproj =================================================================== --- trunk/libpano/tools/PTOptimizer.vcproj (rev 0) +++ trunk/libpano/tools/PTOptimizer.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="PTOptimizer" + ProjectGUID="{20D1E094-A4B5-4294-85CE-229529065785}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PToptimizer.exe" + LinkIncremental="2" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/PTOptimizer.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTOptimizer.exe" + LinkIncremental="1" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\PToptimizer.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/tools/PTblender.c 2006-12-12 15:08:05 UTC (rev 623) @@ -34,10 +34,15 @@ #include <stdlib.h> #include <sys/types.h> #include <dirent.h> -#include <unistd.h> #include <errno.h> +#ifndef _MSC_VER +#include <unistd.h> +#else +#include "compat_win32/getopt.h" +#endif + #include "filter.h" #include "panorama.h" #include "PTcommon.h" Added: trunk/libpano/tools/PTblender.vcproj =================================================================== --- trunk/libpano/tools/PTblender.vcproj (rev 0) +++ trunk/libpano/tools/PTblender.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="PTblender" + ProjectGUID="{20D1E094-A4B5-4294-85CE-229529065789}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTblender.exe" + LinkIncremental="2" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/PTblender.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTblender.exe" + LinkIncremental="1" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\compat_win32\getopt.c"> + </File> + <File + RelativePath=".\PTblender.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/tools/PTcrop.c 2006-12-12 15:08:05 UTC (rev 623) @@ -46,7 +46,10 @@ #include <assert.h> #include <stdio.h> #include <stdlib.h> + +#ifndef _MSC_VER #include <unistd.h> +#endif #include "tiffio.h" #include "panorama.h" Added: trunk/libpano/tools/PTcrop.vcproj =================================================================== --- trunk/libpano/tools/PTcrop.vcproj (rev 0) +++ trunk/libpano/tools/PTcrop.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="PTcrop" + ProjectGUID="{20D1E094-A4B5-4294-85CE-229529065781}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTcrop.exe" + LinkIncremental="2" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/PTcrop.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTcrop.exe" + LinkIncremental="1" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\PTcrop.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: trunk/libpano/tools/PTinfo.c =================================================================== --- trunk/libpano/tools/PTinfo.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/tools/PTinfo.c 2006-12-12 15:08:05 UTC (rev 623) @@ -33,10 +33,15 @@ #include <stdlib.h> #include <sys/types.h> #include <dirent.h> -#include <unistd.h> #include <errno.h> +#ifndef _MSC_VER +#include <unistd.h> +#else +#include "compat_win32/getopt.h" +#endif + #include "filter.h" #include "panorama.h" #include "PTcommon.h" Added: trunk/libpano/tools/PTinfo.vcproj =================================================================== --- trunk/libpano/tools/PTinfo.vcproj (rev 0) +++ trunk/libpano/tools/PTinfo.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="PTinfo" + ProjectGUID="{20D1E094-A4B5-4294-85CE-229529065782}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTinfo.exe" + LinkIncremental="2" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/PTinfo.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTinfo.exe" + LinkIncremental="1" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\PTinfo.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/tools/PTmasker.c 2006-12-12 15:08:05 UTC (rev 623) @@ -33,7 +33,13 @@ #include <stdlib.h> #include <sys/types.h> #include <dirent.h> -#include <unistd.h> + +#ifndef _MSC_VER +#include <unistd.h> +#else +#include "compat_win32/getopt.h" +#endif + #include <errno.h> Added: trunk/libpano/tools/PTmasker.vcproj =================================================================== --- trunk/libpano/tools/PTmasker.vcproj (rev 0) +++ trunk/libpano/tools/PTmasker.vcproj 2006-12-12 15:08:05 UTC (rev 623) @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="PTmasker" + ProjectGUID="{20D1E094-A4B5-4294-85CE-229529065783}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTmasker.exe" + LinkIncremental="2" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/PTblender.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="compat_win32;..\;"$(WXWIDGETS_HOME)\src\zlib";"$(WXWIDGETS_HOME)\src\png";"$(WXWIDGETS_HOME)\src\tiff";"$(WXWIDGETS_HOME)\src\jpeg";"$(WXWIDGETS_HOME)\src"" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wxtiff.lib wxzlib.lib wxjpeg.lib wxpng.lib Ws2_32.lib" + OutputFile="$(OutDir)/PTblender.exe" + LinkIncremental="1" + AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\PTmasker.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-12-12 07:07:12 UTC (rev 622) +++ trunk/libpano/tools/PTmender.c 2006-12-12 15:08:05 UTC (rev 623) @@ -36,7 +36,12 @@ #include <string.h> #include <sys/types.h> #include <dirent.h> + +#ifndef _MSC_VER #include <unistd.h> +#else +#include "compat_win32/getopt.h... [truncated message content] |
From: <dm...@us...> - 2006-12-12 21:44:29
|
Revision: 625 http://svn.sourceforge.net/panotools/?rev=625&view=rev Author: dmg Date: 2006-12-12 13:44:29 -0800 (Tue, 12 Dec 2006) Log Message: ----------- 2006-12-12 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.5. * queryfeature.c: Added lambert Azimuthal projection * math.c (erect_lambert, lambert_erect): Added lambert Azimuthal projection * filter.h: Added Lambert Azimuthal projection * panorama.h (enum): Added Lambert Azimuthal projection * adjust.c (SetMakeParams, SetInvMakeParams): Added Lambert Azimuthal projection * parser.c (readAdjust,ParseScript): Added Lambert Azimuthal projection. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/adjust.c trunk/libpano/configure.ac trunk/libpano/filter.h trunk/libpano/math.c trunk/libpano/panorama.h trunk/libpano/parser.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/ChangeLog 2006-12-12 21:44:29 UTC (rev 625) @@ -1,3 +1,21 @@ +2006-12-12 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.5. + + * queryfeature.c: Added lambert Azimuthal projection + + * math.c (erect_lambert, lambert_erect): Added lambert Azimuthal + projection + + * filter.h: Added Lambert Azimuthal projection + + * panorama.h (enum): Added Lambert Azimuthal projection + + * adjust.c (SetMakeParams, SetInvMakeParams): Added Lambert + Azimuthal projection + + * parser.c (readAdjust,ParseScript): Added Lambert Azimuthal projection. + 2006-12-12 dangelo <pab...@we...> * ColorBrightness.c, PTcommon.c, tools/PTblender.c, tools/PTcrop.c, tools/PTinfo.c, tools/PTmasker.c, tools/PTmender.c, Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/adjust.c 2006-12-12 21:44:29 UTC (rev 625) @@ -680,6 +680,13 @@ // horizontal pixels per degree mp->distance = ((double) pn->width) / b; break; + case _lambertazimuthal: // this is probably WRONG + tpara = 1; + lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); + printf("Computing %10.4f %10.4f\n", tx, ty); + mp->distance = pn->width/(2.0*tx); + // mp->distance = ((double) pn->width) / b; + break; case _stereographic: tpara = 1; stereographic_erect(b/2.0, 0.0, &tx, &ty, & tpara); @@ -775,6 +782,10 @@ { SetDesc(stack[i], erect_lambert, &(mp->distance) ); i++; // Convert lambert to sphere } + else if(pn->format == _lambertazimuthal) + { + SetDesc(stack[i], erect_lambertazimuthal, &(mp->distance) ); i++; // Convert lambert to sphere + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], erect_transmercator, &(mp->distance) ); i++; // Convert transverse mercator to sphere @@ -926,6 +937,12 @@ // horizontal pixels per degree mp->distance = ((double) pn->width) / b; break; + case _lambertazimuthal: // this is probably WRONG + tpara = 1; + lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); + mp->distance = pn->width/(2.0*tx); + //mp->distance = ((double) pn->width) / b; + break; case _stereographic: tpara = 1; stereographic_erect(b/2.0, 0.0, &tx, &ty, & tpara); @@ -1089,6 +1106,10 @@ { SetDesc(stack[i], lambert_erect, &(mp->distance) ); i++; // Convert sphere to lambert } + else if(pn->format == _lambertazimuthal) + { + SetDesc(stack[i], lambertazimuthal_erect, &(mp->distance) ); i++; // Convert sphere to lambert azimuthal + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], transmercator_erect, &(mp->distance) ); i++; // Convert sphere to transverse mercator @@ -2485,7 +2506,7 @@ g->pano.format != _equirectangular && g->pano.format != _fisheye_ff && g->pano.format != _stereographic && g->pano.format != _mercator && g->pano.format != _trans_mercator && g->pano.format != _sinusoidal && - g->pano.format != _lambert + g->pano.format != _lambert && g->pano.format != _lambertazimuthal ) err=11; Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/configure.ac 2006-12-12 21:44:29 UTC (rev 625) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.4], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.5], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/filter.h 2006-12-12 21:44:29 UTC (rev 625) @@ -60,7 +60,7 @@ //---------------------- Some useful math defines -------------------------- #ifndef PI - #define PI 3.14159265358979323846 + #define PI 3.14159265358979323846264338327950288 #endif #ifndef HALF_PI #define HALF_PI (PI*0.5) @@ -833,6 +833,8 @@ int erect_mercator ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int lambert_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_lambert ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int erect_lambertazimuthal( double x_dest,double y_dest, double* x_src, double* y_src, void* params); +int lambertazimuthal_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params); int transmercator_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_transmercator ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int sinusoidal_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/math.c 2006-12-12 21:44:29 UTC (rev 625) @@ -26,7 +26,9 @@ #define MAXITER 100 +#include <assert.h> + #ifndef abs #define abs(a) ( (a) >= 0 ? (a) : -(a) ) #endif @@ -587,6 +589,96 @@ return 1; } +/** convert from erect to lambert azimuthal */ +int lambertazimuthal_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + // params: distance + double phi, lambda,k1; + lambda = x_dest/distance; + phi = y_dest/distance; + +/* + printf("To compute original x %10.4f y %10.4f distance %10.4f\n", x_dest, y_dest, distance); + printf("To compute x %10.4f y %10.4f\n", lambda, phi); + printf("To compute cos(y) %10.4f cos(x) %10.4f\n", cos(phi), cos(lambda)); +*/ + if (abs(cos(phi) * cos(lambda) + 1.0) <= EPSLN) { + *x_src = distance * 2 ; + *y_src = 0; + return 0; + } + + k1 = sqrt(2.0 / (1 + cos(phi) * cos(lambda))); + + printf("To compute k %10.4f \n", k1); + + *x_src = distance * k1 * cos(phi) * sin (lambda); + *y_src = distance * k1 * sin(phi); + + return 1; +} + +/** convert from lambert azimuthal to erect */ +int erect_lambertazimuthal( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + + double x, y, r, ro,c; + + x = x_dest/distance; + y = y_dest/distance; + //x = x_dest; + //y = y_dest; + + assert(! isnan(x)); + assert(! isnan(y)); + if (fabs(x) > PI || fabs(y) > PI) { + *y_src = 0; + *x_src = 0; + return 0; + } + + ro = hypot( x, y); + + if (fabs(ro) <= EPSLN) + { + printf("** compute x %10.4f y %10.4f\n", x, y); + printf("** compute c %10.4f\n", ro); + + *y_src = 0; + *x_src = 0; + return 1; + } + + c = 2 * asin(ro / 2.0); + + *y_src = distance * asin( (y * sin(c)) / ro); + + + if (fabs(ro * cos(c)) <= EPSLN ) { + printf("** compute x %10.4f y %10.4f\n", x, y); + printf("** compute cos(y) %10.4f cos(x) %10.4f\n", cos(c), c); + *x_src = 0; + return 1; + } + + *x_src = distance * atan2( x * sin(c), (ro * cos(c))); + + //*x_src = atan( x * sin(c) / (ro * cos(c))); + //*y_src = asin( y * sin(c) / ro); + + /* + if (*x_src/distance < -PI/4 || *x_src/distance > PI/4) + return 0; + + if (*y_src/distance < -PI/4 || *y_src/distance > PI/4) + return 0; + */ + return 1; + +} + + + /** convert from erect to mercator */ int mercator_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { Modified: trunk/libpano/panorama.h =================================================================== --- trunk/libpano/panorama.h 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/panorama.h 2006-12-12 21:44:29 UTC (rev 625) @@ -249,6 +249,7 @@ _trans_panorama = 13, _sinusoidal = 14, _lambert = 15, + _lambertazimuthal = 16, }; // A large rectangle Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/parser.c 2006-12-12 21:44:29 UTC (rev 625) @@ -471,6 +471,9 @@ case 8: gl->pano.format = _lambert; break; + case 9: + gl->pano.format = _lambertazimuthal; + break; default: PrintError( "Unknown panorama projection: %d", gl->pano.format ); return -1; @@ -937,6 +940,9 @@ case 8: p->pano.format = _lambert; break; + case 9: + p->pano.format = _lambertazimuthal; + break; default: PrintError( "Unknown panorama projection: %d", p->pano.format ); return -1; Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-12-12 15:08:51 UTC (rev 624) +++ trunk/libpano/version.h 2006-12-12 21:44:29 UTC (rev 625) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.4 " +#define VERSION "2.9.5 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-13 02:09:56
|
Revision: 626 http://svn.sourceforge.net/panotools/?rev=626&view=rev Author: dmg Date: 2006-12-12 18:09:55 -0800 (Tue, 12 Dec 2006) Log Message: ----------- 2006-12-12 dmg <dm...@uv...> * math.c (transmercator_erect): Make sure it returns 0 when the width is infinite. * adjust.c: Updated comments * math.c (erect_transmercator): Make sure it only translates points within the sphere (avoids duplication of the image). Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/adjust.c trunk/libpano/math.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-12 21:44:29 UTC (rev 625) +++ trunk/libpano/ChangeLog 2006-12-13 02:09:55 UTC (rev 626) @@ -1,5 +1,13 @@ 2006-12-12 dmg <dm...@uv...> + * math.c (transmercator_erect): Make sure it returns 0 when the + width is infinite. + + * adjust.c: Updated comments + + * math.c (erect_transmercator): Make sure it only translates + points within the sphere (avoids duplication of the image). + * version.h (VERSION), configure.ac Upgraded to version 2.9.5. * queryfeature.c: Added lambert Azimuthal projection Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2006-12-12 21:44:29 UTC (rev 625) +++ trunk/libpano/adjust.c 2006-12-13 02:09:55 UTC (rev 626) @@ -680,12 +680,10 @@ // horizontal pixels per degree mp->distance = ((double) pn->width) / b; break; - case _lambertazimuthal: // this is probably WRONG + case _lambertazimuthal: tpara = 1; lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); - printf("Computing %10.4f %10.4f\n", tx, ty); mp->distance = pn->width/(2.0*tx); - // mp->distance = ((double) pn->width) / b; break; case _stereographic: tpara = 1; @@ -937,11 +935,10 @@ // horizontal pixels per degree mp->distance = ((double) pn->width) / b; break; - case _lambertazimuthal: // this is probably WRONG + case _lambertazimuthal: tpara = 1; lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); mp->distance = pn->width/(2.0*tx); - //mp->distance = ((double) pn->width) / b; break; case _stereographic: tpara = 1; Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2006-12-12 21:44:29 UTC (rev 625) +++ trunk/libpano/math.c 2006-12-13 02:09:55 UTC (rev 626) @@ -663,16 +663,6 @@ *x_src = distance * atan2( x * sin(c), (ro * cos(c))); - //*x_src = atan( x * sin(c) / (ro * cos(c))); - //*y_src = asin( y * sin(c) / ro); - - /* - if (*x_src/distance < -PI/4 || *x_src/distance > PI/4) - return 0; - - if (*y_src/distance < -PI/4 || *y_src/distance > PI/4) - return 0; - */ return 1; } @@ -727,6 +717,11 @@ B = cos(y_dest)*sin(x_dest); *x_src = distance * atanh(B); *y_src = distance * atan2(tan(y_dest), cos(x_dest)); + + if (isinf(*x_src)) { + return 0; + } + return 1; } @@ -736,6 +731,14 @@ // params: distance x_dest /= distance; y_dest /= distance; + + if (fabs(y_dest) > PI ) { + *y_src = 0; + *x_src = 0; + return 0; + } + + *x_src = distance * atan2(sinh(x_dest),cos(y_dest)); *y_src = distance * asin(sin(y_dest)/cosh(x_dest)); return 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-13 21:57:11
|
Revision: 627 http://svn.sourceforge.net/panotools/?rev=627&view=rev Author: dangelo Date: 2006-12-13 13:57:11 -0800 (Wed, 13 Dec 2006) Log Message: ----------- install file.h Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/Makefile.am Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-13 02:09:55 UTC (rev 626) +++ trunk/libpano/ChangeLog 2006-12-13 21:57:11 UTC (rev 627) @@ -1,3 +1,8 @@ +2006-12-13 dangelo <pab...@we...> + + * Makefile.am: install file.h during make install. It is required + for compilation of programs using libpano13 + 2006-12-12 dmg <dm...@uv...> * math.c (transmercator_erect): Make sure it returns 0 when the Modified: trunk/libpano/Makefile.am =================================================================== --- trunk/libpano/Makefile.am 2006-12-13 02:09:55 UTC (rev 626) +++ trunk/libpano/Makefile.am 2006-12-13 21:57:11 UTC (rev 627) @@ -14,7 +14,7 @@ JAVA_SRC = javastub.c endif -STD_HDR = panorama.h filter.h version.h panotypes.h PTcommon.h pt_stdint.h +STD_HDR = panorama.h filter.h version.h panotypes.h PTcommon.h pt_stdint.h file.h INTERNAL_HDR = fftn.h f2c.h ZComb.h adjust.h ColourBrightness.h PTcommon.h pt_stdint.h pttiff.h metadata.h jpegicc.h ptstitch.h ptfeather.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-14 04:35:43
|
Revision: 628 http://svn.sourceforge.net/panotools/?rev=628&view=rev Author: dmg Date: 2006-12-13 20:35:40 -0800 (Wed, 13 Dec 2006) Log Message: ----------- 2006-12-13 dmg <dm...@uv...> * ColourBrightness.c (CorrectFileColourBrightness): Another bug I introduced when I replaced readTIFF with panoTiffRead. I need regression testing :( Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-13 21:57:11 UTC (rev 627) +++ trunk/libpano/ChangeLog 2006-12-14 04:35:40 UTC (rev 628) @@ -1,3 +1,9 @@ +2006-12-13 dmg <dm...@uv...> + + * ColourBrightness.c (CorrectFileColourBrightness): Another bug I + introduced when I replaced readTIFF with panoTiffRead. I need + regression testing :( + 2006-12-13 dangelo <pab...@we...> * Makefile.am: install file.h during make install. It is required Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-12-13 21:57:11 UTC (rev 627) +++ trunk/libpano/ColourBrightness.c 2006-12-14 04:35:40 UTC (rev 628) @@ -765,7 +765,7 @@ Image image; CropInfo crop_info; char tempString[512]; - if (panoTiffRead (&image, inPath->name) != 0) { + if (panoTiffRead (&image, inPath->name) == 0) { sprintf(tempString, "Could not read TIFF file %s", inPath->name); PrintError(tempString); return -1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-15 22:59:35
|
Revision: 629 http://svn.sourceforge.net/panotools/?rev=629&view=rev Author: dangelo Date: 2006-12-15 14:59:32 -0800 (Fri, 15 Dec 2006) Log Message: ----------- added lambert azimuthal to queryfeature Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/queryfeature.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-14 04:35:40 UTC (rev 628) +++ trunk/libpano/ChangeLog 2006-12-15 22:59:32 UTC (rev 629) @@ -1,3 +1,7 @@ +2006-12-15 dangelo <pab...@we...> + * queryfeature.c: Include lambert azimuthal in list of supported + output projections + 2006-12-13 dmg <dm...@uv...> * ColourBrightness.c (CorrectFileColourBrightness): Another bug I Modified: trunk/libpano/queryfeature.c =================================================================== --- trunk/libpano/queryfeature.c 2006-12-14 04:35:40 UTC (rev 628) +++ trunk/libpano/queryfeature.c 2006-12-15 22:59:32 UTC (rev 629) @@ -65,6 +65,7 @@ {"PanoType6","Transverse mercator"}, {"PanoType7","Sinusoidal"}, {"PanoType8","Lambert"}, + {"PanoType9","Lambert Azimuthal"}, // Filter Types // fix: Fixed Windowsize // aa: Antialiasing filter with adaptive filter size This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-16 01:37:58
|
Revision: 630 http://svn.sourceforge.net/panotools/?rev=630&view=rev Author: dmg Date: 2006-12-15 17:37:56 -0800 (Fri, 15 Dec 2006) Log Message: ----------- 2006-12-15 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.6. * tools/PTtiff2psd.c (PT_TIFF2PSD_USAGE): Updated help message * PTcommon.c (panoPSDCreate): Added support for 1 input file only in the creation of PSDs. * tools/PTtiff2psd.c (main): Added support for 1 input file only. * tiff.c (readTIFF): Reenable readTIFF and writeTIFF. pteditor uses them. 2006-12-14 dmg <dm...@uv...> * file.c: Fixed major problems with PSD logic and PICT tags * metadata.c (panoImageFullHeight): Darn. It was returning width instead of height! Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/metadata.c trunk/libpano/tiff.c trunk/libpano/tools/PTtiff2psd.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/ChangeLog 2006-12-16 01:37:56 UTC (rev 630) @@ -1,3 +1,24 @@ +2006-12-15 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.6. + + * tools/PTtiff2psd.c (PT_TIFF2PSD_USAGE): Updated help message + + * PTcommon.c (panoPSDCreate): Added support for 1 input file only in + the creation of PSDs. + + * tools/PTtiff2psd.c (main): Added support for 1 input file only. + + * tiff.c (readTIFF): Reenable readTIFF and writeTIFF. pteditor + uses them. + +2006-12-14 dmg <dm...@uv...> + + * file.c: Fixed major problems with PSD logic and PICT tags + + * metadata.c (panoImageFullHeight): Darn. It was returning width + instead of height! + 2006-12-15 dangelo <pab...@we...> * queryfeature.c: Include lambert azimuthal in list of supported output projections Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/PTcommon.c 2006-12-16 01:37:56 UTC (rev 630) @@ -124,12 +124,19 @@ } if (numberImages == 1) { - PrintError("Writing only one image is not supported yet"); - return -1; + if (writePSD(&image, outputFileName) != 0) { + PrintError("Could not write PSD-file"); + if (ptQuietFlag != 0) + Progress(_disposeProgress, tempString); + return -1; + } + return 0; } + ////////////////////////////////////////////////////////////////////// //Write out the first image as the base layer in the PSD file + if (writePSDwithLayer(&image, outputFileName) != 0) { PrintError("Could not write PSD-file"); if (ptQuietFlag != 0) Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/configure.ac 2006-12-16 01:37:56 UTC (rev 630) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.5], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.6], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/file.c =================================================================== --- trunk/libpano/file.c 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/file.c 2006-12-16 01:37:56 UTC (rev 630) @@ -60,13 +60,13 @@ static int writeImageDataPlanar ( Image *im, file_spec fnum ); static int readImageDataPlanar (Image *im, file_spec fnum ) ; static int ParsePSDHeader ( char *header, Image *im ); -static int writeChannelData ( Image *im, file_spec fnum, int channel, CropInfo *crop_info, PTRect *r ); -static int writeLayerAndMask ( Image *im, CropInfo *crop_info, file_spec fnum ); -static void getImageRectangle ( Image *im, CropInfo *crop_info, PTRect *r ); +static int writeChannelData ( Image *im, file_spec fnum, int channel, PTRect *r ); +static int writeLayerAndMask ( Image *im, file_spec fnum ); +static void getImageRectangle ( Image *im, PTRect *r ); static int fileCopy ( file_spec src, file_spec dest, size_t numBytes, unsigned char *buf); static void orAlpha ( unsigned char* alpha, unsigned char *buf, Image *im, PTRect *r ); static void writeWhiteBackground ( pt_int32 width, pt_int32 height, file_spec fnum ); -static int addLayer ( Image *im, CropInfo *crop_info, file_spec src, file_spec fnum , stBuf *sB); +static int addLayer ( Image *im, file_spec src, file_spec fnum , stBuf *sB); static int hasFeather ( Image *im ); static int writeTransparentAlpha ( Image *im, file_spec fnum, PTRect *theRect ); @@ -117,8 +117,17 @@ #define PSDHLENGTH 26 -int panoPSDResourceWrite(file_spec fnum, pt_uint16 resource, pt_uint16 len) +int panoPSDResourceWrite(file_spec fnum, pt_uint16 resource, pt_uint16 len, pt_uint16 dataLen, char *resourceData) { +//struct _ColorModeDataBlock +//{ +// BYTE Type[4]; /* Always "8BIM" */ +// WORD ID; /* (See table below) */ +// BYTE Name[]; /* Even-length Pascal-format string, 2 bytes or longer */ +// LONG Size; /* Length of resource data following, in bytes */ +// BYTE Data[]; /* Resource data, padded to even length */ +//}; +// int rtn = 0; unsigned char ch; size_t count; @@ -135,15 +144,20 @@ rtn += count; WRITESHORT(resource); rtn += count; - WRITEINT32(0); // Null string + WRITESHORT(0); // Null string 2 bytes (length) rtn += count; - WRITESHORT(len); //size of the record + WRITEINT32(len); //size of the record (4 bytes) rtn += count; + if (dataLen > 0 && resourceData != NULL) { + mywrite( fnum, dataLen, resourceData ); + rtn += dataLen; + } + return rtn; } -int panoPSDPICTResourceWrite(file_spec fnum, unsigned char resource, unsigned char record, pt_uint16 len) +int panoPSDPICTResourceWrite(file_spec fnum, unsigned char resource, unsigned char record, pt_uint16 len, char *recordData) { // See IPTC Information Intercharge Model Exchange Version 4. int rtn = 0; @@ -162,10 +176,24 @@ WRITESHORT( len ); //length rtn += count; + if (recordData != NULL > 0) { + + mywrite( fnum, len, recordData); + rtn += count; + + if (len % 2 == 0) { + // Odd size record! it should be aligned to word, but not reported in the lenght + // and the record header is odd length (5 bytes) so... + // printf("Writing extra record to align\n"); + + WRITEUCHAR( 0 ); + rtn += count; + } + } return rtn; } -#define CREATED_BY_PSD "Panotools " VERSION +#define CREATED_BY_PSD "Panotools " VERSION #define IPTC_VERSION_ID 0 #define IPTC_ORIGINATING_PROGRAM_ID 0x41 #define IPTC_DESCRIPTION_WRITER_ID 0x7a @@ -181,54 +209,63 @@ pt_uint16 shorty = 0; pt_uint32 len = 0; pt_uint16 fileInfoLength = 0; + int saveLocation = 0; + int saveLocationForSize=0; + int temp; - // Write the length - - // if we have profile... - if (im->metadata.iccProfile.size > 0) - len += im->metadata.iccProfile.size + 12; // To include record data - // + Write file info... - - // compute length of fileinfo record - // each record is 5 bytes + data - // We will write the following records - // originating program: 0x41 "Ptmender (32 bytes max) + // This function is a bit cryptic mainly because PSD forces the lenght to be known before a record is written. + // What I have decided is to make the writing process non-sequential. - assert(strlen(CREATED_BY_PSD) <= 32); + // Write an empty length first, then "rewind" and write its real + // one. It will make things way easier and more maintainable. - shorty = strlen(CREATED_BY_PSD) + 1 // size of originating program, len + 1 as it is pascal type - + 7 // size of version record - + 5 * 1 // 5 * number of records other than version - ; + // Write 4 bytes + saveLocationForSize = ftell(fnum); - len += shorty + 12; // size of fileinfo records + 12 overhead + WRITEINT32( 1234 ); // Image Resources size + rtn += 4; + if (im->metadata.iccProfile.size > 0) { + // Currently we only include ICC profile if it exists + + // We need to write an image Resources block + // Write Image resources header + // Write ICC Profile block + rtn += panoPSDResourceWrite(fnum, 0x040f, im->metadata.iccProfile.size, + im->metadata.iccProfile.size, im->metadata.iccProfile.data); + + } - WRITEINT32( len ); // Image Resources size - rtn += count; + { + // we will refactor this chunck + char IPTCVersion[3]; + int dataLen = 0; + IPTCVersion[0] = 0; + IPTCVersion[1] = 2; + IPTCVersion[2] = 0; - // Write FILEinfo - rtn += panoPSDResourceWrite(fnum, 0x0404, shorty); + // To write PICT we need to create a resource of type IPCT + // Inside it write the sequence of PICT records - // write version - - rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_VERSION_ID, 2); - WRITEUCHAR( 00 ); - rtn += count; - WRITEUCHAR( 02 ); - rtn += count; + // THIS IS UNTIL I FIX THIS CODE. IPTC records should be aligned and the header takes + // 5 bytes + // We also need to make it easier to add new records by + //simplifying the computation of the length of the subrecords - // write originating program + assert(strlen(CREATED_BY_PSD) % 2 == 1) ; - rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_DESCRIPTION_WRITER_ID, strlen(CREATED_BY_PSD) + 1); + temp = strlen(CREATED_BY_PSD); - WRITEUCHAR(strlen(CREATED_BY_PSD)); - rtn += count; + /// 8 of the VERSION ID + length of Descriptor (5 header + 2 strlen + string ) + rtn += panoPSDResourceWrite(fnum, 0x0404, 8 + 5 + 2 + temp, 0, NULL); + rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_VERSION_ID, 2, IPTCVersion); + rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_DESCRIPTION_WRITER_ID, temp, NULL ); + WRITESHORT(temp); + rtn += count; + + mywrite( fnum, temp, CREATED_BY_PSD); + rtn += temp; - len = strlen(CREATED_BY_PSD); - mywrite( fnum, len, CREATED_BY_PSD); - rtn += len; - // TODO: // caption abstract: 0x78 "script... (2000 bytes max) // if we have them: @@ -237,20 +274,22 @@ // imagedescription // artist 0x80 (32 max) - if (im->metadata.iccProfile.size != 0) { - - // Currently we only include ICC profile if it exists - - // We need to write an image Resources block - // Write Image resources header - // Write ICC Profile block - rtn += panoPSDResourceWrite(fnum, 0x040f, im->metadata.iccProfile.size); - mywrite( fnum, im->metadata.iccProfile.size, im->metadata.iccProfile.data ); - rtn += im->metadata.iccProfile.size; - - } + } + // Write length + + saveLocation = ftell(fnum); + fseek(fnum, saveLocationForSize, SEEK_SET); + assert(saveLocation > saveLocationForSize); + WRITEINT32( saveLocation - saveLocationForSize-4 ); // Image Resources size + fseek(fnum, saveLocation, SEEK_SET); + + + + return rtn; + + } @@ -274,6 +313,7 @@ PrintError("Error Writing Image File"); return -1; } + // printf("It is sropped %d\n", panoImageIsCropped(im)); // Write PSD Header // WRITEINT32( '8BPS' ); @@ -287,12 +327,20 @@ WRITEUCHAR( 0 ); WRITEUCHAR( channels );// No of channels - WRITEINT32( im->height ); - WRITEINT32( im->width ); + // TODO: IF THE SOURCE FILE IS CROPPED THIS IS WRITING ONLY THE CROPPED AREA + + // printf("It is sropped %d %d %d %d %d\n", panoImageIsCropped(im), + // panoImageHeight(im), panoImageWidth(im), panoImageFullHeight(im), panoImageFullWidth(im)); + + + //The Photoshop file has the dimensions of the full size image, regardless + //of whether the TIFF file is "cropped" or not. + WRITEINT32( panoImageHeight(im)); // Rows + WRITEINT32( panoImageWidth(im)); // Columns WRITESHORT( BitsPerChannel ); // BitsPerChannel - switch( im->dataformat ) + switch( im->dataformat ) // Color mode { case _Lab: WRITESHORT( 9 ); break; @@ -301,8 +349,11 @@ default: WRITESHORT( 3 ); } - WRITEINT32( 0 ); // Color Mode + printf(".................HHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n"); + WRITEINT32( 0 ); // Color Mode block + + // WRITEINT32( 0); panoPSDResourcesBlockWrite(im, fnum); WRITEINT32( 0 ); // Layer & Mask @@ -327,11 +378,9 @@ unsigned char ch; short svar; int BitsPerChannel; - CropInfo crop_info; //Determine if this is a "cropped" tiff, and, if so, what is //the full size from which this is cropped? - getCropInformation(im->name, &crop_info); // Jim Watters 2003/11/18: Photoshop CS does 16bit channels if 16 bit in, allow 16 bit out // TwoToOneByte( im ); // Multilayer image format doesn't support 16 bit channels @@ -350,21 +399,22 @@ WRITEUCHAR( 'B' ); WRITEUCHAR( 'P' ); WRITEUCHAR( 'S' ); - WRITESHORT( 1 ); - WRITEINT32( 0 ); WRITESHORT( 0 ); + WRITESHORT( 1 ); // Version + WRITEINT32( 0 ); WRITESHORT( 0 ); // 6 bytes zeroed - WRITEUCHAR( 0 ); - WRITEUCHAR( 3 ); // No of channels; Background always white, 3 channels + WRITESHORT( 3 ); // No of channels; Background always white, 3 channels //WRITEINT32( im->height ); //WRITEINT32( im->width ); + printf("It is sropped %d\n", panoImageIsCropped(im)); + //The Photoshop file has the dimensions of the full size image, regardless //of whether the TIFF file is "cropped" or not. - WRITEINT32( crop_info.full_height); - WRITEINT32( crop_info.full_width); + WRITEINT32( panoImageFullHeight(im)); // Rows + WRITEINT32( panoImageFullWidth(im)); // Columns - WRITESHORT( BitsPerChannel ); // BitsPerChannel + WRITESHORT( BitsPerChannel ); // BitsPerChannel switch( im->dataformat ) { case _Lab: WRITESHORT( 9 ); @@ -373,16 +423,17 @@ break; default: WRITESHORT( 3 ); } + WRITEINT32( 0 ); // Color Mode panoPSDResourcesBlockWrite(im, fnum); - writeLayerAndMask( im, &crop_info, fnum ); + writeLayerAndMask( im, fnum ); writeWhiteBackground( im->width * BitsPerChannel/8, im->height, fnum ); + myclose (fnum ); - myclose (fnum ); return 0; } @@ -399,12 +450,10 @@ pt_uint32 var; char data[12], *d; int BitsPerChannel, result = 0; - CropInfo crop_info; // Jim Watters 2003/11/18: Photoshop CS does 16bit channels if 16 bit in, allow 16 bit out // TwoToOneByte( im ); // Multilayer image format doesn't support 16 bit channels - getCropInformation(im->name, &crop_info); GetBitsPerChannel( im, BitsPerChannel ); @@ -435,7 +484,8 @@ } // Check if image can be inserted - if( sim.width != crop_info.full_width || sim.height != crop_info.full_height ) + // printf("Image size %d %d im %d %d\n", sim.width, sim.height, panoImageWidth(im), panoImageHeight(im)); + if( sim.width != panoImageFullWidth(im) || sim.height != panoImageFullHeight(im) ) { PrintError("Can't add layer: Images have different size"); return -1; @@ -483,7 +533,7 @@ myfree( (void**)buf ); // Add one layer - if( addLayer( im, &crop_info, src, fnum, sB ) != 0 ) + if( addLayer( im, src, fnum, sB ) != 0 ) { result = -1; goto _addLayerToFile_exit; @@ -515,6 +565,8 @@ GetBitsPerChannel( im, BitsPerChannel ); GetChannels( im,channels); + printf("Bitx per channel %d channels %d\n", BitsPerChannel, channels); + bpp = im->bitsPerPixel / 8; @@ -913,7 +965,7 @@ // Write image as separate first layer -static int writeLayerAndMask( Image *im, CropInfo *crop_info, file_spec fnum ) +static int writeLayerAndMask( Image *im, file_spec fnum ) { pt_uint32 var; PTRect theRect; @@ -945,7 +997,7 @@ //contains "non-empty" image data. The bounds of this region are recorded in //in "theRect". If this input image is a "cropped" image, then theRect will //just use the data region specified "crop_info". - getImageRectangle( im, crop_info, &theRect ); + getImageRectangle( im, &theRect ); numLayers = 1; @@ -1047,12 +1099,12 @@ // Write color channels for( i=0; i<3; i++) { - if( writeChannelData( im, fnum, i + channels - 3, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, i + channels - 3, &theRect ) ) return -1; } if( hasShapeMask ) { - if( writeChannelData( im, fnum, 0, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, 0, &theRect ) ) return -1; } else @@ -1062,7 +1114,7 @@ } if( hasClipMask ) { - if( writeChannelData( im, fnum, 0, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, 0, &theRect ) ) return -1; } @@ -1096,7 +1148,7 @@ -static int writeChannelData( Image *im, file_spec fnum, int channel, CropInfo *crop_info, PTRect *theRect ) +static int writeChannelData( Image *im, file_spec fnum, int channel, PTRect *theRect ) { register int x, y, idx, idy, bpp, BitsPerChannel, channels; unsigned char **ch; @@ -1131,10 +1183,10 @@ outputRegionWidth = (theRect->right - theRect->left); outputRegionHeight = (theRect->bottom - theRect->top); - if (outputRegionWidth > crop_info->cropped_width || outputRegionHeight > crop_info->cropped_height) + if (outputRegionWidth > panoImageWidth(im) || outputRegionHeight > panoImageHeight(im)) { printf("output region (%d x %d) is larger than input image data region (%d x %d)\n", - (int)outputRegionWidth, (int)outputRegionHeight, (int)crop_info->cropped_width, (int)crop_info->cropped_height); + (int)outputRegionWidth, (int)outputRegionHeight, (int)panoImageWidth(im), (int)panoImageHeight(im)); return 1; } @@ -1144,7 +1196,7 @@ { for(y=theRect->top; y<theRect->bottom;y++) { - idy = (y - crop_info->y_offset) * im->bytesPerLine; + idy = (y - panoImageOffsetY(im)) * im->bytesPerLine; if (idy < 0) { //should never happen PrintError("writeChannelData: index error"); @@ -1153,7 +1205,7 @@ for(x=theRect->left; x<theRect->right;x++) { - idx = ((x - crop_info->x_offset) * bpp); + idx = ((x - panoImageOffsetX(im)) * bpp); *c++ = idata [ idy + idx ]; } } @@ -1163,7 +1215,7 @@ unsigned short storage; for(y=theRect->top; y<theRect->bottom;y++) { - idy = (y - crop_info->y_offset) * im->bytesPerLine; + idy = (y - panoImageOffsetY(im)) * im->bytesPerLine; if (idy < 0) { //should never happen PrintError("writeChannelData: index error"); @@ -1172,7 +1224,7 @@ for(x=theRect->left; x<theRect->right;x++) { - idx = ((x - crop_info->x_offset) * bpp); + idx = ((x - panoImageOffsetX(im)) * bpp); storage = *(unsigned short*)&idata [ idy + idx ]; SHORTNUMBER( storage, c ); } @@ -1245,7 +1297,7 @@ // Return the smallest rectangle enclosing the image; // Use alpha channel and rgb data -static void getImageRectangle( Image *im, CropInfo *crop_info, PTRect *theRect ) +static void getImageRectangle( Image *im, PTRect *theRect ) { register unsigned char *alpha, *data; register int x,y,cy,bpp,channels; @@ -1254,14 +1306,14 @@ //If this is a cropped TIFF then we can get the image rectangle ROI from //the metadata in crop_info, rather than having to parse the entire //file to look for ROI - if ( crop_info->full_height != crop_info->cropped_height || crop_info->full_width != crop_info->cropped_width ) { - theRect->left = crop_info->x_offset; - theRect->top = crop_info->y_offset; + if ( panoImageIsCropped(im)) { + theRect->left = panoImageOffsetX(im); + theRect->top = panoImageOffsetY(im); //Slightly counter-intuitive...right and bottom are one pixel larger than expected //so that the width and height can be calculated by subtracting //left from right or top from bottom - theRect->right = theRect->left + crop_info->cropped_width; - theRect->bottom = theRect->top + crop_info->cropped_height; + theRect->right = theRect->left + panoImageWidth(im); + theRect->bottom = theRect->top + panoImageHeight(im); return; } @@ -1378,7 +1430,7 @@ // There must be one valid layer structure, and the // filepointer is at the beginning of it in both src and dest -static int addLayer( Image *im, CropInfo *crop_info, file_spec src, file_spec fnum, stBuf *sB ) +static int addLayer( Image *im, file_spec src, file_spec fnum, stBuf *sB ) { pt_uint32 var; PTRect theRect, *nRect = NULL; @@ -1425,7 +1477,7 @@ memset( *alpha, 0 , (size_t)(im->width * im->height * BitsPerChannel/8)); } - getImageRectangle( im, crop_info, &theRect ); + getImageRectangle( im, &theRect ); channelLength = (theRect.right-theRect.left) * (theRect.bottom-theRect.top) + 2; @@ -1566,10 +1618,22 @@ WRITEUCHAR( 'I' ); WRITEUCHAR( 'M' ); // WRITEINT32( 'norm'); // Blend mode key - WRITEUCHAR( 'n' ); - WRITEUCHAR( 'o' ); - WRITEUCHAR( 'r' ); - WRITEUCHAR( 'm' ); + if (i == 0) { + //use norm + WRITEUCHAR( 'n' ); + WRITEUCHAR( 'o' ); + WRITEUCHAR( 'r' ); + WRITEUCHAR( 'm' ); + } else { + // use the desired one. + // XXX TODO: read the blending more from the layer so we can write it the same way back + assert(sizeof(psdBlendingModesNames) == sizeof(psdBlendingModesInternalName)); + blendingModeKey = psdBlendingModesInternalName[sB->psdBlendingMode]; + for (j = 0; j< 4; j++ ) { + WRITEUCHAR(blendingModeKey[j]); + } + } + WRITEINT32( nflag[i] ); // Opacity, clipping, flag, filler WRITEINT32( nextra[i] ); // Extra data size Length of the extra data field. This is the total length of the next five fields. WRITEINT32( nmask[i] ); // Layer Mask data @@ -1700,7 +1764,7 @@ // Write color channels for( i=0; i<3; i++) { - if( writeChannelData( im, fnum, i + channels - 3, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, i + channels - 3, &theRect ) ) { result = -1; goto _addLayer_exit; @@ -1709,7 +1773,7 @@ if( hasShapeMask ) // Alpha channel present { - if( writeChannelData( im, fnum, 0, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, 0, &theRect ) ) { result = -1; goto _addLayer_exit; @@ -1742,7 +1806,7 @@ } #endif } - if( writeChannelData( im, fnum, 0, crop_info, &theRect ) ) + if( writeChannelData( im, fnum, 0, &theRect ) ) { result = -1; goto _addLayer_exit; Modified: trunk/libpano/metadata.c =================================================================== --- trunk/libpano/metadata.c 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/metadata.c 2006-12-16 01:37:56 UTC (rev 630) @@ -133,7 +133,7 @@ if (panoImageIsCropped(image)) return image->metadata.cropInfo.fullHeight; else - return image->width; + return image->height; } Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/tiff.c 2006-12-16 01:37:56 UTC (rev 630) @@ -258,7 +258,6 @@ -#ifdef DEPRECATED int readTIFF(Image * im, fullPath * sfile) { char filename[512]; @@ -463,7 +462,6 @@ return writeCroppedTIFF(im, sfile, &(im->cropInformation)); } -#endif void RGBAtoARGB(UCHAR * buf, int width, int bitsPerPixel) @@ -1599,6 +1597,7 @@ pano_CropInfo *otherCropInfo = NULL; assert(tiffFiles != NULL); + assert(numberImages > 1); Modified: trunk/libpano/tools/PTtiff2psd.c =================================================================== --- trunk/libpano/tools/PTtiff2psd.c 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/tools/PTtiff2psd.c 2006-12-16 01:37:56 UTC (rev 630) @@ -55,7 +55,7 @@ #define PT_TIFF2PSD_USAGE "PTtiff2psd [options] <tiffFiles>+\n\n"\ "Options:\n"\ "\t-o <filename>\t\tOutput filename (default merged.psd)\n"\ - "\t-b <blendingmode>\tSpecify blending mode for layers (see below)\n"\ + "\t-b <blendingmode>\tSpecify blending mode for layers (use -h to display them)\n"\ "\t-f\t\tForce processing (do not stop at warnings)\n"\ "\t-s\t\t\tStack them\n"\ "\t-q\t\t\tQuiet run\n"\ @@ -181,15 +181,8 @@ return -1; } - // Check that all files are compatible - if (filesCount == 1) { - PrintError("PTtiff2psd does not currently support one file only."); - return -1; - } - - if (!ptForceProcessing) { - if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + if (filesCount > 1 && !panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { PrintError("TIFFs are not compatible. Use -f to force processing"); return -1; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-12-15 22:59:32 UTC (rev 629) +++ trunk/libpano/version.h 2006-12-16 01:37:56 UTC (rev 630) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.5 " +#define VERSION "2.9.6 " #endif #ifndef PTVERSION_NAME_LONG @@ -38,7 +38,7 @@ #endif #ifndef PTVERSION_FILEVERSIONNUMBER -#define PTVERSION_FILEVERSIONNUMBER 2,9,2,-1 +#define PTVERSION_FILEVERSIONNUMBER 2,9,6,-1 #endif #ifndef PTVERSION_NAME_FILEVERSION This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-16 07:33:55
|
Revision: 631 http://svn.sourceforge.net/panotools/?rev=631&view=rev Author: dmg Date: 2006-12-15 23:33:54 -0800 (Fri, 15 Dec 2006) Log Message: ----------- 2006-12-15 dmg <dm...@uv...> * PTcommon.c (panoCreatePanorama): A pointer was freed more than once Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-16 01:37:56 UTC (rev 630) +++ trunk/libpano/ChangeLog 2006-12-16 07:33:54 UTC (rev 631) @@ -1,5 +1,8 @@ 2006-12-15 dmg <dm...@uv...> + * PTcommon.c (panoCreatePanorama): A pointer was freed more than + once + * version.h (VERSION), configure.ac Upgraded to version 2.9.6. * tools/PTtiff2psd.c (PT_TIFF2PSD_USAGE): Updated help message Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-16 01:37:56 UTC (rev 630) +++ trunk/libpano/PTcommon.c 2006-12-16 07:33:54 UTC (rev 631) @@ -1216,10 +1216,12 @@ strcat(outputFileName, var40); panoReplaceExt(outputFileName, ".tif"); rename(fullPathImages[loopCounter].name, outputFileName); - free(fullPathImages); } + free(fullPathImages); + + if (ptQuietFlag == 0) { Progress(_setProgress, "100%"); Progress(_disposeProgress, ""); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-17 11:05:19
|
Revision: 633 http://svn.sourceforge.net/panotools/?rev=633&view=rev Author: dangelo Date: 2006-12-17 03:05:20 -0800 (Sun, 17 Dec 2006) Log Message: ----------- fixed compilation problems with MSVC Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/math.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-16 21:25:10 UTC (rev 632) +++ trunk/libpano/ChangeLog 2006-12-17 11:05:20 UTC (rev 633) @@ -1,3 +1,7 @@ +2006-12-17 dangelo <pab...@we...> + + * math.c: added defines for isnan and isinf, if MSVC is used. + 2006-12-15 dmg <dm...@uv...> * PTcommon.c (panoCreatePanorama): A pointer was freed more than Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2006-12-16 21:25:10 UTC (rev 632) +++ trunk/libpano/math.c 2006-12-17 11:05:20 UTC (rev 633) @@ -25,7 +25,6 @@ #define R_EPS 1.0e-6 #define MAXITER 100 - #include <assert.h> @@ -33,6 +32,11 @@ #define abs(a) ( (a) >= 0 ? (a) : -(a) ) #endif +#ifdef _MSC_VER +#define isnan(a) _isnan(a) +#define isinf(a) (_fpclass(a) == _FPCLASS_NINF || _fpclass(a) == _FPCLASS_PINF) +#endif + void matrix_matrix_mult ( double m1[3][3],double m2[3][3],double result[3][3]); int polzeros_(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-17 13:28:28
|
Revision: 634 http://svn.sourceforge.net/panotools/?rev=634&view=rev Author: dangelo Date: 2006-12-17 05:28:28 -0800 (Sun, 17 Dec 2006) Log Message: ----------- use sys_ansi on windows Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/Makefile.am trunk/libpano/PTDialogs.c trunk/libpano/libpano.vcproj Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-17 11:05:20 UTC (rev 633) +++ trunk/libpano/ChangeLog 2006-12-17 13:28:28 UTC (rev 634) @@ -1,6 +1,8 @@ 2006-12-17 dangelo <pab...@we...> * math.c: added defines for isnan and isinf, if MSVC is used. + * Makefile.am, libpano.vcproj, PTDialogs.c: use sys_ansi on + windows 2006-12-15 dmg <dm...@uv...> Modified: trunk/libpano/Makefile.am =================================================================== --- trunk/libpano/Makefile.am 2006-12-17 11:05:20 UTC (rev 633) +++ trunk/libpano/Makefile.am 2006-12-17 13:28:28 UTC (rev 634) @@ -29,7 +29,7 @@ endif if HAVE_CYGWIN -WIN_SRC = sys_win.c bmp.c +WIN_SRC = sys_ansi.c bmp.c WIN_DEFS = -D__Win__=1 WIN_LDFS = -mwindows -avoid-version -no-undefined -export-symbols $(srcdir)/libpano12.def @@ -41,7 +41,7 @@ endif if HAVE_MINGW -WIN_SRC = sys_win.c bmp.c +WIN_SRC = sys_ansi.c bmp.c WIN_DEFS = -D__Win__=1 WIN_LDFS = -mwindows -avoid-version -no-undefined -export-symbols $(srcdir)/libpano12.def Modified: trunk/libpano/PTDialogs.c =================================================================== --- trunk/libpano/PTDialogs.c 2006-12-17 11:05:20 UTC (rev 633) +++ trunk/libpano/PTDialogs.c 2006-12-17 13:28:28 UTC (rev 634) @@ -23,8 +23,9 @@ #include "sys_mac.h" #endif +// dangelo: use sys ansi for windows as well.. #ifdef __Win__ -#include "sys_win.h" +#include "sys_ansi.h" #endif #ifdef __Ansi__ Modified: trunk/libpano/libpano.vcproj =================================================================== --- trunk/libpano/libpano.vcproj 2006-12-17 11:05:20 UTC (rev 633) +++ trunk/libpano/libpano.vcproj 2006-12-17 13:28:28 UTC (rev 634) @@ -326,10 +326,10 @@ RelativePath=".\seamer.c"> </File> <File - RelativePath=".\sys_common.c"> + RelativePath=".\sys_ansi.c"> </File> <File - RelativePath=".\sys_win.c"> + RelativePath=".\sys_common.c"> </File> <File RelativePath=".\tiff.c"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-18 21:35:49
|
Revision: 635 http://svn.sourceforge.net/panotools/?rev=635&view=rev Author: dangelo Date: 2006-12-18 13:35:49 -0800 (Mon, 18 Dec 2006) Log Message: ----------- added huber m-estimator Modified Paths: -------------- trunk/libpano/adjust.c trunk/libpano/adjust.h trunk/libpano/doc/Optimize.txt trunk/libpano/parser.c Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2006-12-17 13:28:28 UTC (rev 634) +++ trunk/libpano/adjust.c 2006-12-18 21:35:49 UTC (rev 635) @@ -48,7 +48,7 @@ static double avgfovFromSAP; static int needInitialAvgFov; -#define ADJUST_LOG_FILENAME "c:\\PToolsLog.txt" // file name for logging, if enabled +#define ADJUST_LOG_FILENAME "PToolsLog.txt" // file name for logging, if enabled #define ADJUST_LOGGING_ENABLED 0 @@ -1572,7 +1572,29 @@ return result; } +/// huber() is an M-Estimator function. Using an M-Estimator might +/// work better if the control points contain outliers (eg. from autopano). +/// this implementation accepts normal, non squared errors, and return non-squared errors, +/// contrary to the definition in the literature (where the square is +/// included in the function) +static double fcnPanoHuberSigma = 0; // sigma for Huber M-estimator. 0 disables M-estimator + +void setFcnPanoHuberSigma(double sigma) +{ + fcnPanoHuberSigma = sigma; +} + +double huber(double x, double sigma) +{ + if (abs(x) < sigma) + return x; + else + return sqrt(2.0*sigma*abs(x) - sigma*sigma); +} + + + /// (function distSquared2 has been removed -- it was unused and redundant) /// EvaluateControlPointErrorAndComponents is the central point-of-contact @@ -1792,8 +1814,12 @@ for( i=0; i < g->numPts; i++){ if (fcnPanoNperCP == 1) { EvaluateControlPointErrorAndComponents ( i, &fvec[iresult], &junk2[0]); - } else { + } else { EvaluateControlPointErrorAndComponents ( i, &junk, &fvec[iresult]); + if (fcnPanoHuberSigma) { + fvec[iresult] = huber(fvec[iresult], fcnPanoHuberSigma); + fvec[iresult+1] = huber(fvec[iresult+1], fcnPanoHuberSigma); + } } // Field-of-view stabilization. Applying here means that the Modified: trunk/libpano/adjust.h =================================================================== --- trunk/libpano/adjust.h 2006-12-17 13:28:28 UTC (rev 634) +++ trunk/libpano/adjust.h 2006-12-18 21:35:49 UTC (rev 635) @@ -21,3 +21,8 @@ void forceFcnPanoReinitAvgFov(void); AlignInfo *GetGlobalPtr(); +// set sigma of huber m-estimator. The influence of +// control points with errors above sigma is reduced. +// sigma = 0 disables the m-estimator +void setFcnPanoHuberSigma(double sigma); + Modified: trunk/libpano/doc/Optimize.txt =================================================================== --- trunk/libpano/doc/Optimize.txt 2006-12-17 13:28:28 UTC (rev 634) +++ trunk/libpano/doc/Optimize.txt 2006-12-18 21:35:49 UTC (rev 635) @@ -205,6 +205,17 @@ # # p0 Create panorama after optimizing control points # 0 no(default), 1 yes +# +# m0 use Huber m-estimator during second optimisation pass. +# This will reduce the weight of control points with higher errors +# It might help a little if a pano contains a few inaccurate or +# completely wrong control points. +# 0: no m-estimator (as in previous versions) +# Any other number is the sigma parameter of the huber m-estimator. +# Control points with errors higher than sigma will have less +# influence during the optimisation. +# A good value for sigma might be 2. +# m g1.5 i6 Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2006-12-17 13:28:28 UTC (rev 634) +++ trunk/libpano/parser.c 2006-12-18 21:35:49 UTC (rev 635) @@ -1446,6 +1446,7 @@ sPrefs theSprefs; char *ch = line; char buf[LINE_LENGTH]; + double sigma = 0; // FS+ int n; // FS- @@ -1478,6 +1479,9 @@ } break; // FS- + case 'm': READ_VAR( "%lf", &sigma); + setFcnPanoHuberSigma(sigma); + break; default: ch++; break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-12-27 07:29:10
|
Revision: 639 http://svn.sourceforge.net/panotools/?rev=639&view=rev Author: dmg Date: 2006-12-26 23:29:10 -0800 (Tue, 26 Dec 2006) Log Message: ----------- 2006-12-26 dmg <dm...@uv...> * tiff.c (panoTiffDisplayInfo): Fixed compilation warning * version.h (VERSION), configure.ac Upgraded to version 2.9.7. * math.c: Cleaned up some of the Lambert related code. * tools/PTblender.c: Improved error message it. * ptfeather.c: Improved the feathering algorithm, made sure 16 bits works too. * ptstitch.c, ptstitch.h (panoStitchPixelChannelSet): Added function, cleanedup panoStitchPixelChannelGet. * metadata.c (panoImageBytesPerSample): Added function. * tools/PTmasker.c (main): If one file is specified feather it, otherwise do nothing. * tiff.c, pttiff.h: (panoImageDispose): Disposes properly any memory used by the Image data structure. * ColourBrightness.c, PTcommon.c, ptstitch.c, PTcommon.c: replaced myfree(image.data) with panoImageDispose. * filter.c (panoMetadataFree): Set pointers to null once they have been released. 2006-12-18 dmg <dm...@uv...> * sys_ansi.c (PrintErrorIntern): The function had a limit of 256 bytes to print, and anything longer created a run time error. I have changed it to deal with any lenght. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/PTcommon.c trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/filter.c trunk/libpano/math.c trunk/libpano/metadata.c trunk/libpano/metadata.h trunk/libpano/ptfeather.c trunk/libpano/ptstitch.c trunk/libpano/ptstitch.h trunk/libpano/pttiff.h trunk/libpano/sys_ansi.c trunk/libpano/tiff.c trunk/libpano/tools/PTblender.c trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTmender.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/ChangeLog 2006-12-27 07:29:10 UTC (rev 639) @@ -1,3 +1,41 @@ +2006-12-26 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.7. + + * tiff.c (panoTiffDisplayInfo): Fixed compilation warning + + * math.c: Cleaned up some of the Lambert related code. + + * tools/PTblender.c: Improved error message + + * TODO: Updated it. + + * ptfeather.c: Improved the feathering algorithm, made sure 16 + bits works too. + + * ptstitch.c, ptstitch.h (panoStitchPixelChannelSet): Added function, + cleanedup panoStitchPixelChannelGet. + + * metadata.c (panoImageBytesPerSample): Added function. + + * tools/PTmasker.c (main): If one file is specified feather it, + otherwise do nothing. + + * tiff.c, pttiff.h: (panoImageDispose): Disposes properly any + memory used by the Image data structure. + + * ColourBrightness.c, PTcommon.c, ptstitch.c, PTcommon.c: replaced + myfree(image.data) with panoImageDispose. + + * filter.c (panoMetadataFree): Set pointers to null once they have + been released. + +2006-12-18 dmg <dm...@uv...> + + * sys_ansi.c (PrintErrorIntern): The function had a limit of 256 + bytes to print, and anything longer created a run time error. I + have changed it to deal with any lenght. + 2006-12-17 dangelo <pab...@we...> * math.c: added defines for isnan and isinf, if MSVC is used. Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/ColourBrightness.c 2006-12-27 07:29:10 UTC (rev 639) @@ -775,11 +775,11 @@ if (panoTiffWrite(&image, outPath->name) == 0) { PrintError("Could not read TIFF file %s", inPath->name); - myfree((void**)image.data); + panoImageDispose(&image); return -1; } - myfree((void**)image.data); + panoImageDispose(&image); return(0); } Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/PTcommon.c 2006-12-27 07:29:10 UTC (rev 639) @@ -143,8 +143,8 @@ Progress(_disposeProgress, tempString); return -1; } + panoImageDispose(&image); - myfree((void **) image.data); ptrImage = ℑ //Now iterate over all other images and add them as layers to the PSD file @@ -197,7 +197,7 @@ remove(outputFileName->name); rename(tempFile.name, outputFileName->name); - myfree((void **) image.data); + panoImageDispose(&image); } if (!ptQuietFlag) { @@ -1096,15 +1096,8 @@ #endif ////////////////////////////////////////////////////////////////////// + panoImageDispose(&image1); - if (image1.data != NULL) { - myfree((void **) image1.data); - image1.data = NULL; - - panoMetadataFree(&image1.metadata); - - } - // The memory for td and ts was allocated in morpher.c with malloc // (not myMalloc), so we need to use free (not myFree) if (prefs->td != NULL) { @@ -1116,13 +1109,8 @@ } free(prefs); - if (resultPanorama.data != NULL) { - myfree((void **) resultPanorama.data); - resultPanorama.data = NULL; - panoMetadataFree(&resultPanorama.metadata); - } + panoImageDispose(&resultPanorama); - } //End of main image processing loop if (!ptQuietFlag) @@ -1137,12 +1125,9 @@ remove(tempScriptFile.name); - if (resultPanorama.data != NULL) - myfree((void **) resultPanorama.data); + panoImageDispose(&resultPanorama); + panoImageDispose(&image1); - if (image1.data != NULL) - myfree((void **) image1.data); - #if 0 // NO LONGER SUPPORTED IN THIS FUNCTION. IT SHOULD BE REMOVED IN THE FUTURE Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/TODO 2006-12-27 07:29:10 UTC (rev 639) @@ -2,34 +2,60 @@ This file documents the activities required before we release version 3.0.0 of the library. +* Very little testing has been done in 16 bit images. + +* Perhaps the most pressing issue is to create a good set of tests for + each of the tools. So far we only have tests for PTmender (and only 2). + +What we need: + +* PTmender. We need to test each of the projections, and each of the + different types of input projections. + +* All others: they desperately need a test. + +Issues with creating the tests: + +* tiffcmp is good for comparing just the data in tiffs. But once one + starts using the non-deterministic parts of panotools (such as + colour correction and feathering) it is impossible to use them. What + we need is some type of program that reads the data inside an image + and compares it to be "similar" within certain threshold. + +* we also need the equivalent of tiffcmp for PSDs, where we can + specify we want to compare the data, not the metadata. The small + parser I have written might be exactly what we need: ignore all + metadata. It might be necessary to compare the "layer and masks + block", but not the ColorModedDataBlock or the Metadata block. It + might not be as easy as it sounds, because offset might have + shifted. + ====================================================================== KNOWN BUGS: ---------------------------------------------------------------------- All tools: -- Bug: There is a memory leak in panoTiffRead. I don't release the - memory it has allocated when an image is read. Create a - panoImageDispose routine. CRITICAL - - Command line processing. All tools should have similar command line processing. This needs to be checked, and updated, if - necessary. CRITICAL + necessary. + * I have updated most of them to be consistent, but I might have + missed something. Needs to be checked. + - PTcrop tries to read the entire image at once. With a huge image I got a segfault from inside libtiff. It needs to be rewritten to read - only one line at a time. + only one line at a time (not critical for 3.0.0, but it would be nice). - PTroller runs _extremely_ slow. I need to find out why. (not critical for 3.0.0) -- PTtiff2psd is unable to create PSDs beyond certain size (I suspect - this is a limitation of the format). We need to find this - limitation and output an error message informing the - user. Otherwise a PSD is created that is "corrupted" +- PTtiff2psd. I fixed a major bug in the implementation of writing the + metadata. I suspect that there are still some "issues" regarding + this. I have also written a small top-down parser to verify the data + written. - ---------------------------------------------------------------------- panoinfo: @@ -70,7 +96,7 @@ DESIRABLE: - - Feauture: Create photoshop curves and maps for HSV colour + - Feature: Create photoshop curves and maps for HSV colour corrections. Probably not for 3.0.0 ---------------------------------------------------------------------- @@ -78,7 +104,8 @@ DESIRABLE: -- PTroller: Add the ability to stack and add composing images. +- PTroller: Add the ability to stack and add composing + images (PTtiff2psd is able to do stacking and compositing) ---------------------------------------------------------------------- PTuncrop: Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/configure.ac 2006-12-27 07:29:10 UTC (rev 639) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.6], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.7], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/filter.c =================================================================== --- trunk/libpano/filter.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/filter.c 2006-12-27 07:29:10 UTC (rev 639) @@ -1043,17 +1043,26 @@ metadata->iccProfile.size = 0; } - if (metadata->copyright!=NULL) + if (metadata->copyright!=NULL) { free(metadata->copyright); + metadata->copyright = NULL; + } + - if (metadata->artist!=NULL) + if (metadata->artist!=NULL) { free(metadata->artist); + metadata->artist = NULL; + } - if (metadata->datetime!=NULL) - free(metadata->datetime); + if (metadata->datetime!=NULL) { + free(metadata->datetime); + metadata->datetime = NULL; + } - if (metadata->imageDescription!=NULL) + if (metadata->imageDescription!=NULL) { free(metadata->imageDescription); + metadata->imageDescription = NULL; + } } Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/math.c 2006-12-27 07:29:10 UTC (rev 639) @@ -601,11 +601,6 @@ lambda = x_dest/distance; phi = y_dest/distance; -/* - printf("To compute original x %10.4f y %10.4f distance %10.4f\n", x_dest, y_dest, distance); - printf("To compute x %10.4f y %10.4f\n", lambda, phi); - printf("To compute cos(y) %10.4f cos(x) %10.4f\n", cos(phi), cos(lambda)); -*/ if (abs(cos(phi) * cos(lambda) + 1.0) <= EPSLN) { *x_src = distance * 2 ; *y_src = 0; @@ -614,8 +609,6 @@ k1 = sqrt(2.0 / (1 + cos(phi) * cos(lambda))); - printf("To compute k %10.4f \n", k1); - *x_src = distance * k1 * cos(phi) * sin (lambda); *y_src = distance * k1 * sin(phi); @@ -630,11 +623,10 @@ x = x_dest/distance; y = y_dest/distance; - //x = x_dest; - //y = y_dest; assert(! isnan(x)); assert(! isnan(y)); + if (fabs(x) > PI || fabs(y) > PI) { *y_src = 0; *x_src = 0; @@ -645,9 +637,6 @@ if (fabs(ro) <= EPSLN) { - printf("** compute x %10.4f y %10.4f\n", x, y); - printf("** compute c %10.4f\n", ro); - *y_src = 0; *x_src = 0; return 1; @@ -659,8 +648,6 @@ if (fabs(ro * cos(c)) <= EPSLN ) { - printf("** compute x %10.4f y %10.4f\n", x, y); - printf("** compute cos(y) %10.4f cos(x) %10.4f\n", cos(c), c); *x_src = 0; return 1; } Modified: trunk/libpano/metadata.c =================================================================== --- trunk/libpano/metadata.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/metadata.c 2006-12-27 07:29:10 UTC (rev 639) @@ -104,6 +104,11 @@ return (image->metadata.bitsPerSample); } +int panoImageBytesPerSample(Image *image) +{ + return (image->metadata.bitsPerSample/8); +} + int panoImageFullWidth(Image *image) { assert(image!= NULL); Modified: trunk/libpano/metadata.h =================================================================== --- trunk/libpano/metadata.h 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/metadata.h 2006-12-27 07:29:10 UTC (rev 639) @@ -37,6 +37,7 @@ int panoImageIsCropped(Image *image); int panoImageBytesPerPixel(Image *image); int panoImageBitsPerSample(Image *image); +int panoImageBytesPerSample(Image *image); int panoImageBytesPerLine(Image *image); int panoImageFullWidth(Image *image); int panoImageFullHeight(Image *image); Modified: trunk/libpano/ptfeather.c =================================================================== --- trunk/libpano/ptfeather.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/ptfeather.c 2006-12-27 07:29:10 UTC (rev 639) @@ -39,187 +39,231 @@ #include <assert.h> #include <float.h> -static void panoFeatherSnowPixel8Bit(unsigned char *pixel, int featherSize, int contribution) +static void panoFeatherSnowPixel8Bit(unsigned char *pixel, int featherSize, unsigned int index) { int newPixel = 0; - int randomComponent; + int randomComponent = 0; + unsigned int level; - contribution = contribution / 0x100; + // printf("Value %d %d\n", *pixel, index); + // This operation could potentially overflow + level = (index * 255)/ featherSize; + // TODO: check this expression. It needs to be evaluated in the order specified by the // parenthesis - // THIS IS LIKELY TO OVERFLOW a few times... Make sure we do the arithmetic in long long to avoid overflows + //Make sure we do the arithmetic in long long to avoid overflows + randomComponent = ((rand() - RAND_MAX/2) * (0xfeLL /featherSize)) / RAND_MAX; - newPixel = *pixel - contribution + randomComponent; + // we need to split the following expression to guarantee it is computed as integer, not unsigned char - if ( newPixel <= 0 ) + newPixel = *pixel; + newPixel = newPixel- level + randomComponent; + + // printf("Value %d newvalue %d Contribution %d Random %d\n", *pixel, newPixel, level, randomComponent); + + if ( newPixel < 0 ) // we can't make it zero. We rely on value 1 to know where the actual edge of an image is - newPixel = 1; + *pixel = 0; else if (newPixel > 0xff) *pixel = 0xff; else *pixel = newPixel; } -static void panoFeatherSnowPixel16Bit(unsigned char *pixel, int featherSize, int contribution) +static void panoFeatherSnowPixel16Bit(unsigned char *pixel, int featherSize, int index) { int newPixel = 0; - int randomComponent; + int randomComponent = 0; + unsigned long long int level; uint16_t *pixel16; + + level = (index * 0xffff)/ featherSize; + pixel16 = (uint16_t *) pixel; - // TODO: check this expression. It needs to be evaluated in the order specified by the - // parenthesis - - // THIS IS LIKELY TO OVERFLOW a few times... Make sure we do the arithmetic in long long to avoid overflows + // Make sure we do the arithmetic in long long to avoid overflows randomComponent = ((rand() - RAND_MAX/2) * (0xfe00LL /featherSize)) / RAND_MAX; - newPixel = *pixel16 - contribution + randomComponent; + newPixel = *pixel16 - level + randomComponent; + // printf("Value %d newvalue %d Contribution %d Random %d\n", *pixel16, newPixel, level, randomComponent); + if ( newPixel <= 0 ) // we can't make it zero. We rely on value 1 to know where the actual edge of an image is - newPixel = 1; + *pixel16 = 0; else if (newPixel > 0xffff) *pixel16 = 0xffff; - else + else { *pixel16 = newPixel; + } } -static void panoFeatherSnowPixel(unsigned char *pixel, int featherSize, int contribution, int bitsPerSample) +static void panoFeatherSnowPixel(unsigned char *pixel, int featherSize, int index, int bytesPerSample) { - if (bitsPerSample == 8) - panoFeatherSnowPixel8Bit(pixel, featherSize, contribution); - else if (bitsPerSample == 16) - panoFeatherSnowPixel16Bit(pixel, featherSize, contribution); + if (bytesPerSample == 1) + panoFeatherSnowPixel8Bit(pixel, featherSize, index); + else if (bytesPerSample == 2) + panoFeatherSnowPixel16Bit(pixel, featherSize, index); else assert(0); } - -static void panoFeatherSnowingHorizontalLeft(int edi, int ratio, int column, int featherSize, unsigned char *ptrData, Image *image) +static void panoFeatherSnowingHorizontalLeft(int column, int featherSize, unsigned char *ptrData, Image *image) { int index; int currentColumn; unsigned char *ptrPixel; + unsigned int pixel; int bytesPerPixel = panoImageBytesPerPixel(image); - int bitsPerSample = panoImageBitsPerSample(image); + int bytesPerSample = panoImageBytesPerSample(image); - for (currentColumn = column + edi/2 + 1, index=1; currentColumn >= column - edi/2; currentColumn--, index++ ) { + // ptrData points to the beginning of the line + // We start to the right, because the current column is the empty one + for (currentColumn = column+1, index = featherSize; currentColumn < column + featherSize+1; currentColumn++, index-- ) { + + // only operate within the image // and IF the mask is not zero // We do not want to "feather" outside the boundary + if (currentColumn < 0 || currentColumn >= panoImageWidth(image)) + continue; + ptrPixel = ptrData + currentColumn * bytesPerPixel; + pixel = panoStitchPixelChannelGet(ptrPixel, bytesPerSample, 0); - if (currentColumn < 0 || currentColumn >= panoImageWidth(image) || - *ptrPixel == 0) { - continue; - } - panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + if (pixel == 0) {// stop when we find the edge + // printf("Breaking %d\n", currentColumn); + break; + } + panoFeatherSnowPixel(ptrPixel, featherSize, index, bytesPerSample); - } ///for (currentColumn = column - edi/2; currentColumn <= column; currentColumn++, index++ ) { + } ///for - + // printf("End\n"); } -static void panoFeatherSnowingVerticalTop(int edi, int ratio, int row, int featherSize, unsigned char *ptrData, Image *image) +static void panoFeatherSnowingHorizontalRight(int column, int featherSize, unsigned char *ptrData, Image *image) { int index; - int currentRow; + int currentColumn; + unsigned int pixel; unsigned char *ptrPixel; + int bytesPerPixel = panoImageBytesPerPixel(image); + int bytesPerSample = panoImageBytesPerSample(image); - int bytesPerLine = panoImageBytesPerLine(image); - int bitsPerSample = panoImageBitsPerSample(image); + // ptrData points to the beginning of the line - for (currentRow = row + edi/2 + 1, index=1; currentRow >= row - edi/2; currentRow--, index++ ) { + // panoFeatherSnowingAreaVerticalFind(ptrData, bytesPerLine, gradient, column, &leftLines, &rightLines); + // determine where we start snowing to the left + + index = 1; + + for (currentColumn = column, index = featherSize; currentColumn > column - featherSize; currentColumn--, index-- ) { + + // only operate within the image // and IF the mask is not zero // We do not want to "feather" outside the boundary - ptrPixel = ptrData + currentRow * bytesPerLine; - - if (currentRow < 0 || currentRow >= panoImageHeight(image) || - *ptrPixel == 0) { + if (currentColumn < 0 || currentColumn >= panoImageWidth(image)) continue; - } - panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + ptrPixel = ptrData + currentColumn * bytesPerPixel; + pixel = panoStitchPixelChannelGet(ptrPixel, bytesPerSample, 0); - } ///for (currentRow = row - edi/2; currentRow <= row; currentRow++, index++ ) { + if (pixel == 0) {// stop when we find the edge + // printf("Breaking %d\n", currentColumn); + break; + } + panoFeatherSnowPixel(ptrPixel, featherSize, index, bytesPerSample); + + } ///for (currentColumn = column - gradient/2; currentColumn <= column; currentColumn++, index++ ) { - + // printf("End\n"); } - -static void panoFeatherSnowingVerticalBottom(int edi, int ratio, int row, int featherSize, unsigned char *ptrData, Image *image) +static void panoFeatherSnowingVerticalBottom(int row, int featherSize, unsigned char *ptrData, Image *image) { int index; int currentRow; - + int pixel; unsigned char *ptrPixel; int bytesPerLine = panoImageBytesPerLine(image); - int bitsPerSample = panoImageBitsPerSample(image); + int bytesPerSample = panoImageBytesPerSample(image); + for (currentRow = row, index=featherSize; currentRow > row - featherSize; currentRow--, index-- ) { - for (currentRow = row - edi/2, index=1; currentRow <= row + edi/2; currentRow++, index++ ) { - // only operate within the image // and IF the mask is not zero // We do not want to "feather" outside the boundary - ptrPixel = ptrData + currentRow * bytesPerLine; - - if (currentRow < 0 || currentRow >= panoImageHeight(image) || - *ptrPixel == 0) { + if (currentRow < 0 || currentRow >= panoImageHeight(image)) { continue; } - panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + ptrPixel = ptrData + currentRow * bytesPerLine; - } ///for (currentRow = row - edi/2; currentRow <= row; currentRow++, index++ ) { - + pixel = panoStitchPixelChannelGet(ptrPixel, bytesPerSample, 0); -} + if (pixel == 0) {// stop when we find the edge + // printf("Breaking %d\n", currentRow); + break; + } + // printf("Doing...\n"); + panoFeatherSnowPixel(ptrPixel, featherSize, index, bytesPerSample); + } ///for (currentRow = row - gradient/2; currentRow <= row; currentRow++, index++ ) { + +} -static void panoFeatherSnowingHorizontalRight(int edi, int ratio, int column, int featherSize, unsigned char *ptrData, Image *image) +static void panoFeatherSnowingVerticalTop(int row, int featherSize, unsigned char *ptrData, Image *image) { int index; - int currentColumn; - int bitsPerSample = panoImageBitsPerSample(image); + int currentRow; + int pixel; unsigned char *ptrPixel; - int bytesPerPixel = panoImageBytesPerPixel(image); + int bytesPerLine = panoImageBytesPerLine(image); + int bytesPerSample = panoImageBytesPerSample(image); - for (currentColumn = column - edi/2, index=1; currentColumn <= column + edi/2; currentColumn++, index++ ) { + for (currentRow = row+1, index=featherSize; currentRow < row + featherSize+1; currentRow++, index-- ) { // only operate within the image // and IF the mask is not zero // We do not want to "feather" outside the boundary - ptrPixel = ptrData + currentColumn * bytesPerPixel; - if (currentColumn < 0 || currentColumn >= panoImageWidth(image) || - *ptrPixel == 0) { + if (currentRow < 0 || currentRow >= panoImageHeight(image)) { continue; } - panoFeatherSnowPixel(ptrPixel, featherSize, index * ratio, bitsPerSample); + ptrPixel = ptrData + currentRow * bytesPerLine; - } ///for (currentColumn = column - edi/2; currentColumn <= column; currentColumn++, index++ ) { + pixel = panoStitchPixelChannelGet(ptrPixel, bytesPerSample, 0); + if (pixel == 0) {// stop when we find the edge + // printf("Breaking %d\n", currentRow); + break; + } + panoFeatherSnowPixel(ptrPixel, featherSize, index, bytesPerSample); + } ///for (currentRow = row - gradient/2; currentRow <= row; currentRow++, index++ ) { + } -static void panoFeatherMaskReplace(Image* image, unsigned int from, unsigned int to) + + +void panoFeatherMaskReplace(Image* image, unsigned int from, unsigned int to) { // Replace a given value in the first channel with the desired value @@ -265,13 +309,107 @@ } -static void panoFeatherImage(Image * image, int featherSize) +void panoFeatherChannelSave(unsigned char *channelBuffer, Image *image, int channel) { + // Copy a given channel to a preallocated buffer area + int i, j,k; + int bytesPerChannel; + unsigned char *imageData; + int bytesPerPixel; + bytesPerChannel = panoImageBytesPerSample(image); + imageData = panoImageData(image); + bytesPerPixel = panoImageBytesPerPixel(image); + + for (i=0;i<panoImageWidth(image);i++) + for (j=0;j<panoImageHeight(image);j++) { + for (k=0;k<bytesPerChannel;k++) { + *(channelBuffer+k) = *(imageData + bytesPerChannel * channel + k); + } + channelBuffer += bytesPerChannel; + imageData += bytesPerPixel; + } +} + +void panoFeatherChannelMerge(unsigned char *channelBuffer, Image *image, int channel) +{ + // We merge two alpha channels using the "multiply" operation. + + // Copy a given channel to a preallocated buffer area + int i, j; + int bytesPerChannel; + unsigned char *imageData; + int bytesPerPixel; + unsigned int a, b; + unsigned long long int la, lb; + + // FIrst test the rest of the logic before we do this + + bytesPerChannel = panoImageBytesPerSample(image); + imageData = panoImageData(image); + bytesPerPixel = panoImageBytesPerPixel(image); + + for (i=0;i<panoImageWidth(image);i++) + for (j=0;j<panoImageHeight(image);j++) { + if (bytesPerChannel == 1) { + a = *(imageData); + b = *(channelBuffer); + + if (a < b) + *(imageData) = a; + else + *(imageData) = b; + } else if (bytesPerChannel == 2) { + la = *((uint16_t*)imageData); + lb = *((uint16_t*)channelBuffer); + if (la < lb) + *((uint16_t*)imageData) = la; + else + *((uint16_t*)imageData) = lb; + } else { + assert(0); + } + channelBuffer += bytesPerChannel; + imageData += bytesPerPixel; + } +} + +void panoFeatherChannelSwap(unsigned char *channelBuffer, Image *image, int channel) +{ + // Swaps the data from a given channel + int i, j,k; + int bytesPerChannel; + unsigned char temp; + unsigned char *imageData; + int bytesPerPixel; + + bytesPerChannel = panoImageBytesPerSample(image); + imageData = panoImageData(image); + bytesPerPixel = panoImageBytesPerPixel(image); + // printf("Bytes per channel %d\n", bytesPerChannel); + for (i=0;i<panoImageWidth(image);i++) + for (j=0;j<panoImageHeight(image);j++) { + for (k=0;k<bytesPerChannel;k++) { + temp = *(channelBuffer+k); + *(channelBuffer+k) = *(imageData + bytesPerChannel * channel + k); + *(imageData + bytesPerChannel * channel + k) = temp; + } + channelBuffer += bytesPerChannel; + imageData += bytesPerPixel; + } +} + + + + +static int panoFeatherImage(Image * image, int featherSize) +{ + int ratio; int difference; unsigned char *pixelPtr; unsigned char *ptrData; + unsigned char *savedAlphaChannel; int column; int row; int gradient; @@ -286,16 +424,17 @@ int imageFullWidth; int imageFullHeight; int bitsPerSample; - + int bytesPerSample; unsigned char *imageData; if (featherSize == 0) - return; + return 1; // Use local variables so we don't have to make function calls for each // iteration bitsPerSample = panoImageBitsPerSample(image); + bytesPerSample = bitsPerSample /8; bytesPerPixel = panoImageBytesPerPixel(image); bytesPerLine = panoImageBytesPerLine(image); imageHeight = panoImageHeight(image); @@ -311,7 +450,7 @@ // This is sort of a hack. We replace 0's in the mask with 1's // we have to "undo" it at the end - panoFeatherMaskReplace(image, 0, 1); + // panoFeatherMaskReplace(image, 0, 1); ratio = 0xfe00 / featherSize; @@ -320,13 +459,20 @@ assert(bitsPerSample == 8 || bitsPerSample == 16); + // This algorithm is not perfect. It does not deal very well with images that have very wavy edges. + // For that reason I feather in one direction, then in the other, and then I combine the feathers + // This means we need to allocate space for an extra channel + + savedAlphaChannel = calloc(bytesPerLine * imageHeight, 1); + if (savedAlphaChannel == NULL) { + return 0; + } + panoFeatherChannelSave(savedAlphaChannel, image, 0); ptrData = imageData; for ( row = 0; row < imageHeight; row++, ptrData += bytesPerLine) { int widthToProcess; - column = 0; - pixelPtr = ptrData; // The following code deals with images that are cropped. We should feather edges only @@ -362,43 +508,38 @@ // this is the imaginary pixel to the left of the edge that should be feathered thisPixel = 1; } else { - thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerPixel, 0); + thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerSample, 0); } if (column >= imageWidth -1) { // this is the imaginary pixel to the right of the edge that should be feathered nextPixel = 1; } else { - nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerPixel, bytesPerPixel, 0); + nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerPixel, bytesPerSample, 0); } - if (thisPixel != 0 && nextPixel != 0) { - - difference = thisPixel - nextPixel; - - // This operation needs to be done here, otherwise 0x100/ratio will underflow - if (bitsPerSample == 8) { - gradient = (abs(difference) * 0x100LL) / ratio; - } - else if (bitsPerSample == 16) { - gradient = abs(difference) / ratio; - } else - assert(0); - + difference = thisPixel - nextPixel; + + // This operation needs to be done here, otherwise 0x100/ratio will underflow + if (bitsPerSample == 8) { + gradient = (abs(difference) * 0x100LL) / ratio; + } + else if (bitsPerSample == 16) { + gradient = abs(difference) / ratio; + } else + assert(0); + + if (nextPixel == 0 && thisPixel != 0) { + // Moving from the mask... proceed if there is not + if ( gradient > 1 ) { // - - // if difference is positive, which means we are moving from a darker are to a softer area - if ( difference > 0 ) { - - panoFeatherSnowingHorizontalRight(gradient, ratio, column, featherSize, ptrData, image); - - } else if ( difference < 0 ) { - panoFeatherSnowingHorizontalLeft(gradient, ratio, column, featherSize, ptrData, image); - - } else { // difference == 0 - ; // do nothing in this case - } - + panoFeatherSnowingHorizontalRight(column, featherSize, ptrData, image); + } + } + + if (thisPixel == 0 && nextPixel != 0) { + if ( gradient > 1 ) { // + panoFeatherSnowingHorizontalLeft(column, featherSize, ptrData, image); } // } // @@ -406,10 +547,11 @@ } // for column... } // for row - + // We need to do the same in the orthogonal direction // Sometimes I wished I had iterators over an image... + panoFeatherChannelSwap(savedAlphaChannel, image, 0); ptrData = imageData; @@ -453,56 +595,98 @@ // this is the imaginary pixel to the left of the edge that should be feathered thisPixel = 1; } else { - thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerPixel, 0); + thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerSample, 0); } if (row >= imageHeight -1) { // this is the imaginary pixel to the right of the edge that should be feathered nextPixel = 1; } else { - nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerLine, bytesPerPixel, 0); + nextPixel = panoStitchPixelChannelGet(pixelPtr + bytesPerLine, bytesPerSample, 0); } + difference = thisPixel - nextPixel; - if (thisPixel != 0 && nextPixel != 0) { + // This operation needs to be done here, otherwise 0x100/ratio will underflow + if (bitsPerSample == 8) { + gradient = (abs(difference) * 0x100LL) / ratio; + } + else if (bitsPerSample == 16) { + gradient = abs(difference) / ratio; + } else + assert(0); - difference = thisPixel - nextPixel; - - // This operation needs to be done here, otherwise 0x100/ratio will underflow - if (bitsPerSample == 8) { - gradient = (abs(difference) * 0x100LL) / ratio; - } - else if (bitsPerSample == 16) { - gradient = abs(difference) / ratio; - } else - assert(0); - - if ( gradient > 1 ) { // + if (gradient > 1) { - // if difference is positive, which means we are moving from a darker are to a softer area - if ( difference > 0 ) { - - panoFeatherSnowingVerticalBottom(gradient, ratio, row, featherSize, ptrData, image); - - } else if ( difference < 0 ) { - - panoFeatherSnowingVerticalTop(gradient, ratio, row, featherSize, ptrData, image); - - } else { // difference == 0 - ; // do nothing in this case - } - - } // - - } // - + if (nextPixel == 0 && thisPixel != 0) { + // Moving from the mask... proceed if there is not + panoFeatherSnowingVerticalBottom(row, featherSize, ptrData, image); + } + + if (nextPixel != 0 && thisPixel == 0) { + panoFeatherSnowingVerticalTop(row, featherSize, ptrData, image); + } + } + } // for column... } // for row + // Average mask to avoid banding + +#if 0 - panoFeatherMaskReplace(image, 1, 0); + // THIS WAS AN ATTEMPT TO REMOVE BANDING, BUT IT IS TOO SIMPLE... IT WOULD REQUIRE A LARGER AREA, + // OR EVEN BETTER, A KERNEL BASED BLUR + + { + int row, column; + unsigned int above, below,left, right, thisPixel; + pixelPtr = imageData; + + for ( row = 0; row < imageHeight; row++) { + for ( column = 0; column < imageWidth; column++, pixelPtr += bytesPerPixel) { + // average pixel to its pixels around + thisPixel = panoStitchPixelChannelGet(pixelPtr, bytesPerSample, 0); + + + if (thisPixel == 0) + continue; + + if ((bitsPerSample == 8 && thisPixel == 0xff) || + (bitsPerSample == 16 && thisPixel == 0xffff)) { + continue; + } + + // average to its neighbors + + above = below = left = right = thisPixel; + if (row > 0) + above = panoStitchPixelChannelGet(pixelPtr - bytesPerLine, bytesPerSample, 0); + + if (row < imageHeight) + below = panoStitchPixelChannelGet(pixelPtr + bytesPerLine, bytesPerSample, 0); + + if (column > 0) + left = panoStitchPixelChannelGet(pixelPtr - bytesPerLine, bytesPerSample, 0); + + if (column < imageWidth) + right = panoStitchPixelChannelGet(pixelPtr + bytesPerLine, bytesPerSample, 0); + + thisPixel = (thisPixel + above + below + left + right)/ 5; + + panoStitchPixelChannelSet(pixelPtr, bytesPerSample, 0, thisPixel); + + } + } + } +#endif + + panoFeatherChannelMerge(savedAlphaChannel, image, 0); + free(savedAlphaChannel); + + return 1; } @@ -531,12 +715,8 @@ return 0; } - ///XXXXXXXXXXXXX we need to properly release the memory allocated - // including themetatada + panoImageDispose(&image); - - myfree((void **) image.data); - return 1; } Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/ptstitch.c 2006-12-27 07:29:10 UTC (rev 639) @@ -37,18 +37,18 @@ #include "metadata.h" // Get the value of a channel in the pixel pointed by ptr -unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel) +unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerChannel, int channel) { uint16_t *pixel16; assert(ptr != NULL); assert(channel >= 0 && channel <=3); - assert(bytesPerPixel == 4 || bytesPerPixel ==8); + assert(bytesPerChannel == 1 || bytesPerChannel ==2); - if (bytesPerPixel == 4) { + if (bytesPerChannel == 1) { return *(ptr + channel); } - else if (bytesPerPixel == 8) { + else if (bytesPerChannel == 2) { pixel16 = (uint16_t *) ptr; return *(pixel16+channel); } @@ -59,6 +59,28 @@ } +// Get the value of a channel in the pixel pointed by ptr +void panoStitchPixelChannelSet(unsigned char *ptr, int bytesPerChannel, int channel, unsigned int value) +{ + uint16_t *pixel16; + assert(ptr != NULL); + + assert(channel >= 0 && channel <=3); + assert(bytesPerChannel == 4 || bytesPerChannel ==8); + + if (bytesPerChannel == 4) { + *(ptr + channel) = value; + } + else if (bytesPerChannel == 8) { + pixel16 = (uint16_t *) ptr; + *(pixel16+channel) = value; + } + else { + assert(0); + } + +} + static unsigned int panoStitchPixelMapGet(unsigned char *ptr, int bytesPerPixel) { uint16_t *pixel16; @@ -106,7 +128,7 @@ assert(bytesPerPixel == 4 || bytesPerPixel ==8); assert(pixel != NULL); - alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel, 0); + alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel/4, 0); if (alphaChannel == 0) { *count = 0; @@ -180,7 +202,7 @@ // Get alpha channel for this point pixel = ptr + row * panoImageBytesPerLine(image); - alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel, 0); + alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel/4, 0); if (alphaChannel == 0) { count = 0; @@ -290,7 +312,7 @@ // fprintf(stderr, "Written to file %s\n", maskFiles[index].name); - myfree((void **) image.data); + panoImageDispose(&image); } // for (index... Modified: trunk/libpano/ptstitch.h =================================================================== --- trunk/libpano/ptstitch.h 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/ptstitch.h 2006-12-27 07:29:10 UTC (rev 639) @@ -43,6 +43,7 @@ int numberImages, int featherSize); unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel); +void panoStitchPixelChannelSet(unsigned char *ptr, int bytesPerPixel, int channel, unsigned int value); Modified: trunk/libpano/pttiff.h =================================================================== --- trunk/libpano/pttiff.h 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/pttiff.h 2006-12-27 07:29:10 UTC (rev 639) @@ -85,6 +85,7 @@ int panoTiffVerifyAreCompatible(fullPath * tiffFiles, int numberImages, int optionalCheck); +void panoImageDispose(Image *im) ; #endif Modified: trunk/libpano/sys_ansi.c =================================================================== --- trunk/libpano/sys_ansi.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/sys_ansi.c 2006-12-27 07:29:10 UTC (rev 639) @@ -38,15 +38,23 @@ void PrintErrorIntern( char* fmt, va_list ap) { - char message[257]; - - vsprintf(message, fmt, ap); - + char message[512]; + char *toPrint; + + if (strlen(fmt) < 512) { + vsprintf(message, fmt, ap); + toPrint = message; + } else { + // we don't have enough space, so just + // print original string + toPrint = fmt; + } + if( JavaUI ){ - JPrintError( message ); + JPrintError( toPrint ); }else{ - printf("%s\n", message); - fflush(stdout); + printf(toPrint); + fflush(stdout); } } Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/tiff.c 2006-12-27 07:29:10 UTC (rev 639) @@ -1359,6 +1359,7 @@ error: myfree((void**)im->data); + im->data = NULL; return 0; } @@ -1552,7 +1553,24 @@ } +// THis functions clens any memory currently used by the Image +// data structure +void panoImageDispose(Image *im) +{ + if (im != NULL) { + // Release metadata + panoMetadataFree(&(im->metadata)); + + // Release image data + if (im->data != NULL) { + myfree((void **) im->data); + im->data = NULL; + } + } +} + + void panoTiffErrorHandler(const char *module, const char *fmt, va_list ap) { PrintError("Error in TIFF file (%s) ", module); @@ -1822,7 +1840,7 @@ for (column = 0; column < width; column++) { - alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel, 0); + alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel/4, 0); if (alphaChannel != 0) { // Only set the row the first time @@ -1980,12 +1998,11 @@ printf("Dimensions: %d,%d\n", meta->imageWidth, meta->imageHeight); if (meta->isCropped) { printf("Cropped tiff. Full size: %d,%d Offset: %d,%d\n", - meta->cropInfo.fullWidth, meta->cropInfo.fullHeight, - meta->cropInfo.xOffset, meta->cropInfo.yOffset); + (int)meta->cropInfo.fullWidth, (int)meta->cropInfo.fullHeight, + (int)meta->cropInfo.xOffset, (int)meta->cropInfo.yOffset); } printf("Samples per pixel: %d\n", meta->samplesPerPixel); printf("Bits per sample: %d\n", meta->bitsPerSample); - printf("Compression: %d\n", meta->compression); if (meta->iccProfile.size == 0) { printf("Contains ICC profile\n"); @@ -2010,5 +2027,5 @@ } } - + return 1; } Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/tools/PTblender.c 2006-12-27 07:29:10 UTC (rev 639) @@ -202,7 +202,7 @@ if (!ptForceProcessing) { char *temp; if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { - PrintError("Output filename exists %d", temp); + PrintError("Output filename(s) exists. Use -f to overwrite"); return -1; } Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/tools/PTmasker.c 2006-12-27 07:29:10 UTC (rev 639) @@ -34,10 +34,10 @@ #include <sys/types.h> #include <dirent.h> -#ifndef _MSC_VER -#include <unistd.h> -#else -#include "compat_win32/getopt.h" +#ifndef _MSC_VER +#include <unistd.h> +#else +#include "compat_win32/getopt.h" #endif #include <errno.h> @@ -156,6 +156,7 @@ return -1; } + #ifdef testingfeather panoFeatherFile(ptrInputFiles, ptrOutputFiles, feather); exit(1); @@ -167,13 +168,28 @@ PrintError("Output filename exists %s. Use -f to overwrite", temp); return -1; } - if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { - PrintError("Input files are not compatible. Use -f to overwrite"); - return -1; + if (filesCount > 1) { + if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("Input files are not compatible. Use -f to overwrite"); + return -1; + } } } if (! ptQuietFlag) printf("Computing seams for %d files\n", filesCount); + if (filesCount == 1) { + // only do feathering + if (feather == 0) { + PrintError("Only one file specified, nothing to do\n"); + return -1; + } + if (panoFeatherFile(ptrInputFiles, ptrOutputFiles, feather)) { + return 0; + } else + return 1; + + } + if (panoStitchReplaceMasks(ptrInputFiles, ptrOutputFiles, filesCount, feather) != 0) { PrintError("Could not create stitching masks"); Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/tools/PTmender.c 2006-12-27 07:29:10 UTC (rev 639) @@ -307,11 +307,11 @@ fprintf(stderr, "Number of options to process %d\n", argc- optind); } - if (optind - argc == 0) { PrintError(PT_MENDER_USAGE); return -1; } + // First we get the name of the script if (StringtoFullPath(&scriptFileName, argv[optind]) !=0) { // success PrintError("Syntax error: Not a valid pathname"); Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-12-26 20:03:59 UTC (rev 638) +++ trunk/libpano/version.h 2006-12-27 07:29:10 UTC (rev 639) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.6 " +#define VERSION "2.9.7 " #endif #ifndef PTVERSION_NAME_LONG @@ -38,7 +38,7 @@ #endif #ifndef PTVERSION_FILEVERSIONNUMBER -#define PTVERSION_FILEVERSIONNUMBER 2,9,6,-1 +#define PTVERSION_FILEVERSIONNUMBER 2,9,7,-1 #endif #ifndef PTVERSION_NAME_FILEVERSION This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-31 07:43:39
|
Revision: 641 http://svn.sourceforge.net/panotools/?rev=641&view=rev Author: dangelo Date: 2006-12-30 23:43:39 -0800 (Sat, 30 Dec 2006) Log Message: ----------- fix signed vs unsigned warnings Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/PTcommon.c trunk/libpano/file.c trunk/libpano/ptstitch.c trunk/libpano/queryfeature.c trunk/libpano/tiff.c trunk/libpano/tools/PTmender.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/ChangeLog 2006-12-31 07:43:39 UTC (rev 641) @@ -1,3 +1,9 @@ +2006-12-31 dangelo <pab...@we...> + + * ColourBrightness.c, file.c, PTcommon.c, ptstitch.c, queryfeature.c, + tiff.c, tools/PTmender.c: Cleanup signed vs unsigned warnings + + 2006-12-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.7. Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/ColourBrightness.c 2006-12-31 07:43:39 UTC (rev 641) @@ -1307,7 +1307,7 @@ // fprintf(stderr,"Width %d Length %d BytesPerPixel %d per line%d\n", imageWidth, imageLength, bytesPerPixel, bytesPerLine); - for (currentRow = 0; currentRow < imageLength; currentRow ++) { + for (currentRow = 0; currentRow < (int) imageLength; currentRow ++) { if (currentRow * 2 == (int)(currentRow / 5.0) * 10) { @@ -1357,7 +1357,7 @@ //for each pixel in the current line... - for (currentPixel = 0; currentPixel < imageWidth; currentPixel++, ptrCurrentPixelLineBuffer+= bytesPerPixel ) { + for (currentPixel = 0; currentPixel < (int)imageWidth; currentPixel++, ptrCurrentPixelLineBuffer+= bytesPerPixel ) { unsigned char *ptrPixel; unsigned char *ptrOtherPixel; Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/PTcommon.c 2006-12-31 07:43:39 UTC (rev 641) @@ -1470,7 +1470,7 @@ return 0; } - for (i = 0; i < counterImageFiles; i++) { + for (i = 0; (int) i < counterImageFiles; i++) { if (GetFullPath(&fullPathImages[i], tmpFilename) != 0) { PrintError("Could not get filename"); @@ -1538,7 +1538,7 @@ // code simpler, however. imageDataBuffers = calloc(counterImageFiles, sizeof(unsigned char *)); - for (i = 0; i < counterImageFiles; i++) { + for (i = 0; (int) i < counterImageFiles; i++) { imageDataBuffers[i] = calloc(linesPerPass * outputMetadata->bytesPerLine, 1); if (imageDataBuffers[i] == NULL) { @@ -1569,14 +1569,14 @@ // combine into output buffer, write to file while (linesLeft > 0) { - linesToRead = (linesLeft > linesPerPass) ? linesPerPass : linesLeft; + linesToRead = (linesLeft > (int)linesPerPass) ? linesPerPass : linesLeft; // iterate over each input file - for (i = 0; i < counterImageFiles; i++) { + for (i = 0; (int) i < counterImageFiles; i++) { cropInfo = &(tiffFileHandles[i]->metadata.cropInfo); // Get a few lines of data from this input file one row at a time - for (rowInPass = 0; rowInPass < linesToRead; rowInPass++) { + for (rowInPass = 0; rowInPass < (int) linesToRead; rowInPass++) { //figure out which row to read/write from input/output images outputImageRowIndex = offsetBeforeThisPass + rowInPass; @@ -1642,7 +1642,7 @@ // printf("Lines read %d from %d\n", offsetBeforeThisPass,outputMetadata->imageHeight); - for (i = 0; i < counterImageFiles; i++) { + for (i = 0; (int) i < counterImageFiles; i++) { free(imageDataBuffers[i]); panoTiffClose(tiffFileHandles[i]); } @@ -1650,7 +1650,7 @@ panoTiffClose(outputFile); if (removeOriginals) { - for (i = 0; i < counterImageFiles; i++) { + for (i = 0; (int) i < counterImageFiles; i++) { remove(fullPathImages[i].name); } } Modified: trunk/libpano/file.c =================================================================== --- trunk/libpano/file.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/file.c 2006-12-31 07:43:39 UTC (rev 641) @@ -407,7 +407,7 @@ //WRITEINT32( im->height ); //WRITEINT32( im->width ); - printf("It is sropped %d\n", panoImageIsCropped(im)); + printf("It is cropped %d\n", panoImageIsCropped(im)); //The Photoshop file has the dimensions of the full size image, regardless //of whether the TIFF file is "cropped" or not. Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/ptstitch.c 2006-12-31 07:43:39 UTC (rev 641) @@ -929,13 +929,13 @@ currentLine = 0; - for (currentLine = 0; currentLine < lines; currentLine++) { + for (currentLine = 0; (int)currentLine < lines; currentLine++) { //printf("Currnet line %d\n", currentLine); rowOffset = scanLineSize * currentLine; - for (currentColumn = 0; currentColumn < imageWidth; currentColumn++) { + for (currentColumn = 0; (int) currentColumn < imageWidth; currentColumn++) { unsigned int pixelOffset; unsigned int i; @@ -1051,7 +1051,7 @@ currentLine = 0; - for (currentLine = 0; currentLine < lines; currentLine++) { + for (currentLine = 0; (int) currentLine < lines; currentLine++) { // printf("Lines %d\n", lines); // printf("Width %d\n", imageWidth); @@ -1063,7 +1063,7 @@ // scanLineSize is in bytes, but we need the length in 16bit units rowOffset = (scanLineSize / 2) * currentLine; - for (currentColumn = 0; currentColumn < imageWidth; currentColumn++) { + for (currentColumn = 0; (int) currentColumn < imageWidth; currentColumn++) { unsigned int pixelOffset; unsigned int i; Modified: trunk/libpano/queryfeature.c =================================================================== --- trunk/libpano/queryfeature.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/queryfeature.c 2006-12-31 07:43:39 UTC (rev 641) @@ -241,7 +241,7 @@ } // make sure that the copied string always is NULL terminated, even if truncated // (except if the buffer holds only zero bytes): - if( result && (length >= bufsize) && (bufsize > 0) ) + if( result && ((int)length >= bufsize) && (bufsize > 0) ) { result[bufsize-1]=0; } Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/tiff.c 2006-12-31 07:43:39 UTC (rev 641) @@ -434,7 +434,7 @@ setCropInformationInTiff(tif, crop_info); bufsize = TIFFScanlineSize(tif); - if (bufsize < im->bytesPerLine) + if ((pt_int32)bufsize < im->bytesPerLine) bufsize = im->bytesPerLine; buf = (UCHAR *) malloc(bufsize); if (buf == NULL) @@ -443,7 +443,7 @@ return -1; } - for (y = 0; y < im->height; y++) + for (y = 0; (pt_int32) y < im->height; y++) { memcpy(buf, *(im->data) + y * im->bytesPerLine, (size_t) im->bytesPerLine); @@ -1161,7 +1161,7 @@ return 0; } - for (row = 0; row < im->height; row++) { + for (row = 0; (pt_int32) row < im->height; row++) { if (TIFFReadScanline(tif->tiff, buf, row, 0) != 1) { PrintError("Error reading TIFF file"); goto error; @@ -1417,7 +1417,7 @@ bufsize = TIFFScanlineSize(tif->tiff); - if (bufsize < im->bytesPerLine) + if ((pt_int32)bufsize < im->bytesPerLine) bufsize = im->bytesPerLine; buf = calloc(bufsize, 1); @@ -1426,7 +1426,7 @@ goto error; } - for (y = 0; y < im->height; y++) { + for (y = 0; (pt_int32) y < im->height; y++) { // printf("Here 1 buffsize %d bytesperline %d width %d\n", bufsize, im->bytesPerLine, im->width); memcpy(buf, *(im->data) + y * im->bytesPerLine, (size_t) im->bytesPerLine); @@ -1769,7 +1769,7 @@ assert(metadata->imageHeight > 0); // Read one line at a time and transfer to output file - for (outputRow = 0; outputRow < metadata->imageHeight; outputRow++) { + for (outputRow = 0; outputRow < (int) metadata->imageHeight; outputRow++) { //fill empty buffer with empty space (zeros) bzero(buffer, metadata->bytesPerLine); @@ -1940,7 +1940,7 @@ // We need to advance data the number of lines that this file has more of ofset data += im.bytesPerLine * cropInfo.yOffset; - for (i =0;i < metadata.imageHeight; i++) { + for (i =0;i < (int) metadata.imageHeight; i++) { unsigned char *ptr; // skip the necessary bytes Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-12-30 20:57:35 UTC (rev 640) +++ trunk/libpano/tools/PTmender.c 2006-12-31 07:43:39 UTC (rev 641) @@ -96,7 +96,7 @@ exit(1); } - temp = fwrite(script, 1, strlen(script), scriptFD); + temp = fwrite(script, 1, (int) strlen(script), scriptFD); if (strlen(script) != temp) { PrintError("Could not write temporary Scriptfile"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2006-12-31 08:38:09
|
Revision: 643 http://svn.sourceforge.net/panotools/?rev=643&view=rev Author: dangelo Date: 2006-12-31 00:38:08 -0800 (Sun, 31 Dec 2006) Log Message: ----------- fixed default output in PTmasker, compile PTroller when using MSVC Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/libpano.sln trunk/libpano/libpano.vcproj trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTroller.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-12-31 08:20:51 UTC (rev 642) +++ trunk/libpano/ChangeLog 2006-12-31 08:38:08 UTC (rev 643) @@ -3,7 +3,12 @@ * ColourBrightness.c, file.c, PTcommon.c, ptstitch.c, queryfeature.c, tiff.c, tools/PTmender.c: Cleanup signed vs unsigned warnings + * tools/PTmasker.c: Actually set default output name, if none given + on the command line + * libpano.sln: Forgot to compile PTroller + + 2006-12-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.7. Modified: trunk/libpano/libpano.sln =================================================================== --- trunk/libpano/libpano.sln 2006-12-31 08:20:51 UTC (rev 642) +++ trunk/libpano/libpano.sln 2006-12-31 08:38:08 UTC (rev 643) @@ -28,7 +28,7 @@ {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PToptimizer", "tools\PTOptimizer.vcproj", "{20D1E094-A4B5-4294-85CE-229529065785}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTOptimizer", "tools\PTOptimizer.vcproj", "{20D1E094-A4B5-4294-85CE-229529065785}" ProjectSection(ProjectDependencies) = postProject {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} EndProjectSection @@ -48,6 +48,11 @@ {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTroller", "tools\PTroller.vcproj", "{20D1E094-A4B5-4294-85CE-229529065786}" + ProjectSection(ProjectDependencies) = postProject + {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} = {9B19A5C0-8DB0-448B-BF99-DC6374E9751B} + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -136,6 +141,14 @@ {20D1E094-A4B5-4294-85CE-229529065712}.DLL Release.Build.0 = Release|Win32 {20D1E094-A4B5-4294-85CE-229529065712}.Release.ActiveCfg = Release|Win32 {20D1E094-A4B5-4294-85CE-229529065712}.Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.DLL Debug.ActiveCfg = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.DLL Debug.Build.0 = Debug|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.DLL Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.DLL Release.Build.0 = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.Release.ActiveCfg = Release|Win32 + {20D1E094-A4B5-4294-85CE-229529065786}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection Modified: trunk/libpano/libpano.vcproj =================================================================== --- trunk/libpano/libpano.vcproj 2006-12-31 08:20:51 UTC (rev 642) +++ trunk/libpano/libpano.vcproj 2006-12-31 08:38:08 UTC (rev 643) @@ -385,7 +385,7 @@ RelativePath=".\seamer.h"> </File> <File - RelativePath=".\sys_win.h"> + RelativePath=".\sys_ansi.h"> </File> <File RelativePath=".\version.h"> Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-12-31 08:20:51 UTC (rev 642) +++ trunk/libpano/tools/PTmasker.c 2006-12-31 08:38:08 UTC (rev 643) @@ -80,6 +80,7 @@ ptrInputFiles = NULL; counter = 0; + outputPrefix[0] = 0; printf(PT_MASKER_VERSION); @@ -124,6 +125,11 @@ } } + // check if an output prefix was given + if (!(*outputPrefix)) { + strcpy(outputPrefix, "masked"); + } + filesCount = argc - optind; if (filesCount < 1) { Modified: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c 2006-12-31 08:20:51 UTC (rev 642) +++ trunk/libpano/tools/PTroller.c 2006-12-31 08:38:08 UTC (rev 643) @@ -33,7 +33,11 @@ #include <stdlib.h> #include <sys/types.h> #include <dirent.h> +#ifndef _MSC_VER #include <unistd.h> +#else +#include "compat_win32/getopt.h" +#endif #include <errno.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2007-01-01 22:07:25
|
Revision: 645 http://svn.sourceforge.net/panotools/?rev=645&view=rev Author: dmg Date: 2007-01-01 14:07:21 -0800 (Mon, 01 Jan 2007) Log Message: ----------- 2007-01-01 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.8 * parser.c (ParseScript): Added some comments to "z" option * sys_ansi.c (PrintErrorIntern): Add an end-of-line if none is provided (to increase readbility of PrintError, but only when stdout is used) * AUTHORS: Updated my own URL. Order them in lexicographical order by lastname * TODO: Updated file. * ZComb.c (ZCOMBLOGFILENAME): Changed name of log file for Zcomb to something more appropriate. * ColourBrightness.c (CorrectImageColourBrigthness): Fixed some compilation warnings * tools/PTmasker.c (main): Added support for focus enhancing (z option in the old PTstitch script) Modified Paths: -------------- trunk/libpano/AUTHORS trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/TODO trunk/libpano/ZComb.c trunk/libpano/configure.ac trunk/libpano/parser.c trunk/libpano/sys_ansi.c trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTmender.c trunk/libpano/version.h Modified: trunk/libpano/AUTHORS =================================================================== --- trunk/libpano/AUTHORS 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/AUTHORS 2007-01-01 22:07:21 UTC (rev 645) @@ -1,6 +1,6 @@ Helmut Dersch, <de...@fh...> -Daniel M. German +Daniel M. German- http://turingmachine.org/ Kevin Kratzke - http://www.kekus.com/ Rik Littlefield - http://www.janrik.net/ptools/ Fulvio Senore - http://www.fsoft.it/panorama/pano12.htm Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/ChangeLog 2007-01-01 22:07:21 UTC (rev 645) @@ -1,3 +1,27 @@ +2007-01-01 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.8 + + * parser.c (ParseScript): Added some comments to "z" option + + * sys_ansi.c (PrintErrorIntern): Add an end-of-line if none is + provided (to increase readbility of PrintError, but only when + stdout is used) + + * AUTHORS: Updated my own URL. Order them in lexicographical order + by lastname + + * TODO: Updated file. + + * ZComb.c (ZCOMBLOGFILENAME): Changed name of log file for Zcomb + to something more appropriate. + + * ColourBrightness.c (CorrectImageColourBrigthness): Fixed some + compilation warnings + + * tools/PTmasker.c (main): Added support for focus enhancing (z + option in the old PTstitch script) + 2006-12-31 dangelo <pab...@we...> * ColourBrightness.c, file.c, PTcommon.c, ptstitch.c, queryfeature.c, @@ -8,7 +32,6 @@ * libpano.sln: Forgot to compile PTroller - 2006-12-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.7. Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/ColourBrightness.c 2007-01-01 22:07:21 UTC (rev 645) @@ -763,7 +763,6 @@ int CorrectFileColourBrightness(fullPath *inPath, fullPath *outPath, magnolia_struct *magnolia, int parm3) { Image image; - CropInfo crop_info; char tempString[512]; if (panoTiffRead (&image, inPath->name) == 0) { sprintf(tempString, "Could not read TIFF file %s", inPath->name); @@ -1633,7 +1632,6 @@ // Compute Hue double H, S, V; int h; - unsigned temp; panoColourRGBtoHSV(red, green, blue, &H, &S, &V); @@ -1661,7 +1659,6 @@ { double H, S, V; int h; - unsigned temp; panoColourRGBtoHSV(red, green, blue, &H, &S, &V); @@ -1929,8 +1926,6 @@ if (*ptrPixel != 0 ) { - int ebx,ecx; - int R, G, B; double H, S, I; @@ -1952,7 +1947,7 @@ panoColourHSVtoRGB(H, S, I, &R, &G, &B); if (R < 0 || R > 255 || G < 0 || G > 255 || B < 0 || B > 255) { - printf("Value of R G B %d % %d\n", R, G, B); + printf("Value of R G B %d %d %d\n", R, G, B); assert(0); } //assert(R >= 0 && R <= 255); Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/TODO 2007-01-01 22:07:21 UTC (rev 645) @@ -252,3 +252,25 @@ - Add an optional debug switch to enable all that Debug.txt output (just to stdout). +---------------------------------------------------------------------- + +GetROI + + Hello + I used ptmender to play with the projections. I use the SVN-source from + SF. I converted a equirectangular panorama to lambertazimuthal projection. + I had the problem that the resulting image-file often displays not the + whole projection. The reason for this problem seems to be the x_jump in + the getROI-function: + + Depending on the image size and because of the x_jumping getROI + calculates sometimes wrong left/right values. + + I could solve my problems by changing the line 504 in PTcommon.c from + x_jump = (y==0 || y==TrPtr->src->height) ? 1 : TrPtr->src->width/2; + into + x_jump = (y==0 || y==TrPtr->src->height || + abs(y - TrPtr->src->height/2)<=5) ? 1 : TrPtr->src->width/2; + + + Modified: trunk/libpano/ZComb.c =================================================================== --- trunk/libpano/ZComb.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/ZComb.c 2007-01-01 22:07:21 UTC (rev 645) @@ -28,7 +28,7 @@ #include "filter.h" -#define ZCOMBLOGFILENAME "c:\\Rikslog.txt" +#define ZCOMBLOGFILENAME "zcom_log.txt" static struct { // ZComb parameters int enabled; @@ -308,7 +308,7 @@ int ZCombSeeImage(Image *im, char *filename) { if (!ZComb.enabled) { - // ZCombLogMsg ("Z-combining disabled\n",NULL); + ZCombLogMsg ("Z-combining disabled\n",NULL); return 0; } ZCombLogMsg ("Z-combining enabled\n",NULL); Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/configure.ac 2007-01-01 22:07:21 UTC (rev 645) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.7], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.8], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/parser.c 2007-01-01 22:07:21 UTC (rev 645) @@ -486,7 +486,10 @@ break; // Rik's mask-from-focus hacking - case 'z': ZCombSetEnabled(); + case 'z': + // I was tempted to remove this code, but I am not sure how it will affect PToptimizer, until then.. it will remain + //PrintError( "z option is no longer supported by PTmender and it is ignored. Use PTmasker instead\n" ); + //ZCombSetEnabled(); li = &(line[1]); while( *li != 0) { @@ -515,6 +518,7 @@ break; // end Rik's mask-from-focus hacking + case '*': // End of script-data *lineStart = 0; *ch = 0; break; Modified: trunk/libpano/sys_ansi.c =================================================================== --- trunk/libpano/sys_ansi.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/sys_ansi.c 2007-01-01 22:07:21 UTC (rev 645) @@ -54,6 +54,12 @@ JPrintError( toPrint ); }else{ printf(toPrint); + + // Add an end of line if none is provide + if (strlen(toPrint) > 0 && + toPrint[strlen(toPrint)-1] != '\n') { + putchar('\n'); + } fflush(stdout); } } Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/tools/PTmasker.c 2007-01-01 22:07:21 UTC (rev 645) @@ -49,6 +49,7 @@ #include "ptstitch.h" #include "pttiff.h" + #define PT_MASKER_USAGE "PTmasker [options] <tiffFiles>+\n\n" \ "Options:\n"\ "\t-p <prefix>\tPrefix for output files (defaults to masked%%4d)\n"\ @@ -57,10 +58,26 @@ "\t-x\t\tDelete source files (use with care)\n"\ "\t-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ + "\t-z\t\tEnable Extended depth of field\n"\ + "\t-m\t\tFocus estimation mask type\n"\ + "\t\t\t0 hard-edged masks, mutually exclusive\n"\ + "\t\t\t1 hard-edged masks, stack of nested masks\n"\ + "\t\t\t2 blended masks, stack of nested masks\n"\ + "\t\t\t\t2 is default & strongly recommended -- this option includes a smoothing computation that seems to help a lot.\n"\ + "\t-w <integer>\t\tFocus estimation window size. Only available if -z\n"\ + "\t\t\tRecommended value is 0.5% of image width, e.g. 4 pixels for an 800-pixel image\n."\ + "\t\t\tComputation cost for focus estimation increases proportional to N^2. Default w4.\n"\ + "\t-s <integer>\t\tSmoothing window size, Only available if -z\n"\ + "\t\t\tRecommended value is 0.5% of image width, e.g. 4 pixels for an 800-pixel image\n."\ + "\t\t\tComputation cost for focus estimation increases proportional to N^2. Default w4.\n"\ "\n" #define PT_MASKER_VERSION "PTmasker Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" +#define Z_DEFAULT_MASK_TYPE 2 +#define Z_DEFAULT_WINDOW_SIZE 4 +#define Z_DEFAULT_SMOOTHING_WINDOW_SIZE 4 + #define DEFAULT_PREFIX "masked" int main(int argc,char *argv[]) @@ -76,6 +93,10 @@ int ptForceProcessing = 0; int feather = 0; int ptDeleteSources = 0; + int enableFocusEstimation = 0; + int focusEstimationWindowSize = 0; + int focusEstimationMaskType = -1; + int focusEstimationSmoothingWindowSize = 0; ptrInputFiles = NULL; @@ -84,7 +105,7 @@ printf(PT_MASKER_VERSION); - while ((opt = getopt(argc, argv, "p:fqhxe:")) != -1) { + while ((opt = getopt(argc, argv, "p:fqhxe:zw:s:m:")) != -1) { // o and f -> set output file // h -> help @@ -100,6 +121,28 @@ return -1; } break; + case 'w': + focusEstimationWindowSize = strtol(optarg, NULL, 10); + if (errno != 0 || focusEstimationWindowSize <= 0) { + PrintError("Illegal value for focus estimation window size [%s]", optarg); + return -1; + } + break; + case 'm': + focusEstimationMaskType = strtol(optarg, NULL, 10); + if (errno != 0 || focusEstimationMaskType <0 || focusEstimationMaskType > 2) { + PrintError("Illegal value for focus estimation window type [%s]", optarg); + return -1; + } + break; + case 's': + focusEstimationSmoothingWindowSize = strtol(optarg, NULL, 10); + if (errno != 0 || focusEstimationSmoothingWindowSize <= 0) { + PrintError("Illegal value for focus estimation smoothing window size [%s]", optarg); + return -1; + } + break; + case 'p': if (strlen(optarg) < MAX_PATH_LENGTH) { strcpy(outputPrefix, optarg); @@ -108,6 +151,9 @@ return -1; } break; + case 'z': + enableFocusEstimation = 1; + break; case 'f': ptForceProcessing = 1; break; @@ -121,6 +167,8 @@ printf(PT_MASKER_USAGE); exit(0); default: + printf(PT_MASKER_USAGE); + exit(1); break; } } @@ -131,12 +179,42 @@ } filesCount = argc - optind; + if (filesCount < 1) { PrintError("No files specified in the command line"); fprintf(stderr, PT_MASKER_USAGE); return -1; } + + if (enableFocusEstimation == 0) { + if (focusEstimationWindowSize != 0 || + focusEstimationSmoothingWindowSize != 0 || + focusEstimationMaskType != -1) { + PrintError("You should specify -z option in order to use options -m -w or -s"); + return -1; + } + } else { + if (feather == 0) { + PrintError("-z requires feathering (use -e)"); + return -1; + } + + if (filesCount == 1) { + PrintError("-z requires more than one file, disabing -z"); + enableFocusEstimation = 0; + } + // At this point we know we are to do Z processing + // set defaults if no values are given + + if (focusEstimationWindowSize == 0) + focusEstimationWindowSize = Z_DEFAULT_WINDOW_SIZE; + if (focusEstimationSmoothingWindowSize == 0) + focusEstimationSmoothingWindowSize = Z_DEFAULT_SMOOTHING_WINDOW_SIZE; + if (focusEstimationMaskType == -1) + focusEstimationMaskType = Z_DEFAULT_MASK_TYPE; + } + // Allocate memory for filenames if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || (ptrOutputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { @@ -196,6 +274,15 @@ } + if (enableFocusEstimation) { + ZCombSetFocusWindowHalfwidth(focusEstimationWindowSize); + ZCombSetSmoothingWindowHalfwidth(focusEstimationSmoothingWindowSize); + ZCombSetMaskType(focusEstimationMaskType); + ZCombSetEnabled(); + } + + + if (panoStitchReplaceMasks(ptrInputFiles, ptrOutputFiles, filesCount, feather) != 0) { PrintError("Could not create stitching masks"); Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/tools/PTmender.c 2007-01-01 22:07:21 UTC (rev 645) @@ -1,5 +1,5 @@ /* - * PTmender + * PTmender * * Based on the program PTStitcher by Helmut Dersch. * Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2007-01-01 19:42:38 UTC (rev 644) +++ trunk/libpano/version.h 2007-01-01 22:07:21 UTC (rev 645) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.7 " +#define VERSION "2.9.8 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2007-01-11 00:37:15
|
Revision: 646 http://svn.sourceforge.net/panotools/?rev=646&view=rev Author: dmg Date: 2007-01-10 16:37:14 -0800 (Wed, 10 Jan 2007) Log Message: ----------- 2007-01-10 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.9 * queryfeature.c: Updated labels for Lamberts to their full name. * parser.c: implemented option P (parameters to projection) as a multivalue parameted * panorama.h: Modified the Image struct to support parameters to the projection and to support precomputation of values for the projection (to speed up computation) * math.c, parser.c, panorama.h, adjust.c, filter.c, queryfeature.c: Implemented Albers Conical Equal Area projection. Most of these changes submitted by Michael Gross, reviewed and slightly adapted by me. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/adjust.c trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/filter.c trunk/libpano/filter.h trunk/libpano/math.c trunk/libpano/panorama.h trunk/libpano/parser.c trunk/libpano/queryfeature.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/ChangeLog 2007-01-11 00:37:14 UTC (rev 646) @@ -1,3 +1,22 @@ +2007-01-10 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.9 + + * queryfeature.c: Updated labels for Lamberts to their full name. + + * parser.c: implemented option P (parameters to projection) as a + multivalue parameted + + * panorama.h: Modified the Image struct to support parameters to + the projection and to support precomputation of values for the + projection (to speed up computation) + + * math.c, parser.c, panorama.h, adjust.c, filter.c, + queryfeature.c: Implemented Albers Conical Equal Area projection. + + Most of these changes submitted by Michael Gross, reviewed and + slightly adapted by me. + 2007-01-01 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.8 Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/PTcommon.c 2007-01-11 00:37:14 UTC (rev 646) @@ -197,7 +197,7 @@ remove(outputFileName->name); rename(tempFile.name, outputFileName->name); - panoImageDispose(&image); + panoImageDispose(ptrImage); } if (!ptQuietFlag) { @@ -501,7 +501,7 @@ //needed here, but for now include some representative interior points as well. for (y = 0; y <= TrPtr->src->height; y += 1) { - x_jump = (y==0 || y==TrPtr->src->height) ? 1 : TrPtr->src->width/2; + x_jump = (y==0 || y==TrPtr->src->height || abs(y - TrPtr->src->height/2)<=5) ? 1 : TrPtr->src->width/2; for (x = 0; x <= TrPtr->src->width; x += x_jump) { //convert source coordinates to cartesian coordinates (i.e. origin at center of image) Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/adjust.c 2007-01-11 00:37:14 UTC (rev 646) @@ -581,6 +581,8 @@ */ int image_selection_width=im->width; int image_selection_height=im->height; + mp->im = im; + mp->pn = pn; if(im->cP.horizontal) { mp->horizontal=im->cP.horizontal_params[color]; @@ -695,6 +697,12 @@ transmercator_erect(b/2.0, 0.0, &tx, &ty, &tpara); mp->distance = pn->width/(2.0*tx); break; + case _albersequalareaconic: + mp->distance = 1.0; + //albersequalareaconic_erect(1.924913116, -PI/2.0, &tx, &ty, mp); //b/2.0 + albersequalareaconic_distance(&tx, mp); + mp->distance = pn->width/(2.0*tx); + break; default: // unknown PrintError ("SetMakeParams: Unsupported panorama projection"); @@ -796,6 +804,10 @@ { SetDesc(stack[i], erect_sinusoidal, &(mp->distance) ); i++; // Convert sinusoidal to sphere } + else if(pn->format == _albersequalareaconic) + { + SetDesc(stack[i], erect_albersequalareaconic, mp ); i++; // Convert albersequalareaconic to sphere + } else if(pn->format == _equirectangular) { // no conversion needed @@ -908,12 +920,14 @@ int i; double a,b; // field of view in rad - double tx,ty,tpara; + double tx,ty,tpara; a = DEG_TO_RAD( im->hfov ); // field of view in rad b = DEG_TO_RAD( pn->hfov ); + mp->im = im; + mp->pn = pn; SetMatrix( DEG_TO_RAD( im->pitch ), 0.0, DEG_TO_RAD( im->roll ), @@ -950,6 +964,12 @@ transmercator_erect(b/2.0, 0.0, &tx, &ty, & tpara); mp->distance = pn->width/(2.0*tx); break; + case _albersequalareaconic: + mp->distance = 1.0; + //albersequalareaconic_erect(1.924913116, -PI/2.0, &tx, &ty, mp); //b/2.0 + albersequalareaconic_distance(&tx, mp); + mp->distance = pn->width/(2.0*tx); + break; default: // unknown PrintError ("SetInvMakeParams: Unsupported panorama projection"); @@ -1119,6 +1139,10 @@ { SetDesc(stack[i], sinusoidal_erect, &(mp->distance) ); i++; // Convert sphere to sinusoidal } + else if(pn->format == _albersequalareaconic) + { + SetDesc(stack[i], albersequalareaconic_erect, mp ); i++; // Convert sphere to albersequalareaconic + } else if(pn->format == _equirectangular) { // no conversion needed @@ -2529,7 +2553,8 @@ g->pano.format != _equirectangular && g->pano.format != _fisheye_ff && g->pano.format != _stereographic && g->pano.format != _mercator && g->pano.format != _trans_mercator && g->pano.format != _sinusoidal && - g->pano.format != _lambert && g->pano.format != _lambertazimuthal + g->pano.format != _lambert && g->pano.format != _lambertazimuthal && + g->pano.format != _albersequalareaconic ) err=11; Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/configure.ac 2007-01-11 00:37:14 UTC (rev 646) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.8], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.9], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/file.c =================================================================== --- trunk/libpano/file.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/file.c 2007-01-11 00:37:14 UTC (rev 646) @@ -54,6 +54,7 @@ #include "file.h" #include "pttiff.h" +#include "metadata.h" // local functions @@ -165,7 +166,6 @@ size_t count; short svar = 0; char data[12], *d; - pt_uint32 var = 0; WRITEUCHAR( 0x1c ); rtn += count; @@ -176,7 +176,7 @@ WRITESHORT( len ); //length rtn += count; - if (recordData != NULL > 0) { + if (recordData != NULL ) { mywrite( fnum, len, recordData); rtn += count; @@ -205,10 +205,6 @@ short svar = 0; size_t count; pt_uint32 var; - unsigned char ch = 0; - pt_uint16 shorty = 0; - pt_uint32 len = 0; - pt_uint16 fileInfoLength = 0; int saveLocation = 0; int saveLocationForSize=0; int temp; @@ -239,7 +235,6 @@ { // we will refactor this chunck char IPTCVersion[3]; - int dataLen = 0; IPTCVersion[0] = 0; IPTCVersion[1] = 2; IPTCVersion[2] = 0; Modified: trunk/libpano/filter.c =================================================================== --- trunk/libpano/filter.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/filter.c 2007-01-11 00:37:14 UTC (rev 646) @@ -843,6 +843,8 @@ im->dataSize = 0; im->bitsPerPixel = 0; im->format = 0; + im->formatParamCount = 0; + bzero(im->formatParam, sizeof(im->formatParam)); im->dataformat = _RGB; im->hfov = 0.0; im->yaw = 0.0; Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/filter.h 2007-01-11 00:37:14 UTC (rev 646) @@ -358,6 +358,8 @@ double distance; double horizontal; double vertical; + Image *im; + Image *pn; }; struct LMStruct{ // Parameters used by the Levenberg Marquardt-Solver @@ -841,7 +843,11 @@ int erect_sinusoidal ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int stereographic_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_stereographic ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int albersequalareaconic_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int erect_albersequalareaconic ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); +int albersequalareaconic_distance ( double *x_src, void* params ); + int mirror_sphere_cp ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int mirror_pano ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int sphere_cp_mirror ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); Modified: trunk/libpano/math.c =================================================================== --- trunk/libpano/math.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/math.c 2007-01-11 00:37:14 UTC (rev 646) @@ -228,10 +228,11 @@ //------------------------------- Transformation functions -------------------------------------------- -#define distance (*((double*)params)) +#define distanceparam (*((double*)params)) #define shift (*((double*)params)) #define var0 ((double*)params)[0] #define var1 ((double*)params)[1] +#define mp ((struct MakeParams*)params) // execute a stack of functions stored in stack @@ -244,6 +245,7 @@ while( (stack->func) != NULL ) { + (stack->func) ( xd, yd, x_src, y_src, stack->param ); xd = *x_src; yd = *y_src; @@ -261,6 +263,7 @@ while( (stack->func) != NULL ) { if ( (stack->func) ( xd, yd, x_src, y_src, stack->param ) ) { + // printf("Execute stack %f %f %f %f\n", xd, yd, *x_src, *y_src); xd = *x_src; yd = *y_src; stack++; @@ -456,7 +459,7 @@ int persp_sphere( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params : double Matrix[3][3], double distance + // params : double Matrix[3][3], double distanceparam register double theta,s,r; double v[3]; @@ -503,7 +506,7 @@ int persp_rect( double x_dest, double y_dest, double* x_src, double* y_src, void* params) { - // params : double Matrix[3][3], double distance, double x-offset, double y-offset + // params : double Matrix[3][3], double distanceparam, double x-offset, double y-offset double v[3]; @@ -523,26 +526,26 @@ int rect_pano( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - *x_src = distance * tan( x_dest / distance ) ; - *y_src = y_dest / cos( x_dest / distance ); + *x_src = distanceparam * tan( x_dest / distanceparam ) ; + *y_src = y_dest / cos( x_dest / distanceparam ); return 1; } int pano_rect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - *x_src = distance * atan ( x_dest / distance ); - *y_src = y_dest * cos( *x_src / distance ); + *x_src = distanceparam * atan ( x_dest / distanceparam ); + *y_src = y_dest * cos( *x_src / distanceparam ); return 1; } int rect_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double phi, theta; - phi = x_dest / distance; - theta = - y_dest / distance + PI / 2.0; + phi = x_dest / distanceparam; + theta = - y_dest / distanceparam + PI / 2.0; if(theta < 0) { theta = - theta; @@ -569,48 +572,48 @@ *y_src = rho * sin( phi ); #endif #if 1 - *x_src = distance * tan(phi); - *y_src = distance / (tan( theta ) * cos(phi)); + *x_src = distanceparam * tan(phi); + *y_src = distanceparam / (tan( theta ) * cos(phi)); #endif return 1; } // This is the cylindrical projection int pano_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam *x_src = x_dest; - *y_src = distance * tan( y_dest / distance); + *y_src = distanceparam * tan( y_dest / distanceparam); return 1; } int erect_pano( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam *x_src = x_dest; - *y_src = distance * atan( y_dest / distance); + *y_src = distanceparam * atan( y_dest / distanceparam); return 1; } /** convert from erect to lambert azimuthal */ int lambertazimuthal_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam double phi, lambda,k1; - lambda = x_dest/distance; - phi = y_dest/distance; + lambda = x_dest/distanceparam; + phi = y_dest/distanceparam; if (abs(cos(phi) * cos(lambda) + 1.0) <= EPSLN) { - *x_src = distance * 2 ; + *x_src = distanceparam * 2 ; *y_src = 0; return 0; } k1 = sqrt(2.0 / (1 + cos(phi) * cos(lambda))); - *x_src = distance * k1 * cos(phi) * sin (lambda); - *y_src = distance * k1 * sin(phi); + *x_src = distanceparam * k1 * cos(phi) * sin (lambda); + *y_src = distanceparam * k1 * sin(phi); return 1; } @@ -619,10 +622,10 @@ int erect_lambertazimuthal( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - double x, y, r, ro,c; + double x, y, ro,c; - x = x_dest/distance; - y = y_dest/distance; + x = x_dest/distanceparam; + y = y_dest/distanceparam; assert(! isnan(x)); assert(! isnan(y)); @@ -633,7 +636,7 @@ return 0; } - ro = hypot( x, y); + ro = hypot(x, y); if (fabs(ro) <= EPSLN) { @@ -644,7 +647,7 @@ c = 2 * asin(ro / 2.0); - *y_src = distance * asin( (y * sin(c)) / ro); + *y_src = distanceparam * asin( (y * sin(c)) / ro); if (fabs(ro * cos(c)) <= EPSLN ) { @@ -652,7 +655,7 @@ return 1; } - *x_src = distance * atan2( x * sin(c), (ro * cos(c))); + *x_src = distanceparam * atan2( x * sin(c), (ro * cos(c))); return 1; @@ -663,18 +666,18 @@ /** convert from erect to mercator */ int mercator_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam *x_src = x_dest; - *y_src = distance*log(tan(y_dest/distance)+1/cos(y_dest/distance)); + *y_src = distanceparam*log(tan(y_dest/distanceparam)+1/cos(y_dest/distanceparam)); return 1; } /** convert from mercator to erect */ int erect_mercator( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam *x_src = x_dest; - *y_src = distance*atan(sinh(y_dest/distance)); + *y_src = distanceparam*atan(sinh(y_dest/distanceparam)); return 1; } @@ -682,18 +685,18 @@ /** convert from erect to lambert */ int lambert_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam *x_src = x_dest; - *y_src = distance*sin(y_dest/distance); + *y_src = distanceparam*sin(y_dest/distanceparam); return 1; } /** convert from lambert to erect */ int erect_lambert( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam *x_src = x_dest; - *y_src = distance*asin(y_dest/distance); + *y_src = distanceparam*asin(y_dest/distanceparam); return 1; } @@ -701,13 +704,13 @@ /** convert from erect to transverse mercator */ int transmercator_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam double B; - x_dest /= distance; - y_dest /= distance; + x_dest /= distanceparam; + y_dest /= distanceparam; B = cos(y_dest)*sin(x_dest); - *x_src = distance * atanh(B); - *y_src = distance * atan2(tan(y_dest), cos(x_dest)); + *x_src = distanceparam * atanh(B); + *y_src = distanceparam * atan2(tan(y_dest), cos(x_dest)); if (isinf(*x_src)) { return 0; @@ -719,9 +722,9 @@ /** convert from erect to transverse mercator */ int erect_transmercator( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance - x_dest /= distance; - y_dest /= distance; + // params: distanceparam + x_dest /= distanceparam; + y_dest /= distanceparam; if (fabs(y_dest) > PI ) { *y_src = 0; @@ -730,17 +733,17 @@ } - *x_src = distance * atan2(sinh(x_dest),cos(y_dest)); - *y_src = distance * asin(sin(y_dest)/cosh(x_dest)); + *x_src = distanceparam * atan2(sinh(x_dest),cos(y_dest)); + *y_src = distanceparam * asin(sin(y_dest)/cosh(x_dest)); return 1; } /** convert from erect to sinusoidal */ int sinusoidal_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam - *x_src = distance * (x_dest/distance*cos(y_dest/distance)); + *x_src = distanceparam * (x_dest/distanceparam*cos(y_dest/distanceparam)); *y_src = y_dest; return 1; } @@ -748,11 +751,11 @@ /** convert from sinusoidal to erect */ int erect_sinusoidal( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam *y_src = y_dest; - *x_src = x_dest/cos(y_dest/distance); - if (*x_src/distance < -PI || *x_src/distance > PI) + *x_src = x_dest/cos(y_dest/distanceparam); + if (*x_src/distanceparam < -PI || *x_src/distanceparam > PI) return 0; return 1; } @@ -760,14 +763,14 @@ /** convert from erect to stereographic */ int stereographic_erect_old( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance - double lon = x_dest / distance; - double lat = y_dest / distance; + // params: distanceparam + double lon = x_dest / distanceparam; + double lat = y_dest / distanceparam; // use: R = 1 double k=2.0/(1+cos(lat)*cos(lon)); - *x_src = distance * k*cos(lat)*sin(lon); - *y_src = distance * k*sin(lat); + *x_src = distanceparam * k*cos(lat)*sin(lon); + *y_src = distanceparam * k*sin(lat); return 1; } @@ -777,8 +780,8 @@ double sinphi, cosphi, coslon; double g,ksp; - lon = x_dest / distance; - lat = y_dest / distance; + lon = x_dest / distanceparam; + lat = y_dest / distanceparam; sinphi = sin(lat); cosphi = cos(lat); @@ -789,7 +792,7 @@ // point projects to infinity: // if (fabs(g + 1.0) <= EPSLN) - ksp = distance * 2.0 / (1.0 + g); + ksp = distanceparam * 2.0 / (1.0 + g); *x_src = ksp * cosphi * sin(lon); *y_src = ksp * sinphi; @@ -806,8 +809,8 @@ /* Inverse equations -----------------*/ - double x = x_dest / distance; - double y = y_dest / distance; + double x = x_dest / distanceparam; + double y = y_dest / distanceparam; rh = sqrt(x * x + y * y); c = 2.0 * atan(rh / (2.0 * 1)); sinc = sin(c); @@ -820,14 +823,14 @@ } else { - *lat = asin((y * sinc) / rh) * distance; + *lat = asin((y * sinc) / rh) * distanceparam; con = HALF_PI; con = cosc; if ((fabs(cosc) < EPSLN) && (fabs(x) < EPSLN)) return 0; else - *lon = atan2((x * sinc), (cosc * rh)) * distance; + *lon = atan2((x * sinc), (cosc * rh)) * distanceparam; } return 1; } @@ -836,21 +839,278 @@ /** convert from stereographic to erect */ int erect_stereographic_old( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: distance + // params: distanceparam // use: R = 1 - double p=sqrt(x_dest*x_dest + y_dest*y_dest) / distance; + double p=sqrt(x_dest*x_dest + y_dest*y_dest) / distanceparam; double c= 2.0*atan(p/2.0); - *x_src = distance * atan2(x_dest/distance*sin(c),(p*cos(c))); - *y_src = distance * asin(y_dest/distance*sin(c)/p); + *x_src = distanceparam * atan2(x_dest/distanceparam*sin(c),(p*cos(c))); + *y_src = distanceparam * asin(y_dest/distanceparam*sin(c)/p); return 1; } +int albersEqualAreaConic_ParamCheck(Image *im) +{ + //Parameters: phi1, phi2, phi0, n, C, rho0, yoffset + double phi1, phi2, n, C, rho0, phi0, y1, y2, y, twiceN; + double phi[] = {-PI/2, 0, PI/2}; + double lambda[] = {-PI, 0, PI}; + int i, j, first; + + assert(PANO_PROJECTION_MAX_PARMS >= 2); + + if (im->formatParamCount == 1) { + // WHen only one parameter provided, assume phi1=phi0 + im->formatParamCount = 2; + im->formatParam[1] = im->formatParam[0]; + } + + if (im->formatParamCount == 0) { + im->formatParamCount = 2; + im->formatParam[0] = 0; //phi1 + im->formatParam[1] = -60; //phi2 + } + + if (im->precomputedCount == 0) { + im->precomputedCount = 10; + + assert(PANO_PROJECTION_PRECOMPUTED_VALUES >=im->precomputedCount ); + + + // First, invert standard parallels. + // This is a hack, as the resulting projections look backwards to what they are supposed to be + // (with respect to maps) + + im->precomputedValue[0] = -1.0 * im->formatParam[0]; + im->precomputedValue[1] = -1.0 * im->formatParam[1]; + + phi1 = im->precomputedValue[0] * PI / 180.0; //phi1 to rad + phi2 = im->precomputedValue[1] * PI / 180.0; //phi2 to rad + + //Calculate the y at 6 different positions (lambda=-pi,0,+pi; phi=-pi/2,0,pi/2). + ///Then calculate a yoffset so that the image is centered. + first = 1; + for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { + y = sqrt(pow(cos(phi1), 0.2e1) + 0.2e1 * (sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) * sin(phi1)) / (sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) - sqrt(pow(cos(phi1), 0.2e1) + 0.2e1 * (sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) * sin(phi1) - 0.2e1 * (sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) * sin(phi[i])) / (sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) * cos((sin(phi1) / 0.2e1 + sin(phi2) / 0.2e1) * lambda[j]); + if (!isnan(y)) { + if (first || y < y1) y1 = y; + if (first || y > y2) y2 = y; + first = 0; + } + } + if (first) { + y = 0; + } else { + y = y1 + fabs(y1 - y2)/2.0; + } + + // The stability of these operations should be improved + phi0 = 0; + twiceN = sin(phi1) + sin(phi2); + n = twiceN /2.0; + C = cos(phi1) * cos(phi1) + 2.0 * n * sin(phi1); + rho0 = sqrt(C - 2.0 * n * sin(phi0)) / n; + + im->precomputedValue[0] = phi1; + im->precomputedValue[1] = phi2; + im->precomputedValue[2] = phi0; + im->precomputedValue[3] = n; + im->precomputedValue[4] = C; + im->precomputedValue[5] = rho0; + im->precomputedValue[6] = y; + im->precomputedValue[7] = n*n; + im->precomputedValue[8] = sin(phi1) + sin(phi2); + im->precomputedValue[9] = twiceN; + + // printf("Parms phi1 %f phi2 %f pho0 %f, n %f, C %f, rho0 %f, %f\n", + // phi1, phi2, phi0, n, C, rho0, y); + + } + + for (i=0;i<im->precomputedCount;i++) { + assert(!isnan(im->precomputedValue[i])); + } + + if (im->precomputedCount > 0) return 1; + // PrintError("false in alberts equal area parameters"); + return 0; +} + +/** convert from erect to albersequalareaconic */ +int albersequalareaconic_erect( double x_dest,double y_dest, double* x_src, double* y_src, void *params) +{ + double yoffset, lambda, phi, lambda0, n, C, rho0, theta, rho; + double twiceN; + + // Forward calculation + + + if (!albersEqualAreaConic_ParamCheck(mp->pn)) { + // printf("REturning abert->erect 0\n"); + return 0; + } + + assert(!isnan(x_dest)); + assert(!isnan(y_dest)); + + lambda = x_dest / mp->distance; + phi = y_dest / mp->distance; + + if (lambda > PI) lambda-=2*PI; + if (lambda < -PI) lambda+=2*PI; + + lambda0 = 0; + + n = mp->pn->precomputedValue[3]; + C = mp->pn->precomputedValue[4]; + rho0 = mp->pn->precomputedValue[5]; + yoffset = mp->pn->precomputedValue[6]; + twiceN = mp->pn->precomputedValue[9]; + + theta = n * (lambda - lambda0); + + + // printf("value %f\n", (phi)); + // printf("value %f\n", sin(phi)); + // printf("value %f\n", C - 2.0 * n * sin(phi)); + //assert(C - 2.0 * n * sin(phi) >=0); + rho = sqrt(C - twiceN * sin(phi)) / n; + + *x_src = mp->distance * (rho * sin(theta)); + *y_src = mp->distance * (rho0 - rho * cos(theta) - yoffset); + + if (isnan(*x_src) || + isnan(*y_src)) { + *x_src = 0; + *y_src = 0; + // PrintError("false in alberts equal area 4"); + return 0; + } + + assert(!isnan(*x_src)); + assert(!isnan(*y_src)); + + return 1; +} + +/** convert from albersequalareaconic to erect */ +int erect_albersequalareaconic(double x_dest, double y_dest, double* x_src, double* y_src, void* params) +{ + double x, y, yoffset, lambda0, n, C, rho0, theta, phi, lambda, nsign; + double rho2; // rho^2 + double n2; // n^2 + double twiceN; // n * 2.0 + + // Inverse calculation + + if (!albersEqualAreaConic_ParamCheck(mp->pn)) { + *x_src = 0; + *y_src = 0; + // printf("false in alberts equal area\n"); + return 0; + } + + x = x_dest / mp->distance; + y = y_dest / mp->distance; + + lambda0 = 0; + + n = mp->pn->precomputedValue[3]; + C = mp->pn->precomputedValue[4]; + rho0 = mp->pn->precomputedValue[5]; + yoffset = mp->pn->precomputedValue[6]; + n2 = mp->pn->precomputedValue[7]; + twiceN = mp->pn->precomputedValue[9]; + + y = y + yoffset; + + rho2 = x*x + (rho0 - y)*(rho0 - y); + nsign = 1.0; + + if (n < 0) nsign = -1.0; + + theta = atan2(nsign * x, nsign * (rho0 - y)); + + phi = asin((C - rho2 * n2)/twiceN); + + lambda = lambda0 + theta / n; + if (lambda > PI || lambda < -PI) { + *x_src = 0; + *y_src = 0; + // PrintError("false in alberts equal area 2"); + return 0; + } + + *x_src = mp->distance * lambda; + *y_src = mp->distance * phi; + + if (isnan(*x_src) || + isnan(*y_src)) { + *x_src = 0; + *y_src = 0; + // PrintError("false in alberts equal area 3"); + return 0; + } + + assert(!isnan(*x_src)); + assert(!isnan(*y_src)); + + return 1; +} + +int albersequalareaconic_distance(double* x_src, void* params) { + double x1, x2, y, phi1, phi2, lambda; + + // printf("alber distance\n"); + + if (!albersEqualAreaConic_ParamCheck(mp->pn)) { + *x_src = 0; + // printf("false in alberts equal area distance 0\n"); + return 0; + } + + mp->distance = 1; + phi1 = mp->pn->precomputedValue[0]; + phi2 = mp->pn->precomputedValue[1]; + + //lambda where x is a maximum. + if (phi1 == phi2 && + phi1 == 0.0) { + // THIS IS A HACK...it needs to further studied + // why this when phi1==phi2==0 + // this functions return 0 + // Avoid approximation error + PrintError("The Albers projection cannot be used for phi1==phi2==0. Use Lambert Cylindrical Equal Area instead"); + + *x_src = PI; + return 0; + } + lambda = fabs(PI / (sin(phi1) + sin(phi2))); + if (lambda > PI) lambda = PI; + albersequalareaconic_erect(lambda, -PI/2.0, &x1, &y, mp); + albersequalareaconic_erect(lambda, PI/2.0, &x2, &y, mp); + *x_src = max(fabs(x1), fabs(x2)); + + if (isnan(*x_src)) { + *x_src = 0; + PrintError("false in alberts equal area distance 1"); + return 0; + } + + assert(!isnan(*x_src)); + + // printf("return albers distance %f\n", *x_src); + + return 1; + +} + + int sphere_cp_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b + // params: double distanceparam, double b register double phi, theta; #if 0 @@ -870,13 +1130,13 @@ int sphere_tp_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double phi, theta, r,s; double v[3]; - phi = x_dest / distance; - theta = - y_dest / distance + PI / 2; + phi = x_dest / distanceparam; + theta = - y_dest / distanceparam + PI / 2; if(theta < 0) { theta = - theta; @@ -907,7 +1167,7 @@ r = sqrt( v[1]*v[1] + v[0]*v[0]); - theta = distance * atan2( r , s * cos( phi ) ); + theta = distanceparam * atan2( r , s * cos( phi ) ); *x_src = theta * v[0] / r; *y_src = theta * v[1] / r; @@ -916,7 +1176,7 @@ int erect_sphere_cp( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b + // params: double distanceparam, double b register double phi, theta; @@ -937,24 +1197,24 @@ int rect_sphere_tp( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double rho, theta,r; #if 0 - theta = sqrt( x_dest * x_dest + y_dest * y_dest ) / distance; + theta = sqrt( x_dest * x_dest + y_dest * y_dest ) / distanceparam; phi = atan2( y_dest , x_dest ); if( theta > PI /2.0 || theta < -PI /2.0 ) theta = PI /2.0 ; - rho = distance * tan( theta ); + rho = distanceparam * tan( theta ); *x_src = rho * cos( phi ); *y_src = rho * sin( phi ); #endif r = sqrt( x_dest * x_dest + y_dest * y_dest ); - theta = r / distance; + theta = r / distanceparam; if( theta >= PI /2.0 ) rho = 1.6e16 ; @@ -969,7 +1229,7 @@ int sphere_tp_rect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double theta, r; @@ -980,7 +1240,7 @@ *x_src = *((double*)params) * theta * cos( phi ); *y_src = *((double*)params) * theta * sin( phi ); #endif - r = sqrt(x_dest*x_dest + y_dest*y_dest) / distance; + r = sqrt(x_dest*x_dest + y_dest*y_dest) / distanceparam; if( r== 0.0 ) theta = 1.0; else @@ -993,7 +1253,7 @@ int sphere_tp_pano( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double r, s, Phi, theta; @@ -1002,7 +1262,7 @@ double v[3]; Phi = x_dest / *((double*)params); - Theta = PI /2.0 - atan( y_dest / distance ); + Theta = PI /2.0 - atan( y_dest / distanceparam ); v[2] = *((double*)params) * sin( Theta ) * cos( Phi ); // x' -> z @@ -1016,12 +1276,12 @@ *y_src = *((double*)params) * theta * sin( phi ); #endif #if 1 - Phi = x_dest / distance; + Phi = x_dest / distanceparam; - s = distance * sin( Phi ) ; // y' -> x + s = distanceparam * sin( Phi ) ; // y' -> x r = sqrt( s*s + y_dest*y_dest ); - theta = distance * atan2( r , (distance * cos( Phi )) ) / r; + theta = distanceparam * atan2( r , (distanceparam * cos( Phi )) ) / r; *x_src = theta * s ; *y_src = theta * y_dest ; @@ -1031,12 +1291,12 @@ int pano_sphere_tp( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double r,s, theta; double v[3]; #if 0 - theta = sqrt( x_dest * x_dest + y_dest * y_dest ) / distance; + theta = sqrt( x_dest * x_dest + y_dest * y_dest ) / distanceparam; phi = atan2( y_dest , x_dest ); v[1] = *((double*)params) * sin( theta ) * cos( phi ); // x' -> y @@ -1051,9 +1311,9 @@ #endif r = sqrt( x_dest * x_dest + y_dest * y_dest ); - theta = r / distance; + theta = r / distanceparam; if( theta == 0.0 ) - s = 1.0 / distance; + s = 1.0 / distanceparam; else s = sin( theta ) /r; @@ -1061,8 +1321,8 @@ v[0] = cos( theta ); // z' -> x - *x_src = distance * atan2( v[1], v[0] ); - *y_src = distance * s * y_dest / sqrt( v[0]*v[0] + v[1]*v[1] ); + *x_src = distanceparam * atan2( v[1], v[0] ); + *y_src = distanceparam * s * y_dest / sqrt( v[0]*v[0] + v[1]*v[1] ); return 1; } @@ -1070,40 +1330,40 @@ int sphere_cp_pano( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double phi, theta; - phi = -x_dest / (distance * PI / 2.0) ; - theta = PI /2.0 + atan( y_dest / (distance * PI/2.0) ); + phi = -x_dest / (distanceparam * PI / 2.0) ; + theta = PI /2.0 + atan( y_dest / (distanceparam * PI/2.0) ); - *x_src = distance * theta * cos( phi ); - *y_src = distance * theta * sin( phi ); + *x_src = distanceparam * theta * cos( phi ); + *y_src = distanceparam * theta * sin( phi ); return 1; } int erect_rect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam #if 0 - theta = atan( sqrt(x_dest*x_dest + y_dest*y_dest) / distance ); + theta = atan( sqrt(x_dest*x_dest + y_dest*y_dest) / distanceparam ); phi = atan2( y_dest , x_dest ); - v[1] = distance * sin( theta ) * cos( phi ); // x' -> y - v[2] = distance * sin( theta ) * sin( phi ); // y' -> z - v[0] = distance * cos( theta ); // z' -> x + v[1] = distanceparam * sin( theta ) * cos( phi ); // x' -> y + v[2] = distanceparam * sin( theta ) * sin( phi ); // y' -> z + v[0] = distanceparam * cos( theta ); // z' -> x theta = atan2( sqrt( v[0]*v[0] + v[1]*v[1] ) , v[2] ); phi = atan2( v[1], v[0] ); - *x_src = distance * phi; - *y_src = distance * (-theta + PI /2.0); + *x_src = distanceparam * phi; + *y_src = distanceparam * (-theta + PI /2.0); #endif - *x_src = distance * atan2( x_dest, distance ); - *y_src = distance * atan2( y_dest, sqrt( distance*distance + x_dest*x_dest ) ); + *x_src = distanceparam * atan2( x_dest, distanceparam ); + *y_src = distanceparam * atan2( y_dest, sqrt( distanceparam*distanceparam + x_dest*x_dest ) ); return 1; } @@ -1111,7 +1371,7 @@ int erect_sphere_tp( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance + // params: double distanceparam register double theta,r,s; double v[3]; @@ -1135,9 +1395,9 @@ *y_src = *((double*)params) * (-theta - PI /2.0); #endif r = sqrt( x_dest * x_dest + y_dest * y_dest ); - theta = r / distance; + theta = r / distanceparam; if(theta == 0.0) - s = 1.0 / distance; + s = 1.0 / distanceparam; else s = sin( theta) / r; @@ -1145,14 +1405,14 @@ v[0] = cos( theta ); - *x_src = distance * atan2( v[1], v[0] ); - *y_src = distance * atan( s * y_dest /sqrt( v[0]*v[0] + v[1]*v[1] ) ); + *x_src = distanceparam * atan2( v[1], v[0] ); + *y_src = distanceparam * atan( s * y_dest /sqrt( v[0]*v[0] + v[1]*v[1] ) ); return 1; } int mirror_sphere_cp( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b + // params: double distanceparam, double b register double rho, phi, theta; @@ -1168,7 +1428,7 @@ int mirror_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b, double b2 + // params: double distanceparam, double b, double b2 register double phi, theta, rho; @@ -1184,7 +1444,7 @@ int mirror_pano( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b + // params: double distanceparam, double b register double phi, theta, rho; @@ -1201,7 +1461,7 @@ int sphere_cp_mirror( double x_dest,double y_dest, double* x_src, double* y_src, void* params) { - // params: double distance, double b + // params: double distanceparam, double b register double phi, theta, rho; Modified: trunk/libpano/panorama.h =================================================================== --- trunk/libpano/panorama.h 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/panorama.h 2007-01-11 00:37:14 UTC (rev 646) @@ -250,6 +250,7 @@ _sinusoidal = 14, _lambert = 15, _lambertazimuthal = 16, + _albersequalareaconic = 17 }; // A large rectangle @@ -333,6 +334,21 @@ #define PANO_PATH_LEN 255 +// THe following constants define the number of parameters used by a projection + +// THe first is the number provided by the user. In most cases it is +// zero, sometimes 1 and sometimes 2. +// The second is the number of internally used parameters. THis is +// used for optimization purposes, as some projections require to compute +// the same value over and over again. + + +// This are the maximum number of parameters accepted by a given projection +#define PANO_PROJECTION_MAX_PARMS 3 +// This are the maximum number of internal parameters used by a given projection +#define PANO_PROJECTION_PRECOMPUTED_VALUES 10 + + struct Image { // Pixel data @@ -344,6 +360,10 @@ unsigned char **data; pt_int32 dataformat; // rgb, Lab etc pt_int32 format; // Projection: rectilinear etc + int formatParamCount; // Number of format parameters. + double formatParam[PANO_PROJECTION_MAX_PARMS]; // Parameters for format. + int precomputedCount; // number of values precomputed for a given pano + double precomputedValue[PANO_PROJECTION_PRECOMPUTED_VALUES]; // to speed up pano creation double hfov; double yaw; double pitch; Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/parser.c 2007-01-11 00:37:14 UTC (rev 646) @@ -474,6 +474,9 @@ case 9: gl->pano.format = _lambertazimuthal; break; + case 10: + gl->pano.format = _albersequalareaconic; + break; default: PrintError( "Unknown panorama projection: %d", gl->pano.format ); return -1; @@ -947,6 +950,9 @@ case 9: p->pano.format = _lambertazimuthal; break; + case 10: + p->pano.format = _albersequalareaconic; + break; default: PrintError( "Unknown panorama projection: %d", p->pano.format ); return -1; @@ -964,7 +970,7 @@ if( !seto ) { - PrintError( "Syntax error in scriptfile" ); + PrintError( "Syntax error in scriptfile (readAdjust)"); free( script ); return -1; } @@ -1273,9 +1279,11 @@ stBuf sBuf; char *ch = line; char buf[LINE_LENGTH]; + char *b; int i; int cropping = 0; int tempInt; + double tempDbl; char typeParm; memcpy( &im, imPtr, sizeof(Image) ); @@ -1421,8 +1429,28 @@ sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im.selection.left, &im.selection.right, &im.selection.top, &im.selection.bottom ); im.cP.cutFrame = TRUE; break; - default: ch++; - break; + case 'P': + nextWord(buf, &ch); + b = strtok(buf, " \""); + if (b != NULL) { + while (b != NULL) { + if (sscanf(b, "%lf", &tempDbl) == 1) { + if (++im.formatParamCount >= PANO_PROJECTION_MAX_PARMS) { + PrintError("Illegal number of projection parameters. Maximum is %d", PANO_PROJECTION_MAX_PARMS); + return -1; + } + im.formatParam[im.formatParamCount - 1] = tempDbl; + b = strtok(NULL, " \""); + } else { + PrintError("Illegal value in P parameter %s", b); + return -1; + } + } + } + break; + default: + ch++; + break; } } Modified: trunk/libpano/queryfeature.c =================================================================== --- trunk/libpano/queryfeature.c 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/queryfeature.c 2007-01-11 00:37:14 UTC (rev 646) @@ -64,8 +64,9 @@ {"PanoType5","Mercator"}, {"PanoType6","Transverse mercator"}, {"PanoType7","Sinusoidal"}, - {"PanoType8","Lambert"}, - {"PanoType9","Lambert Azimuthal"}, + {"PanoType8","Lambert Cylindrical Equal Area"}, + {"PanoType9","Lambert Azimuthal Equal Area"}, + {"PanoType10","Albers Conical Equal Area"}, // Filter Types // fix: Fixed Windowsize // aa: Antialiasing filter with adaptive filter size Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2007-01-01 22:07:21 UTC (rev 645) +++ trunk/libpano/version.h 2007-01-11 00:37:14 UTC (rev 646) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.8 " +#define VERSION "2.9.9 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2007-01-11 06:04:23
|
Revision: 647 http://svn.sourceforge.net/panotools/?rev=647&view=rev Author: dmg Date: 2007-01-10 22:04:23 -0800 (Wed, 10 Jan 2007) Log Message: ----------- 2007-01-10 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.10 * doc/stitch.txt: Updated the file to match latest version. * parser.c (readAdjust): Updated parser to accept adjustLine in the i-line. (nextWord): Make sure that it eats the closing quotes (ReadPanoramaDescription): Forked this function from ReadImageDescription. In the past both images (o and i lines) and output format (p-line) were read with the same function. * TODO (PTmender): Updated the file. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/doc/stitch.txt trunk/libpano/parser.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/ChangeLog 2007-01-11 06:04:23 UTC (rev 647) @@ -1,5 +1,18 @@ 2007-01-10 dmg <dm...@uv...> + * version.h (VERSION), configure.ac Upgraded to version 2.9.10 + + * doc/stitch.txt: Updated the file to match latest version. + + * parser.c (readAdjust): Updated parser to accept adjustLine in + the i-line. + (nextWord): Make sure that it eats the closing quotes + (ReadPanoramaDescription): Forked this function from + ReadImageDescription. In the past both images (o and i lines) + and output format (p-line) were read with the same function. + + * TODO (PTmender): Updated the file. + * version.h (VERSION), configure.ac Upgraded to version 2.9.9 * queryfeature.c: Updated labels for Lamberts to their full name. Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/TODO 2007-01-11 06:04:23 UTC (rev 647) @@ -64,6 +64,10 @@ PTmender: +- The Albers projection is ignoring the field-of-view and it is + computing a 360 degrees in all cases. + + DESIRABLE: - PTmender is not properly calculating ROI for some images. In Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/configure.ac 2007-01-11 06:04:23 UTC (rev 647) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.9], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.10], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/doc/stitch.txt =================================================================== --- trunk/libpano/doc/stitch.txt 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/doc/stitch.txt 2007-01-11 06:04:23 UTC (rev 647) @@ -27,6 +27,16 @@ # 5 - mercator # 6 - transverse mercator # 7 - sinusoidal +# 8 - Lambert Equal Area Cylindrical +# 9 - Lambert Azimuthal +# 10 - Albers Equal Area Conical +# +# P"p1 p2 ..." Optional parameters for some projections +# +# for f10 - 0, 1 or 2 parameters corresponding to the +# standard parallels. If no parms specified +# defaults to <20,60>. If one given P1 == P2 +# # v360 horizontal field of view of panorama (default 360) # nPICT Panorama file format, one of: # PICT pict-file on macs, bmp-file on win (default) @@ -111,7 +121,6 @@ # command, and all other lines both '+buf -buf' # Exception: remove all 'buf' commands when # creating Photoshop-files to preserve the original images. -# u10 (obsolete, globally used on p line) width of feather for stitching. default:10 # S100,600,100,800 Selection(l,r,t,b), Only pixels inside the rectangle will be used for conversion. # Original image size is used for all image parameters # (e.g. field-of-view) refer to the original image. @@ -126,13 +135,6 @@ # 0-middle of overlap('blend' ,default) # 1- at edge of image ('paste'). # o (the small letter). Morph-to-fit using control points. -# k0 (obsolete, use p line correction still used with plugin) -# attempt color/brightness correction when merging image and buffer, one of: -# 0 - no correction(default); -# 1 - change image; -# 2 - change buffer; -# 3 - change both -# this feature does not work very well! o f2 r0 p0 y0 v183 a0 b-0.1 c0 S100,600,100,800 o f2 r0 p0 y180 v183 a0 b-0.1 c0 S100,600,100,800 Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/parser.c 2007-01-11 06:04:23 UTC (rev 647) @@ -51,6 +51,7 @@ static int ReadControlPoint ( controlPoint * cptr, char *line); static int ReadImageDescription( Image *imPtr, stBuf *sPtr, char *line ); +static int ReadPanoramaDescription( Image *imPtr, stBuf *sPtr, char *line ); static int ReadModeDescription ( sPrefs *sP, char *line ); static int ReadCoordinates( CoordInfo *cp, char *line ); @@ -438,7 +439,7 @@ case 'p': // panorama gl->pano.format = 2; // _equirectangular by default gl->pano.hfov = 360.0; - if( ReadImageDescription( &(gl->pano), &(gl->st), &(line[1]) ) != 0 ) + if( ReadPanoramaDescription( &(gl->pano), &(gl->st), &(line[1]) ) != 0 ) { PrintError( "Syntax error in line %d" , lineNum); return -1; @@ -848,199 +849,211 @@ int readAdjust( aPrefs *p, fullPath* sfile, int insert, sPrefs *sP ) { - char* script; - // Variables used by parser - - char line[LINE_LENGTH], *ch; - int lineNum = 0; - int seto; - + char* script; + // Variables used by parser + + char line[LINE_LENGTH], *ch; + int lineNum = 0; + int seto; + int seti; + + + setlocale(LC_ALL, "C"); + + + // Set prefs and sBuf to defaults + + SetAdjustDefaults( p ); + - setlocale(LC_ALL, "C"); - - - // Set prefs and sBuf to defaults - - SetAdjustDefaults( p ); - - - - - script = LoadScript( sfile ); - if( script == NULL ) - return -1; - - - // Parse script + + + script = LoadScript( sfile ); + if( script == NULL ) + return -1; + + + // Parse script + + ch = script; + seto = FALSE; + seti = FALSE; + + while( *ch != 0 ) { + lineNum++; - ch = script; - seto = FALSE; - - while( *ch != 0 ) - { - lineNum++; - - while(*ch == '\n') - ch++; - - // read a line of text into line[]; - - nextLine( line, &ch ); - // parse line; use only if first character is p,o,m + while(*ch == '\n') + ch++; - switch( line[0] ) - { - case 'o': // Image description - if( !seto ) // Read only _one_ image - { - if( ReadImageDescription( &(p->im), &(p->sBuf), &(line[1]) ) != 0 ) - { - PrintError( "Syntax error in line %d" , lineNum); - free( script ); - return -1; - } - seto = TRUE; - } - break; - case 'm': // Mode description - if( ReadModeDescription( sP, &(line[1]) ) != 0 ) - { - PrintError( "Syntax error in line %d" , lineNum); - free( script ); - return -1; - } - break; - case 'p': // panorama - p->pano.format = 2; // _equirectangular by default - p->pano.hfov = 360.0; - if( ReadImageDescription( &(p->pano), &(p->sBuf), &(line[1]) ) != 0 ) - { - PrintError( "Syntax error in line %d" , lineNum); - free( script ); - return -1; - } - switch (p->pano.format) { - case 0: - p->pano.format = _rectilinear; - break; - case 1: - p->pano.format = _panorama; - break; - case 2: - p->pano.format = _equirectangular; - break; - case 3: - p->pano.format = _fisheye_ff; - break; - case 4: - p->pano.format = _stereographic; - break; - case 5: - p->pano.format = _mercator; - break; - case 6: - p->pano.format = _trans_mercator; - break; - case 7: - p->pano.format = _sinusoidal; - break; - case 8: - p->pano.format = _lambert; - break; - case 9: - p->pano.format = _lambertazimuthal; - break; - case 10: - p->pano.format = _albersequalareaconic; - break; - default: - PrintError( "Unknown panorama projection: %d", p->pano.format ); - return -1; - } - if( (p->pano.format == _rectilinear || p->pano.format == _trans_mercator) && p->pano.hfov >= 180.0 ) - { - PrintError( "Destination image must have HFOV < 180" ); - return -1; - } - break; - - default: break; - } - } + // read a line of text into line[]; - if( !seto ) - { - PrintError( "Syntax error in scriptfile (readAdjust)"); - free( script ); - return -1; - } + nextLine( line, &ch ); + // parse line; use only if first character is p,o,m - // Create and Write changed scriptfile if inserting + switch( line[0] ) { + case 'i': + // The original i line was optional and it did not contain any information except + // for the filename. + // Hugin .pto files use the 'i' line instead of 'o' line. - if( insert ) - { - seto = FALSE; ch = script; - - - while( *ch != 0 && !seto ) - { - while(*ch == '\n') - ch++; - if( *ch == 'o' ) - seto = TRUE; - else - { - while(*ch != '\n' && *ch != 0) - ch++; - } + // 'o' has priority over 'i' + // if 'o' has been read then skip + if (!seto && !seti) { + if( ReadImageDescription( &(p->im), &(p->sBuf), &(line[1]) ) != 0 ) { + PrintError("Syntax error in i-line %d", lineNum); + free(script); + return -1; } - if( *ch == 'o' ) *ch = '!'; + seti = TRUE; - // If this is the last image to convert: recover script file - - seto = FALSE; ch = script; - - while( *ch != 0 && !seto ) + } + break; + case 'o': // Image description + if( !seto ) { // Read only _one_ image + // 'o' has priority over 'i' lines + if( ReadImageDescription( &(p->im), &(p->sBuf), &(line[1]) ) != 0 ) { + PrintError( "Syntax error in line %d" , lineNum); + free( script ); + return -1; + } + seto = TRUE; + } + break; + case 'm': // Mode description + if( ReadModeDescription( sP, &(line[1]) ) != 0 ) { - while(*ch == '\n') - ch++; - if( *ch == 'o' ) - seto = TRUE; - else - { - while(*ch != '\n' && *ch != 0) - ch++; - } + PrintError( "Syntax error in line %d" , lineNum); + free( script ); + return -1; } - if( seto == FALSE ) // No more images to convert + break; + case 'p': // panorama + p->pano.format = 2; // _equirectangular by default + p->pano.hfov = 360.0; + if( ReadPanoramaDescription( &(p->pano), &(p->sBuf), &(line[1]) ) != 0 ) { - ch = script; - - while( *ch != 0 ) - { - while(*ch == '\n') - ch++; - if( *ch == '!' ) - *ch = 'o'; - else - { - while(*ch != '\n' && *ch != 0) - ch++; - } - } + PrintError( "Syntax error in line %d" , lineNum); + free( script ); + return -1; } - - - if( WriteScript( script, sfile, 0 ) != 0 ) + switch (p->pano.format) { + case 0: + p->pano.format = _rectilinear; + break; + case 1: + p->pano.format = _panorama; + break; + case 2: + p->pano.format = _equirectangular; + break; + case 3: + p->pano.format = _fisheye_ff; + break; + case 4: + p->pano.format = _stereographic; + break; + case 5: + p->pano.format = _mercator; + break; + case 6: + p->pano.format = _trans_mercator; + break; + case 7: + p->pano.format = _sinusoidal; + break; + case 8: + p->pano.format = _lambert; + break; + case 9: + p->pano.format = _lambertazimuthal; + break; + case 10: + p->pano.format = _albersequalareaconic; + break; + default: + PrintError( "Unknown panorama projection: %d", p->pano.format ); + return -1; + } + if( (p->pano.format == _rectilinear || p->pano.format == _trans_mercator) && p->pano.hfov >= 180.0 ) { + PrintError( "Destination image must have HFOV < 180" ); + return -1; + } + break; + + default: + // PrintError("Unknown line %s", line); + // silently ignore any unknown lines + break; + } + } + + if( ! (seto || seti) ) { + PrintError( "Syntax error in scriptfile (readAdjust). It contains no 'o' line"); + free( script ); + return -1; + } + + // Create and Write changed scriptfile if inserting + + if( insert ) { + seto = FALSE; ch = script; + + + while( *ch != 0 && !seto ) + { + while(*ch == '\n') + ch++; + if( *ch == 'o' ) + seto = TRUE; + else + { + while(*ch != '\n' && *ch != 0) + ch++; + } + } + if( *ch == 'o' ) *ch = '!'; + + // If this is the last image to convert: recover script file + + seto = FALSE; ch = script; + + while( *ch != 0 && !seto ) { + while(*ch == '\n') + ch++; + if( *ch == 'o' ) + seto = TRUE; + else { - PrintError("Could not write scriptfile"); - free( script ); - return -1; + while(*ch != '\n' && *ch != 0) + ch++; } } - - free( script); - return 0; + if( seto == FALSE ) { // No more images to convert + ch = script; + + while( *ch != 0 ) { + while(*ch == '\n') + ch++; + if( *ch == '!' ) + *ch = 'o'; + else + { + while(*ch != '\n' && *ch != 0) + ch++; + } + } + } + + + if( WriteScript( script, sfile, 0 ) != 0 ) { + PrintError("Could not write scriptfile"); + free( script ); + return -1; + } + } + + free( script); + return 0; } @@ -1129,6 +1142,7 @@ c++; while( *c != '\"' && *c != 0 ) *word++ = *c++; + c++; // to eat last character } else { @@ -1275,6 +1289,8 @@ static int ReadImageDescription( Image *imPtr, stBuf *sPtr, char *line ) { + // This function parses the i- and -o lines + Image im; stBuf sBuf; char *ch = line; @@ -1285,180 +1301,173 @@ int tempInt; double tempDbl; char typeParm; + char temp; memcpy( &im, imPtr, sizeof(Image) ); memcpy( &sBuf, sPtr, sizeof(stBuf )); // printf("************************************* Before Cut Frame %d \n", im.cP.cutFrame); - while( *ch != 0) - { - switch(*ch) - { - case 'v': READ_VAR( "%lf", &im.hfov ); - break; - case 'a': READ_VAR( "%lf", &(im.cP.radial_params[0][3])); - im.cP.radial = TRUE; - break; - case 'b': READ_VAR("%lf", &(im.cP.radial_params[0][2])); - im.cP.radial = TRUE; - break; - case 'c': READ_VAR("%lf", &(im.cP.radial_params[0][1])); - im.cP.radial = TRUE; - break; - case 'f': READ_VAR( FMT_INT32, &im.format ); - if( im.format == _panorama || im.format == _equirectangular ) - im.cP.correction_mode |= correction_mode_vertical; - break; - case 'y': READ_VAR( "%lf", &im.yaw); - break; - case 'p': READ_VAR( "%lf", &im.pitch); - break; - case 'r': READ_VAR( "%lf", &im.roll); - break; - case 'd': READ_VAR("%lf", &(im.cP.horizontal_params[0])); - im.cP.horizontal = TRUE; - break; - case 'e': READ_VAR("%lf", &(im.cP.vertical_params[0])); - im.cP.vertical = TRUE; - break; - case 'g': READ_VAR("%lf", &(im.cP.shear_x)); - im.cP.shear = TRUE; - break; - case 't': READ_VAR("%lf", &(im.cP.shear_y)); - im.cP.shear = TRUE; - break; - case '+': nextWord( buf, &ch ); - sprintf( sBuf.srcName, "%s", buf); - break; - case '-': nextWord( buf, &ch ); - sprintf( sBuf.destName, "%s", buf ); - break; - case 'u': READ_VAR( "%d", &(sBuf.feather) ); - break; - case 's': READ_VAR( "%d", &sBuf.seam ); - { - if(sBuf.seam != _dest) - sBuf.seam = _middle; - } - break; - case 'w': READ_VAR( FMT_INT32, &im.width ); - break; - case 'h': READ_VAR( FMT_INT32, &im.height ); - break; - case 'o': ch++; - im.cP.correction_mode |= correction_mode_morph; - break; - case 'k': // Colour correction - READ_VAR( "%d", &i ); - // i &= 3; - sBuf.colcorrect |= i&3; - sBuf.colcorrect += (i+1)*4; - break; - case 'm': // Frame - //THiS NEEDS A GOOD FIX... - typeParm = *(ch+1); - // first consume the parameter - if (typeParm =='x' || typeParm == 'y') { - // Consume next character, then read parm - ch++; - READ_VAR( "%d", &tempInt); - } - else { - READ_VAR( "%d", &tempInt); - } - - if (tempInt == 0) { - // value of zero, just ignore - break; - } - - // Sometimes this is specified to force a zero. In this case - // issue a warning and ignore - if (cropping) { - PrintError("Contradictory cropping specified. M cropping ignored\n"); - break; - } - // Eat next token to avoid error - cropping = 1; - im.cP.cutFrame = TRUE; - - switch( typeParm ) { - case 'x': - im.cP.fwidth = tempInt; - //READ_VAR( "%d", &im.cP.fwidth ); - break; - case 'y': - im.cP.fheight = tempInt; - //READ_VAR( "%d", &im.cP.fheight ); - //im.cP.cutFrame = TRUE; - break; - default: - im.cP.frame = tempInt; - READ_VAR( "%d", &(im.cP.frame) ); - // im.cP.cutFrame = TRUE; - break; - } - - break; - case 'n': // Name string (used for panorama format) - nextWord( buf, &ch ); - strcpy( im.name, buf ); - break; - case 'S': - if (cropping) { - PrintError("Contradictory cropping specified. S cropping ignored\n"); - // Eat next token - nextWord( buf, &ch ); - break; - } - cropping = 1; - - nextWord( buf, &ch ); - sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im.selection.left, &im.selection.right, &im.selection.top, &im.selection.bottom ); - break; - case 'C': - if (cropping) { - PrintError("Contradictory cropping specified. C cropping ignored\n"); - // Eat next token - nextWord( buf, &ch ); - break; - } - cropping = 1; - - nextWord( buf, &ch ); - sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im.selection.left, &im.selection.right, &im.selection.top, &im.selection.bottom ); - im.cP.cutFrame = TRUE; - break; - case 'P': - nextWord(buf, &ch); - b = strtok(buf, " \""); - if (b != NULL) { - while (b != NULL) { - if (sscanf(b, "%lf", &tempDbl) == 1) { - if (++im.formatParamCount >= PANO_PROJECTION_MAX_PARMS) { - PrintError("Illegal number of projection parameters. Maximum is %d", PANO_PROJECTION_MAX_PARMS); - return -1; - } - im.formatParam[im.formatParamCount - 1] = tempDbl; - b = strtok(NULL, " \""); - } else { - PrintError("Illegal value in P parameter %s", b); - return -1; - } - } - } - break; - default: - ch++; - break; + while( *ch != 0) { + switch(*ch) { + case 'f': READ_VAR( FMT_INT32, &im.format ); + if( im.format == _panorama || im.format == _equirectangular ) + im.cP.correction_mode |= correction_mode_vertical; + break; + case 'v': READ_VAR( "%lf", &im.hfov ); + break; + case 'y': READ_VAR( "%lf", &im.yaw); + break; + case 'p': READ_VAR( "%lf", &im.pitch); + break; + case 'r': READ_VAR( "%lf", &im.roll); + break; + + + case 'a': READ_VAR( "%lf", &(im.cP.radial_params[0][3])); + im.cP.radial = TRUE; + break; + case 'b': READ_VAR("%lf", &(im.cP.radial_params[0][2])); + im.cP.radial = TRUE; + break; + case 'c': READ_VAR("%lf", &(im.cP.radial_params[0][1])); + im.cP.radial = TRUE; + break; + case 'd': READ_VAR("%lf", &(im.cP.horizontal_params[0])); + im.cP.horizontal = TRUE; + break; + case 'e': READ_VAR("%lf", &(im.cP.vertical_params[0])); + im.cP.vertical = TRUE; + break; + case 'g': READ_VAR("%lf", &(im.cP.shear_x)); + im.cP.shear = TRUE; + break; + case 't': READ_VAR("%lf", &(im.cP.shear_y)); + im.cP.shear = TRUE; + break; + case '+': nextWord( buf, &ch ); + PrintError("Obsolete + parameter is ignored in image description"); + sprintf( sBuf.srcName, "%s", buf); + break; + case '-': nextWord( buf, &ch ); + PrintError("Obsolete - parameter is ignored in image description"); + sprintf( sBuf.destName, "%s", buf ); + break; + + + case 'S': + if (cropping) { + PrintError("Contradictory cropping specified. S cropping ignored\n"); + // Eat next token + nextWord( buf, &ch ); + break; } + cropping = 1; + + nextWord( buf, &ch ); + sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im.selection.left, &im.selection.right, &im.selection.top, &im.selection.bottom ); + break; + case 'C': + if (cropping) { + PrintError("Contradictory cropping specified. C cropping ignored\n"); + // Eat next token + nextWord( buf, &ch ); + break; + } + cropping = 1; + + nextWord( buf, &ch ); + sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im.selection.left, &im.selection.right, &im.selection.top, &im.selection.bottom ); + im.cP.cutFrame = TRUE; + break; + + case 'm': // Frame + //THiS NEEDS A GOOD FIX... + typeParm = *(ch+1); + // first consume the parameter + if (typeParm =='x' || typeParm == 'y') { + // Consume next character, then read parm + ch++; + READ_VAR( "%d", &tempInt); + } + else { + READ_VAR( "%d", &tempInt); + } + + if (tempInt == 0) { + // value of zero, just ignore + break; + } + + // Sometimes this is specified to force a zero. In this case + // issue a warning and ignore + if (cropping) { + PrintError("Contradictory cropping specified. M cropping ignored\n"); + break; + } + // Eat next token to avoid error + cropping = 1; + im.cP.cutFrame = TRUE; + + switch( typeParm ) { + case 'x': + im.cP.fwidth = tempInt; + //READ_VAR( "%d", &im.cP.fwidth ); + break; + case 'y': + im.cP.fheight = tempInt; + //READ_VAR( "%d", &im.cP.fheight ); + //im.cP.cutFrame = TRUE; + break; + default: + im.cP.frame = tempInt; + READ_VAR( "%d", &(im.cP.frame) ); + // im.cP.cutFrame = TRUE; + break; + } + + break; + case 's': READ_VAR( "%d", &sBuf.seam ); + PrintError("Obsolete s parameter ignored in image description"); + break; + + case 'o': ch++; + im.cP.correction_mode |= correction_mode_morph; + break; + case 'u': + READ_VAR( "%d", &i ); + PrintError("Feathering is ignored. Use PTmasker"); + break; + case 'w': READ_VAR( FMT_INT32, &im.width ); + break; + case 'h': READ_VAR( FMT_INT32, &im.height ); + break; + case 'n': // Name string (used for input image name) + nextWord( buf, &ch ); + strcpy( im.name, buf ); + break; + case 'K': + case 'V': + // Used by Hugin. Silently ignore until next space. This way we can accept .pto files for processing + nextWord( buf, &ch ); + break; + case ' ': + case '\t': + case '\n': + case '\r': + // skip characters and tabs + ch++; + break; + default: + PrintError("Illegal token in adjust line [%c] rest of line [%s]", *ch, ch); + return -1; + } } - + // printf("************************************* A Cut Frame %d \n", im.cP.cutFrame); // Set 4th polynomial parameter im.cP.radial_params[0][0] = 1.0 - ( im.cP.radial_params[0][3] + im.cP.radial_params[0][2] - + im.cP.radial_params[0][1] ) ; + + im.cP.radial_params[0][1] ) ; SetEquColor( &im.cP ); SetCorrectionRadius( &im.cP ); @@ -1471,6 +1480,109 @@ return 0; } +static int ReadPanoramaDescription( Image *imPtr, stBuf *sPtr, char *line ) +{ + // This function parses the p- line + + Image im; + stBuf sBuf; + char *ch = line; + char buf[LINE_LENGTH]; + char *b; + int i; + int cropping = 0; + int tempInt; + double tempDbl; + char typeParm; + char temp; + + memcpy( &im, imPtr, sizeof(Image) ); + memcpy( &sBuf, sPtr, sizeof(stBuf )); + + // printf("************************************* Before Cut Frame %d \n", im.cP.cutFrame); + while( *ch != 0) { + switch(*ch) { + case 'w': READ_VAR( FMT_INT32, &im.width ); + break; + case 'h': READ_VAR( FMT_INT32, &im.height ); + break; + case 'f': READ_VAR( FMT_INT32, &im.format ); + if( im.format == _panorama || im.format == _equirectangular ) + im.cP.correction_mode |= correction_mode_vertical; + break; + case 'P': + nextWord(buf, &ch); + b = strtok(buf, " \""); + if (b != NULL) { + while (b != NULL) { + if (sscanf(b, "%lf", &tempDbl) == 1) { + if (++im.formatParamCount >= PANO_PROJECTION_MAX_PARMS) { + PrintError("Illegal number of projection parameters. Maximum is %d", PANO_PROJECTION_MAX_PARMS); + return -1; + } + im.formatParam[im.formatParamCount - 1] = tempDbl; + b = strtok(NULL, " \""); + } else { + PrintError("Illegal value in P parameter %s", b); + return -1; + } + } + } + break; + case 'v': READ_VAR( "%lf", &im.hfov ); + break; + + case 'n': // Name string (used for panorama format) + nextWord( buf, &ch ); + strcpy( im.name, buf ); + break; + + case 'u': //Feather + READ_VAR( "%d", &i ); + PrintError("Feathering is ignored. Use PTmasker"); + break; + case 'k': // Colour correction + READ_VAR( "%d", &i ); + PrintError("Colour correction ignored (k). Use PTblender"); + break; + case 'd': // Colour correction + READ_VAR( "%d", &i ); + PrintError("Colour correction ignored (d). Use PTblender"); + break; + case 'b': // Colour correction + READ_VAR( "%d", &i ); + PrintError("Colour correction ignored parameter ignored (b). Use PTblender"); + break; + case ' ': + case '\t': + case '\n': + case '\r': + // skip characters and tabs + ch++; + break; + default: + PrintError("Illegal token in 'p'-line [%d] [%c] [%s]", *ch, *ch, ch); + ch++; + break; + } + } + + // I am not sure this is needed, but I am not sure it is not :) + // code inherited from ReadImageDescription + im.cP.radial_params[0][0] = 1.0 - ( im.cP.radial_params[0][3] + im.cP.radial_params[0][2] + + im.cP.radial_params[0][1] ) ; + + SetEquColor( &im.cP ); + SetCorrectionRadius( &im.cP ); + + memcpy( imPtr, &im, sizeof(Image) ); + memcpy( sPtr, &sBuf, sizeof(stBuf ) ); + return 0; +} + + + + // Parse a line describing modes static int ReadModeDescription( sPrefs *sP, char *line ) Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2007-01-11 00:37:14 UTC (rev 646) +++ trunk/libpano/version.h 2007-01-11 06:04:23 UTC (rev 647) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.9 " +#define VERSION "2.9.10 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2007-01-11 07:04:44
|
Revision: 648 http://svn.sourceforge.net/panotools/?rev=648&view=rev Author: dmg Date: 2007-01-10 23:04:45 -0800 (Wed, 10 Jan 2007) Log Message: ----------- 2007-01-10 dmg <dm...@uv...> * parser.c (readAdjust): Images with i were all done with the first spec. This change fixes that problem (the parser should be rewritten) Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/parser.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2007-01-11 06:04:23 UTC (rev 647) +++ trunk/libpano/ChangeLog 2007-01-11 07:04:45 UTC (rev 648) @@ -1,5 +1,9 @@ 2007-01-10 dmg <dm...@uv...> + * parser.c (readAdjust): Images with 'i' were all done with the + first spec. This change fixes that problem (the parser should be + rewritten) + * version.h (VERSION), configure.ac Upgraded to version 2.9.10 * doc/stitch.txt: Updated the file to match latest version. Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2007-01-11 06:04:23 UTC (rev 647) +++ trunk/libpano/parser.c 2007-01-11 07:04:45 UTC (rev 648) @@ -64,12 +64,13 @@ return -1; \ } \ - #define READ_VAR(format, ptr ) nextWord( buf, &li ); \ MY_SSCANF( buf, format, ptr ); + + #define READ_OPT_VAR(var) nextWord( buf, &li ); \ MY_SSCANF( buf, "%d", &k); \ if( k<0 || k>= numIm ) \ @@ -374,7 +375,7 @@ gl->cpt[numPts].type = 0; // default : optimize r if( ReadControlPoint( &(gl->cpt[numPts]), &(line[1]) ) != 0 ) { - PrintError("Syntax error in script: Line %d", lineNum); + PrintError("Syntax error in script in control point 'c': Line %d", lineNum); return -1; } numPts++; @@ -383,7 +384,7 @@ case 'm': // Mode description if( ReadModeDescription( &gl->sP, &(line[1]) ) != 0 ) { - PrintError( "Syntax error in line %d" , lineNum); + PrintError( "Syntax error in script in mode description 'm': line %d" , lineNum); return -1; } break; @@ -441,7 +442,7 @@ gl->pano.hfov = 360.0; if( ReadPanoramaDescription( &(gl->pano), &(gl->st), &(line[1]) ) != 0 ) { - PrintError( "Syntax error in line %d" , lineNum); + PrintError( "Syntax error in panorama description p line: %d (%s)" , lineNum,line); return -1; } switch (gl->pano.format) { @@ -900,7 +901,7 @@ // if 'o' has been read then skip if (!seto && !seti) { if( ReadImageDescription( &(p->im), &(p->sBuf), &(line[1]) ) != 0 ) { - PrintError("Syntax error in i-line %d", lineNum); + PrintError("Syntax error in i-line %d (%s)", lineNum, line); free(script); return -1; } @@ -912,7 +913,7 @@ if( !seto ) { // Read only _one_ image // 'o' has priority over 'i' lines if( ReadImageDescription( &(p->im), &(p->sBuf), &(line[1]) ) != 0 ) { - PrintError( "Syntax error in line %d" , lineNum); + PrintError( "Syntax error parsing o-line %d (%s)" , lineNum, line); free( script ); return -1; } @@ -922,7 +923,7 @@ case 'm': // Mode description if( ReadModeDescription( sP, &(line[1]) ) != 0 ) { - PrintError( "Syntax error in line %d" , lineNum); + PrintError( "Syntax error in m-line %d (%s)" , lineNum, line); free( script ); return -1; } @@ -996,6 +997,17 @@ // Create and Write changed scriptfile if inserting if( insert ) { + char charToFind; + // dmg: this is the part that I hate the most about the parser: + // it rewrites the file over and over again, eating one line at at a time + + if (seti) + charToFind = 'i'; + + // 'o' has priority over 'i' + if (seto) + charToFind = 'o'; + seto = FALSE; ch = script; @@ -1003,7 +1015,7 @@ { while(*ch == '\n') ch++; - if( *ch == 'o' ) + if( *ch == charToFind ) seto = TRUE; else { @@ -1011,7 +1023,7 @@ ch++; } } - if( *ch == 'o' ) *ch = '!'; + if( *ch == charToFind ) *ch = '!'; // If this is the last image to convert: recover script file @@ -1020,7 +1032,7 @@ while( *ch != 0 && !seto ) { while(*ch == '\n') ch++; - if( *ch == 'o' ) + if( *ch == charToFind ) seto = TRUE; else { @@ -1035,7 +1047,7 @@ while(*ch == '\n') ch++; if( *ch == '!' ) - *ch = 'o'; + *ch = charToFind; else { while(*ch != '\n' && *ch != 0) @@ -1204,7 +1216,10 @@ #undef MY_SSCANF #define MY_SSCANF( str, format, ptr ) if( sscanf( str, format, ptr ) != 1 ) \ - return -1; \ + { \ + PrintError("Syntax error in script: Could read value for variable");\ + return -1; \ + } #undef READ_VAR #define READ_VAR(format, ptr ) nextWord( buf, &ch ); \ @@ -1315,7 +1330,8 @@ break; case 'v': READ_VAR( "%lf", &im.hfov ); break; - case 'y': READ_VAR( "%lf", &im.yaw); + case 'y': + READ_VAR( "%lf", &im.yaw); break; case 'p': READ_VAR( "%lf", &im.pitch); break; @@ -1430,7 +1446,8 @@ PrintError("Obsolete s parameter ignored in image description"); break; - case 'o': ch++; + case 'o': + ch++; im.cP.correction_mode |= correction_mode_morph; break; case 'u': @@ -1458,6 +1475,7 @@ ch++; break; default: + printf("REturning...........\n"); PrintError("Illegal token in adjust line [%c] rest of line [%s]", *ch, ch); return -1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2007-01-11 07:50:31
|
Revision: 650 http://svn.sourceforge.net/panotools/?rev=650&view=rev Author: dmg Date: 2007-01-10 23:50:28 -0800 (Wed, 10 Jan 2007) Log Message: ----------- 2007-01-10 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.11 * parser.c (ParseScript): V-type variables from Hugin .pto files need to be ignored also. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/configure.ac trunk/libpano/parser.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2007-01-11 07:32:26 UTC (rev 649) +++ trunk/libpano/ChangeLog 2007-01-11 07:50:28 UTC (rev 650) @@ -1,9 +1,13 @@ 2007-01-10 dmg <dm...@uv...> + * version.h (VERSION), configure.ac Upgraded to version 2.9.11 + + * parser.c (ParseScript): V-type variables from Hugin .pto files + need to be ignored also. + * parser.c (readAdjust): Images with 'i' were all done with the first spec. This change fixes that problem (the parser should be rewritten) - * version.h (VERSION), configure.ac Upgraded to version 2.9.10 * doc/stitch.txt: Updated the file to match latest version. Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2007-01-11 07:32:26 UTC (rev 649) +++ trunk/libpano/configure.ac 2007-01-11 07:50:28 UTC (rev 650) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.10], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.11], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2007-01-11 07:32:26 UTC (rev 649) +++ trunk/libpano/parser.c 2007-01-11 07:50:28 UTC (rev 650) @@ -41,11 +41,13 @@ +#include <assert.h> #include "filter.h" #include <locale.h> #include "ZComb.h" + /* defined in adjust.c */ int AddEdgePoints( AlignInfo *gl ); @@ -73,6 +75,7 @@ #define READ_OPT_VAR(var) nextWord( buf, &li ); \ MY_SSCANF( buf, "%d", &k); \ + printf("REading optimization var %s forimage %d\n", #var,k);\ if( k<0 || k>= numIm ) \ { \ PrintError("Syntax error in script: Line %d\n\nIllegal image number: %ld", lineNum, k);\ @@ -144,6 +147,8 @@ // end mask-from-focus Rik's hacking SetImageDefaults(&(gl->pano)); SetStitchDefaults(&(gl->st)); strcpy( gl->st.srcName, "buf" ); // Default: Use buffer 'buf' for stitching + printf("Number of images %d\n",gl-> numIm); + for(i=0; i<gl->numIm; i++) { SetImageDefaults( &(gl->im[i]) ); @@ -170,7 +175,6 @@ // parse line; use only if first character is i,p,v,c,m - switch( line[0] ) { case 'i': // Image description @@ -339,6 +343,10 @@ sscanf( buf, FMT_INT32","FMT_INT32","FMT_INT32","FMT_INT32, &im->selection.left, &im->selection.right, &im->selection.top, &im->selection.bottom ); im->cP.cutFrame = TRUE; break; + case 'V': + // Ignore V variables in i + nextWord( buf, &li ); + break; default: li++; break; @@ -346,6 +354,7 @@ } numIm++; + break; case 't': // Triangle li = &(line[1]); Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2007-01-11 07:32:26 UTC (rev 649) +++ trunk/libpano/version.h 2007-01-11 07:50:28 UTC (rev 650) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.10 " +#define VERSION "2.9.11 " #endif #ifndef PTVERSION_NAME_LONG This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |