Advertisement
Caiwan

fastblur.cpp

Jun 19th, 2012
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. // Super Fast Blur v1.1
  2. // by Mario Klingemann <http://incubator.quasimondo.com>
  3. // converted to C++ by Mehmet Akten, <http://www.memo.tv>
  4. //
  5. // Tip: Multiple invovations of this filter with a small
  6. // radius will approximate a gaussian blur quite well.
  7. //
  8.  
  9. #include "ImageFilters.h"
  10.  
  11. void superFastBlur(unsigned char *pix, int w, int h, int radius) {
  12.     if (radius<1) return;
  13.     int wm=w-1;
  14.     int hm=h-1;
  15.     int wh=w*h;
  16.     int div=radius+radius+1;
  17.     unsigned char *r = new unsigned char[wh];
  18.     unsigned char *g = new unsigned char[wh];
  19.     unsigned char *b = new unsigned char[wh];
  20.     int rsum,gsum,bsum,x,y,i,p,p1,p2,yp,yi,yw;
  21.     int *vMIN = new int[MAX(w,h)];
  22.     int *vMAX = new int[MAX(w,h)];
  23.  
  24.     unsigned char *dv=new unsigned char[256*div];
  25.     for (i=0;i<256*div;i++) dv[i]=(i/div);
  26.  
  27.     yw=yi=0;
  28.  
  29.     for (y=0;y<h;y++){
  30.         rsum=gsum=bsum=0;
  31.         for(i=-radius;i<=radius;i++){
  32.             p = (yi + MIN(wm, MAX(i,0))) * 3;
  33.             rsum += pix[p];
  34.             gsum += pix[p+1];
  35.             bsum += pix[p+2];
  36.         }
  37.         for (x=0;x<w;x++){
  38.  
  39.             r[yi]=dv[rsum];
  40.             g[yi]=dv[gsum];
  41.             b[yi]=dv[bsum];
  42.  
  43.             if(y==0){
  44.                 vMIN[x]=MIN(x+radius+1,wm);
  45.                 vMAX[x]=MAX(x-radius,0);
  46.             }
  47.             p1 = (yw+vMIN[x])*3;
  48.             p2 = (yw+vMAX[x])*3;
  49.  
  50.             rsum += pix[p1] - pix[p2];
  51.             gsum += pix[p1+1] - pix[p2+1];
  52.             bsum += pix[p1+2] - pix[p2+2];
  53.  
  54.             yi++;
  55.         }
  56.         yw+=w;
  57.     }
  58.  
  59.     for (x=0;x<w;x++){
  60.         rsum=gsum=bsum=0;
  61.         yp=-radius*w;
  62.         for(i=-radius;i<=radius;i++){
  63.             yi=MAX(0,yp)+x;
  64.             rsum+=r[yi];
  65.             gsum+=g[yi];
  66.             bsum+=b[yi];
  67.             yp+=w;
  68.         }
  69.         yi=x;
  70.         for (y=0;y<h;y++){
  71.             pix[yi*3] = dv[rsum];
  72.             pix[yi*3 + 1] = dv[gsum];
  73.             pix[yi*3 + 2] = dv[bsum];
  74.             if(x==0){
  75.                 vMIN[y]=MIN(y+radius+1,hm)*w;
  76.                 vMAX[y]=MAX(y-radius,0)*w;
  77.             }
  78.             p1=x+vMIN[y];
  79.             p2=x+vMAX[y];
  80.  
  81.             rsum+=r[p1]-r[p2];
  82.             gsum+=g[p1]-g[p2];
  83.             bsum+=b[p1]-b[p2];
  84.  
  85.             yi+=w;
  86.         }
  87.     }
  88.  
  89.     delete r;
  90.     delete g;
  91.     delete b;
  92.  
  93.     delete vMIN;
  94.     delete vMAX;
  95.     delete dv;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement