home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 625.lha / STScan_v2.0 / localop.c < prev    next >
C/C++ Source or Header  |  1992-02-22  |  13KB  |  442 lines

  1. /*localop.c local operations for stscan.c*/
  2. #include <exec/exec.h>
  3. #include <exec/types.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/intuitionbase.h>
  6. #include <libraries/dos.h>
  7. #include <libraries/dosextens.h>
  8. #include <graphics/rastport.h>
  9. #include <libraries/reqbase.h>
  10. #include <req_pragmas.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <functions.h>
  14. #include "stscan.h"
  15.  
  16. void lowpass()
  17. { UBYTE *picptr,*cpyptr;
  18.   ULONG x,y,cnt;
  19.   ULONG lin1ofs,lin2ofs;
  20.   UBYTE b,v,i;
  21.   char wtitel[20];
  22.  
  23.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  24.   picptr=memptr+memneed;
  25.   cpyptr=picptr+(ULONG)(memwidth*2);
  26.   for (cnt=0;cnt<memneed;cnt++)
  27.     *(--cpyptr)=*(--picptr);
  28.   picptr=memptr;
  29.   cpyptr=picptr+(ULONG)(memwidth*2);
  30.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  31.   lin1ofs=memwidth>>1;
  32.   lin2ofs=memwidth;
  33.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  34.   for (y=1;y<memheight-1;y++)
  35.   { b=15;
  36.     for (x=1;x<memwidth-1;x++)
  37.     { if (x&1)
  38.       { v=((*(cpyptr        )&0x0f)+(*(cpyptr+        1)>>4)+(*(cpyptr+        1)&0x0f)
  39.           +(*(cpyptr+lin1ofs)&0x0f)+(*(cpyptr+lin1ofs+1)>>4)+(*(cpyptr+lin1ofs+1)&0x0f)
  40.           +(*(cpyptr+lin2ofs)&0x0f)+(*(cpyptr+lin2ofs+1)>>4)+(*(cpyptr+lin2ofs+1)&0x0f))/9;
  41.         *(picptr++)=(b<<4)|v;
  42.         cpyptr++;
  43.       }
  44.       else
  45.       { b=((*(cpyptr        )>>4)+(*(cpyptr        )&0x0f)+(*(cpyptr+        1)>>4)
  46.           +(*(cpyptr+lin1ofs)>>4)+(*(cpyptr+lin1ofs)&0x0f)+(*(cpyptr+lin1ofs+1)>>4)
  47.           +(*(cpyptr+lin2ofs)>>4)+(*(cpyptr+lin2ofs)&0x0f)+(*(cpyptr+lin2ofs+1)>>4))/9;
  48.       }
  49.     }
  50.     *(picptr++)=(b<<4)|15;
  51.     cpyptr+=1;
  52.     if (!(y%100)) 
  53.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  54.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  55.     }
  56.   }
  57.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  58.   SetWindowTitles(win," ",(UBYTE *)-1);
  59. }
  60.  
  61. void highpass()
  62. { UBYTE *picptr,*cpyptr;
  63.   ULONG x,y,cnt;
  64.   ULONG lin1ofs,lin2ofs;
  65.   BYTE b,v,i;
  66.   char wtitel[20];
  67.  
  68.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  69.   picptr=memptr+memneed;
  70.   cpyptr=picptr+(ULONG)(memwidth*2);
  71.   for (cnt=0;cnt<memneed;cnt++)
  72.     *(--cpyptr)=*(--picptr);
  73.   picptr=memptr;
  74.   cpyptr=picptr+(ULONG)(memwidth*2);
  75.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  76.   lin1ofs=memwidth>>1;
  77.   lin2ofs=memwidth;
  78.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  79.   for (y=1;y<memheight-1;y++)
  80.   { b=15;
  81.     for (x=1;x<memwidth-1;x++)
  82.     { if (x&1)
  83.       { v=(-(*(cpyptr        )&0x0f)  -(*(cpyptr+        1)>>4)-(*(cpyptr+        1)&0x0f)
  84.            -(*(cpyptr+lin1ofs)&0x0f)+8*(*(cpyptr+lin1ofs+1)>>4)-(*(cpyptr+lin1ofs+1)&0x0f)
  85.            -(*(cpyptr+lin2ofs)&0x0f)  -(*(cpyptr+lin2ofs+1)>>4)-(*(cpyptr+lin2ofs+1)&0x0f));
  86.         if (v<0) v=0;
  87.         if (v>15) v=15;
  88.         *(picptr++)=(b<<4)|v;
  89.         cpyptr++;
  90.       }
  91.       else
  92.       { b=(-(*(cpyptr        )>>4)  -(*(cpyptr        )&0x0f)-(*(cpyptr+        1)>>4)
  93.            -(*(cpyptr+lin1ofs)>>4)+8*(*(cpyptr+lin1ofs)&0x0f)-(*(cpyptr+lin1ofs+1)>>4)
  94.            -(*(cpyptr+lin2ofs)>>4)  -(*(cpyptr+lin2ofs)&0x0f)-(*(cpyptr+lin2ofs+1)>>4));
  95.         if (b<0) b=0;
  96.         if (b>15) b=15;
  97.       }
  98.     }
  99.     *(picptr++)=(b<<4)|15;
  100.     cpyptr+=1;
  101.     if (!(y%100)) 
  102.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  103.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  104.     }
  105.   }
  106.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  107.   SetWindowTitles(win," ",(UBYTE *)-1);
  108. }
  109.  
  110. void blowpass()
  111. { UBYTE *picptr,*cpyptr;
  112.   ULONG x,y,cnt;
  113.   ULONG lin1ofs,lin2ofs,lin3ofs,lin4ofs;
  114.   UWORD b,v,i;
  115.   char wtitel[20];
  116.  
  117.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  118.   picptr=memptr+memneed;
  119.   cpyptr=picptr+(ULONG)(memwidth*2);
  120.   for (cnt=0;cnt<memneed;cnt++)
  121.     *(--cpyptr)=*(--picptr);
  122.   picptr=memptr;
  123.   cpyptr=picptr+(ULONG)(memwidth*2);
  124.   for (cnt=0;cnt<memwidth;cnt++) *(picptr++)=255;
  125.   lin1ofs=memwidth>>1;
  126.   lin2ofs=2*lin1ofs;
  127.   lin3ofs=lin1ofs+lin2ofs;
  128.   lin4ofs=2*lin2ofs;
  129.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  130.   for (y=2;y<memheight-2;y++)
  131.   { *(picptr++)=255;
  132.     for (x=2;x<memwidth-2;x++)
  133.     { if (x&1)
  134.       { v=  (*(cpyptr          )&0x0f)
  135.            +(*(cpyptr+        1)>>4)
  136.            +(*(cpyptr+        1)&0x0f)
  137.            +(*(cpyptr+        2)>>4)
  138.            +(*(cpyptr+        2)&0x0f)
  139.          +  (*(cpyptr+lin1ofs  )&0x0f)
  140.            +(*(cpyptr+lin1ofs+1)>>4)
  141.            +(*(cpyptr+lin1ofs+1)&0x0f)
  142.            +(*(cpyptr+lin1ofs+2)>>4)
  143.            +(*(cpyptr+lin1ofs+2)&0x0f)
  144.          +  (*(cpyptr+lin2ofs  )&0x0f)
  145.            +(*(cpyptr+lin2ofs+1)>>4)
  146.            +(*(cpyptr+lin2ofs+1)&0x0f)
  147.            +(*(cpyptr+lin2ofs+2)>>4)
  148.            +(*(cpyptr+lin2ofs+2)&0x0f)
  149.          +  (*(cpyptr+lin3ofs  )&0x0f)
  150.            +(*(cpyptr+lin3ofs+1)>>4)
  151.            +(*(cpyptr+lin3ofs+1)&0x0f)
  152.            +(*(cpyptr+lin3ofs+2)>>4)
  153.            +(*(cpyptr+lin3ofs+2)&0x0f)
  154.          +  (*(cpyptr+lin4ofs  )&0x0f)
  155.            +(*(cpyptr+lin4ofs+1)>>4)
  156.            +(*(cpyptr+lin4ofs+1)&0x0f)
  157.            +(*(cpyptr+lin4ofs+2)>>4)
  158.            +(*(cpyptr+lin4ofs+2)&0x0f);
  159.         *(picptr++)=(((b/25)&0x0f)<<4)|((v/25)&0x0f);
  160.         cpyptr++;
  161.       }
  162.       else
  163.       { b=  (*(cpyptr          )>>4)
  164.            +(*(cpyptr          )&0x0f)
  165.            +(*(cpyptr+        1)>>4)
  166.            +(*(cpyptr+        1)&0x0f)
  167.            +(*(cpyptr+        2)>>4)
  168.          +  (*(cpyptr+lin1ofs  )>>4)
  169.            +(*(cpyptr+lin1ofs  )&0x0f)
  170.            +(*(cpyptr+lin1ofs+1)>>4)
  171.            +(*(cpyptr+lin1ofs+1)&0x0f)
  172.            +(*(cpyptr+lin1ofs+2)>>4)
  173.          +  (*(cpyptr+lin2ofs  )>>4)
  174.            +(*(cpyptr+lin2ofs  )&0x0f)
  175.            +(*(cpyptr+lin2ofs+1)>>4)
  176.            +(*(cpyptr+lin2ofs+1)&0x0f)
  177.            +(*(cpyptr+lin2ofs+2)>>4)
  178.          +  (*(cpyptr+lin3ofs  )>>4)
  179.            +(*(cpyptr+lin3ofs  )&0x0f)
  180.            +(*(cpyptr+lin3ofs+1)>>4)
  181.            +(*(cpyptr+lin3ofs+1)&0x0f)
  182.            +(*(cpyptr+lin3ofs+2)>>4)
  183.          +  (*(cpyptr+lin4ofs  )>>4)
  184.            +(*(cpyptr+lin4ofs  )&0x0f)
  185.            +(*(cpyptr+lin4ofs+1)>>4)
  186.            +(*(cpyptr+lin4ofs+1)&0x0f)
  187.            +(*(cpyptr+lin4ofs+2)>>4);
  188.       }
  189.     }
  190.     *(picptr++)=255;
  191.     cpyptr+=2;
  192.     if (!(y%100)) 
  193.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  194.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  195.     }
  196.   }
  197.   for (cnt=0;cnt<memwidth;cnt++) *(picptr++)=255;
  198.   SetWindowTitles(win," ",(UBYTE *)-1);
  199. }
  200.  
  201. void relief()
  202. { UBYTE *picptr,*cpyptr;
  203.   ULONG x,y,cnt;
  204.   ULONG lin1ofs,lin2ofs;
  205.   BYTE b,v,i;
  206.   char wtitel[20];
  207.  
  208.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  209.   picptr=memptr+memneed;
  210.   cpyptr=picptr+(ULONG)(memwidth*2);
  211.   for (cnt=0;cnt<memneed;cnt++)
  212.     *(--cpyptr)=*(--picptr);
  213.   picptr=memptr;
  214.   cpyptr=picptr+(ULONG)(memwidth*2);
  215.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  216.   lin1ofs=memwidth>>1;
  217.   lin2ofs=memwidth;
  218.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  219.   for (y=1;y<memheight-1;y++)
  220.   { b=15;
  221.     for (x=1;x<memwidth-1;x++)
  222.     { if (x&1)
  223.       { v=(   (*(cpyptr        )&0x0f)   +(*(cpyptr+        1)>>4)
  224.              +(*(cpyptr+lin1ofs)&0x0f)                              -(*(cpyptr+lin1ofs+1)&0x0f)
  225.                                          -(*(cpyptr+lin2ofs+1)>>4)  -(*(cpyptr+lin2ofs+1)&0x0f))+8;
  226.         if (v<0) v=0;
  227.         if (v>15) v=15;
  228.         *(picptr++)=(b<<4)|v;
  229.         cpyptr++;
  230.       }
  231.       else
  232.       { b=(   (*(cpyptr        )>>4)   +(*(cpyptr        )&0x0f)  
  233.              +(*(cpyptr+lin1ofs)>>4)                              -(*(cpyptr+lin1ofs+1)>>4)
  234.                                        -(*(cpyptr+lin2ofs)&0x0f)  -(*(cpyptr+lin2ofs+1)>>4))+8;
  235.         if (b<0) b=0;
  236.         if (b>15) b=15;
  237.       }
  238.     }
  239.     *(picptr++)=(b<<4)|15;
  240.     cpyptr+=1;
  241.     if (!(y%100)) 
  242.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  243.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  244.     }
  245.   }
  246.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  247.   SetWindowTitles(win," ",(UBYTE *)-1);
  248. }
  249.  
  250. void minop()
  251. { UBYTE *picptr,*cpyptr;
  252.   ULONG x,y,cnt;
  253.   ULONG lin1ofs,lin2ofs;
  254.   UBYTE b,v,i,p[9];
  255.   char wtitel[20];
  256.  
  257.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  258.   picptr=memptr+memneed;
  259.   cpyptr=picptr+(ULONG)(memwidth*2);
  260.   for (cnt=0;cnt<memneed;cnt++)
  261.     *(--cpyptr)=*(--picptr);
  262.   picptr=memptr;
  263.   cpyptr=picptr+(ULONG)(memwidth*2);
  264.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  265.   lin1ofs=memwidth>>1;
  266.   lin2ofs=memwidth;
  267.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  268.   for (y=1;y<memheight-1;y++)
  269.   { b=15;
  270.     for (x=1;x<memwidth-1;x++)
  271.     { if (x&1)
  272.       { p[0]=(*(cpyptr          )&0x0f);
  273.         p[1]=(*(cpyptr+        1)>>4);
  274.         p[2]=(*(cpyptr+        1)&0x0f);
  275.         p[3]=(*(cpyptr+lin1ofs  )&0x0f);
  276.         p[4]=(*(cpyptr+lin1ofs+1)>>4);
  277.         p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
  278.         p[6]=(*(cpyptr+lin2ofs  )&0x0f);
  279.         p[7]=(*(cpyptr+lin2ofs+1)>>4);
  280.         p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
  281.         v=15;
  282.         for (i=0;i<9;i++) if (p[i]<v) v=p[i];
  283.         *(picptr++)=(b<<4)|v;
  284.         cpyptr++;
  285.       }
  286.       else
  287.       { p[0]=(*(cpyptr          )>>4);
  288.         p[1]=(*(cpyptr          )&0x0f);
  289.         p[2]=(*(cpyptr+        1)>>4);
  290.         p[3]=(*(cpyptr+lin1ofs  )>>4);
  291.         p[4]=(*(cpyptr+lin1ofs  )&0x0f);
  292.         p[5]=(*(cpyptr+lin1ofs+1)>>4);
  293.         p[6]=(*(cpyptr+lin2ofs  )>>4);
  294.         p[7]=(*(cpyptr+lin2ofs+1)&0x0f);
  295.         p[8]=(*(cpyptr+lin2ofs+1)>>4);
  296.         b=15;
  297.         for (i=0;i<9;i++) if (p[i]<b) b=p[i];
  298.       }
  299.     }
  300.     *(picptr++)=(b<<4)|15;
  301.     cpyptr+=1;
  302.     if (!(y%100)) 
  303.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  304.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  305.     }
  306.   }
  307.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  308.   SetWindowTitles(win," ",(UBYTE *)-1);
  309. }
  310.  
  311. void maxop()
  312. { UBYTE *picptr,*cpyptr;
  313.   ULONG x,y,cnt;
  314.   ULONG lin1ofs,lin2ofs;
  315.   UBYTE b,v,i,p[9];
  316.   char wtitel[20];
  317.  
  318.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  319.   picptr=memptr+memneed;
  320.   cpyptr=picptr+(ULONG)(memwidth*2);
  321.   for (cnt=0;cnt<memneed;cnt++)
  322.     *(--cpyptr)=*(--picptr);
  323.   picptr=memptr;
  324.   cpyptr=picptr+(ULONG)(memwidth*2);
  325.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  326.   lin1ofs=memwidth>>1;
  327.   lin2ofs=memwidth;
  328.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  329.   for (y=1;y<memheight-1;y++)
  330.   { b=15;
  331.     for (x=1;x<memwidth-1;x++)
  332.     { if (x&1)
  333.       { p[0]=(*(cpyptr          )&0x0f);
  334.         p[1]=(*(cpyptr+        1)>>4);
  335.         p[2]=(*(cpyptr+        1)&0x0f);
  336.         p[3]=(*(cpyptr+lin1ofs  )&0x0f);
  337.         p[4]=(*(cpyptr+lin1ofs+1)>>4);
  338.         p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
  339.         p[6]=(*(cpyptr+lin2ofs  )&0x0f);
  340.         p[7]=(*(cpyptr+lin2ofs+1)>>4);
  341.         p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
  342.         v=0;
  343.         for (i=0;i<9;i++) if (p[i]>v) v=p[i];
  344.         *(picptr++)=(b<<4)|v;
  345.         cpyptr++;
  346.       }
  347.       else
  348.       { p[0]=(*(cpyptr          )>>4);
  349.         p[1]=(*(cpyptr          )&0x0f);
  350.         p[2]=(*(cpyptr+        1)>>4);
  351.         p[3]=(*(cpyptr+lin1ofs  )>>4);
  352.         p[4]=(*(cpyptr+lin1ofs  )&0x0f);
  353.         p[5]=(*(cpyptr+lin1ofs+1)>>4);
  354.         p[6]=(*(cpyptr+lin2ofs  )>>4);
  355.         p[7]=(*(cpyptr+lin2ofs+1)&0x0f);
  356.         p[8]=(*(cpyptr+lin2ofs+1)>>4);
  357.         b=0;
  358.         for (i=0;i<9;i++) if (p[i]>b) b=p[i];
  359.       }
  360.     }
  361.     *(picptr++)=(b<<4)|15;
  362.     cpyptr+=1;
  363.     if (!(y%100)) 
  364.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  365.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  366.     }
  367.   }
  368.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  369.   SetWindowTitles(win," ",(UBYTE *)-1);
  370. }
  371.  
  372. static void sort(UBYTE *p,UBYTE n)
  373. { UBYTE f,i,j,t;
  374.  
  375.   do {
  376.     f=0;
  377.     for (i=0;i<(n-1);i++)
  378.       if (*(p+i) > *(p+i+1))
  379.       { t=*(p+i+1); *(p+i+1)=*(p+i); *(p+i)=t; f=1;}
  380.   } while (f);
  381. }
  382.  
  383. void median()
  384. { UBYTE *picptr,*cpyptr;
  385.   ULONG x,y,cnt;
  386.   ULONG lin1ofs,lin2ofs;
  387.   UBYTE b,v,i,p[9];
  388.   char wtitel[20];
  389.  
  390.   SetWindowTitles(win,"Moving",(UBYTE *)-1);
  391.   picptr=memptr+memneed;
  392.   cpyptr=picptr+(ULONG)(memwidth*2);
  393.   for (cnt=0;cnt<memneed;cnt++)
  394.     *(--cpyptr)=*(--picptr);
  395.   picptr=memptr;
  396.   cpyptr=picptr+(ULONG)(memwidth*2);
  397.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  398.   lin1ofs=memwidth>>1;
  399.   lin2ofs=memwidth;
  400.   SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  401.   for (y=1;y<memheight-1;y++)
  402.   { b=15;
  403.     for (x=1;x<memwidth-1;x++)
  404.     { if (x&1)
  405.       { p[0]=(*(cpyptr          )&0x0f);
  406.         p[1]=(*(cpyptr+        1)>>4);
  407.         p[2]=(*(cpyptr+        1)&0x0f);
  408.         p[3]=(*(cpyptr+lin1ofs  )&0x0f);
  409.         p[4]=(*(cpyptr+lin1ofs+1)>>4);
  410.         p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
  411.         p[6]=(*(cpyptr+lin2ofs  )&0x0f);
  412.         p[7]=(*(cpyptr+lin2ofs+1)>>4);
  413.         p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
  414.         sort(p,9);
  415.         *(picptr++)=(b<<4)|p[4];
  416.         cpyptr++;
  417.       }
  418.       else
  419.       { p[0]=(*(cpyptr          )>>4);
  420.         p[1]=(*(cpyptr          )&0x0f);
  421.         p[2]=(*(cpyptr+        1)>>4);
  422.         p[3]=(*(cpyptr+lin1ofs  )>>4);
  423.         p[4]=(*(cpyptr+lin1ofs  )&0x0f);
  424.         p[5]=(*(cpyptr+lin1ofs+1)>>4);
  425.         p[6]=(*(cpyptr+lin2ofs  )>>4);
  426.         p[7]=(*(cpyptr+lin2ofs  )&0x0f);
  427.         p[8]=(*(cpyptr+lin2ofs+1)>>4);
  428.         sort(p,9);
  429.         b=p[4];
  430.       }
  431.     }
  432.     *(picptr++)=(b<<4)|15;
  433.     cpyptr+=1;
  434.     if (!(y%30)) 
  435.     { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
  436.       SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
  437.     }
  438.   }
  439.   for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  440.   SetWindowTitles(win," ",(UBYTE *)-1);
  441. }
  442.