IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 2, 2008, 5:00:25 PM (18 years ago)
Author:
Paul Price
Message:

Optimisation: using memcpy instead of copying each pixel.

File:
1 edited

Legend:

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

    r15958 r17302  
    77/// @author Eugene Magnier, IfA
    88///
    9 /// @version $Revision: 1.61 $ $Name: not supported by cvs2svn $
    10 /// @date $Date: 2007-12-31 03:02:08 $
     9/// @version $Revision: 1.62 $ $Name: not supported by cvs2svn $
     10/// @date $Date: 2008-04-03 03:00:25 $
    1111///
    1212/// Copyright 2004-2007 Institute for Astronomy, University of Hawaii
     
    420420    psImage *paddedImage = psImageAlloc(paddedCols,paddedRows,in->type.type); // Padded input image
    421421    if (mask && maskVal) {
     422        // Need to replace non-finite (assumed masked) pixels, since they propagate everywhere during FFT
    422423        for (int y = 0; y < numRows; y++) {
    423424            for (int x = 0; x < numCols; x++) {
     
    454455    for (int y = PS_MIN(-1, yMin); y <= PS_MIN(-1, yMax); y++) {
    455456        // y is negative
    456         for (int x = PS_MIN(-1, xMin); x <= PS_MIN(-1, xMax); x++) {
     457        if (xMin < 0) {
    457458            // x is negative
    458             paddedKernel->data.F32[paddedRows + y][paddedCols + x] = kernel->kernel[y][x];
    459         }
    460         for (int x = PS_MAX(0, xMin); x <= PS_MAX(0, xMax); x++) {
     459            memcpy(&paddedKernel->data.F32[paddedRows + y][paddedCols + xMin], &kernel->kernel[y][xMin],
     460                   (PS_MIN(0, xMax) - xMin) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
     461        }
     462        if (xMax >= 0) {
    461463            // x is positive
    462             paddedKernel->data.F32[paddedRows + y][x] = kernel->kernel[y][x];
     464            int min = PS_MAX(0, xMin);  // Minimum value of x when positive
     465            memcpy(&paddedKernel->data.F32[paddedRows + y][min], &kernel->kernel[y][min],
     466                   (xMax - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
    463467        }
    464468    }
    465469    for (int y = PS_MAX(0, yMin); y <= PS_MAX(0, yMax); y++) {
    466470        // y is positive
    467         for (int x = PS_MIN(-1, xMin); x <= PS_MIN(-1, xMax); x++) {
     471        if (xMin < 0) {
    468472            // x is negative
    469             paddedKernel->data.F32[y][paddedCols + x] = kernel->kernel[y][x];
    470         }
    471         for (int x = PS_MAX(0, xMin); x <= PS_MAX(0, xMax); x++) {
     473            memcpy(&paddedKernel->data.F32[y][paddedCols + xMin], &kernel->kernel[y][xMin],
     474                   (PS_MIN(0, xMax) - xMin) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
     475        }
     476        if (xMax >= 0) {
    472477            // x is positive
    473             paddedKernel->data.F32[y][x] = kernel->kernel[y][x];
     478            int min = PS_MAX(0, xMin);  // Minimum value of x when positive
     479            memcpy(&paddedKernel->data.F32[y][min], &kernel->kernel[y][min],
     480                   (xMax - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
    474481        }
    475482    }
     
    834841    // XXX test
    835842    if (0) {
    836         psFree(gaussnorm);
    837         return true;
     843        psFree(gaussnorm);
     844        return true;
    838845    }
    839846
Note: See TracChangeset for help on using the changeset viewer.