#include "type.h"
#include <fcntl.h>

char *ToChar(unsigned int vv)                 // bah! ca marche pu!
{ static unsigned long i0,i1,i2,i3,i4;
  static char chif[6]; int ok;
  i0=vv / 10000; i1=vv-(i0*10000);
  i1=i1 / 1000;  i2=vv-(i0*10000)-(i1*1000);
  i2=i2 / 100;   i3=vv-(i0*10000)-(i1*1000)-(i2*100);
  i3=i3 / 10;    i4=vv-(i0*10000)-(i1*1000)-(i2*100)-(i3*10);
  ok=0;

if (i0>0) {chif[0]=48+i0;ok=1;} else chif[0]=' ';
if (i1>0) {chif[1]=48+i1;ok=1;} else {if (ok) chif[1]='0'; else chif[1]=' ';}
if (i2>0) {chif[2]=48+i2;ok=1;} else {if (ok) chif[2]='0'; else chif[2]=' ';}
if (i3>0) {chif[3]=48+i3;ok=1;} else {if (ok) chif[3]='0'; else chif[3]=' ';}
if (i4>0) chif[4]=48+i4; else chif[4]='0';
  chif[5]='\0';
  return chif;
} /**/  

/*char *ToHex(unsigned int vv)                  // bah! ca marche po!
{ static char HexTab[]="0123456789ABCDEF";
  static char chif[8];
  static unsigned int i1,i2;
  for(i1=0;i1<8;i1++) chif[i1]='0';
  i1=vv; i2=7;
  while (i1!=0) 
  { //chif[i2]=HexTab[i1%16]; i2--;
    i1/=16;
  }
  return chif;
} */


int Compare(char C1[], char C2[])
{ int tt=0;
  while (C2[tt]!='\0')
  { if (tolower(C1[tt])==tolower(C2[tt])) tt++;
    else return 0;
  }
  return 1;
}

void BlackPal()
{ int i; for(i=0; i<256; i++) SetColor(i,0,0,0); }

void Waiting(int nb)
{ static int i; for (i=0; i<=nb; i++) WaitVbl2(); }

void SetPalette(byte *WP)
{ int i;
  for (i=0; i<256; i++) SetColor(i, WP[(i*3)], WP[(i*3)+1], WP[(i*3)+2]);
}

void SetZonePalette(byte *WP, byte deb, byte fin)
{ int i;
  for (i=deb; i<fin; i++) SetColor(i, WP[(i*3)], WP[(i*3)+1], WP[(i*3)+2]);
}


void FadeP1ToP2(byte P1[], byte P2[])
{ byte WP[768];
  int i, j, k;

  for (k=0; k<=32; k++)
   { for(i=0; i<=255; i++)
     { j=i*3; 
       WP[j]   = ( (P1[j]  *(32-k)) + (P2[j]  *k) )/32;
       WP[1+j] = ( (P1[1+j]*(32-k)) + (P2[1+j]*k) )/32;
       WP[2+j] = ( (P1[2+j]*(32-k)) + (P2[2+j]*k) )/32;
     } WaitVbl2();
     SetPalette (WP);
   }
}

void Fade2Black (byte PaletteIn[])
{ byte WP[768];
  int i,j,Intensity;

  for(Intensity=31;  Intensity>=0; Intensity--)
   { for (i=0; i<=255; i++)
     { j=i*3;
       WP[j]   = (PaletteIn[j]   * Intensity) /32;
       WP[1+j] = (PaletteIn[1+j] * Intensity) /32;
       WP[2+j] = (PaletteIn[2+j] * Intensity) /32;
     } WaitVbl2();
     SetPalette (WP);
   }
}

void FadeZone2Black (byte PaletteIn[], byte deb, byte fin)
{ byte WP[768];
  int i,j,Intensity;

  for(Intensity=31;  Intensity>=0; Intensity--)
   { for (i=deb; i<=fin; i++)
     { j=i*3;
       WP[j]   = (PaletteIn[j]   * Intensity) /32;
       WP[1+j] = (PaletteIn[1+j] * Intensity) /32;
       WP[2+j] = (PaletteIn[2+j] * Intensity) /32;
     } WaitVbl2();
     SetZonePalette (WP,deb,fin);
   }
}

void FadeFBlack (byte PaletteIn[])
{ byte WP[768];
  int i,j,Intensity;

  for(Intensity=1; Intensity<=32; Intensity++)
   { for(i=0; i<=255; i++)
     { j=i*3;
       WP[j]   = (PaletteIn[j]   * Intensity) /32;
       WP[1+j] = (PaletteIn[1+j] * Intensity) /32;
       WP[2+j] = (PaletteIn[2+j] * Intensity) /32;
     } WaitVbl2();
     SetPalette (WP);
   }
}

int readGIF(char *nomfic,byte *dest,byte *pal)
{
struct {
        byte    sign[3];        // signature GIF
        byte    nuver[3];       // numero de version
        struct {word    xscr;   // largeur de l'ecran
                word    yscr;   // hauteur de l'ecran
                byte    resflag;        // indicateur de resolution
                byte    coulfond;       // couleur de fond
                byte    par;            // pixel aspect ratio
               } LSDB;          //
        byte    GCM[768];       // Global color map (la palette kwa !)
        struct {byte    ish;    // image separator header ',' (2Ch)
                word    xabs;   // abscisse x du coin sup gauche
                word    yabs;   // abscisse y du coin sup gauche
                word    imlar;  // largeur de l'image
                word    imhau;  // hauteur de l'image
                byte    flag;   // one morreuuu flageuuu
               } IDB;           // image descriptor block
       } GIFHeader; 

   static char *GIFbuffer;
   static long GIFlen;
   static int i;
   static byte *PalSrc;

/*      static int i,fic,ficlong;
        static char *buf;
        static byte *PalSrc;
/**/

        KillKeyb();                     // vire l'iterruption clavier

/*      if((fic=open(nomfic,O_RDONLY|O_BINARY))==-1)   
          return(-1);                   // retourne -1 si erreur ouverture
        ficlong=filelength(fic);        // recupere la longueur du fichier
        buf=(byte*)malloc(ficlong);     // le gif compresser est en RAM ...
        read(fic,buf,ficlong);      // on lit tout le fichier dans le buffer
/**/

        GIFlen = EDsearch(nomfic);                       // d'une rubrique.
        GIFbuffer =(byte*)malloc(GIFlen);
        EDload(GIFbuffer);      

//        MemCopy(buf,&GIFHeader,791);   // puis on recupere l'entete
        MemCopy(GIFbuffer,&GIFHeader,791);   // puis on recupere l'entete

        PalSrc=GIFHeader.GCM;

  for(i=0;i<256;i++)
  {     *pal=*PalSrc>>2;
        *(pal+1)=*(PalSrc+1)>>2;
        *(pal+2)=*(PalSrc+2)>>2;
        pal+=3; PalSrc+=3;
  }

//        lisgif(buf+791+1,dest);             // decompression dans [dest]
        lisgif(GIFbuffer+791+1,dest);             // decompression dans [dest]

//        close(fic);                     // on referme le fichier
//        free(buf);                      // on vire le buffer
        free(GIFbuffer);
        RaiseKeyb();                    // restaure l'interruption clavier
        return(0);                      // 0 = pas d'erreur
}


/*int readPCX(char *nomfic,byte *dest,byte *pal)
{
   struct  {
                byte sign;                      // signature du format 0ah
                byte version;     // version du fichier PCX
                byte typcomp;     // avec compression RLE (1) ou sans (0 et ca fait chier)
                byte bpp;                       // bits par pixel
                word xcoorh;            // coordonnees x,y du pt haut gauche de l'image
                word ycoorh;
                word xcoorb;            // coordonnees x,y du pt bas droite
                word ycoorb;
                word xres;                      // resolution horizontal en dpi
                word yres;                      // resolution vertical en dpi
                byte pal16[48];         // 16 premiere couleurs de la palette
                byte reserve;     // reserve
                byte nplan;                     // nb de plan (1 seul en 256 coul)
                word xbyte;                     // nombre d'octets par lignes d'images
                word typal;                     // type de palette 1=couleur ou n/b
                byte reserve2[58];// reserve
           } PCXHeader;

   static char *PCXbuffer;
   static long PCXlen;
   static int i,dim;
   static byte *PalSrc;

   KillKeyb();                     // vire l'iterruption clavier

   PCXlen = EDsearch(nomfic);                       // d'une rubrique.
   PCXbuffer =(byte*)malloc(PCXlen);
   EDload(PCXbuffer);      

   MemCopy(PCXbuffer+PCXlen-768,pal,768);   // puis on recupere la palette
   MemCopy(PCXbuffer,&PCXHeader,128);       // et l'entete

   dim=(PCXHeader.xcoorb+1)*(PCXHeader.ycoorb+1);          // calcul la dimension de l'image

  for(i=0;i<256;i++)
  {     *pal=*PalSrc>>2;
        *(pal+1)=*(PalSrc+1)>>2;
        *(pal+2)=*(PalSrc+2)>>2;
        pal+=3; PalSrc+=3;
  }

  lispcx(PCXbuffer+128,dest,dim);             // decompression dans [dest]

  free(PCXbuffer);
  RaiseKeyb();                    // restaure l'interruption clavier
  return(0);                      // 0 = pas d'erreur
} */

