From: <dm...@us...> - 2006-10-23 03:19:10
|
Revision: 578 http://svn.sourceforge.net/panotools/?rev=578&view=rev Author: dmg Date: 2006-10-22 20:18:58 -0700 (Sun, 22 Oct 2006) Log Message: ----------- 2006-10-22 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre4 * tiff.c: Removed redundant #defines * PTcommon.c, PTcommon.h, filter.h, file.c: Added support for stacking images in PSD files, that is, each iamge contributes equaly to a final image. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/PTcommon.h trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/filter.h trunk/libpano/tests/simpleStitch/ChangeLog trunk/libpano/tests/simpleStitch/reference/psd_no_mask.psd trunk/libpano/tiff.c trunk/libpano/tools/ChangeLog trunk/libpano/tools/PTtiff2psd.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/ChangeLog 2006-10-23 03:18:58 UTC (rev 578) @@ -1,3 +1,13 @@ +2006-10-22 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre4 + + * tiff.c: Removed redundant #defines + + * PTcommon.c, PTcommon.h, filter.h, file.c: Added support for + stacking images in PSD files, that is, each iamge contributes + equaly to a final image. + 2006-09-22 dmg <dm...@uv...> * ptstitch.c: The creation of the stitching masks was not working Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/PTcommon.c 2006-10-23 03:18:58 UTC (rev 578) @@ -173,7 +173,7 @@ } int panoCreatePSD(fullPath * fullPathImages, int numberImages, - fullPath * outputFileName) + fullPath * outputFileName, int stacked) { Image *ptrImage; int i; @@ -195,9 +195,9 @@ // Process background of PSD SetImageDefaults(&image); - if (readTIFF(&image, &fullPathImages[0]) != 0) { + if (panoTiffRead(&image, fullPathImages[0].name) == 0) { - PrintError("Could not read TIFF image No 0"); + PrintError("Could not read TIFF image No 0 %s", fullPathImages[0].name); if (ptQuietFlag == 0) Progress(_disposeProgress, tempString); @@ -265,6 +265,10 @@ stitchInfo.seam = 1; stitchInfo.feather = 0; + if (stacked) + stitchInfo.opacity = (unsigned char) (255.0/ (i + 1)); + else + stitchInfo.opacity = 255; if (addLayerToFile(ptrImage, outputFileName, &tempFile, &stitchInfo) != 0) { @@ -1486,7 +1490,7 @@ ) { panoReplaceExt(panoFileName->name, ".psd"); - if (panoCreatePSD(fullPathImages, counterImageFiles, panoFileName) != 0) { + if (panoCreatePSD(fullPathImages, counterImageFiles, panoFileName, 0) != 0) { PrintError("Error creating PSD file"); return (-1); } Modified: trunk/libpano/PTcommon.h =================================================================== --- trunk/libpano/PTcommon.h 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/PTcommon.h 2006-10-23 03:18:58 UTC (rev 578) @@ -55,7 +55,7 @@ /* defined in ptpicker.c, but never exported */ int panoFlattenTIFF(fullPath *fullPathImages, int counterImageFiles, fullPath *outputFileName, int removeOriginals); -int panoCreatePSD( fullPath *fullPathImages, int, fullPath*); +int panoCreatePSD( fullPath *fullPathImages, int, fullPath*, int); extern int quietFlag; Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/configure.ac 2006-10-23 03:18:58 UTC (rev 578) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre3], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre4], 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-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/file.c 2006-10-23 03:18:58 UTC (rev 578) @@ -1580,7 +1580,7 @@ WRITEUCHAR( 'r' ); WRITEUCHAR( 'm' ); - WRITEUCHAR(255); // 1 byte Opacity 0 = transparent ... 255 = opaque + WRITEUCHAR(sB->opacity); // 1 byte Opacity 0 = transparent ... 255 = opaque WRITEUCHAR( 0 ); // 1 byte Clipping 0 = base, 1 = non\xD0base WRITEUCHAR( hasShapeMask ); // 1 byte Flags bit 0 = transparency protected bit 1 = visible WRITEUCHAR( 0 ); // 1 byte (filler) (zero) Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/filter.h 2006-10-23 03:18:58 UTC (rev 578) @@ -209,8 +209,10 @@ int feather; // Width of feather int colcorrect; // Should the images be color corrected? int seam; // Where to put the seam (see above) + unsigned char opacity; // Opacity of the layer. Currently used only by PSD output. 0 trans, 255 opaque }; + typedef struct stitchBuffer stBuf; struct panControls{ // Structure for realtime Panoeditor Modified: trunk/libpano/tests/simpleStitch/ChangeLog =================================================================== --- trunk/libpano/tests/simpleStitch/ChangeLog 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/tests/simpleStitch/ChangeLog 2006-10-23 03:18:58 UTC (rev 578) @@ -1,3 +1,7 @@ +2006-10-22 dmg <dm...@uv...> + + * The PSD files were updated. + 2006-09-22 dmg <dm...@se...g> * Updated flat and mask outputs to match changes to mask Modified: trunk/libpano/tests/simpleStitch/reference/psd_no_mask.psd =================================================================== (Binary files differ) Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/tiff.c 2006-10-23 03:18:58 UTC (rev 578) @@ -560,13 +560,9 @@ ////////////////////////////////////////////////////////////////////// // NEW tiff routines ////////////////////////////////////////////////////////////////////// -#define PANO_DEFAULT_PIXELS_PER_RESOLUTION 150.0 -#define PANO_DEFAULT_TIFF_RESOLUTION_UNITS RESUNIT_INCH -#define PANO_DEFAULT_TIFF_COMPRESSION - int panoTiffGetCropInformation(pano_Tiff * file) { /* Modified: trunk/libpano/tools/ChangeLog =================================================================== --- trunk/libpano/tools/ChangeLog 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/tools/ChangeLog 2006-10-23 03:18:58 UTC (rev 578) @@ -1,3 +1,7 @@ +2006-10-22 dmg <dm...@uv...> + + * PTtiff2psd.c (main): Added support to stack images + 2006-09-25 dmg <dm...@se...g> * added PTtiffdump.c to the svn repository Modified: trunk/libpano/tools/PTtiff2psd.c =================================================================== --- trunk/libpano/tools/PTtiff2psd.c 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/tools/PTtiff2psd.c 2006-10-23 03:18:58 UTC (rev 578) @@ -48,7 +48,8 @@ #define PT_TIFF2PSD_USAGE "PTtiff2psd [options] <tiffFiles>+\n\n"\ "Options:\n"\ "\t-o <filename>\tOutput filename (default merged.psd)\n"\ - "\t-m\t\tAdd stitching mask"\ + "\t-m\t\tAdd stitching mask\n"\ + "\t-s\t\tStack them\n"\ "\t-q\t\tQuiet run\n"\ "\t-r\t\tReverse layers\n"\ "\t-h\t\tShow this message\n"\ @@ -73,6 +74,7 @@ int featherSize = 0; int eraseTempFiles = 0; int i; + int stacked = 0; ptrInputFiles = NULL; counter = 0; @@ -84,7 +86,7 @@ return(-1); } - while ((opt = getopt(argc, argv, "o:qhfmr")) != -1) { + while ((opt = getopt(argc, argv, "o:sqhfmr")) != -1) { // o and f -> set output file // h -> help @@ -99,8 +101,12 @@ return(-1); } break; + case 's': + stacked = 1; + break; case 'm': addMask = 1; + break; case 'f': forceOverwrite = 1; break; @@ -202,7 +208,7 @@ Progress(_initProgress, tempString); } - if (panoCreatePSD(ptrInputFiles, filesCount, &outputFilename ) != 0) { + if (panoCreatePSD(ptrInputFiles, filesCount, &outputFilename, stacked) != 0) { PrintError("Error while creating PSD file"); return -1; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-09-25 02:27:35 UTC (rev 577) +++ trunk/libpano/version.h 2006-10-23 03:18:58 UTC (rev 578) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre3 " +#define VERSION "2.8.5pre4 " #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-10-24 16:59:24
|
Revision: 579 http://svn.sourceforge.net/panotools/?rev=579&view=rev Author: dmg Date: 2006-10-24 09:50:49 -0700 (Tue, 24 Oct 2006) Log Message: ----------- 2006-10-24 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre5 * ColourBrightness.c, tools/PTblender.c: The following bugs in PTblender are fixed: 1) When -c or -m is specified no image output is done and therefore it should not be possible to specify -f too. 2) When -c is specified wrong index to array curveExtension is used. 3) Program tries to free already freed memory at the end. Submitted by Michal at lightcomp. We need a test suite for PTblender. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/configure.ac trunk/libpano/tests/ChangeLog trunk/libpano/tests/panoAutomateTest.pl trunk/libpano/tools/PTblender.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/ChangeLog 2006-10-24 16:50:49 UTC (rev 579) @@ -1,3 +1,19 @@ +2006-10-24 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre5 + + * ColourBrightness.c, tools/PTblender.c: The following bugs in PTblender + are fixed: + + 1) When -c or -m is specified no image output is done and therefore it + should not be possible to specify -f too. + 2) When -c is specified wrong index to array curveExtension is used. + 3) Program tries to free already freed memory at the end. + + Submitted by Michal at lightcomp. + + We need a test suite for PTblender. + 2006-10-22 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre4 Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/ColourBrightness.c 2006-10-24 16:50:49 UTC (rev 579) @@ -490,8 +490,8 @@ int i; FILE *output; char *curveExtension[2] = { - ".acv", - ".amp"}; + ".amp", + ".acv"}; #define PHOTOSHOP_CURVES_MAGIC_NUMBER "\x00\x04\x00\x05" @@ -502,7 +502,7 @@ sprintf(temp, "%04d", index); strcat(outputFileName, temp); - panoReplaceExt(outputFileName, curveExtension[curveType]); + panoReplaceExt(outputFileName, curveExtension[curveType-1]); // fprintf(stderr, "Creating output file %s\n", outputFileName); Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/configure.ac 2006-10-24 16:50:49 UTC (rev 579) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre4], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre5], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/tests/ChangeLog =================================================================== --- trunk/libpano/tests/ChangeLog 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/tests/ChangeLog 2006-10-24 16:50:49 UTC (rev 579) @@ -1,3 +1,9 @@ +2006-10-24 dmg <dm...@uv...> + + * panoAutomateTest.pl: I have disabled PSD testing. The inclusing + of the version of metadata in the output is making it fail every + time. We need a program to test only data. + 2006-08-30 dmg <dm...@uv...> * updated PSD files according to changes in file.c Modified: trunk/libpano/tests/panoAutomateTest.pl =================================================================== --- trunk/libpano/tests/panoAutomateTest.pl 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/tests/panoAutomateTest.pl 2006-10-24 16:50:49 UTC (rev 579) @@ -76,9 +76,9 @@ 'tiff_m' => "TIFF_m", # 'tiff_mask' => "TIFF_mask", 'tiff_m_cropped' => "TIFF_m r:CROP", - 'psd' => "PSD", - 'psd_nomask' => "PSD_nomask", - 'psd_mask' => "PSD_mask", +# 'psd' => "PSD", +# 'psd_nomask' => "PSD_nomask", +# 'psd_mask' => "PSD_mask", # "xinvalid" => 'invalid', ); Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/tools/PTblender.c 2006-10-24 16:50:49 UTC (rev 579) @@ -51,8 +51,8 @@ "\t-t [0,1,2]\tType of colour correction: 0 full (default), 1 brightness only, 2 colour only\n"\ "\t-f <filename>\t\tFlatten images to single TIFF file\n"\ "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ - "\t-c\t\tOutput curves smooth\n\t-h\t\tOutput a photoshop curve per each corrected file\n"\ - "\t-m\t\tOutput curves arbitrary map\n\t-h\t\tOutput a photoshop curve per each corrected file\n"\ + "\t-c\t\tOutput curves smooth\t\t(Output a photoshop curve per each corrected file)\n"\ + "\t-m\t\tOutput curves arbitrary map\t(Output a photoshop curve per each corrected file)\n"\ "\n" #define PT_BLENDER_VERSION "PTblender Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" @@ -119,6 +119,10 @@ } break; case 'f': + if (outputCurvesType) { + PrintError("Option -f can't be used with option -c or -m"); + return -1; + } flattenFlag = 1; if (strlen(optarg) < MAX_PATH_LENGTH) { strcpy(flatOutputFileName, optarg); @@ -135,9 +139,25 @@ ptQuietFlag = 1; break; case 'c': + if (outputCurvesType == CB_OUTPUT_CURVE_ARBITRARY) { + PrintError("Can't use both -c and -m options"); + return -1; + } + if (flattenFlag) { + PrintError("Option -c can't be used with option -f"); + return -1; + } outputCurvesType = CB_OUTPUT_CURVE_SMOOTH; break; case 'm': + if (outputCurvesType == CB_OUTPUT_CURVE_SMOOTH) { + PrintError("Can't use both -c and -m options"); + return -1; + } + if (flattenFlag) { + PrintError("Option -m can't be used with option -f"); + return -1; + } outputCurvesType = CB_OUTPUT_CURVE_ARBITRARY; break; case 'h': @@ -212,11 +232,13 @@ PrintError("TIFFs are not compatible"); return -1; } - printf("Continuing\n"); + if (referenceImage >= 0) { printf("Colour correcting photo using %d as a base type %d\n", referenceImage, typeCorrection); ColourBrightness(ptrInputFiles, ptrOutputFiles, filesCount, referenceImage, typeCorrection, outputCurvesType); + free(ptrInputFiles); ptrInputFiles = ptrOutputFiles; + ptrOutputFiles = NULL; } if (flattenFlag) { @@ -244,8 +266,8 @@ } } - free(ptrInputFiles); - free(ptrOutputFiles); + if (ptrInputFiles) free(ptrInputFiles); + if (ptrOutputFiles) free(ptrOutputFiles); return 0; Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-23 03:18:58 UTC (rev 578) +++ trunk/libpano/version.h 2006-10-24 16:50:49 UTC (rev 579) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre4 " +#define VERSION "2.8.5pre5 " #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-10-25 17:15:52
|
Revision: 581 http://svn.sourceforge.net/panotools/?rev=581&view=rev Author: dmg Date: 2006-10-25 10:15:40 -0700 (Wed, 25 Oct 2006) Log Message: ----------- 2006-10-24 dmg <dm...@uv...> * ColourBrightness.c: Map and Curve files for photoshop (colour correction) were not properly created in Intel machines. Submitted by Michal at lightcomp. * tools/PTblender.c: Updated command line processing: assume image 0 as reference if options -m or -c are specified. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/tools/ChangeLog trunk/libpano/tools/PTblender.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-24 22:42:59 UTC (rev 580) +++ trunk/libpano/ChangeLog 2006-10-25 17:15:40 UTC (rev 581) @@ -1,5 +1,16 @@ 2006-10-24 dmg <dm...@uv...> + * ColourBrightness.c: Map and Curve files for photoshop (colour + correction) were not properly created in Intel machines. + + Submitted by Michal at lightcomp. + + * tools/PTblender.c: Updated command line processing: assume image + 0 as reference if options -m or -c are specified. + + +2006-10-24 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre5 * ColourBrightness.c, tools/PTblender.c: The following bugs in PTblender Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-10-24 22:42:59 UTC (rev 580) +++ trunk/libpano/ColourBrightness.c 2006-10-25 17:15:40 UTC (rev 581) @@ -361,7 +361,7 @@ uint16_t shortValue; int i; - // so far we only support size == 0xff + // so far we only support size == 256 // fprintf(stderr, "size %d\n", size); @@ -372,7 +372,7 @@ // The algorithm currently writes the first point, 12, and the last point - shortValue = (uint16_t) 14; + shortValue = (uint16_t) htons(14); if (fwrite(&shortValue, 2, 1, output) != 1) { goto error; @@ -392,8 +392,8 @@ // be paranoic assert(temp >= 0 && temp <= 255); - y = (uint16_t) temp; - x = (uint16_t) i; + y = (uint16_t) htons(temp); + x = (uint16_t) htons(i); // For some reason y is first in the output if (fwrite(&y, 2, 1, output) != 1 || @@ -403,7 +403,7 @@ } // Write the very last point - uint16_t x=255; + uint16_t x=htons(255); if (fwrite(&x, 2, 1, output) != 1 || fwrite(&x, 2, 1, output) != 1 ) { goto error; Modified: trunk/libpano/tools/ChangeLog =================================================================== --- trunk/libpano/tools/ChangeLog 2006-10-24 22:42:59 UTC (rev 580) +++ trunk/libpano/tools/ChangeLog 2006-10-25 17:15:40 UTC (rev 581) @@ -1,3 +1,7 @@ +PLEASE DONT UPDATE THIS FILE ANY MORE. USE ./ChangeLog instead + + + 2006-10-22 dmg <dm...@uv...> * PTtiff2psd.c (main): Added support to stack images Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-10-24 22:42:59 UTC (rev 580) +++ trunk/libpano/tools/PTblender.c 2006-10-25 17:15:40 UTC (rev 581) @@ -202,6 +202,14 @@ } + if (outputCurvesType != 0 || typeCorrection != 0) { + // The user wants colour correction, so let us given them colour correction + if (referenceImage == -1) { + referenceImage = 0; + printf("No reference image specified. Assuming image 0 as reference\n"); + } + } + // Create output filename if (strchr(outputPrefix, '%') == NULL) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-10-25 17:26:28
|
Revision: 582 http://svn.sourceforge.net/panotools/?rev=582&view=rev Author: dmg Date: 2006-10-25 10:26:17 -0700 (Wed, 25 Oct 2006) Log Message: ----------- 2006-10-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre6 * tools/Makefile.am: Renamed PToptimizer to PTestimate Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/configure.ac trunk/libpano/tools/Makefile.am trunk/libpano/version.h Added Paths: ----------- trunk/libpano/tools/PTestimate.c Removed Paths: ------------- trunk/libpano/tools/PTOptimizer.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-25 17:15:40 UTC (rev 581) +++ trunk/libpano/ChangeLog 2006-10-25 17:26:17 UTC (rev 582) @@ -1,3 +1,10 @@ +2006-10-25 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre6 + + + * tools/Makefile.am: Renamed PToptimizer to PTestimate + 2006-10-24 dmg <dm...@uv...> * ColourBrightness.c: Map and Curve files for photoshop (colour Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-25 17:15:40 UTC (rev 581) +++ trunk/libpano/configure.ac 2006-10-25 17:26:17 UTC (rev 582) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre5], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre6], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-10-25 17:15:40 UTC (rev 581) +++ trunk/libpano/tools/Makefile.am 2006-10-25 17:26:17 UTC (rev 582) @@ -35,7 +35,7 @@ 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 +bin_PROGRAMS = panoinfo PTestimate PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTblender_SOURCES = PTblender.c PTblender_LDADD = -l${PANOLIB} -ltiff @@ -53,8 +53,8 @@ PTtiffdump_LDADD = -l${PANOLIB} -ljpeg -ltiff -PTOptimizer_SOURCES = PTOptimizer.c -PTOptimizer_LDADD = -l${PANOLIB} +PTestimate_SOURCES = PTestimate.c +PTestimate_LDADD = -l${PANOLIB} panoinfo_SOURCES = $(WIN_SRC) $(LIN_SRC) $(DAR_SRC) panoinfo_LDADD = -l${PANOLIB} Deleted: trunk/libpano/tools/PTOptimizer.c =================================================================== --- trunk/libpano/tools/PTOptimizer.c 2006-10-25 17:15:40 UTC (rev 581) +++ trunk/libpano/tools/PTOptimizer.c 2006-10-25 17:26:17 UTC (rev 582) @@ -1,91 +0,0 @@ -/* - * Clone of PTOptimizer - * - * Based on code found in Helmut Dersch's panorama-tools - * - * Dec 2003 - * - * Bruno Postle <bruno at postle.net> - * - * 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 - * - */ - -// gcc -oPTOptimizer -I/usr/include/pano12 -lpano12 PTOptimizer.c - - -#include "filter.h" -#include <stdio.h> - -#define PT_OPTIMIZER_VERSION "PTOptimizer Version " VERSION ", written by Helmut Dersch\n" - - -//static AlignInfo *g; -int CheckParams( AlignInfo *g ); - -int main(int argc,char *argv[]) -{ - aPrefs aP; - - char* script; - OptInfo opt; - AlignInfo ainf; - - fullPath infile; - //fullPath outfile; - - // - - SetAdjustDefaults(&aP); - - if(argc != 2) - { - printf(PT_OPTIMIZER_VERSION); - printf("Usage: %s /path/to/script.txt\n", argv[0]); - exit(1); - } - - StringtoFullPath(&infile, argv[1]); - - script = LoadScript( &infile ); - if( script != NULL ) - { - if (ParseScript( script, &ainf ) == 0) - { - if( CheckParams( &ainf ) == 0 ) - { - ainf.fcn = fcnPano; - - SetGlobalPtr( &ainf ); - - opt.numVars = ainf.numParam; - opt.numData = ainf.numPts; - opt.SetVarsToX = SetLMParams; - opt.SetXToVars = SetAlignParams; - opt.fcn = ainf.fcn; - *opt.message = 0; - - RunLMOptimizer( &opt ); - ainf.data = opt.message; - WriteResults( script, &infile, &ainf, distSquared, 0); - exit(0); - } - DisposeAlignInfo( &ainf ); - } - free( script ); - } - exit(1); -} - Copied: trunk/libpano/tools/PTestimate.c (from rev 577, trunk/libpano/tools/PTOptimizer.c) =================================================================== --- trunk/libpano/tools/PTestimate.c (rev 0) +++ trunk/libpano/tools/PTestimate.c 2006-10-25 17:26:17 UTC (rev 582) @@ -0,0 +1,91 @@ +/* + * Clone of PTOptimizer + * + * Based on code found in Helmut Dersch's panorama-tools + * + * Dec 2003 + * + * Bruno Postle <bruno at postle.net> + * + * 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 + * + */ + +// gcc -oPTOptimizer -I/usr/include/pano12 -lpano12 PTOptimizer.c + + +#include "filter.h" +#include <stdio.h> + +#define PT_OPTIMIZER_VERSION "PTOptimizer Version " VERSION ", written by Helmut Dersch\n" + + +//static AlignInfo *g; +int CheckParams( AlignInfo *g ); + +int main(int argc,char *argv[]) +{ + aPrefs aP; + + char* script; + OptInfo opt; + AlignInfo ainf; + + fullPath infile; + //fullPath outfile; + + // + + SetAdjustDefaults(&aP); + + if(argc != 2) + { + printf(PT_OPTIMIZER_VERSION); + printf("Usage: %s /path/to/script.txt\n", argv[0]); + exit(1); + } + + StringtoFullPath(&infile, argv[1]); + + script = LoadScript( &infile ); + if( script != NULL ) + { + if (ParseScript( script, &ainf ) == 0) + { + if( CheckParams( &ainf ) == 0 ) + { + ainf.fcn = fcnPano; + + SetGlobalPtr( &ainf ); + + opt.numVars = ainf.numParam; + opt.numData = ainf.numPts; + opt.SetVarsToX = SetLMParams; + opt.SetXToVars = SetAlignParams; + opt.fcn = ainf.fcn; + *opt.message = 0; + + RunLMOptimizer( &opt ); + ainf.data = opt.message; + WriteResults( script, &infile, &ainf, distSquared, 0); + exit(0); + } + DisposeAlignInfo( &ainf ); + } + free( script ); + } + exit(1); +} + Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-25 17:15:40 UTC (rev 581) +++ trunk/libpano/version.h 2006-10-25 17:26:17 UTC (rev 582) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre5 " +#define VERSION "2.8.5pre6 " #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-10-25 18:20:38
|
Revision: 583 http://svn.sourceforge.net/panotools/?rev=583&view=rev Author: dmg Date: 2006-10-25 11:20:19 -0700 (Wed, 25 Oct 2006) Log Message: ----------- 2006-10-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre7 * ColourBrightness.c (ReadHistograms): Compute histograms only when mask == 255. Ignore otherwise. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/configure.ac trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-25 17:26:17 UTC (rev 582) +++ trunk/libpano/ChangeLog 2006-10-25 18:20:19 UTC (rev 583) @@ -1,5 +1,10 @@ 2006-10-25 dmg <dm...@uv...> - + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre7 + + * ColourBrightness.c (ReadHistograms): Compute histograms only + when mask == 255. Ignore otherwise. + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre6 Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-10-25 17:26:17 UTC (rev 582) +++ trunk/libpano/ColourBrightness.c 2006-10-25 18:20:19 UTC (rev 583) @@ -1385,9 +1385,9 @@ assert(ptrPixel < ptrOtherPixel); assert(((int)(ptrOtherPixel - ptrPixel)) % bytesPerLine == 0); - /* Only process if the alpha channel is not zero in both pixels*/ + /* Only process if the alpha channel is == 0xff in both pixels*/ - if (0 != ptrPixel[0] && 0 != ptrOtherPixel[0] ) { + if (0xff == ptrPixel[0] && 0xff == ptrOtherPixel[0] ) { totalPixels ++; currentHistogram->overlappingPixels++; Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-25 17:26:17 UTC (rev 582) +++ trunk/libpano/configure.ac 2006-10-25 18:20:19 UTC (rev 583) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre6], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre7], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-25 17:26:17 UTC (rev 582) +++ trunk/libpano/version.h 2006-10-25 18:20:19 UTC (rev 583) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre6 " +#define VERSION "2.8.5pre7 " #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-10-26 23:44:02
|
Revision: 584 http://svn.sourceforge.net/panotools/?rev=584&view=rev Author: dmg Date: 2006-10-26 16:43:55 -0700 (Thu, 26 Oct 2006) Log Message: ----------- 2006-10-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre8 * PTcommon.c (panoCreatePanorama): Remove post-processing during remapping of images: in other words, ignore output format in script file. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/configure.ac trunk/libpano/tests/ChangeLog trunk/libpano/tests/panoAutomateTest.pl trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/ChangeLog 2006-10-26 23:43:55 UTC (rev 584) @@ -1,3 +1,10 @@ +2006-10-26 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre8 + + * PTcommon.c (panoCreatePanorama): Remove post-processing during + remapping of images: in other words, ignore output spec in script file. + 2006-10-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre7 Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/PTcommon.c 2006-10-26 23:43:55 UTC (rev 584) @@ -265,10 +265,10 @@ stitchInfo.seam = 1; stitchInfo.feather = 0; - if (stacked) - stitchInfo.opacity = (unsigned char) (255.0/ (i + 1)); - else - stitchInfo.opacity = 255; + if (stacked) + stitchInfo.opacity = (unsigned char) (255.0/ (i + 1)); + else + stitchInfo.opacity = 255; if (addLayerToFile(ptrImage, outputFileName, &tempFile, &stitchInfo) != 0) { @@ -353,48 +353,6 @@ #endif -static int Create_LP_ivr(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Create_LP_ivr this function is not implemented yet\n"); - exit(1); -} - -static int Unknown01(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Unknown01 this function is not implemented yet\n"); - exit(1); -} - -static int Unknown02(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Unknown02 this function is not implemented yet\n"); - exit(1); -} - -static int Unknown03(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Unknown03 this function is not implemented yet\n"); - exit(1); -} - -static int Unknown04(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Unknown04 this function is not implemented yet\n"); - exit(1); -} - -static int Unknown05(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Unknown05 this function is not implemented yet\n"); - exit(1); -} - -static int Create_QTVR(Image * image, fullPath * fullPathImage) -{ - fprintf(stderr, "Create QTVR is not implemented yet\n"); - exit(1); -} - static void ARGtoRGBAImage(Image * im) { int right; @@ -723,46 +681,46 @@ //an interior point in an input image can be at the edge of ROI. More research //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; - - for (x = 0; x <= TrPtr->src->width; x += x_jump) { - //convert source coordinates to cartesian coordinates (i.e. origin at center of image) - x_d = (double) x - sw2 ; - y_d = (double) y - sh2 ; - - //Map the source image cartesian coordinate to the destination image cartesian coordinate - finvD.func( x_d, y_d, &Dx, &Dy, finvD.param); - - //Convert destination cartesian coordinate back to destination "screen" coordinates (i.e. origin at top left of image) - Dx += w2; - Dy += h2; - - //printf(" IN: %d,%d -> OUT: %f, %f (%d, %d)\n", x, y, Dx, Dy, (int)Dx, (int)Dy); - - //Expand ROI if necessary - //I've observed that in some cases, the mapping function returns - //a value of "-1.#IND00". This is not a number, and probably indicates - //a divide by zero error somewhere in the mapping function. This should - //be solved, but, for now, discard this value and keep going - if (!isnan(Dx)) { - if ((int)Dx < ROIRect->left) ROIRect->left = (int)Dx; - if ((int)Dx > ROIRect->right) ROIRect->right = (int)Dx; - } - if (!isnan(Dy)){ - if ((int)Dy < ROIRect->top) ROIRect->top = (int)Dy; - if ((int)Dy > ROIRect->bottom) ROIRect->bottom = (int)Dy; - } - } - } - - //Reduce ROI if it extends beyond boundaries of final panorama region - if (ROIRect->left < 0) ROIRect->left =0; - if (ROIRect->top < 0) ROIRect->top =0; - if (ROIRect->right > (TrPtr->dest->width-1)) ROIRect->right = TrPtr->dest->width-1; - if (ROIRect->bottom > (TrPtr->dest->height-1)) ROIRect->bottom = TrPtr->dest->height-1; - - //printf("ROI: %d,%d - %d, %d\n", ROIRect->left, ROIRect->top, ROIRect->right, ROIRect->bottom); + + x_jump = (y==0 || y==TrPtr->src->height) ? 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) + x_d = (double) x - sw2 ; + y_d = (double) y - sh2 ; + + //Map the source image cartesian coordinate to the destination image cartesian coordinate + finvD.func( x_d, y_d, &Dx, &Dy, finvD.param); + + //Convert destination cartesian coordinate back to destination "screen" coordinates (i.e. origin at top left of image) + Dx += w2; + Dy += h2; + + //printf(" IN: %d,%d -> OUT: %f, %f (%d, %d)\n", x, y, Dx, Dy, (int)Dx, (int)Dy); + + //Expand ROI if necessary + //I've observed that in some cases, the mapping function returns + //a value of "-1.#IND00". This is not a number, and probably indicates + //a divide by zero error somewhere in the mapping function. This should + //be solved, but, for now, discard this value and keep going + if (!isnan(Dx)) { + if ((int)Dx < ROIRect->left) ROIRect->left = (int)Dx; + if ((int)Dx > ROIRect->right) ROIRect->right = (int)Dx; + } + if (!isnan(Dy)){ + if ((int)Dy < ROIRect->top) ROIRect->top = (int)Dy; + if ((int)Dy > ROIRect->bottom) ROIRect->bottom = (int)Dy; + } + } + } + + //Reduce ROI if it extends beyond boundaries of final panorama region + if (ROIRect->left < 0) ROIRect->left =0; + if (ROIRect->top < 0) ROIRect->top =0; + if (ROIRect->right > (TrPtr->dest->width-1)) ROIRect->right = TrPtr->dest->width-1; + if (ROIRect->bottom > (TrPtr->dest->height-1)) ROIRect->bottom = TrPtr->dest->height-1; + + //printf("ROI: %d,%d - %d, %d\n", ROIRect->left, ROIRect->top, ROIRect->right, ROIRect->bottom); } @@ -815,8 +773,9 @@ char var40[8]; char *tempString; // It looks like a char *temp; char outputFileName[512]; +#if 0 VRPanoOptions defaultVRPanoOptions; - +#endif char tmpStr[64]; // string fullPath currentFullPath; fullPath panoName; // according to documention: QTVR, PNG, PICT, TIFF, etc plus options...*/ @@ -838,7 +797,7 @@ int ebx; - int croppedTIFFOutput = 1, croppedTIFFIntermediate = 1; + int croppedTIFFIntermediate = 1; int croppedWidth = 0, croppedHeight = 0; PTRect ROIRect; unsigned int outputScanlineNumber = 0; @@ -853,9 +812,9 @@ //Copy script line for line into a new temporary file memcpy(&tempScriptFile, scriptFileName, sizeof(fullPath)); if (panoFileMakeTemp(&tempScriptFile) == 0) { - PrintError("Unable to create temporary file"); - goto mainError; - } + PrintError("Unable to create temporary file"); + goto mainError; + } panoTiffSetErrorHandler(); @@ -921,37 +880,9 @@ && colourCorrection < (counterImageFiles + 1) * 4); if (prefs->pano.cP.radial != 0) { - // correct_Prefs - //... - // 3 colors x (4 coeffic. for 3rd order polys + correction radius) - //radial_params[3][5] double (OFFSET 6c4 1732 - // - // [0][0..4] 40 bytes 6c4 6cc 6d4 6dc 6e4 - // [1][0..4] 40 (28) 6ec 6f4 6fc 704 70c - // [2][0..4] 40 (28) 714 71c 724 72c 734 - // 3c - // radial_params - // 3 * 5 * 8 = 120 - var00 = prefs->pano.cP.radial_params[0][2]; // what is this for, I have NO idea. var00++; -#if 0 - /* - I AM NOT TOTALLY SURE ABOUT THIS - 804a01d: dd 82 d4 06 00 00 fldl 0x6d4(%edx) // loads address into FL - 804a023: d9 bd b2 eb ff ff fnstcw 0xffffebb2(%ebp) ;;;;;;;;;;;>>> -5198 - 804a029: 66 8b 8d b2 eb ff ff mov 0xffffebb2(%ebp),%cx ;;;;;;;;;;;>>> -5198 - 804a030: 66 81 c9 00 0c or $0xc00,%cx - 804a035: 66 89 8d b0 eb ff ff mov %cx,0xffffebb0(%ebp) ;;;;;;;;;;;>>> -5200 - 804a03c: d9 ad b0 eb ff ff fldcw 0xffffebb0(%ebp) ;;;;;;;;;;;>>> -5200 - - 804a042: db 9d 7c e7 ff ff fistpl 0xffffe77c(%ebp) ;;;;;;;;;;;>>> -6276 var00 - 804a048: d9 ad b2 eb ff ff fldcw 0xffffebb2(%ebp) ;;;;;;;;;;;>>> -5198 - 804a04e: ff 85 7c e7 ff ff incl 0xffffe77c(%ebp) ;;;;;;;;;;;>>> -6276 var00 - */ -#endif - } // begins 804a00e @@ -964,19 +895,6 @@ var01++; -#ifdef adsfasdf - /* - 804a063: dd 80 5c 07 00 00 fldl 0x75c(%eax) // loads address into FL - 804a069: d9 bd b2 eb ff ff fnstcw 0xffffebb2(%ebp) ;;;;;;;;;;;>>> -5198 - 804a06f: 66 8b 95 b2 eb ff ff mov 0xffffebb2(%ebp),%dx ;;;;;;;;;;;>>> -5198 - 804a076: 66 81 ca 00 0c or $0xc00,%dx - 804a07b: 66 89 95 b0 eb ff ff mov %dx,0xffffebb0(%ebp) ;;;;;;;;;;;>>> -5200 - 804a082: d9 ad b0 eb ff ff fldcw 0xffffebb0(%ebp) ;;;;;;;;;;;>>> -5200 - 804a088: db 9d 78 e7 ff ff fistpl 0xffffe778(%ebp) ;;;;;;;;;;;>>> -6280 var01 - 804a08e: d9 ad b2 eb ff ff fldcw 0xffffebb2(%ebp) ;;;;;;;;;;;>>> -5198 - 804a094: ff 85 78 e7 ff ff incl 0xffffe778(%ebp) ;;;;;;;;;;;>>> -6280 var01 - */ -#endif } // Projection format for final panorama @@ -991,6 +909,11 @@ --tempString; /* nextWord does ++ before testing anything, this guarantess proper execution */ nextWord(output_file_format, &tempString); + if (strcmp(output_file_format, "TIFF_m") != 0) { + PrintError("No support for this image format (%s) falling back to TIFF_m", output_file_format); + } + + //New for PTMender...PTMender uses "cropped" TIFFs as its intermediate file //format for all processing. In contrast, PTStitcher used full-size TIFF //images for all intermediate processing. PTMender can still write "uncropped" @@ -1016,17 +939,9 @@ //croppedTIFFIntermediate determines if all intermediate processing is done //with cropped or full size TIFF. There probably isn't much of a reason //to ever disable this feature, other than for testing/debugging purposes. + croppedTIFFIntermediate = 1; - //If the output format is TIFF_m or TIFF_mask, croppedTIFFOutput controls - //whether the output files will be cropped or uncropped - croppedTIFFOutput = 0; - - //only use "cropped" output for TIFF_m or TIFF_mask if the includes r:CROP in p line - if (strstr(output_file_format, "TIFF_") != NULL - && strstr(panoName.name, "r:CROP") != NULL) - croppedTIFFOutput = 1; - transform.interpolator = prefs->interpolator; transform.gamma = prefs->gamma; @@ -1350,6 +1265,9 @@ if (image1.data != NULL) myfree((void **) image1.data); +#if 0 + // NO LONGER SUPPORTED IN THIS FUNCTION. IT SHOULD BE REMOVED IN THE FUTURE + // These functions are to correct and/or brightness. They are not required for // panoramas that do not need any brightness adjustments. Moreover, Dersch // was not fully satisfied with the quality of results obtained from @@ -1398,54 +1316,71 @@ //int getVRPanoOptions( VRPanoOptions *v, char *line ) getVRPanoOptions(&defaultVRPanoOptions, tempString); +#endif - //If we are dealing with an output format that is not TIFF_m or PSD_nomask, - //then we have to add "masks" to the images before finishing... - if (! ( - strcmp(output_file_format, "TIFF_m") == 0 - || - strcmp(output_file_format, "PSD_nomask") == 0 - ) - ) { - // There is no point in adding stitching masks for just one image - if (counterImageFiles > 1) { + // We have to add "masks" to the images before finishing... + if (ptQuietFlag == 0) + Progress(_initProgress, "Writing Output Images"); + + for (loopCounter = 0; loopCounter < counterImageFiles; loopCounter++) { + + if (ptQuietFlag == 0) { + sprintf(tmpStr, "%d", + (100 * loopCounter) / counterImageFiles); + if (Progress(_setProgress, tmpStr) == 0) { + return (1); + } + } + + strcpy(outputFileName, panoFileName->name); + sprintf(var40, "%04d", loopCounter); + strcat(outputFileName, var40); + panoReplaceExt(outputFileName, ".tif"); + rename(fullPathImages[loopCounter].name, outputFileName); + free(fullPathImages); - printf("Creating seams******************\n"); + if (ptQuietFlag == 0) { + Progress(_setProgress, "100%"); + Progress(_disposeProgress, ""); + } + + } + return (0); - if (panoStitchReplaceMasks(fullPathImages, fullPathImages, counterImageFiles, - feather) != 0) { - PrintError("Could not create stitching masks"); - goto mainError; - } + // FUNCTION ENDS HERE + + mainError: + return (-1); +} + + +#if 0 + + // THIS_CODE_IS_NO_LONGER_SUPPORTED. IT SHOULD BE REMOVED IN THE FUTURE + + if (counterImageFiles > 1) { + + // There is no point in adding stitching masks for just one image + //printf("Creating seams******************\n"); + + if (panoStitchReplaceMasks(fullPathImages, fullPathImages, counterImageFiles, + feather) != 0) { + PrintError("Could not create stitching masks"); + goto mainError; } } - /************ OUTPUT FORMATS: Multiple TIFF ***************/ + + + /************ OUTPUT FORMATS: Multiple TIFF ***************/ // TIFF_m and TIFF_mask...just rename the intermediate files // that we've already computed with numbers (e.g. img0000.tif, img0001.tif, etc.) // and we are finished processing. if (strcmp(output_file_format, "TIFF_m") == 0 || strcmp(output_file_format, "TIFF_mask") == 0) { - if (ptQuietFlag == 0) - Progress(_initProgress, "Writing Output Images"); - for (loopCounter = 0; loopCounter < counterImageFiles; loopCounter++) { - - if (ptQuietFlag == 0) { - sprintf(tmpStr, "%d", - (100 * loopCounter) / counterImageFiles); - if (Progress(_setProgress, tmpStr) == 0) { - return (1); - } - } - - strcpy(outputFileName, panoFileName->name); - sprintf(var40, "%04d", loopCounter); - strcat(outputFileName, var40); - panoReplaceExt(outputFileName, ".tif"); - if ((croppedTIFFIntermediate != 0 && croppedTIFFOutput != 0) || (croppedTIFFIntermediate == 0 && croppedTIFFOutput == 0)) { // if intermediate and output formats are the same, then just rename and quit @@ -1487,7 +1422,7 @@ // intermediate files into a layered photoshop document if (strcmp(output_file_format, "PSD_nomask") == 0 || strcmp(output_file_format, "PSD_mask") == 0 - ) { + ) { panoReplaceExt(panoFileName->name, ".psd"); if (panoCreatePSD(fullPathImages, counterImageFiles, panoFileName, 0) != 0) { @@ -1594,13 +1529,10 @@ PrintError("Panorama output format not supported: %s", output_file_format); +#endif - mainError: - return (-1); -} - /* * Because this function can be called with a directory name with a period * inside it (e.g. "c:\dir\another.dir\filewithoutextension") then we need to @@ -1612,7 +1544,7 @@ char *dot_pos = strrchr(filename, '.'); char *path_sep_win = strrchr(filename, '\\'); char *path_sep_unix = strrchr(filename, '/'); - char *path_sep = (path_sep_unix == NULL ? path_sep_win : path_sep_unix ); + char *path_sep = (path_sep_unix == NULL ? path_sep_win : path_sep_unix ); if (dot_pos != NULL && (path_sep == NULL || dot_pos>path_sep)) { strcpy(dot_pos, extension); Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/configure.ac 2006-10-26 23:43:55 UTC (rev 584) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre7], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre8], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/tests/ChangeLog =================================================================== --- trunk/libpano/tests/ChangeLog 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/tests/ChangeLog 2006-10-26 23:43:55 UTC (rev 584) @@ -1,3 +1,7 @@ +2006-10-26 dmg <dm...@uv...> + + * panoAutomateTest.pl: Disable all tests but tiff_m + 2006-10-24 dmg <dm...@uv...> * panoAutomateTest.pl: I have disabled PSD testing. The inclusing Modified: trunk/libpano/tests/panoAutomateTest.pl =================================================================== --- trunk/libpano/tests/panoAutomateTest.pl 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/tests/panoAutomateTest.pl 2006-10-26 23:43:55 UTC (rev 584) @@ -69,12 +69,12 @@ close IN; my %formats = ( - 'jpeg' => "JPEG q100 g01", # jpeg progressive scan - 'tiff_none' => "TIFF c:NONE", # simple tiff output - 'tiff_lzw' => "TIFF c:LZW", # simple tiff output - 'tiff_deflate' => "TIFF c:DEFLATE", # simple tiff output - 'tiff_m' => "TIFF_m", # - 'tiff_mask' => "TIFF_mask", +# 'jpeg' => "JPEG q100 g01", # jpeg progressive scan +# 'tiff_none' => "TIFF c:NONE", # simple tiff output +# 'tiff_lzw' => "TIFF c:LZW", # simple tiff output +# 'tiff_deflate' => "TIFF c:DEFLATE", # simple tiff output +# 'tiff_m' => "TIFF_m", # +# 'tiff_mask' => "TIFF_mask", 'tiff_m_cropped' => "TIFF_m r:CROP", # 'psd' => "PSD", # 'psd_nomask' => "PSD_nomask", Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-25 18:20:19 UTC (rev 583) +++ trunk/libpano/version.h 2006-10-26 23:43:55 UTC (rev 584) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre7 " +#define VERSION "2.8.5pre8 " #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-10-27 01:02:24
|
Revision: 586 http://svn.sourceforge.net/panotools/?rev=586&view=rev Author: dmg Date: 2006-10-26 18:02:17 -0700 (Thu, 26 Oct 2006) Log Message: ----------- 2006-10-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre9 * tiff.c (panoTiffGetImageProperties): Do not choke if LZW compressed TIFFs do not have a predictor field Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/configure.ac trunk/libpano/tests/simpleTiff16/temp.txt trunk/libpano/tiff.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-26 23:44:27 UTC (rev 585) +++ trunk/libpano/ChangeLog 2006-10-27 01:02:17 UTC (rev 586) @@ -1,5 +1,12 @@ 2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre9 + + * tiff.c (panoTiffGetImageProperties): Do not choke if LZW + compressed TIFFs do not have a predictor field + +2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre8 * PTcommon.c (panoCreatePanorama): Remove post-processing during Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-26 23:44:27 UTC (rev 585) +++ trunk/libpano/configure.ac 2006-10-27 01:02:17 UTC (rev 586) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre8], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre9], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/tests/simpleTiff16/temp.txt =================================================================== --- trunk/libpano/tests/simpleTiff16/temp.txt 2006-10-26 23:44:27 UTC (rev 585) +++ trunk/libpano/tests/simpleTiff16/temp.txt 2006-10-27 01:02:17 UTC (rev 586) @@ -1,6 +1,6 @@ # PTStitcher script, written by hugin -p f0 w60 h297 v22 n"TIFF c:NONE" +p f0 w60 h297 v22 n"TIFF_m r:CROP" m g1 i7 f0 # output image lines Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-10-26 23:44:27 UTC (rev 585) +++ trunk/libpano/tiff.c 2006-10-27 01:02:17 UTC (rev 586) @@ -921,12 +921,13 @@ goto error; if (metadata->compression.type == COMPRESSION_LZW) { - //predictor only exists in LZW compressed files - if (!TIFFGetField - (tiffFile, TIFFTAG_PREDICTOR, - &(metadata->compression.predictor))) { - goto error; - } + + // set default compression predictor + metadata->compression.predictor = 2; //horizontal differencing + + // unleess it comes in the file + TIFFGetField(tiffFile, TIFFTAG_PREDICTOR, + &(metadata->compression.predictor)); } metadata->bytesPerLine = TIFFScanlineSize(tiffFile); Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-26 23:44:27 UTC (rev 585) +++ trunk/libpano/version.h 2006-10-27 01:02:17 UTC (rev 586) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre8 " +#define VERSION "2.8.5pre9 " #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-10-27 05:44:33
|
Revision: 587 http://svn.sourceforge.net/panotools/?rev=587&view=rev Author: dmg Date: 2006-10-26 22:44:16 -0700 (Thu, 26 Oct 2006) Log Message: ----------- 2006-10-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre10 * TODO: Added file * tools/README.PTmender: Removed it (created equivalent in ./docs) * doc/PTmender.readme: Added file * doc/PTblender.readme: Added file * doc/PTremap.readme: Added file * tests/panoAutomateTest.pl: Updated it to use PTremap and not PTmender. * tools/PTblender.c (main): Removed flattening functionality. Improved command line handling * tools/Makefile.am, tools/PTroller.c: Added PTroller, and renaming back of PToptimize. * tools/PToptimize.c: Renamed PTestimate back to PToptimize. * tools/PTremap.c: Copied logic from PTmender to PTremap. Cleaned up logic and simplified handling of command line parameters. * PTcommon.c: Made some minor cosmetic fixes to progress report. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/configure.ac trunk/libpano/tests/panoAutomateTest.pl trunk/libpano/tools/Makefile.am trunk/libpano/tools/PTblender.c trunk/libpano/tools/PTmender.c trunk/libpano/version.h Added Paths: ----------- trunk/libpano/TODO trunk/libpano/doc/PTblender.readme trunk/libpano/doc/PTmender.readme trunk/libpano/doc/PTremap.readme trunk/libpano/tools/PToptimize.c trunk/libpano/tools/PTremap.c trunk/libpano/tools/PTroller.c Removed Paths: ------------- trunk/libpano/tools/PTestimate.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/ChangeLog 2006-10-27 05:44:16 UTC (rev 587) @@ -1,5 +1,34 @@ 2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre10 + + * TODO: Added file + + * tools/README.PTmender: Removed it (created equivalent in ./docs) + + * doc/PTmender.readme: Added file + + * doc/PTblender.readme: Added file + + * doc/PTremap.readme: Added file + + * tests/panoAutomateTest.pl: Updated it to use PTremap and not PTmender. + + * tools/PTblender.c (main): Removed flattening + functionality. Improved command line handling + + * tools/Makefile.am, tools/PTroller.c: Added PTroller, and + renaming back of PToptimize. + + * tools/PToptimize.c: Renamed PTestimate back to PToptimize. + + * tools/PTremap.c: Copied logic from PTmender to PTremap. Cleaned up logic + and simplified handling of command line parameters. + + * PTcommon.c: Made some minor cosmetic fixes to progress report. + +2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre9 * tiff.c (panoTiffGetImageProperties): Do not choke if LZW Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/PTcommon.c 2006-10-27 05:44:16 UTC (rev 587) @@ -816,7 +816,7 @@ goto mainError; } - panoTiffSetErrorHandler(); + panoTiffSetErrorHandler(); if ((regFile = fopen(tempScriptFile.name, "w")) == NULL) { PrintError("Could not open temporary Scriptfile"); @@ -862,6 +862,13 @@ // and maps the pixels in these input images into the output image(s) for (loopCounter = 0; loopCounter < counterImageFiles; loopCounter++) { + // TODO + + // the original PTstitcher logic is strange + + // It processes a lot of data more than once. This part should really be done once for all images + + currentImagePtr = &image1; // Read the next adjust line (contains yaw, pitch, roll and other information) @@ -909,8 +916,8 @@ --tempString; /* nextWord does ++ before testing anything, this guarantess proper execution */ nextWord(output_file_format, &tempString); - if (strcmp(output_file_format, "TIFF_m") != 0) { - PrintError("No support for this image format (%s) falling back to TIFF_m", output_file_format); + if (loopCounter == 0 && strcmp(output_file_format, "TIFF_m") != 0) { + PrintError("No support for this image format (%s). Falling back to TIFF_m", output_file_format); } @@ -1340,12 +1347,14 @@ rename(fullPathImages[loopCounter].name, outputFileName); free(fullPathImages); - if (ptQuietFlag == 0) { - Progress(_setProgress, "100%"); - Progress(_disposeProgress, ""); - } } + if (ptQuietFlag == 0) { + Progress(_setProgress, "100%"); + Progress(_disposeProgress, ""); + } + + return (0); // FUNCTION ENDS HERE Added: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO (rev 0) +++ trunk/libpano/TODO 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,105 @@ + +This file documents the activities required before we release version +3.0.0 of the library. + +---------------------------------------------------------------------- +PTmap: + +PTmap should be a lightweight, simple stitching program and nothing +else. That means it will only do mapping of the panoramas. In terms of +the old PTsticher scripts it means it will only create TIFF_m, +cropped, no colour correction. It will be up to the caller application +to take these files and create the desired output (apply colour +correction, cropping, uncropping, conversion to other formats). + +This will simplify testing, and improve stability. + + +TODO: + + - Rename PTmender to PTremap + +DESIRABLE FEATURES: + + - Insert script into the TIFF comment field. + + - Cleanup command line options, and add a -h option + + - Process fisheye lenses. + + - If somebody wants full compatibility with PTstitcher, a new program + can be added that does all the work. It will be a "superset" of many + of the current pano tools. + + ---------------------------------------------------------------------- + + PTblender: + + It will split into 2 programs: + + - PTblender. It will do colour correction _only_. + + - PTroller. It will flatten an image. It will take a set of TIFFs and + create only one TIFF + + DESIRABLE: + + - (PTblender) Create photoshop curves and maps for HSV colour + corrections + + - (PTblender) Ignore areas with mask != 255 during computation of the + curves, but transform them if mask > 0 + + - (PTroller) Add the ability to stack and add composing images. + + + ---------------------------------------------------------------------- + PTuncrop: + + - No major changes, except that it will support images without full + size tags. + + TODO: + + - Add support for images without full size tags --this will affect all + panotools) and make sure all tools are compatible with TIFFs output + by nona and fulla. + + ---------------------------------------------------------------------- + + PTtiff2psd: + + TODO: + + - Nothing + + DESIRABLE: + + - Specify blending mode for layers + + ---------------------------------------------------------------------- + PTestimate (old PToptimizer) + + TODO: + + - Nothing + + ---------------------------------------------------------------------- + + DESIRABLE new tools: + + PTcrop: + + - Two options: crop to bounding rectangle, and crop to inner rectangle + (I think that were the names Pablo gave them). + + + + ---------------------------------------------------------------------- + LONGER TERM: + + * Allow tools to read their parameters from the PTstitcher script. + + * Add support to all the tools for 16 bit, and 32 bit images (it is + kind of mixed at this point) + Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/configure.ac 2006-10-27 05:44:16 UTC (rev 587) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre9], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre10], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Added: trunk/libpano/doc/PTblender.readme =================================================================== --- trunk/libpano/doc/PTblender.readme (rev 0) +++ trunk/libpano/doc/PTblender.readme 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,100 @@ + +RGB mode: +-------- +k type correction (color): I fixed minor rounding errors that should +reduce the error. The change might not be very noticeable in most +cases. + +HSV mode: +-------- + +b type correction (brightness): Fully supported and seems to work +well and better thar k type. + +d type correction (saturation): In PTstitcher d is used for Hue and +Saturation but I have decided to use it only for Saturation. The +reason is that in highly saturated areas (such as polarized photos) +this shifts completely the colours (from blue to green, in my +tests). Saturation seems to work well instead. + +Other types of correction (H and S, H only might be added to PTblender +when I find out how to add new keywords to the parser). + +USING Colour Correction +---------------------------------------------------------------------- + +I think it is important to understand the way colour is corrected in +PTmender (and PTblender) and how it is different from enblend +(PTblender can be used as a "replacement" for enblend to fix colour +differences). Let us assume 2 images: + +* Enblend (as its name implies) smooths transitions between the +2 images, and leaves the rest of the image unaltered (this might +result in strong banding). + +* PTblender, on the other hand changes the entire second image so that +the histograms of the areas of overlap of both images are as close +as possible to each other + +PTblender fails miserably in the following three situations: + +1. When the areas of overlap are very different in content. Because it +assumes the histograms should be as close to each other as possible +you really need images that overlap well (and have few or no +ghosts). + +2. When the lens has strong vignetting. Same reason. Usually images +overlap in the area of vignetting. Please use software to correct +vignetting before using PTblender. In fact, experiment with and +without it to notice the (big) difference. + +3. When the chain of correction is large. In PTblender you select an +"anchor" image, that is, the one that is not to be corrected. We +will call this the corrected area. + +The algorithm finds the to-be-correted image with the largest +overlap to the corrected area. It then corrects it and adds it to +the area of overlap. This happens recursively until no more images +are corrected. + +The farther "away" an image (in terms of the chain-of-correction) +is from the anchor, the bigger the potential for error. + +As Helmut once explained, if you have a "cap" image (a zenith), it +can help to reduce the length of the largest chain-of-correction. + + +So, when is PTblender useful. These are some examples: + +* Panoramas with few images + +* Images with very strong changes in brightness (automatic exposure, +for example) + +* Panoramas to be displayed flat (no need to blend around the edges) + + +My recommendations on how to use PTblender: + +* FIX vignetting before you map the images (use fulla for it, or +photoshop) + +* Experiment with the 3 outputs (RGB, saturation, intensity). + +* Choose an anchor in such a way that it minimizes the +chain-of-correction. ( experiment with different anchors) + +* Experiment with using the 3 types of outputs plus uncorrected as 4 +different layers in photoshop and mask/unmask areas as you see +fit. This might prove to be very useful (similar to enblend). + + +Another option is to use enblend and PTblender in the same pano, each +dealing with different types of corrections. I have not tried this +myself. PTblender accept TIFFs with alpha channel and can output TIFFs +or PSDs. + +There is lots of room for improvement in colour correction, but at the +very least we (panotools) are now where Helmut left it (approx 5 year +ago). + Added: trunk/libpano/doc/PTmender.readme =================================================================== --- trunk/libpano/doc/PTmender.readme (rev 0) +++ trunk/libpano/doc/PTmender.readme 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1 @@ +PTmender is being deprecated. Please use PTremap Added: trunk/libpano/doc/PTremap.readme =================================================================== --- trunk/libpano/doc/PTremap.readme (rev 0) +++ trunk/libpano/doc/PTremap.readme 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,29 @@ +PTremap +-------- + +This is a program that implements the mapping of panoramas similar to +PTStitcher + +---------------------------------------------------------------------- +WHAT IS NOT GOING TO BE SUPPORTED + + +* PTremap only preforms the remapping of the input images and creates + a set of cropped TIFFs, one for each input image. + +* It does NOT create any other type of output and it does not flatten the output. + + +---------------------------------------------------------------------- + +COMMAND LINE OPTIONS + +PTremap [options] <script filename> + +Options: + -o <prefix> Prefix for output filename, defaults to pano + -q Quiet run + -h Show this mes + +---------------------------------------------------------------------- + Modified: trunk/libpano/tests/panoAutomateTest.pl =================================================================== --- trunk/libpano/tests/panoAutomateTest.pl 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/tests/panoAutomateTest.pl 2006-10-27 05:44:16 UTC (rev 587) @@ -13,7 +13,7 @@ \n " if scalar(@ARGV) < 1; -my $stitcher = '../../tools/PTmender'; +my $stitcher = '../../tools/PTremap'; #my $stitcher = '/usr/local/bin/PTmender'; $, = ' '; @@ -157,7 +157,7 @@ print "Creating panorama.. please wait\n"; - system ($stitcher, '-o', 'output' , "-f", 'temp.txt'); + system ($stitcher, '-o', 'output' , 'temp.txt'); if ($type =~ "tiff_m") { Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/tools/Makefile.am 2006-10-27 05:44:16 UTC (rev 587) @@ -35,11 +35,18 @@ AM_CPPFLAGS = $(JAVA_FLAGS) $(LIN_DEFS) $(DAR_DEFS) $(TIFF_FLAGS) $(JPEG_FLAGS) AM_LDFLAGS = -L${top_builddir} -bin_PROGRAMS = panoinfo PTestimate PTmender PTblender PTtiff2psd PTuncrop PTtiffdump +bin_PROGRAMS = panoinfo PToptimize PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTremap PTblender_SOURCES = PTblender.c PTblender_LDADD = -l${PANOLIB} -ltiff +PTremap_SOURCES = PTremap.c +PTremap_LDADD = -l${PANOLIB} -ltiff + + +PTroller_SOURCES = PTroller.c +PTroller_LDADD = -l${PANOLIB} -ltiff + PTmender_SOURCES = PTmender.c PTmender.h PTmender_LDADD = -l${PANOLIB} -ljpeg -ltiff @@ -53,8 +60,8 @@ PTtiffdump_LDADD = -l${PANOLIB} -ljpeg -ltiff -PTestimate_SOURCES = PTestimate.c -PTestimate_LDADD = -l${PANOLIB} +PToptimize_SOURCES = PToptimize.c +PToptimize_LDADD = -l${PANOLIB} panoinfo_SOURCES = $(WIN_SRC) $(LIN_SRC) $(DAR_SRC) panoinfo_LDADD = -l${PANOLIB} Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/tools/PTblender.c 2006-10-27 05:44:16 UTC (rev 587) @@ -47,12 +47,12 @@ #define PT_BLENDER_USAGE "PTblender [options] <tiffFiles>+\n\n"\ "Options:\n"\ "\t-o <prefix>\tPrefix for output filename\n"\ - "\t-k <index>\tIndex to image to use as a reference (0-based)\n"\ + "\t-k <index>\tIndex to image to use as a reference (0-based, defaults to 0)\n"\ "\t-t [0,1,2]\tType of colour correction: 0 full (default), 1 brightness only, 2 colour only\n"\ - "\t-f <filename>\t\tFlatten images to single TIFF file\n"\ - "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ - "\t-c\t\tOutput curves smooth\t\t(Output a photoshop curve per each corrected file)\n"\ - "\t-m\t\tOutput curves arbitrary map\t(Output a photoshop curve per each corrected file)\n"\ + "\t-q\t\tQuiet run\n"\ + "\t-h\t\tShow this message\n"\ + "\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"\ "\n" #define PT_BLENDER_VERSION "PTblender Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" @@ -62,222 +62,169 @@ int main(int argc,char *argv[]) { - char opt; - int referenceImage = -1; - fullPath *ptrInputFiles; - fullPath *ptrOutputFiles; + char opt; + int referenceImage = 0; + fullPath *ptrInputFiles; + fullPath *ptrOutputFiles; - int counter; - char outputPrefix[MAX_PATH_LENGTH]; - char flatOutputFileName[MAX_PATH_LENGTH]; - char *endPtr; - int filesCount; - char tempString[MAX_PATH_LENGTH]; - int i; - int base = 0; - int flattenFlag =0; - int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) - int typeCorrection = 0; - int ptComputeSeams = 0; + int counter; + char outputPrefix[MAX_PATH_LENGTH]; + char *endPtr; + int filesCount; + char tempString[MAX_PATH_LENGTH]; + int i; + int base = 0; + int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) + int typeCorrection = 0; + int ptComputeSeams = 0; - ptrInputFiles = NULL; + ptrInputFiles = NULL; - counter = 0; + counter = 0; - printf(PT_BLENDER_VERSION); + printf(PT_BLENDER_VERSION); - strcpy(outputPrefix, "corrected%4d"); + strcpy(outputPrefix, "corrected%4d"); - while ((opt = getopt(argc, argv, "o:k:t:hf:sqcm")) != -1) { + while ((opt = getopt(argc, argv, "o:k:t:hf:sqcm")) != -1) { -// o and f -> set output file -// h -> help -// q -> quiet? -// k -> base image, defaults to first + // o and f -> set output file + // h -> help + // q -> quiet? + // k -> base image, defaults to first - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'o': - if (strlen(optarg) < MAX_PATH_LENGTH) { - strcpy(outputPrefix, optarg); - } else { - PrintError("Illegal length for output prefix"); - } - break; - case 'k': - referenceImage = strtol(optarg, &endPtr, 10); - if (errno != 0) { - PrintError("Invalid integer in -k option"); - return -1; - } - break; - case 't': - typeCorrection = strtol(optarg, &endPtr, 10); - if (errno != 0 || (typeCorrection < 0 || typeCorrection > 2)) { - PrintError("Invalid integer in -t option"); - return -1; - } - break; - case 'f': - if (outputCurvesType) { - PrintError("Option -f can't be used with option -c or -m"); - return -1; - } - flattenFlag = 1; - if (strlen(optarg) < MAX_PATH_LENGTH) { - strcpy(flatOutputFileName, optarg); - } else { - PrintError("Illegal length for flat output prefix"); - } - break; - - break; - case 's': - ptComputeSeams = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - case 'c': - if (outputCurvesType == CB_OUTPUT_CURVE_ARBITRARY) { - PrintError("Can't use both -c and -m options"); - return -1; - } - if (flattenFlag) { - PrintError("Option -c can't be used with option -f"); - return -1; - } - outputCurvesType = CB_OUTPUT_CURVE_SMOOTH; - break; - case 'm': - if (outputCurvesType == CB_OUTPUT_CURVE_SMOOTH) { - PrintError("Can't use both -c and -m options"); - return -1; - } - if (flattenFlag) { - PrintError("Option -m can't be used with option -f"); - return -1; - } - outputCurvesType = CB_OUTPUT_CURVE_ARBITRARY; - break; - case 'h': - printf(PT_BLENDER_USAGE); - exit(0); - default: - break; + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'o': + if (strlen(optarg) < MAX_PATH_LENGTH) { + strcpy(outputPrefix, optarg); + } else { + PrintError("Illegal length for output prefix"); + } + break; + case 'k': + referenceImage = strtol(optarg, &endPtr, 10); + if (errno != 0) { + PrintError("Invalid integer in -k option"); + return -1; + } + break; + case 't': + typeCorrection = strtol(optarg, &endPtr, 10); + if (errno != 0 || (typeCorrection < 0 || typeCorrection > 2)) { + PrintError("Invalid integer in -t option"); + return -1; + } + break; + case 's': + ptComputeSeams = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + case 'c': + if (outputCurvesType == CB_OUTPUT_CURVE_ARBITRARY) { + PrintError("Can't use both -c and -m options"); + return -1; + } + outputCurvesType = CB_OUTPUT_CURVE_SMOOTH; + break; + case 'm': + if (outputCurvesType == CB_OUTPUT_CURVE_SMOOTH) { + PrintError("Can't use both -c and -m options"); + return -1; + } + outputCurvesType = CB_OUTPUT_CURVE_ARBITRARY; + break; + case 'h': + printf(PT_BLENDER_USAGE); + exit(0); + default: + break; + } } - } - filesCount = argc - optind; + filesCount = argc - optind; - if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || - (ptrOutputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { - PrintError("Not enough memory"); - return -1; - } + if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || + (ptrOutputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { + PrintError("Not enough memory"); + return -1; + } - base = optind; - for (; optind < argc; optind++) { - char *currentParm; + base = optind; + for (; optind < argc; optind++) { + char *currentParm; - currentParm = argv[optind]; + currentParm = argv[optind]; - if (StringtoFullPath(&ptrInputFiles[optind-base], currentParm) !=0) { // success - PrintError("Syntax error: Not a valid pathname"); - return(-1); + if (StringtoFullPath(&ptrInputFiles[optind-base], currentParm) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } } - } - if (filesCount <= 0) { - PrintError("No files specified in the command line"); - fprintf(stderr, PT_BLENDER_USAGE); - return -1; - } + if (filesCount <= 0) { + PrintError("No files specified in the command line"); + fprintf(stderr, PT_BLENDER_USAGE); + return -1; + } - if (referenceImage <-1 || referenceImage >= filesCount) { - sprintf(tempString, "Illegal reference image number %d. It should be between 0 and %d\n", - referenceImage, filesCount-1); - PrintError(tempString); - return -1; - } + if (referenceImage < 0 || referenceImage >= filesCount) { + sprintf(tempString, "Illegal reference image number %d. It should be between 0 and %d\n", + referenceImage, filesCount-1); + PrintError(tempString); + return -1; + } - - if (outputCurvesType != 0 || typeCorrection != 0) { - // The user wants colour correction, so let us given them colour correction - if (referenceImage == -1) { - referenceImage = 0; - printf("No reference image specified. Assuming image 0 as reference\n"); + //We can't output curves for type 1 or 2 corrections + if (outputCurvesType != 0) { + if (typeCorrection!= 0) { + PrintError("Output of curves is not supported for correction type %d", typeCorrection); + return -1; + } } - } - // Create output filename + // Create output filename - if (strchr(outputPrefix, '%') == NULL) { - strcat(outputPrefix, DEFAULT_PREFIX_NUMBER_FORMAT); - } + if (strchr(outputPrefix, '%') == NULL) { + strcat(outputPrefix, DEFAULT_PREFIX_NUMBER_FORMAT); + } - for (i =0; i< filesCount ; i++) { - char outputFilename[MAX_PATH_LENGTH]; + for (i =0; i< filesCount ; i++) { + char outputFilename[MAX_PATH_LENGTH]; - sprintf(outputFilename, outputPrefix, i); + sprintf(outputFilename, outputPrefix, i); - // Verify the filename is different from the prefix - if (strcmp(outputFilename, outputPrefix) == 0) { - PrintError("Invalid output prefix. It does not generate unique filenames."); - return -1; + // Verify the filename is different from the prefix + if (strcmp(outputFilename, outputPrefix) == 0) { + PrintError("Invalid output prefix. It does not generate unique filenames."); + return -1; + } + + if (StringtoFullPath(&ptrOutputFiles[i], outputFilename) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + panoReplaceExt(ptrOutputFiles[i].name, ".tif"); + + // fprintf(stderr, "Output filename [%s]\n", ptrOutputFiles[i].name); } - if (StringtoFullPath(&ptrOutputFiles[i], outputFilename) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); + if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("TIFFs are not compatible"); + return -1; } - panoReplaceExt(ptrOutputFiles[i].name, ".tif"); - - // fprintf(stderr, "Output filename [%s]\n", ptrOutputFiles[i].name); - } - if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { - PrintError("TIFFs are not compatible"); - return -1; - } + if (! ptQuietFlag) printf("Colour correcting photo using %d as a base type %d\n", referenceImage, typeCorrection); - if (referenceImage >= 0) { - printf("Colour correcting photo using %d as a base type %d\n", referenceImage, typeCorrection); ColourBrightness(ptrInputFiles, ptrOutputFiles, filesCount, referenceImage, typeCorrection, outputCurvesType); + free(ptrInputFiles); ptrInputFiles = ptrOutputFiles; ptrOutputFiles = NULL; - } - if (flattenFlag) { - - fullPath pathName; - - printf("Flattening image\n"); - - printf("Computing seams for %d files\n", filesCount); - if (panoStitchReplaceMasks(ptrInputFiles, ptrInputFiles, filesCount, - 0) != 0) { - PrintError("Could not create stitching masks"); - return -1; - } - - if (StringtoFullPath(&pathName, flatOutputFileName) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - panoReplaceExt(pathName.name, ".tif"); - - if (!panoFlattenTIFF(ptrInputFiles, filesCount, &pathName, FALSE)) { - PrintError("Error while flattening TIFF-image"); - return -1; - } - } - - if (ptrInputFiles) free(ptrInputFiles); - if (ptrOutputFiles) free(ptrOutputFiles); - - return 0; + return 0; } Deleted: trunk/libpano/tools/PTestimate.c =================================================================== --- trunk/libpano/tools/PTestimate.c 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/tools/PTestimate.c 2006-10-27 05:44:16 UTC (rev 587) @@ -1,91 +0,0 @@ -/* - * Clone of PTOptimizer - * - * Based on code found in Helmut Dersch's panorama-tools - * - * Dec 2003 - * - * Bruno Postle <bruno at postle.net> - * - * 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 - * - */ - -// gcc -oPTOptimizer -I/usr/include/pano12 -lpano12 PTOptimizer.c - - -#include "filter.h" -#include <stdio.h> - -#define PT_OPTIMIZER_VERSION "PTOptimizer Version " VERSION ", written by Helmut Dersch\n" - - -//static AlignInfo *g; -int CheckParams( AlignInfo *g ); - -int main(int argc,char *argv[]) -{ - aPrefs aP; - - char* script; - OptInfo opt; - AlignInfo ainf; - - fullPath infile; - //fullPath outfile; - - // - - SetAdjustDefaults(&aP); - - if(argc != 2) - { - printf(PT_OPTIMIZER_VERSION); - printf("Usage: %s /path/to/script.txt\n", argv[0]); - exit(1); - } - - StringtoFullPath(&infile, argv[1]); - - script = LoadScript( &infile ); - if( script != NULL ) - { - if (ParseScript( script, &ainf ) == 0) - { - if( CheckParams( &ainf ) == 0 ) - { - ainf.fcn = fcnPano; - - SetGlobalPtr( &ainf ); - - opt.numVars = ainf.numParam; - opt.numData = ainf.numPts; - opt.SetVarsToX = SetLMParams; - opt.SetXToVars = SetAlignParams; - opt.fcn = ainf.fcn; - *opt.message = 0; - - RunLMOptimizer( &opt ); - ainf.data = opt.message; - WriteResults( script, &infile, &ainf, distSquared, 0); - exit(0); - } - DisposeAlignInfo( &ainf ); - } - free( script ); - } - exit(1); -} - Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/tools/PTmender.c 2006-10-27 05:44:16 UTC (rev 587) @@ -278,6 +278,10 @@ strcpy(ptrImageFileNames[ebx].name, ""); InsertFileName(&ptrImageFileNames[ebx], alignInfo.im[ebx].name); + if (ptDebug) { + fprintf(stderr, "Input image %d [%s]\n", ebx, ptrImageFileNames[ebx].name); + } + } // for (ebx = 0; ebx < counter; ebx ++) }// if (counter != 0) @@ -300,6 +304,10 @@ //an "o" line represents an input image counter = numLines(script, 'o'); + if (ptDebug) { + fprintf(stderr, "Processing %d counter images\n", counter); + } + if (counter == 0) { PrintError("No Input Images"); exit(1); @@ -371,6 +379,10 @@ } + if (ptDebug) { + fprintf(stderr, "Processing %d counter images\n", counter); + } + // 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. Copied: trunk/libpano/tools/PToptimize.c (from rev 582, trunk/libpano/tools/PTestimate.c) =================================================================== --- trunk/libpano/tools/PToptimize.c (rev 0) +++ trunk/libpano/tools/PToptimize.c 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,91 @@ +/* + * Clone of PTOptimizer + * + * Based on code found in Helmut Dersch's panorama-tools + * + * Dec 2003 + * + * Bruno Postle <bruno at postle.net> + * + * 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 + * + */ + +// gcc -oPTOptimizer -I/usr/include/pano12 -lpano12 PTOptimizer.c + + +#include "filter.h" +#include <stdio.h> + +#define PT_OPTIMIZER_VERSION "PTOptimizer Version " VERSION ", written by Helmut Dersch\n" + + +//static AlignInfo *g; +int CheckParams( AlignInfo *g ); + +int main(int argc,char *argv[]) +{ + aPrefs aP; + + char* script; + OptInfo opt; + AlignInfo ainf; + + fullPath infile; + //fullPath outfile; + + // + + SetAdjustDefaults(&aP); + + if(argc != 2) + { + printf(PT_OPTIMIZER_VERSION); + printf("Usage: %s /path/to/script.txt\n", argv[0]); + exit(1); + } + + StringtoFullPath(&infile, argv[1]); + + script = LoadScript( &infile ); + if( script != NULL ) + { + if (ParseScript( script, &ainf ) == 0) + { + if( CheckParams( &ainf ) == 0 ) + { + ainf.fcn = fcnPano; + + SetGlobalPtr( &ainf ); + + opt.numVars = ainf.numParam; + opt.numData = ainf.numPts; + opt.SetVarsToX = SetLMParams; + opt.SetXToVars = SetAlignParams; + opt.fcn = ainf.fcn; + *opt.message = 0; + + RunLMOptimizer( &opt ); + ainf.data = opt.message; + WriteResults( script, &infile, &ainf, distSquared, 0); + exit(0); + } + DisposeAlignInfo( &ainf ); + } + free( script ); + } + exit(1); +} + Added: trunk/libpano/tools/PTremap.c =================================================================== --- trunk/libpano/tools/PTremap.c (rev 0) +++ trunk/libpano/tools/PTremap.c 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,286 @@ +/* + * PTremap + * + * Based on the program PTStitcher by Helmut Dersch. + * + * It is intended to duplicate the functionality of original program + * + * Dec 2005 + * + * 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 + * + */ + + +// TODO +// Create_Panorama requires some floating point assembly to be interpreted + +#define __DEBUG__ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <dirent.h> +#include <unistd.h> + +#include "tiffio.h" +#include "filter.h" +#include "panorama.h" + +#include "PTcommon.h" +#include "file.h" + + +// Global variables for the program + + +int ptDebug = 0; + +#define DEFAULT_OUTPUT_NAME "pano" + +#define PT_REMAP_VERSION "PTremap Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel German\n" + +#define PT_REMAP_USAGE "PTremap [options] <script filename>\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"\ + "\n" + + +int hasPathInfo(char *aName); + + +static void panoRemapDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) +{ + FILE* scriptFD; + int temp; + + strcpy(scriptPathName->name, scriptFileName); + + // Get a temp filename for the copy of the script + if (panoFileMakeTemp(scriptPathName) == 0) { + PrintError("Could not make Tempfile"); + exit(1); + } + + // Copy the script + if ((scriptFD = fopen(scriptPathName->name, "w")) == NULL) { + PrintError("Could not open temporary Scriptfile"); + exit(1); + } + + temp = fwrite(script, 1, strlen(script), scriptFD); + + if (strlen(script) != temp) { + PrintError("Could not write temporary Scriptfile"); + exit(1); + } + + fclose(scriptFD); + +} + + + +int main(int argc,char *argv[]) +{ + char *script; + int counter; + fullPath *ptrImageFileNames; + AlignInfo alignInfo; + fullPath scriptFileName; + fullPath panoFileName; + int i; + + char opt; + + ptrImageFileNames = NULL; + counter = 0; + strcpy(panoFileName.name, DEFAULT_OUTPUT_NAME); + strcpy(scriptFileName.name, ""); + + printf(PT_REMAP_VERSION); + + while ((opt = getopt(argc, argv, "o:f:hsqd")) != -1) { + + // o -> set output file + // h -> help? + // q -> quiet? + + switch(opt) { + + case 'o': // specifies output file name + if (StringtoFullPath(&panoFileName, optarg) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + break; + + case 'd': + ptDebug = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + + case 'h': + PrintError(PT_REMAP_USAGE); + return -1; + + default: + break; + } + } + + if (optind != argc - 1) { + PrintError(PT_REMAP_USAGE); + return -1; + } + + if (StringtoFullPath(&scriptFileName, argv[optind]) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + PrintError(PT_REMAP_USAGE); + return(-1); + } + + // Check if we got a filename + if (strlen(scriptFileName.name) == 0) { + PrintError("No script name provided\n"); + PrintError(PT_REMAP_USAGE); + return -1; + + } // end of if (scriptFileName[0] != 0) { + + // Prompt user to specify output filename if not set via command line + if (strlen(panoFileName.name) == 0) { + PrintError("No output filename specified\n"); + PrintError(PT_REMAP_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); + } + + 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) { + 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; + panoRemapDuplicateScriptFile(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. + return panoCreatePanorama(ptrImageFileNames, counter, &panoFileName, &scriptFileName); + +} + + +////////////////////////////////////////////////////////////////////// + +char* Filename(fullPath* path) +{ + char *temp; + if ((temp = strrchr(path->name, '/')) != NULL) { + temp++; + } else { + temp = path->name; + } + return temp; +} + + +int hasPathInfo(char *aName) +{ + return ((strchr(aName, PATH_SEP) == NULL) ? 0 : 1); +} Added: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c (rev 0) +++ trunk/libpano/tools/PTroller.c 2006-10-27 05:44:16 UTC (rev 587) @@ -0,0 +1,176 @@ +/* + * PTroller $id$ + * + * Based on the program PTStitcher by Helmut Dersch. + * + * Flattens a set of TIFFs into one TIFF + * + * Jan 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" + + +#define PT_ROLLER_USAGE "PTroller [options] <tiffFiles>+\n\n"\ + "Options:\n"\ + "\t-o <filename>\tOutput filename (defaults to merged.tif)\n"\ + "\t-s\t\tCompute stitching seams (default not)\n"\ + "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ + "\n" + +#define PT_ROLLER_VERSION "PTroller Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" + +#define DEFAULT_FILENAME "merged.tif" + +int main(int argc,char *argv[]) +{ + char opt; + int referenceImage = -1; + fullPath *ptrInputFiles; + fullPath *ptrOutputFiles; + + int counter; + char flatOutputFileName[MAX_PATH_LENGTH]; + char *endPtr; + int filesCount; + char tempString[MAX_PATH_LENGTH]; + int i; + int base = 0; + int flattenFlag =0; + int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) + int typeCorrection = 0; + int ptComputeSeams = 0; + fullPath pathName; + + ptrInputFiles = NULL; + + counter = 0; + + printf(PT_ROLLER_VERSION); + + strcpy(flatOutputFileName, DEFAULT_FILENAME); + + while ((opt = getopt(argc, argv, "o:hqs")) != -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 's': + ptComputeSeams = 1; + break; + case 'o': + if (strlen(optarg) < MAX_PATH_LENGTH) { + strcpy(flatOutputFileName, optarg); + } else { + PrintError("Illegal length for output filename"); + } + break; + case 't': + typeCorrection = strtol(optarg, &endPtr, 10); + if (errno != 0 || (typeCorrection < 0 || typeCorrection > 2)) { + PrintError("Invalid integer in -t option"); + return -1; + } + break; + case 'q': + ptQuietFlag = 1; + break; + case 'h': + printf(PT_ROLLER_USAGE); + exit(0); + default: + break; + } + } + + filesCount = argc - optind; + + if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL || + (ptrOutputFiles = 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); + } + } + + if (filesCount <= 0) { + PrintError("No files specified in the command line"); + fprintf(stderr, PT_ROLLER_USAGE); + return -1; + } + + if (! ptQuietFlag) printf("Flattening image\n"); + + if (ptComputeSeams) { + + if (! ptQuietFlag) printf("Computing seams for %d files\n", filesCount); + + if (panoStitchReplaceMasks(ptrInputFiles, ptrInputFiles, filesCount, + 0) != 0) { + PrintError("Could not create stitching masks"); + return -1; + } + } + if (StringtoFullPath(&pathName, flatOutputFileName) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + panoReplaceExt(pathName.name, ".tif"); + + if (!panoFlattenTIFF(ptrInputFiles, filesCount, &pathName, FALSE)) { + PrintError("Error while flattening TIFF-image"); + return -1; + } + + if (ptrInputFiles) free(ptrInputFiles); + if (ptrOutputFiles) free(ptrOutputFiles); + + return 0; + +} + Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-27 01:02:17 UTC (rev 586) +++ trunk/libpano/version.h 2006-10-27 05:44:16 UTC (rev 587) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre9 " +#define VERSION "2.8.5pre10 " #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-10-27 06:34:57
|
Revision: 588 http://svn.sourceforge.net/panotools/?rev=588&view=rev Author: dmg Date: 2006-10-26 23:34:41 -0700 (Thu, 26 Oct 2006) Log Message: ----------- 2006-10-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre11 * Support for cropped images that do not contain full size. We assume the full size = croppped size + offset * tools/PTtiffdump.c: Cleaned up compilation errors. * tiff.c, PTcommon.c (panoTiffUnCrop): Moved function from PTcommon.c, renamed it. * TODO: Updates to reflect current status. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/TODO trunk/libpano/pttiff.h trunk/libpano/tiff.c trunk/libpano/tools/PTtiffdump.c trunk/libpano/tools/PTuncrop.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/ChangeLog 2006-10-27 06:34:41 UTC (rev 588) @@ -1,5 +1,19 @@ 2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre11 + + * Support for cropped images that do not contain full size. We + assume the full size = croppped size + offset + + * tools/PTtiffdump.c: Cleaned up compilation errors. + + * tiff.c, PTcommon.c (panoTiffUnCrop): Moved function from + PTcommon.c, renamed it. + + * TODO: Updates to reflect current status. + +2006-10-26 dmg <dm...@uv...> + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre10 * TODO: Added file Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/PTcommon.c 2006-10-27 06:34:41 UTC (rev 588) @@ -68,110 +68,7 @@ strcpy(c, fname); } -/** - * Reads inputFile and "uncrops" the image by adding black space to pad - * image to its full size, saving the result as outputFile. If an error - * is encountered messageBuffer is filled with the message, and a non-zero - * value is returned. If success, zero is returned - */ -int panoUnCropTiff(char *inputFile, char *outputFile) -{ - pano_CropInfo *inputCropInfo = NULL; - char *buffer = NULL; - char *offsetInBuffer; - int inputRow, outputRow; - pano_Tiff *tiffInput = NULL; - pano_Tiff *tiffOutput = NULL; - pano_ImageMetadata *metadata = NULL; - - if ((tiffInput = panoTiffOpen(inputFile)) == NULL) { - PrintError("Unable to open input file"); - goto error; - } - - if (!panoTiffIsCropped(tiffInput)) { - PrintError("Source image is not a cropped tiff"); - goto error; - } - - inputCropInfo = &tiffInput->metadata.cropInfo; - - if ((tiffOutput = - panoTiffCreateUnCropped(outputFile, &tiffInput->metadata)) == NULL) { - PrintError("Unable to create output file [%s]", outputFile); - goto error; - } - - metadata = &tiffOutput->metadata; - //printf("***Size of line %d\n", metadata->bytesPerLine); - - // Allocate buffer for line - buffer = calloc(metadata->bytesPerLine, 1); - - if (buffer == NULL) { - PrintError("Unable to allocate memory for IO buffer"); - goto error; - } - - inputRow = 0; - // The crop data has to be placed inside the buffer according to the - // cropinfo offset - - offsetInBuffer = - buffer + inputCropInfo->xOffset * metadata->bytesPerPixel; - - assert(metadata->imageHeight > 0); - // Read one line at a time and transfer to output file - for (outputRow = 0; outputRow < metadata->imageHeight; outputRow++) { - - //fill empty buffer with empty space (zeros) - bzero(buffer, metadata->bytesPerLine); - - //if inside ROI then read from input file - if (panoROIRowInside(inputCropInfo, outputRow)) { - - if (TIFFReadScanline(tiffInput->tiff, offsetInBuffer, inputRow, 0) - != 1) { - PrintError("Unable to read scanline %d", inputRow); - goto error; - } - inputRow++; - } - - //write buffer to outputfile - if (TIFFWriteScanline(tiffOutput->tiff, buffer, outputRow, 0) != 1) { - PrintError("Unable to write scanline %d", outputRow); - goto error; - } - - } - - //printf("Finished\n"); - - free(buffer); - panoTiffClose(tiffInput); - panoTiffClose(tiffOutput); - - return 1; - - error: - // Error handler - // Make sure we release any resources we have - - if (buffer != NULL) - free(buffer); - - if (tiffOutput != NULL) - panoTiffClose(tiffOutput); - - if (tiffInput != NULL) - panoTiffClose(tiffInput); - - - return 0; -} - int panoCreatePSD(fullPath * fullPathImages, int numberImages, fullPath * outputFileName, int stacked) { Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/TODO 2006-10-27 06:34:41 UTC (rev 588) @@ -3,54 +3,33 @@ 3.0.0 of the library. ---------------------------------------------------------------------- -PTmap: +PTremap: -PTmap should be a lightweight, simple stitching program and nothing -else. That means it will only do mapping of the panoramas. In terms of -the old PTsticher scripts it means it will only create TIFF_m, -cropped, no colour correction. It will be up to the caller application -to take these files and create the desired output (apply colour -correction, cropping, uncropping, conversion to other formats). - -This will simplify testing, and improve stability. - - -TODO: - - - Rename PTmender to PTremap - DESIRABLE FEATURES: + - Output a text file with the names of the files processed and extra + information, such as size + - Insert script into the TIFF comment field. - - Cleanup command line options, and add a -h option - - Process fisheye lenses. - If somebody wants full compatibility with PTstitcher, a new program can be added that does all the work. It will be a "superset" of many of the current pano tools. - ---------------------------------------------------------------------- +---------------------------------------------------------------------- +PTblender: + +DESIRABLE: - PTblender: - - It will split into 2 programs: - - - PTblender. It will do colour correction _only_. - - - PTroller. It will flatten an image. It will take a set of TIFFs and - create only one TIFF - - DESIRABLE: - - (PTblender) Create photoshop curves and maps for HSV colour - corrections + corrections. Probably not for 3.0.0 - - (PTblender) Ignore areas with mask != 255 during computation of the - curves, but transform them if mask > 0 +---------------------------------------------------------------------- +PTroller: - - (PTroller) Add the ability to stack and add composing images. +- (PTroller) Add the ability to stack and add composing images. ---------------------------------------------------------------------- @@ -65,25 +44,20 @@ panotools) and make sure all tools are compatible with TIFFs output by nona and fulla. - ---------------------------------------------------------------------- +---------------------------------------------------------------------- - PTtiff2psd: +PTtiff2psd: - TODO: +DESIRABLE: - - Nothing - - DESIRABLE: - - Specify blending mode for layers ---------------------------------------------------------------------- - PTestimate (old PToptimizer) +PToptimizer: + +* Ready for 3.0.0 - TODO: - - Nothing - ---------------------------------------------------------------------- DESIRABLE new tools: Modified: trunk/libpano/pttiff.h =================================================================== --- trunk/libpano/pttiff.h 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/pttiff.h 2006-10-27 06:34:41 UTC (rev 588) @@ -46,7 +46,7 @@ int TiffGetImageParameters(TIFF *tiffFile, pt_tiff_parms *tiffData); int TiffSetImageParameters(TIFF *tiffFile, pt_tiff_parms *tiffData); -int uncropTiff(char *inputFile, char *outputFile, char *messageBuffer); +int panoTiffUnCrop(char *inputFile, char *outputFile); int panoTiffGetCropInformation(pano_Tiff * file); Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/tiff.c 2006-10-27 06:34:41 UTC (rev 588) @@ -460,7 +460,6 @@ } - void RGBAtoARGB(UCHAR * buf, int width, int bitsPerPixel) { int x; @@ -556,7 +555,6 @@ } - ////////////////////////////////////////////////////////////////////// // NEW tiff routines ////////////////////////////////////////////////////////////////////// @@ -595,48 +593,77 @@ return FALSE; } - //If nothing is stored in these tags, then this must be an "uncropped" TIFF - //file, in which case, the "full size" width/height is the same as the - //"cropped" width and height - if (TIFFGetField - (file->tiff, TIFFTAG_PIXAR_IMAGEFULLWIDTH, &(c->fullWidth)) == 0) { - c->fullWidth = c->croppedWidth; - } - else { - file->metadata.isCropped = TRUE; - } - if (TIFFGetField - (file->tiff, TIFFTAG_PIXAR_IMAGEFULLLENGTH, &(c->fullHeight)) == 0) { - c->fullHeight = c->croppedHeight; - } - else { - file->metadata.isCropped = TRUE; - } - // The position of the file is given in "real" dimensions, we have to rescale them - if (TIFFGetField(file->tiff, TIFFTAG_XPOSITION, &x_position) == 0) + if (TIFFGetField(file->tiff, TIFFTAG_XPOSITION, &x_position) != 0) { + // This means this is a cropped image + + file->metadata.isCropped = TRUE; + + + + // we should get a x resoltion, y position and yresolution, if not, + // we will issue an error, as it can be cropped on just "one dimension" + + if (TIFFGetField(file->tiff, TIFFTAG_XRESOLUTION, &x_resolution) == 0) { + PrintError("Cropped Image contains XPosition but not XResoulion tag. " + "Report to developers if you think this is a bug"); + return FALSE; + } + if (TIFFGetField(file->tiff, TIFFTAG_YRESOLUTION, &y_resolution) == 0) { + PrintError("Cropped image contains XPosition and YPosition, but it does not contain Y Resultion. " + "Report to developers you think this is a bug"); + return FALSE; + } + + if (TIFFGetField(file->tiff, TIFFTAG_YPOSITION, &y_position) == 0) { + PrintError("Cropped image contains XPosition but not YPosition. " + "Report to developers you think this is a bug"); + return FALSE; + } + + //offset in pixels of "cropped" image from top left corner of + //full image (rounded to nearest integer) + // The position of the file is given in "real" dimensions, we have to rescale them + + c->xOffset = (uint32) ((x_position * x_resolution) + 0.49); + c->yOffset = (uint32) ((y_position * y_resolution) + 0.49); + + // One problem is that some images do not contain FULL size. if they don't have + // then assume it + + if (TIFFGetField(file->tiff, TIFFTAG_PIXAR_IMAGEFULLWIDTH, &(c->fullWidth)) == 0) + c->fullWidth = c->xOffset + c->croppedWidth; + + if (TIFFGetField(file->tiff, TIFFTAG_PIXAR_IMAGEFULLLENGTH, &(c->fullHeight)) == 0) + c->fullHeight = c->yOffset + c->croppedHeight; + } else { + + // Not cropped, then initilize fields accordingly + x_position = 0; - if (TIFFGetField(file->tiff, TIFFTAG_XRESOLUTION, &x_resolution) == 0) x_resolution = 0; - if (TIFFGetField(file->tiff, TIFFTAG_YPOSITION, &y_position) == 0) y_position = 0; - if (TIFFGetField(file->tiff, TIFFTAG_YRESOLUTION, &y_resolution) == 0) y_resolution = 0; + c->xOffset = 0; + c->yOffset = 0; + c->fullHeight = c->croppedHeight; + c->fullWidth = c->croppedWidth; - //offset in pixels of "cropped" image from top left corner of - //full image (rounded to nearest integer) - c->xOffset = (uint32) ((x_position * x_resolution) + 0.49); - c->yOffset = (uint32) ((y_position * y_resolution) + 0.49); + } - //printf("%s: %dx%d @ %d,%d", filename, c->cropped_width, c->cropped_height, c->x_offset, c->y_offset); - //printf("get 3 width %d length %d\n", (int) c->croppedWidth, - //(int) c->croppedHeight); - //printf("get 3 full %d length %d\n", (int) c->fullWidth, - // (int) c->fullHeight); - //printf("cropped %d\n", (int) file->metadata.isCropped); +#if 0 + // used for debugging + printf("%dx%d @ %d,%d", c->croppedWidth, c->croppedHeight, c->xOffset, c->yOffset); + printf("get 3 width %d length %d\n", (int) c->croppedWidth, + (int) c->croppedHeight); + printf("get 3 full %d length %d\n", (int) c->fullWidth, + (int) c->fullHeight); + printf("cropped %d\n", (int) file->metadata.isCropped); +#endif + return TRUE; } @@ -1640,3 +1667,106 @@ } +/** + * Reads inputFile and "uncrops" the image by adding black space to pad + * image to its full size, saving the result as outputFile. If an error + * is encountered messageBuffer is filled with the message, and a non-zero + * value is returned. If success, zero is returned + */ +int panoTiffUnCrop(char *inputFile, char *outputFile) +{ + + pano_CropInfo *inputCropInfo = NULL; + char *buffer = NULL; + char *offsetInBuffer; + int inputRow, outputRow; + pano_Tiff *tiffInput = NULL; + pano_Tiff *tiffOutput = NULL; + pano_ImageMetadata *metadata = NULL; + + if ((tiffInput = panoTiffOpen(inputFile)) == NULL) { + PrintError("Unable to open input file"); + goto error; + } + + if (!panoTiffIsCropped(tiffInput)) { + PrintError("Source image is not a cropped tiff"); + goto error; + } + + inputCropInfo = &tiffInput->metadata.cropInfo; + + if ((tiffOutput = + panoTiffCreateUnCropped(outputFile, &tiffInput->metadata)) == NULL) { + PrintError("Unable to create output file [%s]", outputFile); + goto error; + } + + metadata = &tiffOutput->metadata; + //printf("***Size of line %d\n", metadata->bytesPerLine); + + // Allocate buffer for line + buffer = calloc(metadata->bytesPerLine, 1); + + if (buffer == NULL) { + PrintError("Unable to allocate memory for IO buffer"); + goto error; + } + + inputRow = 0; + // The crop data has to be placed inside the buffer according to the + // cropinfo offset + + offsetInBuffer = + buffer + inputCropInfo->xOffset * metadata->bytesPerPixel; + + assert(metadata->imageHeight > 0); + // Read one line at a time and transfer to output file + for (outputRow = 0; outputRow < metadata->imageHeight; outputRow++) { + + //fill empty buffer with empty space (zeros) + bzero(buffer, metadata->bytesPerLine); + + //if inside ROI then read from input file + if (panoROIRowInside(inputCropInfo, outputRow)) { + + if (TIFFReadScanline(tiffInput->tiff, offsetInBuffer, inputRow, 0) + != 1) { + PrintError("Unable to read scanline %d", inputRow); + goto error; + } + inputRow++; + } + + //write buffer to outputfile + if (TIFFWriteScanline(tiffOutput->tiff, buffer, outputRow, 0) != 1) { + PrintError("Unable to write scanline %d", outputRow); + goto error; + } + + } + + //printf("Finished\n"); + + free(buffer); + panoTiffClose(tiffInput); + panoTiffClose(tiffOutput); + + return 1; + + error: + // Error handler + // Make sure we release any resources we have + + if (buffer != NULL) + free(buffer); + + if (tiffOutput != NULL) + panoTiffClose(tiffOutput); + + if (tiffInput != NULL) + panoTiffClose(tiffInput); + + + return 0; +} Modified: trunk/libpano/tools/PTtiffdump.c =================================================================== --- trunk/libpano/tools/PTtiffdump.c 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/tools/PTtiffdump.c 2006-10-27 06:34:41 UTC (rev 588) @@ -63,7 +63,7 @@ } printf("%5d,%4d,%c,%3x %x, %c\n", x, y, channel, *data1, *data2, extra); } - + return 0; } @@ -72,9 +72,7 @@ char opt; int overwrite = 0; int filesCount; - int retVal; char *inputFile, *otherFile; - FILE *testFile; //Need enough space for a message to be returned if something goes wrong @@ -126,15 +124,14 @@ unsigned char *data1 = *(im1.data); unsigned char *data2 = *(im2.data); int x, y; - int channel = 0; if (im1.width != im2.width || im1.height != im2.height) { printf("The files have differente sizes %d,%d and %d,%d\n", - im1.width, im1.height, im2.width, im2.height); + (int)im1.width, (int)im1.height, (int)im2.width, (int)im2.height); } - printf("Comparing %d %d pixels\n", im1.width, im1.height); + printf("Comparing %d %d pixels\n", (int)im1.width, (int)im1.height); int count =0; Modified: trunk/libpano/tools/PTuncrop.c =================================================================== --- trunk/libpano/tools/PTuncrop.c 2006-10-27 05:44:16 UTC (rev 587) +++ trunk/libpano/tools/PTuncrop.c 2006-10-27 06:34:41 UTC (rev 588) @@ -94,7 +94,7 @@ } } - retVal = panoUnCropTiff(inputFile, outputFile); + retVal = panoTiffUnCrop(inputFile, outputFile); exit(retVal); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-10-27 09:33:23
|
Revision: 591 http://svn.sourceforge.net/panotools/?rev=591&view=rev Author: dmg Date: 2006-10-27 02:33:04 -0700 (Fri, 27 Oct 2006) Log Message: ----------- 2006-10-27 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre12 * tools/PTroller.c: Removed unused variables * TODO: Updated it * PTcommon.c. Set the ImageDescription field of the tiff to the contents of the script. * PTcommon.c, tiff.c: Set imagenumber, and imagesTotalNumber in PAGENUMBER field of tiff. * panorama.h (struct): Added imageNumber, and imagesTotalNumber and script to the metadata struct. * PTcommon.c (panoPSDCreate): Implemented the ability to specify a blending mode in the output of the image. * tools/PTtiff2psd.c, file.c, file.h: panoCreatePSD renamed to panoPSDCreate, replaced last parameter to be a struct (panoFlatteningParms) so we can pass as many parameters as necessary. Added support for blending mode in PSD Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/PTcommon.h trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/file.h trunk/libpano/filter.h trunk/libpano/panorama.h trunk/libpano/tests/simpleStitch/ChangeLog trunk/libpano/tests/simpleStitch/reference/tiff_m_cropped0000.tif trunk/libpano/tests/simpleStitch/reference/tiff_m_cropped0001.tif trunk/libpano/tests/simpleTiff16/ChangeLog trunk/libpano/tests/simpleTiff16/reference/tiff_m_cropped0000.tif trunk/libpano/tiff.c trunk/libpano/tools/PTroller.c trunk/libpano/tools/PTtiff2psd.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/ChangeLog 2006-10-27 09:33:04 UTC (rev 591) @@ -1,3 +1,28 @@ +2006-10-27 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre12 + + * tools/PTroller.c: Removed unused variables + + * TODO: Updated it + + * PTcommon.c. Set the ImageDescription field of the tiff to the + contents of the script. + + * PTcommon.c, tiff.c: Set imagenumber, and imagesTotalNumber in + PAGENUMBER field of tiff. + + * panorama.h (struct): Added imageNumber, and imagesTotalNumber + and script to the metadata struct. + + * PTcommon.c (panoPSDCreate): Implemented the ability to specify a + blending mode in the output of the image. + + * tools/PTtiff2psd.c, file.c, file.h: panoCreatePSD renamed to + panoPSDCreate, replaced last parameter to be a + struct (panoFlatteningParms) so we can pass as many parameters as + necessary. Added support for blending mode in PSD + 2006-10-26 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre11 Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/PTcommon.c 2006-10-27 09:33:04 UTC (rev 591) @@ -69,8 +69,8 @@ } -int panoCreatePSD(fullPath * fullPathImages, int numberImages, - fullPath * outputFileName, int stacked) +int panoPSDCreate(fullPath * fullPathImages, int numberImages, + fullPath * outputFileName, pano_flattening_parms *flatteningParms) { Image *ptrImage; int i; @@ -105,7 +105,7 @@ if (!(image.bitsPerPixel == 64 || image.bitsPerPixel == 32)) { PrintError("Image type not supported (%d bits per pixel)\n", image.bitsPerPixel); - return 0; + return -1; } if (numberImages > 1 && image.bitsPerPixel != 32) { @@ -116,6 +116,12 @@ } } + if (numberImages == 1) { + PrintError("Writing only one image is not supported yet"); + return -1; + } + + //Write out the first image as the base layer in the PSD file if (writePSDwithLayer(&image, outputFileName) != 0) { PrintError("Could not write PSD-file"); @@ -162,10 +168,11 @@ stitchInfo.seam = 1; stitchInfo.feather = 0; - if (stacked) - stitchInfo.opacity = (unsigned char) (255.0/ (i + 1)); + if (flatteningParms->stacked) + stitchInfo.psdOpacity = (unsigned char) (255.0/ (i + 1)); else - stitchInfo.opacity = 255; + stitchInfo.psdOpacity = 255; + stitchInfo.psdBlendingMode = flatteningParms->psdBlendingMode; if (addLayerToFile(ptrImage, outputFileName, &tempFile, &stitchInfo) != 0) { @@ -737,7 +744,6 @@ } fclose(regFile); - free(regScript); //Initialize members to zero SetImageDefaults(&image1); @@ -919,7 +925,10 @@ resultPanorama.width, resultPanorama.height); - + metadata.imageNumber = loopCounter; + metadata.imageTotalNumber = counterImageFiles; + metadata.imageDescription = strdup(regScript); + // Set output width/height for output file if (croppedTIFFIntermediate) { getROI(&transform, prefs, &ROIRect); @@ -1252,11 +1261,14 @@ } + free(regScript); return (0); // FUNCTION ENDS HERE mainError: + free(regScript); + return (-1); } Modified: trunk/libpano/PTcommon.h =================================================================== --- trunk/libpano/PTcommon.h 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/PTcommon.h 2006-10-27 09:33:04 UTC (rev 591) @@ -33,6 +33,7 @@ #include "panorama.h" #include "pt_stdint.h" +#include "file.h" typedef struct { uint16_t samplesPerPixel; @@ -55,11 +56,13 @@ /* defined in ptpicker.c, but never exported */ int panoFlattenTIFF(fullPath *fullPathImages, int counterImageFiles, fullPath *outputFileName, int removeOriginals); -int panoCreatePSD( fullPath *fullPathImages, int, fullPath*, int); + extern int quietFlag; - + +int panoPSDCreate( fullPath *fullPathImages, int, fullPath*, pano_flattening_parms*); + int panoCreatePanorama(fullPath ptrImageFileNames[], int counterImageFiles, fullPath *panoFileName, fullPath *scriptFileName); void panoReplaceExt(char* filename, char *extension); Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/TODO 2006-10-27 09:33:04 UTC (rev 591) @@ -10,8 +10,6 @@ - Output a text file with the names of the files processed and extra information, such as size - - Insert script into the TIFF comment field. - - Process fisheye lenses. - If somebody wants full compatibility with PTstitcher, a new program @@ -29,37 +27,33 @@ ---------------------------------------------------------------------- PTroller: -- (PTroller) Add the ability to stack and add composing images. + +- Split PTroller into 2: PTmasker and PTroller +DESIRABLE: + +- PTroller: Add the ability to stack and add composing images. + - ---------------------------------------------------------------------- +---------------------------------------------------------------------- PTuncrop: - - No major changes, except that it will support images without full - size tags. - - TODO: - - - Add support for images without full size tags --this will affect all - panotools) and make sure all tools are compatible with TIFFs output - by nona and fulla. - +* Ready for 3.0.0 + ---------------------------------------------------------------------- PTtiff2psd: -DESIRABLE: - - - Specify blending mode for layers - +- One layer 8 and 16 bit images are not being properly created. + + ---------------------------------------------------------------------- PToptimizer: * Ready for 3.0.0 - ---------------------------------------------------------------------- - +---------------------------------------------------------------------- DESIRABLE new tools: PTcrop: @@ -67,9 +61,18 @@ - Two options: crop to bounding rectangle, and crop to inner rectangle (I think that were the names Pablo gave them). + +---------------------------------------------------------------------- +GENERAL + + - Add support for images without full size tags --this will affect all + panotools) and make sure all tools are compatible with TIFFs output + by nona and fulla. + + - ---------------------------------------------------------------------- +---------------------------------------------------------------------- LONGER TERM: * Allow tools to read their parameters from the PTstitcher script. Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/configure.ac 2006-10-27 09:33:04 UTC (rev 591) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre10], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre12], 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-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/file.c 2006-10-27 09:33:04 UTC (rev 591) @@ -89,8 +89,50 @@ static int writeTransparentAlpha ( Image *im, file_spec fnum, PTRect *theRect ); + +char *psdBlendingModesNames[] = { + "Normal", + "Color", + "Darken", + "Difference", + "Dissolve", + "Hard Light", + "Hue", + "Lighten", + "Luminosity", + "Multiply", + "Overlay", + "Sof Light", + "Saturation", + "Screen" +}; + +char *psdBlendingModesInternalName[] = { + "norm", + "colr", + "dark", + "diff", + "diss", + "hLit", + "hue", + "lite", + "lum", + "mul", + "over", + "sLit", + "sat", + "scrn" +}; + + + + + + + + #define PSDHLENGTH 26 int panoPSDResourceWrite(file_spec fnum, pt_uint16 resource, pt_uint16 len) @@ -126,7 +168,7 @@ WRITESHORT( len ); //length } -#define CREATED_BY_PSD "PTmender " VERSION +#define CREATED_BY_PSD "Panotools " VERSION #define IPTC_VERSION_ID 0 #define IPTC_ORIGINATING_PROGRAM_ID 0x41 #define IPTC_DESCRIPTION_WRITER_ID 0x7a @@ -1574,13 +1616,22 @@ WRITEUCHAR( 'B' ); WRITEUCHAR( 'I' ); WRITEUCHAR( 'M' ); - // WRITEINT32( 'norm'); // Blend mode key - WRITEUCHAR( 'n' ); - WRITEUCHAR( 'o' ); - WRITEUCHAR( 'r' ); - WRITEUCHAR( 'm' ); - WRITEUCHAR(sB->opacity); // 1 byte Opacity 0 = transparent ... 255 = opaque + + + { + // the next 4 bytes are the blending mode key + // WRITEINT32( 'norm'); // Blend mode key + assert(PSD_NUMBER_BLENDING_MODES == sizeof(psdBlendingModesNames)/sizeof(char*)); + assert(sizeof(psdBlendingModesNames) == sizeof(psdBlendingModesInternalName)); + char *blendingModeKey = psdBlendingModesInternalName[sB->psdBlendingMode]; + int j; + for (j = 0; j< 4; j++ ) { + WRITEUCHAR(blendingModeKey[j]); + } + } + + WRITEUCHAR(sB->psdOpacity); // 1 byte Opacity 0 = transparent ... 255 = opaque WRITEUCHAR( 0 ); // 1 byte Clipping 0 = base, 1 = non\xD0base WRITEUCHAR( hasShapeMask ); // 1 byte Flags bit 0 = transparency protected bit 1 = visible WRITEUCHAR( 0 ); // 1 byte (filler) (zero) Modified: trunk/libpano/file.h =================================================================== --- trunk/libpano/file.h 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/file.h 2006-10-27 09:33:04 UTC (rev 591) @@ -29,6 +29,7 @@ #ifndef __FILE_H__ +#define __FILE_H__ // these are defined in file.c int panoImageRead(Image * im, fullPath * sfile); @@ -37,11 +38,42 @@ // and these are defined in bmp.c, jpeg.c, hdrfile.c, png.c, and ppm.c // but there is no point in creating a file for each one of them -int panoBMPRead( Image *im, fullPath *sfile ); +int panoBMPRead(Image *im, fullPath *sfile ); int panoJPEGRead(Image * im, fullPath * sfile); int panoHDRRead(Image *im, fullPath *sfile ); int panoPNGRead(Image *im, fullPath *sfile ); int panoPPMRead(Image * im, fullPath * sfile); + +typedef struct { + int stacked; // 1 if images are stacked + int psdBlendingMode; // for psd output, photoshop/gimp blending mode +} pano_flattening_parms; + +enum { + PSD_NORMAL, + PSD_COLOR, + PSD_DARKEN, + PSD_DIFFERENCE, + PSD_DISSOLVE, + PSD_HARD_LIGHT, + PSD_HUE, + PSD_LIGHTEN, + PSD_LUMINOSITY, + PSD_MULTIPLY, + PSD_OVERLAY, + PSD_SOFT_LIGHT, + PSD_SATURATION, + PSD_SCREEN, + PSD_NUMBER_BLENDING_MODES, // This Is Not Really a mode, it is the counter of number of modes + }; + + + +extern char *psdBlendingModesNames[PSD_NUMBER_BLENDING_MODES]; + +extern char *psdBlendingModesInternalName[PSD_NUMBER_BLENDING_MODES]; + + #endif Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/filter.h 2006-10-27 09:33:04 UTC (rev 591) @@ -209,7 +209,8 @@ int feather; // Width of feather int colcorrect; // Should the images be color corrected? int seam; // Where to put the seam (see above) - unsigned char opacity; // Opacity of the layer. Currently used only by PSD output. 0 trans, 255 opaque + unsigned char psdOpacity; // Opacity of the layer. Currently used only by PSD output. 0 trans, 255 opaque + unsigned char psdBlendingMode; // blending mode (photoshop) }; Modified: trunk/libpano/panorama.h =================================================================== --- trunk/libpano/panorama.h 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/panorama.h 2006-10-27 09:33:04 UTC (rev 591) @@ -319,6 +319,8 @@ char *datetime; char *imageDescription; char *artist; + uint16_t imageNumber; // saved in the page number TIFF field + uint16_t imageTotalNumber; // total number of images // These fields are computed int bytesPerPixel; // This is a common value to use Modified: trunk/libpano/tests/simpleStitch/ChangeLog =================================================================== --- trunk/libpano/tests/simpleStitch/ChangeLog 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/tests/simpleStitch/ChangeLog 2006-10-27 09:33:04 UTC (rev 591) @@ -1,3 +1,7 @@ +2006-10-27 dmg <dm...@uv...> + + * Updated tiff_m + 2006-10-22 dmg <dm...@uv...> * The PSD files were updated. Modified: trunk/libpano/tests/simpleStitch/reference/tiff_m_cropped0000.tif =================================================================== (Binary files differ) Modified: trunk/libpano/tests/simpleStitch/reference/tiff_m_cropped0001.tif =================================================================== (Binary files differ) Modified: trunk/libpano/tests/simpleTiff16/ChangeLog =================================================================== --- trunk/libpano/tests/simpleTiff16/ChangeLog 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/tests/simpleTiff16/ChangeLog 2006-10-27 09:33:04 UTC (rev 591) @@ -1,3 +1,7 @@ +2006-10-27 dmg <dm...@uv...> + + * Updated reference files + 2006-09-22 dmg <dm...@se...g> * Added README.TXT to explain that PSD files are not supported. Modified: trunk/libpano/tests/simpleTiff16/reference/tiff_m_cropped0000.tif =================================================================== (Binary files differ) Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/tiff.c 2006-10-27 09:33:04 UTC (rev 591) @@ -981,8 +981,9 @@ tiff->metadata.datetime = panoTiffGetString(tiff, TIFFTAG_DATETIME); tiff->metadata.imageDescription = panoTiffGetString(tiff, TIFFTAG_IMAGEDESCRIPTION); tiff->metadata.artist = panoTiffGetString(tiff, TIFFTAG_ARTIST); - + TIFFGetField(tiffFile, TIFFTAG_PAGENUMBER, &metadata->imageNumber, &metadata->imageTotalNumber); + //printf("...........................REad and allocate ICC Profile %d %x\n", //(int)(metadata->iccProfile.size), (int)(metadata->iccProfile.data)); @@ -1060,8 +1061,13 @@ && TIFFSetField(tiffFile, TIFFTAG_XRESOLUTION, metadata->xPixelsPerResolution) && TIFFSetField(tiffFile, TIFFTAG_YRESOLUTION, - metadata->yPixelsPerResolution); + metadata->yPixelsPerResolution) + && TIFFSetField(tiffFile, TIFFTAG_PAGENUMBER, metadata->imageNumber, + metadata->imageTotalNumber); + + + if (returnValue && metadata->bitsPerSample == 32) { // If it is 96 or 128 it is floatint point @@ -1069,7 +1075,13 @@ } // Take care of special cases + if (returnValue) { + + + } + // Only set ICCprofile if size > 0 + if (returnValue && metadata->iccProfile.size > 0) { returnValue = TIFFSetField(tiffFile, TIFFTAG_ICCPROFILE, Modified: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/tools/PTroller.c 2006-10-27 09:33:04 UTC (rev 591) @@ -40,8 +40,8 @@ #include "filter.h" #include "panorama.h" #include "PTcommon.h" +#include "ptstitch.h" - #define PT_ROLLER_USAGE "PTroller [options] <tiffFiles>+\n\n"\ "Options:\n"\ "\t-o <filename>\tOutput filename (defaults to merged.tif)\n"\ @@ -56,7 +56,6 @@ int main(int argc,char *argv[]) { char opt; - int referenceImage = -1; fullPath *ptrInputFiles; fullPath *ptrOutputFiles; @@ -64,11 +63,7 @@ char flatOutputFileName[MAX_PATH_LENGTH]; char *endPtr; int filesCount; - char tempString[MAX_PATH_LENGTH]; - int i; int base = 0; - int flattenFlag =0; - int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) int typeCorrection = 0; int ptComputeSeams = 0; fullPath pathName; Modified: trunk/libpano/tools/PTtiff2psd.c =================================================================== --- trunk/libpano/tools/PTtiff2psd.c 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/tools/PTtiff2psd.c 2006-10-27 09:33:04 UTC (rev 591) @@ -35,6 +35,7 @@ #include <dirent.h> #include <unistd.h> #include <assert.h> +#include <errno.h> #include "filter.h" @@ -47,12 +48,13 @@ #define PT_TIFF2PSD_USAGE "PTtiff2psd [options] <tiffFiles>+\n\n"\ "Options:\n"\ - "\t-o <filename>\tOutput filename (default merged.psd)\n"\ - "\t-m\t\tAdd stitching mask\n"\ - "\t-s\t\tStack them\n"\ - "\t-q\t\tQuiet run\n"\ - "\t-r\t\tReverse layers\n"\ - "\t-h\t\tShow this message\n"\ + "\t-o <filename>\t\tOutput filename (default merged.psd)\n"\ + "\t-b <blendingmode>\tSpecify blending mode for layers (see below)\n"\ + "\t-m\t\t\tAdd stitching mask\n"\ + "\t-s\t\t\tStack them\n"\ + "\t-q\t\t\tQuiet run\n"\ + "\t-r\t\t\tReverse layers\n"\ + "\t-h\t\t\tShow this message\n"\ "\n" #define PT_TIFF2PSD_VERSION "PTtiff2psd Version " VERSION ", based on PTstitcher by Helmut Dersch, rewritten by Daniel M German\n" @@ -61,166 +63,186 @@ int main(int argc,char *argv[]) { - char opt; - fullPath *ptrInputFiles; - int counter; - fullPath outputFilename; - fullPath *tempFiles; - int filesCount; - int base = 0; - int forceOverwrite = 0; - int reverseLayers = 0; - int addMask = 0; - int featherSize = 0; - int eraseTempFiles = 0; - int i; - int stacked = 0; + char opt; + char *endPtr; + fullPath *ptrInputFiles; + int counter; + fullPath outputFilename; + fullPath *tempFiles; + int filesCount; + int base = 0; + int forceOverwrite = 0; + int reverseLayers = 0; + int addMask = 0; + int featherSize = 0; + int eraseTempFiles = 0; + int i; + int temp; - ptrInputFiles = NULL; - counter = 0; + pano_flattening_parms flatteningParms; + + // clean up struct + bzero(&flatteningParms, sizeof(flatteningParms)); - printf(PT_TIFF2PSD_VERSION); + ptrInputFiles = NULL; + counter = 0; - if (StringtoFullPath(&outputFilename, DEFAULT_OUTPUT_FILENAME)) { - PrintError("Not a valid pathnamefor output filename [%s]", DEFAULT_OUTPUT_FILENAME); - return(-1); - } + printf(PT_TIFF2PSD_VERSION); - while ((opt = getopt(argc, argv, "o:sqhfmr")) != -1) { + if (StringtoFullPath(&outputFilename, DEFAULT_OUTPUT_FILENAME)) { + PrintError("Not a valid pathnamefor output filename [%s]", DEFAULT_OUTPUT_FILENAME); + return(-1); + } -// o and f -> set output file -// h -> help -// q -> quiet? -// k -> base image, defaults to first -// m -> add stitching mask + while ((opt = getopt(argc, argv, "o:sb:qhfmr")) != -1) { + + // o and f -> set output file + // h -> help + // q -> quiet? + // k -> base image, defaults to first - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'o': - if (StringtoFullPath(&outputFilename, optarg) !=0) { // success - PrintError("Not a valid pathname for output filename"); - return(-1); - } - break; - case 's': - stacked = 1; - break; - case 'm': - addMask = 1; - break; - case 'f': - forceOverwrite = 1; - break; - case 'r': - reverseLayers = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - case 'h': - printf(PT_TIFF2PSD_USAGE); - exit(0); - default: - break; + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'o': + if (StringtoFullPath(&outputFilename, optarg) !=0) { // success + PrintError("Not a valid pathname for output filename"); + return(-1); + } + break; + case 'b': + printf("Here\n"); + + temp = strtol(optarg, &endPtr, 10); + if (errno != 0 || (temp < 0 || temp >= PSD_NUMBER_BLENDING_MODES)) { + PrintError("Invalid value in blending mode. Use -h to see possible values "); + return -1; + } + printf("Here %d\n", temp); + flatteningParms.psdBlendingMode = temp; + break; + case 's': + flatteningParms.stacked = 1; + break; + case 'm': + addMask = 1; + break; + case 'f': + forceOverwrite = 1; + break; + case 'r': + reverseLayers = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + case 'h': + printf(PT_TIFF2PSD_USAGE); + printf("\tValid blending modes:\n"); + for (i=0;i<PSD_NUMBER_BLENDING_MODES;i++) { + printf("\t%2d\t%s\n", i, psdBlendingModesNames[i]); + } + exit(0); + default: + break; + } } - } + + - filesCount = argc - optind; + filesCount = argc - optind; - if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { - PrintError("Not enough memory"); - return -1; - } + if ((ptrInputFiles = calloc(filesCount, sizeof(fullPath))) == NULL) { + PrintError("Not enough memory"); + return -1; + } - base = optind; - for (; optind < argc; optind++) { - char *currentParm; - int index; + base = optind; + for (; optind < argc; optind++) { + char *currentParm; + int index; - currentParm = argv[optind]; + currentParm = argv[optind]; - // By default files are layered with the first at the bottom, and last at the top - // This option reverses that - index = optind - base; - if (reverseLayers) { - index = filesCount - 1 - index; - //just in case - assert(index >= 0); - assert(index < filesCount); - } + // By default files are layered with the first at the bottom, and last at the top + // This option reverses that + index = optind - base; + if (reverseLayers) { + index = filesCount - 1 - index; + //just in case + assert(index >= 0); + assert(index < filesCount); + } - if (StringtoFullPath(&ptrInputFiles[index], currentParm) !=0) { // success - PrintError("Syntax error: Not a valid pathname"); - return(-1); + if (StringtoFullPath(&ptrInputFiles[index], currentParm) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } } - } - if (filesCount <= 0) { - PrintError("No files specified in the command line"); - fprintf(stderr, PT_TIFF2PSD_USAGE); - return -1; - } + if (filesCount <= 0) { + PrintError("No files specified in the command line"); + fprintf(stderr, PT_TIFF2PSD_USAGE); + return -1; + } - // Check if the output file already exists... + // Check that all files are compatible - // Check that all files are compatible + if (filesCount > 1 && !panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("TIFFs are not compatible"); + return -1; + } - if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { - PrintError("TIFFs are not compatible"); - return -1; - } + // Masks processing... - // Masks processing... + if (addMask) { - if (addMask) { + if (!ptQuietFlag) { + Progress(_initProgress, "To add stitching mask"); + } - if (!ptQuietFlag) { - Progress(_initProgress, "To add stitching mask"); + // Find names for the temporary files + + tempFiles = calloc(filesCount, sizeof(fullPath)); + if (tempFiles == NULL) { + PrintError("Not enough memory"); + return -1; + } + for (i=0;i<filesCount;i++) { + strcpy(tempFiles[i].name, ptrInputFiles[0].name); + if (panoFileMakeTemp(&tempFiles[i]) == 0) { + PrintError("Could not make Tempfile"); + return -1; + } + } + if (panoStitchReplaceMasks(ptrInputFiles, tempFiles, filesCount, featherSize) != 0) { + PrintError("Unable to add stitching masks"); + return -1; + } + free(ptrInputFiles); + ptrInputFiles = tempFiles; + eraseTempFiles = 1; } - // Find names for the temporary files + // Finally create the PSD - tempFiles = calloc(filesCount, sizeof(fullPath)); - if (tempFiles == NULL) { - PrintError("Not enough memory"); - return -1; + if (!ptQuietFlag) { + char tempString[MAX_PATH_LENGTH + 40]; + sprintf(tempString, "Creating output file %s", outputFilename.name); + Progress(_initProgress, tempString); } - for (i=0;i<filesCount;i++) { - strcpy(tempFiles[i].name, ptrInputFiles[0].name); - if (panoFileMakeTemp(&tempFiles[i]) == 0) { - PrintError("Could not make Tempfile"); - return -1; - } + + if (panoPSDCreate(ptrInputFiles, filesCount, &outputFilename, &flatteningParms) != 0) { + PrintError("Error while creating PSD file"); + return -1; } - if (panoStitchReplaceMasks(ptrInputFiles, tempFiles, filesCount, featherSize) != 0) { - PrintError("Unable to add stitching masks"); - return -1; + + if (eraseTempFiles) { + for (i=0;i<filesCount; i++) + remove(ptrInputFiles[i].name); } + free(ptrInputFiles); - ptrInputFiles = tempFiles; - eraseTempFiles = 1; - } - // Finally create the PSD + return 0; - if (!ptQuietFlag) { - char tempString[MAX_PATH_LENGTH + 40]; - sprintf(tempString, "Creating output file %s", outputFilename.name); - Progress(_initProgress, tempString); - } - - if (panoCreatePSD(ptrInputFiles, filesCount, &outputFilename, stacked) != 0) { - PrintError("Error while creating PSD file"); - return -1; - } - - if (eraseTempFiles) { - for (i=0;i<filesCount; i++) - remove(ptrInputFiles[i].name); - } - - free(ptrInputFiles); - - return 0; - } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-27 07:56:17 UTC (rev 590) +++ trunk/libpano/version.h 2006-10-27 09:33:04 UTC (rev 591) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre10 " +#define VERSION "2.8.5pre11 " #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-10-28 18:03:48
|
Revision: 592 http://svn.sourceforge.net/panotools/?rev=592&view=rev Author: dmg Date: 2006-10-28 11:03:33 -0700 (Sat, 28 Oct 2006) Log Message: ----------- 2006-10-28 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre13 * ptstitch.c, ptstitch.h (panoStitchPixelChannelGet): Upgraded this function to non-static, since it is useful in tiff.c too. * pttiff.h, metadata.c, metadata.h, tiff.c: implemented cropping of tiffs to boudning rectangle * tools/Makefile.am, tools/PTcrop.c: Created program to crop panos to bounding rectangle * tools/PTuncrop.c (main): Fixed bug: return zero when success, and non-zero in error. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/file.h trunk/libpano/metadata.c trunk/libpano/metadata.h trunk/libpano/ptstitch.c trunk/libpano/ptstitch.h trunk/libpano/pttiff.h trunk/libpano/tiff.c trunk/libpano/tools/Makefile.am trunk/libpano/tools/PTuncrop.c trunk/libpano/version.h Added Paths: ----------- trunk/libpano/tools/PTcrop.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/ChangeLog 2006-10-28 18:03:33 UTC (rev 592) @@ -1,5 +1,26 @@ +2006-10-28 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre13 + + * ptstitch.c, ptstitch.h (panoStitchPixelChannelGet): Upgraded + this function to non-static, since it is useful in tiff.c too. + + * pttiff.h, metadata.c, metadata.h, tiff.c: implemented cropping + of tiffs to boudning rectangle + + * tools/Makefile.am, tools/PTcrop.c: Created program to crop panos + to bounding rectangle + + * tools/PTuncrop.c (main): Fixed bug: return zero when success, and non-zero + in error. + 2006-10-27 dmg <dm...@uv...> + * tiff.c (panoTiffOpen, panoTiffRead): These functions were not + handling input errors properly + + * TODO (PTblender): Added ideas from JD Smith on how to improve it. + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre12 * tools/PTroller.c: Removed unused variables Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/TODO 2006-10-28 18:03:33 UTC (rev 592) @@ -3,6 +3,12 @@ 3.0.0 of the library. ---------------------------------------------------------------------- + +* 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 + ---------------------------------------------------------------------- + PTremap: DESIRABLE FEATURES: @@ -21,46 +27,42 @@ DESIRABLE: - - (PTblender) Create photoshop curves and maps for HSV colour + - Feauture: Create photoshop curves and maps for HSV colour corrections. Probably not for 3.0.0 ---------------------------------------------------------------------- PTroller: - - Split PTroller into 2: PTmasker and PTroller DESIRABLE: - PTroller: Add the ability to stack and add composing images. - ---------------------------------------------------------------------- PTuncrop: -* Ready for 3.0.0 +* Feature: Take a -f option for force processing ---------------------------------------------------------------------- + + PTcrop: +* Feature: Take a -f option for force processing. +* Feature: compute the inner rectangle + +---------------------------------------------------------------------- + PTtiff2psd: -- One layer 8 and 16 bit images are not being properly created. +- Bug: One layer 8 and 16 bit images are not being properly created. - ---------------------------------------------------------------------- PToptimizer: * Ready for 3.0.0 - ---------------------------------------------------------------------- - DESIRABLE new tools: - - PTcrop: - - - Two options: crop to bounding rectangle, and crop to inner rectangle - (I think that were the names Pablo gave them). - ---------------------------------------------------------------------- GENERAL @@ -80,3 +82,110 @@ * Add support to all the tools for 16 bit, and 32 bit images (it is kind of mixed at this point) +---------------------------------------------------------------------- +PTblender: + +- Pre-compute which images could actually overlap from their TIFF + offsets, adding only these to a linked list of pairs. Might as well + support cropped TIFFs where possible. This will really help people + who do >20 image multi-row sphericals (since the current algorithm + loops over all pixels in the image N^2 times). For such panos, it + may even be worth calling PTcrop (when it exists) first on the + uncropped images. + +- Replace the two inner nested loops in ReadHistogram with one loop + over the linked list of "possible match" images, and invert the + order of the loops: + + for (each row) { + read_row_from_images(row,&row_buffer); // careful with crop + for (each match in matching_images_list) { + if (row intersects both image boundaries) { + for (each pix in row) { + if pixel_include(row,pix,im1,im2,trim) + add_to_histogram(pix,match); + } + } + } + } + +- Factor out the code which decides whether to use a given pixel in + the histogram into a separate function (pixel_include() above), and + pass it an options structure which gives it what it needs to know + (the optional trim factors, etc., called 'trim' above). This is + also where separate mask data could be used, but the "graymask" + method currently employed may obviate that. + +- Simplify the actual histogram remapping and subsequent color + correction code: + + 1. Always match all three histograms, RGB. Impose "brightness only" + or other constraints on the mapping functions at the very end + (see below). No HSV computations are ever performed. + + 2. Use a single routine to compute a mapping function (table) from + histogram 1 (source) to histogram 2 (target). This routine will + simply: + + a. Form cumulative totals of the both histograms. + b. Create the 256 element floating point mapping function z + which maps between them (one for each of RGB). + + This function will be called many times, so needs to be short and + sweet. + + 3. Build a ragged array of length n_images, with each element + holding a linked list of all other images to which it matches, + keeping track of pixel overlap count, and omitting matches + without enough pixels in overlap. + + 3. Compute the floating point mapping functions z for all pairs in + the ragged array.. There is one z per pair for each of RBG. + + 4. "Anneal" the (potentially long list of) mapping functions z over + the entire image: + + a. For each image, compute a master mapping function m for the + image, from the overlapping pixel count-weighted average of + all the modified sub-functions to all neighbors. + + b. The modified sub-function z' to a neighbor will depend on + i) the mapping function between the two, z, and ii) the + master function m of the neighbor, as: + + z'=m^-1 z + + The inverse of a mapping function m is that function which, + when m is run through it, produces the unit vector + (0..255). In the first round, all master functions are set + to the unit vector (0..255), and z'=z. + + c. Repeatedly iterate over all images in this way until all + master mapping functions converge. Convergence can + progress non-uniformly (image by image); each image is + marked as converged once its master function converges. + + Note that a reference image is no longer needed... the average + best mapping to make all images compatible is automatically + developed (e.g. for a range of brightnesses, the "average" + brightness will be targeted). If a reference image is desired, + it is marked "converged" before the first round of annealing, and + everything proceeds in the same manner. + + 5. Normalize each image's annealed master mapping function, subject + to the (optional) user constraints: + + -t 1 (brightness only): m(r) = m(g) = m(b) (one average table). + -t 2 (color only): m(r) + m(g) + m(b) = I (unit vector) + + 6. Convert all normalized, annealed master mapping tables to byte, + by rounding, perhaps with some care taken to avoid banding caused + by large gaps. + + 7. Run each image's data through its master mapping table and write + out to output image. + +- No flattening (separate tool). + +- Add an optional debug switch to enable all that Debug.txt output + (just to stdout). Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/configure.ac 2006-10-28 18:03:33 UTC (rev 592) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre12], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre13], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/file.h =================================================================== --- trunk/libpano/file.h 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/file.h 2006-10-28 18:03:33 UTC (rev 592) @@ -50,6 +50,11 @@ int psdBlendingMode; // for psd output, photoshop/gimp blending mode } pano_flattening_parms; +typedef struct { + int type; // 1 if images are stacked +} pano_cropping_parms; + + enum { PSD_NORMAL, Modified: trunk/libpano/metadata.c =================================================================== --- trunk/libpano/metadata.c 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/metadata.c 2006-10-28 18:03:33 UTC (rev 592) @@ -56,4 +56,21 @@ metadata->bytesPerLine = metadata->imageWidth * metadata->bytesPerPixel; } +void panoMetadataCropSizeUpdate(pano_ImageMetadata * metadata, pano_CropInfo *cropInfo) +{ + // Update metadata with cropped info. + metadata->imageWidth = cropInfo->croppedWidth; + metadata->imageHeight = cropInfo->croppedHeight; + metadata->bytesPerLine = metadata->imageWidth * metadata->bytesPerPixel; + + // now the crop info in the metadata + + metadata->cropInfo.croppedWidth = cropInfo->croppedWidth; + metadata->cropInfo.croppedHeight = cropInfo->croppedHeight; + metadata->cropInfo.xOffset += cropInfo->xOffset; + metadata->cropInfo.yOffset += cropInfo->yOffset; + + // The full size remains the same, + // The rest of the metadata should be the same +} Modified: trunk/libpano/metadata.h =================================================================== --- trunk/libpano/metadata.h 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/metadata.h 2006-10-28 18:03:33 UTC (rev 592) @@ -33,5 +33,6 @@ int panoMetadataUpdateFromImage(Image *im); void panoUnCropMetadata(pano_ImageMetadata * metadata); +void panoMetadataCropSizeUpdate(pano_ImageMetadata * metadata, pano_CropInfo *cropInfo); #endif Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/ptstitch.c 2006-10-28 18:03:33 UTC (rev 592) @@ -35,7 +35,7 @@ #include "PTcommon.h" // Get the value of a channel in the pixel pointed by ptr -static unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel) +unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel) { uint16_t *pixel16; assert(ptr != NULL); @@ -144,7 +144,7 @@ // determine the type of image bytesPerPixel = image->bitsPerPixel/8; - + // Use the GreenBlue pixel area is used to keep a counter of the // minimum distance (in pixels) away we are from the edges of the // mask (horizontal or vertical) Modified: trunk/libpano/ptstitch.h =================================================================== --- trunk/libpano/ptstitch.h 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/ptstitch.h 2006-10-28 18:03:33 UTC (rev 592) @@ -42,4 +42,8 @@ int panoStitchReplaceMasks(fullPath * inputFiles, fullPath * outputFiles, int numberImages, int featherSize); +unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel); + + + #endif Modified: trunk/libpano/pttiff.h =================================================================== --- trunk/libpano/pttiff.h 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/pttiff.h 2006-10-28 18:03:33 UTC (rev 592) @@ -31,6 +31,7 @@ #include <tiffio.h> #include <tiff.h> +#include "file.h" typedef struct { @@ -47,8 +48,8 @@ int TiffSetImageParameters(TIFF *tiffFile, pt_tiff_parms *tiffData); int panoTiffUnCrop(char *inputFile, char *outputFile); +int panoTiffCrop(char *inputFile, char *outputFile, pano_cropping_parms *croppingParms); - int panoTiffGetCropInformation(pano_Tiff * file); int panoTiffRowInsideROI(pano_Tiff * image, int row); int panoTiffIsCropped(pano_Tiff * file); Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/tiff.c 2006-10-28 18:03:33 UTC (rev 592) @@ -33,6 +33,7 @@ #include "pttiff.h" #include "metadata.h" +#include "ptstitch.h" int readplanarTIFF(Image * im, TIFF * tif); @@ -1261,15 +1262,23 @@ // Open file and retrieve metadata panoTiff->tiff = TIFFOpen(fileName, "r"); - if (panoTiff->tiff != NULL) { - if (!panoTiffGetImageProperties(panoTiff)) { - TIFFClose(panoTiff->tiff); - free(panoTiff); - return NULL; - } + if (panoTiff->tiff == NULL) { + PrintError("Unable to open file %s", fileName); + goto error; } + + if (!panoTiffGetImageProperties(panoTiff)) { + TIFFClose(panoTiff->tiff); + PrintError("Unable to get properties of tiff file %s", fileName); + goto error; + } // return value return panoTiff; + + error: + free(panoTiff); + return NULL; + } @@ -1496,7 +1505,7 @@ int panoTiffRead(Image * im, char *fileName) { - pano_Tiff *tiff; + pano_Tiff *tiff = NULL; int result = FALSE; SetImageDefaults(im); @@ -1533,7 +1542,8 @@ //panoDumpMetadata(&im->metadata,"Read metadata"); - panoTiffClose(tiff); + if (tiff != NULL) + panoTiffClose(tiff); return result; } @@ -1782,3 +1792,151 @@ return 0; } + + + +int panoImageBoundingRectangleCompute(unsigned char *data, int width, int height, int bytesPerPixel, pano_CropInfo *cropInfo) +{ + unsigned char *pixel; + int xLeft, xRight, yTop, yBottom; + int row; int column; + int alphaChannel; + + xLeft = width; + yTop = 0; + + xRight = 0; + yBottom = 0; + + // We can do it all in one pass over the data + + pixel = data; + for (row = 0; row < height; row++) { + + for (column = 0; column < width; column++) { + + alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel, 0); + + if (alphaChannel != 0) { + // Only set the row the first time + if (yTop == 0) + yTop = row; + // Keep setting it until we find no more data + yBottom = row; + + // Columns are trickier... + // We are scanning row by row, so we need to + if (xLeft > column) { + xLeft = column; + } + if (xRight < column) { + xRight = column; + } + } + pixel += bytesPerPixel; + } + } + + assert(xRight > xLeft); + assert(yBottom > yTop); + + + // Fill return struct + + cropInfo->xOffset = xLeft; + cropInfo->yOffset = yTop; + cropInfo->croppedWidth = 1 + xRight - xLeft ; + cropInfo->croppedHeight = 1+ yBottom - yTop; + + // it should be at most equal to the original size + assert(width >= cropInfo->croppedWidth); + assert(height >= cropInfo->croppedHeight); + + + + fprintf(stderr, "Finding boudinging box: x %d y %d width %d height %d\n", (int)cropInfo->xOffset, (int)cropInfo->yOffset, + (int)cropInfo->croppedWidth, (int)cropInfo->croppedHeight); + + return 1; +} + +/** + * Reads inputFile and crops image + */ +int panoTiffCrop(char *inputFile, char *outputFile, pano_cropping_parms *croppingParms) +{ + + pano_Tiff *tiffOutput = NULL; + pano_ImageMetadata metadata; + pano_CropInfo cropInfo; + Image im; + unsigned char *data = NULL; + int i; + + if (panoTiffRead(&im, inputFile) ==0 ) { + PrintError("Unable to open input file %s", inputFile); + goto error; + } + + + // Compute inner rectangle + + panoImageBoundingRectangleCompute(*im.data, im.width, im.height, im.bitsPerPixel/8, &cropInfo); + + // Cropinfo is with respect to the data of the read image, not with respet to the "uncropped" image + if (cropInfo.croppedWidth == 0 || cropInfo.croppedHeight == 0) { + PrintError("Image is empty, unable to crop. "); + goto error; + } + + if (!panoMetadataCopy(&metadata, &(im.metadata))) { + goto error; + } + + panoMetadataCropSizeUpdate(&metadata, &cropInfo); + + if ((tiffOutput = + panoTiffCreate(outputFile, &metadata)) == NULL) { + PrintError("Unable to create output file [%s]", outputFile); + goto error; + } + + // Now we need to copy the data. + + data = *(im.data); + + // 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++) { + unsigned char *ptr; + + // skip the necessary bytes + + ptr = data + im.metadata.bytesPerPixel * cropInfo.xOffset; + + // write + ARGBtoRGBA(ptr, metadata.imageWidth, metadata.bitsPerPixel); + if (TIFFWriteScanline(tiffOutput->tiff, ptr, i, 1) != 1) { + PrintError("Error writing to output file"); + goto error; + } + + data += im.bytesPerLine; + + } + + //printf("Finished\n"); + + panoTiffClose(tiffOutput); + + return 1; + + error: + // Error handler + // Make sure we release any resources we have + + if (tiffOutput != NULL) + panoTiffClose(tiffOutput); + + return 0; +} Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/tools/Makefile.am 2006-10-28 18:03:33 UTC (rev 592) @@ -35,7 +35,7 @@ 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 PTremap +bin_PROGRAMS = panoinfo PToptimizer PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTremap PTcrop PTblender_SOURCES = PTblender.c PTblender_LDADD = -l${PANOLIB} -ltiff @@ -56,6 +56,10 @@ PTuncrop_SOURCES = PTuncrop.c PTuncrop_LDADD = -l${PANOLIB} -ljpeg -ltiff +PTcrop_SOURCES = PTcrop.c +PTcrop_LDADD = -l${PANOLIB} -ljpeg -ltiff + + PTtiffdump_SOURCES = PTtiffdump.c PTtiffdump_LDADD = -l${PANOLIB} -ljpeg -ltiff Added: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c (rev 0) +++ trunk/libpano/tools/PTcrop.c 2006-10-28 18:03:33 UTC (rev 592) @@ -0,0 +1,114 @@ +/* + * PTcrop + * + * This program takes as input a TIFF (cropped or uncropped) and generates an cropped TIFF + * according to the spec: + * + * - Specific boounding rectangle + * - Outer bounding rectangle + * - Inner inclusive rectangle + * + * Oct 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 + * + */ + +#define PT_CROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n"\ + "Options:\n"\ + "-o\t\tOverwrite output file if it exists\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" + +#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" +#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, "ohq")) != -1) { + +// o overwrite +// h -> help +// q -> quiet? + + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'o': + 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 -o to overwrite\n"); + fclose(testFile); + exit(1); + } + } + + retVal = panoTiffCrop(inputFile, outputFile, &croppingParms); + + if (retVal == 0) { + return 1; + } + + return 0; +} + Modified: trunk/libpano/tools/PTuncrop.c =================================================================== --- trunk/libpano/tools/PTuncrop.c 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/tools/PTuncrop.c 2006-10-28 18:03:33 UTC (rev 592) @@ -94,10 +94,11 @@ } } - retVal = panoTiffUnCrop(inputFile, outputFile); + if (panoTiffUnCrop(inputFile, outputFile)) + return 0; - exit(retVal); + return -1; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-27 09:33:04 UTC (rev 591) +++ trunk/libpano/version.h 2006-10-28 18:03:33 UTC (rev 592) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre11 " +#define VERSION "2.8.5pre13 " #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-10-28 18:15:27
|
Revision: 593 http://svn.sourceforge.net/panotools/?rev=593&view=rev Author: dmg Date: 2006-10-28 11:15:22 -0700 (Sat, 28 Oct 2006) Log Message: ----------- 2006-10-28 dmg <dm...@uv...> * tools/PTcrop.c: Reindented. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO trunk/libpano/tools/PTcrop.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-28 18:03:33 UTC (rev 592) +++ trunk/libpano/ChangeLog 2006-10-28 18:15:22 UTC (rev 593) @@ -1,5 +1,7 @@ 2006-10-28 dmg <dm...@uv...> + * tools/PTcrop.c: Reindented. + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre13 * ptstitch.c, ptstitch.h (panoStitchPixelChannelGet): Upgraded Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-28 18:03:33 UTC (rev 592) +++ trunk/libpano/TODO 2006-10-28 18:15:22 UTC (rev 593) @@ -45,7 +45,6 @@ * Feature: Take a -f option for force processing ---------------------------------------------------------------------- - PTcrop: * Feature: Take a -f option for force processing. @@ -64,16 +63,7 @@ ---------------------------------------------------------------------- ----------------------------------------------------------------------- -GENERAL - - - Add support for images without full size tags --this will affect all - panotools) and make sure all tools are compatible with TIFFs output - by nona and fulla. - - - ---------------------------------------------------------------------- LONGER TERM: Modified: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c 2006-10-28 18:03:33 UTC (rev 592) +++ trunk/libpano/tools/PTcrop.c 2006-10-28 18:15:22 UTC (rev 593) @@ -29,11 +29,11 @@ * */ -#define PT_CROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n"\ - "Options:\n"\ - "-o\t\tOverwrite output file if it exists\n"\ - "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ - "\n" +#define PT_CROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n" \ + "Options:\n" \ + "-o\t\tOverwrite output file if it exists\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" @@ -51,64 +51,64 @@ int main(int argc,char *argv[]) { - char opt; - int overwrite = 0; - int filesCount; - int retVal; - char *inputFile, *outputFile; - FILE *testFile; - pano_cropping_parms croppingParms; + char opt; + int overwrite = 0; + int filesCount; + int retVal; + char *inputFile, *outputFile; + FILE *testFile; + pano_cropping_parms croppingParms; - bzero(&croppingParms, sizeof(croppingParms)); + bzero(&croppingParms, sizeof(croppingParms)); - //Need enough space for a message to be returned if something goes wrong + //Need enough space for a message to be returned if something goes wrong - printf(PT_CROP_VERSION); + printf(PT_CROP_VERSION); - while ((opt = getopt(argc, argv, "ohq")) != -1) { + while ((opt = getopt(argc, argv, "ohq")) != -1) { -// o overwrite -// h -> help -// q -> quiet? + // o overwrite + // h -> help + // q -> quiet? - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'o': - overwrite = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - case 'h': - printf(PT_CROP_USAGE); - exit(0); - default: - break; + switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'o': + overwrite = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + case 'h': + printf(PT_CROP_USAGE); + exit(0); + default: + break; + } } - } - filesCount = argc - optind; + filesCount = argc - optind; - if (filesCount != 2) { - printf(PT_CROP_USAGE); - exit(0); - } + if (filesCount != 2) { + printf(PT_CROP_USAGE); + exit(0); + } - inputFile = argv[optind]; - outputFile = argv[optind+1]; + inputFile = argv[optind]; + outputFile = argv[optind+1]; - if (!overwrite) { - if ((testFile = fopen(outputFile, "r"))!= NULL) { - fprintf(stderr, "Output file already exists. Use -o to overwrite\n"); - fclose(testFile); - exit(1); + if (!overwrite) { + if ((testFile = fopen(outputFile, "r"))!= NULL) { + fprintf(stderr, "Output file already exists. Use -o to overwrite\n"); + fclose(testFile); + exit(1); + } } - } - retVal = panoTiffCrop(inputFile, outputFile, &croppingParms); - - if (retVal == 0) { - return 1; - } + retVal = panoTiffCrop(inputFile, outputFile, &croppingParms); + + if (retVal == 0) { + return 1; + } - return 0; + return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-10-28 20:48:37
|
Revision: 594 http://svn.sourceforge.net/panotools/?rev=594&view=rev Author: dmg Date: 2006-10-28 13:48:25 -0700 (Sat, 28 Oct 2006) Log Message: ----------- 2006-10-28 dmg <dm...@uv...> * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre14 * tools/PTtiff2psd.c: Add -f force processing option. Cleaned up. * file.h: Added a field to specify if forced processing in panoTiffUncrop * tools/PTmasker.c: Moved functionalty to create stitching masks into this program (from PTroller and PTblender). * tools/PTroller.c (main): Cleaned up options, added the option for force processsing. * tools/PTmender.c (main): Removed all functionality from it. * tools/PTblender.c (main): Cleaned up options. Added the option -f for force procesing * file.h, file.c (panoFileExists): Added function. * PTfile.c, tools/PTblender: Refactored function panoFileOutputNamesCreate * tools/PTcrop.c: Reindented. Cleanup options. Replaced -o with -f to be consistent * tools/PTcrop.c: Cleanup options. Replaced -o with -f Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/file.h trunk/libpano/pttiff.h trunk/libpano/tiff.c trunk/libpano/tools/Makefile.am trunk/libpano/tools/PTblender.c trunk/libpano/tools/PTcrop.c trunk/libpano/tools/PTmender.c trunk/libpano/tools/PTroller.c trunk/libpano/tools/PTtiff2psd.c trunk/libpano/tools/PTuncrop.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/ChangeLog 2006-10-28 20:48:25 UTC (rev 594) @@ -1,7 +1,32 @@ 2006-10-28 dmg <dm...@uv...> - * tools/PTcrop.c: Reindented. + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre14 + * tools/PTtiff2psd.c: Add -f force processing option. Cleaned up. + + * file.h: Added a field to specify if forced processing in panoTiffUncrop + + * tools/PTmasker.c: Moved functionalty to create stitching masks + into this program (from PTroller and PTblender). + + * tools/PTroller.c (main): Cleaned up options, added the option + for force processsing. + + * tools/PTmender.c (main): Removed all functionality from it. + + * tools/PTblender.c (main): Cleaned up options. Added the option -f + for force procesing + + * file.h, file.c (panoFileExists): Added function. + + * PTfile.c, tools/PTblender: Refactored function + panoFileOutputNamesCreate + + * tools/PTcrop.c: Reindented. Cleanup options. Replaced -o with -f + to be consistent + + * tools/PTcrop.c: Cleanup options. Replaced -o with -f + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre13 * ptstitch.c, ptstitch.h (panoStitchPixelChannelGet): Upgraded Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/PTcommon.c 2006-10-28 20:48:25 UTC (rev 594) @@ -1714,3 +1714,4 @@ } + Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/TODO 2006-10-28 20:48:25 UTC (rev 594) @@ -7,8 +7,12 @@ * 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 - ---------------------------------------------------------------------- +* Command line processing. All tools should have similar command line + processing. This needs to be checked, and updated, if necessary. + +---------------------------------------------------------------------- + PTremap: DESIRABLE FEATURES: @@ -33,29 +37,26 @@ ---------------------------------------------------------------------- PTroller: -- Split PTroller into 2: PTmasker and PTroller - DESIRABLE: - PTroller: Add the ability to stack and add composing images. ---------------------------------------------------------------------- PTuncrop: - -* Feature: Take a -f option for force processing ---------------------------------------------------------------------- PTcrop: -* Feature: Take a -f option for force processing. * Feature: compute the inner rectangle ---------------------------------------------------------------------- PTtiff2psd: -- Bug: One layer 8 and 16 bit images are not being properly created. +DESIRABLE: +Create PSDs of one layer 8 and 16 bit images + ---------------------------------------------------------------------- PToptimizer: Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/configure.ac 2006-10-28 20:48:25 UTC (rev 594) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre13], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre14], 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-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/file.c 2006-10-28 20:48:25 UTC (rev 594) @@ -2355,8 +2355,8 @@ ext = strrchr(sfile->name, '.'); if (ext == NULL || strlen(ext) != 4) { - PrintError("Unsupported file format [%s]: must have extension JPG, PNG, TIF, BMP or HDR", sfile); - return -1; + PrintError("Unsupported file format [%s]: must have extension JPG, PNG, TIF, BMP or HDR", sfile); + return -1; } ext++; strcpy(extension, ext); @@ -2395,7 +2395,62 @@ assert(0); } +// Takes a prefix, and creates a list of unique filenames +int panoFileOutputNamesCreate(fullPath *ptrOutputFiles, int filesCount, char *outputPrefix) +{ + int i; + char outputFilename[MAX_PATH_LENGTH]; + // I am sure we will never have more than 10000 images in a project! +#define DEFAULT_PREFIX_NUMBER_FORMAT "%04d" + + if (strchr(outputPrefix, '%') == NULL) { + if ((strlen(outputPrefix) + strlen(DEFAULT_PREFIX_NUMBER_FORMAT)) >= MAX_PATH_LENGTH) { + PrintError("Output prefix too long [%s]", outputPrefix); + return 0; + } + strcat(outputPrefix, DEFAULT_PREFIX_NUMBER_FORMAT); + } + + for (i =0; i< filesCount ; i++) { + char outputFilename[MAX_PATH_LENGTH]; + + sprintf(outputFilename, outputPrefix, i); + + // Verify the filename is different from the prefix + if (strcmp(outputFilename, outputPrefix) == 0) { + PrintError("Invalid output prefix. It does not generate unique filenames."); + return -1; + } + + if (StringtoFullPath(&ptrOutputFiles[i], outputFilename) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + panoReplaceExt(ptrOutputFiles[i].name, ".tif"); + // fprintf(stderr, "Output filename [%s]\n", ptrOutputFiles[i].name); + } + return 1; +} + +// Find the first file that exists in the input array of filenames +char *panoFileExists(fullPath *ptrFiles, int filesCount) +{ + int i; + FILE *testFile; + for (i =0; i< filesCount ; i++) { + if ((testFile = fopen(ptrFiles[i].name, "r"))!= NULL) { + fclose(testFile); + return ptrFiles[i].name; + } + } + return NULL; + +} + + + + #ifdef DONOTCOMPILE_TOBE_DELETED I am not sure this function is used at all Modified: trunk/libpano/file.h =================================================================== --- trunk/libpano/file.h 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/file.h 2006-10-28 20:48:25 UTC (rev 594) @@ -52,6 +52,7 @@ typedef struct { int type; // 1 if images are stacked + int forceProcessing; } pano_cropping_parms; @@ -80,5 +81,9 @@ extern char *psdBlendingModesInternalName[PSD_NUMBER_BLENDING_MODES]; +int panoFileOutputNamesCreate(fullPath *ptrOutputFiles, int filesCount, char* outputPrefix); +char *panoFileExists(fullPath *ptrFiles, int filesCount); + + #endif Modified: trunk/libpano/pttiff.h =================================================================== --- trunk/libpano/pttiff.h 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/pttiff.h 2006-10-28 20:48:25 UTC (rev 594) @@ -41,13 +41,14 @@ } pano_Tiff; + void getCropInformationFromTiff(TIFF *tif, CropInfo *c); void setCropInformationInTiff(TIFF *tiffFile, CropInfo *crop_info); int TiffGetImageParameters(TIFF *tiffFile, pt_tiff_parms *tiffData); int TiffSetImageParameters(TIFF *tiffFile, pt_tiff_parms *tiffData); -int panoTiffUnCrop(char *inputFile, char *outputFile); +int panoTiffUnCrop(char *inputFile, char *outputFile, pano_cropping_parms *croppingParms); int panoTiffCrop(char *inputFile, char *outputFile, pano_cropping_parms *croppingParms); int panoTiffGetCropInformation(pano_Tiff * file); Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tiff.c 2006-10-28 20:48:25 UTC (rev 594) @@ -1695,7 +1695,7 @@ * is encountered messageBuffer is filled with the message, and a non-zero * value is returned. If success, zero is returned */ -int panoTiffUnCrop(char *inputFile, char *outputFile) +int panoTiffUnCrop(char *inputFile, char *outputFile, pano_cropping_parms *croppingParms) { pano_CropInfo *inputCropInfo = NULL; @@ -1713,7 +1713,9 @@ if (!panoTiffIsCropped(tiffInput)) { PrintError("Source image is not a cropped tiff"); - goto error; + if (!croppingParms->forceProcessing) + goto error; + PrintError("Forced processing... continuing"); } inputCropInfo = &tiffInput->metadata.cropInfo; Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/Makefile.am 2006-10-28 20:48:25 UTC (rev 594) @@ -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 PTremap PTcrop +bin_PROGRAMS = panoinfo PToptimizer PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTremap PTcrop PTmasker +PTmasker_SOURCES = PTmasker.c +PTmasker_LDADD = -l${PANOLIB} -ltiff + PTblender_SOURCES = PTblender.c PTblender_LDADD = -l${PANOLIB} -ltiff Modified: trunk/libpano/tools/PTblender.c =================================================================== --- trunk/libpano/tools/PTblender.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTblender.c 2006-10-28 20:48:25 UTC (rev 594) @@ -42,23 +42,24 @@ #include "panorama.h" #include "PTcommon.h" #include "ColourBrightness.h" +#include "pttiff.h" +#define DEFAULT_PREFIX "blended%04d" #define PT_BLENDER_USAGE "PTblender [options] <tiffFiles>+\n\n"\ "Options:\n"\ - "\t-o <prefix>\tPrefix for output filename\n"\ + "\t-p <prefix>\tPrefix for output filename. Defaults to blended%%4d\n"\ "\t-k <index>\tIndex to image to use as a reference (0-based, defaults to 0)\n"\ "\t-t [0,1,2]\tType of colour correction: 0 full (default), 1 brightness only, 2 colour only\n"\ - "\t-q\t\tQuiet run\n"\ - "\t-h\t\tShow this message\n"\ "\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-q\t\tQuiet run\n"\ + "\t-h\t\tShow this message\n"\ "\n" #define PT_BLENDER_VERSION "PTblender Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" -#define DEFAULT_PREFIX "corrected%04d" -#define DEFAULT_PREFIX_NUMBER_FORMAT "%04d" int main(int argc,char *argv[]) { @@ -72,11 +73,10 @@ char *endPtr; int filesCount; char tempString[MAX_PATH_LENGTH]; - int i; int base = 0; int outputCurvesType = 0; // if 1 => create Photoshop curve files (.acv) int typeCorrection = 0; - int ptComputeSeams = 0; + int ptForceProcessing; ptrInputFiles = NULL; @@ -87,7 +87,7 @@ strcpy(outputPrefix, "corrected%4d"); - while ((opt = getopt(argc, argv, "o:k:t:hf:sqcm")) != -1) { + while ((opt = getopt(argc, argv, "p:k:t:fqcmh")) != -1) { // o and f -> set output file // h -> help @@ -95,11 +95,12 @@ // k -> base image, defaults to first switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 'o': + case 'p': if (strlen(optarg) < MAX_PATH_LENGTH) { strcpy(outputPrefix, optarg); } else { PrintError("Illegal length for output prefix"); + return -1; } break; case 'k': @@ -116,9 +117,8 @@ return -1; } break; - case 's': - ptComputeSeams = 1; - break; + case 'f': + ptForceProcessing = 1; case 'q': ptQuietFlag = 1; break; @@ -171,9 +171,8 @@ } if (referenceImage < 0 || referenceImage >= filesCount) { - sprintf(tempString, "Illegal reference image number %d. It should be between 0 and %d\n", + PrintError(tempString, "Illegal reference image number %d. It should be between 0 and %d\n", referenceImage, filesCount-1); - PrintError(tempString); return -1; } @@ -184,38 +183,25 @@ return -1; } } - - // Create output filename - - if (strchr(outputPrefix, '%') == NULL) { - strcat(outputPrefix, DEFAULT_PREFIX_NUMBER_FORMAT); + if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { + return -1; } - for (i =0; i< filesCount ; i++) { - char outputFilename[MAX_PATH_LENGTH]; - sprintf(outputFilename, outputPrefix, i); - - // Verify the filename is different from the prefix - if (strcmp(outputFilename, outputPrefix) == 0) { - PrintError("Invalid output prefix. It does not generate unique filenames."); + + if (!ptForceProcessing) { + char *temp; + if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { + PrintError("Output filename exists %d", temp); return -1; } - if (StringtoFullPath(&ptrOutputFiles[i], outputFilename) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); + if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("TIFFs are not compatible"); + return -1; } - panoReplaceExt(ptrOutputFiles[i].name, ".tif"); - - // fprintf(stderr, "Output filename [%s]\n", ptrOutputFiles[i].name); } - if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { - PrintError("TIFFs are not compatible"); - return -1; - } - if (! ptQuietFlag) printf("Colour correcting photo using %d as a base type %d\n", referenceImage, typeCorrection); ColourBrightness(ptrInputFiles, ptrOutputFiles, filesCount, referenceImage, typeCorrection, outputCurvesType); Modified: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTcrop.c 2006-10-28 20:48:25 UTC (rev 594) @@ -97,7 +97,7 @@ if (!overwrite) { if ((testFile = fopen(outputFile, "r"))!= NULL) { - fprintf(stderr, "Output file already exists. Use -o to overwrite\n"); + fprintf(stderr, "Output file already exists. Use -f to overwrite\n"); fclose(testFile); exit(1); } Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTmender.c 2006-10-28 20:48:25 UTC (rev 594) @@ -2,8 +2,6 @@ * PTmender * * Based on the program PTStitcher by Helmut Dersch. - * - * It is intended to duplicate the functionality of original program * * Dec 2005 * @@ -63,355 +61,11 @@ int main(int argc,char *argv[]) { - int ebx; - int inputFileCounter2; - char *script; - char *currentParm; - DIR *directory; - int sort=0; - int counter; - fullPath *ptrImageFileNames; - AlignInfo alignInfo; - char var36[512]; - fullPath scriptFileName; - fullPath panoFileName; - char opt; - - ptrImageFileNames = NULL; - counter = 0; - panoFileName.name[0] = 0; - scriptFileName.name[0] = 0; - printf(PT_MENDER_VERSION); + fprintf(stderr, "This program is deprecated. Please use PTremapper instead"); + exit(-1); - while ((opt = getopt(argc, argv, "o:f:hsqd")) != -1) { - -// o and f -> set output file -// h -> help? -// q -> quiet? -// s -> sort - - switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - - case 'o': // specifies output file name - if (StringtoFullPath(&panoFileName, optarg) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - break; - - case 'f': // specifies script name - if (StringtoFullPath(&scriptFileName,optarg) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - break; - - case 's': - sort = 1; - break; - - case 'd': - ptDebug = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - - case 'h': - PrintError("Usage: PTStitcher [options] file1 file2 ..."); - exit(1); - - default: - break; - } - } - - while (optind < argc ) { - currentParm = argv[optind]; - optind++; - // Test if it is a directory? - if ((directory = opendir(currentParm)) != NULL) { - char *edx; - struct dirent *dirEntry; - - ///* This is what readdir returns a pointer to - // struct dirent - // { - // long d_ino; /* inode number */ 0 - // off_t d_off; /* offset to this dirent */ 08( - // unsigned short d_reclen; /* length of this d_name */ 0c( - // char d_name [NAME_MAX+1]; /* file name (null-terminated) */ 0e( - // } - //*/ - - while ((dirEntry = readdir(directory)) != NULL) { - edx = dirEntry->d_name; - if (strcmp(dirEntry->d_name, ".") != 0 || strcmp(dirEntry->d_name, "..") != 0) { - strcpy(var36, currentParm); - - if (var36[strlen(var36)] == '/') { - // if the name has a trailing /, remove it - var36[strlen(var36)] = 0; - } - - sprintf(var36+ strlen(var36), "%c%s", '/', dirEntry->d_name); - - if (IsTextFile(var36)) { - if (StringtoFullPath(&scriptFileName,var36) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - } else { - // if it not a text file then assume it is an image - // Allocate one more slot - if ((ptrImageFileNames = realloc(ptrImageFileNames, ++counter * 512)) == NULL) { - PrintError("Not enough memory"); - exit(1); - } - - sort = 1; - /* move the new filename */ - if (StringtoFullPath(&ptrImageFileNames[counter], var36) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - } - } - - } - // if ((directory = opendir(currentParm)) != NULL) - } else if (IsTextFile(currentParm) == 0) { // checks if the file does not have .txt extension - // it is a assumed to be an image - 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); - } - } else { //It has to be textfile - if (StringtoFullPath(&scriptFileName, currentParm) !=0) { // success - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - } - } // end of while loop while (optind < argc ) { - - //;;;;;;;; While loop ends here - - // This code sets scriptFileName to "./Script.txt" if no other name was given - if (scriptFileName.name[0] == 0) { - char *temp; - - // set scriptFilename to default path './' - makePathToHost(&scriptFileName); - - // Then append/replace the filename - if ((temp = strrchr(scriptFileName.name, PATH_SEP)) != NULL) - temp++; - - strcpy(temp, "Script.txt"); - - if (ptDebug) - fprintf(stderr, "Using Script.txt by default\n"); - - } // end of if (scriptFileName[0] != 0) { - - // Prompt user to specify output filename if not set via command line - if (strlen(panoFileName.name) == 0) { - - // This is what todo if at this point we dont have a panorama filename - if (SaveFileAs(&panoFileName, "Save Panorama as... ", "pano") != 0) { - PrintError("No filename provided"); - exit(1); - } - - // So at this point we have script and panorama filenames - if (counter != 0) { - sort = 1; - } - } - - //Sort input file names if requested - if (counter != 0) { - if (sort != 0) - qsort(ptrImageFileNames, counter, 512, sorting_function); - } else { - // 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."); - exit(1); - } - - - // parse input script and set up an array of input file names - if (ParseScript(script, &alignInfo) == 0) { - counter = alignInfo.numIm; - if (counter != 0) { - if ((ptrImageFileNames = malloc(512 * counter)) == NULL) { - PrintError("Not enough memory"); - exit(1); - } - - //Iterate over input images and populate input filename array - for (ebx = 0; ebx < counter; ebx ++) { - //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. - if ( (hasPathInfo(alignInfo.im[ebx].name)) == 0 ) - strcpy(ptrImageFileNames[ebx].name, scriptFileName.name); - else - strcpy(ptrImageFileNames[ebx].name, ""); - - InsertFileName(&ptrImageFileNames[ebx], alignInfo.im[ebx].name); - if (ptDebug) { - fprintf(stderr, "Input image %d [%s]\n", ebx, ptrImageFileNames[ebx].name); - } - - } // for (ebx = 0; ebx < counter; ebx ++) - }// if (counter != 0) - - DisposeAlignInfo(&alignInfo); - } // if (ParseScript(script, &alignInfo) == 0) - - - //Copy script to temporary directory, reparse and populate input filename arrray - if (counter == 0) { - // Still no files ... TODO: determine conditions under which this logic is exercised - - // In the original program alignInfo is used as a fullPath - // I don't understand why, and instead I created a local variable - // to do it. - - fullPath scriptPathName; - FILE* scriptFD; - int temp; - - //an "o" line represents an input image - counter = numLines(script, 'o'); - - if (ptDebug) { - fprintf(stderr, "Processing %d counter images\n", counter); - } - - if (counter == 0) { - PrintError("No Input Images"); - exit(1); - } - - strcpy(scriptPathName.name, scriptFileName.name); - - if (panoFileMakeTemp(&scriptPathName) == 0) { - PrintError("Could not make Tempfile"); - exit(1); - } - - if ((scriptFD = fopen(scriptPathName.name, "w")) == NULL) { - PrintError("Could not open temporary Scriptfile"); - exit(1); - } - - temp = fwrite(script, 1, strlen(script), scriptFD); - - if (strlen(script) != temp) { - PrintError("Could not write temporary Scriptfile"); - exit(1); - } - - fclose(scriptFD); - - if ((ptrImageFileNames = malloc(counter * 512)) == NULL) { - PrintError("Not enough memory\n"); - exit(1); - } - - for (inputFileCounter2 = 0; inputFileCounter2 < counter; inputFileCounter2++) { - aPrefs* preferences; - - 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[inputFileCounter2].name, scriptFileName.name); - else - strcpy(ptrImageFileNames[inputFileCounter2].name, ""); - - InsertFileName(&ptrImageFileNames[inputFileCounter2], preferences->im.name); - - if (preferences->td != NULL) - free(preferences->td); - - if (preferences->ts != NULL) - free(preferences->ts); - - free(preferences); - - } // end of for (inputFileCounter2 = 0; inputFileCounter2 < counter; inputFileCounter2++) { - - remove(scriptPathName.name); - - if (counter == 0) { - PrintError("No Input Images"); - exit(1); - } - - } // if (counter == 0) - free(script); - - } - - if (ptDebug) { - fprintf(stderr, "Processing %d counter images\n", counter); - } - - // 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. - return panoCreatePanorama(ptrImageFileNames, counter, &panoFileName, &scriptFileName); - } -////////////////////////////////////////////////////////////////////// - -char* Filename(fullPath* path) -{ - char *temp; - if ((temp = strrchr(path->name, '/')) != NULL) { - temp++; - } else { - temp = path->name; - } - return temp; -} - - -int sorting_function(const void *p1, const void *p2) -{ - return strcmp(p1, p2); -} - - -int hasPathInfo(char *aName) -{ - return ((strchr(aName, PATH_SEP) == NULL) ? 0 : 1); -} Modified: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTroller.c 2006-10-28 20:48:25 UTC (rev 594) @@ -1,11 +1,11 @@ /* - * PTroller $id$ + * PTroller $Id$ * * Based on the program PTStitcher by Helmut Dersch. * - * Flattens a set of TIFFs into one TIFF + * Flattens a set of TIFFs into one TIFF * - * Jan 2006 + * Oct 2006 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public @@ -41,12 +41,14 @@ #include "panorama.h" #include "PTcommon.h" #include "ptstitch.h" +#include "pttiff.h" #define PT_ROLLER_USAGE "PTroller [options] <tiffFiles>+\n\n"\ "Options:\n"\ "\t-o <filename>\tOutput filename (defaults to merged.tif)\n"\ - "\t-s\t\tCompute stitching seams (default not)\n"\ - "\t-q\t\tQuiet run\n\t-h\t\tShow this message\n"\ + "\t-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_ROLLER_VERSION "PTroller Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel M German\n" @@ -61,12 +63,10 @@ int counter; char flatOutputFileName[MAX_PATH_LENGTH]; - char *endPtr; int filesCount; int base = 0; - int typeCorrection = 0; - int ptComputeSeams = 0; fullPath pathName; + int ptForceProcessing = 0; ptrInputFiles = NULL; @@ -76,7 +76,7 @@ strcpy(flatOutputFileName, DEFAULT_FILENAME); - while ((opt = getopt(argc, argv, "o:hqs")) != -1) { + while ((opt = getopt(argc, argv, "o:fqh")) != -1) { // o and f -> set output file // h -> help @@ -85,9 +85,6 @@ // s -> compute seams switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq - case 's': - ptComputeSeams = 1; - break; case 'o': if (strlen(optarg) < MAX_PATH_LENGTH) { strcpy(flatOutputFileName, optarg); @@ -95,13 +92,8 @@ PrintError("Illegal length for output filename"); } break; - case 't': - typeCorrection = strtol(optarg, &endPtr, 10); - if (errno != 0 || (typeCorrection < 0 || typeCorrection > 2)) { - PrintError("Invalid integer in -t option"); - return -1; - } - break; + case 'f': + ptForceProcessing = 1; case 'q': ptQuietFlag = 1; break; @@ -139,23 +131,25 @@ return -1; } - if (! ptQuietFlag) printf("Flattening image\n"); + if (StringtoFullPath(&pathName, flatOutputFileName) != 0) { + PrintError("Not a valid output filename"); + return(-1); + } + panoReplaceExt(pathName.name, ".tif"); - if (ptComputeSeams) { + if (!ptForceProcessing) { + // Verify if output file exists + char *temp; + if ((temp = panoFileExists(&pathName, 1)) != NULL) { + PrintError("Output filename exists %d", temp); + return -1; + } - if (! ptQuietFlag) printf("Computing seams for %d files\n", filesCount); - - if (panoStitchReplaceMasks(ptrInputFiles, ptrInputFiles, filesCount, - 0) != 0) { - PrintError("Could not create stitching masks"); + if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("Input files are not compatible"); return -1; } } - if (StringtoFullPath(&pathName, flatOutputFileName) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - panoReplaceExt(pathName.name, ".tif"); if (!panoFlattenTIFF(ptrInputFiles, filesCount, &pathName, FALSE)) { PrintError("Error while flattening TIFF-image"); Modified: trunk/libpano/tools/PTtiff2psd.c =================================================================== --- trunk/libpano/tools/PTtiff2psd.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTtiff2psd.c 2006-10-28 20:48:25 UTC (rev 594) @@ -50,7 +50,7 @@ "Options:\n"\ "\t-o <filename>\t\tOutput filename (default merged.psd)\n"\ "\t-b <blendingmode>\tSpecify blending mode for layers (see below)\n"\ - "\t-m\t\t\tAdd stitching mask\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"\ "\t-r\t\t\tReverse layers\n"\ @@ -68,16 +68,12 @@ fullPath *ptrInputFiles; int counter; fullPath outputFilename; - fullPath *tempFiles; int filesCount; int base = 0; - int forceOverwrite = 0; int reverseLayers = 0; - int addMask = 0; - int featherSize = 0; - int eraseTempFiles = 0; int i; int temp; + int ptForceProcessing = 0; pano_flattening_parms flatteningParms; @@ -109,8 +105,6 @@ } break; case 'b': - printf("Here\n"); - temp = strtol(optarg, &endPtr, 10); if (errno != 0 || (temp < 0 || temp >= PSD_NUMBER_BLENDING_MODES)) { PrintError("Invalid value in blending mode. Use -h to see possible values "); @@ -122,11 +116,8 @@ case 's': flatteningParms.stacked = 1; break; - case 'm': - addMask = 1; - break; case 'f': - forceOverwrite = 1; + ptForceProcessing = 1; break; case 'r': reverseLayers = 1; @@ -185,41 +176,17 @@ } // Check that all files are compatible - - if (filesCount > 1 && !panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { - PrintError("TIFFs are not compatible"); + if (filesCount == 1) { + PrintError("PTtiff2psd does not currently support one file only."); return -1; } - // Masks processing... - if (addMask) { - - if (!ptQuietFlag) { - Progress(_initProgress, "To add stitching mask"); - } - - // Find names for the temporary files - - tempFiles = calloc(filesCount, sizeof(fullPath)); - if (tempFiles == NULL) { - PrintError("Not enough memory"); + if (!ptForceProcessing) { + if (!panoTiffVerifyAreCompatible(ptrInputFiles, filesCount, TRUE)) { + PrintError("TIFFs are not compatible. Use -f to force processing"); return -1; } - for (i=0;i<filesCount;i++) { - strcpy(tempFiles[i].name, ptrInputFiles[0].name); - if (panoFileMakeTemp(&tempFiles[i]) == 0) { - PrintError("Could not make Tempfile"); - return -1; - } - } - if (panoStitchReplaceMasks(ptrInputFiles, tempFiles, filesCount, featherSize) != 0) { - PrintError("Unable to add stitching masks"); - return -1; - } - free(ptrInputFiles); - ptrInputFiles = tempFiles; - eraseTempFiles = 1; } // Finally create the PSD @@ -235,11 +202,6 @@ return -1; } - if (eraseTempFiles) { - for (i=0;i<filesCount; i++) - remove(ptrInputFiles[i].name); - } - free(ptrInputFiles); return 0; Modified: trunk/libpano/tools/PTuncrop.c =================================================================== --- trunk/libpano/tools/PTuncrop.c 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/tools/PTuncrop.c 2006-10-28 20:48:25 UTC (rev 594) @@ -26,7 +26,7 @@ #define PT_UNCROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n"\ "Options:\n"\ - "-o\t\tOverwrite output file if it exists\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" @@ -46,25 +46,24 @@ int main(int argc,char *argv[]) { char opt; - int overwrite = 0; int filesCount; - int retVal; char *inputFile, *outputFile; FILE *testFile; + int ptForceProcessing = 0; + pano_cropping_parms cropParms; + - //Need enough space for a message to be returned if something goes wrong - printf(PT_UNCROP_VERSION); - while ((opt = getopt(argc, argv, "ohq")) != -1) { + 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 'o': - overwrite = 1; + case 'f': + ptForceProcessing = 1; break; case 'q': ptQuietFlag = 1; @@ -86,15 +85,20 @@ inputFile = argv[optind]; outputFile = argv[optind+1]; - if (!overwrite) { + if (!ptForceProcessing) { if ((testFile = fopen(outputFile, "r"))!= NULL) { - fprintf(stderr, "Output file already exists. Use -o to overwrite\n"); + fprintf(stderr, "Output file already exists. Use -f to overwrite\n"); fclose(testFile); exit(1); } } - if (panoTiffUnCrop(inputFile, outputFile)) + // prepare cropping parms + + bzero(&cropParms, sizeof(cropParms)); + cropParms.forceProcessing = ptForceProcessing; + + if (panoTiffUnCrop(inputFile, outputFile, &cropParms)) return 0; Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-10-28 18:15:22 UTC (rev 593) +++ trunk/libpano/version.h 2006-10-28 20:48:25 UTC (rev 594) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre13 " +#define VERSION "2.8.5pre14 " #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-10-28 21:25:21
|
Revision: 595 http://svn.sourceforge.net/panotools/?rev=595&view=rev Author: dmg Date: 2006-10-28 14:25:19 -0700 (Sat, 28 Oct 2006) Log Message: ----------- Updated README Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/README Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-28 20:48:25 UTC (rev 594) +++ trunk/libpano/ChangeLog 2006-10-28 21:25:19 UTC (rev 595) @@ -1,5 +1,7 @@ 2006-10-28 dmg <dm...@uv...> + * README: Updated it. + * version.h (VERSION), configure.ac: Upgraded to version 2.8.5pre14 * tools/PTtiff2psd.c: Add -f force processing option. Cleaned up. Modified: trunk/libpano/README =================================================================== --- trunk/libpano/README 2006-10-28 20:48:25 UTC (rev 594) +++ trunk/libpano/README 2006-10-28 21:25:19 UTC (rev 595) @@ -1,3 +1,4 @@ + This is the pano12 library, part of the Panorama Tools by Helmut Dersch of the University of Applied Sciences Furtwangen. @@ -8,6 +9,29 @@ - tools/PTOptimizer, a command-line tool for optimizing control points. - tools/panoinfo, a command-line tool for querying the library version. +Usage +---- + +The typical workflow would be: + +- PTremap maps the pano files, outputs cropped TIFFS +- PTblender* fixes colour shifts in TIFFs, outputs cropped TIFFS (8 bit only) +- PTmasker* creates stitching masks in TIFFs, outputs cropped TIFFS +- PTroller creates a single TIFF from set of TIFFs +- PTcrop recropps a TIFF to a tight bounding box, creates a cropped TIFF + +* Optional step. + +Other tools: + +- PTtiff2psd Combines a set of tiffs into one PSD file with multiple + layers (including stacking feature) and the ability to + specify blending mode (8 bit only) + +- PTuncrop Uncrops a cropped TIFF. + + + Installation ------------ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-11-02 20:50:21
|
Revision: 597 http://svn.sourceforge.net/panotools/?rev=597&view=rev Author: dmg Date: 2006-11-02 12:49:56 -0800 (Thu, 02 Nov 2006) Log Message: ----------- updated the TODO with a list of bugs Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-10-28 21:30:35 UTC (rev 596) +++ trunk/libpano/ChangeLog 2006-11-02 20:49:56 UTC (rev 597) @@ -1,3 +1,7 @@ +2006-11-02 dmg <dm...@uv...> + + * TODO (KNOWN BUGS): Create a section with list of bugs + 2006-10-28 dmg <dm...@uv...> * README: Updated it. Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-10-28 21:30:35 UTC (rev 596) +++ trunk/libpano/TODO 2006-11-02 20:49:56 UTC (rev 597) @@ -2,8 +2,25 @@ This file documents the activities required before we release version 3.0.0 of the library. +KNOWN BUGS: + ---------------------------------------------------------------------- +1. PTcrop tries to read the entire image at once. I got a segfault + from inside libtiff. It needs to be rewritten to read only one line + at a time. +2. PTcrop needs to be able to crop images as a "set" (that is, compute + the bounding rectangle of a group of images) not only as a single + one. + +3. PTroller runs _extremely_ slow. I need to find out why. + +4. 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" + + * 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 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jim...@us...> - 2006-11-13 06:33:42
|
Revision: 598 http://svn.sourceforge.net/panotools/?rev=598&view=rev Author: jim0watters Date: 2006-11-12 22:33:23 -0800 (Sun, 12 Nov 2006) Log Message: ----------- Updated to build with MSVC project file. Fixed build errors and warnings. increased version to 2.8.5pre15 Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/filter.h trunk/libpano/libpano.vcproj trunk/libpano/pano12vc.def trunk/libpano/ptstitch.c trunk/libpano/rgbe.c trunk/libpano/rgbe.h trunk/libpano/tiff.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/ChangeLog 2006-11-13 06:33:23 UTC (rev 598) @@ -1,3 +1,21 @@ +2006-11-12 Jim <jwa...@ph...> + + * Updated MSVC project file to build current version. Add files. + + * file.c fixed compile warnings. Moved macros for file BIGENDIAN/LITTLEENDIAN i/o to + filter.h + + * filter.h Moved macros for file BIGENDIAN/LITTLEENDIAN i/o from file.c. + Commented out no longer used funtions in Windows. Still used in pict.c for Mac. + + * pano12vc.def updated with new funtions and commented out old + * pano12vcd.def removed file + + * tiff.c fix compile error unknown size void* + + * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre15 (configure.ac changes + untested) + 2006-11-02 dmg <dm...@uv...> * TODO (KNOWN BUGS): Create a section with list of bugs Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/PTcommon.c 2006-11-13 06:33:23 UTC (rev 598) @@ -37,8 +37,8 @@ #include "ptstitch.h" #include <assert.h> +#include <float.h> - //#include <stdio.h> //#include <stdlib.h> //#include <sys/types.h> @@ -607,11 +607,11 @@ //a value of "-1.#IND00". This is not a number, and probably indicates //a divide by zero error somewhere in the mapping function. This should //be solved, but, for now, discard this value and keep going - if (!isnan(Dx)) { + if (!_isnan(Dx)) { if ((int)Dx < ROIRect->left) ROIRect->left = (int)Dx; if ((int)Dx > ROIRect->right) ROIRect->right = (int)Dx; } - if (!isnan(Dy)){ + if (!_isnan(Dy)){ if ((int)Dy < ROIRect->top) ROIRect->top = (int)Dy; if ((int)Dy > ROIRect->bottom) ROIRect->bottom = (int)Dy; } Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/configure.ac 2006-11-13 06:33:23 UTC (rev 598) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre14], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre15], 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-02 20:49:56 UTC (rev 597) +++ trunk/libpano/file.c 2006-11-13 06:33:23 UTC (rev 598) @@ -55,24 +55,6 @@ #include "file.h" #include "pttiff.h" -#define WRITEUCHAR( theChar ) ch = theChar; count = 1; mywrite(fnum,count,&ch); - -#define WRITESHORT( theShort ) svar = theShort; d = data; SHORTNUMBER( svar, d ); \ - count = 2; mywrite (fnum,count,data); - -#define WRITEINT32( theLong ) var = theLong; d = data; LONGNUMBER( var, d ); \ - count = 4; mywrite (fnum,count,data); - -#define READINT32( theLong ) count = 4; myread(src,count,data); \ - d = data; NUMBERLONG( var, d ); \ - theLong = var; - -#define READSHORT( theShort ) count = 2; myread(src,count,data); \ - d = data; NUMBERSHORT( svar, d ); \ - theShort = svar; - -#define READUCHAR( theChar ) count = 1; myread(src,count,&ch); theChar = ch; - // local functions static int writeImageDataPlanar ( Image *im, file_spec fnum ); @@ -137,35 +119,50 @@ int panoPSDResourceWrite(file_spec fnum, pt_uint16 resource, pt_uint16 len) { + int rtn = 0; unsigned char ch; size_t count; short svar; char data[12], *d; pt_uint32 var; - WRITEUCHAR( '8' ); - WRITEUCHAR( 'B' ); - WRITEUCHAR( 'I' ); - WRITEUCHAR( 'M' ); - WRITESHORT(resource); - WRITEINT32(0); // Null string - WRITESHORT(len); //size of the record + WRITEUCHAR( '8' ); + rtn += count; + WRITEUCHAR( 'B' ); + rtn += count; + WRITEUCHAR( 'I' ); + rtn += count; + WRITEUCHAR( 'M' ); + rtn += count; + WRITESHORT(resource); + rtn += count; + WRITEINT32(0); // Null string + rtn += count; + WRITESHORT(len); //size of the record + rtn += count; + return rtn; } int panoPSDPICTResourceWrite(file_spec fnum, unsigned char resource, unsigned char record, pt_uint16 len) { // See IPTC Information Intercharge Model Exchange Version 4. - + int rtn = 0; unsigned char ch; size_t count; - short svar; + short svar = 0; char data[12], *d; - pt_uint32 var; + pt_uint32 var = 0; WRITEUCHAR( 0x1c ); + rtn += count; WRITEUCHAR( resource ); + rtn += count; WRITEUCHAR( record ); + rtn += count; WRITESHORT( len ); //length + rtn += count; + + return rtn; } #define CREATED_BY_PSD "Panotools " VERSION @@ -175,12 +172,13 @@ int panoPSDResourcesBlockWrite(Image *im, file_spec fnum) { + int rtn = 0; char data[12], *d; - short svar; + short svar = 0; size_t count; pt_uint32 var; - unsigned char ch; - pt_uint16 shorty; + unsigned char ch = 0; + pt_uint16 shorty = 0; pt_uint32 len = 0; pt_uint16 fileInfoLength = 0; @@ -207,24 +205,29 @@ len += shorty + 12; // size of fileinfo records + 12 overhead WRITEINT32( len ); // Image Resources size + rtn += count; // Write FILEinfo - panoPSDResourceWrite(fnum, 0x0404, shorty); + rtn += panoPSDResourceWrite(fnum, 0x0404, shorty); // write version - panoPSDPICTResourceWrite(fnum, 0x02, IPTC_VERSION_ID, 2); + rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_VERSION_ID, 2); WRITEUCHAR( 00 ); + rtn += count; WRITEUCHAR( 02 ); + rtn += count; // write originating program - panoPSDPICTResourceWrite(fnum, 0x02, IPTC_DESCRIPTION_WRITER_ID, strlen(CREATED_BY_PSD) + 1); + rtn += panoPSDPICTResourceWrite(fnum, 0x02, IPTC_DESCRIPTION_WRITER_ID, strlen(CREATED_BY_PSD) + 1); WRITEUCHAR(strlen(CREATED_BY_PSD)); + rtn += count; len = strlen(CREATED_BY_PSD); mywrite( fnum, len, CREATED_BY_PSD); + rtn += len; // TODO: // caption abstract: 0x78 "script... (2000 bytes max) @@ -241,12 +244,13 @@ // We need to write an image Resources block // Write Image resources header // Write ICC Profile block - panoPSDResourceWrite(fnum, 0x040f, im->metadata.iccProfile.size); + rtn += panoPSDResourceWrite(fnum, 0x040f, im->metadata.iccProfile.size); mywrite( fnum, im->metadata.iccProfile.size, im->metadata.iccProfile.data ); + rtn += im->metadata.iccProfile.size; } - + return rtn; } @@ -1394,6 +1398,8 @@ unsigned char **alpha = NULL, **buf = NULL; int hasClipMask = 0; // Create a mask int hasShapeMask = 0; // Create alpha channel + char * blendingModeKey; + int j; GetChannels( im, channels ); psdchannels = channels; @@ -1616,19 +1622,15 @@ WRITEUCHAR( 'B' ); WRITEUCHAR( 'I' ); WRITEUCHAR( 'M' ); - - + // the next 4 bytes are the blending mode key + /* WRITEINT32( 'norm'); // Blend mode key */ + assert(PSD_NUMBER_BLENDING_MODES == sizeof(psdBlendingModesNames)/sizeof(char*)); + assert(sizeof(psdBlendingModesNames) == sizeof(psdBlendingModesInternalName)); + blendingModeKey = psdBlendingModesInternalName[sB->psdBlendingMode]; + for (j = 0; j< 4; j++ ) { - // the next 4 bytes are the blending mode key - // WRITEINT32( 'norm'); // Blend mode key - assert(PSD_NUMBER_BLENDING_MODES == sizeof(psdBlendingModesNames)/sizeof(char*)); - assert(sizeof(psdBlendingModesNames) == sizeof(psdBlendingModesInternalName)); - char *blendingModeKey = psdBlendingModesInternalName[sB->psdBlendingMode]; - int j; - for (j = 0; j< 4; j++ ) { - WRITEUCHAR(blendingModeKey[j]); - } + WRITEUCHAR(blendingModeKey[j]); } WRITEUCHAR(sB->psdOpacity); // 1 byte Opacity 0 = transparent ... 255 = opaque @@ -2413,7 +2415,6 @@ } for (i =0; i< filesCount ; i++) { - char outputFilename[MAX_PATH_LENGTH]; sprintf(outputFilename, outputPrefix, i); Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/filter.h 2006-11-13 06:33:23 UTC (rev 598) @@ -647,16 +647,20 @@ int StringtoFullPath (fullPath *path, char *filename); int IsTextFile ( char* fname ); int readPositions ( char* script, transformCoord *tP ); -int readImage ( Image *im, fullPath *sfile ); int readJPEG ( Image *im, fullPath *sfile ); int readTIFF ( Image *im, fullPath *sfile ); -int writeImage ( Image *im, fullPath *sfile ); int writeJPEG ( Image *im, fullPath *sfile, int quality, int progressive ); -int makeTempPath ( fullPath *path ); int writePNG ( Image *im, fullPath *sfile ); int readPNG ( Image *im, fullPath *sfile ); int LaunchAndSendScript(char* application, char* script); aPrefs* readAdjustLine( fullPath *theScript ); + +#ifdef __Mac__ + int readImage ( Image *im, fullPath *sfile ); + int writeImage ( Image *im, fullPath *sfile ); + int makeTempPath ( fullPath *path ); +#endif + //int readtif(Image *im, TIFF* tif); void getCropInformation(char *filename, CropInfo *c); @@ -898,6 +902,24 @@ #endif // PT_BIGENDIAN +#define WRITEUCHAR( theChar ) ch = theChar; count = 1; mywrite(fnum,count,&ch); + +#define WRITESHORT( theShort ) svar = theShort; d = data; SHORTNUMBER( svar, d ); \ + count = 2; mywrite (fnum,count,data); + +#define WRITEINT32( theLong ) var = theLong; d = data; LONGNUMBER( var, d ); \ + count = 4; mywrite (fnum,count,data); + +#define READINT32( theLong ) count = 4; myread(src,count,data); \ + d = data; NUMBERLONG( var, d ); \ + theLong = var; + +#define READSHORT( theShort ) count = 2; myread(src,count,data); \ + d = data; NUMBERSHORT( svar, d ); \ + theShort = svar; + +#define READUCHAR( theChar ) count = 1; myread(src,count,&ch); theChar = ch; + // Cross platform file functions #ifdef __Mac__ Modified: trunk/libpano/libpano.vcproj =================================================================== --- trunk/libpano/libpano.vcproj 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/libpano.vcproj 2006-11-13 06:33:23 UTC (rev 598) @@ -2,7 +2,7 @@ <VisualStudioProject ProjectType="Visual C++" Version="7.10" - Name="Panotools" + Name="2 Panotools" ProjectGUID="{9B19A5C0-8DB0-448B-BF99-DC6374E9751B}" RootNamespace="Panotools" Keyword="MakeFileProj"> @@ -26,6 +26,8 @@ PreprocessorDefinitions="WIN32;__Win__;HasJava" RuntimeLibrary="2" StructMemberAlignment="4" + ObjectFile="$(IntDir)/" + ProgramDataBaseFileName="$(IntDir)/vc70.pdb" WarningLevel="3" Detect64BitPortabilityProblems="FALSE" DebugInformationFormat="0" @@ -52,7 +54,8 @@ <Tool Name="VCMIDLTool"/> <Tool - Name="VCPostBuildEventTool"/> + Name="VCPostBuildEventTool" + CommandLine="copy "$(OutDir)\pano12.dll" "c:\windows\system32\pano12.dll" /y"/> <Tool Name="VCPreBuildEventTool"/> <Tool @@ -84,6 +87,8 @@ PreprocessorDefinitions="WIN32;__Win__;HasJava" RuntimeLibrary="3" StructMemberAlignment="4" + ObjectFile="$(IntDir)/" + ProgramDataBaseFileName="$(IntDir)/vc70.pdb" WarningLevel="3" Detect64BitPortabilityProblems="FALSE" DebugInformationFormat="3" @@ -95,11 +100,11 @@ <Tool Name="VCLinkerTool" AdditionalDependencies="wxtiffd.lib wxzlibd.lib wxjpegd.lib wxpngd.lib" - OutputFile="$(OutDir)/pano12d.dll" + OutputFile="$(OutDir)/pano12.dll" AdditionalLibraryDirectories=""$(WXWIDGETS_HOME)\lib\vc_lib"" IgnoreAllDefaultLibraries="FALSE" IgnoreDefaultLibraryNames="" - ModuleDefinitionFile="pano12vcd.def" + ModuleDefinitionFile="pano12vc.def" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb" EntryPointSymbol="" @@ -108,7 +113,8 @@ <Tool Name="VCMIDLTool"/> <Tool - Name="VCPostBuildEventTool"/> + Name="VCPostBuildEventTool" + CommandLine="copy "$(OutDir)\pano12.dll" "c:\windows\system32\pano12.dll" /y"/> <Tool Name="VCPreBuildEventTool"/> <Tool @@ -136,168 +142,576 @@ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File - RelativePath=".\adjust.c"> + 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> </File> <File - RelativePath=".\bmp.c"> + 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> </File> <File - RelativePath=".\ColourBrightness.c"> + 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> </File> <File - RelativePath=".\correct.c"> + 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> </File> <File - RelativePath=".\fftn.c"> + 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> </File> <File - RelativePath=".\file.c"> + 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> </File> <File - RelativePath=".\filter.c"> + 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> </File> <File - RelativePath=".\fourier.c"> + 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> </File> <File - RelativePath=".\hdrfile.c"> + 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> </File> <File - RelativePath=".\jpeg.c"> + 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> </File> <File - RelativePath=".\lmdif.c"> + RelativePath="jpegicc.c"> </File> <File - RelativePath=".\math.c"> + 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> </File> <File - RelativePath=".\morpher.c"> + 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> </File> <File - RelativePath=".\multilayer.c"> + RelativePath="metadata.c"> </File> <File - RelativePath=".\optimize.c"> + 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> </File> <File - RelativePath=".\pan.c"> + 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> </File> <File - RelativePath=".\parser.c"> + 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> </File> <File - RelativePath=".\perspect.c"> + 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> </File> <File - RelativePath=".\png.c"> + 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> </File> <File - RelativePath=".\PTcommon.c"> + 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> </File> <File - RelativePath=".\PTDialogs.c"> + 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> </File> <File + RelativePath="ppm.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> + </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> + </File> + <File RelativePath=".\pteditor.c"> </File> <File RelativePath=".\ptpicker.c"> </File> <File - RelativePath=".\queryfeature.c"> + RelativePath=".\ptstitch.c"> </File> <File - RelativePath=".\remap.c"> + 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> </File> <File - RelativePath=".\resample.c"> + 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> </File> <File - RelativePath=".\rgbe.c"> + 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> </File> <File - RelativePath=".\seamer.c"> + 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> </File> <File - RelativePath=".\sys_common.c"> + 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> </File> <File - RelativePath=".\sys_win.c"> + 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> </File> <File - RelativePath=".\tiff.c"> + 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> </File> <File - RelativePath=".\Triangulate.c"> + 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> </File> <File - RelativePath=".\ZComb.c"> + 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> </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> + </File> </Filter> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> <File - RelativePath=".\ColourBrightness.h"> + RelativePath="adjust.h"> </File> <File - RelativePath=".\f2c.h"> + RelativePath="ColourBrightness.h"> </File> <File - RelativePath=".\fftn.h"> + RelativePath="f2c.h"> </File> <File - RelativePath=".\filter.h"> + RelativePath="fftn.h"> </File> <File - RelativePath=".\panorama.h"> + RelativePath="file.h"> </File> <File - RelativePath=".\pt_stdint.h"> + RelativePath="filter.h"> </File> <File - RelativePath=".\PTcommon.h"> + RelativePath="jpegicc.h"> </File> <File - RelativePath=".\pteditor.h"> + RelativePath="metadata.h"> </File> <File - RelativePath=".\ptutils.h"> + RelativePath="panorama.h"> </File> <File - RelativePath=".\resource.h"> + RelativePath="panotypes.h"> </File> <File - RelativePath=".\rgbe.h"> + RelativePath="pt_stdint.h"> </File> <File - RelativePath=".\seamer.h"> + RelativePath="PTcommon.h"> </File> <File - RelativePath=".\sys_win.h"> + RelativePath="pttiff.h"> </File> <File - RelativePath=".\version.h"> + RelativePath="ptutils.h"> </File> <File - RelativePath=".\ZComb.h"> + RelativePath="queryfeature.h"> </File> + <File + RelativePath="rgbe.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=".\pano12.rc"> + RelativePath=".\Authors"> </File> <File - RelativePath=".\pano12vc.def"> + RelativePath=".\ChangeLog"> </File> <File - RelativePath=".\pano12vcd.def"> + RelativePath=".\News"> </File> + <File + RelativePath="pano12.rc"> + </File> + <File + RelativePath="pano12vc.def"> + </File> + <File + RelativePath=".\Readme"> + </File> + <File + RelativePath=".\Todo"> + </File> </Filter> </Files> <Globals> Modified: trunk/libpano/pano12vc.def =================================================================== --- trunk/libpano/pano12vc.def 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/pano12vc.def 2006-11-13 06:33:23 UTC (rev 598) @@ -74,10 +74,10 @@ FindFile @70 DisposeAlignInfo @71 showScript @72 - readImage @73 - writeImage @74 +; readImage @73 +; writeImage @74 writeJPEG @75 - makeTempPath @76 +; makeTempPath @76 MorphImageFile @77 blendImages @78 InterpolateImageFile @79 @@ -174,6 +174,20 @@ queryFeatureString @171 PT_setProgressFcn @172 PT_setInfoDlgFcn @173 - PT_setErrorFcn @174 - execute_stack_new @175 - + PT_setErrorFcn @174 + execute_stack_new @175 + InsertFileName @176 +; VerifyTiffsAreCompatible @177 +; AddStitchingMasks @178 +; FlattenTIFF @179 +; CreatePSD @180 +; CreatePanorama @181 + ptQuietFlag @182 +; ReplaceExt @183 + ColourBrightness @184 +; TiffSetImageParameters @185 +; TiffGetImageParameters @186 + getCropInformationFromTiff @187 + setCropInformationInTiff @188 + writeCroppedTIFF @189 + dieWithError @190 Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/ptstitch.c 2006-11-13 06:33:23 UTC (rev 598) @@ -50,8 +50,10 @@ pixel16 = (uint16_t *) ptr; return *(pixel16+channel); } - else + else { assert(0); + return 0;// fix warning. + } } Modified: trunk/libpano/rgbe.c =================================================================== --- trunk/libpano/rgbe.c 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/rgbe.c 2006-11-13 06:33:23 UTC (rev 598) @@ -225,7 +225,7 @@ } -int RGBE_ReadPixels_Raw(FILE *fp, unsigned char *data, int numpixels) +int RGBE_ReadPixels_Raw(FILE *fp, unsigned char *data, size_t numpixels) { if (fread(data, 4, numpixels, fp) < numpixels) return rgbe_error(rgbe_read_error,NULL); @@ -427,7 +427,7 @@ int RGBE_ReadPixels_Raw_RLE(FILE *fp, unsigned char *data, int scanline_width, - int num_scanlines) + size_t num_scanlines) { unsigned char rgbe[4], *scanline_buffer, *ptr, *ptr_end; int i, count; Modified: trunk/libpano/rgbe.h =================================================================== --- trunk/libpano/rgbe.h 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/rgbe.h 2006-11-13 06:33:23 UTC (rev 598) @@ -51,7 +51,7 @@ int num_scanlines); int RGBE_ReadPixels_Raw_RLE(FILE *fp, unsigned char *data, int scanline_width, - int num_scanlines); + size_t num_scanlines); #ifdef _CPLUSPLUS /* define if your compiler understands inline commands */ Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/tiff.c 2006-11-13 06:33:23 UTC (rev 598) @@ -779,7 +779,7 @@ if (panoTiffRowInsideROI(file, row)) { if (TIFFReadScanline - (file->tiff, buffer + panoTiffXOffset(file) * bytesPerPixel, + (file->tiff, (UCHAR *)(buffer) + panoTiffXOffset(file) * bytesPerPixel, row - panoTiffYOffset(file), 0) != 1) { PrintError("Error reading row %d in tiff file", row); return FALSE; @@ -810,7 +810,7 @@ if (panoTiffRowInsideROI(file, row)) { if (TIFFWriteScanline - (file->tiff, buffer + panoTiffXOffset(file) * bytesPerPixel, + (file->tiff, (UCHAR *)(buffer) + panoTiffXOffset(file) * bytesPerPixel, row - panoTiffYOffset(file), 0) != 1) { PrintError("Error writing row %d in tiff file", row); return FALSE; Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-02 20:49:56 UTC (rev 597) +++ trunk/libpano/version.h 2006-11-13 06:33:23 UTC (rev 598) @@ -63,5 +63,9 @@ #define PTVERSION_NAME_COMMENT "Comments" #endif #ifndef PTVERSION_COMMENT -#define PTVERSION_COMMENT "MinGW\0" +# ifdef _MSC_VER +# define PTVERSION_COMMENT "MSVC\0" +# else +# define PTVERSION_COMMENT "MinGW\0" +# endif #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jim...@us...> - 2006-11-15 06:28:49
|
Revision: 599 http://svn.sourceforge.net/panotools/?rev=599&view=rev Author: jim0watters Date: 2006-11-14 22:28:49 -0800 (Tue, 14 Nov 2006) Log Message: ----------- created file i/o functions with error checking to replace macro. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/filter.c trunk/libpano/filter.h trunk/libpano/jpeg.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-13 06:33:23 UTC (rev 598) +++ trunk/libpano/ChangeLog 2006-11-15 06:28:49 UTC (rev 599) @@ -1,3 +1,7 @@ +2006-11-15 Jim <jwa...@ph...> + + * filter.h, filter.cpp created file i/o funtions with error checking to replace macro. + 2006-11-12 Jim <jwa...@ph...> * Updated MSVC project file to build current version. Add files. Modified: trunk/libpano/filter.c =================================================================== --- trunk/libpano/filter.c 2006-11-13 06:33:23 UTC (rev 598) +++ trunk/libpano/filter.c 2006-11-15 06:28:49 UTC (rev 599) @@ -1265,3 +1265,67 @@ printf("**EndMetadata***%s\n", message); } + +/* ENDIAN aware file i/o funtions. Used for reading and writing photoshop files */ +BOOL panoWriteUCHAR(file_spec fnum, UCHAR theChar ) +{ + size_t count = 1; + mywrite( fnum, count, &theChar ); + return(count == 1); +} + +BOOL panoWriteSHORT(file_spec fnum, USHORT theShort ) +{ + size_t count = 2; + char data[2], *d; + d = data; + SHORTNUMBER( theShort, d ); + mywrite( fnum, count, data ); + return(count == 2); +} + +BOOL panoWriteINT32(file_spec fnum, ULONG theLong ) +{ + size_t count = 4; + char data[4], *d; + d = data; + LONGNUMBER( theLong, d ); + mywrite( fnum, count, data ); + return(count == 4); +} + +BOOL panoReadUCHAR(file_spec fnum, UCHAR *pChar ) +{ + size_t count = 1; + myread( fnum, count, pChar ); + return (count == 1); +} + +BOOL panoReadSHORT(file_spec fnum, USHORT *pShort ) +{ + size_t count = 2; + char data[2], *d; + myread( fnum, count, data ); + if(count != 2) + { + return FALSE; + } + d = data; + NUMBERSHORT( (*pShort), d ); + return TRUE; +} + +BOOL panoReadINT32(file_spec fnum, ULONG *pLong ) +{ + size_t count = 4; + char data[4], *d; + myread( fnum, count, data ); + if(count != 4) + { + return FALSE; + } + d = data; + NUMBERLONG( (*pLong), d ); + return TRUE; +} + Modified: trunk/libpano/filter.h =================================================================== --- trunk/libpano/filter.h 2006-11-13 06:33:23 UTC (rev 598) +++ trunk/libpano/filter.h 2006-11-15 06:28:49 UTC (rev 599) @@ -655,7 +655,7 @@ int LaunchAndSendScript(char* application, char* script); aPrefs* readAdjustLine( fullPath *theScript ); -#ifdef __Mac__ +#if 1 //def __Mac__ int readImage ( Image *im, fullPath *sfile ); int writeImage ( Image *im, fullPath *sfile ); int makeTempPath ( fullPath *path ); @@ -902,6 +902,7 @@ #endif // PT_BIGENDIAN +//TODO: JMW These File i/o macros are to be replaced in code with the error catching functions below #define WRITEUCHAR( theChar ) ch = theChar; count = 1; mywrite(fnum,count,&ch); #define WRITESHORT( theShort ) svar = theShort; d = data; SHORTNUMBER( svar, d ); \ @@ -968,6 +969,14 @@ #endif +/* ENDIAN aware file i/o funtions. Used for reading and writing photoshop files */ +BOOL panoWriteUCHAR(file_spec fnum, UCHAR theChar ); +BOOL panoWriteSHORT(file_spec fnum, USHORT theShort ); +BOOL panoWriteINT32(file_spec fnum, ULONG theLong ); +BOOL panoReadUCHAR (file_spec fnum, UCHAR *pChar ); +BOOL panoReadSHORT (file_spec fnum, USHORT *pShort ); +BOOL panoReadINT32 (file_spec fnum, ULONG *pLong ); + #define PANO_DEFAULT_PIXELS_PER_RESOLUTION 150.0 #define PANO_DEFAULT_TIFF_RESOLUTION_UNITS RESUNIT_INCH Modified: trunk/libpano/jpeg.c =================================================================== --- trunk/libpano/jpeg.c 2006-11-13 06:33:23 UTC (rev 598) +++ trunk/libpano/jpeg.c 2006-11-15 06:28:49 UTC (rev 599) @@ -1,6 +1,6 @@ #include <stdio.h> #include <jpeglib.h> -#define __NO_SYSTEM__ +//#define __NO_SYSTEM__ #include "filter.h" #include "metadata.h" #include "file.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-11-18 03:50:14
|
Revision: 600 http://svn.sourceforge.net/panotools/?rev=600&view=rev Author: dmg Date: 2006-11-17 19:50:15 -0800 (Fri, 17 Nov 2006) Log Message: ----------- 2006-11-17 dmg <dm...@uv...> * panorama.h: Created Boolean data type (unsigned char) * filter.c, filter.h (panoWrite*, panoRead*): Simplified the functions, got rid of mywrite, replaced BOOL with Boolean Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/filter.c trunk/libpano/filter.h trunk/libpano/panorama.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-15 06:28:49 UTC (rev 599) +++ trunk/libpano/ChangeLog 2006-11-18 03:50:15 UTC (rev 600) @@ -1,10 +1,17 @@ +2006-11-17 dmg <dm...@uv...> + + * panorama.h: Created Boolean data type (unsigned char) + + * filter.c, filter.h (panoWrite*, panoRead*): Simplified the + functions, got rid of mywrite, replaced BOOL with Boolean + 2006-11-15 Jim <jwa...@ph...> - * filter.h, filter.cpp created file i/o funtions with error checking to replace macro. + * filter.h, filter.cpp created file i/o funtions with error checking to replace macro. 2006-11-12 Jim <jwa...@ph...> - * Updated MSVC project file to build current version. Add files. + * Updated MSVC project file to build current version. Add files. * file.c fixed compile warnings. Moved macros for file BIGENDIAN/LITTLEENDIAN i/o to filter.h Modified: trunk/libpano/filter.c =================================================================== --- trunk/libpano/filter.c 2006-11-15 06:28:49 UTC (rev 599) +++ trunk/libpano/filter.c 2006-11-18 03:50:15 UTC (rev 600) @@ -1,4 +1,4 @@ -/* Panorama_Tools - Generate, Edit and Convert Panoramic Images +/* Panorama_Tools - Generate, Edit and Convert Panoramic Images Copyright (C) 1998,1999 - Helmut Dersch de...@fh... This program is free software; you can redistribute it and/or modify @@ -20,7 +20,7 @@ // Program specific includes -#include "filter.h" +#include "filter.h" // Standard C includes @@ -44,244 +44,244 @@ // These globals are only used and valid during dialog set-up! -TrformStr *gTrPtr; -sPrefs *gsPrPtr; +TrformStr *gTrPtr; +sPrefs *gsPrPtr; void dispatch (TrformStr *TrPtr, sPrefs *spref) { - panoPrefs prefs, *prPtr; - char version[10]; - + panoPrefs prefs, *prPtr; + char version[10]; + - if( TrPtr->src->bitsPerPixel != 32 && TrPtr->src->bitsPerPixel != 24 && - TrPtr->src->bitsPerPixel != 64 && TrPtr->src->bitsPerPixel != 48 && - TrPtr->src->bitsPerPixel != 128 && TrPtr->src->bitsPerPixel != 96) // Only support 3/4 byte/short pixels - { - PrintError( "Please convert image to 24/32/48/64/96/128 bit pixelsize."); - PrintError( "Pixelsize is now %d", (int)TrPtr->src->bitsPerPixel ); - TrPtr->success = 0; - return; - } - - TrPtr->dest->bitsPerPixel = TrPtr->src->bitsPerPixel; + if( TrPtr->src->bitsPerPixel != 32 && TrPtr->src->bitsPerPixel != 24 && + TrPtr->src->bitsPerPixel != 64 && TrPtr->src->bitsPerPixel != 48 && + TrPtr->src->bitsPerPixel != 128 && TrPtr->src->bitsPerPixel != 96) // Only support 3/4 byte/short pixels + { + PrintError( "Please convert image to 24/32/48/64/96/128 bit pixelsize."); + PrintError( "Pixelsize is now %d", (int)TrPtr->src->bitsPerPixel ); + TrPtr->success = 0; + return; + } + + TrPtr->dest->bitsPerPixel = TrPtr->src->bitsPerPixel; - // Check version of preferences file - // only if we are not using _usedata - - if ((TrPtr->mode & 7) != _usedata) - { - if (spref == NULL) - { - PrintError("spref cannot be NULL"); - } - else - { - if( readPrefs( version, _version ) != 0 || strcmp( version, VERSION ) != 0 ) - { - writePrefs( VERSION, _version ); - SetSizeDefaults( spref); - writePrefs( (char*)spref, _sizep ); - - SetPrefDefaults( &prefs, _perspective ); - writePrefs( (char*)&prefs.pP, _perspective ); - SetPrefDefaults( &prefs, _correct ); - writePrefs( (char*)&prefs.cP, _correct ); - SetPrefDefaults( &prefs, _remap ); - writePrefs( (char*)&prefs.rP, _remap ); - SetPrefDefaults( &prefs, _adjust ); - writePrefs( (char*)&prefs.aP, _adjust ); - SetPrefDefaults( &prefs, _panleft ); - writePrefs( (char*)&prefs.pc, _panleft ); - - } - } - } + // Check version of preferences file + // only if we are not using _usedata + + if ((TrPtr->mode & 7) != _usedata) + { + if (spref == NULL) + { + PrintError("spref cannot be NULL"); + } + else + { + if( readPrefs( version, _version ) != 0 || strcmp( version, VERSION ) != 0 ) + { + writePrefs( VERSION, _version ); + SetSizeDefaults( spref); + writePrefs( (char*)spref, _sizep ); + + SetPrefDefaults( &prefs, _perspective ); + writePrefs( (char*)&prefs.pP, _perspective ); + SetPrefDefaults( &prefs, _correct ); + writePrefs( (char*)&prefs.cP, _correct ); + SetPrefDefaults( &prefs, _remap ); + writePrefs( (char*)&prefs.rP, _remap ); + SetPrefDefaults( &prefs, _adjust ); + writePrefs( (char*)&prefs.aP, _adjust ); + SetPrefDefaults( &prefs, _panleft ); + writePrefs( (char*)&prefs.pc, _panleft ); + + } + } + } - // Read and/or set preferences; Do Xform - - gTrPtr = TrPtr; - gsPrPtr = spref; + // Read and/or set preferences; Do Xform + + gTrPtr = TrPtr; + gsPrPtr = spref; - switch( TrPtr->mode & 7 ) - { - case _interactive: // Display dialog, set prefs, Do Xform - if( readPrefs( (char*)spref, _sizep ) != 0 ) - SetSizeDefaults( spref); - prPtr = &prefs; - if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) - SetPrefDefaults( prPtr, TrPtr->tool); - if( !SetPrefs( prPtr )) - { - TrPtr->success = 0; - } - else - { - TrPtr->interpolator = spref->interpolator; - TrPtr->gamma = spref->gamma; - - writePrefs( (char*)prPtr, TrPtr->tool ); - writePrefs( (char*)spref, _sizep ); - DoTransForm( TrPtr, prPtr ); - } - break; - case _setprefs: // Display dialog, set prefs - if( readPrefs( (char*)spref, _sizep ) != 0 ) - SetSizeDefaults( spref); - prPtr = &prefs; - if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) - SetPrefDefaults( prPtr, TrPtr->tool); - if( SetPrefs( prPtr ) ) - { - writePrefs( (char*)spref, _sizep ); - writePrefs( (char*)prPtr, TrPtr->tool ); - TrPtr->success = 1; - } - else - TrPtr->success = 0; - break; - case _useprefs: // Read prefs, do Xform - if( readPrefs( (char*)spref, _sizep ) != 0 ) - SetSizeDefaults( spref); - prPtr = &prefs; - if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) - SetPrefDefaults( prPtr, TrPtr->tool); - DoTransForm( TrPtr, prPtr ); - break; - case _usedata: // ignore prefs, do Xform - prPtr = (panoPrefs *) TrPtr->data; - DoTransForm( TrPtr, prPtr ); - break; - default: TrPtr->success = 0; - break; - } - - return; + switch( TrPtr->mode & 7 ) + { + case _interactive: // Display dialog, set prefs, Do Xform + if( readPrefs( (char*)spref, _sizep ) != 0 ) + SetSizeDefaults( spref); + prPtr = &prefs; + if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) + SetPrefDefaults( prPtr, TrPtr->tool); + if( !SetPrefs( prPtr )) + { + TrPtr->success = 0; + } + else + { + TrPtr->interpolator = spref->interpolator; + TrPtr->gamma = spref->gamma; + + writePrefs( (char*)prPtr, TrPtr->tool ); + writePrefs( (char*)spref, _sizep ); + DoTransForm( TrPtr, prPtr ); + } + break; + case _setprefs: // Display dialog, set prefs + if( readPrefs( (char*)spref, _sizep ) != 0 ) + SetSizeDefaults( spref); + prPtr = &prefs; + if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) + SetPrefDefaults( prPtr, TrPtr->tool); + if( SetPrefs( prPtr ) ) + { + writePrefs( (char*)spref, _sizep ); + writePrefs( (char*)prPtr, TrPtr->tool ); + TrPtr->success = 1; + } + else + TrPtr->success = 0; + break; + case _useprefs: // Read prefs, do Xform + if( readPrefs( (char*)spref, _sizep ) != 0 ) + SetSizeDefaults( spref); + prPtr = &prefs; + if( readPrefs( (char*)prPtr, TrPtr->tool ) != 0 ) + SetPrefDefaults( prPtr, TrPtr->tool); + DoTransForm( TrPtr, prPtr ); + break; + case _usedata: // ignore prefs, do Xform + prPtr = (panoPrefs *) TrPtr->data; + DoTransForm( TrPtr, prPtr ); + break; + default: TrPtr->success = 0; + break; + } + + return; } - - + + void DoTransForm( TrformStr *TrPtr, panoPrefs *prPtr ) { - // Dispatch to selected tool - - - switch( TrPtr->tool ) - { - case _perspective: - perspective (TrPtr, &prPtr->pP); - break; - case _remap: - remap (TrPtr, &prPtr->rP); - break; - case _correct: - correct (TrPtr, &prPtr->cP); - break; - case _adjust: - adjust (TrPtr, &prPtr->aP); - break; -// case _interpolate: -// interp (TrPtr, &prPtr->iP); -// break; - case _panright: - case _panleft: - case _panup: - case _pandown: - case _zoomin: - case _zoomout: - case _apply: - case _getPano: - case _increment: - pan(TrPtr, &prPtr->pc); - break; - } - Progress( _disposeProgress, "" ); - return; - + // Dispatch to selected tool + + + switch( TrPtr->tool ) + { + case _perspective: + perspective (TrPtr, &prPtr->pP); + break; + case _remap: + remap (TrPtr, &prPtr->rP); + break; + case _correct: + correct (TrPtr, &prPtr->cP); + break; + case _adjust: + adjust (TrPtr, &prPtr->aP); + break; +// case _interpolate: +// interp (TrPtr, &prPtr->iP); +// break; + case _panright: + case _panleft: + case _panup: + case _pandown: + case _zoomin: + case _zoomout: + case _apply: + case _getPano: + case _increment: + pan(TrPtr, &prPtr->pc); + break; + } + Progress( _disposeProgress, "" ); + return; + } void SetPrefDefaults(panoPrefs *prPtr, int selector) { - // Dispatch to selected tool - - switch( selector ) - { - case _perspective: - SetPerspectiveDefaults( &prPtr->pP); - break; - case _remap: - SetRemapDefaults( &prPtr->rP); - break; - case _correct: - SetCorrectDefaults( &prPtr->cP); - break; - case _adjust: - SetAdjustDefaults( &prPtr->aP); - break; -// case _interpolate: -// SetInterpolateDefaults( &prPtr->iP ); -// break; - case _panright: - case _panleft: - case _panup: - case _pandown: - case _zoomin: - case _zoomout: - case _apply: - case _getPano: - case _increment: - SetPanDefaults( &prPtr->pc ); - break; - } - return; + // Dispatch to selected tool + + switch( selector ) + { + case _perspective: + SetPerspectiveDefaults( &prPtr->pP); + break; + case _remap: + SetRemapDefaults( &prPtr->rP); + break; + case _correct: + SetCorrectDefaults( &prPtr->cP); + break; + case _adjust: + SetAdjustDefaults( &prPtr->aP); + break; +// case _interpolate: +// SetInterpolateDefaults( &prPtr->iP ); +// break; + case _panright: + case _panleft: + case _panup: + case _pandown: + case _zoomin: + case _zoomout: + case _apply: + case _getPano: + case _increment: + SetPanDefaults( &prPtr->pc ); + break; + } + return; } -void SetPanDefaults( panControls *pc) +void SetPanDefaults( panControls *pc) { - pc->panAngle = 15.0; - pc->zoomFactor = 30.0; + pc->panAngle = 15.0; + pc->zoomFactor = 30.0; } int SetPrefs( panoPrefs *prPtr ) { - // Dispatch to selected tool - - switch( gTrPtr->tool ) - { - case _perspective: - return SetPerspectivePrefs ( &prPtr->pP ); - break; - case _remap: - return SetRemapPrefs ( &prPtr->rP ); - break; - case _correct: - return SetCorrectPrefs ( &prPtr->cP ); - break; - case _adjust: - return SetAdjustPrefs ( &prPtr->aP ); - break; -// case _interpolate: -// return SetInterpPrefs ( &prPtr->iP ); -// break; - case _panright: - case _panleft: - case _panup: - case _pandown: - case _zoomin: - case _zoomout: - case _apply: - case _getPano: - case _increment: - return TRUE; - break; - } - return FALSE; + // Dispatch to selected tool + + switch( gTrPtr->tool ) + { + case _perspective: + return SetPerspectivePrefs ( &prPtr->pP ); + break; + case _remap: + return SetRemapPrefs ( &prPtr->rP ); + break; + case _correct: + return SetCorrectPrefs ( &prPtr->cP ); + break; + case _adjust: + return SetAdjustPrefs ( &prPtr->aP ); + break; +// case _interpolate: +// return SetInterpPrefs ( &prPtr->iP ); +// break; + case _panright: + case _panleft: + case _panup: + case _pandown: + case _zoomin: + case _zoomout: + case _apply: + case _getPano: + case _increment: + return TRUE; + break; + } + return FALSE; } @@ -291,206 +291,206 @@ void filter( TrformStr *TrPtr, flfn func, flfn16 func16, void* params, int color) { - register int x, y; // Loop through destination image - register int i, col; // Auxilliary loop variables - int skip = 0; // Update progress counter - unsigned char *dest, *src; // Source and destination image data - // Default message to be displayed by progress reporter - char* progressMessage = "Something is wrong here"; - char percent[8]; // Number displayed by Progress reporter - int valid; // Is this pixel valid? (i.e. inside source image) - long coeff; // pixel coefficient in destination image + register int x, y; // Loop through destination image + register int i, col; // Auxilliary loop variables + int skip = 0; // Update progress counter + unsigned char *dest, *src; // Source and destination image data + // Default message to be displayed by progress reporter + char* progressMessage = "Something is wrong here"; + char percent[8]; // Number displayed by Progress reporter + int valid; // Is this pixel valid? (i.e. inside source image) + long coeff; // pixel coefficient in destination image - int xs, ys; // Source screen coordinates + int xs, ys; // Source screen coordinates - // Variables used to convert screen coordinates to cartesian coordinates - - int w2 = TrPtr->dest->width / 2.0 - 0.5; // Steve's L - int h2 = TrPtr->dest->height / 2.0 - 0.5; + // Variables used to convert screen coordinates to cartesian coordinates + + int w2 = TrPtr->dest->width / 2.0 - 0.5; // Steve's L + int h2 = TrPtr->dest->height / 2.0 - 0.5; - // Selection rectangle - PTRect destRect; + // Selection rectangle + PTRect destRect; - // Jim W July 11 2004 for 16bit - int BytesPerPixel = 0; - int FirstColorByte = 0; - int SamplesPerPixel = 0; - int BytesPerSample = 0; - - switch( TrPtr->src->bitsPerPixel ){ - case 128: FirstColorByte = 4; BytesPerPixel = 16; SamplesPerPixel = 4; BytesPerSample = 4; break; - case 96: FirstColorByte = 0; BytesPerPixel = 12; SamplesPerPixel = 3; BytesPerSample = 4; break; - case 64: FirstColorByte = 2; BytesPerPixel = 8; SamplesPerPixel = 4; BytesPerSample = 2; break; - case 48: FirstColorByte = 0; BytesPerPixel = 6; SamplesPerPixel = 3; BytesPerSample = 2; break; - case 32: FirstColorByte = 1; BytesPerPixel = 4; SamplesPerPixel = 4; BytesPerSample = 1; break; - case 24: FirstColorByte = 0; BytesPerPixel = 3; SamplesPerPixel = 3; BytesPerSample = 1; break; - case 8: FirstColorByte = 0; BytesPerPixel = 1; SamplesPerPixel = 1; BytesPerSample = 1; break; - default: PrintError("Unsupported Pixel Size: %d", TrPtr->src->bitsPerPixel); - TrPtr->success = 0; - return; - } - // Jim W + // Jim W July 11 2004 for 16bit + int BytesPerPixel = 0; + int FirstColorByte = 0; + int SamplesPerPixel = 0; + int BytesPerSample = 0; + + switch( TrPtr->src->bitsPerPixel ){ + case 128: FirstColorByte = 4; BytesPerPixel = 16; SamplesPerPixel = 4; BytesPerSample = 4; break; + case 96: FirstColorByte = 0; BytesPerPixel = 12; SamplesPerPixel = 3; BytesPerSample = 4; break; + case 64: FirstColorByte = 2; BytesPerPixel = 8; SamplesPerPixel = 4; BytesPerSample = 2; break; + case 48: FirstColorByte = 0; BytesPerPixel = 6; SamplesPerPixel = 3; BytesPerSample = 2; break; + case 32: FirstColorByte = 1; BytesPerPixel = 4; SamplesPerPixel = 4; BytesPerSample = 1; break; + case 24: FirstColorByte = 0; BytesPerPixel = 3; SamplesPerPixel = 3; BytesPerSample = 1; break; + case 8: FirstColorByte = 0; BytesPerPixel = 1; SamplesPerPixel = 1; BytesPerSample = 1; break; + default: PrintError("Unsupported Pixel Size: %d", TrPtr->src->bitsPerPixel); + TrPtr->success = 0; + return; + } + // Jim W - if( TrPtr->dest->selection.bottom == 0 && TrPtr->dest->selection.right == 0 ){ - destRect.left = 0; - destRect.right = TrPtr->dest->width; - destRect.top = 0; - destRect.bottom = TrPtr->dest->height; - }else{ - memcpy( &destRect, &TrPtr->dest->selection, sizeof(PTRect) ); - } + if( TrPtr->dest->selection.bottom == 0 && TrPtr->dest->selection.right == 0 ){ + destRect.left = 0; + destRect.right = TrPtr->dest->width; + destRect.top = 0; + destRect.bottom = TrPtr->dest->height; + }else{ + memcpy( &destRect, &TrPtr->dest->selection, sizeof(PTRect) ); + } - dest = *TrPtr->dest->data; - src = *TrPtr->src->data; // is locked + dest = *TrPtr->dest->data; + src = *TrPtr->src->data; // is locked - if(TrPtr->mode & _show_progress){ - switch(color){ - case 0: progressMessage = "Image Conversion"; break; - case 1: switch( TrPtr->src->dataformat) - { - case _RGB: progressMessage = "Red Channel" ; break; - case _Lab: progressMessage = "Lightness" ; break; - } break; - case 2: switch( TrPtr->src->dataformat) - { - case _RGB: progressMessage = "Green Channel"; break; - case _Lab: progressMessage = "Color A" ; break; - } break; - case 3: switch( TrPtr->src->dataformat) - { - case _RGB: progressMessage = "Blue Channel"; break; - case _Lab: progressMessage = "Color B" ; break; - } break; - } - Progress( _initProgress, progressMessage ); - } + if(TrPtr->mode & _show_progress){ + switch(color){ + case 0: progressMessage = "Image Conversion"; break; + case 1: switch( TrPtr->src->dataformat) + { + case _RGB: progressMessage = "Red Channel" ; break; + case _Lab: progressMessage = "Lightness" ; break; + } break; + case 2: switch( TrPtr->src->dataformat) + { + case _RGB: progressMessage = "Green Channel"; break; + case _Lab: progressMessage = "Color A" ; break; + } break; + case 3: switch( TrPtr->src->dataformat) + { + case _RGB: progressMessage = "Blue Channel"; break; + case _Lab: progressMessage = "Color B" ; break; + } break; + } + Progress( _initProgress, progressMessage ); + } - for(y=destRect.top; y<destRect.bottom; y++){ - // Update Progress report and check for cancel every 2% - skip++; - if( skip == (int)ceil(TrPtr->dest->height/50.0) ) - { - if(TrPtr->mode & _show_progress) - { - sprintf( percent, "%d", (int) ((y * 100)/ TrPtr->dest->height)); - if( ! Progress( _setProgress, percent ) ) - { - //myfree( (void**)TrPtr->dest->data ); - TrPtr->success = 0; - return; - } - } - else - { - - if( ! Progress( _idleProgress, 0) ) - { - //myfree( (void**)TrPtr->dest->data ); - TrPtr->success = 0; - return; - } - } - skip = 0; - - } - for(x=destRect.left; x<destRect.right; x++) - { - xs = x; ys = y; + for(y=destRect.top; y<destRect.bottom; y++){ + // Update Progress report and check for cancel every 2% + skip++; + if( skip == (int)ceil(TrPtr->dest->height/50.0) ) + { + if(TrPtr->mode & _show_progress) + { + sprintf( percent, "%d", (int) ((y * 100)/ TrPtr->dest->height)); + if( ! Progress( _setProgress, percent ) ) + { + //myfree( (void**)TrPtr->dest->data ); + TrPtr->success = 0; + return; + } + } + else + { + + if( ! Progress( _idleProgress, 0) ) + { + //myfree( (void**)TrPtr->dest->data ); + TrPtr->success = 0; + return; + } + } + skip = 0; + + } + for(x=destRect.left; x<destRect.right; x++) + { + xs = x; ys = y; - // Is the pixel valid, i.e. from within source image? + // Is the pixel valid, i.e. from within source image? - if( (xs >= TrPtr->src->width) || (ys >= TrPtr->src->height) ) - valid = FALSE; - else - valid = TRUE; + if( (xs >= TrPtr->src->width) || (ys >= TrPtr->src->height) ) + valid = FALSE; + else + valid = TRUE; - // if alpha channel marks valid portions, set valid - if(1 == BytesPerSample)//8bit - { - if( (TrPtr->mode & _honor_valid) && - (SamplesPerPixel == 4) && - (src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs] == 0)) - valid = FALSE; - } - else //16bit - { - if( (TrPtr->mode & _honor_valid) && - (SamplesPerPixel == 4) && - (*(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs] == 0)) - valid = FALSE; - } + // if alpha channel marks valid portions, set valid + if(1 == BytesPerSample)//8bit + { + if( (TrPtr->mode & _honor_valid) && + (SamplesPerPixel == 4) && + (src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs] == 0)) + valid = FALSE; + } + else //16bit + { + if( (TrPtr->mode & _honor_valid) && + (SamplesPerPixel == 4) && + (*(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs] == 0)) + valid = FALSE; + } - // Check for and handle edge locations + // Check for and handle edge locations - if( xs < 0) xs = 0; - if( xs >= TrPtr->src->width ) xs = TrPtr->src->width -1; - if( ys < 0) ys = 0; - if( ys >= TrPtr->src->height ) ys = TrPtr->src->height -1; + if( xs < 0) xs = 0; + if( xs >= TrPtr->src->width ) xs = TrPtr->src->width -1; + if( ys < 0) ys = 0; + if( ys >= TrPtr->src->height ) ys = TrPtr->src->height -1; - // Calculate pixel coefficient in dest image just once + // Calculate pixel coefficient in dest image just once - coeff = (y-destRect.top) * TrPtr->dest->bytesPerLine + BytesPerPixel * (x-destRect.left); + coeff = (y-destRect.top) * TrPtr->dest->bytesPerLine + BytesPerPixel * (x-destRect.left); - if( valid ) - { - if( color == 0 ) // Convert all color channels equally - { - for( col = FirstColorByte; col < BytesPerPixel; col += BytesPerSample) - { + if( valid ) + { + if( color == 0 ) // Convert all color channels equally + { + for( col = FirstColorByte; col < BytesPerPixel; col += BytesPerSample) + { //Kekus 16 bit 2003/Nov/18 if( BytesPerSample == 2 ) - *(unsigned short*)&dest[ coeff + col] = (unsigned short) func16( *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col], x-w2, y-h2, params ); + *(unsigned short*)&dest[ coeff + col] = (unsigned short) func16( *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col], x-w2, y-h2, params ); else - dest[ coeff + col] = func( src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ], x-w2, y-h2, params ); + dest[ coeff + col] = func( src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ], x-w2, y-h2, params ); //Kekus. - } - if( SamplesPerPixel == 4 ) - { - if( BytesPerSample == 2 ) //16bit - *(unsigned short*)&dest[ coeff ] = *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col]; // Set alpha channel - else - dest[ coeff ] = src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ]; // Set alpha channel - } - } - else // Convert just one channel - { - col = (FirstColorByte ? color : color-1); - + } + if( SamplesPerPixel == 4 ) + { + if( BytesPerSample == 2 ) //16bit + *(unsigned short*)&dest[ coeff ] = *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col]; // Set alpha channel + else + dest[ coeff ] = src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ]; // Set alpha channel + } + } + else // Convert just one channel + { + col = (FirstColorByte ? color : color-1); + //Kekus: 2003/Nov/18 if( BytesPerSample == 2 ) *(unsigned short*)&dest[ coeff + col*2] = (unsigned short) func16( *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col*2 ], x-w2, y-h2, params ); else - dest[ coeff + col] = func( src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ], x-w2, y-h2, params ); + dest[ coeff + col] = func( src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs + col ], x-w2, y-h2, params ); //Kekus. - if( SamplesPerPixel == 4 ) - { - if( BytesPerSample == 2 ) //16bit - *(unsigned short*)&dest[ coeff ] = *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs ]; // Set alpha channel - else - dest[ coeff ] = src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs]; // Set alpha channel - } - } - } - else - { - for(i = 0; i < BytesPerPixel; i++) - dest[ coeff + i] = 0; - } + if( SamplesPerPixel == 4 ) + { + if( BytesPerSample == 2 ) //16bit + *(unsigned short*)&dest[ coeff ] = *(unsigned short*)&src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs ]; // Set alpha channel + else + dest[ coeff ] = src[ ys * TrPtr->src->bytesPerLine + BytesPerPixel * xs]; // Set alpha channel + } + } + } + else + { + for(i = 0; i < BytesPerPixel; i++) + dest[ coeff + i] = 0; + } - } - } + } + } - if(TrPtr->mode & _show_progress) - { - Progress( _disposeProgress, percent ); - } + if(TrPtr->mode & _show_progress) + { + Progress( _disposeProgress, percent ); + } - TrPtr->success = 1; + TrPtr->success = 1; } @@ -500,27 +500,27 @@ int SetDestImage( TrformStr *TrPtr, int width, int height) { - int result = 0; + int result = 0; - if( TrPtr->mode & _destSupplied ) - return 0; - - memcpy( TrPtr->dest, TrPtr->src, sizeof( Image )); - - TrPtr->dest->width = width; - TrPtr->dest->height = height; + if( TrPtr->mode & _destSupplied ) + return 0; + + memcpy( TrPtr->dest, TrPtr->src, sizeof( Image )); + + TrPtr->dest->width = width; + TrPtr->dest->height = height; - // bytesPerLine depending on image format + // bytesPerLine depending on image format - TrPtr->dest->bytesPerLine = TrPtr->dest->width * (TrPtr->dest->bitsPerPixel / 8) ; + TrPtr->dest->bytesPerLine = TrPtr->dest->width * (TrPtr->dest->bitsPerPixel / 8) ; - TrPtr->dest->dataSize = TrPtr->dest->height * TrPtr->dest->bytesPerLine; - TrPtr->dest->data = (unsigned char**) mymalloc ((size_t)TrPtr->dest->dataSize); - - if( TrPtr->dest->data == NULL ) - result = -1; - - return result; + TrPtr->dest->dataSize = TrPtr->dest->height * TrPtr->dest->bytesPerLine; + TrPtr->dest->data = (unsigned char**) mymalloc ((size_t)TrPtr->dest->dataSize); + + if( TrPtr->dest->data == NULL ) + result = -1; + + return result; } @@ -529,287 +529,287 @@ void CopyImageData( Image *dest, Image *src ) { - register unsigned char *in, *out; - register int x,y, dx, dy, id, is, i; - int bpp_s, bpp_d; - - in = *(src->data); - out = *(dest->data); - dx = (src->width - dest->width) / 2; - dy = (src->height - dest->height) / 2; - bpp_s = src->bitsPerPixel / 8; - bpp_d = dest->bitsPerPixel / 8; - - for( y = 0; y < dest->height; y++) - { - for( x = 0; x < dest->width; x++) - { - is = (y + dy) * src->bytesPerLine + bpp_s * (x + dx); - id = y * dest->bytesPerLine + bpp_d * x; + register unsigned char *in, *out; + register int x,y, dx, dy, id, is, i; + int bpp_s, bpp_d; + + in = *(src->data); + out = *(dest->data); + dx = (src->width - dest->width) / 2; + dy = (src->height - dest->height) / 2; + bpp_s = src->bitsPerPixel / 8; + bpp_d = dest->bitsPerPixel / 8; + + for( y = 0; y < dest->height; y++) + { + for( x = 0; x < dest->width; x++) + { + is = (y + dy) * src->bytesPerLine + bpp_s * (x + dx); + id = y * dest->bytesPerLine + bpp_d * x; - if( y + dy < 0 || y + dy >= src->height || - x + dx < 0 || x + dx >= src->width ) // outside src; set dest = 0 - { - i = bpp_d; - while( i-- > 0 ) out[ id++ ] = 0; - } - else // inside src; set dest = src - { - switch( bpp_d ) - { - case 8: switch( bpp_s ) - { - case 8: memcpy( out + id, in + is, 8 ); - break; - case 6: out[id++] = 255U; out[id++] = 255U; - memcpy( out + id, in + is, 6 ); - break; - case 4: out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - break; - case 3: out[id++] = 255U; out[id++] = 255U; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - break; - } - break; - case 6: switch( bpp_s ) - { - case 8: is += 2; - memcpy( out + id, in + is, 6 ); - break; - case 6: memcpy( out + id, in + is, 6 ); - break; - case 4: is++; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - break; - case 3: out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - out[id++] = in[ is++ ]; out[id++] = 0; - break; - } - break; + if( y + dy < 0 || y + dy >= src->height || + x + dx < 0 || x + dx >= src->width ) // outside src; set dest = 0 + { + i = bpp_d; + while( i-- > 0 ) out[ id++ ] = 0; + } + else // inside src; set dest = src + { + switch( bpp_d ) + { + case 8: switch( bpp_s ) + { + case 8: memcpy( out + id, in + is, 8 ); + break; + case 6: out[id++] = 255U; out[id++] = 255U; + memcpy( out + id, in + is, 6 ); + break; + case 4: out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + break; + case 3: out[id++] = 255U; out[id++] = 255U; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + break; + } + break; + case 6: switch( bpp_s ) + { + case 8: is += 2; + memcpy( out + id, in + is, 6 ); + break; + case 6: memcpy( out + id, in + is, 6 ); + break; + case 4: is++; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + break; + case 3: out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + out[id++] = in[ is++ ]; out[id++] = 0; + break; + } + break; - case 4: switch( bpp_s ) - { - case 8: out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - break; - case 6: out[id++] = 255U; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - break; - case 4: memcpy( out + id, in + is, 4 ); - break; - case 3: out[id++] = 255U; - memcpy( out + id, in + is, 3 ); - break; - } - break; + case 4: switch( bpp_s ) + { + case 8: out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + break; + case 6: out[id++] = 255U; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + break; + case 4: memcpy( out + id, in + is, 4 ); + break; + case 3: out[id++] = 255U; + memcpy( out + id, in + is, 3 ); + break; + } + break; - case 3: switch( bpp_s ) - { - case 8: is+=2; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - break; - case 6: out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - out[id++] = in[ is++ ]; is++; - break; - case 4: is++; - memcpy( out + id, in + is, 3 ); - break; - case 3: memcpy( out + id, in + is, 3 ); - break; - } - break; + case 3: switch( bpp_s ) + { + case 8: is+=2; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + break; + case 6: out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + out[id++] = in[ is++ ]; is++; + break; + case 4: is++; + memcpy( out + id, in + is, 3 ); + break; + case 3: memcpy( out + id, in + is, 3 ); + break; + } + break; - } - } - } - } + } + } + } + } } // expand image from 3 to 4 bytes per pixel. No pad bytes allowed. // Memory must be allocated void ThreeToFourBPP( Image *im ){ - register int x,y,c1,c2; + register int x,y,c1,c2; - if( im->bitsPerPixel == 32 || im->bitsPerPixel == 64 || im->bitsPerPixel == 128) // Nothing to do - return; + if( im->bitsPerPixel == 32 || im->bitsPerPixel == 64 || im->bitsPerPixel == 128) // Nothing to do + return; - if( im->bitsPerPixel == 24 ){ // Convert to 4byte / pixel - for( y = im->height-1; y>=0; y--){ - for( x= im->width-1; x>=0; x--){ - c1 = (y * im->width + x) * 4; - c2 = y * im->bytesPerLine + x * 3; - (*(im->data))[c1++] = UCHAR_MAX; - (*(im->data))[c1++] = (*(im->data))[c2++]; - (*(im->data))[c1++] = (*(im->data))[c2++]; - (*(im->data))[c1++] = (*(im->data))[c2++]; - } - } - im->bitsPerPixel = 32; - im->bytesPerLine = im->width * 4; - }else if( im->bitsPerPixel == 48 ){ // Convert to 8byte / pixel - for( y = im->height-1; y>=0; y--){ - for( x= im->width-1; x>=0; x--){ - c1 = (y * im->width + x) * 4; - c2 = y * im->bytesPerLine/2 + x * 3; - ((USHORT*)(*(im->data)))[c1++] = USHRT_MAX; - ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; - ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; - ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; - } - } - im->bitsPerPixel = 64; - im->bytesPerLine = im->width * 8; - } - else if( im->bitsPerPixel == 96 ){ // Convert to 16byte / pixel - for( y = im->height-1; y>=0; y--){ - for( x= im->width-1; x>=0; x--){ - c1 = (y * im->width + x) * 4; - c2 = y * im->bytesPerLine/4 + x * 3; - ((float*)(*(im->data)))[c1++] = 1.0; - ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; - ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; - ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; - } - } - im->bitsPerPixel = 128; - im->bytesPerLine = im->width * 16; - } - im->dataSize = im->height * im->bytesPerLine; + if( im->bitsPerPixel == 24 ){ // Convert to 4byte / pixel + for( y = im->height-1; y>=0; y--){ + for( x= im->width-1; x>=0; x--){ + c1 = (y * im->width + x) * 4; + c2 = y * im->bytesPerLine + x * 3; + (*(im->data))[c1++] = UCHAR_MAX; + (*(im->data))[c1++] = (*(im->data))[c2++]; + (*(im->data))[c1++] = (*(im->data))[c2++]; + (*(im->data))[c1++] = (*(im->data))[c2++]; + } + } + im->bitsPerPixel = 32; + im->bytesPerLine = im->width * 4; + }else if( im->bitsPerPixel == 48 ){ // Convert to 8byte / pixel + for( y = im->height-1; y>=0; y--){ + for( x= im->width-1; x>=0; x--){ + c1 = (y * im->width + x) * 4; + c2 = y * im->bytesPerLine/2 + x * 3; + ((USHORT*)(*(im->data)))[c1++] = USHRT_MAX; + ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; + ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; + ((USHORT*)(*(im->data)))[c1++] = ((USHORT*)(*(im->data)))[c2++]; + } + } + im->bitsPerPixel = 64; + im->bytesPerLine = im->width * 8; + } + else if( im->bitsPerPixel == 96 ){ // Convert to 16byte / pixel + for( y = im->height-1; y>=0; y--){ + for( x= im->width-1; x>=0; x--){ + c1 = (y * im->width + x) * 4; + c2 = y * im->bytesPerLine/4 + x * 3; + ((float*)(*(im->data)))[c1++] = 1.0; + ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; + ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; + ((float*)(*(im->data)))[c1++] = ((float*)(*(im->data)))[c2++]; + } + } + im->bitsPerPixel = 128; + im->bytesPerLine = im->width * 16; + } + im->dataSize = im->height * im->bytesPerLine; } // eliminate alpha channel. // pad bytes allowed -void FourToThreeBPP ( Image *im ) +void FourToThreeBPP ( Image *im ) { - register int x,y,c1,c2; - - if( im->bitsPerPixel == 24 || im->bitsPerPixel == 48 || im->bitsPerPixel == 96) // Nothing to do - return; + register int x,y,c1,c2; + + if( im->bitsPerPixel == 24 || im->bitsPerPixel == 48 || im->bitsPerPixel == 96) // Nothing to do + return; - - if( im->bitsPerPixel == 32 ) // Convert to 3byte / pixel - { - register unsigned char *data = *(im->data); - for( y = 0; y < im->height; y++) - { - for( x=0; x < im->width; x++) - { - c1 = y * im->bytesPerLine + x * 4; - c2 = (y * im->width + x) * 3; - c1++; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - } - } - im->bitsPerPixel = 24; - im->bytesPerLine = im->width * 3; - } - else if( im->bitsPerPixel == 64 )// Convert to 6byte / pixel - { - register USHORT *data = (USHORT*)*(im->data); - for( y = 0; y < im->height; y++) - { - for( x=0; x < im->width; x++) - { - c1 = y * im->bytesPerLine/2 + x * 4; - c2 = (y * im->width + x) * 3; - c1++; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - } - } - im->bitsPerPixel = 48; - im->bytesPerLine = im->width * 6; - } - else if( im->bitsPerPixel == 128 )// Convert to 12byte / pixel - { - register float *data = (float*)*(im->data); - for( y = 0; y < im->height; y++) - { - for( x=0; x < im->width; x++) - { - c1 = y * im->bytesPerLine/4 + x * 4; - c2 = (y * im->width + x) * 3; - c1++; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - data [c2++] = data [c1++]; - } - } - im->bitsPerPixel = 96; - im->bytesPerLine = im->width * 12; - } - - im->dataSize = im->height * im->bytesPerLine; + + if( im->bitsPerPixel == 32 ) // Convert to 3byte / pixel + { + register unsigned char *data = *(im->data); + for( y = 0; y < im->height; y++) + { + for( x=0; x < im->width; x++) + { + c1 = y * im->bytesPerLine + x * 4; + c2 = (y * im->width + x) * 3; + c1++; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + } + } + im->bitsPerPixel = 24; + im->bytesPerLine = im->width * 3; + } + else if( im->bitsPerPixel == 64 )// Convert to 6byte / pixel + { + register USHORT *data = (USHORT*)*(im->data); + for( y = 0; y < im->height; y++) + { + for( x=0; x < im->width; x++) + { + c1 = y * im->bytesPerLine/2 + x * 4; + c2 = (y * im->width + x) * 3; + c1++; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + } + } + im->bitsPerPixel = 48; + im->bytesPerLine = im->width * 6; + } + else if( im->bitsPerPixel == 128 )// Convert to 12byte / pixel + { + register float *data = (float*)*(im->data); + for( y = 0; y < im->height; y++) + { + for( x=0; x < im->width; x++) + { + c1 = y * im->bytesPerLine/4 + x * 4; + c2 = (y * im->width + x) * 3; + c1++; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + data [c2++] = data [c1++]; + } + } + im->bitsPerPixel = 96; + im->bytesPerLine = im->width * 12; + } + + im->dataSize = im->height * im->bytesPerLine; } void OneToTwoByte( Image *im ) { - register int x,y,c1,c2,i; - int bpp; - - if( im->bitsPerPixel > 32 ) return; + register int x,y,c1,c2,i; + int bpp; + + if( im->bitsPerPixel > 32 ) return; - bpp = im->bitsPerPixel / 8; + bpp = im->bitsPerPixel / 8; - for( y = im->height-1; y>=0; y--) - { - for( x= im->width-1; x>=0; x--) - { - c1 = ( y * im->width + x) * bpp * 2; - c2 = y * im->bytesPerLine + x * bpp; - - for(i=0; i<bpp; i++) - { - *((USHORT*)(*im->data + c1)) = ((USHORT)(*(im->data))[c2++]) << 8; c1 += 2; - } - } - } - im->bitsPerPixel *= 2; - im->bytesPerLine = im->width * im->bitsPerPixel/8; - im->dataSize = im->height * im->bytesPerLine; + for( y = im->height-1; y>=0; y--) + { + for( x= im->width-1; x>=0; x--) + { + c1 = ( y * im->width + x) * bpp * 2; + c2 = y * im->bytesPerLine + x * bpp; + + for(i=0; i<bpp; i++) + { + *((USHORT*)(*im->data + c1)) = ((USHORT)(*(im->data))[c2++]) << 8; c1 += 2; + } + } + } + im->bitsPerPixel *= 2; + im->bytesPerLine = im->width * im->bitsPerPixel/8; + im->dataSize = im->height * im->bytesPerLine; } void TwoToOneByte( Image *im ){ - register int x,y,c1,c2,i; - int bpp_old, bpp_new; - - if( im->bitsPerPixel < 48 ) return; - - bpp_old = im->bitsPerPixel / 8; - bpp_new = bpp_old / 2; + register int x,y,c1,c2,i; + int bpp_old, bpp_new; + + if( im->bitsPerPixel < 48 ) return; + + bpp_old = im->bitsPerPixel / 8; + bpp_new = bpp_old / 2; - for( y = 0; y < im->height; y++){ - for( x=0; x < im->width; x++){ - c1 = (y * im->width + x) * bpp_new; - c2 = y * im->bytesPerLine + x * bpp_old; - - for(i=0; i<bpp_new; i++){ - (*(im->data))[c1++] = *((USHORT*)(*im->data + c2)) >> 8; c2 += 2; - } - } - } - im->bitsPerPixel /= 2; - im->bytesPerLine = im->width * im->bitsPerPixel/8; - im->dataSize = im->height * im->bytesPerLine; + for( y = 0; y < im->height; y++){ + for( x=0; x < im->width; x++){ + c1 = (y * im->width + x) * bpp_new; + c2 = y * im->bytesPerLine + x * bpp_old; + + for(i=0; i<bpp_new; i++){ + (*(im->data))[c1++] = *((USHORT*)(*im->data + c2)) >> 8; c2 += 2; + } + } + } + im->bitsPerPixel /= 2; + im->bytesPerLine = im->width * im->bitsPerPixel/8; + im->dataSize = im->height * im->bytesPerLine; } @@ -836,35 +836,35 @@ void SetImageDefaults(Image *im){ - im->data = NULL; - im->bytesPerLine = 0; - im->width = 0; - im->height = 0; - im->dataSize = 0; - im->bitsPerPixel = 0; - im->format = 0; - im->dataformat = _RGB; - im->hfov = 0.0; - im->yaw = 0.0; - im->pitch = 0.0; - im->roll = 0.0; - SetCorrectDefaults( &(im->cP) ); - *(im->name) = 0; - im->selection.top = 0; - im->selection.bottom = 0; - im->selection.left = 0; - im->selection.right = 0; + im->data = NULL; + im->bytesPerLine = 0; + im->width = 0; + ... [truncated message content] |
From: <dm...@us...> - 2006-11-18 09:01:01
|
Revision: 601 http://svn.sourceforge.net/panotools/?rev=601&view=rev Author: dmg Date: 2006-11-18 01:00:57 -0800 (Sat, 18 Nov 2006) Log Message: ----------- 2006-11-18 dmg <dm...@uv...> * PTcommon.c (Clear_Area_Outside_Selected_Region): Implemented circular fisheye * PTcommon.c (getROI): Reverted _isnan to isnan * tools/PTmender.c: I changed my mind. We should keep the PTmender in the new version of the tools too. * tools/PTremap.c: Deleted. * tools/Makefile.am: Removed PTremap * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre16 Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/PTcommon.c trunk/libpano/configure.ac trunk/libpano/doc/PTmender.readme trunk/libpano/tools/Makefile.am trunk/libpano/tools/PTmender.c trunk/libpano/version.h Removed Paths: ------------- trunk/libpano/doc/PTremap.readme trunk/libpano/tools/PTremap.c Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/ChangeLog 2006-11-18 09:00:57 UTC (rev 601) @@ -1,3 +1,18 @@ +2006-11-18 dmg <dm...@uv...> + + * PTcommon.c (Clear_Area_Outside_Selected_Region): Implemented circular fisheye + + * PTcommon.c (getROI): Reverted _isnan to isnan + + * tools/PTmender.c: I changed my mind. We should keep the PTmender + in the new version of the tools too. + + * tools/PTremap.c: Deleted. + + * tools/Makefile.am: Removed PTremap + + * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre16 + 2006-11-17 dmg <dm...@uv...> * panorama.h: Created Boolean data type (unsigned char) Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/PTcommon.c 2006-11-18 09:00:57 UTC (rev 601) @@ -333,12 +333,8 @@ if (right == 0) right = image->width; + - if (image->format == _fisheye_circ) { - PrintError("Not implemented yet"); - exit(1); - } - if (image->bitsPerPixel == 32) { bytesPerPixel = 4; } @@ -346,10 +342,84 @@ bytesPerPixel = 8; } else { - - exit(0); + PrintError("Invalid bits per pixel in image %d", image->bitsPerPixel); + exit(1); } + + if (image->format == _fisheye_circ) { + + // TODO + // This routine works only in fisheyes in portrait mode + // it probably fails in landscape mode + + int horCenter, verCenter; + int horRadious; + int horRadious2; + + horCenter = (left + right) / 2; + verCenter = (top + bottom) / 2; + + // Compute the horizontal width divided by 2, + // let us call it horizontal radios + + horRadious = (right - left) / 2; + // Square it, so we don't have to compute this + // every time + horRadious2 = horRadious * horRadious; + + dataPtr = *(image->data); + + // Scan the image from top to bottom + for (currentRow = 0; currentRow < image->height; currentRow++) { + int verDistance; + int verDistance2; + + // The algorith it simple. Find the distance of each from from the + // center of the image. If the point is farther than horRadious + // then set mask to zero + + currentColumn = 0; + pixelPtr = dataPtr; + + // Compute the square of the vertical distance to this row from center + verDistance = (currentRow - verCenter); + verDistance2 = verDistance * verDistance; + + for (currentColumn = 0; currentColumn < image->width; currentColumn ++) { + int horDistance; + int horDistance2; + + // Compute square of distance of this point to center + // the old Pythagoras way + // distance^2 = horDistance^2 + verDistance^2 + + horDistance = (currentColumn - horCenter); + horDistance2 = horDistance * horDistance; + + if (horDistance2 + verDistance2 > horRadious2) { + + // Point falls outside the circle defined its horizontal maximum distance + + // Set mask to zero + if (bytesPerPixel == 4) + *pixelPtr = 0; + else if (bytesPerPixel == 8) { + *pixelPtr = 0; + *(pixelPtr+1) = 0; + } + + } + pixelPtr += bytesPerPixel; + + } // for column + dataPtr += image->bytesPerLine; + } // for row + return; + } + + + // Clear the area at above the image dataPtr = *(image->data); @@ -481,9 +551,10 @@ #ifdef not_implemented_yet -THIS IS the code for fisheye_circular 64 bits var20 = (left + right) - /2; +THIS IS the code for fisheye_circular 64 bits +var20 = (left + right) /2; + var24 = (top + bottom) / 2; currentColumn = (left - right) / 2; @@ -607,11 +678,11 @@ //a value of "-1.#IND00". This is not a number, and probably indicates //a divide by zero error somewhere in the mapping function. This should //be solved, but, for now, discard this value and keep going - if (!_isnan(Dx)) { + if (!isnan(Dx)) { if ((int)Dx < ROIRect->left) ROIRect->left = (int)Dx; if ((int)Dx > ROIRect->right) ROIRect->right = (int)Dx; } - if (!_isnan(Dy)){ + if (!isnan(Dy)){ if ((int)Dy < ROIRect->top) ROIRect->top = (int)Dy; if ((int)Dy > ROIRect->bottom) ROIRect->bottom = (int)Dy; } Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/configure.ac 2006-11-18 09:00:57 UTC (rev 601) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre15], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre16], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/doc/PTmender.readme =================================================================== --- trunk/libpano/doc/PTmender.readme 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/doc/PTmender.readme 2006-11-18 09:00:57 UTC (rev 601) @@ -1 +1,30 @@ -PTmender is being deprecated. Please use PTremap +PTremap +-------- + +This is a program that implements the mapping of panoramas similar to +PTStitcher + +---------------------------------------------------------------------- +WHAT IS NOT GOING TO BE SUPPORTED + + +* PTremap only preforms the remapping of the input images and creates + a set of cropped TIFFs, one for each input image. + +* It does NOT create any other type of output and it does not flatten the output. + + +---------------------------------------------------------------------- + +COMMAND LINE OPTIONS + +PTremap [options] <script filename> + +Options: + -o <prefix> Prefix for output filename, defaults to pano + -q Quiet run + -h Show this mes + +---------------------------------------------------------------------- + + Deleted: trunk/libpano/doc/PTremap.readme =================================================================== --- trunk/libpano/doc/PTremap.readme 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/doc/PTremap.readme 2006-11-18 09:00:57 UTC (rev 601) @@ -1,29 +0,0 @@ -PTremap --------- - -This is a program that implements the mapping of panoramas similar to -PTStitcher - ----------------------------------------------------------------------- -WHAT IS NOT GOING TO BE SUPPORTED - - -* PTremap only preforms the remapping of the input images and creates - a set of cropped TIFFs, one for each input image. - -* It does NOT create any other type of output and it does not flatten the output. - - ----------------------------------------------------------------------- - -COMMAND LINE OPTIONS - -PTremap [options] <script filename> - -Options: - -o <prefix> Prefix for output filename, defaults to pano - -q Quiet run - -h Show this mes - ----------------------------------------------------------------------- - Modified: trunk/libpano/tools/Makefile.am =================================================================== --- trunk/libpano/tools/Makefile.am 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/tools/Makefile.am 2006-11-18 09:00:57 UTC (rev 601) @@ -35,7 +35,7 @@ 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 PTremap PTcrop PTmasker +bin_PROGRAMS = panoinfo PToptimizer PTmender PTblender PTtiff2psd PTuncrop PTtiffdump PTroller PTcrop PTmasker PTmasker_SOURCES = PTmasker.c PTmasker_LDADD = -l${PANOLIB} -ltiff @@ -43,10 +43,6 @@ PTblender_SOURCES = PTblender.c PTblender_LDADD = -l${PANOLIB} -ltiff -PTremap_SOURCES = PTremap.c -PTremap_LDADD = -l${PANOLIB} -ltiff - - PTroller_SOURCES = PTroller.c PTroller_LDADD = -l${PANOLIB} -ltiff Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/tools/PTmender.c 2006-11-18 09:00:57 UTC (rev 601) @@ -53,19 +53,234 @@ int ptDebug = 0; +#define DEFAULT_OUTPUT_NAME "pano" + #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"\ + "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"\ + "\n" + + int sorting_function(const void *, const void *); int hasPathInfo(char *aName); +static void panoRemapDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) +{ + FILE* scriptFD; + int temp; + + strcpy(scriptPathName->name, scriptFileName); + + // Get a temp filename for the copy of the script + if (panoFileMakeTemp(scriptPathName) == 0) { + PrintError("Could not make Tempfile"); + exit(1); + } + + // Copy the script + if ((scriptFD = fopen(scriptPathName->name, "w")) == NULL) { + PrintError("Could not open temporary Scriptfile"); + exit(1); + } + + temp = fwrite(script, 1, strlen(script), scriptFD); + + if (strlen(script) != temp) { + PrintError("Could not write temporary Scriptfile"); + exit(1); + } + + fclose(scriptFD); + +} + + int main(int argc,char *argv[]) { + char *script; + int counter; + fullPath *ptrImageFileNames; + AlignInfo alignInfo; + fullPath scriptFileName; + fullPath panoFileName; + int i; - printf(PT_MENDER_VERSION); - fprintf(stderr, "This program is deprecated. Please use PTremapper instead"); - exit(-1); + char opt; + ptrImageFileNames = NULL; + counter = 0; + strcpy(panoFileName.name, DEFAULT_OUTPUT_NAME); + strcpy(scriptFileName.name, ""); + + printf(PT_MENDER_VERSION); + + while ((opt = getopt(argc, argv, "o:f:hsqd")) != -1) { + + // o -> set output file + // h -> help? + // q -> quiet? + + switch(opt) { + + case 'o': // specifies output file name + if (StringtoFullPath(&panoFileName, optarg) != 0) { + PrintError("Syntax error: Not a valid pathname"); + return(-1); + } + break; + + case 'd': + ptDebug = 1; + break; + case 'q': + ptQuietFlag = 1; + break; + + case 'h': + PrintError(PT_MENDER_USAGE); + return -1; + + default: + break; + } + } + + if (optind != argc - 1) { + PrintError(PT_MENDER_USAGE); + return -1; + } + + if (StringtoFullPath(&scriptFileName, argv[optind]) !=0) { // success + PrintError("Syntax error: Not a valid pathname"); + PrintError(PT_MENDER_USAGE); + return(-1); + } + + // Check if we got a filename + if (strlen(scriptFileName.name) == 0) { + PrintError("No script name provided\n"); + PrintError(PT_MENDER_USAGE); + return -1; + + } // end of if (scriptFileName[0] != 0) { + + // Prompt user to specify output filename if not set via command line + 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); + } + + 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) { + 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; + panoRemapDuplicateScriptFile(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. + return panoCreatePanorama(ptrImageFileNames, counter, &panoFileName, &scriptFileName); + } +////////////////////////////////////////////////////////////////////// + +char* Filename(fullPath* path) +{ + char *temp; + if ((temp = strrchr(path->name, '/')) != NULL) { + temp++; + } else { + temp = path->name; + } + return temp; +} + + +int hasPathInfo(char *aName) +{ + return ((strchr(aName, PATH_SEP) == NULL) ? 0 : 1); +} Deleted: trunk/libpano/tools/PTremap.c =================================================================== --- trunk/libpano/tools/PTremap.c 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/tools/PTremap.c 2006-11-18 09:00:57 UTC (rev 601) @@ -1,286 +0,0 @@ -/* - * PTremap - * - * Based on the program PTStitcher by Helmut Dersch. - * - * It is intended to duplicate the functionality of original program - * - * Dec 2005 - * - * 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 - * - */ - - -// TODO -// Create_Panorama requires some floating point assembly to be interpreted - -#define __DEBUG__ - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <dirent.h> -#include <unistd.h> - -#include "tiffio.h" -#include "filter.h" -#include "panorama.h" - -#include "PTcommon.h" -#include "file.h" - - -// Global variables for the program - - -int ptDebug = 0; - -#define DEFAULT_OUTPUT_NAME "pano" - -#define PT_REMAP_VERSION "PTremap Version " VERSION ", originally written by Helmut Dersch, rewritten by Daniel German\n" - -#define PT_REMAP_USAGE "PTremap [options] <script filename>\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"\ - "\n" - - -int hasPathInfo(char *aName); - - -static void panoRemapDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) -{ - FILE* scriptFD; - int temp; - - strcpy(scriptPathName->name, scriptFileName); - - // Get a temp filename for the copy of the script - if (panoFileMakeTemp(scriptPathName) == 0) { - PrintError("Could not make Tempfile"); - exit(1); - } - - // Copy the script - if ((scriptFD = fopen(scriptPathName->name, "w")) == NULL) { - PrintError("Could not open temporary Scriptfile"); - exit(1); - } - - temp = fwrite(script, 1, strlen(script), scriptFD); - - if (strlen(script) != temp) { - PrintError("Could not write temporary Scriptfile"); - exit(1); - } - - fclose(scriptFD); - -} - - - -int main(int argc,char *argv[]) -{ - char *script; - int counter; - fullPath *ptrImageFileNames; - AlignInfo alignInfo; - fullPath scriptFileName; - fullPath panoFileName; - int i; - - char opt; - - ptrImageFileNames = NULL; - counter = 0; - strcpy(panoFileName.name, DEFAULT_OUTPUT_NAME); - strcpy(scriptFileName.name, ""); - - printf(PT_REMAP_VERSION); - - while ((opt = getopt(argc, argv, "o:f:hsqd")) != -1) { - - // o -> set output file - // h -> help? - // q -> quiet? - - switch(opt) { - - case 'o': // specifies output file name - if (StringtoFullPath(&panoFileName, optarg) != 0) { - PrintError("Syntax error: Not a valid pathname"); - return(-1); - } - break; - - case 'd': - ptDebug = 1; - break; - case 'q': - ptQuietFlag = 1; - break; - - case 'h': - PrintError(PT_REMAP_USAGE); - return -1; - - default: - break; - } - } - - if (optind != argc - 1) { - PrintError(PT_REMAP_USAGE); - return -1; - } - - if (StringtoFullPath(&scriptFileName, argv[optind]) !=0) { // success - PrintError("Syntax error: Not a valid pathname"); - PrintError(PT_REMAP_USAGE); - return(-1); - } - - // Check if we got a filename - if (strlen(scriptFileName.name) == 0) { - PrintError("No script name provided\n"); - PrintError(PT_REMAP_USAGE); - return -1; - - } // end of if (scriptFileName[0] != 0) { - - // Prompt user to specify output filename if not set via command line - if (strlen(panoFileName.name) == 0) { - PrintError("No output filename specified\n"); - PrintError(PT_REMAP_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); - } - - 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) { - 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; - panoRemapDuplicateScriptFile(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. - return panoCreatePanorama(ptrImageFileNames, counter, &panoFileName, &scriptFileName); - -} - - -////////////////////////////////////////////////////////////////////// - -char* Filename(fullPath* path) -{ - char *temp; - if ((temp = strrchr(path->name, '/')) != NULL) { - temp++; - } else { - temp = path->name; - } - return temp; -} - - -int hasPathInfo(char *aName) -{ - return ((strchr(aName, PATH_SEP) == NULL) ? 0 : 1); -} Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-18 03:50:15 UTC (rev 600) +++ trunk/libpano/version.h 2006-11-18 09:00:57 UTC (rev 601) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre14 " +#define VERSION "2.8.5pre16 " #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-11-18 09:25:04
|
Revision: 602 http://svn.sourceforge.net/panotools/?rev=602&view=rev Author: dmg Date: 2006-11-18 01:24:59 -0800 (Sat, 18 Nov 2006) Log Message: ----------- Added comment to PTmender readme Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/doc/PTmender.readme Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-18 09:00:57 UTC (rev 601) +++ trunk/libpano/ChangeLog 2006-11-18 09:24:59 UTC (rev 602) @@ -1,5 +1,7 @@ 2006-11-18 dmg <dm...@uv...> + * doc/PTmender.readme (Options): Added a note on circular fisheye support + * PTcommon.c (Clear_Area_Outside_Selected_Region): Implemented circular fisheye * PTcommon.c (getROI): Reverted _isnan to isnan Modified: trunk/libpano/doc/PTmender.readme =================================================================== --- trunk/libpano/doc/PTmender.readme 2006-11-18 09:00:57 UTC (rev 601) +++ trunk/libpano/doc/PTmender.readme 2006-11-18 09:24:59 UTC (rev 602) @@ -28,3 +28,16 @@ ---------------------------------------------------------------------- + + +---------------------------------------------------------------------- +If you select circular fisheye a mask is created around a circle: + +* The image is always assumed to be in portrait mode. + +* if no crop region is specified then the circle is assumed to be + bounded by the horizontal axis. A mask is created with a circle of + horizontal_width/2 radious, centered in the middle of the image + +* If a crop region is specified then a mask is created such that the + circle is enclosed (in the horizontal axis) by the crop region. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-11-25 10:15:56
|
Revision: 611 http://svn.sourceforge.net/panotools/?rev=611&view=rev Author: dmg Date: 2006-11-25 02:15:53 -0800 (Sat, 25 Nov 2006) Log Message: ----------- 2006-11-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre17 * tiff.c (panoTiffWrite): Fixed a bug in the allocation of the buffer for writing to the output file. * ptstitch.c, tools/PTmasker.c: Enabled feathering code * PTcommon.c: removed feathering skeletons from here. * ptfeather.c, ptfeather.h: Implemented feathering. * Makefile.am: Added ptfeather.c, ptfeather.h 2006-11-23 dmg <dm...@uv...> * TODO: updated tasks. * PTcommon.c (panoCreatePanorama): Change slightly error message to make it clearer. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/Makefile.am trunk/libpano/PTcommon.c trunk/libpano/README trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/doc/PTmender.readme trunk/libpano/ptstitch.c trunk/libpano/tiff.c trunk/libpano/tools/PTmasker.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/ChangeLog 2006-11-25 10:15:53 UTC (rev 611) @@ -1,3 +1,25 @@ +2006-11-25 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre17 + + * tiff.c (panoTiffWrite): Fixed a bug in the allocation of the + buffer for writing to the output file. + + * ptstitch.c, tools/PTmasker.c: Enabled feathering code + + * PTcommon.c: removed feathering skeletons from here. + + * ptfeather.c, ptfeather.h: Implemented feathering. + + * Makefile.am: Added ptfeather.c, ptfeather.h + +2006-11-23 dmg <dm...@uv...> + + * TODO: updated tasks. + + * PTcommon.c (panoCreatePanorama): Change slightly error message + to make it clearer. + 2006-11-18 dmg <dm...@uv...> * doc/PTmender.readme (Options): Added a note on circular fisheye support Modified: trunk/libpano/Makefile.am =================================================================== --- trunk/libpano/Makefile.am 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/Makefile.am 2006-11-25 10:15:53 UTC (rev 611) @@ -6,7 +6,7 @@ optimize.c morpher.c Triangulate.c \ seamer.c hdrfile.c rgbe.c rgbe.h \ tiff.c ZComb.c jpeg.c png.c multilayer.c sys_common.c PTcommon.c ColourBrightness.c\ - metadata.c jpegicc.c ptstitch.c + metadata.c jpegicc.c ptstitch.c ptfeather.c if HasJava JAVA_SRC = ptpicker.c pteditor.c @@ -16,7 +16,7 @@ STD_HDR = panorama.h filter.h version.h panotypes.h PTcommon.h pt_stdint.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.c +INTERNAL_HDR = fftn.h f2c.h ZComb.h adjust.h ColourBrightness.h PTcommon.h pt_stdint.h pttiff.h metadata.h jpegicc.h ptstitch.c ptfeather.h TOOL_HDR = queryfeature.h pteditor.h ptutils.h Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/PTcommon.c 2006-11-25 10:15:53 UTC (rev 611) @@ -6,7 +6,7 @@ * * Copyright Helmut Dersch and Daniel M. German * - * Dec 2006 + * Dec 2005 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public @@ -196,57 +196,6 @@ -static void ApplyFeather8bits(Image * image, int featherSize) -{ - - fprintf(stderr, "\nFeathering 8 bits not implemented yet\n"); - -} - -static void ApplyFeather16bits(Image * image, int featherSize) -{ - - fprintf(stderr, "\nFeathering 16 bits not implemented yet\n"); - -} - - -int ApplyFeather(fullPath * inputFile, fullPath * outputFile, - int featherSize) -{ - Image image; - if (readTIFF(&image, inputFile) != 0) { - PrintError("Could not open TIFF-file [%s]", inputFile->name); - return 0; - } - - // fprintf(stderr, "To apply feather %d\n", featherSize); - if (image.bitsPerPixel == 32) { - ApplyFeather8bits(&image, featherSize); - } - else if (image.bitsPerPixel == 64) { - ApplyFeather16bits(&image, featherSize); - } - else { - fprintf(stderr, - "Apply feather not supported for this image type (%d bitsPerPixel)\n", - (int) image.bitsPerPixel); - exit(1); - } - - if (writeTIFF(&image, outputFile) != 0) { - PrintError("Could not write TIFF-file [%s]", outputFile->name); - return 0; - } - - myfree((void **) image.data); - - return 1; - -} - - - #ifdef __Win__ //void InsertFileName( fullPath *fp, char *fname ){ // char *c = strrchr((char*)(fp->name), PATH_SEP); @@ -891,7 +840,7 @@ nextWord(output_file_format, &tempString); if (loopCounter == 0 && strcmp(output_file_format, "TIFF_m") != 0) { - PrintError("No support for this image format (%s). Falling back to TIFF_m", output_file_format); + PrintError("No support for this ouput image format (%s). Output will be TIFF_m", output_file_format); } Modified: trunk/libpano/README =================================================================== --- trunk/libpano/README 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/README 2006-11-25 10:15:53 UTC (rev 611) @@ -1,5 +1,5 @@ -This is the pano12 library, part of the Panorama Tools by Helmut +This is the pano13 library, part of the Panorama Tools by Helmut Dersch of the University of Applied Sciences Furtwangen. http://panotools.sourceforge.net/ @@ -14,7 +14,7 @@ The typical workflow would be: -- PTremap maps the pano files, outputs cropped TIFFS +- PTmender maps the pano files, outputs cropped TIFFS - PTblender* fixes colour shifts in TIFFs, outputs cropped TIFFS (8 bit only) - PTmasker* creates stitching masks in TIFFs, outputs cropped TIFFS - PTroller creates a single TIFF from set of TIFFs Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/TODO 2006-11-25 10:15:53 UTC (rev 611) @@ -5,9 +5,9 @@ KNOWN BUGS: ---------------------------------------------------------------------- -1. PTcrop tries to read the entire image at once. I got a segfault - from inside libtiff. It needs to be rewritten to read only one line - at a time. +1. 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. 2. PTcrop needs to be able to crop images as a "set" (that is, compute the bounding rectangle of a group of images) not only as a single @@ -30,15 +30,16 @@ ---------------------------------------------------------------------- -PTremap: +PTmender: +- Allow the specification of the images in the command line + + DESIRABLE FEATURES: - Output a text file with the names of the files processed and extra information, such as size - - Process fisheye lenses. - - If somebody wants full compatibility with PTstitcher, a new program can be added that does all the work. It will be a "superset" of many of the current pano tools. @@ -64,7 +65,7 @@ ---------------------------------------------------------------------- PTcrop: -* Feature: compute the inner rectangle +* Feature: compute the inner rectangle with the largest area. ---------------------------------------------------------------------- Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/configure.ac 2006-11-25 10:15:53 UTC (rev 611) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre16], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.8.5pre17], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/doc/PTmender.readme =================================================================== --- trunk/libpano/doc/PTmender.readme 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/doc/PTmender.readme 2006-11-25 10:15:53 UTC (rev 611) @@ -1,4 +1,4 @@ -PTremap +PTmender -------- This is a program that implements the mapping of panoramas similar to Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/ptstitch.c 2006-11-25 10:15:53 UTC (rev 611) @@ -33,6 +33,7 @@ #include "file.h" #include "ptstitch.h" #include "PTcommon.h" +#include "ptfeather.h" // Get the value of a channel in the pixel pointed by ptr unsigned int panoStitchPixelChannelGet(unsigned char *ptr, int bytesPerPixel, int channel) @@ -837,31 +838,27 @@ remove(alphaChannelFiles[i].name); -#if 0 -This code is useless until we support feathers - // Do feathering if (featherSize > 0) { fullPath feathered; + memcpy(&feathered, &maskFiles[i], sizeof(fullPath)); - if (!ApplyFeather(&withAlphaChannel, &feathered, featherSize)) { + if (!panoFeatherFiles(&withAlphaChannel, &feathered, featherSize)) { PrintError("Unable to apply feather to image %d", i); return -1; } - remove(withAlphaChannel.name); + if (strcmp(withAlphaChannel.name, feathered.name) != 0) { + remove(withAlphaChannel.name); + } rename(feathered.name, outputFiles[i].name); } else { + rename(withAlphaChannel.name, outputFiles[i].name); } - -#else - printf("Using this\n"); - rename(withAlphaChannel.name, outputFiles[i].name); -#endif } free(maskFiles); Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/tiff.c 2006-11-25 10:15:53 UTC (rev 611) @@ -1411,25 +1411,31 @@ } // end Rik's mask-from-focus hacking (for the moment...) + printf("Here\n"); bufsize = TIFFScanlineSize(tif->tiff); if (bufsize < im->bytesPerLine) bufsize = im->bytesPerLine; - buf = calloc(bufsize, 0); + buf = calloc(bufsize, 1); if (buf == NULL) { PrintError("Not enough memory"); goto error; } for (y = 0; 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); + printf("Here 2\n"); ARGBtoRGBA(buf, im->width, im->bitsPerPixel); - if (TIFFWriteScanline(tif->tiff, buf, y, 1) != 1) { + printf("Here 3\n"); + if (TIFFWriteScanline(tif->tiff, buf, y, 0) != 1) { PrintError("Unable to write to TIFF"); goto error; } + printf("Here 4\n"); + } panoTiffClose(tif); free(buf); Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/tools/PTmasker.c 2006-11-25 10:15:53 UTC (rev 611) @@ -46,6 +46,7 @@ #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-q\t\tQuiet run\n"\ "\t-h\t\tShow this message\n"\ @@ -66,15 +67,15 @@ int filesCount; int base = 0; int ptForceProcessing = 0; + int feather = 0; - ptrInputFiles = NULL; counter = 0; printf(PT_MASKER_VERSION); - while ((opt = getopt(argc, argv, "p:fqh")) != -1) { + while ((opt = getopt(argc, argv, "p:fqhe:")) != -1) { // o and f -> set output file // h -> help @@ -83,6 +84,13 @@ // s -> compute seams switch(opt) { // fhoqs f: 102 h:104 111 113 115 o:f:hsq + case 'e': + feather = strtol(optarg, NULL, 10); + if (errno != 0) { + PrintError("Illegal value for feather"); + return -1; + } + break; case 'p': if (strlen(optarg) < MAX_PATH_LENGTH) { strcpy(outputPrefix, optarg); @@ -133,11 +141,14 @@ return -1; } + + // Generate output file names if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { return -1; } + if (! ptForceProcessing) { char *temp; if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { @@ -152,7 +163,7 @@ if (! ptQuietFlag) printf("Computing seams for %d files\n", filesCount); if (panoStitchReplaceMasks(ptrInputFiles, ptrOutputFiles, filesCount, - 0) != 0) { + feather) != 0) { PrintError("Could not create stitching masks"); return -1; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-21 22:07:01 UTC (rev 610) +++ trunk/libpano/version.h 2006-11-25 10:15:53 UTC (rev 611) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre16 " +#define VERSION "2.8.5pre17 " #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-11-25 10:27:58
|
Revision: 612 http://svn.sourceforge.net/panotools/?rev=612&view=rev Author: dmg Date: 2006-11-25 02:27:57 -0800 (Sat, 25 Nov 2006) Log Message: ----------- 2006-11-25 dmg <dm...@uv...> * Removed makefile.osx which is badly out of date. Modified Paths: -------------- trunk/libpano/ChangeLog Removed Paths: ------------- trunk/libpano/makefile.osx Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-25 10:15:53 UTC (rev 611) +++ trunk/libpano/ChangeLog 2006-11-25 10:27:57 UTC (rev 612) @@ -1,5 +1,7 @@ 2006-11-25 dmg <dm...@uv...> + * Removed makefile.osx which is badly out of date. + * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre17 * tiff.c (panoTiffWrite): Fixed a bug in the allocation of the Deleted: trunk/libpano/makefile.osx =================================================================== --- trunk/libpano/makefile.osx 2006-11-25 10:15:53 UTC (rev 611) +++ trunk/libpano/makefile.osx 2006-11-25 10:27:57 UTC (rev 612) @@ -1,54 +0,0 @@ -# Makefile for libpano12.a - -# based on makefile.linux 2004-05-02 Bruno Postle <br...@po...> -# Note: this only creates a statically linkable library and needs -# fixing in order to build a working libpano12.so or libpano12.dylib. - -sources = panorama.h filter.h fftn.h f2c.h pteditor.h \ - ptutils.h version.h \ - filter.c parser.c queryfeature.c correct.c perspect.c \ - adjust.c remap.c lmdif.c file.c \ - math.c pan.c PTDialogs.c fftn.c fourier.c resample.c \ - optimize.c morpher.c Triangulate.c \ - seamer.c ptpicker.c pteditor.c seamer_.c \ - tiff.c bmp.c jpeg.c png.c multilayer.c \ - Makefile pano12.rc pano12.def sys_ansi.c ppm.c - -objects = filter.o parser.o queryfeature.o correct.o perspect.o \ - adjust.o remap.o lmdif.o file.o math.o pan.o \ - PTDialogs.o fftn.o fourier.o resample.o optimize.o \ - morpher.o Triangulate.o seamer.o ptpicker.o pteditor.o \ - tiff.o jpeg.o png.o multilayer.o - -ansobj = sys_ansi.o ppm.o - -#CC = gcc -CC = gcc3 - -CFLAGS = -O \ - -I/usr/include/gcc/darwin/default \ - -I/usr/include \ - -I/sw/include \ - -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers \ - -D__Ansi__=1 - -libpano12.a : $(objects) $(ansobj) - $(CC) \ - -o libpano12.dylib \ - -L/usr/lib/gcc/darwin/default \ - -L/usr/lib \ - -L/sw/lib \ - -ljpeg \ - -lm \ - -ltiff \ - -lpng \ - -flat_namespace \ - -undefined suppress \ - $(objects) $(ansobj) - rm libpano12.dylib - ar cru libpano12.a *.o - ranlib libpano12.a - -install : libpano12.a - mv libpano12.a /usr/local/lib/ - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dm...@us...> - 2006-11-26 02:10:31
|
Revision: 613 http://svn.sourceforge.net/panotools/?rev=613&view=rev Author: dmg Date: 2006-11-25 18:10:31 -0800 (Sat, 25 Nov 2006) Log Message: ----------- 2006-11-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.0 * TODO: Updated this file * Makefile.am: Minor fix * tiff.c (readTIFF, writeTIFF): Finally stopped using these functions. * ptstitch.c: Fixed a bug in the computation of masks for 16 bit images, and replaced calls to readTIFF and writeTIFF * tools/PTmasker.c (main): Added some testing code * ptfeather.c (panoFeatherImage): Implemented feathering of cropped files and 16 bit images * metadata.h, metadata.c: added a bunch of simple functions to access the metatada of the image. Ideally we should not access the pointer directly any more. Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/Makefile.am trunk/libpano/TODO trunk/libpano/configure.ac trunk/libpano/metadata.c trunk/libpano/metadata.h trunk/libpano/ptstitch.c trunk/libpano/tests/ChangeLog trunk/libpano/tests/panoAutomateTest.pl trunk/libpano/tiff.c trunk/libpano/tools/PTmasker.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/ChangeLog 2006-11-26 02:10:31 UTC (rev 613) @@ -1,7 +1,27 @@ 2006-11-25 dmg <dm...@uv...> - * Removed makefile.osx which is badly out of date. + * version.h (VERSION), configure.ac Upgraded to version 2.9.0 + * TODO: Updated this file + + * Makefile.am: Minor fix + + * tiff.c (readTIFF, writeTIFF): Finally stopped using these functions. + + * ptstitch.c: Fixed a bug in the computation of masks for 16 bit + images, and replaced calls to readTIFF and writeTIFF + + * tools/PTmasker.c (main): Added some testing code + + * ptfeather.c (panoFeatherImage): Implemented feathering of + cropped files and 16 bit images + + * metadata.h, metadata.c: added a bunch of simple functions to + access the metatada of the image. Ideally we should not access the pointer + directly any more. + +2006-11-25 dmg <dm...@uv...> + * version.h (VERSION), configure.ac Upgraded to version 2.8.5pre17 * tiff.c (panoTiffWrite): Fixed a bug in the allocation of the Modified: trunk/libpano/Makefile.am =================================================================== --- trunk/libpano/Makefile.am 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/Makefile.am 2006-11-26 02:10:31 UTC (rev 613) @@ -16,7 +16,7 @@ STD_HDR = panorama.h filter.h version.h panotypes.h PTcommon.h pt_stdint.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.c ptfeather.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 TOOL_HDR = queryfeature.h pteditor.h ptutils.h Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/TODO 2006-11-26 02:10:31 UTC (rev 613) @@ -5,31 +5,32 @@ KNOWN BUGS: ---------------------------------------------------------------------- -1. PTcrop tries to read the entire image at once. With a huge image I +- 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. -2. PTcrop needs to be able to crop images as a "set" (that is, compute - the bounding rectangle of a group of images) not only as a single - one. +- PTroller runs _extremely_ slow. I need to find out why. -3. PTroller runs _extremely_ slow. I need to find out why. - -4. PTtiff2psd is unable to create PSDs beyond certain size (I suspect +- 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" - * 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 + panoImageDispose routine. * Command line processing. All tools should have similar command line processing. This needs to be checked, and updated, if necessary. ---------------------------------------------------------------------- +panoinfo: + +- Update it. + +---------------------------------------------------------------------- + PTmender: - Allow the specification of the images in the command line @@ -65,8 +66,12 @@ ---------------------------------------------------------------------- PTcrop: -* Feature: compute the inner rectangle with the largest area. +- It needs to be able to crop images as a "set" (that is, compute the + bounding rectangle of a group of images) not only as a single one. +- Compute the inner rectangle with the largest area (not a priority) + + ---------------------------------------------------------------------- PTtiff2psd: Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/configure.ac 2006-11-26 02:10:31 UTC (rev 613) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.8.5pre17], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.0], BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([PTDialogs.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) Modified: trunk/libpano/metadata.c =================================================================== --- trunk/libpano/metadata.c 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/metadata.c 2006-11-26 02:10:31 UTC (rev 613) @@ -30,6 +30,9 @@ // update metadata from an image. IT does not update cropped information #include <stdio.h> + +#include <assert.h> + #include "panorama.h" #include "metadata.h" @@ -74,3 +77,81 @@ // The full size remains the same, // The rest of the metadata should be the same } + +int panoImageIsCropped(Image *image) +{ + assert(image!= NULL); + return (image->metadata.isCropped); +} + +int panoImageBytesPerPixel(Image *image) +{ + return (image->metadata.bitsPerSample * image->metadata.samplesPerPixel )/ 8; +} + +int panoImageBytesPerLine(Image *image) +{ + return (image->metadata.bytesPerLine); +} + +int panoImageBitsPerSample(Image *image) +{ + return (image->metadata.bitsPerSample); +} + +int panoImageFullWidth(Image *image) +{ + assert(image!= NULL); + if (panoImageIsCropped(image)) + return image->metadata.cropInfo.fullWidth; + else + return image->width; +} + +int panoImageWidth(Image *image) +{ + assert(image!= NULL); + return image->width; +} + +int panoImageHeight(Image *image) +{ + assert(image!= NULL); + return image->height; +} + + + +int panoImageFullHeight(Image *image) +{ + assert(image!= NULL); + if (panoImageIsCropped(image)) + return image->metadata.cropInfo.fullHeight; + else + return image->width; +} + + +int panoImageOffsetX(Image *image) +{ + assert(image!= NULL); + if (panoImageIsCropped(image)) + return image->metadata.cropInfo.xOffset; + else + return 0; +} + + +int panoImageOffsetY(Image *image) +{ + assert(image!= NULL); + if (panoImageIsCropped(image)) + return image->metadata.cropInfo.yOffset; + else + return 0; +} + +unsigned char *panoImageData(Image *image) +{ + return *(image->data); +} Modified: trunk/libpano/metadata.h =================================================================== --- trunk/libpano/metadata.h 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/metadata.h 2006-11-26 02:10:31 UTC (rev 613) @@ -34,5 +34,17 @@ int panoMetadataUpdateFromImage(Image *im); void panoUnCropMetadata(pano_ImageMetadata * metadata); void panoMetadataCropSizeUpdate(pano_ImageMetadata * metadata, pano_CropInfo *cropInfo); +int panoImageIsCropped(Image *image); +int panoImageBytesPerPixel(Image *image); +int panoImageBitsPerSample(Image *image); +int panoImageBytesPerLine(Image *image); +int panoImageFullWidth(Image *image); +int panoImageFullHeight(Image *image); +int panoImageOffsetX(Image *image); +int panoImageOffsetY(Image *image); +int panoImageWidth(Image *image); +int panoImageHeight(Image *image); +unsigned char *panoImageData(Image *image); + #endif Modified: trunk/libpano/ptstitch.c =================================================================== --- trunk/libpano/ptstitch.c 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/ptstitch.c 2006-11-26 02:10:31 UTC (rev 613) @@ -34,6 +34,7 @@ #include "ptstitch.h" #include "PTcommon.h" #include "ptfeather.h" +#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) @@ -146,7 +147,7 @@ // determine the type of image - bytesPerPixel = image->bitsPerPixel/8; + bytesPerPixel = panoImageBytesPerPixel(image); // Use the GreenBlue pixel area is used to keep a counter of the // minimum distance (in pixels) away we are from the edges of the @@ -164,17 +165,20 @@ // for each row // repeat the same algorithm (done per column) - for (column = 0; column < image->width; column++) { + for (column = 0; column < panoImageWidth(image); column++) { count = 0; // Point to the given column in row 0 - ptr = *image->data + column * bytesPerPixel; + + ptr = panoImageData(image) + column * bytesPerPixel; + // fprintf(stderr, "St1.1 Column[%d]\n", column); // From top to bottom - for (row = 0; row < image->height; row++) { + for (row = 0; row < panoImageHeight(image); row++) { + // Get alpha channel for this point - pixel = ptr + row * image->bytesPerLine; + pixel = ptr + row * panoImageBytesPerLine(image); alphaChannel = panoStitchPixelChannelGet(pixel, bytesPerPixel, 0); @@ -213,7 +217,7 @@ // process from left to right for (column = 0; column < image->width; column++) { - pixel = ptr + 4 * column; + pixel = ptr + panoImageBytesPerPixel(image) * column; panoStitchPixelDetermineMap(pixel, bytesPerPixel, &count); } // for column @@ -227,7 +231,7 @@ column = image->width; while (--column >= 0) { - pixel = ptr + 4 * column; + pixel = ptr + panoImageBytesPerPixel(image) * column; panoStitchPixelDetermineMap(pixel, bytesPerPixel, &count); } @@ -264,7 +268,7 @@ } } - if (readTIFF(&image, &inputFiles[index]) != 0) { + if (panoTiffRead(&image, inputFiles[index].name) == 0) { PrintError("Could not read TIFF-file"); return 0; } @@ -279,7 +283,10 @@ return -1; } - writeTIFF(&image, &maskFiles[index]); + if (panoTiffWrite(&image, maskFiles[index].name) == 0) { + PrintError("Could not write TIFF-file [%s]", maskFiles[index].name); + return -1; + } // fprintf(stderr, "Written to file %s\n", maskFiles[index].name); @@ -318,13 +325,12 @@ int j; int bytesPerLine; + assert(imageParms->bytesPerPixel == 8); - assert(imageParms->bytesPerPixel == 4); - bytesPerLine = imageParms->cropInfo.fullWidth * imageParms->bytesPerPixel; for (column = 0, pixel = imagesBuffer; - column < imageParms->cropInfo.fullWidth; column++, pixel += 8) { + column < imageParms->cropInfo.fullWidth; column++, pixel += imageParms->bytesPerPixel) { best = 0; ptrCount = (uint16_t *) (pixel + 2); @@ -560,8 +566,8 @@ pano_ImageMetadata * imageMetadata) { - switch (imageMetadata->bitsPerPixel) { - case 32: + switch (imageMetadata->bitsPerSample) { + case 8: panoStitchSetBestAlphaChannel8bits(imagesBuffer, numberImages, imageMetadata); break; case 16: @@ -845,7 +851,7 @@ memcpy(&feathered, &maskFiles[i], sizeof(fullPath)); - if (!panoFeatherFiles(&withAlphaChannel, &feathered, featherSize)) { + if (!panoFeatherFile(&withAlphaChannel, &feathered, featherSize)) { PrintError("Unable to apply feather to image %d", i); return -1; } Modified: trunk/libpano/tests/ChangeLog =================================================================== --- trunk/libpano/tests/ChangeLog 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/tests/ChangeLog 2006-11-26 02:10:31 UTC (rev 613) @@ -1,3 +1,7 @@ +2006-11-25 dmg <dm...@uv...> + + * panoAutomateTest.pl: CHanged from PTremap to PTmender + 2006-10-26 dmg <dm...@uv...> * panoAutomateTest.pl: Disable all tests but tiff_m Modified: trunk/libpano/tests/panoAutomateTest.pl =================================================================== --- trunk/libpano/tests/panoAutomateTest.pl 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/tests/panoAutomateTest.pl 2006-11-26 02:10:31 UTC (rev 613) @@ -13,7 +13,7 @@ \n " if scalar(@ARGV) < 1; -my $stitcher = '../../tools/PTremap'; +my $stitcher = '../../tools/PTmender'; #my $stitcher = '/usr/local/bin/PTmender'; $, = ' '; Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/tiff.c 2006-11-26 02:10:31 UTC (rev 613) @@ -258,12 +258,15 @@ +#ifdef DEPRECATED int readTIFF(Image * im, fullPath * sfile) { char filename[512]; TIFF *tif; int result = 0; + + #ifdef __Mac__ unsigned char the_pcUnixFilePath[512]; //added by Kekus Digital Str255 the_cString; @@ -311,7 +314,6 @@ return result; } - int writeCroppedTIFF(Image * im, fullPath * sfile, CropInfo * crop_info) { char string[512]; @@ -455,12 +457,15 @@ } + int writeTIFF(Image * im, fullPath * sfile) { return writeCroppedTIFF(im, sfile, &(im->cropInformation)); } +#endif + void RGBAtoARGB(UCHAR * buf, int width, int bitsPerPixel) { int x; @@ -1411,7 +1416,6 @@ } // end Rik's mask-from-focus hacking (for the moment...) - printf("Here\n"); bufsize = TIFFScanlineSize(tif->tiff); if (bufsize < im->bytesPerLine) @@ -1424,18 +1428,14 @@ } for (y = 0; y < im->height; y++) { - printf("Here 1 buffsize %d bytesperline %d width %d\n", bufsize, im->bytesPerLine, im->width); + // 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); - printf("Here 2\n"); ARGBtoRGBA(buf, im->width, im->bitsPerPixel); - printf("Here 3\n"); if (TIFFWriteScanline(tif->tiff, buf, y, 0) != 1) { PrintError("Unable to write to TIFF"); goto error; } - printf("Here 4\n"); - } panoTiffClose(tif); free(buf); Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/tools/PTmasker.c 2006-11-26 02:10:31 UTC (rev 613) @@ -143,12 +143,19 @@ + // Generate output file names if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { return -1; } +#ifdef testingfeather + panoFeatherFile(ptrInputFiles, ptrOutputFiles, feather); + exit(1); +#endif + + if (! ptForceProcessing) { char *temp; if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-25 10:27:57 UTC (rev 612) +++ trunk/libpano/version.h 2006-11-26 02:10:31 UTC (rev 613) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.8.5pre17 " +#define VERSION "2.9.0 " #endif #ifndef PTVERSION_NAME_LONG @@ -38,7 +38,7 @@ #endif #ifndef PTVERSION_FILEVERSIONNUMBER -#define PTVERSION_FILEVERSIONNUMBER 2,8,5,-1 +#define PTVERSION_FILEVERSIONNUMBER 2,9,0,-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 03:48:08
|
Revision: 614 http://svn.sourceforge.net/panotools/?rev=614&view=rev Author: dmg Date: 2006-11-28 19:48:07 -0800 (Tue, 28 Nov 2006) Log Message: ----------- 2006-11-28 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.0 * tiff.c (panoImageBoundingRectangleCompute): Remove a debug statement. * file.h: removed a wrong comment * tools/PTcrop.c (main): Renamed option -o to -f (to be consistent) * tiff.c (panoTiffCrop): Do processing in a temporal file, instead of directly in the output file * PTcommon.c: Removed some dead code * PTcommon.c (panoCreatePanorama): The calculation of the ROI is not done correctly for circular fisheye images (CFIs). For the time being we will do uncrop processing for CFIs, and cropped processing for everything else. For fisheyes we will create crops in post-processing (it is a hack, but it means everything is consistent). * tools/PTroller.c (main): Fixed a warning * adjust.c (SetMakeParams): Added some debugging code (and commented it out) * parser.c (ReadImageDescription): Croping options were not working properly when 2 cropping specs were specified in the same command line. For instance, when M=0 was specified any cropping on the image was considered a type C crop. The new behaviour is the following: if M is specified with parameter == 0, then it is ignored For project wFor project wFor project wFor project wFor project wFor projec prFor project wFor project wFor project wFor project wFor proje27 dmg <dm...@uv...> * ColourBrightness.c (CorrectFileColourBrightness): Replaced readTIFF and writeTIFF with panoTiffRead and panoTiffWrite. Added some error checking * PTcommon.c (panoPSDCreate): Replaced readTIFF with panoTiffRead 2006-11-26 dmg <dm...@uv...> * file.c (panoImageRead): Fixed bug in return value of panoReadImage Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/ColourBrightness.c trunk/libpano/PTcommon.c trunk/libpano/TODO trunk/libpano/adjust.c trunk/libpano/configure.ac trunk/libpano/file.c trunk/libpano/file.h trunk/libpano/parser.c trunk/libpano/tiff.c trunk/libpano/tools/PTcrop.c trunk/libpano/tools/PTmasker.c trunk/libpano/tools/PTmender.c trunk/libpano/tools/PTroller.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/ChangeLog 2006-11-29 03:48:07 UTC (rev 614) @@ -1,3 +1,56 @@ +2006-11-28 dmg <dm...@uv...> + + * version.h (VERSION), configure.ac Upgraded to version 2.9.0 + + * tiff.c (panoImageBoundingRectangleCompute): Remove a debug + statement. + + * file.h: removed a wrong comment + + * tools/PTcrop.c (main): Renamed option -o to -f (to be consistent) + + * tiff.c (panoTiffCrop): Do processing in a temporal file, instead + of directly in the output file + + * PTcommon.c: Removed some dead code + + * PTcommon.c (panoCreatePanorama): The calculation of the ROI is + not done correctly for circular fisheye images (CFIs). For the + time being we will do uncrop processing for CFIs, and cropped + processing for everything else. For fisheyes we will create crops + in post-processing (it is a hack, but it means everything is + consistent). + + * tools/PTroller.c (main): Fixed a warning + + * adjust.c (SetMakeParams): Added some debugging code (and + commented it out) + + * parser.c (ReadImageDescription): Croping options were not + working properly when 2 cropping specs were specified in the same + command line. For instance, when M=0 was specified any cropping on + the image was considered a type C crop. The new behaviour is the + following: + + if M is specified with parameter == 0, then it is ignored + + For project with two different types of cropping (M<>0, S or C) + the first takes precedence over the second, and a warning is + displayed. + + +2006-11-27 dmg <dm...@uv...> + + * ColourBrightness.c (CorrectFileColourBrightness): Replaced + readTIFF and writeTIFF with panoTiffRead and panoTiffWrite. Added + some error checking + + * PTcommon.c (panoPSDCreate): Replaced readTIFF with panoTiffRead + +2006-11-26 dmg <dm...@uv...> + + * file.c (panoImageRead): Fixed bug in return value of panoReadImage + 2006-11-25 dmg <dm...@uv...> * version.h (VERSION), configure.ac Upgraded to version 2.9.0 Modified: trunk/libpano/ColourBrightness.c =================================================================== --- trunk/libpano/ColourBrightness.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/ColourBrightness.c 2006-11-29 03:48:07 UTC (rev 614) @@ -753,26 +753,24 @@ } - int CorrectFileColourBrightness(fullPath *inPath, fullPath *outPath, magnolia_struct *magnolia, int parm3) { Image image; CropInfo crop_info; char tempString[512]; - if (readTIFF (&image, inPath) != 0) { + if (panoTiffRead (&image, inPath->name) != 0) { sprintf(tempString, "Could not read TIFF file %s", inPath->name); PrintError(tempString); return -1; } - // TODO: add error checking to the write - - - getCropInformation(inPath->name, &crop_info); - CorrectImageColourBrigthness(&image, magnolia, parm3); - writeCroppedTIFF(&image, outPath, &crop_info); + if (panoTiffWrite(&image, outPath->name) == 0) { + PrintError("Could not read TIFF file %s", inPath->name); + myfree((void**)image.data); + return -1; + } myfree((void**)image.data); return(0); @@ -780,7 +778,6 @@ } - int FindNextCandidate(int candidates[], calla_struct *calla) { Modified: trunk/libpano/PTcommon.c =================================================================== --- trunk/libpano/PTcommon.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/PTcommon.c 2006-11-29 03:48:07 UTC (rev 614) @@ -144,7 +144,7 @@ } } - if (readTIFF(ptrImage, &fullPathImages[i]) != 0) { + if (panoTiffRead(ptrImage, fullPathImages[i].name) == 0) { PrintError("Could not read TIFF image No &d", i); if (ptQuietFlag == 0) @@ -298,6 +298,7 @@ if (image->format == _fisheye_circ) { + // TODO // This routine works only in fisheyes in portrait mode // it probably fails in landscape mode @@ -436,129 +437,9 @@ return; - -#ifdef not_implemented_yet - - - // THIS IS the code for fisheye_circular 24 bits, but I don't understand it yet. - - pixelPtr = right; - currentColumn = left; - - eax = left + right; - - - var20 = (left + right) / 2; - var24 = (top + bottom) / 2; - assert(left >= right); - temp = (left - right) / 2; - tmpStr28 = temp * temp; - - - dataPtr = *(image->data); - - for (currentRow = 0; currentRow < image->height; currentRow++) { - - currentColumn = 0; - pixelPtr = dataPtr; - - if (currentColumn < image->width) { - - - temp = currentRow - var24; - - var36 = temp * temp; - - do { - - temp = currentColumn - var20; - temp = temp * temp + var36; - - if (%eax > tmpStr28) { - - *pixelPtr = 0; //moves only 1 byte - } - - currentColumn++; - pixelPtr += bytesPerPixel; - - } while (currentColumn < image->width); - - } // if ( currentColumn < image->width ) { - - - dataPtr += image->bytesPerLine; - - - } //for ( ; currentRow < image->height ; ) { - - return; -} //if ( image->bitsPerPixel == $0x20 ) { -#endif - - - -#ifdef not_implemented_yet - -THIS IS the code for fisheye_circular 64 bits - -var20 = (left + right) /2; - -var24 = (top + bottom) / 2; - -currentColumn = (left - right) / 2; - -tmpStr28 = currentColumn * currentColumn; - -dataPtr = *(image->data); - -for (currentRow = 0;; currentRow < image->height; ++currentRow) { - //if ( currentRow >= image->height ) - // return; - - currentColumn = 0; - pixelPtr = dataPtr; - - if (currentColumn < image->width) { - - var40 = (currentRow * var24) * (currentRow * var24); - - do { - - eax = currentColumn * currentColumn + var40; - - if (%eax > tmpStr28) { - *pixelPtr = 0; // Again CAREFUL, moves 8 bytes - } - - currentColumn++; - pixelPtr = bytesPerPixel; - - } while (currentColumn < image->width); - //if ( currentColumn < image->width ) - // - - } //if ( currentColumn < image->width ) { - - dataPtr += image->bytesPerLine; - -} //for ( ; %currentRow < image->height ; ) -#endif - -return; - - } -void Unknown09(Image * currentImagePtr) -{ - // NEEDED - fprintf(stderr, "Unknown09 this function is not implemented yet\n"); - exit(1); -} - - /** * This function computes the minimal rectangle needed to encompass * the region of the output image (TrPtr->dest) that will be populated with @@ -647,7 +528,10 @@ //printf("ROI: %d,%d - %d, %d\n", ROIRect->left, ROIRect->top, ROIRect->right, ROIRect->bottom); } +#if 0 +// NO LONGER NEEDED + /** * Populates the CropInfo struct with data about cropping of * the TIFF file specified by filename @@ -667,7 +551,6 @@ } - void setFullSizeImageParameters(pt_tiff_parms * imageParameters, CropInfo * crop_info) { @@ -679,7 +562,9 @@ imageParameters->imageWidth * (imageParameters->bitsPerPixel / 8); } +#endif + int panoCreatePanorama(fullPath ptrImageFileNames[], int counterImageFiles, fullPath * panoFileName, fullPath * scriptFileName) { @@ -801,6 +686,43 @@ goto mainError; } + // printf("*********cut frame: should be zero for S and no crop %d\n", prefs->im.cP.cutFrame); + + //New for PTMender...PTMender uses "cropped" TIFFs as its intermediate file + //format for all processing. In contrast, PTStitcher used full-size TIFF + //images for all intermediate processing. PTMender can still write "uncropped" + //final as needed. + // + //To the end user, PTMender appears to behave similarly to PTStitcher for + //TIFF_m and TIFF_mask formats, outputting a one "full-size" TIFF for each + //layer. However, the internal processing is done on cropped TIFFs which + //speeds things up considerably. + // + //An important improvement over PTStitcher is that the user can also explicitly + //requests cropped output for multi layer TIFF output by inlcluding + //"r:CROP" as part of the "p" line (e.g. n"TIFF_m r:CROP") + // + //Using cropped TIFF as the intermediate format significantly speeds up + //processing, with larger panos showing more dramatic increases in speed. + //It should also mean that the creation of the "flattened" formats will + //be significantly more memory-friendly, as the masking steps and PSD + //assembly steps won't need to load images the size of the output file + //into memory at once. Unless the PTMender is fed extremely large input + //images, all memory constraints should now be a thing of the past (MRDL - May 2006). + + //croppedTIFFIntermediate determines if all intermediate processing is done + //with cropped or full size TIFF. There probably isn't much of a reason + //to ever disable this feature, other than for testing/debugging purposes. + + + // By default we do cropped TIFF, + // but at this point we cannot properly calculate the ROI for fisheyes, so just + // process them uncropped. + + if (prefs->im.format == _fisheye_circ) { + croppedTIFFIntermediate = 0; + } + colourCorrection = prefs->sBuf.colcorrect; // This is a strange value: // colourCorrection == (i & 3) + (i+1)*4; @@ -844,34 +766,7 @@ } - //New for PTMender...PTMender uses "cropped" TIFFs as its intermediate file - //format for all processing. In contrast, PTStitcher used full-size TIFF - //images for all intermediate processing. PTMender can still write "uncropped" - //final as needed. - // - //To the end user, PTMender appears to behave similarly to PTStitcher for - //TIFF_m and TIFF_mask formats, outputting a one "full-size" TIFF for each - //layer. However, the internal processing is done on cropped TIFFs which - //speeds things up considerably. - // - //An important improvement over PTStitcher is that the user can also explicitly - //requests cropped output for multi layer TIFF output by inlcluding - //"r:CROP" as part of the "p" line (e.g. n"TIFF_m r:CROP") - // - //Using cropped TIFF as the intermediate format significantly speeds up - //processing, with larger panos showing more dramatic increases in speed. - //It should also mean that the creation of the "flattened" formats will - //be significantly more memory-friendly, as the masking steps and PSD - //assembly steps won't need to load images the size of the output file - //into memory at once. Unless the PTMender is fed extremely large input - //images, all memory constraints should now be a thing of the past (MRDL - May 2006). - //croppedTIFFIntermediate determines if all intermediate processing is done - //with cropped or full size TIFF. There probably isn't much of a reason - //to ever disable this feature, other than for testing/debugging purposes. - - croppedTIFFIntermediate = 1; - transform.interpolator = prefs->interpolator; transform.gamma = prefs->gamma; @@ -883,15 +778,18 @@ //Read input image into transform.src if (panoImageRead(currentImagePtr, &ptrImageFileNames[loopCounter]) == 0) { - PrintError("Could not read input image %s", ptrImageFileNames[loopCounter].name); + PrintError("Could not read input image [%s]", ptrImageFileNames[loopCounter].name); goto mainError; } - // printf("Ended reading INPUT image\n"); + // printf("Ended reading INPUT image\n"); //This "masks" the input image so that some pixels are excluded from //transformation routine during pixel remapping/interpolation + if (prefs->im.cP.cutFrame != 0) { // remove frame? 0 - no; 1 - yes + // THIS CODE is executed in crop C type only, but not in S type + // printf("To crop image\n"); if (CropImage(currentImagePtr, &(prefs->im.selection)) == 0) { prefs->im.selection.left = 0; prefs->im.selection.right = 0; @@ -899,7 +797,6 @@ prefs->im.selection.top = 0; } } - //setup width/height of input image prefs->im.width = image1.width; prefs->im.height = image1.height; @@ -949,6 +846,7 @@ metadata.imageTotalNumber = counterImageFiles; metadata.imageDescription = strdup(regScript); + // Set output width/height for output file if (croppedTIFFIntermediate) { getROI(&transform, prefs, &ROIRect); @@ -1065,6 +963,13 @@ image1.selection.left = prefs->im.selection.left; image1.selection.right = prefs->im.selection.right; + /* + printf("****** Image selection hfov %f, %d %d %d %d \n", image1.hfov, image1.selection.top, + image1.selection.bottom, + image1.selection.left, + image1.selection.right); + */ + CopyPosition(&resultPanorama, &(prefs->pano)); //Set image data outside selection region to zeros @@ -1088,6 +993,15 @@ 1 : resultPanorama.height)) { // Call the main pixel remapping routine...all the interpolation happens here + + /* + printf("Prefs: %f\n", prefs->pano.hfov); + printf("Prefs im: hvof %f, yaw %f pitch %f, roll %f\n", prefs->im.hfov, prefs->im.yaw, prefs->im.pitch, prefs->im.roll); + printf("Prefs pano: hvof %f, vfov %f pitch %f, roll %f\n", prefs->pano.hfov, prefs->pano.yaw, prefs->pano.pitch, prefs->pano.roll); + printf("Prefs Interpolator %d:\n", prefs->interpolator); + printf("Prefs Gamma %d:\n", prefs->gamma); + */ + MakePano(&transform, prefs); if (transform.success == 0) { // Error @@ -1149,7 +1063,22 @@ } panoTiffClose(tiffFile); + + if (croppedTIFFIntermediate == 0) { + // We can't process (yet) all files in cropped mode + // To quite the roar from the masses let them think we + // do. I wonder how long it will take for them to notice. Placebo effect? + pano_cropping_parms croppingParms; + bzero(&croppingParms, sizeof(croppingParms)); + + if (panoTiffCrop(currentFullPath.name, currentFullPath.name, &croppingParms) == 0) { + PrintError("Unable to write output file %s", currentFullPath.name); + remove(tempScriptFile.name); + return (-1); + } + } + ////////////////////////////////////////////////////////////////////// if (image1.data != NULL) { Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/TODO 2006-11-29 03:48:07 UTC (rev 614) @@ -2,40 +2,66 @@ This file documents the activities required before we release version 3.0.0 of the library. + +====================================================================== 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 + - 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. -- PTroller runs _extremely_ slow. I need to find out why. +- 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" -* 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. -* Command line processing. All tools should have similar command line - processing. This needs to be checked, and updated, if necessary. - ---------------------------------------------------------------------- panoinfo: -- Update it. +- Update it. CRITICAL ---------------------------------------------------------------------- PTmender: -- Allow the specification of the images in the command line +- 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 + +- PTmender is not properly calculating ROI for some images. In + particular (at least) circular fisheyes that cover the zenit or the + nadir. Currently these types of images require full size processing + (as opposed to cropped processing). + +---------------------------------------------------------------------- +PTtiff2psd: + +DESIRABLE: + +Create PSDs of one layer 8 and 16 bit images + +====================================================================== + +After 3.0.0: + DESIRABLE FEATURES: - Output a text file with the names of the files processed and extra Modified: trunk/libpano/adjust.c =================================================================== --- trunk/libpano/adjust.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/adjust.c 2006-11-29 03:48:07 UTC (rev 614) @@ -724,6 +724,17 @@ mp->rot[0] = mp->distance * PI; // 180 in screenpoints mp->rot[1] = -im->yaw * mp->distance * PI / 180.0; // rotation angle in screenpoints + + /* + printf("Image format %d\n", im->format); + printf("shear[0] %f\n", mp->shear[0]); + printf("shear[1] %f\n", mp->shear[1]); + printf("rot[0] %f\n", mp->rot[0]); + printf("rot[1] %f\n", mp->rot[1]); + printf("scale[0] %f\n", mp->rot[0]); + */ + + mp->perspect[0] = (void*)(mp->mt); mp->perspect[1] = (void*)&(mp->distance); Modified: trunk/libpano/configure.ac =================================================================== --- trunk/libpano/configure.ac 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/configure.ac 2006-11-29 03:48:07 UTC (rev 614) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.5) -AC_INIT([pano13], [2.9.0], BUG-REPORT-ADDRESS) +AC_INIT([pano13], [2.9.1], 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-26 02:10:31 UTC (rev 613) +++ trunk/libpano/file.c 2006-11-29 03:48:07 UTC (rev 614) @@ -2355,10 +2355,11 @@ assert(sfile != NULL); assert(im != NULL); + printf("Filename %s\n", sfile->name); ext = strrchr(sfile->name, '.'); if (ext == NULL || strlen(ext) != 4) { PrintError("Unsupported file format [%s]: must have extension JPG, PNG, TIF, BMP or HDR", sfile); - return -1; + return 0; } ext++; strcpy(extension, ext); Modified: trunk/libpano/file.h =================================================================== --- trunk/libpano/file.h 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/file.h 2006-11-29 03:48:07 UTC (rev 614) @@ -51,7 +51,7 @@ } pano_flattening_parms; typedef struct { - int type; // 1 if images are stacked + int type; // int forceProcessing; } pano_cropping_parms; Modified: trunk/libpano/parser.c =================================================================== --- trunk/libpano/parser.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/parser.c 2006-11-29 03:48:07 UTC (rev 614) @@ -1258,11 +1258,14 @@ char *ch = line; char buf[LINE_LENGTH]; int i; - + int cropping = 0; + int tempInt; + char typeParm; memcpy( &im, imPtr, sizeof(Image) ); memcpy( &sBuf, sPtr, sizeof(stBuf )); + // printf("************************************* Before Cut Frame %d \n", im.cP.cutFrame); while( *ch != 0) { switch(*ch) @@ -1328,32 +1331,77 @@ sBuf.colcorrect += (i+1)*4; break; case 'm': // Frame - ch++; - switch( *ch ) - { - case 'x': - READ_VAR( "%d", &im.cP.fwidth ); - im.cP.cutFrame = TRUE; - break; - case 'y': - READ_VAR( "%d", &im.cP.fheight ); - im.cP.cutFrame = TRUE; - break; - default: - ch--; - READ_VAR( "%d", &(im.cP.frame) ); - im.cP.cutFrame = TRUE; - break; - } - break; + //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': nextWord( buf, &ch ); + 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': nextWord( buf, &ch ); + 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; @@ -1361,7 +1409,8 @@ break; } } - + + // 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] Modified: trunk/libpano/tiff.c =================================================================== --- trunk/libpano/tiff.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/tiff.c 2006-11-29 03:48:07 UTC (rev 614) @@ -1862,8 +1862,8 @@ - fprintf(stderr, "Finding boudinging box: x %d y %d width %d height %d\n", (int)cropInfo->xOffset, (int)cropInfo->yOffset, - (int)cropInfo->croppedWidth, (int)cropInfo->croppedHeight); + // fprintf(stderr, "Finding boudinging box: x %d y %d width %d height %d\n", (int)cropInfo->xOffset, (int)cropInfo->yOffset, + // (int)cropInfo->croppedWidth, (int)cropInfo->croppedHeight); return 1; } @@ -1880,13 +1880,19 @@ Image im; unsigned char *data = NULL; int i; + fullPath tempFile; + // Let us do the processing in a different file + if (panoFileMakeTemp(&tempFile) == 0) { + PrintError("Could not make Tempfile"); + return -1; + } + if (panoTiffRead(&im, inputFile) ==0 ) { PrintError("Unable to open input file %s", inputFile); goto error; } - // Compute inner rectangle panoImageBoundingRectangleCompute(*im.data, im.width, im.height, im.bitsPerPixel/8, &cropInfo); @@ -1904,7 +1910,7 @@ panoMetadataCropSizeUpdate(&metadata, &cropInfo); if ((tiffOutput = - panoTiffCreate(outputFile, &metadata)) == NULL) { + panoTiffCreate(tempFile.name, &metadata)) == NULL) { PrintError("Unable to create output file [%s]", outputFile); goto error; } @@ -1936,15 +1942,22 @@ //printf("Finished\n"); panoTiffClose(tiffOutput); + remove(outputFile); + if (rename(tempFile.name, outputFile) != 0) { + PrintError("Unable to create output file %s", outputFile); + } + return 1; error: // Error handler // Make sure we release any resources we have - if (tiffOutput != NULL) + if (tiffOutput != NULL) { panoTiffClose(tiffOutput); + remove(tempFile.name); + } return 0; } Modified: trunk/libpano/tools/PTcrop.c =================================================================== --- trunk/libpano/tools/PTcrop.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/tools/PTcrop.c 2006-11-29 03:48:07 UTC (rev 614) @@ -31,7 +31,7 @@ #define PT_CROP_USAGE "PTuncrop [options] <inputFile> <outputFile>\n\n" \ "Options:\n" \ - "-o\t\tOverwrite output file if it exists\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" \ "\n" @@ -65,14 +65,14 @@ printf(PT_CROP_VERSION); - while ((opt = getopt(argc, argv, "ohq")) != -1) { + 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 'o': + case 'f': overwrite = 1; break; case 'q': Modified: trunk/libpano/tools/PTmasker.c =================================================================== --- trunk/libpano/tools/PTmasker.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/tools/PTmasker.c 2006-11-29 03:48:07 UTC (rev 614) @@ -141,9 +141,6 @@ return -1; } - - - // Generate output file names if (panoFileOutputNamesCreate(ptrOutputFiles, filesCount, outputPrefix) == 0) { return -1; @@ -154,8 +151,6 @@ exit(1); #endif - - if (! ptForceProcessing) { char *temp; if ((temp = panoFileExists(ptrOutputFiles, filesCount)) != NULL) { Modified: trunk/libpano/tools/PTmender.c =================================================================== --- trunk/libpano/tools/PTmender.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/tools/PTmender.c 2006-11-29 03:48:07 UTC (rev 614) @@ -68,7 +68,7 @@ int sorting_function(const void *, const void *); int hasPathInfo(char *aName); -static void panoRemapDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) +static void panoMenderDuplicateScriptFile(char *scriptFileName, char *script, fullPath *scriptPathName) { FILE* scriptFD; int temp; @@ -200,7 +200,7 @@ // 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 + // This is done recursively //an "o" line represents an input image counter = numLines(script, 'o'); @@ -213,7 +213,7 @@ // create a temporary copy we can overwrite fullPath scriptPathName; - panoRemapDuplicateScriptFile(scriptFileName.name, script, &scriptPathName); + panoMenderDuplicateScriptFile(scriptFileName.name, script, &scriptPathName); free(script); Modified: trunk/libpano/tools/PTroller.c =================================================================== --- trunk/libpano/tools/PTroller.c 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/tools/PTroller.c 2006-11-29 03:48:07 UTC (rev 614) @@ -141,7 +141,7 @@ // Verify if output file exists char *temp; if ((temp = panoFileExists(&pathName, 1)) != NULL) { - PrintError("Output filename exists %d", temp); + PrintError("Output filename exists %s", pathName.name); return -1; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-26 02:10:31 UTC (rev 613) +++ trunk/libpano/version.h 2006-11-29 03:48:07 UTC (rev 614) @@ -27,7 +27,7 @@ //version of preferences file, used to verify data #ifndef VERSION -#define VERSION "2.9.0 " +#define VERSION "2.9.1 " #endif #ifndef PTVERSION_NAME_LONG @@ -38,7 +38,7 @@ #endif #ifndef PTVERSION_FILEVERSIONNUMBER -#define PTVERSION_FILEVERSIONNUMBER 2,9,0,-1 +#define PTVERSION_FILEVERSIONNUMBER 2,9,1,-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 04:00:41
|
Revision: 615 http://svn.sourceforge.net/panotools/?rev=615&view=rev Author: dmg Date: 2006-11-28 20:00:41 -0800 (Tue, 28 Nov 2006) Log Message: ----------- Updated panoinfo_unix and ChangeLog Modified Paths: -------------- trunk/libpano/ChangeLog trunk/libpano/TODO trunk/libpano/queryfeature.c trunk/libpano/tools/panoinfo.c trunk/libpano/tools/panoinfo_unix.c trunk/libpano/version.h Modified: trunk/libpano/ChangeLog =================================================================== --- trunk/libpano/ChangeLog 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/ChangeLog 2006-11-29 04:00:41 UTC (rev 615) @@ -1,7 +1,14 @@ 2006-11-28 dmg <dm...@uv...> - * version.h (VERSION), configure.ac Upgraded to version 2.9.0 + * version.h (VERSION), configure.ac Upgraded to version 2.9.1, + updated copyrights. + * tools/panoinfo_unix.c (main): Cleaned up the output + + * queryfeature.c: Removed list of patches. It should be enough + with the version number + + * tiff.c (panoImageBoundingRectangleCompute): Remove a debug statement. Modified: trunk/libpano/TODO =================================================================== --- trunk/libpano/TODO 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/TODO 2006-11-29 04:00:41 UTC (rev 615) @@ -46,6 +46,8 @@ - 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 particular (at least) circular fisheyes that cover the zenit or the nadir. Currently these types of images require full size processing @@ -92,6 +94,8 @@ ---------------------------------------------------------------------- PTcrop: +DESIRABLE + - It needs to be able to crop images as a "set" (that is, compute the bounding rectangle of a group of images) not only as a single one. Modified: trunk/libpano/queryfeature.c =================================================================== --- trunk/libpano/queryfeature.c 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/queryfeature.c 2006-11-29 04:00:41 UTC (rev 615) @@ -116,6 +116,9 @@ {"FilterName22","Blackman/Bessel"}, {"FilterType23","aa"}, {"FilterName23","Blackman/sinc"}, +#if 0 + // WE NO longer support need to list them. It should be enough to list the version + // Patches that have been applied {"Patch200510a", "Rob Platt, Do not process unchanged color channels for CA correction"}, {"BMPrev", "Jim Watters, correctly open BMP files created with rows in reverse order"}, @@ -138,6 +141,7 @@ {"Patch200312a", "Jim Watters, Updated PSD format, http://photocreations.ca/panotools"}, {"Patch200309a", "Jim Watters, Allowed linking of y, p, & r values, http://photocreations.ca/panotools"}, {"Patch200308a", "Jim Watters, Improved Radial Luminance, http://photocreations.ca/panotools"} +#endif }; /***************** end feature tables **********************/ Modified: trunk/libpano/tools/panoinfo.c =================================================================== --- trunk/libpano/tools/panoinfo.c 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/tools/panoinfo.c 2006-11-29 04:00:41 UTC (rev 615) @@ -53,7 +53,7 @@ char str1[1000]; char str2[10000]; - hDll = LoadLibrary("pano12.dll"); + hDll = LoadLibrary("pano13.dll"); if(!hDll) { MessageBox((HWND)NULL, "Could not load dll", "panoinfo", MB_ICONEXCLAMATION); Modified: trunk/libpano/tools/panoinfo_unix.c =================================================================== --- trunk/libpano/tools/panoinfo_unix.c 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/tools/panoinfo_unix.c 2006-11-29 04:00:41 UTC (rev 615) @@ -46,7 +46,7 @@ if(queryFeatureString (PTVERSION_NAME_FILEVERSION, sResult, sizeof(sResult)/sizeof(sResult[0]) )) { - sprintf(str1, "Pano12 file version:\t%s\n", sResult ); + sprintf(str1, "Panotools version:\t%s\n", sResult ); strcat(str2 ,str1); } @@ -93,6 +93,6 @@ strcat(str2 ,str1); free(value); } - printf("libpano12 properties and features:\n%s", str2); + printf(str2); return 0; } Modified: trunk/libpano/version.h =================================================================== --- trunk/libpano/version.h 2006-11-29 03:48:07 UTC (rev 614) +++ trunk/libpano/version.h 2006-11-29 04:00:41 UTC (rev 615) @@ -34,7 +34,7 @@ #define PTVERSION_NAME_LONG "LongVersion" #endif #ifndef LONGVERSION -#define LONGVERSION VERSION ", Copyright (c) 1998-2001, H. Dersch, de...@fh..." +#define LONGVERSION VERSION ", Copyright (c) 1998-2006, H. Dersch, de...@fh..." #endif #ifndef PTVERSION_FILEVERSIONNUMBER This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |