hipass.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:5k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: hipass.c,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  *      hipass -
  28.  *              Hi pass filter rows using a 3x3 kernel.
  29.  *
  30.  *                              Paul Haeberli - 1989
  31.  *
  32.  */
  33. #include "stdio.h"
  34. #include "hipass.h"
  35. highpass *newhp(getfunc,xsize,ysize,mag)
  36. int (*getfunc)();
  37. int xsize, ysize;
  38. float mag;
  39. {
  40.     highpass *hp; 
  41.     int i;
  42.     hp = (highpass *)malloc(sizeof(highpass));
  43.     hp->getfunc = getfunc;
  44.     hp->xsize = xsize;
  45.     hp->ysize = ysize;
  46.     hp->y = 0;
  47.     hp->extrapval = 1024*mag;
  48.     for(i=0; i<3; i++)
  49.         hp->blurrows[i] = (short *)malloc(xsize*sizeof(short));
  50.     for(i=0; i<2; i++)
  51.         hp->pastrows[i] = (short *)malloc(xsize*sizeof(short));
  52.     hp->acc = (short *)malloc(xsize*sizeof(short));
  53.     if(xsize<3 || ysize<3 || hp->extrapval == 0) 
  54.         hp->active = 0;
  55.     else {
  56.         hp->active = 1;
  57.     }
  58.     return hp;
  59. }
  60. freehp(hp)
  61. highpass *hp; 
  62. {
  63.     int i;
  64.     for(i=0; i<3; i++)
  65.         free(hp->blurrows[i]);
  66.     for(i=0; i<2; i++)
  67.         free(hp->pastrows[i]);
  68.     free(hp->acc);
  69.     free(hp);
  70. }
  71. /*
  72.  *      extrap -
  73.  *              Extrapolate from the blurred image beyond the original
  74.  *
  75.  */
  76. static extrap(pix,acc,div,n,extrapval)
  77. unsigned short *pix;
  78. short *acc;
  79. int div, n;
  80. int extrapval;
  81. {
  82.     int delta, val;
  83.     int mul, ext;
  84.     mul = div;
  85.     div = div*256;
  86.     ext = extrapval;
  87.     while(n--) {
  88.         delta = (*pix * mul)-*acc++;
  89.         val = *pix+(ext*delta)/div;
  90.         if(val<0)
  91.             val = 0;
  92.         if(val>255)
  93.             val = 255;
  94.         *pix++ = val;
  95.     }
  96. }
  97. /*
  98.  *      xblur -
  99.  *              Blur a row in the x direction
  100.  *
  101.  */
  102. static xblur(sptr,cptr,n)
  103. unsigned short *sptr, *cptr;
  104. int n;
  105. {
  106.     short acc;
  107.     if (n<3) {
  108.         fprintf(stderr,"xblur: n may not be less than 3n");
  109.         exit(1);
  110.     }
  111.     acc = cptr[0] + cptr[1];
  112.     *sptr++ = (3*acc+1)>>1;
  113.     acc += cptr[2];
  114.     n-=3;
  115.     while(n--) {
  116.         *sptr++ = acc;
  117.         acc -= cptr[0];
  118.         acc += cptr[3];
  119.         cptr++;
  120.     }
  121.     *sptr++ = acc;
  122.     acc -= cptr[0];
  123.     *sptr++ = (3*acc+1)>>1;
  124. }
  125. hpgetrow(hp,buf,y)
  126. highpass *hp;
  127. short *buf;
  128. int y;
  129. {
  130.     short *temp;
  131.     int iy;
  132.     if(y == 0)
  133.         hp->y = 0;
  134.     if(hp->y != y) {
  135.         fprintf(stderr,"hpgetrow: y errorn");
  136.         exit(1);
  137.     }
  138.     if(hp->active) {
  139.         if (y == 0) {
  140.             memset(hp->acc,0,hp->xsize*sizeof(short));
  141.             for(iy=0; iy<2; iy++) {
  142.                 temp = hp->pastrows[0];
  143.                 hp->pastrows[0] = hp->pastrows[1];
  144.                 hp->pastrows[1] = temp;
  145.                 hp->getfunc(hp->pastrows[1],iy);
  146.                 xblur(hp->blurrows[iy],hp->pastrows[1],hp->xsize);
  147.                 addsrow(hp->acc,hp->blurrows[iy],hp->xsize);
  148.             }
  149.             copyrow(hp->pastrows[0],buf,hp->xsize);
  150.             extrap(buf,hp->acc,6,hp->xsize,hp->extrapval);
  151.         } else if (y == hp->ysize-1) {
  152.             copyrow(hp->pastrows[1],buf,hp->xsize);
  153.             extrap(buf,hp->acc,6,hp->xsize,hp->extrapval);
  154.         } else {
  155.             temp = hp->pastrows[0];
  156.             hp->pastrows[0] = hp->pastrows[1];
  157.             hp->pastrows[1] = temp;
  158.             hp->getfunc(hp->pastrows[1],y+1);
  159.             xblur(hp->blurrows[2],hp->pastrows[1],hp->xsize);
  160.             addsrow(hp->acc,hp->blurrows[2],hp->xsize);
  161.             copyrow(hp->pastrows[0],buf,hp->xsize);
  162.             extrap(buf,hp->acc,9,hp->xsize,hp->extrapval);
  163.             subsrow(hp->acc,hp->blurrows[0],hp->xsize);
  164.             temp = hp->blurrows[0];
  165.             hp->blurrows[0] = hp->blurrows[1];
  166.             hp->blurrows[1] = hp->blurrows[2];
  167.             hp->blurrows[2] = temp;
  168.         }
  169.     } else {
  170.         hp->getfunc(buf,y);
  171.     }
  172.     hp->y++;
  173. }