CD_OUT_SRC/PCX16C.CPP
2021-09-03 17:50:32 +02:00

335 lines
9.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>
#include <alloc.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include "..\libs\make_bot\make_bot.h"
#include "..\libs\wavplav\wavplay.h"
extern void Sonido(char Sonido);
#include "XmsSupp.h"
/******************************* DEFINICIONES ******************************/
#define GRAFICO 18 /* su n£mero en el proceso de compilaci¢n */
void reinicializa_raton_grafico(int x1, int y1, int x2, int y2);
/*********************** DECLARACIONES DE FUNCIONES ************************/
extern char raton;
//*ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ*//
//*Û Cabecera completa de un PCX Û*//
//*ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ*//
typedef struct {
char indicador; /* constante. Si=10 es un archivo PCX */
char version; /* version pcx */
char codificacion; /* Si=1 el PCX esta comprimido */
char bits_pixel; /* bits por pixel (1,2,4,8) */
/* los 4 campos que siguen dan el recuadrado de la imagen */
unsigned int Xmin;
unsigned int Ymin;
unsigned int Xmax;
unsigned int Ymax;
unsigned int Hres;
unsigned int Vres;
char paleta_16[48]; /* si la pcx tiene <=16 colores, aqui paleta */
char reserv1; /* reservado */
char nplanos; /* num. de planos usados en la imagen */
unsigned int bytes_linea; /* bytes necesarios para decodificar una linea */
unsigned int infopal; /* Si=1 color o blanco y negro. 0=grises */
unsigned int anchura; /* anchura de la imagen */
unsigned int altura; /* altura de la imagen */
char sobrante[54]; /* sobrante de cabecera para futuras ampliaciones */
} PCX_HEADER;
void asigna_modo_video(char);
extern "C" void VUELCA_PANTALLA(unsigned char *);
extern "C" void VUELCA_PANTALLA_B(unsigned char *);
int lee_dibujo(char *dibujo);
extern void InicializaSVGA(void);
extern char dac[256*3];
char newdac[256*3];
extern "C" void ENCIENDE_PANTALLA(char *);
extern "C" void CHANGE_BANK(int);
extern XmsSupp Xms_Image_Bank1,
Xms_Image_Bank2,
Xms_Image_Bank3,
Xms_Image_Bank4,
Xms_Image_Bank5;
/*************************** VARIABLES GLOBALES ****************************/
int Lee_Cabecera(char *dibujo);
void ChkErr(void);
extern void Inicializa_Dibujo(int L_Imagen, char *N_Imagen2);
extern char SONIDO;
void Carga_PCX(char *Imagen)
{
int col;
char Old_Dac[256*3];
// Guardamos el contenido de la pantalla
// Asignamos Puntero a Memoria convencional y miramos si
// hay ERROR.
// Movemos a XMS y si hay ERROR lo Visualizamos.
CHANGE_BANK(0); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank1);
ChkErr(); Move2Xms(&Xms_Image_Bank1); ChkErr();
CHANGE_BANK(1); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank2);
ChkErr(); Move2Xms(&Xms_Image_Bank2); ChkErr();
CHANGE_BANK(2); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank3);
ChkErr(); Move2Xms(&Xms_Image_Bank3); ChkErr();
CHANGE_BANK(3); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank4);
ChkErr(); Move2Xms(&Xms_Image_Bank4); ChkErr();
CHANGE_BANK(4); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank5);
ChkErr(); Move2Xms(&Xms_Image_Bank5); ChkErr();
// Guardamos los colores originales
for( col = 0; col < 256*3; col++)
Old_Dac[col] = dac[col];
switch( Lee_Cabecera(Imagen) ) {
case 1: // 640x480 16c
case 3: // 640x400 16c
asigna_modo_video(18);
lee_dibujo(Imagen);
PunteroRaton = 1;
Espera_Tecla_o_Raton();
PunteroRaton = 100;
// getch();
InicializaSVGA();
break;
case 2: // 640x480 246c
case 4: // 640x400 246c
cleardevice();
Inicializa_Dibujo( (-2), Imagen);
for( col = (256-16)*3; col < (256)*3; col++)
dac[col] = newdac[ col ];
ENCIENDE_PANTALLA(dac);
PunteroRaton = 1;
if( SONIDO == 1 )
{
PlayLongWav( "CD_OUT.cr2", 0, -1 );
getch();
}
else
Espera_Tecla_o_Raton();
PunteroRaton = 100;
while( kbhit() ) getch();
// getch();
break;
}
// Restauramos el contenido de la pantalla
// Asignamos Puntero a Memoria convencional y miramos si
// hay ERROR.
// Movemos a XMS y si hay ERROR lo Visualizamos.
CHANGE_BANK(0); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank1);
ChkErr(); Move2Con(&Xms_Image_Bank1); ChkErr();
CHANGE_BANK(1); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank2);
ChkErr(); Move2Con(&Xms_Image_Bank2); ChkErr();
CHANGE_BANK(2); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank3);
ChkErr(); Move2Con(&Xms_Image_Bank3); ChkErr();
CHANGE_BANK(3); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank4);
ChkErr(); Move2Con(&Xms_Image_Bank4); ChkErr();
CHANGE_BANK(4); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank5);
ChkErr(); Move2Con(&Xms_Image_Bank5); ChkErr();
// Restauramos los colores originales
for( col = 0; col < 256*3; col++)
dac[col] = Old_Dac[col];
ENCIENDE_PANTALLA(dac);
reinicializa_raton_grafico( 0, 0, 618, 460);
}
void asigna_modo_video(char modo) /* asigna el modo de v¡deo indicado */
{ /* en la variable "modo" */
union REGS r;
r.h.al = modo;
r.h.ah = 0;
int86(16, &r, &r);
}
int Lee_Cabecera(char *dibujo){
FILE *handle_dibujo;
long ancho, alto;
int col;
PCX_HEADER Cabecera;
if((handle_dibujo=fopen(dibujo, "rb"))==NULL) {
return -2;
}
// Saltamos la cabecera
fread( &Cabecera, sizeof(PCX_HEADER), 1, handle_dibujo );
ancho= Cabecera.Xmax - Cabecera.Xmin+1;
alto = Cabecera.Ymax - Cabecera.Ymin+1;
col = ( (Cabecera.bits_pixel<=4) ? 16 : 256 );
fclose(handle_dibujo);
if(ancho == 640 && alto == 480 && col == 16) return 1;
if(ancho == 640 && alto == 480 && col ==256) return 2;
if(ancho == 640 && alto == 400 && col == 16) return 3;
if(ancho == 640 && alto == 400 && col ==256) return 4;
if(ancho == 320 && alto == 200 && col ==256) return 5;
return (-1);
}
int lee_dibujo(char *dibujo)
{
int *dir_dibu;
char huge *dir;
PCX_HEADER Cabecera;
struct SREGS seg;
union REGS ent, sal;
int num_color, n;
long int dir2;
unsigned char *dir_col;
unsigned char *dir_planos;
FILE *handle_dibujo;
long ancho, alto;
int filas, columnas, byte, contador;
int colores[16] = { 0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63 };
if((handle_dibujo=fopen(dibujo, "rb"))==NULL) {
return -2;
}
// Saltamos la cabecera
fread( &Cabecera, sizeof(PCX_HEADER), 1, handle_dibujo );
ancho= Cabecera.Xmax - Cabecera.Xmin+1;
alto = Cabecera.Ymax - Cabecera.Ymin+1;
//*ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ*//
//*Û Asigna memoria Û*//
//*ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ*//
if((dir_planos=(unsigned char *)farmalloc( (long)((ancho*alto)/2) ) )==NULL) {
if(fclose(handle_dibujo)!=NULL) {
return -2;
}
return -1;
}
dir=(char huge *)dir_planos;
while(!feof(handle_dibujo)) {
for(filas=alto; filas>0 && !feof(handle_dibujo); filas--) {
columnas=ancho/2;
while( columnas>0 && !feof(handle_dibujo) ) {
byte=getc(handle_dibujo);
if(byte<=192) { *dir++=byte; columnas--; }
else {
contador=byte&0x3F; byte=getc(handle_dibujo);
for(; contador>0; contador--) {
*dir++=byte; columnas--;
}
}
}
}
}
if(fclose(handle_dibujo)!=NULL) {
return -2;
}
dir_col=Cabecera.paleta_16; /* divide entre 4 */
for(n=16*3; n>0; n--) { /* los colores */
*dir_col=(*dir_col) >> 2; dir_col++;
}
dir2 =(long)Cabecera.paleta_16; /* obtiene el segmento */
seg.es=(int) (dir2 >> 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)dir2; /* offset de los colores */
int86x(0x10, &ent, &sal, &seg); /* funci¢n para asignar los colores */
dir2+=3;
}
// if( alto == 400 ) VUELCA_PANTALLA(dir_planos);
// else VUELCA_PANTALLA_B(dir_planos);
VUELCA_PANTALLA(dir_planos);
farfree(dir_planos);
return 0;
}
void reinicializa_raton_grafico(int x1, int y1, int x2, int y2)
{
struct SREGS seg;
union REGS ent, sal;
if(raton!=0) {
ent.x.ax = 15;
ent.x.cx = 5;
ent.x.dx = 11;
int86(0x33, &ent, &sal); /* fija la raz¢n mickey/pixel */
ent.x.ax = 7;
ent.x.cx = x1;
ent.x.dx = x2;
int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. horizontal */
ent.x.ax = 8;
ent.x.cx = y1;
ent.x.dx = y2;
int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. vertical */
}
}
void ChkErr(void)
{
if(Xms_Image_Bank1.lError || Xms_Image_Bank2.lError ||
Xms_Image_Bank3.lError || Xms_Image_Bank4.lError ||
Xms_Image_Bank5.lError )
{
closegraph();
printf("Bank1 %s\n",Xms_Image_Bank1.cError);
printf("Bank2 %s\n",Xms_Image_Bank2.cError);
printf("Bank3 %s\n",Xms_Image_Bank3.cError);
printf("Bank4 %s\n",Xms_Image_Bank4.cError);
printf("Bank5 %s\n",Xms_Image_Bank5.cError);
printf("Cambiando Bancos, Hemos salido con los codigos: %d, %d, %d, %d",
Xms_Image_Bank1.lError, Xms_Image_Bank2.lError,
Xms_Image_Bank3.lError, Xms_Image_Bank4.lError, Xms_Image_Bank5.lError );
exit(1);
}
}