Changeset 3446
- Timestamp:
- Mar 17, 2005, 4:35:15 PM (21 years ago)
- Location:
- trunk/psLib
- Files:
-
- 8 edited
-
src/image/psImage.c (modified) (13 diffs)
-
src/image/psImage.h (modified) (2 diffs)
-
src/image/psImageManip.c (modified) (3 diffs)
-
src/mathtypes/psImage.c (modified) (13 diffs)
-
src/mathtypes/psImage.h (modified) (2 diffs)
-
test/image/tst_psImageInterpolate.c (modified) (2 diffs)
-
test/image/tst_psImageManip.c (modified) (2 diffs)
-
test/image/verified/tst_psImageManip.stderr (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImage.c
r3442 r3446 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.6 0$ $Name: not supported by cvs2svn $12 * @date $Date: 2005-03-1 7 19:02:01$11 * @version $Revision: 1.61 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2005-03-18 02:35:14 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 26 26 27 27 #include "psImageErrors.h" 28 29 #define SQUARE(x) ((x)*(x)) 30 #define MIN(x,y) (((x) > (y)) ? (y) : (x)) 31 #define MAX(x,y) (((x) > (y)) ? (x) : (y)) 28 32 29 33 static void imageFree(psImage* image) … … 116 120 } 117 121 118 119 120 122 psRegion* psRegionFromString(char* region) 121 123 { … … 165 167 return psStringCopy(tmpText); 166 168 } 167 168 169 169 170 psImage* psImageRecycle(psImage* old, … … 428 429 } 429 430 430 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \431 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \ 431 432 case PS_TYPE_##TYPE: \ 432 433 switch (mode) { \ … … 449 450 unexposedValue); \ 450 451 break; \ 452 case PS_INTERPOLATE_BILINEAR_VARIANCE: \ 453 return p_psImagePixelInterpolateBILINEAR_VARIANCE_##TYPE( \ 454 input, \ 455 x, \ 456 y, \ 457 mask, \ 458 maskVal, \ 459 unexposedValue); \ 460 break; \ 451 461 default: \ 452 462 psError(PS_ERR_BAD_PARAMETER_VALUE,true, \ … … 454 464 mode); \ 455 465 } \ 456 break 466 break; 457 467 458 468 switch (input->type.type) { … … 481 491 } 482 492 483 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \ 484 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage* input, \ 493 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE,RETURNTYPE) \ 494 inline RETURNTYPE p_psImagePixelInterpolateFLAT_##TYPE( \ 495 const psImage* input, \ 485 496 float x, \ 486 497 float y, \ 487 498 const psImage* mask, \ 488 499 psU32 maskVal, \ 489 psF64unexposedValue) \500 RETURNTYPE unexposedValue) \ 490 501 { \ 491 502 psS32 intX = (psS32) round((psF64)(x) - 0.5 + FLT_EPSILON); \ … … 506 517 } 507 518 508 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \ 509 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage* input, \ 519 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8,psF64) 520 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16,psF64) 521 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32,psF64) 522 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64,psF64) 523 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8,psF64) 524 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16,psF64) 525 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32,psF64) 526 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64,psF64) 527 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32,psF64) 528 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64,psF64) 529 PSIMAGE_PIXEL_INTERPOLATE_FLAT(C32,psC64) 530 PSIMAGE_PIXEL_INTERPOLATE_FLAT(C64,psC64) 531 532 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE, RETURNTYPE, SUFFIX, FRACFUNC) \ 533 inline RETURNTYPE p_psImagePixelInterpolateBILINEAR_##SUFFIX( \ 534 const psImage* input, \ 510 535 float x, \ 511 536 float y, \ 512 537 const psImage* mask, \ 513 538 psU32 maskVal, \ 514 psC64 unexposedValue) \ 515 { \ 516 psS32 intX = (psS32) round((psF64)(x) - 0.5); \ 517 psS32 intY = (psS32) round((psF64)(y) - 0.5); \ 518 psS32 lastX = input->numCols - 1; \ 519 psS32 lastY = input->numRows - 1; \ 520 \ 521 if ((intX < 0) || \ 522 (intX > lastX) || \ 523 (intY < 0) || \ 524 (intY > lastY) || \ 525 ( (mask!=NULL) && \ 526 ((mask->data.PS_TYPE_MASK_DATA[intY][intX] & maskVal) != 0) ) ) { \ 527 return unexposedValue; \ 528 } \ 529 \ 530 return input->data.TYPE[intY][intX]; \ 531 } 532 533 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8) 534 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16) 535 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32) 536 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64) 537 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8) 538 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16) 539 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32) 540 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64) 541 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32) 542 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64) 543 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32) 544 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64) 545 546 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \ 547 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage* input, \ 548 float x, \ 549 float y, \ 550 const psImage* mask, \ 551 psU32 maskVal, \ 552 psF64 unexposedValue) \ 539 RETURNTYPE unexposedValue) \ 553 540 { \ 554 541 double floorX = floor((psF64)(x) - 0.5); \ … … 597 584 if (valid00 && valid10 && valid01 && valid11) { \ 598 585 /* formula from the ADD */ \ 599 psF64 rx = V00 + (V10-V00)*fracX;\600 return (rx + (V01 + (V11 - V01) * fracX - rx) *fracY); \586 return V00*FRACFUNC((1.0-fracX)*(1.0-fracY)) + V10*FRACFUNC(fracX*(1.0-fracY)) + \ 587 V01*FRACFUNC(fracY*(1.0-fracX)) + V11*FRACFUNC(fracX*fracY); \ 601 588 } \ 602 589 \ 603 590 /* OK, at least one pixel is not valid - need to do it piecemeal */ \ 604 591 \ 605 psF64V0 = 0.0; \592 RETURNTYPE V0 = 0.0; \ 606 593 psBool valid0 = true; \ 607 594 if (valid00 && valid10) { \ 608 V0 = V00* (1-fracX)+V10*fracX; \595 V0 = V00*FRACFUNC(1-fracX)+V10*FRACFUNC(fracX); \ 609 596 } else if (valid00) { \ 610 597 V0 = V00; \ … … 615 602 } \ 616 603 \ 617 psF64V1 = 0.0; \604 RETURNTYPE V1 = 0.0; \ 618 605 psBool valid1 = true; \ 619 606 if (valid01 && valid11) { \ 620 V1 = V01* (1-fracX)+V11*fracX; \607 V1 = V01*FRACFUNC(1-fracX)+V11*FRACFUNC(fracX); \ 621 608 } else if (valid01) { \ 622 609 V1 = V01; \ … … 628 615 \ 629 616 if (valid0 && valid1) { \ 630 return ( V0*(1-fracY) + V1*fracY); \617 return V0*FRACFUNC(1-fracY) + V1*FRACFUNC(fracY); \ 631 618 } else if (valid0) { \ 632 619 return V0; \ … … 638 625 } 639 626 640 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \ 641 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage* input, \ 642 float x, \ 643 float y, \ 644 const psImage* mask, \ 645 psU32 maskVal, \ 646 psC64 unexposedValue) \ 647 { \ 648 double floorX = floor((psF64)(x) - 0.5); \ 649 double floorY = floor((psF64)(y) - 0.5); \ 650 psF64 fracX = x - 0.5 - floorX; \ 651 psF64 fracY = y - 0.5 - floorY; \ 652 psS32 intFloorX = (psS32) floorX; \ 653 psS32 intFloorY = (psS32) floorY; \ 654 psS32 lastX = input->numCols - 1; \ 655 psS32 lastY = input->numRows - 1; \ 656 ps##TYPE V00 = 0; \ 657 ps##TYPE V01 = 0; \ 658 ps##TYPE V10 = 0; \ 659 ps##TYPE V11 = 0; \ 660 psBool valid00 = false; \ 661 psBool valid01 = false; \ 662 psBool valid10 = false; \ 663 psBool valid11 = false; \ 664 \ 665 if (intFloorY >= 0 && intFloorY <= lastY) { \ 666 if (intFloorX >= 0 && intFloorX <= lastX) { \ 667 V00 = input->data.TYPE[intFloorY][intFloorX]; \ 668 valid00 = (mask == NULL) || \ 669 ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX] & maskVal) == 0); \ 670 } \ 671 if (intFloorX >= -1 && intFloorX < lastX) { \ 672 V10 = input->data.TYPE[intFloorY][intFloorX+1]; \ 673 valid10 = (mask == NULL) || \ 674 ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX+1] & maskVal) == 0); \ 675 } \ 676 } \ 677 if (intFloorY >= -1 && intFloorY < lastY) { \ 678 if (intFloorX >= 0 && intFloorX <= lastX) { \ 679 V01 = input->data.TYPE[intFloorY+1][intFloorX]; \ 680 valid01 = (mask == NULL) || \ 681 ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX] & maskVal) == 0); \ 682 } \ 683 if (intFloorX >= -1 && intFloorX < lastX) { \ 684 V11 = input->data.TYPE[intFloorY+1][intFloorX+1]; \ 685 valid11 = (mask == NULL) || \ 686 ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX+1] & maskVal) == 0); \ 687 } \ 688 } \ 689 \ 690 /* cover likely case of all pixels being valid */ \ 691 if (valid00 && valid10 && valid01 && valid11) { \ 692 /* formula from the ADD */ \ 693 psC64 rx = V00 + (V10-V00)*fracX; \ 694 return (rx + (V01 + (V11 - V01) * fracX - rx) * fracY); \ 695 } \ 696 \ 697 /* OK, at least one pixel is not valid - need to do it piecemeal */ \ 698 \ 699 psC64 V0 = 0; \ 700 psBool valid0 = true; \ 701 if (valid00 && valid10) { \ 702 V0 = V00*(1-fracX)+V10*fracX; \ 703 } else if (valid00) { \ 704 V0 = V00; \ 705 } else if (valid10) { \ 706 V0 = V10; \ 707 } else { \ 708 valid0 = false; \ 709 } \ 710 \ 711 psC64 V1 = 0; \ 712 psBool valid1 = true; \ 713 if (valid01 && valid11) { \ 714 V0 = V01*(1-fracX)+V11*fracX; \ 715 } else if (valid01) { \ 716 V0 = V01; \ 717 } else if (valid11) { \ 718 V0 = V11; \ 719 } else { \ 720 valid1 = false; \ 721 } \ 722 \ 723 if (valid0 && valid1) { \ 724 return ( V0*(1-fracY) + V1*fracY ); \ 725 } else if (valid0) { \ 726 return V0; \ 727 } else if (valid1) { \ 728 return V1; \ 729 } \ 730 \ 731 return unexposedValue; \ 732 } 733 734 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8) 735 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16) 736 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32) 737 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64) 738 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8) 739 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16) 740 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32) 741 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64) 742 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32) 743 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64) 744 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32) 745 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64) 627 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,U8,) 628 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,U16,) 629 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,U32,) 630 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,U64,) 631 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,S8,) 632 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,S16,) 633 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,S32,) 634 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,S64,) 635 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,F32,) 636 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,F64,) 637 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,C32,) 638 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,C64,) 639 640 // Variance Version 641 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,VARIANCE_U8,SQUARE) 642 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,VARIANCE_U16,SQUARE) 643 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,VARIANCE_U32,SQUARE) 644 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,VARIANCE_U64,SQUARE) 645 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,VARIANCE_S8,SQUARE) 646 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,VARIANCE_S16,SQUARE) 647 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,VARIANCE_S32,SQUARE) 648 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,VARIANCE_S64,SQUARE) 649 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,VARIANCE_F32,SQUARE) 650 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,VARIANCE_F64,SQUARE) 651 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,VARIANCE_C32,SQUARE) 652 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,VARIANCE_C64,SQUARE) -
trunk/psLib/src/image/psImage.h
r3442 r3446 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1.4 8$ $Name: not supported by cvs2svn $14 * @date $Date: 2005-03-1 7 19:02:01$13 * @version $Revision: 1.49 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2005-03-18 02:35:14 $ 15 15 * 16 16 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 191 191 ); 192 192 193 #define p_psImagePixelInterpolateFcns(TYPE) \194 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE( \193 #define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \ 194 inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \ 195 195 const psImage* input, /**< input image for interpolation */ \ 196 196 float x, /**< column location to derive value of */ \ 197 197 float y, /**< row location ot derive value of */ \ 198 198 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 199 psU32 maskVal, /**< the mask value */ \ 200 psF64 unexposedValue /**< return value if x,y location is not in image. */ \ 201 ); \ 202 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 203 const psImage* input, /**< input image for interpolation */ \ 204 float x, /**< column location to derive value of */ \ 205 float y, /**< row location ot derive value of */ \ 206 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 207 psU32 maskVal, /**< the mask value */ \ 208 psF64 unexposedValue /**< return value if x,y location is not in image. */ \ 209 ); 210 211 #define p_psImagePixelInterpolateComplexFcns(TYPE) \ 212 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \ 213 const psImage* input, /**< input image for interpolation */ \ 214 float x, /**< column location to derive value of */ \ 215 float y, /**< row location ot derive value of */ \ 216 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 217 psU32 maskVal, /**< the mask value */ \ 218 psC64 unexposedValue /**< return value if x,y location is not in image. */ \ 219 ); \ 220 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 221 const psImage* input, /**< input image for interpolation */ \ 222 float x, /**< column location to derive value of */ \ 223 float y, /**< row location ot derive value of */ \ 224 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 225 psU32 maskVal, /**< the mask value */ \ 226 psC64 unexposedValue /**< return value if x,y location is not in image. */ \ 227 ); 199 psU32 maskVal, /**< the mask value */ \ 200 RETURNTYPE unexposedValue /**< return value if x,y location is not in image. */ \ 201 ); 202 203 #define PIXEL_INTERPOLATE_FCNS(MODE) \ 204 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64) \ 205 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \ 206 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \ 207 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \ 208 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64) \ 209 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \ 210 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \ 211 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \ 212 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \ 213 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \ 214 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \ 215 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64) 216 228 217 #ifndef SWIG 229 p_psImagePixelInterpolateFcns(U8) 230 p_psImagePixelInterpolateFcns(U16) 231 p_psImagePixelInterpolateFcns(U32) 232 p_psImagePixelInterpolateFcns(U64) 233 p_psImagePixelInterpolateFcns(S8) 234 p_psImagePixelInterpolateFcns(S16) 235 p_psImagePixelInterpolateFcns(S32) 236 p_psImagePixelInterpolateFcns(S64) 237 p_psImagePixelInterpolateFcns(F32) 238 p_psImagePixelInterpolateFcns(F64) 239 p_psImagePixelInterpolateComplexFcns(C32) 240 p_psImagePixelInterpolateComplexFcns(C64) 218 PIXEL_INTERPOLATE_FCNS(FLAT) 219 PIXEL_INTERPOLATE_FCNS(BILINEAR) 220 PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE) 241 221 #endif 242 222 223 #undef PIXEL_INTERPOLATE_FCN_PROTOTYPE 224 #undef PIXEL_INTERPOLATE_FCNS 225 243 226 /// @} 244 227 -
trunk/psLib/src/image/psImageManip.c
r3264 r3446 10 10 * @author Ross Harman, MHPCC 11 11 * 12 * @version $Revision: 1.3 6$ $Name: not supported by cvs2svn $13 * @date $Date: 2005-0 2-17 19:26:24 $12 * @version $Revision: 1.37 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2005-03-18 02:35:14 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 941 941 PSIMAGE_ROTATE_ARBITRARY_CASE(FLAT); 942 942 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR); 943 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR_VARIANCE); 943 944 default: 944 945 psError(PS_ERR_BAD_PARAMETER_VALUE, true, … … 1037 1038 PSIMAGE_SHIFT_ARBITRARY_CASE(FLAT); 1038 1039 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR); 1040 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR_VARIANCE); 1039 1041 default: 1040 1042 psError(PS_ERR_BAD_PARAMETER_VALUE, true, -
trunk/psLib/src/mathtypes/psImage.c
r3442 r3446 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.6 0$ $Name: not supported by cvs2svn $12 * @date $Date: 2005-03-1 7 19:02:01$11 * @version $Revision: 1.61 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2005-03-18 02:35:14 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 26 26 27 27 #include "psImageErrors.h" 28 29 #define SQUARE(x) ((x)*(x)) 30 #define MIN(x,y) (((x) > (y)) ? (y) : (x)) 31 #define MAX(x,y) (((x) > (y)) ? (x) : (y)) 28 32 29 33 static void imageFree(psImage* image) … … 116 120 } 117 121 118 119 120 122 psRegion* psRegionFromString(char* region) 121 123 { … … 165 167 return psStringCopy(tmpText); 166 168 } 167 168 169 169 170 psImage* psImageRecycle(psImage* old, … … 428 429 } 429 430 430 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \431 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \ 431 432 case PS_TYPE_##TYPE: \ 432 433 switch (mode) { \ … … 449 450 unexposedValue); \ 450 451 break; \ 452 case PS_INTERPOLATE_BILINEAR_VARIANCE: \ 453 return p_psImagePixelInterpolateBILINEAR_VARIANCE_##TYPE( \ 454 input, \ 455 x, \ 456 y, \ 457 mask, \ 458 maskVal, \ 459 unexposedValue); \ 460 break; \ 451 461 default: \ 452 462 psError(PS_ERR_BAD_PARAMETER_VALUE,true, \ … … 454 464 mode); \ 455 465 } \ 456 break 466 break; 457 467 458 468 switch (input->type.type) { … … 481 491 } 482 492 483 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \ 484 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage* input, \ 493 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE,RETURNTYPE) \ 494 inline RETURNTYPE p_psImagePixelInterpolateFLAT_##TYPE( \ 495 const psImage* input, \ 485 496 float x, \ 486 497 float y, \ 487 498 const psImage* mask, \ 488 499 psU32 maskVal, \ 489 psF64unexposedValue) \500 RETURNTYPE unexposedValue) \ 490 501 { \ 491 502 psS32 intX = (psS32) round((psF64)(x) - 0.5 + FLT_EPSILON); \ … … 506 517 } 507 518 508 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \ 509 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage* input, \ 519 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8,psF64) 520 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16,psF64) 521 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32,psF64) 522 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64,psF64) 523 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8,psF64) 524 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16,psF64) 525 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32,psF64) 526 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64,psF64) 527 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32,psF64) 528 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64,psF64) 529 PSIMAGE_PIXEL_INTERPOLATE_FLAT(C32,psC64) 530 PSIMAGE_PIXEL_INTERPOLATE_FLAT(C64,psC64) 531 532 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE, RETURNTYPE, SUFFIX, FRACFUNC) \ 533 inline RETURNTYPE p_psImagePixelInterpolateBILINEAR_##SUFFIX( \ 534 const psImage* input, \ 510 535 float x, \ 511 536 float y, \ 512 537 const psImage* mask, \ 513 538 psU32 maskVal, \ 514 psC64 unexposedValue) \ 515 { \ 516 psS32 intX = (psS32) round((psF64)(x) - 0.5); \ 517 psS32 intY = (psS32) round((psF64)(y) - 0.5); \ 518 psS32 lastX = input->numCols - 1; \ 519 psS32 lastY = input->numRows - 1; \ 520 \ 521 if ((intX < 0) || \ 522 (intX > lastX) || \ 523 (intY < 0) || \ 524 (intY > lastY) || \ 525 ( (mask!=NULL) && \ 526 ((mask->data.PS_TYPE_MASK_DATA[intY][intX] & maskVal) != 0) ) ) { \ 527 return unexposedValue; \ 528 } \ 529 \ 530 return input->data.TYPE[intY][intX]; \ 531 } 532 533 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8) 534 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16) 535 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32) 536 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64) 537 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8) 538 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16) 539 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32) 540 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64) 541 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32) 542 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64) 543 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32) 544 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64) 545 546 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \ 547 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage* input, \ 548 float x, \ 549 float y, \ 550 const psImage* mask, \ 551 psU32 maskVal, \ 552 psF64 unexposedValue) \ 539 RETURNTYPE unexposedValue) \ 553 540 { \ 554 541 double floorX = floor((psF64)(x) - 0.5); \ … … 597 584 if (valid00 && valid10 && valid01 && valid11) { \ 598 585 /* formula from the ADD */ \ 599 psF64 rx = V00 + (V10-V00)*fracX;\600 return (rx + (V01 + (V11 - V01) * fracX - rx) *fracY); \586 return V00*FRACFUNC((1.0-fracX)*(1.0-fracY)) + V10*FRACFUNC(fracX*(1.0-fracY)) + \ 587 V01*FRACFUNC(fracY*(1.0-fracX)) + V11*FRACFUNC(fracX*fracY); \ 601 588 } \ 602 589 \ 603 590 /* OK, at least one pixel is not valid - need to do it piecemeal */ \ 604 591 \ 605 psF64V0 = 0.0; \592 RETURNTYPE V0 = 0.0; \ 606 593 psBool valid0 = true; \ 607 594 if (valid00 && valid10) { \ 608 V0 = V00* (1-fracX)+V10*fracX; \595 V0 = V00*FRACFUNC(1-fracX)+V10*FRACFUNC(fracX); \ 609 596 } else if (valid00) { \ 610 597 V0 = V00; \ … … 615 602 } \ 616 603 \ 617 psF64V1 = 0.0; \604 RETURNTYPE V1 = 0.0; \ 618 605 psBool valid1 = true; \ 619 606 if (valid01 && valid11) { \ 620 V1 = V01* (1-fracX)+V11*fracX; \607 V1 = V01*FRACFUNC(1-fracX)+V11*FRACFUNC(fracX); \ 621 608 } else if (valid01) { \ 622 609 V1 = V01; \ … … 628 615 \ 629 616 if (valid0 && valid1) { \ 630 return ( V0*(1-fracY) + V1*fracY); \617 return V0*FRACFUNC(1-fracY) + V1*FRACFUNC(fracY); \ 631 618 } else if (valid0) { \ 632 619 return V0; \ … … 638 625 } 639 626 640 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \ 641 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage* input, \ 642 float x, \ 643 float y, \ 644 const psImage* mask, \ 645 psU32 maskVal, \ 646 psC64 unexposedValue) \ 647 { \ 648 double floorX = floor((psF64)(x) - 0.5); \ 649 double floorY = floor((psF64)(y) - 0.5); \ 650 psF64 fracX = x - 0.5 - floorX; \ 651 psF64 fracY = y - 0.5 - floorY; \ 652 psS32 intFloorX = (psS32) floorX; \ 653 psS32 intFloorY = (psS32) floorY; \ 654 psS32 lastX = input->numCols - 1; \ 655 psS32 lastY = input->numRows - 1; \ 656 ps##TYPE V00 = 0; \ 657 ps##TYPE V01 = 0; \ 658 ps##TYPE V10 = 0; \ 659 ps##TYPE V11 = 0; \ 660 psBool valid00 = false; \ 661 psBool valid01 = false; \ 662 psBool valid10 = false; \ 663 psBool valid11 = false; \ 664 \ 665 if (intFloorY >= 0 && intFloorY <= lastY) { \ 666 if (intFloorX >= 0 && intFloorX <= lastX) { \ 667 V00 = input->data.TYPE[intFloorY][intFloorX]; \ 668 valid00 = (mask == NULL) || \ 669 ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX] & maskVal) == 0); \ 670 } \ 671 if (intFloorX >= -1 && intFloorX < lastX) { \ 672 V10 = input->data.TYPE[intFloorY][intFloorX+1]; \ 673 valid10 = (mask == NULL) || \ 674 ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX+1] & maskVal) == 0); \ 675 } \ 676 } \ 677 if (intFloorY >= -1 && intFloorY < lastY) { \ 678 if (intFloorX >= 0 && intFloorX <= lastX) { \ 679 V01 = input->data.TYPE[intFloorY+1][intFloorX]; \ 680 valid01 = (mask == NULL) || \ 681 ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX] & maskVal) == 0); \ 682 } \ 683 if (intFloorX >= -1 && intFloorX < lastX) { \ 684 V11 = input->data.TYPE[intFloorY+1][intFloorX+1]; \ 685 valid11 = (mask == NULL) || \ 686 ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX+1] & maskVal) == 0); \ 687 } \ 688 } \ 689 \ 690 /* cover likely case of all pixels being valid */ \ 691 if (valid00 && valid10 && valid01 && valid11) { \ 692 /* formula from the ADD */ \ 693 psC64 rx = V00 + (V10-V00)*fracX; \ 694 return (rx + (V01 + (V11 - V01) * fracX - rx) * fracY); \ 695 } \ 696 \ 697 /* OK, at least one pixel is not valid - need to do it piecemeal */ \ 698 \ 699 psC64 V0 = 0; \ 700 psBool valid0 = true; \ 701 if (valid00 && valid10) { \ 702 V0 = V00*(1-fracX)+V10*fracX; \ 703 } else if (valid00) { \ 704 V0 = V00; \ 705 } else if (valid10) { \ 706 V0 = V10; \ 707 } else { \ 708 valid0 = false; \ 709 } \ 710 \ 711 psC64 V1 = 0; \ 712 psBool valid1 = true; \ 713 if (valid01 && valid11) { \ 714 V0 = V01*(1-fracX)+V11*fracX; \ 715 } else if (valid01) { \ 716 V0 = V01; \ 717 } else if (valid11) { \ 718 V0 = V11; \ 719 } else { \ 720 valid1 = false; \ 721 } \ 722 \ 723 if (valid0 && valid1) { \ 724 return ( V0*(1-fracY) + V1*fracY ); \ 725 } else if (valid0) { \ 726 return V0; \ 727 } else if (valid1) { \ 728 return V1; \ 729 } \ 730 \ 731 return unexposedValue; \ 732 } 733 734 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8) 735 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16) 736 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32) 737 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64) 738 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8) 739 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16) 740 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32) 741 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64) 742 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32) 743 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64) 744 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32) 745 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64) 627 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,U8,) 628 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,U16,) 629 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,U32,) 630 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,U64,) 631 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,S8,) 632 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,S16,) 633 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,S32,) 634 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,S64,) 635 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,F32,) 636 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,F64,) 637 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,C32,) 638 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,C64,) 639 640 // Variance Version 641 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,VARIANCE_U8,SQUARE) 642 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,VARIANCE_U16,SQUARE) 643 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,VARIANCE_U32,SQUARE) 644 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,VARIANCE_U64,SQUARE) 645 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,VARIANCE_S8,SQUARE) 646 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,VARIANCE_S16,SQUARE) 647 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,VARIANCE_S32,SQUARE) 648 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,VARIANCE_S64,SQUARE) 649 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,VARIANCE_F32,SQUARE) 650 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,VARIANCE_F64,SQUARE) 651 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,VARIANCE_C32,SQUARE) 652 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,VARIANCE_C64,SQUARE) -
trunk/psLib/src/mathtypes/psImage.h
r3442 r3446 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1.4 8$ $Name: not supported by cvs2svn $14 * @date $Date: 2005-03-1 7 19:02:01$13 * @version $Revision: 1.49 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2005-03-18 02:35:14 $ 15 15 * 16 16 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 191 191 ); 192 192 193 #define p_psImagePixelInterpolateFcns(TYPE) \194 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE( \193 #define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \ 194 inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \ 195 195 const psImage* input, /**< input image for interpolation */ \ 196 196 float x, /**< column location to derive value of */ \ 197 197 float y, /**< row location ot derive value of */ \ 198 198 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 199 psU32 maskVal, /**< the mask value */ \ 200 psF64 unexposedValue /**< return value if x,y location is not in image. */ \ 201 ); \ 202 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 203 const psImage* input, /**< input image for interpolation */ \ 204 float x, /**< column location to derive value of */ \ 205 float y, /**< row location ot derive value of */ \ 206 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 207 psU32 maskVal, /**< the mask value */ \ 208 psF64 unexposedValue /**< return value if x,y location is not in image. */ \ 209 ); 210 211 #define p_psImagePixelInterpolateComplexFcns(TYPE) \ 212 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \ 213 const psImage* input, /**< input image for interpolation */ \ 214 float x, /**< column location to derive value of */ \ 215 float y, /**< row location ot derive value of */ \ 216 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 217 psU32 maskVal, /**< the mask value */ \ 218 psC64 unexposedValue /**< return value if x,y location is not in image. */ \ 219 ); \ 220 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 221 const psImage* input, /**< input image for interpolation */ \ 222 float x, /**< column location to derive value of */ \ 223 float y, /**< row location ot derive value of */ \ 224 const psImage* mask, /**< if not NULL, the mask of the input image */ \ 225 psU32 maskVal, /**< the mask value */ \ 226 psC64 unexposedValue /**< return value if x,y location is not in image. */ \ 227 ); 199 psU32 maskVal, /**< the mask value */ \ 200 RETURNTYPE unexposedValue /**< return value if x,y location is not in image. */ \ 201 ); 202 203 #define PIXEL_INTERPOLATE_FCNS(MODE) \ 204 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64) \ 205 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \ 206 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \ 207 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \ 208 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64) \ 209 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \ 210 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \ 211 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \ 212 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \ 213 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \ 214 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \ 215 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64) 216 228 217 #ifndef SWIG 229 p_psImagePixelInterpolateFcns(U8) 230 p_psImagePixelInterpolateFcns(U16) 231 p_psImagePixelInterpolateFcns(U32) 232 p_psImagePixelInterpolateFcns(U64) 233 p_psImagePixelInterpolateFcns(S8) 234 p_psImagePixelInterpolateFcns(S16) 235 p_psImagePixelInterpolateFcns(S32) 236 p_psImagePixelInterpolateFcns(S64) 237 p_psImagePixelInterpolateFcns(F32) 238 p_psImagePixelInterpolateFcns(F64) 239 p_psImagePixelInterpolateComplexFcns(C32) 240 p_psImagePixelInterpolateComplexFcns(C64) 218 PIXEL_INTERPOLATE_FCNS(FLAT) 219 PIXEL_INTERPOLATE_FCNS(BILINEAR) 220 PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE) 241 221 #endif 242 222 223 #undef PIXEL_INTERPOLATE_FCN_PROTOTYPE 224 #undef PIXEL_INTERPOLATE_FCNS 225 243 226 /// @} 244 227 -
trunk/psLib/test/image/tst_psImageInterpolate.c
r3264 r3446 5 5 * @author Eric Van Alst, MHPCC 6 6 * 7 * @version $Revision: 1. 4$7 * @version $Revision: 1.5 $ 8 8 * $Name: not supported by cvs2svn $ 9 * @date $Date: 2005-0 2-17 19:26:25 $9 * @date $Date: 2005-03-18 02:35:15 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 28 28 val = (psF32)psImagePixelInterpolate(img,x,y,mask,maskval,exposed,PS_INTERPOLATE_##TYPE); \ 29 29 printf("returned = %.2f expected = %.2f\n",val,expected); \ 30 if( val != expected) { \30 if(fabsf(val-expected)>FLT_EPSILON) { \ 31 31 psError(PS_ERR_UNKNOWN,true,"Return value is not as expected."); \ 32 32 return 1; \ -
trunk/psLib/test/image/tst_psImageManip.c
r3298 r3446 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 39$ $Name: not supported by cvs2svn $9 * @date $Date: 2005-0 2-22 19:25:53$8 * @version $Revision: 1.40 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2005-03-18 02:35:15 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 1771 1771 // verify that invalid interpolation mode is handled properly 1772 1772 psErrorClear(); 1773 result = psImageResample(result,image,2, 0);1773 result = psImageResample(result,image,2,-1); 1774 1774 1775 1775 if (result != NULL) { -
trunk/psLib/test/image/verified/tst_psImageManip.stderr
r3127 r3446 422 422 Specified scale value, 0, must be a positive value. 423 423 <DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO) 424 Specified interpolation mode, 0, is unsupported.424 Specified interpolation mode, -1, is unsupported. 425 425 <DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO) 426 426 Specified psImage type, psPtr, is not supported.
Note:
See TracChangeset
for help on using the changeset viewer.
