#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define LWORD unsigned long
#define WORD  unsigned short
#define BYTE  unsigned char

// GIF-parameter
unsigned char SuffixTable[4999], ByteBuf[2592], BlockBuf[256];
short EncodeTable[4999], PrefixTable[4999];      // have in common_use
LWORD TempCode;
short Code, RunBits, ByteCount, ShiftBits;

#define n1 4096
#define n2 4032
char head[72][80],a[60],g[60],f1[60];
unsigned char b[512][530];
FILE  *fp;
float d[n2][n1],f[n2][n1];
int n11,n22;
int i8=16;

main(int ac, char **av)
{
  int   i,j,k,k6,i1,j1,i2,j2,ip,q;
  float x,y;
  fp=fopen("getcoord.par","r");
  if(fp==0){
    printf("\n\t ****** look whole 4 CCD image ********\n");
    printf("\n\t                             jiang, 110920\n");
    printf("\n\t must after getcoord\n\n");
    exit(0);
  }
  fgets(a,60,fp); fgets(g,60,fp); fclose(fp);
  k=strlen(a); a[k-1]=0; k6=k-6;
//  printf("%s %c\n",a,a[k-6]);
  for(k=1;k<=4;k++){
    a[k6]=k+48;
    if(k==1){ i2=0; j2=260; }
    if(k==2){ i2=0; j2=0; }
    if(k==3){ i2=274; j2=260; }
    if(k==4){ i2=274; j2=0; }
    fp=fopen(a,"rb"); if(fp==0){ printf("\n%s not found!\n",a); exit(0); }
    fread(head,72,80,fp); fread(d,n1*n2,4,fp); swap4(d,n1*n2*4); fclose(fp);
    sscanf(&head[32][12],"%f",&y);
    if(ac>1){
      sprintf(f1,"/vega2/rhbin/bias_%d.fit",k);
      fp=fopen(f1,"rb"); if(fp==0)goto l10;
      fseek(fp,72*80,0); fread(f,n1*n2,4,fp); fclose(fp); swap4(f,n1*n2*4);
      for(j=0;j<n2;j++)for(i=0;i<n1;i++)d[j][i]-=f[j][i];
      sprintf(f1,"/vega2/rhbin/f5822_%d.fit",k);
      fp=fopen(f1,"rb"); if(fp==0)goto l10;
      fseek(fp,72*80,0); fread(f,n1*n2,4,fp); fclose(fp); swap4(f,n1*n2*4);
      for(j=0;j<n2;j++)for(i=0;i<n1;i++)d[j][i]/=f[j][i];
      goto l20;
    }
l10:      
    sub1(0,0,y);
    sub1(0,n1/2,y);
    sub1(n2/2,0,y);
    sub1(n2/2,n1/2,y);
l20:
    for(j=i8;j<n2-i8;j+=i8)for(i=0;i<n1;i+=i8){ x=0.;
      for(j1=j;j1<j+i8;j1++)for(i1=i;i1<i+i8;i1++)x+=d[j1][i1]-y;
      x/=(i8*i8);
      x+=50.; if(x<0.)x=0.; if(x>255.)x=255.;
      q=x; b[j2+j/i8][i2+i/i8]=q;
    }
  }
  fp=fopen("getcoord.gif","wb"); 
  togif(b,530,512);
  fclose(fp);   
  system("eog getcoord.gif &");
  k=strlen(g); g[k-1]=0;
  sprintf(b,"u3bok %s 63",g);
  system(b);
}

sub1(nj,ni,sky)
int nj,ni; float sky;
{
  float x,y;
  int i,j,k;
  short a[100*100];
  x=0.; k=0;
  for(j=nj+900;j<nj+1000;j++)for(i=ni+900;i<ni+1000;i++)a[k++]=d[j][i]/2.;
  white_black(a,1,k,&x,&y); x*=2.;
  for(j=nj;j<nj+n2/2;j++)for(i=ni;i<ni+n1/2;i++)d[j][i]-=(x-sky);
}

FillBlockBuf()
{
  TempCode |= (unsigned int)Code << ShiftBits;
  ShiftBits += RunBits;
  while(ShiftBits >= 8)  {
    BlockBuf[++ByteCount] = TempCode & 0x00FF;
    if(ByteCount == 255){
      BlockBuf[0] = (unsigned char)ByteCount;
      fwrite(BlockBuf, 1, ByteCount+1, fp);
      ByteCount = 0;
    }
    TempCode >>= 8;
    ShiftBits -= 8;
  }
}

togif(c256,m1,m2)
unsigned char *c256;
int m1,m2;
{
short Encode, MaxCodeSize, Width, Height, Dots, Rows;
short PrefixCode, SuffixCode, RandomIndex, Val;
short head1[7]={0x4947,0x3846,0x6137,0,0,0xf7,0};
short head2[5]={0,0,0,0,0x800};
LWORD jj;
  int i;

  head1[3]=head2[2]=Width=m1;
  head1[4]=head2[3]=Height=m2;
  fwrite(head1,1,13,fp);
  for(i=0;i<256;i++){
    ByteBuf[0]=ByteBuf[1]=ByteBuf[2]=i;
    fwrite(ByteBuf,1,3,fp);
  }
  fputc(0x2c,fp);
  fwrite(head2,2,5,fp);
  ByteCount = ShiftBits = TempCode = 0;

  Encode = 258;  RunBits = 9;  MaxCodeSize =512;
  for(i = 0; i < 4999; i++) EncodeTable[i] = 0;
  Code = 256;
  FillBlockBuf();
  for(Rows = 0; Rows < Height; Rows++)  {
    jj=(m2-1-Rows)*m1;
    for(i=0;i<m1;i++)ByteBuf[i]=c256[jj++];
    if(Rows == 0) { PrefixCode = ByteBuf[0];  Dots = 1; }
    else Dots = 0;
    while( Dots < Width)  {
      SuffixCode = ByteBuf[Dots++];
      RandomIndex = PrefixCode ^ (SuffixCode << 4);
      if(RandomIndex == 0)  Val = 1;
      else Val = 4999 - RandomIndex;
      while(1)  {
        if(EncodeTable[RandomIndex] == 0)  {
          Code = PrefixCode;
          FillBlockBuf();
          if(Encode == 4096)  {
            Code = 256;
            FillBlockBuf();
            Encode = 258;  RunBits = 9;  MaxCodeSize =512;
            for(i = 0; i < 4999; i++) EncodeTable[i] = 0;
          }
          else  {
            if(Encode == MaxCodeSize)  {
              MaxCodeSize <<= 1;
              RunBits++;
            }
            PrefixTable[RandomIndex] = PrefixCode;
            SuffixTable[RandomIndex] = (unsigned char)SuffixCode;
            EncodeTable[RandomIndex] = Encode++;
          }
          PrefixCode = SuffixCode;
          break;
        }
        if(PrefixTable[RandomIndex] == PrefixCode &&
           SuffixTable[RandomIndex] == SuffixCode)  {
          PrefixCode = EncodeTable[RandomIndex];
          break;
        }
        else  {
          RandomIndex -= Val;
          if(RandomIndex < 0)  RandomIndex += 4999;
        }
      }
    }
  }
  Code = PrefixCode;
  FillBlockBuf();
  Code = 257;
  FillBlockBuf();
  if(ShiftBits > 0 || ByteCount > 0)   {
    BlockBuf[++ByteCount] = TempCode & 0x00FF;
    BlockBuf[0] = (unsigned char)ByteCount;
    fwrite(BlockBuf, 1, ByteCount+1, fp);
    ByteCount = 0;
  }
  fputc(0, fp);  fputc(';', fp);
}
