/*
Para probar este ejemplo te recomiendo que inicies grafica con
256 colores, si tienes alguna duda escribeme a:
piyeysomarriba@hotmail.com
o bien visita mi pagina web en:
piyey.webcindario.com (Por ahora esta en construccion)
*/
#include <dos.h>
#include <mem.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
typedef struct
{ int r,g,b;}MIPALETA;
#pragma option -w-
void cargaPCX(int x,int y,char *archivo,int desp)
{
// Variables utilizadas:
FILE *pf;
char cabecera[128];
char fabricante, version, codificado, bpp;
int xm, ym, xM, yM, resh, resv;
char planos, bpl, tpaleta;
unsigned seg;
long tamanyo;
char valor;
int i, j;
unsigned char codigo;
unsigned char salir;
MIPALETA paleta[256];
char longitud;
// Abrimos el archivo y leemos la paleta:
pf=fopen(archivo,"rb");
fseek (pf, 0, SEEK_END);
tamanyo = ftell (pf);
fseek (pf, tamanyo-769, SEEK_SET);
valor = getc(pf);
if (valor == 0xC)
{ outportb(0x3c8, 0);// setea la paleta de colores
for(i = 0; i < 256; i++)
{ outportb(0x3c9, getc(pf)/4);
outportb(0x3c9, getc(pf)/4);
outportb(0x3c9, getc(pf)/4);
}
}
rewind(pf);
fread (cabecera, sizeof(char), 128, pf); /* leo del tir¢n la cabecera */
fabricante = cabecera[0];
version = cabecera[1];
codificado = cabecera[2];
bpp = cabecera[3];
seg = FP_SEG (cabecera);
movedata (seg, FP_OFF(&cabecera[4]), FP_SEG(&xm), FP_OFF(&xm), 2);
movedata (seg, FP_OFF(&cabecera[6]), FP_SEG(&ym), FP_OFF(&ym), 2);
movedata (seg, FP_OFF(&cabecera[8]), FP_SEG(&xM), FP_OFF(&xM), 2);
movedata (seg, FP_OFF(&cabecera[10]), FP_SEG(&yM), FP_OFF(&yM), 2);
movedata (seg, FP_OFF(&cabecera[12]), FP_SEG(&resh), FP_OFF(&resh), 2);
movedata (seg, FP_OFF(&cabecera[14]), FP_SEG(&resv), FP_OFF(&resv), 2);
planos = cabecera[65];
movedata (FP_SEG(cabecera), FP_OFF(&cabecera[66]), FP_SEG(&bpl), FP_OFF(&bpl), 2);
movedata (FP_SEG(cabecera), FP_OFF(&cabecera[68]), FP_SEG(&tpaleta), FP_OFF(&tpaleta), 2);
setviewport(x,y,getmaxx()-1,getmaxy()-1,1);
x=0,y=0;
salir=0;
while (!salir)
{ fread (&codigo, sizeof(char), 1, pf);
if (codigo >= 192)
{ longitud = (codigo & 63);
fread (&codigo, sizeof(char), 1, pf);
}
else
longitud = 1;
for (i = longitud; i >= 1; i--)
{ // Se supone puntero_pcx definido y con su memoria reservada y todo.
// pinta_punto(x,y,codigo,puntero_pcx);
putpixel(x,y,codigo);
x++;
if (x > xM - xm + desp)
{ x = xm;
y++;
if (y > yM - ym)
salir = 1;
}
}
}
setviewport(0,0,getmaxx()-1,getmaxy()-1,1);
}
#pragma option -w
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
// Sustituye esta parte del codigo para iniciar modo grafico
// con 256 colores si quieres colocar
// una imagen con 256 colores...
initgraph(&gdriver, &gmode, "C:\\TC\\BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
setfillstyle(1,7);
bar(0,0,getmaxx()-1,getmaxy()-1);
//Deben estar las imagenes en la ubicacion correcta
if(getmaxx()+1==640&&getmaxy()+1==480)
{ cargaPCX(0,0,"Logo.pcx",0); }
if(getmaxx()+1==800&&getmaxy()+1==600)
{ cargaPCX(0,0,"Logo8x6.pcx",0); }
getch();
closegraph();
return 0;
}