CATALOGO/LEE_PCX.CPP
2021-09-03 17:43:05 +02:00

167 lines
4.2 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <dos.h> /* cabeceras que hacen que se incluyan */
#include <alloc.h>
#include <conio.h> /* durante el proceso de compilado */
#include <stdio.h> /* las funciones que el programa utilize */
#include <stdlib.h>
#include <string.h>
int leepcx(char dibujo[80]);
int asigna_memoria_pcx(void); /* se usar n en el programa. Se indica el */
void libera_memoria_pcx(void); /* tipo de dato que devuelven y el tipo */
int lee_dibujo_pcx(void); /* de dato/s que necesitan que se les */
int comprueba_dibujo(void); /* pase para funcionar. */
void descomprime_dibujo(void);
void asigna_rgb(void);
extern "C" void VUELCA_PANTALLA(unsigned char *);
/*************************** VARIABLES GLOBALES ****************************/
unsigned char *dir_planos;
unsigned char *dir_dibujo;
char dibujo[80];
char bits_pixel;
char num_planos;
int colores[16] = { 0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63 };
int ancho;
int alto;
int tecla;
FILE *handle_dibujo;
/************************** COMIENZO DEL LISTADO ***************************/
int leepcx(char diu[80])
{
strcpy(dibujo, diu);
if(asigna_memoria_pcx()==1){ /* reserva memoria al dibujo */
if(lee_dibujo_pcx()==1) { /* lee el dibujo del disco */
if(comprueba_dibujo()==1){ /* ve si formato es adecuado */
descomprime_dibujo(); /* descomprime el dibujo */
VUELCA_PANTALLA(dir_planos); /* visualiza el dibujo */
} else {
libera_memoria_pcx();
return 0;
}
} else {
libera_memoria_pcx();
return 0;
}
libera_memoria_pcx(); /* devuelve la memoria al prg*/
return 1;
}
return 0;
} /* vuelve al Programa */
int asigna_memoria_pcx(void) /* reserva memoria para cargar el dibujo */
{
if((dir_dibujo=(unsigned char *)farmalloc(153600))==NULL) {
return 0;
}
if((dir_planos=(unsigned char *)farmalloc(153600))==NULL) {
return 0;
}
return 1;
}
void libera_memoria_pcx(void) /* libera la memoria asignada al DOS */
{
farfree(dir_dibujo);
farfree(dir_planos);
}
int lee_dibujo_pcx(void)
{
int *dir_dibu;
char huge *dir;
if((handle_dibujo=fopen(dibujo, "rb"))==NULL) {
return 0;
}
dir=(char huge *)dir_dibujo;
while(!feof(handle_dibujo)) { *dir++=getc(handle_dibujo); }
if(fclose(handle_dibujo)!=NULL) {
return 0;
}
dir_dibu=(int *)dir_dibujo;
bits_pixel=*(dir_dibujo+3);
num_planos=*(dir_dibujo+65);
ancho=1+(*(dir_dibu+4));
alto =1+(*(dir_dibu+5));
return 1;
}
int comprueba_dibujo(void)
{
if(*dir_dibujo!=10) {
return 0;
}
if(bits_pixel!=1 || num_planos!=4) { /* comprueba que el */
return 0;
}
if(ancho>640 || alto>480) { /* comp. el tama¤o */
return 0;
}
return 1;
}
void descomprime_dibujo(void)
{
unsigned char huge *dir_lectura;
unsigned char huge *dir_escritura;
unsigned char byte;
int columnas, filas, contador;
dir_lectura =dir_dibujo+128; /* inicio del dibujo comprimido */
dir_escritura=dir_planos;
for(filas=alto; filas>0; filas--) {
columnas=ancho/2;
while(columnas>0) {
byte=*dir_lectura++;
if(byte<=192) { *dir_escritura++=byte; columnas--; }
else {
contador=byte&0x3F; byte=*dir_lectura++;
for(; contador>0; contador--) {
*dir_escritura++=byte; columnas--;
}
}
}
}
asigna_rgb();
}
void asigna_rgb(void)
{
struct SREGS seg;
union REGS ent, sal;
int num_color, n;
long int dir;
unsigned char *dir_col;
dir_col=dir_dibujo+16; /* divide entre 4 */
for(n=16*3; n>0; n--) { /* los colores */
*dir_col=(*dir_col) >> 2; dir_col++;
}
dir =(long)(dir_dibujo+16); /* obtiene el segmento */
seg.es=(int) (dir >> 16); /* donde estan los colores */
for(n=0; n<16; n++) {
num_color=colores[n];
ent.h.al = 18;
ent.h.ah = 16;
ent.x.bx = num_color;
ent.x.cx = 1;
ent.x.dx = (int)dir; /* offset de los colores */
int86x(0x10, &ent, &sal, &seg); /* funci¢n para asignar los colores */
dir+=3;
}
}