Index: trunk/psLib/src/image/psImageManip.c
===================================================================
--- trunk/psLib/src/image/psImageManip.c	(revision 1250)
+++ 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); \
