Changeset 3977 for trunk/psLib/src/imageops/psImageStructManip.c
- Timestamp:
- May 18, 2005, 7:18:20 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageStructManip.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageStructManip.c
r3968 r3977 8 8 * @author Robert DeSonia, MHPCC 9 9 * 10 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $11 * @date $Date: 2005-05-19 0 2:08:21$10 * @version $Revision: 1.2 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2005-05-19 05:18:20 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 136 136 } 137 137 138 psImage* psImageSubsection(psImage* image, 139 const char* section) 138 psImage* psImageCopy(psImage* output, 139 const psImage* input, 140 psElemType type) 140 141 { 141 ps S32 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) { 148 149 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) { 154 156 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; 168 290 } 169 291
Note:
See TracChangeset
for help on using the changeset viewer.
