Index: /trunk/psLib/src/astronomy/psTime.d
===================================================================
--- /trunk/psLib/src/astronomy/psTime.d	(revision 1259)
+++ /trunk/psLib/src/astronomy/psTime.d	(revision 1260)
@@ -1,1 +1,2 @@
-psTime.o psTime.d : psTime.c psTime.h ../collections/psType.h ../sysUtils/psError.h
+psTime.o psTime.d : psTime.c psTime.h ../collections/psType.h ../sysUtils/psError.h \
+  ../sysUtils/psMemory.h
Index: /trunk/psLib/src/image/psImageManip.c
===================================================================
--- /trunk/psLib/src/image/psImageManip.c	(revision 1259)
+++ /trunk/psLib/src/image/psImageManip.c	(revision 1260)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 23:39:10 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 20:02:56 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -404,4 +404,5 @@
     if (in == NULL) {
         psError(__func__,"Input image is NULL.");
+        psFree(out);
         return NULL;
     }
@@ -409,4 +410,5 @@
     if (scale < 1) {
         psError(__func__,"The scale must be positive.");
+        psFree(out);
         return NULL;
     }
@@ -414,4 +416,5 @@
     if (stats == NULL) {
         psError(__func__,"The stats input can not be NULL.");
+        psFree(out);
         return NULL;
     }
@@ -419,4 +422,5 @@
     if (getSpecifiedStatValue(stats,&statVal) == false) {
         psError(__func__,"The stat options didn't specify a single supported statistic type.");
+        psFree(out);
         return NULL;
     }
@@ -484,4 +488,56 @@
     return out;
 }
+psImage* psImageResample(psImage* out, const psImage* in, int scale, psImageInterpolateMode mode)
+{
+    int outRows;
+    int outCols;
+    float invScale;
+
+    if (in == NULL) {
+        psError(__func__,"Input image can not be NULL.");
+        psFree(out);
+        return NULL;
+    }
+
+    // create an output image of the same size and type
+    outRows = in->numRows*scale;
+    outCols = in->numCols*scale;
+    invScale = 1.0f / (float)scale;
+
+
+    #define PSIMAGE_RESAMPLE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        out = psImageRecycle(out,outCols, outRows, PS_TYPE_##TYPE); \
+        for (int row=0;row<outRows;row++) { \
+            ps##TYPE* rowData = out->data.TYPE[row]; \
+            float inRow = (float)row * invScale; \
+            for (int col=0;col<outCols;col++) { \
+                rowData[col] = psImagePixelInterpolate(in,inRow,(float)col*invScale,0,mode); \
+            } \
+        }  \
+        break; \
+    }
+
+    switch(in->type.type) {
+        PSIMAGE_RESAMPLE_CASE(U8)
+        PSIMAGE_RESAMPLE_CASE(U16)
+        PSIMAGE_RESAMPLE_CASE(U32)
+        PSIMAGE_RESAMPLE_CASE(U64)
+        PSIMAGE_RESAMPLE_CASE(S8)
+        PSIMAGE_RESAMPLE_CASE(S16)
+        PSIMAGE_RESAMPLE_CASE(S32)
+        PSIMAGE_RESAMPLE_CASE(S64)
+        PSIMAGE_RESAMPLE_CASE(F32)
+        PSIMAGE_RESAMPLE_CASE(F64)
+        PSIMAGE_RESAMPLE_CASE(C32)
+        PSIMAGE_RESAMPLE_CASE(C64)
+    default:
+        psError(__func__,"Unsupported type (%d)",in->type.type);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
 
 psImage* psImageRoll(psImage* out, const psImage* in, int dx, int dy)
@@ -493,4 +549,5 @@
     if (in == NULL) {
         psError(__func__,"Input image can not be NULL.");
+        psFree(out);
         return NULL;
     }
@@ -793,4 +850,10 @@
             PSIMAGE_ROTATE_ARBITRARY_LOOP(F64,MODE); \
             break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(C32,MODE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(C64,MODE); \
+            break; \
         default: \
             psError(__func__,"Image type (%d) not supported",type); \
Index: /trunk/psLib/src/image/psImageManip.h
===================================================================
--- /trunk/psLib/src/image/psImageManip.h	(revision 1259)
+++ /trunk/psLib/src/image/psImageManip.h	(revision 1260)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 23:39:10 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 20:02:56 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -105,4 +105,11 @@
 );
 
+psImage* psImageResample(
+    psImage* out,                   ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,              ///< input image
+    int scale,
+    psImageInterpolateMode mode
+);
+
 psImage* psImageRotate(
     psImage* out,                   ///< an psImage to recycle.  If NULL, a new image is created
Index: /trunk/psLib/src/image/psImageStats.c
===================================================================
--- /trunk/psLib/src/image/psImageStats.c	(revision 1259)
+++ /trunk/psLib/src/image/psImageStats.c	(revision 1260)
@@ -400,10 +400,20 @@
     default: \
         psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
-        return unexposedValue; \
     } \
     break
 
     switch (input->type.type) {
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
         PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
     default:
         psError(__func__,"Unsupported image datatype (%d)",input->type.type);
@@ -434,4 +444,25 @@
 }
 
+#define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
+inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue) \
+{ \
+    int intX = (int) round((psF64)(x) - 0.5); \
+    int intY = (int) round((psF64)(y) - 0.5); \
+    int lastX = input->numCols - 1; \
+    int lastY = input->numRows - 1; \
+    \
+    if ((intX < 0) || \
+            (intX > lastX) || \
+            (intY < 0) || \
+            (intY > lastY)) { \
+        return unexposedValue; \
+    } \
+    \
+    return input->data.TYPE[intY][intX]; \
+}
+
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
@@ -444,4 +475,6 @@
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
 
 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
@@ -501,4 +534,60 @@
 }
 
+#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
+inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue) \
+{ \
+    double floorX = floor((psF64)(x) - 0.5); \
+    double floorY = floor((psF64)(y) - 0.5); \
+    double fracX = x - 0.5 - floorX; \
+    double fracY = y - 0.5 - floorY; \
+    int intFloorX = (int) floorX; \
+    int intFloorY = (int) floorY; \
+    int lastX = input->numCols - 1; \
+    int lastY = input->numRows - 1; \
+    double rx = 0.0; \
+    psC64 pixel = 0.0; \
+    ps##TYPE* currentRow; \
+    ps##TYPE* nextRow; \
+    \
+    if ((intFloorX < 0) || \
+            (intFloorX > lastX) || \
+            (intFloorY < 0) || \
+            (intFloorY > lastY)) { \
+        return unexposedValue; \
+    } \
+    \
+    currentRow = input->data.TYPE[intFloorY]; \
+    if (intFloorY == lastY) { \
+        pixel = currentRow[intFloorX]; \
+        if (intFloorX < lastX) { \
+            pixel+= fracY * (currentRow[intFloorX+1] - \
+                             currentRow[intFloorX]); \
+        } \
+        return(pixel); \
+    } \
+    nextRow = input->data.TYPE[intFloorY+1]; \
+    if (intFloorX == lastX) { \
+        pixel = currentRow[intFloorX]; \
+        if (intFloorY < lastY) { \
+            pixel+= fracX * (nextRow[intFloorX] - \
+                             currentRow[intFloorX]); \
+        } \
+        return(pixel); \
+    } \
+    \
+    rx = currentRow[intFloorX] + \
+         fracX * (currentRow[intFloorX+1] - \
+                  currentRow[intFloorX]); \
+    \
+    pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \
+                          fracX * (nextRow[intFloorX+1] - \
+                                   nextRow[intFloorX]) - rx); \
+    \
+    return(pixel); \
+}
+
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
@@ -511,3 +600,5 @@
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
-
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
+
Index: /trunk/psLib/src/image/psImageStats.h
===================================================================
--- /trunk/psLib/src/image/psImageStats.h	(revision 1259)
+++ /trunk/psLib/src/image/psImageStats.h	(revision 1260)
@@ -10,6 +10,6 @@
  *  @author George Gusciora, MHPCC
  *
- *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 23:39:48 $
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 20:02:57 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -76,5 +76,19 @@
         float y, \
         psF64 unexposedValue \
-                                                     ); \
+                                                     );
+
+#define p_psImagePixelInterpolateComplexFcns(TYPE) \
+inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \
+        const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue \
+                                                 ); \
+inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \
+        const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue \
+                                                     );
 
 p_psImagePixelInterpolateFcns(U8)
@@ -88,4 +102,6 @@
 p_psImagePixelInterpolateFcns(F32)
 p_psImagePixelInterpolateFcns(F64)
+p_psImagePixelInterpolateComplexFcns(C32)
+p_psImagePixelInterpolateComplexFcns(C64)
 
 #endif
Index: /trunk/psLib/src/imageops/psImageStats.c
===================================================================
--- /trunk/psLib/src/imageops/psImageStats.c	(revision 1259)
+++ /trunk/psLib/src/imageops/psImageStats.c	(revision 1260)
@@ -400,10 +400,20 @@
     default: \
         psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
-        return unexposedValue; \
     } \
     break
 
     switch (input->type.type) {
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
         PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
     default:
         psError(__func__,"Unsupported image datatype (%d)",input->type.type);
@@ -434,4 +444,25 @@
 }
 
+#define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
+inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue) \
+{ \
+    int intX = (int) round((psF64)(x) - 0.5); \
+    int intY = (int) round((psF64)(y) - 0.5); \
+    int lastX = input->numCols - 1; \
+    int lastY = input->numRows - 1; \
+    \
+    if ((intX < 0) || \
+            (intX > lastX) || \
+            (intY < 0) || \
+            (intY > lastY)) { \
+        return unexposedValue; \
+    } \
+    \
+    return input->data.TYPE[intY][intX]; \
+}
+
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
@@ -444,4 +475,6 @@
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
 
 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
@@ -501,4 +534,60 @@
 }
 
+#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
+inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue) \
+{ \
+    double floorX = floor((psF64)(x) - 0.5); \
+    double floorY = floor((psF64)(y) - 0.5); \
+    double fracX = x - 0.5 - floorX; \
+    double fracY = y - 0.5 - floorY; \
+    int intFloorX = (int) floorX; \
+    int intFloorY = (int) floorY; \
+    int lastX = input->numCols - 1; \
+    int lastY = input->numRows - 1; \
+    double rx = 0.0; \
+    psC64 pixel = 0.0; \
+    ps##TYPE* currentRow; \
+    ps##TYPE* nextRow; \
+    \
+    if ((intFloorX < 0) || \
+            (intFloorX > lastX) || \
+            (intFloorY < 0) || \
+            (intFloorY > lastY)) { \
+        return unexposedValue; \
+    } \
+    \
+    currentRow = input->data.TYPE[intFloorY]; \
+    if (intFloorY == lastY) { \
+        pixel = currentRow[intFloorX]; \
+        if (intFloorX < lastX) { \
+            pixel+= fracY * (currentRow[intFloorX+1] - \
+                             currentRow[intFloorX]); \
+        } \
+        return(pixel); \
+    } \
+    nextRow = input->data.TYPE[intFloorY+1]; \
+    if (intFloorX == lastX) { \
+        pixel = currentRow[intFloorX]; \
+        if (intFloorY < lastY) { \
+            pixel+= fracX * (nextRow[intFloorX] - \
+                             currentRow[intFloorX]); \
+        } \
+        return(pixel); \
+    } \
+    \
+    rx = currentRow[intFloorX] + \
+         fracX * (currentRow[intFloorX+1] - \
+                  currentRow[intFloorX]); \
+    \
+    pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \
+                          fracX * (nextRow[intFloorX+1] - \
+                                   nextRow[intFloorX]) - rx); \
+    \
+    return(pixel); \
+}
+
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
@@ -511,3 +600,5 @@
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
-
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
+
Index: /trunk/psLib/src/imageops/psImageStats.h
===================================================================
--- /trunk/psLib/src/imageops/psImageStats.h	(revision 1259)
+++ /trunk/psLib/src/imageops/psImageStats.h	(revision 1260)
@@ -10,6 +10,6 @@
  *  @author George Gusciora, MHPCC
  *
- *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 23:39:48 $
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 20:02:57 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -76,5 +76,19 @@
         float y, \
         psF64 unexposedValue \
-                                                     ); \
+                                                     );
+
+#define p_psImagePixelInterpolateComplexFcns(TYPE) \
+inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \
+        const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue \
+                                                 ); \
+inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \
+        const psImage *input, \
+        float x, \
+        float y, \
+        psC64 unexposedValue \
+                                                     );
 
 p_psImagePixelInterpolateFcns(U8)
@@ -88,4 +102,6 @@
 p_psImagePixelInterpolateFcns(F32)
 p_psImagePixelInterpolateFcns(F64)
+p_psImagePixelInterpolateComplexFcns(C32)
+p_psImagePixelInterpolateComplexFcns(C64)
 
 #endif
