Index: /trunk/psLib/src/collections/psPixels.c
===================================================================
--- /trunk/psLib/src/collections/psPixels.c	(revision 4213)
+++ /trunk/psLib/src/collections/psPixels.c	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 21:46:46 $
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -89,4 +89,24 @@
         pixels->n = pixels->nalloc;
     }
+
+    return pixels;
+}
+
+psPixels* p_psPixelsAppend(psPixels* pixels, int growth, psS32 x, psS32 y)
+{
+    if (growth < 1) {
+        growth = 10;
+    }
+
+    if ( (pixels == NULL) || (pixels->n >= pixels->nalloc) ) {
+        pixels=psPixelsRealloc(pixels, pixels->nalloc+growth);
+    }
+
+    int n = pixels->n;
+
+    pixels->data[n].x = x;
+    pixels->data[n].y = y;
+
+    pixels->n++;
 
     return pixels;
Index: /trunk/psLib/src/collections/psPixels.h
===================================================================
--- /trunk/psLib/src/collections/psPixels.h	(revision 4213)
+++ /trunk/psLib/src/collections/psPixels.h	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-08 23:40:45 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -62,4 +62,15 @@
     psPixels* pixels,                  ///< psPixels to resize, or NULL to create new psPixels
     int size                           ///< the size of the coordinate vectors
+);
+
+/** Add a pixel location to a psPixels
+ *
+ *  @return psPixels*       psPixels with the value appended.
+ */
+psPixels* p_psPixelsAppend(
+    psPixels* pixels,                  ///< psPixels to append new coordinate to.  NULL creates a new one.
+    int growth,                        ///< number of elements to grow the psPixels list, if necessary.  if growth < 1, 10 is used.
+    psS32 x,                           ///< x coordinate to append
+    psS32 y                            ///< y coordinate to append
 );
 
Index: /trunk/psLib/src/dataIO/psFits.h
===================================================================
--- /trunk/psLib/src/dataIO/psFits.h	(revision 4213)
+++ /trunk/psLib/src/dataIO/psFits.h	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-09 19:40:51 $
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -251,5 +251,4 @@
 );
 
-
 /** Updates a FITS table.  The current HDU type must be either
  *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
Index: /trunk/psLib/src/fits/psFits.h
===================================================================
--- /trunk/psLib/src/fits/psFits.h	(revision 4213)
+++ /trunk/psLib/src/fits/psFits.h	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-09 19:40:51 $
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -251,5 +251,4 @@
 );
 
-
 /** Updates a FITS table.  The current HDU type must be either
  *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
Index: /trunk/psLib/src/image/psImageGeomManip.c
===================================================================
--- /trunk/psLib/src/image/psImageGeomManip.c	(revision 4213)
+++ /trunk/psLib/src/image/psImageGeomManip.c	(revision 4214)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 21:26:47 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -688,9 +688,6 @@
 }
 
-
-// XXX: implementation is awaiting working psPlaneTransform functions like
-// invert.  Also, the next SDRS should have a different signature.
 psImage* psImageTransform(psImage *output,
-                          psArray** blankPixels,
+                          psPixels* blankPixels,
                           const psImage *input,
                           const psImage *inputMask,
@@ -705,5 +702,27 @@
         psError(PS_ERR_BAD_PARAMETER_NULL, true,
                 PS_ERRORTEXT_psImage_IMAGE_NULL);
-        return NULL;
+        psFree(output);
+        return NULL;
+    }
+    psElemType type = input->type.type;
+
+    if (inputMask != NULL) {
+        if (input->numRows != inputMask->numRows || input->numCols != inputMask->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE,
+                    input->numCols, input->numRows,
+                    inputMask->numCols, inputMask->numRows );
+            psFree(output);
+            return NULL;
+        }
+        if (inputMask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,inputMask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(output);
+            return NULL;
+        }
     }
 
@@ -714,31 +733,44 @@
     }
 
-    int row0 = region.y0;
-    int row1 = region.y1;
-    int col0 = region.x0;
-    int col1 = region.x1;
-    if (col1 < 1) {
-        col1 += input->numCols;
-    }
-
-    if (row1 < 1) {
-        row1 += input->numRows;
-    }
-
-    int numRows = row1 - row0;
-    int numCols = col1 - col0;
-
-    if (numRows < 1 || numCols < 1) {
-        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
-                "The specified region is invalid.");
-        psFree(output);
-        return NULL;
-    }
-
-    // create the output image.
-    output = psImageRecycle(output, numCols, numRows, input->type.type);
-    *(psS32*)&output->col0 = region.x0;
-    *(psS32*)&output->row0 = region.y0;
-
+    int row0;
+    int row1;
+    int col0;
+    int col1;
+    int numRows;
+    int numCols;
+    if (output == NULL) { // output image size is determined by psRegion
+        row0 = region.y0;
+        row1 = region.y1;
+        col0 = region.x0;
+        col1 = region.x1;
+        if (col1 < 1) {
+            col1 += input->numCols;
+        }
+
+        if (row1 < 1) {
+            row1 += input->numRows;
+        }
+
+        numRows = row1 - row0;
+        numCols = col1 - col0;
+
+        if (numRows < 1 || numCols < 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "The specified region is invalid.");
+            psFree(output);
+            return NULL;
+        }
+        // create the output image.
+        output = psImageRecycle(output, numCols, numRows, input->type.type);
+        *(psS32*)&output->col0 = region.x0;
+        *(psS32*)&output->row0 = region.y0;
+    } else { // size of output is determined by output parameter
+        numRows = output->numRows;
+        numCols = output->numCols;
+        row0 = output->row0;
+        col0 = output->col0;
+        row1 = row0+numRows;
+        col1 = col0+numCols;
+    }
 
     // loop through the output image using the domain above and transform
@@ -747,25 +779,83 @@
     psPlane outPosition;
     psPlane* inPosition = NULL;
-    for (int row = 0; row < numRows; row++) {
-        outPosition.y = row+row0;
-        psF32* outputData=output->data.F32[row];
-        for (int col = 0; col < numCols; col++) {
-            outPosition.x = col+col0;
-            // apply the transform to get the position in the input image
-            inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition);
-
-            if (inPosition == NULL) {
-                psError(PS_ERR_UNKNOWN, false,
-                        "Failed to apply the transform");
-                psFree(output);
-                return NULL;
-            }
-            // interpolate the cooresponding input pixel to get the output pixel value.
-            outputData[col] = (psF32)psImagePixelInterpolate(input,
-                              inPosition->x, inPosition->y,
-                              inputMask, inputMaskVal, exposedValue,
-                              mode);
-
-        }
+
+    #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+    /* apply the transform to get the position in the input image */ \
+    inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition); \
+    \
+    if (inPosition == NULL) { \
+        psError(PS_ERR_UNKNOWN, false, \
+                "Failed to apply the transform"); \
+        psFree(output); \
+        return NULL; \
+    } \
+    /* interpolate the cooresponding input pixel to get the output pixel value. */ \
+    ps##TYPE value = p_psImagePixelInterpolate##MODE##_##TYPE(input, \
+                     inPosition->x, inPosition->y, \
+                     inputMask, inputMaskVal, NAN); \
+    if (isnan(value)) { \
+        if (blankPixels != NULL) { \
+            p_psPixelsAppend(blankPixels, blankPixels->nalloc, outPosition.x, outPosition.y); \
+        } \
+        value = exposedValue; \
+    } \
+
+    #define PSIMAGE_TRANSFORM_LOOP(TYPE, MODE) { \
+        for (int row = 0; row < numRows; row++) { \
+            outPosition.y = row+row0; \
+            ps##TYPE* outputData=output->data.TYPE[row]; \
+            for (int col = 0; col < numCols; col++) { \
+                outPosition.x = col+col0; \
+                PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+                outputData[col] = value; \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_TRANSFORM_FROMLIST(TYPE, MODE) { \
+        int n = pixels->n; \
+        for (int i= 0; i < n; i++) { \
+            int x = pixels->data[i].x; \
+            int y = pixels->data[i].y; \
+            if (x >= col0 && x < col1 && y >= row0 && y < row1) { \
+                outPosition.x = x; \
+                outPosition.y = y; \
+                PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+                output->data.TYPE[y][x] = value; \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_TRANSFORM_CASE(MODE) \
+case PS_INTERPOLATE_##MODE: \
+    switch (type) { \
+    case PS_TYPE_F32: \
+        PSIMAGE_TRANSFORM_LOOP(F32,MODE); \
+        break; \
+    case PS_TYPE_F64: \
+        PSIMAGE_TRANSFORM_LOOP(F64,MODE); \
+        break; \
+    default: { \
+            char* typeStr; \
+            PS_TYPE_NAME(typeStr,type); \
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, \
+                    typeStr); \
+            psFree(output); \
+            return NULL; \
+        } \
+    } \
+    break;
+
+    switch (mode) {
+        PSIMAGE_TRANSFORM_CASE(FLAT);
+        PSIMAGE_TRANSFORM_CASE(BILINEAR);
+        PSIMAGE_TRANSFORM_CASE(BILINEAR_VARIANCE);
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                mode);
+        psFree(output);
+        return NULL;
     }
 
Index: /trunk/psLib/src/image/psImageGeomManip.h
===================================================================
--- /trunk/psLib/src/image/psImageGeomManip.h	(revision 4213)
+++ /trunk/psLib/src/image/psImageGeomManip.h	(revision 4214)
@@ -8,6 +8,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-08 23:40:45 $
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -144,5 +144,5 @@
 psImage* psImageTransform(
     psImage *output,                   ///< psImage to recycle, or NULL
-    psArray** blankPixels,             ///<
+    psPixels* blankPixels,             ///< list of pixels in output image not set, or NULL if no list is desired.
     const psImage *input,              ///< psImage to apply transform to
     const psImage *inputMask,          ///< if not NULL, mask of input psImage
Index: /trunk/psLib/src/imageops/psImageGeomManip.c
===================================================================
--- /trunk/psLib/src/imageops/psImageGeomManip.c	(revision 4213)
+++ /trunk/psLib/src/imageops/psImageGeomManip.c	(revision 4214)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 21:26:47 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -688,9 +688,6 @@
 }
 
-
-// XXX: implementation is awaiting working psPlaneTransform functions like
-// invert.  Also, the next SDRS should have a different signature.
 psImage* psImageTransform(psImage *output,
-                          psArray** blankPixels,
+                          psPixels* blankPixels,
                           const psImage *input,
                           const psImage *inputMask,
@@ -705,5 +702,27 @@
         psError(PS_ERR_BAD_PARAMETER_NULL, true,
                 PS_ERRORTEXT_psImage_IMAGE_NULL);
-        return NULL;
+        psFree(output);
+        return NULL;
+    }
+    psElemType type = input->type.type;
+
+    if (inputMask != NULL) {
+        if (input->numRows != inputMask->numRows || input->numCols != inputMask->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE,
+                    input->numCols, input->numRows,
+                    inputMask->numCols, inputMask->numRows );
+            psFree(output);
+            return NULL;
+        }
+        if (inputMask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,inputMask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(output);
+            return NULL;
+        }
     }
 
@@ -714,31 +733,44 @@
     }
 
-    int row0 = region.y0;
-    int row1 = region.y1;
-    int col0 = region.x0;
-    int col1 = region.x1;
-    if (col1 < 1) {
-        col1 += input->numCols;
-    }
-
-    if (row1 < 1) {
-        row1 += input->numRows;
-    }
-
-    int numRows = row1 - row0;
-    int numCols = col1 - col0;
-
-    if (numRows < 1 || numCols < 1) {
-        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
-                "The specified region is invalid.");
-        psFree(output);
-        return NULL;
-    }
-
-    // create the output image.
-    output = psImageRecycle(output, numCols, numRows, input->type.type);
-    *(psS32*)&output->col0 = region.x0;
-    *(psS32*)&output->row0 = region.y0;
-
+    int row0;
+    int row1;
+    int col0;
+    int col1;
+    int numRows;
+    int numCols;
+    if (output == NULL) { // output image size is determined by psRegion
+        row0 = region.y0;
+        row1 = region.y1;
+        col0 = region.x0;
+        col1 = region.x1;
+        if (col1 < 1) {
+            col1 += input->numCols;
+        }
+
+        if (row1 < 1) {
+            row1 += input->numRows;
+        }
+
+        numRows = row1 - row0;
+        numCols = col1 - col0;
+
+        if (numRows < 1 || numCols < 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "The specified region is invalid.");
+            psFree(output);
+            return NULL;
+        }
+        // create the output image.
+        output = psImageRecycle(output, numCols, numRows, input->type.type);
+        *(psS32*)&output->col0 = region.x0;
+        *(psS32*)&output->row0 = region.y0;
+    } else { // size of output is determined by output parameter
+        numRows = output->numRows;
+        numCols = output->numCols;
+        row0 = output->row0;
+        col0 = output->col0;
+        row1 = row0+numRows;
+        col1 = col0+numCols;
+    }
 
     // loop through the output image using the domain above and transform
@@ -747,25 +779,83 @@
     psPlane outPosition;
     psPlane* inPosition = NULL;
-    for (int row = 0; row < numRows; row++) {
-        outPosition.y = row+row0;
-        psF32* outputData=output->data.F32[row];
-        for (int col = 0; col < numCols; col++) {
-            outPosition.x = col+col0;
-            // apply the transform to get the position in the input image
-            inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition);
-
-            if (inPosition == NULL) {
-                psError(PS_ERR_UNKNOWN, false,
-                        "Failed to apply the transform");
-                psFree(output);
-                return NULL;
-            }
-            // interpolate the cooresponding input pixel to get the output pixel value.
-            outputData[col] = (psF32)psImagePixelInterpolate(input,
-                              inPosition->x, inPosition->y,
-                              inputMask, inputMaskVal, exposedValue,
-                              mode);
-
-        }
+
+    #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+    /* apply the transform to get the position in the input image */ \
+    inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition); \
+    \
+    if (inPosition == NULL) { \
+        psError(PS_ERR_UNKNOWN, false, \
+                "Failed to apply the transform"); \
+        psFree(output); \
+        return NULL; \
+    } \
+    /* interpolate the cooresponding input pixel to get the output pixel value. */ \
+    ps##TYPE value = p_psImagePixelInterpolate##MODE##_##TYPE(input, \
+                     inPosition->x, inPosition->y, \
+                     inputMask, inputMaskVal, NAN); \
+    if (isnan(value)) { \
+        if (blankPixels != NULL) { \
+            p_psPixelsAppend(blankPixels, blankPixels->nalloc, outPosition.x, outPosition.y); \
+        } \
+        value = exposedValue; \
+    } \
+
+    #define PSIMAGE_TRANSFORM_LOOP(TYPE, MODE) { \
+        for (int row = 0; row < numRows; row++) { \
+            outPosition.y = row+row0; \
+            ps##TYPE* outputData=output->data.TYPE[row]; \
+            for (int col = 0; col < numCols; col++) { \
+                outPosition.x = col+col0; \
+                PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+                outputData[col] = value; \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_TRANSFORM_FROMLIST(TYPE, MODE) { \
+        int n = pixels->n; \
+        for (int i= 0; i < n; i++) { \
+            int x = pixels->data[i].x; \
+            int y = pixels->data[i].y; \
+            if (x >= col0 && x < col1 && y >= row0 && y < row1) { \
+                outPosition.x = x; \
+                outPosition.y = y; \
+                PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \
+                output->data.TYPE[y][x] = value; \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_TRANSFORM_CASE(MODE) \
+case PS_INTERPOLATE_##MODE: \
+    switch (type) { \
+    case PS_TYPE_F32: \
+        PSIMAGE_TRANSFORM_LOOP(F32,MODE); \
+        break; \
+    case PS_TYPE_F64: \
+        PSIMAGE_TRANSFORM_LOOP(F64,MODE); \
+        break; \
+    default: { \
+            char* typeStr; \
+            PS_TYPE_NAME(typeStr,type); \
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, \
+                    typeStr); \
+            psFree(output); \
+            return NULL; \
+        } \
+    } \
+    break;
+
+    switch (mode) {
+        PSIMAGE_TRANSFORM_CASE(FLAT);
+        PSIMAGE_TRANSFORM_CASE(BILINEAR);
+        PSIMAGE_TRANSFORM_CASE(BILINEAR_VARIANCE);
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                mode);
+        psFree(output);
+        return NULL;
     }
 
Index: /trunk/psLib/src/imageops/psImageGeomManip.h
===================================================================
--- /trunk/psLib/src/imageops/psImageGeomManip.h	(revision 4213)
+++ /trunk/psLib/src/imageops/psImageGeomManip.h	(revision 4214)
@@ -8,6 +8,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-08 23:40:45 $
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -144,5 +144,5 @@
 psImage* psImageTransform(
     psImage *output,                   ///< psImage to recycle, or NULL
-    psArray** blankPixels,             ///<
+    psPixels* blankPixels,             ///< list of pixels in output image not set, or NULL if no list is desired.
     const psImage *input,              ///< psImage to apply transform to
     const psImage *inputMask,          ///< if not NULL, mask of input psImage
Index: /trunk/psLib/src/sys/psConfigure.c
===================================================================
--- /trunk/psLib/src/sys/psConfigure.c	(revision 4213)
+++ /trunk/psLib/src/sys/psConfigure.c	(revision 4214)
@@ -13,6 +13,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 01:41:35 $
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -28,5 +28,5 @@
 {
     char version[80];
-    snprintf(version,80,"%s-v%s",PACKAGE,VERSION);
+    snprintf(version,80,"%s-v%s",PACKAGE_NAME,PACKAGE_VERSION);
 
     return(psStringCopy(version));
Index: /trunk/psLib/src/sysUtils/psConfigure.c
===================================================================
--- /trunk/psLib/src/sysUtils/psConfigure.c	(revision 4213)
+++ /trunk/psLib/src/sysUtils/psConfigure.c	(revision 4214)
@@ -13,6 +13,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 01:41:35 $
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -28,5 +28,5 @@
 {
     char version[80];
-    snprintf(version,80,"%s-v%s",PACKAGE,VERSION);
+    snprintf(version,80,"%s-v%s",PACKAGE_NAME,PACKAGE_VERSION);
 
     return(psStringCopy(version));
Index: /trunk/psLib/src/types/psPixels.c
===================================================================
--- /trunk/psLib/src/types/psPixels.c	(revision 4213)
+++ /trunk/psLib/src/types/psPixels.c	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-10 21:46:46 $
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -89,4 +89,24 @@
         pixels->n = pixels->nalloc;
     }
+
+    return pixels;
+}
+
+psPixels* p_psPixelsAppend(psPixels* pixels, int growth, psS32 x, psS32 y)
+{
+    if (growth < 1) {
+        growth = 10;
+    }
+
+    if ( (pixels == NULL) || (pixels->n >= pixels->nalloc) ) {
+        pixels=psPixelsRealloc(pixels, pixels->nalloc+growth);
+    }
+
+    int n = pixels->n;
+
+    pixels->data[n].x = x;
+    pixels->data[n].y = y;
+
+    pixels->n++;
 
     return pixels;
Index: /trunk/psLib/src/types/psPixels.h
===================================================================
--- /trunk/psLib/src/types/psPixels.h	(revision 4213)
+++ /trunk/psLib/src/types/psPixels.h	(revision 4214)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-08 23:40:45 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -62,4 +62,15 @@
     psPixels* pixels,                  ///< psPixels to resize, or NULL to create new psPixels
     int size                           ///< the size of the coordinate vectors
+);
+
+/** Add a pixel location to a psPixels
+ *
+ *  @return psPixels*       psPixels with the value appended.
+ */
+psPixels* p_psPixelsAppend(
+    psPixels* pixels,                  ///< psPixels to append new coordinate to.  NULL creates a new one.
+    int growth,                        ///< number of elements to grow the psPixels list, if necessary.  if growth < 1, 10 is used.
+    psS32 x,                           ///< x coordinate to append
+    psS32 y                            ///< y coordinate to append
 );
 
Index: /trunk/psLib/test/image/tst_psImageGeomManip.c
===================================================================
--- /trunk/psLib/test/image/tst_psImageGeomManip.c	(revision 4213)
+++ /trunk/psLib/test/image/tst_psImageGeomManip.c	(revision 4214)
@@ -6,6 +6,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-09 19:40:51 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-11 02:19:05 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -31,4 +31,5 @@
 static psS32 testImageShiftCase(psS32 cols, psS32 rows, float colShift,float rowShift);
 static psS32 testImageResample(void);
+static psS32 testImageTransform(void);
 
 testDescription tests[] = {
@@ -38,4 +39,5 @@
                               {testImageShift,561,"psImageShift",0,false},
                               {testImageResample,743,"psImageResample",0,false},
+                              {testImageTransform,-1,"psImageTransform",0,false},
                               {NULL}
                           };
@@ -1073,2 +1075,8 @@
 }
 
+static psS32 testImageTransform(void)
+{
+
+    /// XXX: TODO
+    return 0;
+}
