/**************************************************************************** Nombre: CARGAPCX.C Utilidad: Carga en pantalla un archivo .PCX de resoluci¢n 320x200x256 Fuente: Revista MQO N£m. 1: Programaci¢n gr fica. Autores: Ferran G llego - Manuel Montoto Fecha: Marzo 1998 E-mail: cworld@biosys.net Web: http://www.biosys.net/cworld Compilado con ‚xito en Turbo C++ 3.0.Es recomendable ejecutarlo desde fuera del IDE de Turbo C++, ya que requiere 64K libres.Comp¡lalo y ejecutalo desde el DOS si tienes alg£n problema. Este c¢digo est pensado para que cualquiera pueda incluirlo en sus aplica- ciones.P saselo a tus amigos, colegas... Tambi‚n puedes decir que lo has conseguido en: http://www.biosys.net/cworld ****************************************************************************/ #include #include #include #include unsigned char Paleta[256][3]; /* Array que contendr la paleta de colores del PCX */ void Pon_Paleta(void) { unsigned char cont1,c; int cont; for (cont=0;cont<256;cont++) for (cont1=0;cont1<3;cont1++) Paleta[cont][cont1]=(Paleta[cont][cont1]>>2); /* Movemos 2 bits hacia la derecha todos los bytes le¡dos en la paleta del PCX. Los componentes RGB de la paleta se encuentran en los 6 bits de mayor peso de los valores le¡dos del fichero */ cont=0; cont1=0; /* El c¢digo que sigue a continuaci¢n pasa el contenido del array "Paleta" a la paleta de la VGA */ for (cont=0;cont<256;cont++) { outportb (0x03c8,cont); for (cont1=0;cont1<3;cont1++) outportb (0x03c9,Paleta[cont][cont1]); } do { asm { mov dx,03c8h mov al,cont1 out dx,al } c=Paleta[cont][0]; asm { mov dx,03c9h mov al,c out dx,al } c=Paleta[cont][1]; asm { mov dx,03c9h mov al,c out dx,al } c=Paleta[cont][2]; asm { mov dx,03c9h mov al,c out dx,al } cont++; cont1++; }while (cont<256); } /* La siguiente funci¢n carga el archivo PCX en el buffer que recibe como par metro (unsigned char far *buf).Para ello asignaremos previamente 64000 bytes de memoria en la funci¢n main (*pantalla) */ unsigned char Cargar_PCX (char *name, unsigned char far *buf) { FILE *fp; unsigned char bytecount,byte; unsigned int i; if ((fp=fopen(name,"rb"))==NULL) return (0); fseek (fp,128L,SEEK_SET); /* Nos saltamos la cabecera del PCX */ i=0; while (i<64000) /* Mientras no se coloquen todos los p¡xels */ { if ((fread(&byte,1,1,fp))==0) break; if (byte>0xbf) /* Si es un contador de p¡xels... */ { bytecount=byte&0x3f; /* N£mero de p¡xels del siguiente color */ fread(&byte,1,1,fp); /* Leemos el color */ while (bytecount>0) /* Mientras queden p¡xels del color actual */ { *buf++=byte; /* Ponemos el p¡xel en el buffer */ bytecount--; /* Restamos uno */ i++; /* Hemos puesto un p¡xel */ } } else /* Si no era un contador de p¡xels... */ { *buf++=byte; /* Ponemos el p¡xel en el buffer */ i++; /* Hemos puesto un p¡xel simple */ } } fseek(fp,-768L,SEEK_END); /* Nos situamos en el comienzo de la paleta */ fread(Paleta,768,1,fp); /* Leemos los bytes componentes del RGB */ Pon_Paleta(); /* Llamamos a la funci¢n que actualiza la paleta en la VGA */ fclose(fp); /* Cerramos el fichero */ return (1); } void main(void) { unsigned char far *pantalla; asm { mov ax,13h /* Iniciamos el modo */ int 10h /* 320x200 con 256 colores */ } pantalla=(unsigned char far *) farmalloc(64000); /* Asignamos 64K bytes */ Cargar_PCX("PRUEBA.PCX",pantalla); /* Abrimos el fichero */ /* A continuaci¢n volcamos el contenido del puntero en la memoria de v¡deo */ movedata (FP_SEG(pantalla),FP_OFF(pantalla),0xA000,0,64000); while (!kbhit()); asm { mov ax,03h /* Retornamos al modo */ int 10h /* texto */ } }