/*localop.c local operations for stscan.c*/
#include <exec/exec.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <graphics/rastport.h>
#include <libraries/reqbase.h>
#include <req_pragmas.h>
#include <stdio.h>
#include <string.h>
#include <functions.h>
#include "stscan.h"

void lowpass()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  UBYTE b,v,i;
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { v=((*(cpyptr        )&0x0f)+(*(cpyptr+        1)>>4)+(*(cpyptr+        1)&0x0f)
          +(*(cpyptr+lin1ofs)&0x0f)+(*(cpyptr+lin1ofs+1)>>4)+(*(cpyptr+lin1ofs+1)&0x0f)
          +(*(cpyptr+lin2ofs)&0x0f)+(*(cpyptr+lin2ofs+1)>>4)+(*(cpyptr+lin2ofs+1)&0x0f))/9;
        *(picptr++)=(b<<4)|v;
        cpyptr++;
      }
      else
      { b=((*(cpyptr        )>>4)+(*(cpyptr        )&0x0f)+(*(cpyptr+        1)>>4)
          +(*(cpyptr+lin1ofs)>>4)+(*(cpyptr+lin1ofs)&0x0f)+(*(cpyptr+lin1ofs+1)>>4)
          +(*(cpyptr+lin2ofs)>>4)+(*(cpyptr+lin2ofs)&0x0f)+(*(cpyptr+lin2ofs+1)>>4))/9;
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

void highpass()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  BYTE b,v,i;
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { v=(-(*(cpyptr        )&0x0f)  -(*(cpyptr+        1)>>4)-(*(cpyptr+        1)&0x0f)
           -(*(cpyptr+lin1ofs)&0x0f)+8*(*(cpyptr+lin1ofs+1)>>4)-(*(cpyptr+lin1ofs+1)&0x0f)
           -(*(cpyptr+lin2ofs)&0x0f)  -(*(cpyptr+lin2ofs+1)>>4)-(*(cpyptr+lin2ofs+1)&0x0f));
        if (v<0) v=0;
        if (v>15) v=15;
        *(picptr++)=(b<<4)|v;
        cpyptr++;
      }
      else
      { b=(-(*(cpyptr        )>>4)  -(*(cpyptr        )&0x0f)-(*(cpyptr+        1)>>4)
           -(*(cpyptr+lin1ofs)>>4)+8*(*(cpyptr+lin1ofs)&0x0f)-(*(cpyptr+lin1ofs+1)>>4)
           -(*(cpyptr+lin2ofs)>>4)  -(*(cpyptr+lin2ofs)&0x0f)-(*(cpyptr+lin2ofs+1)>>4));
        if (b<0) b=0;
        if (b>15) b=15;
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

void blowpass()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs,lin3ofs,lin4ofs;
  UWORD b,v,i;
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memwidth;cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=2*lin1ofs;
  lin3ofs=lin1ofs+lin2ofs;
  lin4ofs=2*lin2ofs;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=2;y<memheight-2;y++)
  { *(picptr++)=255;
    for (x=2;x<memwidth-2;x++)
    { if (x&1)
      { v=  (*(cpyptr          )&0x0f)
           +(*(cpyptr+        1)>>4)
           +(*(cpyptr+        1)&0x0f)
           +(*(cpyptr+        2)>>4)
           +(*(cpyptr+        2)&0x0f)
         +  (*(cpyptr+lin1ofs  )&0x0f)
           +(*(cpyptr+lin1ofs+1)>>4)
           +(*(cpyptr+lin1ofs+1)&0x0f)
           +(*(cpyptr+lin1ofs+2)>>4)
           +(*(cpyptr+lin1ofs+2)&0x0f)
         +  (*(cpyptr+lin2ofs  )&0x0f)
           +(*(cpyptr+lin2ofs+1)>>4)
           +(*(cpyptr+lin2ofs+1)&0x0f)
           +(*(cpyptr+lin2ofs+2)>>4)
           +(*(cpyptr+lin2ofs+2)&0x0f)
         +  (*(cpyptr+lin3ofs  )&0x0f)
           +(*(cpyptr+lin3ofs+1)>>4)
           +(*(cpyptr+lin3ofs+1)&0x0f)
           +(*(cpyptr+lin3ofs+2)>>4)
           +(*(cpyptr+lin3ofs+2)&0x0f)
         +  (*(cpyptr+lin4ofs  )&0x0f)
           +(*(cpyptr+lin4ofs+1)>>4)
           +(*(cpyptr+lin4ofs+1)&0x0f)
           +(*(cpyptr+lin4ofs+2)>>4)
           +(*(cpyptr+lin4ofs+2)&0x0f);
        *(picptr++)=(((b/25)&0x0f)<<4)|((v/25)&0x0f);
        cpyptr++;
      }
      else
      { b=  (*(cpyptr          )>>4)
           +(*(cpyptr          )&0x0f)
           +(*(cpyptr+        1)>>4)
           +(*(cpyptr+        1)&0x0f)
           +(*(cpyptr+        2)>>4)
         +  (*(cpyptr+lin1ofs  )>>4)
           +(*(cpyptr+lin1ofs  )&0x0f)
           +(*(cpyptr+lin1ofs+1)>>4)
           +(*(cpyptr+lin1ofs+1)&0x0f)
           +(*(cpyptr+lin1ofs+2)>>4)
         +  (*(cpyptr+lin2ofs  )>>4)
           +(*(cpyptr+lin2ofs  )&0x0f)
           +(*(cpyptr+lin2ofs+1)>>4)
           +(*(cpyptr+lin2ofs+1)&0x0f)
           +(*(cpyptr+lin2ofs+2)>>4)
         +  (*(cpyptr+lin3ofs  )>>4)
           +(*(cpyptr+lin3ofs  )&0x0f)
           +(*(cpyptr+lin3ofs+1)>>4)
           +(*(cpyptr+lin3ofs+1)&0x0f)
           +(*(cpyptr+lin3ofs+2)>>4)
         +  (*(cpyptr+lin4ofs  )>>4)
           +(*(cpyptr+lin4ofs  )&0x0f)
           +(*(cpyptr+lin4ofs+1)>>4)
           +(*(cpyptr+lin4ofs+1)&0x0f)
           +(*(cpyptr+lin4ofs+2)>>4);
      }
    }
    *(picptr++)=255;
    cpyptr+=2;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<memwidth;cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

void relief()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  BYTE b,v,i;
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { v=(   (*(cpyptr        )&0x0f)   +(*(cpyptr+        1)>>4)
             +(*(cpyptr+lin1ofs)&0x0f)                              -(*(cpyptr+lin1ofs+1)&0x0f)
                                         -(*(cpyptr+lin2ofs+1)>>4)  -(*(cpyptr+lin2ofs+1)&0x0f))+8;
        if (v<0) v=0;
        if (v>15) v=15;
        *(picptr++)=(b<<4)|v;
        cpyptr++;
      }
      else
      { b=(   (*(cpyptr        )>>4)   +(*(cpyptr        )&0x0f)  
             +(*(cpyptr+lin1ofs)>>4)                              -(*(cpyptr+lin1ofs+1)>>4)
                                       -(*(cpyptr+lin2ofs)&0x0f)  -(*(cpyptr+lin2ofs+1)>>4))+8;
        if (b<0) b=0;
        if (b>15) b=15;
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

void minop()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  UBYTE b,v,i,p[9];
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { p[0]=(*(cpyptr          )&0x0f);
        p[1]=(*(cpyptr+        1)>>4);
        p[2]=(*(cpyptr+        1)&0x0f);
        p[3]=(*(cpyptr+lin1ofs  )&0x0f);
        p[4]=(*(cpyptr+lin1ofs+1)>>4);
        p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
        p[6]=(*(cpyptr+lin2ofs  )&0x0f);
        p[7]=(*(cpyptr+lin2ofs+1)>>4);
        p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
        v=15;
        for (i=0;i<9;i++) if (p[i]<v) v=p[i];
        *(picptr++)=(b<<4)|v;
        cpyptr++;
      }
      else
      { p[0]=(*(cpyptr          )>>4);
        p[1]=(*(cpyptr          )&0x0f);
        p[2]=(*(cpyptr+        1)>>4);
        p[3]=(*(cpyptr+lin1ofs  )>>4);
        p[4]=(*(cpyptr+lin1ofs  )&0x0f);
        p[5]=(*(cpyptr+lin1ofs+1)>>4);
        p[6]=(*(cpyptr+lin2ofs  )>>4);
        p[7]=(*(cpyptr+lin2ofs+1)&0x0f);
        p[8]=(*(cpyptr+lin2ofs+1)>>4);
        b=15;
        for (i=0;i<9;i++) if (p[i]<b) b=p[i];
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

void maxop()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  UBYTE b,v,i,p[9];
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { p[0]=(*(cpyptr          )&0x0f);
        p[1]=(*(cpyptr+        1)>>4);
        p[2]=(*(cpyptr+        1)&0x0f);
        p[3]=(*(cpyptr+lin1ofs  )&0x0f);
        p[4]=(*(cpyptr+lin1ofs+1)>>4);
        p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
        p[6]=(*(cpyptr+lin2ofs  )&0x0f);
        p[7]=(*(cpyptr+lin2ofs+1)>>4);
        p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
        v=0;
        for (i=0;i<9;i++) if (p[i]>v) v=p[i];
        *(picptr++)=(b<<4)|v;
        cpyptr++;
      }
      else
      { p[0]=(*(cpyptr          )>>4);
        p[1]=(*(cpyptr          )&0x0f);
        p[2]=(*(cpyptr+        1)>>4);
        p[3]=(*(cpyptr+lin1ofs  )>>4);
        p[4]=(*(cpyptr+lin1ofs  )&0x0f);
        p[5]=(*(cpyptr+lin1ofs+1)>>4);
        p[6]=(*(cpyptr+lin2ofs  )>>4);
        p[7]=(*(cpyptr+lin2ofs+1)&0x0f);
        p[8]=(*(cpyptr+lin2ofs+1)>>4);
        b=0;
        for (i=0;i<9;i++) if (p[i]>b) b=p[i];
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%100)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}

static void sort(UBYTE *p,UBYTE n)
{ UBYTE f,i,j,t;

  do {
    f=0;
    for (i=0;i<(n-1);i++)
      if (*(p+i) > *(p+i+1))
      { t=*(p+i+1); *(p+i+1)=*(p+i); *(p+i)=t; f=1;}
  } while (f);
}

void median()
{ UBYTE *picptr,*cpyptr;
  ULONG x,y,cnt;
  ULONG lin1ofs,lin2ofs;
  UBYTE b,v,i,p[9];
  char wtitel[20];

  SetWindowTitles(win,"Moving",(UBYTE *)-1);
  picptr=memptr+memneed;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<memneed;cnt++)
    *(--cpyptr)=*(--picptr);
  picptr=memptr;
  cpyptr=picptr+(ULONG)(memwidth*2);
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  lin1ofs=memwidth>>1;
  lin2ofs=memwidth;
  SetWindowTitles(win,"Processing 000%",(UBYTE *)-1);
  for (y=1;y<memheight-1;y++)
  { b=15;
    for (x=1;x<memwidth-1;x++)
    { if (x&1)
      { p[0]=(*(cpyptr          )&0x0f);
        p[1]=(*(cpyptr+        1)>>4);
        p[2]=(*(cpyptr+        1)&0x0f);
        p[3]=(*(cpyptr+lin1ofs  )&0x0f);
        p[4]=(*(cpyptr+lin1ofs+1)>>4);
        p[5]=(*(cpyptr+lin1ofs+1)&0x0f);
        p[6]=(*(cpyptr+lin2ofs  )&0x0f);
        p[7]=(*(cpyptr+lin2ofs+1)>>4);
        p[8]=(*(cpyptr+lin2ofs+1)&0x0f);
        sort(p,9);
        *(picptr++)=(b<<4)|p[4];
        cpyptr++;
      }
      else
      { p[0]=(*(cpyptr          )>>4);
        p[1]=(*(cpyptr          )&0x0f);
        p[2]=(*(cpyptr+        1)>>4);
        p[3]=(*(cpyptr+lin1ofs  )>>4);
        p[4]=(*(cpyptr+lin1ofs  )&0x0f);
        p[5]=(*(cpyptr+lin1ofs+1)>>4);
        p[6]=(*(cpyptr+lin2ofs  )>>4);
        p[7]=(*(cpyptr+lin2ofs  )&0x0f);
        p[8]=(*(cpyptr+lin2ofs+1)>>4);
        sort(p,9);
        b=p[4];
      }
    }
    *(picptr++)=(b<<4)|15;
    cpyptr+=1;
    if (!(y%30)) 
    { sprintf(&wtitel,"Processing %03d %%",y*100/memheight);
      SetWindowTitles(win,&wtitel[0],(UBYTE *)-1);
    }
  }
  for (cnt=0;cnt<(memwidth>>1);cnt++) *(picptr++)=255;
  SetWindowTitles(win," ",(UBYTE *)-1);
}
