IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 12, 2004, 2:10:50 PM (22 years ago)
Author:
desonia
Message:

adjusted the reference count increment so that psFPA assumes ownership
of psChips, psChips assumes ownership of psCells, etc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/image/psImageExtraction.c

    r1962 r2067  
    99 *  @author Robert DeSonia, MHPCC
    1010 *
    11  *  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2004-10-05 22:23:04 $
     11 *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2004-10-13 00:10:50 $
    1313 *
    1414 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2323
    2424#include "psImageErrors.h"
    25 
    2625
    2726psImage* imageSubset(psImage* out,
     
    236235
    237236    return (image);
    238 }
    239 
    240 psImage* psImageCopy(psImage* restrict output,
    241                      const psImage* input,
    242                      psElemType type)
    243 {
    244     psElemType inDatatype;
    245     int elementSize;
    246     int elements;
    247     int numRows;
    248     int numCols;
    249 
    250     if (input == NULL || input->data.V == NULL) {
    251         psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
    252                    PS_ERR_BAD_PARAMETER_NULL, true,
    253                    PS_ERRORTEXT_psImage_IMAGE_NULL);
    254         psFree(output);
    255         return NULL;
    256     }
    257 
    258     if (input == output) {
    259         psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
    260                    PS_ERR_BAD_PARAMETER_NULL, true,
    261                    PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED);
    262         psFree(output);
    263         return NULL;
    264     }
    265 
    266     if (input->type.dimen != PS_DIMEN_IMAGE) {
    267         psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
    268                    PS_ERR_BAD_PARAMETER_TYPE, true,
    269                    PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
    270         psFree(output);
    271         return NULL;
    272     }
    273 
    274     inDatatype = input->type.type;
    275     numRows = input->numRows;
    276     numCols = input->numCols;
    277     elements = numRows * numCols;
    278     elementSize = PSELEMTYPE_SIZEOF(inDatatype);
    279 
    280     if (inDatatype == PS_TYPE_PTR || type == PS_TYPE_PTR) {
    281         psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
    282                    PS_ERR_BAD_PARAMETER_TYPE, true,
    283                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
    284                    PS_TYPE_PTR_NAME);
    285         psFree(output);
    286         return NULL;
    287     }
    288 
    289     output = psImageRecycle(output, numCols, numRows, type);
    290 
    291     // cover the trival case of copy of the same
    292     // datatype.
    293     if (type == inDatatype) {
    294         for (int row=0;row<numRows;row++) {
    295             memcpy(output->data.V[row], input->data.V[row], elementSize * numCols);
    296         }
    297         return output;
    298     }
    299 
    300     #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \
    301         ps##INTYPE *in; \
    302         ps##OUTTYPE *out; \
    303         for(int row=0;row<numRows;row++) { \
    304             in = IN->data.INTYPE[row]; \
    305             out = OUT->data.OUTTYPE[row]; \
    306             for (int col=0;col<numCols;col++) { \
    307                 *(out++) = *(in++); \
    308             } \
    309         } \
    310     }
    311 
    312     #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) { \
    313         switch (inDatatype) { \
    314         case PS_TYPE_S8: \
    315             PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \
    316             break; \
    317         case PS_TYPE_S16: \
    318             PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \
    319             break; \
    320         case PS_TYPE_S32: \
    321             PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \
    322             break; \
    323         case PS_TYPE_S64: \
    324             PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \
    325             break; \
    326         case PS_TYPE_U8: \
    327             PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \
    328             break; \
    329         case PS_TYPE_U16: \
    330             PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \
    331             break; \
    332         case PS_TYPE_U32: \
    333             PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \
    334             break; \
    335         case PS_TYPE_U64: \
    336             PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \
    337             break; \
    338         case PS_TYPE_F32: \
    339             PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \
    340             break; \
    341         case PS_TYPE_F64: \
    342             PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \
    343             break; \
    344         case PS_TYPE_C32: \
    345             PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \
    346             break; \
    347         case PS_TYPE_C64: \
    348             PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \
    349             break; \
    350         default: \
    351             break; \
    352         } \
    353     }
    354 
    355     switch (type) {
    356     case PS_TYPE_S8:
    357         PSIMAGE_COPY_CASE(output, S8);
    358         break;
    359     case PS_TYPE_S16:
    360         PSIMAGE_COPY_CASE(output, S16);
    361         break;
    362     case PS_TYPE_S32:
    363         PSIMAGE_COPY_CASE(output, S32);
    364         break;
    365     case PS_TYPE_S64:
    366         PSIMAGE_COPY_CASE(output, S64);
    367         break;
    368     case PS_TYPE_U8:
    369         PSIMAGE_COPY_CASE(output, U8);
    370         break;
    371     case PS_TYPE_U16:
    372         PSIMAGE_COPY_CASE(output, U16);
    373         break;
    374     case PS_TYPE_U32:
    375         PSIMAGE_COPY_CASE(output, U32);
    376         break;
    377     case PS_TYPE_U64:
    378         PSIMAGE_COPY_CASE(output, U64);
    379         break;
    380     case PS_TYPE_F32:
    381         PSIMAGE_COPY_CASE(output, F32);
    382         break;
    383     case PS_TYPE_F64:
    384         PSIMAGE_COPY_CASE(output, F64);
    385         break;
    386     case PS_TYPE_C32:
    387         PSIMAGE_COPY_CASE(output, C32);
    388         break;
    389     case PS_TYPE_C64:
    390         PSIMAGE_COPY_CASE(output, C64);
    391         break;
    392     default: {
    393             char* typeStr;
    394             PS_TYPE_NAME(typeStr,type);
    395             psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
    396                        PS_ERR_BAD_PARAMETER_TYPE, true,
    397                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
    398                        typeStr);
    399             psFree(output);
    400 
    401             break;
    402         }
    403     }
    404     return output;
    405237}
    406238
Note: See TracChangeset for help on using the changeset viewer.