home *** CD-ROM | disk | FTP | other *** search
/ Freelog 8 / Freelog008.iso / Prog / VGA.C < prev    next >
C/C++ Source or Header  |  2000-02-06  |  2KB  |  89 lines

  1. //CODE REALISE PAR SIRACUSA WALTER/wiSdom
  2. #include "vga.h"
  3.  
  4. #define BUF_PCX 100     //Taille du tampon (en octet)
  5. byte _buf_pcx[BUF_PCX]; //Tampon pour LoadPCX() et SavePCX()
  6. char _fch_pcx[45];      //Chemin des fichier PCX
  7.  
  8. void read_buf_pcx(int handle,byte *tampon,word *comp)
  9. {
  10.   if(*comp==BUF_PCX) //Tampon plein ?
  11.   {
  12.     *comp=0;
  13.     read(handle,tampon,BUF_PCX);
  14.   }
  15. }
  16.  
  17. byte LoadPCX(char *path,bytef *scr,byte *pal)
  18. {
  19.   int canal;
  20.   byte octet;
  21.   word dim=64000,
  22.        i,rep,cpt_buf=0;
  23.  
  24.   sprintf(_fch_pcx,"%s.pcx",path); //Ajoute l'extension .PCX
  25.   canal=open(_fch_pcx,O_RDONLY|O_BINARY); //Ouverture du fichier en lecture
  26.  
  27.   if(canal!=-1)
  28.   {
  29.     //En-tete
  30.     lseek(canal,128,SEEK_SET);
  31.  
  32.     //Image
  33.     read(canal,_buf_pcx,BUF_PCX); //Remplit le tampon
  34.  
  35.     while(dim)
  36.     {
  37.       octet=_buf_pcx[cpt_buf++]; //Lecture du tampon : compteur ou encre ?
  38.       read_buf_pcx(canal,_buf_pcx,&cpt_buf); //Remplit le tampon
  39.  
  40.       if(octet>191) // -> Compteur
  41.       {
  42.         rep=octet-192; //Nombre de répétition de l'encre
  43.         octet=_buf_pcx[cpt_buf++]; //Lecure du tampon : encre à répéter
  44.         read_buf_pcx(canal,_buf_pcx,&cpt_buf); //Remplit le tampon
  45.  
  46.         for(i=0;i<rep;i++) //Répétition de l'encre
  47.         {
  48.           *(scr++)=octet; //Ecriture de l'encre
  49.           dim--;
  50.         }
  51.       }
  52.       else          // -> Encre
  53.       {
  54.         *(scr++)=octet; //Ecriture de l'encre
  55.         dim--;
  56.       }
  57.     }
  58.  
  59.     //Palette
  60.     lseek(canal,-768L,SEEK_END);
  61.  
  62.     for(i=0;i<768;i++)
  63.     {
  64.       read(canal,&pal[i],1);
  65.       pal[i]>>=2;
  66.     }
  67.     close(canal);
  68.     return 1;
  69.   }
  70.   close(canal);
  71.   return 0;
  72. }
  73.  
  74.  
  75. void SetAllPal(byte *pal)
  76. {
  77.   register word i;
  78.  
  79.   for(i=0;i<256;i++)
  80.   {
  81.     outportb(0x3c8,i);
  82.     outportb(0x3c9,*pal);
  83.     outportb(0x3c9,*(pal+1));
  84.     outportb(0x3c9,*(pal+2));
  85.     pal+=3;
  86.   }
  87. }
  88.  
  89.