Index: trunk/psLib/src/math/psPolynomialUtils.c
===================================================================
--- trunk/psLib/src/math/psPolynomialUtils.c	(revision 10598)
+++ trunk/psLib/src/math/psPolynomialUtils.c	(revision 10605)
@@ -180,18 +180,36 @@
 psPolynomial2D *psPolynomial2D_dX (psPolynomial2D *out, psPolynomial2D *poly)
 {
+    psPolynomial2D *dest = NULL;
     int nXout = poly->nX - 1;
     int nYout = poly->nY;
 
+    if (poly->nX == 0)
+        return NULL;
+
+    bool inPlace = false;
+
     if (out == NULL) {
-        out = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
-    } else {
-        psPolynomial2DRecycle (out, poly->type, nXout, nYout);
+        dest = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+        out = dest;
+    } else {
+        if (out == poly) {
+            inPlace = true;
+            dest = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+        } else {
+            dest = out;
+            psPolynomial2DRecycle (dest, 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);
-        }
+            dest->mask[i][j] = poly->mask[i+1][j];
+            dest->coeff[i][j] = poly->coeff[i+1][j] * (i+1);
+        }
+    }
+
+    if (inPlace) {
+        psFree (poly);
+        out = dest;
     }
     return out;
@@ -200,19 +218,36 @@
 psPolynomial2D *psPolynomial2D_dY (psPolynomial2D *out, psPolynomial2D *poly)
 {
-
-    int nXout = poly->nX - 1;
-    int nYout = poly->nY;
+    psPolynomial2D *dest = NULL;
+    int nXout = poly->nX;
+    int nYout = poly->nY - 1;
+
+    if (poly->nY == 0)
+        return NULL;
+
+    bool inPlace = false;
 
     if (out == NULL) {
-        out = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
-    } else {
-        psPolynomial2DRecycle (out, poly->type, nXout, nYout);
+        dest = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+        out = dest;
+    } else {
+        if (out == poly) {
+            inPlace = true;
+            dest = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXout, nYout);
+        } else {
+            dest = out;
+            psPolynomial2DRecycle (dest, 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);
-        }
+            dest->mask[i][j] = poly->mask[i][j+1];
+            dest->coeff[i][j] = poly->coeff[i][j+1] * (j+1);
+        }
+    }
+
+    if (inPlace) {
+        psFree (poly);
+        out = dest;
     }
     return out;
