Changeset 2606


Ignore:
Timestamp:
07/29/08 01:49:00 (5 years ago)
Author:
sam
Message:
  • blur.c: fix overflow errors.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/filter/blur.c

    r2605 r2606  
    3434    float *srcdata, *dstdata; 
    3535    double *kernel; 
    36     double K, L, t = 0.; 
     36    double K, L; 
    3737    int x, y, i, j, w, h, kr, kw; 
    3838 
     
    5555    for(j = -kr; j <= kr; j++) 
    5656        for(i = -kr; i <= kr; i++) 
    57             t += kernel[(j + kr) * kw + (i + kr)] 
    58                      = exp(L * (i * i + j * j)) * K; 
    59  
    60     for(j = -kr; j <= kr; j++) 
    61         for(i = -kr; i <= kr; i++) 
    62             kernel[(j + kr) * kw + (i + kr)] /= t; 
     57            kernel[(j + kr) * kw + (i + kr)] = exp(L * (i * i + j * j)) * K; 
    6358 
    6459    for(y = 0; y < h; y++) 
     
    6661        for(x = 0; x < w; x++) 
    6762        { 
    68             double R = 0., G = 0., B = 0.; 
     63            double R = 0., G = 0., B = 0., t = 0.; 
     64            int x2, y2; 
    6965 
    7066            for(j = -kr; j <= kr; j++) 
     67            { 
     68                y2 = y + j; 
     69                if(y2 < 0) y2 = 0; 
     70                else if(y2 >= h) y2 = h - 1; 
     71 
    7172                for(i = -kr; i <= kr; i++) 
    7273                { 
    7374                    double f = kernel[(j + kr) * kw + (i + kr)]; 
    7475 
    75                     R += f * srcdata[((y + j) * w + x + i) * 4]; 
    76                     G += f * srcdata[((y + j) * w + x + i) * 4 + 1]; 
    77                     B += f * srcdata[((y + j) * w + x + i) * 4 + 2]; 
     76                    x2 = x + i; 
     77                    if(x2 < 0) x2 = 0; 
     78                    else if(x2 >= w) x2 = w - 1; 
     79 
     80                    R += f * srcdata[(y2 * w + x2) * 4]; 
     81                    G += f * srcdata[(y2 * w + x2) * 4 + 1]; 
     82                    B += f * srcdata[(y2 * w + x2) * 4 + 2]; 
     83                    t += f; 
    7884                } 
     85            } 
    7986 
    80             dstdata[(y * w + x) * 4] = R; 
    81             dstdata[(y * w + x) * 4 + 1] = G; 
    82             dstdata[(y * w + x) * 4 + 2] = B; 
     87            dstdata[(y * w + x) * 4] = R / t; 
     88            dstdata[(y * w + x) * 4 + 1] = G / t; 
     89            dstdata[(y * w + x) * 4 + 2] = B / t; 
    8390        } 
    8491    } 
Note: See TracChangeset for help on using the changeset viewer.