IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 18, 2005, 7:18:20 PM (21 years ago)
Author:
desonia
Message:

fixes to psRegion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageStructManip.c

    r3968 r3977  
    88 *  @author Robert DeSonia, MHPCC
    99 *
    10  *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
    11  *  @date $Date: 2005-05-19 02:08:21 $
     10 *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
     11 *  @date $Date: 2005-05-19 05:18:20 $
    1212 *
    1313 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    136136}
    137137
    138 psImage* psImageSubsection(psImage* image,
    139                            const char* section)
     138psImage* psImageCopy(psImage* output,
     139                     const psImage* input,
     140                     psElemType type)
    140141{
    141     psS32 col0;
    142     psS32 col1;
    143     psS32 row0;
    144     psS32 row1;
    145 
    146     // section should be of the form '[col0:col1,row0:row1]'
    147     if (section == NULL) {
     142    psElemType inDatatype;
     143    psS32 elementSize;
     144    psS32 elements;
     145    psS32 numRows;
     146    psS32 numCols;
     147
     148    if (input == NULL || input->data.V == NULL) {
    148149        psError(PS_ERR_BAD_PARAMETER_NULL, true,
    149                 PS_ERRORTEXT_psImage_SUBSECTION_NULL);
    150         return NULL;
    151     }
    152 
    153     if (sscanf(section,"[%d:%d,%d:%d]",&col0,&col1,&row0,&row1) < 4) {
     150                PS_ERRORTEXT_psImage_IMAGE_NULL);
     151        psFree(output);
     152        return NULL;
     153    }
     154
     155    if (input == output) {
    154156        psError(PS_ERR_BAD_PARAMETER_NULL, true,
    155                 PS_ERRORTEXT_psImage_SUBSECTION_INVALID,
    156                 section);
    157         return NULL;
    158     }
    159 
    160     if (col0 > col1 || row0 > row1) {
    161         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    162                 PS_ERRORTEXT_psImage_SUBSET_RANGE_MALFORMED,
    163                 col0,col1,row0,row1);
    164         return NULL;
    165     }
    166 
    167     return imageSubset(NULL,image,col0,row0,col1+1,row1+1);
     157                PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED);
     158        psFree(output);
     159        return NULL;
     160    }
     161
     162    if (input->type.dimen != PS_DIMEN_IMAGE) {
     163        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
     164                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
     165        psFree(output);
     166        return NULL;
     167    }
     168
     169    inDatatype = input->type.type;
     170    numRows = input->numRows;
     171    numCols = input->numCols;
     172    elements = numRows * numCols;
     173    elementSize = PSELEMTYPE_SIZEOF(inDatatype);
     174
     175    output = psImageRecycle(output, numCols, numRows, type);
     176
     177    // cover the trival case of copy of the same
     178    // datatype.
     179    if (type == inDatatype) {
     180        for (psS32 row=0;row<numRows;row++) {
     181            memcpy(output->data.V[row], input->data.V[row], elementSize * numCols);
     182        }
     183        return output;
     184    }
     185
     186    #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \
     187        ps##INTYPE *in; \
     188        ps##OUTTYPE *out; \
     189        for(psS32 row=0;row<numRows;row++) { \
     190            in = IN->data.INTYPE[row]; \
     191            out = OUT->data.OUTTYPE[row]; \
     192            for (psS32 col=0;col<numCols;col++) { \
     193                *(out++) = *(in++); \
     194            } \
     195        } \
     196    }
     197
     198    #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) { \
     199        switch (inDatatype) { \
     200        case PS_TYPE_S8: \
     201            PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \
     202            break; \
     203        case PS_TYPE_S16: \
     204            PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \
     205            break; \
     206        case PS_TYPE_S32: \
     207            PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \
     208            break; \
     209        case PS_TYPE_S64: \
     210            PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \
     211            break; \
     212        case PS_TYPE_U8: \
     213            PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \
     214            break; \
     215        case PS_TYPE_U16: \
     216            PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \
     217            break; \
     218        case PS_TYPE_U32: \
     219            PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \
     220            break; \
     221        case PS_TYPE_U64: \
     222            PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \
     223            break; \
     224        case PS_TYPE_F32: \
     225            PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \
     226            break; \
     227        case PS_TYPE_F64: \
     228            PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \
     229            break; \
     230        case PS_TYPE_C32: \
     231            PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \
     232            break; \
     233        case PS_TYPE_C64: \
     234            PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \
     235            break; \
     236        default: \
     237            break; \
     238        } \
     239    }
     240
     241    switch (type) {
     242    case PS_TYPE_S8:
     243        PSIMAGE_COPY_CASE(output, S8);
     244        break;
     245    case PS_TYPE_S16:
     246        PSIMAGE_COPY_CASE(output, S16);
     247        break;
     248    case PS_TYPE_S32:
     249        PSIMAGE_COPY_CASE(output, S32);
     250        break;
     251    case PS_TYPE_S64:
     252        PSIMAGE_COPY_CASE(output, S64);
     253        break;
     254    case PS_TYPE_U8:
     255        PSIMAGE_COPY_CASE(output, U8);
     256        break;
     257    case PS_TYPE_U16:
     258        PSIMAGE_COPY_CASE(output, U16);
     259        break;
     260    case PS_TYPE_U32:
     261        PSIMAGE_COPY_CASE(output, U32);
     262        break;
     263    case PS_TYPE_U64:
     264        PSIMAGE_COPY_CASE(output, U64);
     265        break;
     266    case PS_TYPE_F32:
     267        PSIMAGE_COPY_CASE(output, F32);
     268        break;
     269    case PS_TYPE_F64:
     270        PSIMAGE_COPY_CASE(output, F64);
     271        break;
     272    case PS_TYPE_C32:
     273        PSIMAGE_COPY_CASE(output, C32);
     274        break;
     275    case PS_TYPE_C64:
     276        PSIMAGE_COPY_CASE(output, C64);
     277        break;
     278    default: {
     279            char* typeStr;
     280            PS_TYPE_NAME(typeStr,type);
     281            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
     282                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
     283                    typeStr);
     284            psFree(output);
     285
     286            break;
     287        }
     288    }
     289    return output;
    168290}
    169291
Note: See TracChangeset for help on using the changeset viewer.