Changeset 2067 for trunk/psLib/src/image/psImage.c
- Timestamp:
- Oct 12, 2004, 2:10:50 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/image/psImage.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImage.c
r1933 r2067 10 10 * @author Ross Harman, MHPCC 11 11 * 12 * @version $Revision: 1.4 8$ $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 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 162 162 163 163 return old; 164 } 165 166 psImage* 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; 164 331 } 165 332
Note:
See TracChangeset
for help on using the changeset viewer.
