IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 22, 2004, 10:02:57 AM (22 years ago)
Author:
desonia
Message:

Added psImageResample and complex support for pixel interpolation routines.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageStats.c

    r1251 r1260  
    400400    default: \
    401401        psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
    402         return unexposedValue; \
    403402    } \
    404403    break
    405404
    406405    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);
    407414        PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
     415        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
     416        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
     417        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
    408418    default:
    409419        psError(__func__,"Unsupported image datatype (%d)",input->type.type);
     
    434444}
    435445
     446#define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
     447inline 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
    436467PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
    437468PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
     
    444475PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
    445476PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
     477PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
     478PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
    446479
    447480#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
     
    501534}
    502535
     536#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
     537inline 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
    503592PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
    504593PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
     
    511600PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
    512601PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
    513 
     602PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
     603PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
     604
Note: See TracChangeset for help on using the changeset viewer.