Index: trunk/psLib/src/math/psPolynomial.c
===================================================================
--- trunk/psLib/src/math/psPolynomial.c	(revision 10597)
+++ trunk/psLib/src/math/psPolynomial.c	(revision 10598)
@@ -7,6 +7,6 @@
 *  polynomials.  It also contains a Gaussian functions.
 *
-*  @version $Revision: 1.152 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2006-10-24 22:52:56 $
+*  @version $Revision: 1.153 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2006-12-09 14:19:56 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -636,4 +636,71 @@
 
     return(newPoly);
+}
+
+// XXX add 1D, 3D, 4D versions
+bool psPolynomial2DRecycle(psPolynomial2D *poly,
+                           psPolynomialType type,
+                           unsigned int nX,
+                           unsigned int nY)
+{
+    PS_ASSERT_INT_NONNEGATIVE(nX, NULL);
+    PS_ASSERT_INT_NONNEGATIVE(nY, NULL);
+
+    bool match = true;
+    match &= (poly->type == type);
+    match &= (poly->nX == type);
+    match &= (poly->nY == type);
+
+    if (!match) {
+        for (int i = 0; i < poly->nX + 1; i++) {
+            psFree (poly->coeff[i]);
+            psFree (poly->coeffErr[i]);
+            psFree (poly->mask[i]);
+        }
+        psFree (poly->coeff);
+        psFree (poly->coeffErr);
+        psFree (poly->mask);
+
+        poly->type = type;
+        poly->nX = nX;
+        poly->nY = nY;
+
+        poly->coeff = psAlloc((1 + nX) * sizeof(psF64 *));
+        poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64 *));
+        poly->mask = (psMaskType **)psAlloc((1 + nX) * sizeof(psMaskType *));
+        for (int i = 0; i < (1 + nX); i++) {
+            poly->coeff[i] = psAlloc((1 + nY) * sizeof(psF64));
+            poly->coeffErr[i] = psAlloc((1 + nY) * sizeof(psF64));
+            poly->mask[i] = (psMaskType *)psAlloc((1 + nY) * sizeof(psMaskType));
+        }
+    }
+    for (int i = 0; i < (1 + nX); i++) {
+        for (int j = 0; j < (1 + nY); j++) {
+            poly->coeff[i][j] = 0.0;
+            poly->coeffErr[i][j] = 0.0;
+            poly->mask[i][j] = 0;
+        }
+    }
+    return(true);
+}
+
+// XXX add 1D, 3D, 4D versions
+psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out,
+                                   psPolynomial2D *poly)
+{
+    if (out == NULL) {
+        psPolynomial2DAlloc (poly->type, poly->nX, poly->nY);
+    } else {
+        psPolynomial2DRecycle (out, poly->type, poly->nX, poly->nY);
+    }
+
+    for (int i = 0; i < (1 + poly->nX); i++) {
+        for (int j = 0; j < (1 + poly->nY); j++) {
+            out->coeff[i][j] = poly->coeff[i][j] = 0.0;
+            out->coeffErr[i][j] = poly->coeffErr[i][j] = 0.0;
+            out->mask[i][j] = poly->mask[i][j] = 0;
+        }
+    }
+    return(out);
 }
 
Index: trunk/psLib/src/math/psPolynomial.h
===================================================================
--- trunk/psLib/src/math/psPolynomial.h	(revision 10597)
+++ trunk/psLib/src/math/psPolynomial.h	(revision 10598)
@@ -11,6 +11,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.64 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-10-24 22:52:56 $
+ *  @version $Revision: 1.65 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-12-09 14:19:56 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -149,4 +149,12 @@
     unsigned int nT                    ///< Number of terms in t
 );
+
+bool psPolynomial2DRecycle(psPolynomial2D *poly,
+                           psPolynomialType type,
+                           unsigned int nX,
+                           unsigned int nY);
+
+psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out,
+                                   psPolynomial2D *poly);
 
 /** Evaluates a 1-D polynomial at specific coordinates.
Index: trunk/psLib/src/math/psPolynomialUtils.c
===================================================================
--- trunk/psLib/src/math/psPolynomialUtils.c	(revision 10597)
+++ trunk/psLib/src/math/psPolynomialUtils.c	(revision 10598)
@@ -178,35 +178,42 @@
 }
 
-# if (0)
-    psPolynomial2D *psPolynomial2D_dX (psPolynomial2D *poly)
-{
-
+psPolynomial2D *psPolynomial2D_dX (psPolynomial2D *out, psPolynomial2D *poly)
+{
     int nXout = poly->nX - 1;
     int nYout = poly->nY;
 
-    psPolynomial2D *dX = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
-
-    for (int i = 0; i < nXout; i++) {
-        for (int j = 0; j < nYout; j++) {
-            dX->mask[i][j] = poly->mask[i+1][j];
-            dX->coeff[i][j] = poly->coeff[i+1][j] * i+1;
-        }
-    }
-}
-
-psPolynomial2D *psPolynomial2D_dY (psPolynomial2D *poly)
-{
-
-    int nXout = poly->nX;
-    int nYout = poly->nY - 1;
-
-    psPolynomial2D *dX = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
-
-    for (int i = 0; i < nXout; i++) {
-        for (int j = 0; j < nYout; j++) {
-            dX->mask[i][j] = poly->mask[i+1][j];
-            dX->coeff[i][j] = poly->coeff[i][j+1] * j+1;
-        }
-    }
-}
-#endif
+    if (out == NULL) {
+        out = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+    } else {
+        psPolynomial2DRecycle (out, poly->type, nXout, nYout);
+    }
+
+    for (int i = 0; i < nXout + 1; i++) {
+        for (int j = 0; j < nYout + 1; j++) {
+            out->mask[i][j] = poly->mask[i+1][j];
+            out->coeff[i][j] = poly->coeff[i+1][j] * (i+1);
+        }
+    }
+    return out;
+}
+
+psPolynomial2D *psPolynomial2D_dY (psPolynomial2D *out, psPolynomial2D *poly)
+{
+
+    int nXout = poly->nX - 1;
+    int nYout = poly->nY;
+
+    if (out == NULL) {
+        out = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+    } else {
+        psPolynomial2DRecycle (out, poly->type, nXout, nYout);
+    }
+
+    for (int i = 0; i < nXout + 1; i++) {
+        for (int j = 0; j < nYout + 1; j++) {
+            out->mask[i][j] = poly->mask[i][j+1];
+            out->coeff[i][j] = poly->coeff[i][j+1] * (j+1);
+        }
+    }
+    return out;
+}
Index: trunk/psLib/src/math/psPolynomialUtils.h
===================================================================
--- trunk/psLib/src/math/psPolynomialUtils.h	(revision 10597)
+++ trunk/psLib/src/math/psPolynomialUtils.h	(revision 10598)
@@ -35,4 +35,6 @@
 psPlane psImageBicubeMin(const psPolynomial2D *poly // The polynomial
                         );
+psPolynomial2D *psPolynomial2D_dX (psPolynomial2D *out, psPolynomial2D *poly);
+psPolynomial2D *psPolynomial2D_dY (psPolynomial2D *out, psPolynomial2D *poly);
 
 #endif /* PS_POLY_UTILS_H */
