/***************************************************************************** Nombre : VGALIB.H Utilidad : Libreria grafica para el manejo del Modo 13h (320x200x256) Autor : Roberto Albornoz Figueroa rcaf@latinmail.com *****************************************************************************/ #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) #ifndef __VGALIB_H #define __VGALIB_H #include // FILE, fopen, fclose, fgetc, ftell, fseek #include // int86, MK_FP #include // memset, memmove, memcpy #include // sin, cos, abs #include // malloc, free #define TEXTO 0x03 #define GRAFICO 0x13 #define BYTE unsigned char #define MAX_FRAMES 15 // Puntero a la memoria de video BYTE *DIR_VGA=(BYTE *) MK_FP(0xA000, 0); // Tipo de dato para guardar los datos de la paleta typedef char t_paleta[768]; // Tipo pantalla virtual typedef BYTE *t_pvirtual; // Tipo de dato para guardar los datos de un sprite typedef struct { int x, y; // Posicion del sprite en la pantalla BYTE ancho, alto; // Ancho y alto del sprite BYTE num_frames; // Numero de frames que tiene el sprite BYTE *frame[MAX_FRAMES]; // Cada uno de los frames del sprite } t_sprite; // Prototipos de funciones void SetMode(char mode); void PutPixel(int x, int y, BYTE color, BYTE *where); BYTE GetPixel(int x, int y, BYTE *where); void Cls(BYTE color, BYTE *where); void SetColor(BYTE color, char r, char g, char b); void GetColor(BYTE color, char *r, char *g, char *b); void SetPal(t_paleta pal); void GetPal(t_paleta pal); void FadeOut(void); void FadeIn(t_paleta paleta); void FadeWhite(void); void RotatePal(t_paleta pal, int first, int last); BYTE *SetPVirtual(BYTE **pv); void FreePVirtual(BYTE **pv); void Flip(BYTE *source); void FlipTo(BYTE *source, BYTE *where); void Circle(int cx, int cy, int radio, BYTE color, BYTE *where); void LineH(int x, int y, int ancho, BYTE color, BYTE *where); void LineV(int x, int y, int alto, BYTE color, BYTE *where); void Line(int x1, int y1, int x2, int y2, BYTE color, BYTE *where); void Box(int x1, int y1, int x2, int y2, BYTE color, BYTE *where); void FillBox(int x, int y, int ancho, int alto, BYTE color, BYTE *where); int LoadSpr(char *filename, BYTE **frame); int LoadSprite(char *filename, t_sprite *sprite, BYTE num_frames); void FreeSprite(t_sprite *sprite, BYTE num_frames); void PutSprite(int x, int y, BYTE *frame, BYTE *where); int LoadPal(char *filename, t_paleta pal); void WaitRetrace(void); void WaitRetraceN(int n); int sgn(int num); long filesize(FILE *f); /****************************************************************************/ /* IMPLEMENTACION DE FUNCIONES */ /****************************************************************************/ // Setea un modo de video especifico void SetMode(char mode) { union REGS r; r.h.ah=0; r.h.al=mode; int86(0x10, &r, &r); } // Coloca un pixel en la pantalla en una posicion determinada void PutPixel(int x, int y, BYTE color, BYTE *where) { where[(y<<8)+(y<<6)+x]=color; } // Obtiene el color de un pixel de una posicion determinada de la pantalla BYTE GetPixel(int x, int y, BYTE *where) { return (where[(y<<8)+(y<<6)+x]); } // Borra la pantalla con un color determinado void Cls(BYTE color, BYTE *where) { memset(where, color, 64000); } // Setea un color void SetColor(BYTE color, char r, char g, char b) { outportb(0x3C8, color); outportb(0x3C9, r); outportb(0x3C9, g); outportb(0x3C9, b); } // Obtiene las intensidades RGB de un color void GetColor(BYTE color, char *r, char *g, char *b) { outportb(0x3C7, color); *r=inportb(0x3C9); *g=inportb(0x3C9); *b=inportb(0x3C9); } // Setea una paleta void SetPal(t_paleta pal) { int i; for(i=0; i<256; i++) SetColor(i, pal[i*3], pal[(i*3)+1], pal[(i*3)+2]); } // Obtiene la paleta actual void GetPal(t_paleta pal) { int i; for(i=0; i<256; i++) GetColor(i, &pal[i*3], &pal[(i*3)+1], &pal[(i*3)+2]); } // Realiza un fundido desde la paleta actual hasta llegar al negro void FadeOut(void) { t_paleta pal; int x, y; GetPal(pal); for(y=0; y<64; y++) { for(x=0; x<768; x++) if(pal[x]>0) pal[x]--; WaitRetrace(); SetPal(pal); } } // Hace un fundido desce cero (negro) hasta llegar a la paleta pasada // como parametro void FadeIn(t_paleta paleta) { t_paleta pal; int x, y; for(y=0; y<768; y++) pal[y]=0; for(y=0; y<64; y++) { for(x=0; x<768; x++) if(pal[x]first; i-=3) { pal[i]=pal[i-3]; pal[i-1]=pal[i-4]; pal[i-2]=pal[i-5]; } pal[first]=r; pal[first+1]=g; pal[first+2]=b; } else // Rota la paleta una posicion a la izquierda { first=(first*3)+2; last=last*3; r=pal[last]; g=pal[last+1]; b=pal[last+2]; for (i=last; i=0) && (y>=0) && (x<320) && (y<200)) PutPixel(x, y, color, where); angulo+=0.005; } while(angulo<6.28); } // Dibuja una linea horizontal void LineH(int x, int y, int ancho, BYTE color, BYTE *where) { int i; for(i=x; i<=x+ancho; i++) PutPixel(i, y, color, where); } // Dibuja una linea vertical void LineV(int x, int y, int alto, BYTE color, BYTE *where) { int i; for(i=y; i<=y+alto; i++) PutPixel(x, i, color, where); } // Dibuja una linea con cualquier pendiente void Line(int x1, int y1, int x2, int y2, BYTE color, BYTE *where) { int i, s, u, v, dx1, dx2, dy1, dy2, m, n; u=x2-x1; v=y2-y1; dx1=sgn(u); dy1=sgn(v); dx2=sgn(u); dy2=0; m=abs(u); n=abs(v); if(!(m>n)) { dx2=0; dy2=sgn(v); m=abs(v); n=abs(u); } s=m>>2; // s=m/2; for(i=0; i<=m; i++) { PutPixel(x1, y1, color, where); s=s+n; if (!(s255) || (alto>255)) { fclose(f); return MUY_GRANDE; } // Reservamos memoria para la imagen, el ancho y el alto if((*frame=(BYTE *)malloc((ancho*alto)+2))==NULL) { fclose(f); return NO_HAY_MEMORIA; } // Copiamos el ancho y el alto memcpy(*frame, &ancho, 1); memcpy(*frame+1, &alto, 1); // Leemos la imagen fread(*frame+2, sizeof(char), (ancho*alto), f); fclose(f); return OK; } int LoadSprite(char *filename, t_sprite *sprite, BYTE num_frames) { BYTE i, num; int r; char *nombre, *numero; sprite->num_frames=num_frames; // Guardamos total de frames // Inicializamos a cero las coordenadas del sprite sprite->x=sprite->y=0; // Cargaremos cada uno de los frames que forma el sprite for(i=0, num=1; iframe[i])); // Si hubo algun error salimos del for if(r!=1) break; } // Si hubo algun error al cargar algun un frame, liberamos la memoria // reservada hasta ese momento if(r!=1) { if (i!=0) // Si se cargo en memoria al menos un frame... { for(num=0; numframe[num]); } return r; // Retornamos el error producido } // Guardamos el ancho y el alto del sprite memcpy(&(sprite->ancho), &(sprite->frame[0][0]), 1); memcpy(&(sprite->alto), &(sprite->frame[0][1]), 1); return 1; // Todo OK! } void FreeSprite(t_sprite *sprite, BYTE num_frames) { BYTE i; sprite->x=sprite->y=0; sprite->num_frames=0; sprite->ancho=sprite->alto=0; for(i=0; iframe[i]); } void PutSprite(int x, int y, BYTE *frame, BYTE *where) { BYTE ancho=frame[0], alto=frame[1], color; int col, fil, inc=2; for(fil=0; fil0) return(1); if(num<0) return(-1); return(0); } // Devuelve el tama¤o en bytes de un archivo long filesize(FILE *f) { long pos_actual, longitud; pos_actual=ftell(f); fseek(f, 0L, SEEK_END); longitud=ftell(f); fseek(f, pos_actual, SEEK_SET); return longitud; } #endif #else #error COMPILAR CON MODELO COMPACT, LARGE O HUGE #endif