Changeset 3446 for trunk/psLib/src/image/psImage.c
- Timestamp:
- Mar 17, 2005, 4:35:15 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/image/psImage.c (modified) (13 diffs)
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)
Note:
See TracChangeset
for help on using the changeset viewer.
