home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freelog 8
/
Freelog008.iso
/
Prog
/
VGA.C
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-06
|
2KB
|
89 lines
//CODE REALISE PAR SIRACUSA WALTER/wiSdom
#include "vga.h"
#define BUF_PCX 100 //Taille du tampon (en octet)
byte _buf_pcx[BUF_PCX]; //Tampon pour LoadPCX() et SavePCX()
char _fch_pcx[45]; //Chemin des fichier PCX
void read_buf_pcx(int handle,byte *tampon,word *comp)
{
if(*comp==BUF_PCX) //Tampon plein ?
{
*comp=0;
read(handle,tampon,BUF_PCX);
}
}
byte LoadPCX(char *path,bytef *scr,byte *pal)
{
int canal;
byte octet;
word dim=64000,
i,rep,cpt_buf=0;
sprintf(_fch_pcx,"%s.pcx",path); //Ajoute l'extension .PCX
canal=open(_fch_pcx,O_RDONLY|O_BINARY); //Ouverture du fichier en lecture
if(canal!=-1)
{
//En-tete
lseek(canal,128,SEEK_SET);
//Image
read(canal,_buf_pcx,BUF_PCX); //Remplit le tampon
while(dim)
{
octet=_buf_pcx[cpt_buf++]; //Lecture du tampon : compteur ou encre ?
read_buf_pcx(canal,_buf_pcx,&cpt_buf); //Remplit le tampon
if(octet>191) // -> Compteur
{
rep=octet-192; //Nombre de répétition de l'encre
octet=_buf_pcx[cpt_buf++]; //Lecure du tampon : encre à répéter
read_buf_pcx(canal,_buf_pcx,&cpt_buf); //Remplit le tampon
for(i=0;i<rep;i++) //Répétition de l'encre
{
*(scr++)=octet; //Ecriture de l'encre
dim--;
}
}
else // -> Encre
{
*(scr++)=octet; //Ecriture de l'encre
dim--;
}
}
//Palette
lseek(canal,-768L,SEEK_END);
for(i=0;i<768;i++)
{
read(canal,&pal[i],1);
pal[i]>>=2;
}
close(canal);
return 1;
}
close(canal);
return 0;
}
void SetAllPal(byte *pal)
{
register word i;
for(i=0;i<256;i++)
{
outportb(0x3c8,i);
outportb(0x3c9,*pal);
outportb(0x3c9,*(pal+1));
outportb(0x3c9,*(pal+2));
pal+=3;
}
}