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/psImage.c

    r1933 r2067  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.48 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2004-09-30 18:54:42 $
     12 *  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2004-10-13 00:10:50 $
    1414 *
    1515 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    162162
    163163    return old;
     164}
     165
     166psImage* psImageCopy(psImage* restrict output,
     167                     const psImage* input,
     168                     psElemType type)
     169{
     170    psElemType inDatatype;
     171    int elementSize;
     172    int elements;
     173    int numRows;
     174    int numCols;
     175
     176    if (input == NULL || input->data.V == NULL) {
     177        psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
     178                   PS_ERR_BAD_PARAMETER_NULL, true,
     179                   PS_ERRORTEXT_psImage_IMAGE_NULL);
     180        psFree(output);
     181        return NULL;
     182    }
     183
     184    if (input == output) {
     185        psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
     186                   PS_ERR_BAD_PARAMETER_NULL, true,
     187                   PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED);
     188        psFree(output);
     189        return NULL;
     190    }
     191
     192    if (input->type.dimen != PS_DIMEN_IMAGE) {
     193        psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
     194                   PS_ERR_BAD_PARAMETER_TYPE, true,
     195                   PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
     196        psFree(output);
     197        return NULL;
     198    }
     199
     200    inDatatype = input->type.type;
     201    numRows = input->numRows;
     202    numCols = input->numCols;
     203    elements = numRows * numCols;
     204    elementSize = PSELEMTYPE_SIZEOF(inDatatype);
     205
     206    if (inDatatype == PS_TYPE_PTR || type == PS_TYPE_PTR) {
     207        psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
     208                   PS_ERR_BAD_PARAMETER_TYPE, true,
     209                   PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
     210                   PS_TYPE_PTR_NAME);
     211        psFree(output);
     212        return NULL;
     213    }
     214
     215    output = psImageRecycle(output, numCols, numRows, type);
     216
     217    // cover the trival case of copy of the same
     218    // datatype.
     219    if (type == inDatatype) {
     220        for (int row=0;row<numRows;row++) {
     221            memcpy(output->data.V[row], input->data.V[row], elementSize * numCols);
     222        }
     223        return output;
     224    }
     225
     226    #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \
     227        ps##INTYPE *in; \
     228        ps##OUTTYPE *out; \
     229        for(int row=0;row<numRows;row++) { \
     230            in = IN->data.INTYPE[row]; \
     231            out = OUT->data.OUTTYPE[row]; \
     232            for (int col=0;col<numCols;col++) { \
     233                *(out++) = *(in++); \
     234            } \
     235        } \
     236    }
     237
     238    #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) { \
     239        switch (inDatatype) { \
     240        case PS_TYPE_S8: \
     241            PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \
     242            break; \
     243        case PS_TYPE_S16: \
     244            PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \
     245            break; \
     246        case PS_TYPE_S32: \
     247            PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \
     248            break; \
     249        case PS_TYPE_S64: \
     250            PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \
     251            break; \
     252        case PS_TYPE_U8: \
     253            PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \
     254            break; \
     255        case PS_TYPE_U16: \
     256            PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \
     257            break; \
     258        case PS_TYPE_U32: \
     259            PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \
     260            break; \
     261        case PS_TYPE_U64: \
     262            PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \
     263            break; \
     264        case PS_TYPE_F32: \
     265            PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \
     266            break; \
     267        case PS_TYPE_F64: \
     268            PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \
     269            break; \
     270        case PS_TYPE_C32: \
     271            PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \
     272            break; \
     273        case PS_TYPE_C64: \
     274            PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \
     275            break; \
     276        default: \
     277            break; \
     278        } \
     279    }
     280
     281    switch (type) {
     282    case PS_TYPE_S8:
     283        PSIMAGE_COPY_CASE(output, S8);
     284        break;
     285    case PS_TYPE_S16:
     286        PSIMAGE_COPY_CASE(output, S16);
     287        break;
     288    case PS_TYPE_S32:
     289        PSIMAGE_COPY_CASE(output, S32);
     290        break;
     291    case PS_TYPE_S64:
     292        PSIMAGE_COPY_CASE(output, S64);
     293        break;
     294    case PS_TYPE_U8:
     295        PSIMAGE_COPY_CASE(output, U8);
     296        break;
     297    case PS_TYPE_U16:
     298        PSIMAGE_COPY_CASE(output, U16);
     299        break;
     300    case PS_TYPE_U32:
     301        PSIMAGE_COPY_CASE(output, U32);
     302        break;
     303    case PS_TYPE_U64:
     304        PSIMAGE_COPY_CASE(output, U64);
     305        break;
     306    case PS_TYPE_F32:
     307        PSIMAGE_COPY_CASE(output, F32);
     308        break;
     309    case PS_TYPE_F64:
     310        PSIMAGE_COPY_CASE(output, F64);
     311        break;
     312    case PS_TYPE_C32:
     313        PSIMAGE_COPY_CASE(output, C32);
     314        break;
     315    case PS_TYPE_C64:
     316        PSIMAGE_COPY_CASE(output, C64);
     317        break;
     318    default: {
     319            char* typeStr;
     320            PS_TYPE_NAME(typeStr,type);
     321            psErrorMsg(PS_ERRORNAME_DOMAIN "psImageCopy",
     322                       PS_ERR_BAD_PARAMETER_TYPE, true,
     323                       PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
     324                       typeStr);
     325            psFree(output);
     326
     327            break;
     328        }
     329    }
     330    return output;
    164331}
    165332
Note: See TracChangeset for help on using the changeset viewer.