Changeset 12741 for trunk/psLib/src/imageops/psImageGeomManip.c
- Timestamp:
- Apr 4, 2007, 12:42:02 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageGeomManip.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageGeomManip.c
r12431 r12741 10 10 * @author Ross Harman, MHPCC 11 11 * 12 * @version $Revision: 1.3 8$ $Name: not supported by cvs2svn $13 * @date $Date: 2007-0 3-14 00:39:50$12 * @version $Revision: 1.39 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2007-04-04 22:42:02 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 33 33 #include "psMemory.h" 34 34 #include "psAssert.h" 35 35 #include "psImageInterpolate.h" 36 36 #include "psCoord.h" 37 37 … … 200 200 } 201 201 202 if (mode > PS_INTERPOLATE_LANCZOS4_VARIANCE ) {203 psError(PS_ERR_BAD_PARAMETER_VALUE, true,204 _("Specified interpolation mode, %d, is unsupported."),205 mode);206 psFree(out);207 return NULL;208 }209 210 202 // create an output image of the same size 211 203 // and type … … 213 205 outCols = in->numCols * scale; 214 206 invScale = 1.0f / (float)scale; 207 208 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, in, NULL, NULL, 0, 209 NAN, NAN, 0, 0, 0); 215 210 216 211 #define PSIMAGE_RESAMPLE_CASE(TYPE) \ … … 221 216 float inRow = (float)row * invScale; \ 222 217 for (psS32 col=0;col<outCols;col++) { \ 223 rowData[col] = psImagePixelInterpolate(in,(float)col*invScale,inRow,NULL,0,0,mode); \ 218 double value; \ 219 if (!psImageInterpolate(&value, NULL, NULL, (float)col*invScale, inRow, interp)) { \ 220 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 221 psFree(interp); \ 222 psFree(out); \ 223 return NULL; \ 224 } \ 225 rowData[col] = value; \ 224 226 } \ 225 227 } \ … … 249 251 } 250 252 253 psFree(interp); 254 251 255 return out; 252 256 } … … 492 496 float CenterYMinusminXTimesSinT = centerY - minX * sinT; 493 497 494 #define PSIMAGE_ROTATE_ARBITRARY_LOOP(TYPE,MODE) { \ 498 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, NULL, 0, 499 exposed, NAN, 0, 0, 0.0); 500 501 #define PSIMAGE_ROTATE_ARBITRARY_LOOP(TYPE) \ 502 case PS_TYPE_##TYPE: { \ 495 503 if (exposed < PS_MIN_##TYPE || \ 496 504 exposed > PS_MAX_##TYPE || \ … … 515 523 outRow = out->data.TYPE[y]; \ 516 524 for (psS32 x = 0; x < outCols; x++) { \ 517 outRow[x] = p_psImagePixelInterpolate##MODE##_##TYPE(input,inX,inY,NULL,0,exposed); \ 525 double value; \ 526 if (!psImageInterpolate(&value, NULL, NULL, inX, inY, interp)) { \ 527 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 528 psFree(out); \ 529 psFree(interp); \ 530 return NULL; \ 531 } \ 532 outRow[x] = value; \ 518 533 inX += cosT; \ 519 534 inY -= sinT; \ 520 535 } \ 521 536 } \ 522 }523 524 #define PSIMAGE_ROTATE_ARBITRARY_CASE(MODE) \525 case PS_INTERPOLATE_##MODE: \526 switch (type) { \527 case PS_TYPE_U8: \528 PSIMAGE_ROTATE_ARBITRARY_LOOP(U8,MODE); \529 537 break; \ 530 case PS_TYPE_U16: \ 531 PSIMAGE_ROTATE_ARBITRARY_LOOP(U16,MODE); \ 532 break; \ 533 case PS_TYPE_U32: /* Not a requirement */ \ 534 PSIMAGE_ROTATE_ARBITRARY_LOOP(U32,MODE); \ 535 break; \ 536 case PS_TYPE_U64: /* Not a requirement */ \ 537 PSIMAGE_ROTATE_ARBITRARY_LOOP(U64,MODE); \ 538 break; \ 539 case PS_TYPE_S8: \ 540 PSIMAGE_ROTATE_ARBITRARY_LOOP(S8,MODE); \ 541 break; \ 542 case PS_TYPE_S16: \ 543 PSIMAGE_ROTATE_ARBITRARY_LOOP(S16,MODE); \ 544 break; \ 545 case PS_TYPE_S32: /* Not a requirement */ \ 546 PSIMAGE_ROTATE_ARBITRARY_LOOP(S32,MODE); \ 547 break; \ 548 case PS_TYPE_S64: /* Not a requirement */ \ 549 PSIMAGE_ROTATE_ARBITRARY_LOOP(S64,MODE); \ 550 break; \ 551 case PS_TYPE_F32: \ 552 PSIMAGE_ROTATE_ARBITRARY_LOOP(F32,MODE); \ 553 break; \ 554 case PS_TYPE_F64: \ 555 PSIMAGE_ROTATE_ARBITRARY_LOOP(F64,MODE); \ 556 break; \ 557 default: { \ 558 char* typeStr; \ 559 PS_TYPE_NAME(typeStr,type); \ 560 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 561 _("Specified psImage type, %s, is not supported."), \ 562 typeStr); \ 563 psFree(out); \ 564 out = NULL; \ 565 } \ 566 } \ 567 break; 568 569 switch (mode) { 570 PSIMAGE_ROTATE_ARBITRARY_CASE(FLAT); 571 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR); 572 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR_VARIANCE); 573 default: 574 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 575 _("Specified interpolation mode, %d, is unsupported."), 576 mode); 577 psFree(out); 578 out = NULL; 579 } 538 } 539 540 switch (type) { 541 PSIMAGE_ROTATE_ARBITRARY_LOOP(U8); 542 PSIMAGE_ROTATE_ARBITRARY_LOOP(U16); 543 PSIMAGE_ROTATE_ARBITRARY_LOOP(U32); 544 PSIMAGE_ROTATE_ARBITRARY_LOOP(U64); 545 PSIMAGE_ROTATE_ARBITRARY_LOOP(S8); 546 PSIMAGE_ROTATE_ARBITRARY_LOOP(S16); 547 PSIMAGE_ROTATE_ARBITRARY_LOOP(S32); 548 PSIMAGE_ROTATE_ARBITRARY_LOOP(S64); 549 PSIMAGE_ROTATE_ARBITRARY_LOOP(F32); 550 PSIMAGE_ROTATE_ARBITRARY_LOOP(F64); 551 default: { 552 char* typeStr; 553 PS_TYPE_NAME(typeStr,type); 554 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 555 _("Specified psImage type, %s, is not supported."), 556 typeStr); 557 psFree(out); 558 psFree(interp); 559 out = NULL; 560 } 561 } 562 563 psFree(interp); 564 580 565 } 581 566 … … 695 680 out = psImageRecycle(out, outCols, outRows, type); 696 681 697 #define PSIMAGE_SHIFT_CASE(MODE,TYPE) \ 682 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, NULL, 0, 683 exposed, NAN, 0, 0, 0.0); 684 685 #define PSIMAGE_SHIFT_CASE(TYPE) \ 698 686 case PS_TYPE_##TYPE: \ 699 687 if (exposed < PS_MIN_##TYPE || \ … … 719 707 for (psS32 col=0;col<outCols;col++) { \ 720 708 float x = col + 0.5 - dx; \ 721 outRow[col] = p_psImagePixelInterpolate##MODE##_##TYPE( \ 722 input,x,y,NULL,0,exposed); \ 709 double value; \ 710 if (!psImageInterpolate(&value, NULL, NULL, x, y, interp)) { \ 711 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 712 psFree(interp); \ 713 psFree(out); \ 714 return NULL; \ 715 } \ 716 outRow[col] = value; \ 723 717 } \ 724 718 } \ 725 719 break; 726 720 727 #define PSIMAGE_SHIFT_ARBITRARY_CASE(MODE) \ 728 case PS_INTERPOLATE_##MODE: \ 729 switch (input->type.type) { \ 730 PSIMAGE_SHIFT_CASE(MODE,U8); \ 731 PSIMAGE_SHIFT_CASE(MODE,U16); \ 732 PSIMAGE_SHIFT_CASE(MODE,U32); /* Not a requirement */ \ 733 PSIMAGE_SHIFT_CASE(MODE,U64); /* Not a requirement */ \ 734 PSIMAGE_SHIFT_CASE(MODE,S8); \ 735 PSIMAGE_SHIFT_CASE(MODE,S16); \ 736 PSIMAGE_SHIFT_CASE(MODE,S32); /* Not a requirement */ \ 737 PSIMAGE_SHIFT_CASE(MODE,S64); /* Not a requirement */ \ 738 PSIMAGE_SHIFT_CASE(MODE,F32); \ 739 PSIMAGE_SHIFT_CASE(MODE,F64); \ 740 \ 741 default: { \ 742 char* typeStr; \ 743 PS_TYPE_NAME(typeStr,type); \ 744 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 745 _("Specified psImage type, %s, is not supported."), \ 746 typeStr); \ 747 psFree(out); \ 748 out = NULL; \ 749 } \ 750 } \ 751 break; 752 753 // EAM: added BICUBE 754 switch (mode) { 755 PSIMAGE_SHIFT_ARBITRARY_CASE(FLAT); 756 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR); 757 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR_VARIANCE); 758 PSIMAGE_SHIFT_ARBITRARY_CASE(BICUBE); 759 default: 760 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 761 _("Specified interpolation mode, %d, is unsupported."), 762 mode); 763 psFree(out); 764 out = NULL; 765 } 766 721 switch (input->type.type) { 722 PSIMAGE_SHIFT_CASE(U8); 723 PSIMAGE_SHIFT_CASE(U16); 724 PSIMAGE_SHIFT_CASE(U32); 725 PSIMAGE_SHIFT_CASE(U64); 726 PSIMAGE_SHIFT_CASE(S8); 727 PSIMAGE_SHIFT_CASE(S16); 728 PSIMAGE_SHIFT_CASE(S32); 729 PSIMAGE_SHIFT_CASE(S64); 730 PSIMAGE_SHIFT_CASE(F32); 731 PSIMAGE_SHIFT_CASE(F64); 732 default: { 733 char* typeStr; 734 PS_TYPE_NAME(typeStr,type); 735 psError(PS_ERR_BAD_PARAMETER_TYPE, true, _("Specified psImage type, %s, is not supported."), 736 typeStr); 737 psFree(out); 738 psFree(interp); 739 return NULL; 740 } 741 } 742 743 psFree(interp); 767 744 return out; 768 745 } … … 866 843 867 844 // loop through the output image using the domain above and transform 868 // each output pixel to input coordinates and use psImage PixelInterpolate845 // each output pixel to input coordinates and use psImageInterpolate 869 846 // to determine the pixel value. 870 847 psPlane outPosition; 871 848 psPlane* inPosition = NULL; 872 849 873 #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \ 850 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, inputMask, 851 inputMaskVal, NAN, NAN, 0, 0, 0.0); 852 853 854 #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE) \ 874 855 /* apply the transform to get the position in the input image */ \ 875 856 inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition); \ … … 882 863 } \ 883 864 /* interpolate the cooresponding input pixel to get the output pixel value. */ \ 884 ps##TYPE value = p_psImagePixelInterpolate##MODE##_##TYPE(input, \ 885 inPosition->x, inPosition->y, \ 886 inputMask, inputMaskVal, NAN); \ 865 double value; \ 866 if (!psImageInterpolate(&value, NULL, NULL, inPosition->x, inPosition->y, interp)) { \ 867 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 868 psFree(output); \ 869 psFree(interp); \ 870 return NULL; \ 871 } \ 887 872 /* psFree(inPosition); */\ 888 873 if (isnan(value)) { \ … … 893 878 } \ 894 879 895 #define PSIMAGE_TRANSFORM_LOOP(TYPE, MODE) { \ 880 #define PSIMAGE_TRANSFORM_CASE(TYPE) \ 881 case PS_TYPE_##TYPE: { \ 896 882 for (int row = 0; row < numRows; row++) { \ 897 883 outPosition.y = row+row0; \ … … 899 885 for (int col = 0; col < numCols; col++) { \ 900 886 outPosition.x = col+col0; \ 901 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE ,MODE) \887 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE) \ 902 888 outputData[col] = value; \ 903 889 } \ 904 890 } \ 905 }906 907 #define PSIMAGE_TRANSFORM_FROMLIST(TYPE, MODE) { \908 int n = pixels->n; \909 for (int i= 0; i < n; i++) { \910 int x = pixels->data[i].x; \911 int y = pixels->data[i].y; \912 if (x >= col0 && x < col1 && y >= row0 && y < row1) { \913 outPosition.x = x; \914 outPosition.y = y; \915 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \916 output->data.TYPE[y][x] = value; \917 } \918 } \919 }920 921 #define PSIMAGE_TRANSFORM_CASE(MODE) \922 case PS_INTERPOLATE_##MODE: \923 switch (type) { \924 case PS_TYPE_F32: \925 PSIMAGE_TRANSFORM_LOOP(F32,MODE); \926 891 break; \ 927 case PS_TYPE_F64: \ 928 PSIMAGE_TRANSFORM_LOOP(F64,MODE); \ 929 break; \ 930 default: { \ 931 char* typeStr; \ 932 PS_TYPE_NAME(typeStr,type); \ 933 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 934 _("Specified psImage type, %s, is not supported."), \ 935 typeStr); \ 936 psFree(output); \ 937 return NULL; \ 938 } \ 939 } \ 940 break; 941 942 switch (mode) { 943 PSIMAGE_TRANSFORM_CASE(FLAT); 944 PSIMAGE_TRANSFORM_CASE(BILINEAR); 945 PSIMAGE_TRANSFORM_CASE(BILINEAR_VARIANCE); 946 default: 947 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 948 _("Specified interpolation mode, %d, is unsupported."), 949 mode); 950 psFree(output); 951 return NULL; 892 } 893 894 switch (type) { 895 PSIMAGE_TRANSFORM_CASE(F32); 896 PSIMAGE_TRANSFORM_CASE(F64); 897 default: { 898 char* typeStr; 899 PS_TYPE_NAME(typeStr,type); 900 psError(PS_ERR_BAD_PARAMETER_TYPE, true, _("Specified psImage type, %s, is not supported."), 901 typeStr); 902 psFree(output); 903 psFree(inPosition); 904 return NULL; 905 } 952 906 } 953 907
Note:
See TracChangeset
for help on using the changeset viewer.
