Index: trunk/psLib/src/imageops/psImagePixelExtract.c
===================================================================
--- trunk/psLib/src/imageops/psImagePixelExtract.c	(revision 20306)
+++ trunk/psLib/src/imageops/psImagePixelExtract.c	(revision 21183)
@@ -8,6 +8,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2008-10-22 02:10:37 $
+ *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2009-01-27 06:39:37 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -206,5 +206,5 @@
                        const psImage* input,
                        const psImage* mask,
-                       psMaskType maskVal,
+                       psImageMaskType maskVal,
                        psRegion region,
                        psImageCutDirection direction,
@@ -357,10 +357,10 @@
             return NULL;
         }
-        if (mask->type.type != PS_TYPE_MASK) {
+        if (mask->type.type != PS_TYPE_IMAGE_MASK) {
             char* typeStr;
             PS_TYPE_NAME(typeStr,mask->type.type);
             psError(PS_ERR_BAD_PARAMETER_TYPE, true,
                     _("Input psImage mask type, %s, is not the supported mask datatype of %s."),
-                    typeStr, PS_TYPE_MASK_NAME);
+                    typeStr, PS_TYPE_IMAGE_MASK_NAME);
             psFree(out);
             return NULL;
@@ -394,5 +394,5 @@
         psVector* imgVec = psVectorAlloc(numRows, type);
         psVector* maskVec = NULL;
-        psMaskType* maskData = NULL;
+        psImageMaskType* maskData = NULL;
         psPixelCoord* outPosition = NULL;
 
@@ -416,25 +416,29 @@
 
         if (mask != NULL) {
-            maskVec = psVectorAlloc(numRows, mask->type.type);
-        }
-        #define PSIMAGE_CUT_VERTICAL(TYPE) \
+            maskVec = psVectorAlloc(numRows, PS_TYPE_VECTOR_MASK);
+        }
+
+#define PSIMAGE_CUT_VERTICAL(TYPE) \
     case PS_TYPE_##TYPE: { \
-            psMaskType* maskVecData = NULL; \
-            for (psS32 c=col0;c<col1;c++) { \
+            psVectorMaskType* maskVecData = NULL; \
+            for (psS32 c = col0; c < col1; c++) { \
                 ps##TYPE *imgData = input->data.TYPE[row0] + c; \
                 ps##TYPE *imgVecData = imgVec->data.TYPE; \
                 if (maskVec != NULL) { \
-                    maskVecData = maskVec->data.U8; \
-                    maskData = (psMaskType* )(mask->data.U8[row0]) + c; \
+                    maskVecData = maskVec->data.PS_TYPE_VECTOR_MASK_DATA; \
+                    maskData = &mask->data.PS_TYPE_IMAGE_MASK_DATA[row0][c]; /* XXX double check this... */ \
+                    /** old entry: maskData = (psMaskType* )(mask->data.PS_TYPE_IMAGE_MASK_DATA[row0]) + c; */ \
                 } \
-                for (psS32 r=row0;r<row1;r++) { \
-                    *(imgVecData++) = *imgData; \
+                for (psS32 r = row0; r < row1; r++) { \
+                   *imgVecData = *imgData; \
+                    imgVecData ++; \
                     imgData += inCols; \
                     if (maskVecData != NULL) { \
-                        *(maskVecData++) = *maskData; \
+                        *maskVecData = (*maskData & maskVal); \
+                        maskVecData ++; \
                         maskData += inCols; \
                     } \
                 } \
-                psVectorStats(myStats,imgVec,NULL,maskVec,maskVal); \
+                psVectorStats(myStats, imgVec, NULL, maskVec, 0xff); \
                 *outData = psStatsGetValue(myStats, statistic); \
                 if (outPosition != NULL) { \
@@ -471,6 +475,8 @@
         psFree(imgVec);
         psFree(maskVec);
+
     } else if (direction == PS_CUT_Y_POS || direction == PS_CUT_Y_NEG) {
         // Cut in Y direction
+        // XXX use this if we drop the hackish stuff below: psVector* imgVec = psVectorAlloc(numCols, type);
         psVector* imgVec = NULL;
         psVector* maskVec = NULL;
@@ -479,12 +485,10 @@
 
         // fill in psVector to fake out the statistics functions.
+	// XXX EAM : this seems rather hackish: just use the needed psVectorAlloc (like above)?
         imgVec = psAlloc(sizeof(psVector));
         imgVec->type = input->type;
         P_PSVECTOR_SET_NALLOC(imgVec,numCols);
-        if (mask != NULL) {
-            maskVec = psAlloc(sizeof(psVector));
-            maskVec->type = mask->type;
-            P_PSVECTOR_SET_NALLOC(maskVec,numCols);
-        }
+        imgVec->n = imgVec->nalloc;
+
         // recycle output to make a proper sized/type output structure
         // n.b. type is double as that is the type given for all stats in
@@ -492,6 +496,4 @@
         out = psVectorRecycle(out, numRows, PS_TYPE_F64);
         out->n = numRows;
-        imgVec->n = imgVec->nalloc;
-        maskVec->n = maskVec->nalloc;
         if (coords != NULL) {
             coords = psPixelsRealloc(coords, numRows);
@@ -507,12 +509,30 @@
         }
 
+        if (mask != NULL) {
+            maskVec = psVectorAlloc(numRows, PS_TYPE_VECTOR_MASK);
+	    // XXX the old code (below) faked out the mask vector
+            // maskVec = psAlloc(sizeof(psVector));
+            // maskVec->type = mask->type;
+            // P_PSVECTOR_SET_NALLOC(maskVec,numCols);
+	    // maskVec->n = maskVec->nalloc;
+        }
+
         for (psS32 r = row0; r < row1; r++) {
             // point the vector struct to the
             // data to calculate the stats
             imgVec->data.U8 = (psPtr )(input->data.U8[r] + col0 * elementSize);
+
+	    // set the vector mask pixels based on the image pixels
             if (maskVec != NULL) {
-                maskVec->data.U8 = (psPtr )(mask->data.U8[r] + col0 * sizeof(psMaskType));
-            }
-            psVectorStats(myStats, imgVec, NULL, maskVec, maskVal);
+		psVectorMaskType *maskVecData = maskVec->data.PS_TYPE_VECTOR_MASK_DATA;
+		psImageMaskType *maskData = &mask->data.PS_TYPE_IMAGE_MASK_DATA[r][col0];
+                for (psS32 c = col0; c < col1; c++) { 
+		    *maskVecData = (*maskData & maskVal); 
+		    maskVecData ++; 
+		    maskData ++;
+                } 
+	    }
+
+            psVectorStats(myStats, imgVec, NULL, maskVec, 0xff);
             *outData = psStatsGetValue(myStats, statistic);
             if (outPosition != NULL) {
@@ -544,5 +564,5 @@
                      const psImage* input,
                      const psImage* mask,
-                     psMaskType maskVal,
+                     psImageMaskType maskVal,
                      psRegion region,
                      unsigned int nSamples,
@@ -651,10 +671,10 @@
             return NULL;
         }
-        if (mask->type.type != PS_TYPE_MASK) {
+        if (mask->type.type != PS_TYPE_IMAGE_MASK) {
             char* typeStr;
             PS_TYPE_NAME(typeStr,mask->type.type);
             psError(PS_ERR_BAD_PARAMETER_TYPE, true,
                     _("Input psImage mask type, %s, is not the supported mask datatype of %s."),
-                    typeStr, PS_TYPE_MASK_NAME);
+                    typeStr, PS_TYPE_IMAGE_MASK_NAME);
             psFree(out);
             return NULL;
@@ -739,5 +759,5 @@
                            const psImage* input,
                            const psImage* mask,
-                           psMaskType maskVal,
+                           psImageMaskType maskVal,
                            float x,
                            float y,
@@ -765,10 +785,10 @@
             return NULL;
         }
-        if (mask->type.type != PS_TYPE_MASK) {
+        if (mask->type.type != PS_TYPE_IMAGE_MASK) {
             char* typeStr;
             PS_TYPE_NAME(typeStr,mask->type.type);
             psError(PS_ERR_BAD_PARAMETER_TYPE, true,
                     _("Input psImage mask type, %s, is not the supported mask datatype of %s."),
-                    typeStr, PS_TYPE_MASK_NAME);
+                    typeStr, PS_TYPE_IMAGE_MASK_NAME);
             psFree(out);
             return NULL;
@@ -868,5 +888,5 @@
         if (mask != NULL) {
             bufferMask[lcv] = psVectorAllocEmpty(1+4*(rSq[lcv+1]-rSq[lcv]),
-                                                 PS_TYPE_MASK);
+                                                 PS_TYPE_VECTOR_MASK);
         }
     }
@@ -877,7 +897,7 @@
     for (psS32 row=startRow; row <= endRow; row++) {
         psF32* inRow = input->data.F32[row];
-        psMaskType* maskRow = NULL;
+        psImageMaskType* maskRow = NULL;
         if (mask != NULL) {
-            maskRow = mask->data.PS_TYPE_MASK_DATA[row];
+            maskRow = mask->data.PS_TYPE_IMAGE_MASK_DATA[row];
         }
         for (psS32 col=startCol; col <= endCol; col++) {
@@ -899,5 +919,5 @@
 
                     if (maskRow != NULL) {
-                        bufferMask[r]->data.PS_TYPE_MASK_DATA[n] = maskRow[col];
+                        bufferMask[r]->data.PS_TYPE_VECTOR_MASK_DATA[n] = (maskRow[col] & maskVal);
                         bufferMask[r]->n = n+1;
                     }
@@ -913,5 +933,5 @@
 
     for (psS32 r = 0; r < numOut; r++) {
-        psVectorStats(myStats,buffer[r], NULL, bufferMask[r],maskVal);
+        psVectorStats(myStats, buffer[r], NULL, bufferMask[r], 0xff);
         outData[r] = psStatsGetValue(myStats, statistic);
     }
