Changeset 1260 for trunk/psLib/src/imageops/psImageStats.c
- Timestamp:
- Jul 22, 2004, 10:02:57 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageStats.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageStats.c
r1251 r1260 400 400 default: \ 401 401 psError(__func__,"Unsupported interpolation mode (#%d)",mode); \ 402 return unexposedValue; \403 402 } \ 404 403 break 405 404 406 405 switch (input->type.type) { 406 PSIMAGE_PIXEL_INTERPOLATE_CASE(U8); 407 PSIMAGE_PIXEL_INTERPOLATE_CASE(U16); 408 PSIMAGE_PIXEL_INTERPOLATE_CASE(U32); 409 PSIMAGE_PIXEL_INTERPOLATE_CASE(U64); 410 PSIMAGE_PIXEL_INTERPOLATE_CASE(S8); 411 PSIMAGE_PIXEL_INTERPOLATE_CASE(S16); 412 PSIMAGE_PIXEL_INTERPOLATE_CASE(S32); 413 PSIMAGE_PIXEL_INTERPOLATE_CASE(S64); 407 414 PSIMAGE_PIXEL_INTERPOLATE_CASE(F32); 415 PSIMAGE_PIXEL_INTERPOLATE_CASE(F64); 416 PSIMAGE_PIXEL_INTERPOLATE_CASE(C32); 417 PSIMAGE_PIXEL_INTERPOLATE_CASE(C64); 408 418 default: 409 419 psError(__func__,"Unsupported image datatype (%d)",input->type.type); … … 434 444 } 435 445 446 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \ 447 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \ 448 float x, \ 449 float y, \ 450 psC64 unexposedValue) \ 451 { \ 452 int intX = (int) round((psF64)(x) - 0.5); \ 453 int intY = (int) round((psF64)(y) - 0.5); \ 454 int lastX = input->numCols - 1; \ 455 int lastY = input->numRows - 1; \ 456 \ 457 if ((intX < 0) || \ 458 (intX > lastX) || \ 459 (intY < 0) || \ 460 (intY > lastY)) { \ 461 return unexposedValue; \ 462 } \ 463 \ 464 return input->data.TYPE[intY][intX]; \ 465 } 466 436 467 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8) 437 468 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16) … … 444 475 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32) 445 476 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64) 477 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32) 478 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64) 446 479 447 480 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \ … … 501 534 } 502 535 536 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \ 537 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \ 538 float x, \ 539 float y, \ 540 psC64 unexposedValue) \ 541 { \ 542 double floorX = floor((psF64)(x) - 0.5); \ 543 double floorY = floor((psF64)(y) - 0.5); \ 544 double fracX = x - 0.5 - floorX; \ 545 double fracY = y - 0.5 - floorY; \ 546 int intFloorX = (int) floorX; \ 547 int intFloorY = (int) floorY; \ 548 int lastX = input->numCols - 1; \ 549 int lastY = input->numRows - 1; \ 550 double rx = 0.0; \ 551 psC64 pixel = 0.0; \ 552 ps##TYPE* currentRow; \ 553 ps##TYPE* nextRow; \ 554 \ 555 if ((intFloorX < 0) || \ 556 (intFloorX > lastX) || \ 557 (intFloorY < 0) || \ 558 (intFloorY > lastY)) { \ 559 return unexposedValue; \ 560 } \ 561 \ 562 currentRow = input->data.TYPE[intFloorY]; \ 563 if (intFloorY == lastY) { \ 564 pixel = currentRow[intFloorX]; \ 565 if (intFloorX < lastX) { \ 566 pixel+= fracY * (currentRow[intFloorX+1] - \ 567 currentRow[intFloorX]); \ 568 } \ 569 return(pixel); \ 570 } \ 571 nextRow = input->data.TYPE[intFloorY+1]; \ 572 if (intFloorX == lastX) { \ 573 pixel = currentRow[intFloorX]; \ 574 if (intFloorY < lastY) { \ 575 pixel+= fracX * (nextRow[intFloorX] - \ 576 currentRow[intFloorX]); \ 577 } \ 578 return(pixel); \ 579 } \ 580 \ 581 rx = currentRow[intFloorX] + \ 582 fracX * (currentRow[intFloorX+1] - \ 583 currentRow[intFloorX]); \ 584 \ 585 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \ 586 fracX * (nextRow[intFloorX+1] - \ 587 nextRow[intFloorX]) - rx); \ 588 \ 589 return(pixel); \ 590 } 591 503 592 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8) 504 593 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16) … … 511 600 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32) 512 601 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64) 513 602 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32) 603 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64) 604
Note:
See TracChangeset
for help on using the changeset viewer.
