IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7077


Ignore:
Timestamp:
May 5, 2006, 1:55:56 PM (20 years ago)
Author:
Paul Price
Message:

SEGVs from overrunning the bounds with narrow images averted.

File:
1 edited

Legend:

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

    r7076 r7077  
    55 *  @author Robert DeSonia, MHPCC
    66 *
    7  *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2006-05-05 22:32:35 $
     7 *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2006-05-05 23:55:56 $
    99 *
    1010 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    588588
    589589    // relevant terms
    590     int Nrange = sigma*Nsigma + 0.5;
    591     int Npixel = 2*Nrange + 1;
    592     double factor = -0.5/(sigma*sigma);
    593 
    594     int Nx = image->numCols;
    595     int Ny = image->numRows;
     590    int Nrange = sigma*Nsigma + 0.5;    // Number of pixels either side
     591    int Npixel = 2*Nrange + 1;          // Total number of pixels in convolution kernel
     592    int Nx = image->numCols;            // Number of columns
     593    int Ny = image->numRows;            // Number of rows
    596594
    597595    #define IMAGESMOOTH_CASE(TYPE) \
     
    601599        gaussnorm->n = gaussnorm->nalloc; \
    602600        double sum = 0.0; \
     601        double factor = -0.5/(sigma*sigma); \
    603602        for (int i = -Nrange; i < Nrange + 1; i++) { \
    604603            gaussnorm->data.TYPE[i+Nrange] = exp (factor*i*i); \
     
    617616            ps##TYPE *vo = temp->data.TYPE; \
    618617            /* smooth first Nrange pixels, with renorm */ \
    619             /* XXX need to check that this does not run over end for narrow images */ \
    620             for (int i = 0; i < Nrange; i++, vi++, vo++) { \
     618            int xMax = PS_MIN(Nrange, Nx); \
     619            for (int i = 0; i < xMax; i++, vi++, vo++) { \
    621620                ps##TYPE *vr = vi - i; \
    622621                ps##TYPE *vg = gauss - i; \
     
    641640            /* smooth last Nrange pixels, with renorm */ \
    642641            /* XXX does this miss the last column? */ \
    643             for (int i = Nx - Nrange; i < Nx; i++, vi++, vo++) { \
     642            for (int i = PS_MAX(Nx - Nrange, 0); i < Nx; i++, vi++, vo++) { \
    644643                ps##TYPE *vr = vi - Nrange; \
    645644                ps##TYPE *vg = gauss - Nrange; \
     
    659658        psArray *temprows = psArrayAlloc (Nrange); \
    660659        temprows->n = Nrange; \
    661         for (int j = 0; j < Nrange; j++) { \
     660        int yMax = PS_MIN(Nrange, Ny); \
     661        for (int j = 0; j < yMax; j++) { \
    662662            temp = psVectorAlloc (Nx, PS_TYPE_##TYPE); \
    663663            temp->n = temp->nalloc; \
     
    691691            } \
    692692        } \
    693         for (int j = Ny - Nrange; j < Ny; j++) { \
     693        for (int j = PS_MAX(Ny - Nrange, 0); j < Ny; j++) { \
    694694            /* save the Nrange-offset output row, then zero */ \
    695695            int Nr = j % Nrange; \
Note: See TracChangeset for help on using the changeset viewer.