From 37dffcdec3c859e215f060e9c42f4415ea40fa0e Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 8 Sep 2021 21:26:43 +0200 Subject: [PATCH] First commit ~0,10 --- BDATOS/BDATOS.CPP | 781 +++++++++++++++++++++ BDATOS/BDATOS.DSK | Bin 0 -> 2754 bytes BDATOS/BDATOS.EXE | Bin 0 -> 34586 bytes BDATOS/BDATOS.HH | 147 ++++ BDATOS/BDATOS.PRJ | Bin 0 -> 7932 bytes BDATOS/BDATOS.TFA | Bin 0 -> 171 bytes BDATOS/PRUEBA.CPP | 297 ++++++++ G/BACKUP.BAT | 2 + G/BIN/BGI.CPP | 300 ++++++++ G/BIN/DISCO.GIF | Bin 0 -> 6838 bytes G/BIN/DUMMY | 3 + G/BIN/GIF.DSK | Bin 0 -> 2627 bytes G/BIN/GIF.EXE | Bin 0 -> 47842 bytes G/BIN/GIF.PRJ | Bin 0 -> 5665 bytes G/BIN/GIF_LIB.H | 207 ++++++ G/BIN/GIF_LIBC.LIB | Bin 0 -> 31232 bytes G/BIN/GIF_LIBH.LIB | Bin 0 -> 33280 bytes G/BIN/GIF_LIBL.LIB | Bin 0 -> 32256 bytes G/BIN/GIF_LIBM.LIB | Bin 0 -> 28160 bytes G/BIN/GIF_LIBS.LIB | Bin 0 -> 27136 bytes G/BIN/GRAPHBGI.LIB | Bin 0 -> 86016 bytes G/COMPILE.ME | 106 +++ G/DOC/GENERAL.DOC | 22 + G/DOC/GIF2BGI.DOC | 88 +++ G/DOC/GIF2EPSN.DOC | 62 ++ G/DOC/GIF2HERC.DOC | 82 +++ G/DOC/GIF2IRIS.DOC | 30 + G/DOC/GIF2PS.DOC | 42 ++ G/DOC/GIF2RGB.DOC | 36 + G/DOC/GIF2RLE.DOC | 33 + G/DOC/GIF2X11.DOC | 37 + G/DOC/GIFASM.DOC | 35 + G/DOC/GIFBG.DOC | 53 ++ G/DOC/GIFCLIP.DOC | 40 ++ G/DOC/GIFCLRMP.DOC | 38 + G/DOC/GIFCOMB.DOC | 34 + G/DOC/GIFFIX.DOC | 26 + G/DOC/GIFFLIP.DOC | 32 + G/DOC/GIFHISTO.DOC | 43 ++ G/DOC/GIFINTER.DOC | 28 + G/DOC/GIFINTO.DOC | 32 + G/DOC/GIFPOS.DOC | 33 + G/DOC/GIFROTAT.DOC | 40 ++ G/DOC/GIFRSIZE.DOC | 33 + G/DOC/GIFTEXT.DOC | 41 ++ G/DOC/GIFWEDGE.DOC | 32 + G/DOC/GIF_LIB.DOC | 477 +++++++++++++ G/DOC/LIBERROR.DOC | 125 ++++ G/DOC/RAW2GIF.DOC | 36 + G/DOC/RGB2GIF.DOC | 39 ++ G/DOC/RLE2GIF.DOC | 36 + G/DOC/TEXT2GIF.DOC | 48 ++ G/DOS2UNIX | 36 + G/GIF/BGI.EXE | Bin 0 -> 60502 bytes G/GIF/CHERYL.GIF | Bin 0 -> 21504 bytes G/GIF/DISCO.GIF | Bin 0 -> 6838 bytes G/GIF/GIF.EXE | Bin 0 -> 47704 bytes G/GIF/GIF2BGI.EXE | Bin 0 -> 60421 bytes G/GIF/GIF2EPSN.EXE | Bin 0 -> 35664 bytes G/GIF/GIF2HERC.EXE | Bin 0 -> 69114 bytes G/GIF/GIF2PS.EXE | Bin 0 -> 50047 bytes G/GIF/GIF2RGB.EXE | Bin 0 -> 33469 bytes G/GIF/GIFCLRMP.EXE | Bin 0 -> 56269 bytes G/GIF/GIFCOMB.EXE | Bin 0 -> 39805 bytes G/GIF/GIFFIX.EXE | Bin 0 -> 38471 bytes G/GIF/GIFFLIP.EXE | Bin 0 -> 39498 bytes G/GIF/GIFHISTO.EXE | Bin 0 -> 39256 bytes G/GIF/GIFINTER.EXE | Bin 0 -> 38685 bytes G/GIF/GIFINTO.EXE | Bin 0 -> 24615 bytes G/GIF/GIFPOS.EXE | Bin 0 -> 37671 bytes G/GIF/GIFROTAT.EXE | Bin 0 -> 55574 bytes G/GIF/GIFRSIZE.EXE | Bin 0 -> 55218 bytes G/GIF/GIFTEXT.EXE | Bin 0 -> 38201 bytes G/GIF/GIFWEDGE.EXE | Bin 0 -> 37405 bytes G/GIF/HERC2GIF.EXE | Bin 0 -> 23511 bytes G/GIF/PORSCHE.GIF | Bin 0 -> 6144 bytes G/GIF/RAW2GIF.EXE | Bin 0 -> 33261 bytes G/GIF/RGB2GIF.EXE | Bin 0 -> 37736 bytes G/GIF/SOLID2.GIF | Bin 0 -> 18599 bytes G/GIF/TEXT2GIF.EXE | Bin 0 -> 33675 bytes G/LIB/DEV2GIF.C | 512 ++++++++++++++ G/LIB/DGIF_LIB.C | 837 ++++++++++++++++++++++ G/LIB/EGIF_LIB.C | 774 +++++++++++++++++++++ G/LIB/GETARG.C | 632 +++++++++++++++++ G/LIB/GETARG.H | 28 + G/LIB/GIF_ERR.C | 130 ++++ G/LIB/GIF_HASH.C | 155 +++++ G/LIB/GIF_HASH.H | 31 + G/LIB/GIF_LIB.H | 178 +++++ G/LIB/GIF_LIBC.LIB | Bin 0 -> 31232 bytes G/LIB/GIF_LIBC.LST | 39 ++ G/LIB/GIF_LIBH.LIB | Bin 0 -> 33280 bytes G/LIB/GIF_LIBH.LST | 39 ++ G/LIB/GIF_LIBL.LIB | Bin 0 -> 32256 bytes G/LIB/GIF_LIBL.LST | 39 ++ G/LIB/GIF_LIBM.LIB | Bin 0 -> 28160 bytes G/LIB/GIF_LIBM.LST | 39 ++ G/LIB/GIF_LIBS.LIB | Bin 0 -> 27136 bytes G/LIB/GIF_LIBS.LST | 39 ++ G/LIB/MAKEFILE.TC | 63 ++ G/LIB/MAKEFILE.UNX | 72 ++ G/LIB/QPRINTF.C | 55 ++ G/LIB/QUANTIZE.C | 335 +++++++++ G/MAKE-IBM.BAT | 8 + G/MAKE-UNX | 13 + G/MANIFEST | 108 +++ G/PIC/CHERYL.GIF | Bin 0 -> 21504 bytes G/PIC/PORSCHE.GIF | Bin 0 -> 6144 bytes G/PIC/SOLID2.GIF | Bin 0 -> 18599 bytes G/README.1ST | 52 ++ G/SOURCES.GET | 29 + G/TEST-IBM.BAT | 96 +++ G/TEST-UNX | 71 ++ G/UPDATE.NEW | 24 + G/UTIL/GETARG.H | 28 + G/UTIL/GIF2BGI.C | 941 +++++++++++++++++++++++++ G/UTIL/GIF2EPSN.C | 590 ++++++++++++++++ G/UTIL/GIF2HERC.C | 1108 +++++++++++++++++++++++++++++ G/UTIL/GIF2IRIS.C | 283 ++++++++ G/UTIL/GIF2PS.C | 387 +++++++++++ G/UTIL/GIF2RGB.C | 337 +++++++++ G/UTIL/GIF2RLE.C | 276 ++++++++ G/UTIL/GIF2X11.C | 517 ++++++++++++++ G/UTIL/GIFASM.C | 314 +++++++++ G/UTIL/GIFBG.C | 362 ++++++++++ G/UTIL/GIFCLIP.C | 256 +++++++ G/UTIL/GIFCLRMP.C | 279 ++++++++ G/UTIL/GIFCOMB.C | 322 +++++++++ G/UTIL/GIFDEBUG.DSK | Bin 0 -> 133 bytes G/UTIL/GIFDEBUG.PRJ | Bin 0 -> 11417 bytes G/UTIL/GIFFIX.C | 215 ++++++ G/UTIL/GIFFLIP.C | 341 +++++++++ G/UTIL/GIFHISTO.C | 264 +++++++ G/UTIL/GIFINTER.C | 268 +++++++ G/UTIL/GIFINTO.C | 159 +++++ G/UTIL/GIFPOS.C | 202 ++++++ G/UTIL/GIFROTAT.C | 322 +++++++++ G/UTIL/GIFRSIZE.C | 306 ++++++++ G/UTIL/GIFTEXT.C | 459 ++++++++++++ G/UTIL/GIFWEDGE.C | 168 +++++ G/UTIL/GIF_LIB.H | 178 +++++ G/UTIL/HERC2GIF.C | 26 + G/UTIL/M.BAT | 1 + G/UTIL/MAKDEBUG.TC | 72 ++ G/UTIL/MAKEFILE.TC | 158 +++++ G/UTIL/MAKEFILE.UNX | 189 +++++ G/UTIL/RAW2GIF.C | 254 +++++++ G/UTIL/RGB2GIF.C | 292 ++++++++ G/UTIL/RLE2GIF.C | 234 +++++++ G/UTIL/TEXT2GIF.C | 357 ++++++++++ INT_KEY/INT_KEY.ASM | 146 ++++ INT_KEY/INT_KEY.H | 107 +++ MAKE_BOT/MAKE_BO2.CPP | 1546 +++++++++++++++++++++++++++++++++++++++++ MAKE_BOT/MAKE_BOT.CPP | 1523 ++++++++++++++++++++++++++++++++++++++++ MAKE_BOT/MAKE_BOT.H | 163 +++++ MAKE_BOT/MB_2_C.CPP | 493 +++++++++++++ MAKE_BOT/MK_BOT.HLP | 237 +++++++ MODS/DONTYOU.MOD | Bin 0 -> 168280 bytes MODS/EXAMPLE1.C | 24 + MODS/EXAMPLE1.DSK | Bin 0 -> 2104 bytes MODS/EXAMPLE1.EXE | Bin 0 -> 56133 bytes MODS/EXAMPLE1.PRJ | Bin 0 -> 4803 bytes MODS/EXAMPLE2.C | 100 +++ MODS/EXAMPLE2.DSK | Bin 0 -> 1683 bytes MODS/EXAMPLE2.EXE | Bin 0 -> 57258 bytes MODS/EXAMPLE2.PRJ | Bin 0 -> 5026 bytes MODS/MODPLAY.INC | 185 +++++ MODS/MOD_DRV.OBJ | Bin 0 -> 42487 bytes README.md | 9 + WAVPLAV/CIRCUITO.ASC | 27 + WAVPLAV/DAC.CPP | 30 + WAVPLAV/DAC.H | 3 + WAVPLAV/DAC.OBJ | Bin 0 -> 1080 bytes WAVPLAV/LIB.BAT | 2 + WAVPLAV/P.BAT | 1 + WAVPLAV/PLAY.DSK | Bin 0 -> 350 bytes WAVPLAV/PLAY.LIB | Bin 0 -> 13312 bytes WAVPLAV/PLAY.PRJ | Bin 0 -> 5741 bytes WAVPLAV/SB.CPP | 57 ++ WAVPLAV/SB.H | 2 + WAVPLAV/SB.OBJ | Bin 0 -> 1334 bytes WAVPLAV/SPEAKER.CPP | 65 ++ WAVPLAV/SPEAKER.H | 3 + WAVPLAV/SPEAKER.OBJ | Bin 0 -> 1252 bytes WAVPLAV/VOCPLAY.CPP | 406 +++++++++++ WAVPLAV/VOCPLAY.OBJ | Bin 0 -> 8573 bytes WAVPLAV/WAVPLAY.H | 75 ++ WAVPLAV/WAVPLAYC.LIB | Bin 0 -> 13312 bytes 188 files changed, 23679 insertions(+) create mode 100644 BDATOS/BDATOS.CPP create mode 100644 BDATOS/BDATOS.DSK create mode 100644 BDATOS/BDATOS.EXE create mode 100644 BDATOS/BDATOS.HH create mode 100644 BDATOS/BDATOS.PRJ create mode 100644 BDATOS/BDATOS.TFA create mode 100644 BDATOS/PRUEBA.CPP create mode 100644 G/BACKUP.BAT create mode 100644 G/BIN/BGI.CPP create mode 100644 G/BIN/DISCO.GIF create mode 100644 G/BIN/DUMMY create mode 100644 G/BIN/GIF.DSK create mode 100644 G/BIN/GIF.EXE create mode 100644 G/BIN/GIF.PRJ create mode 100644 G/BIN/GIF_LIB.H create mode 100644 G/BIN/GIF_LIBC.LIB create mode 100644 G/BIN/GIF_LIBH.LIB create mode 100644 G/BIN/GIF_LIBL.LIB create mode 100644 G/BIN/GIF_LIBM.LIB create mode 100644 G/BIN/GIF_LIBS.LIB create mode 100644 G/BIN/GRAPHBGI.LIB create mode 100644 G/COMPILE.ME create mode 100644 G/DOC/GENERAL.DOC create mode 100644 G/DOC/GIF2BGI.DOC create mode 100644 G/DOC/GIF2EPSN.DOC create mode 100644 G/DOC/GIF2HERC.DOC create mode 100644 G/DOC/GIF2IRIS.DOC create mode 100644 G/DOC/GIF2PS.DOC create mode 100644 G/DOC/GIF2RGB.DOC create mode 100644 G/DOC/GIF2RLE.DOC create mode 100644 G/DOC/GIF2X11.DOC create mode 100644 G/DOC/GIFASM.DOC create mode 100644 G/DOC/GIFBG.DOC create mode 100644 G/DOC/GIFCLIP.DOC create mode 100644 G/DOC/GIFCLRMP.DOC create mode 100644 G/DOC/GIFCOMB.DOC create mode 100644 G/DOC/GIFFIX.DOC create mode 100644 G/DOC/GIFFLIP.DOC create mode 100644 G/DOC/GIFHISTO.DOC create mode 100644 G/DOC/GIFINTER.DOC create mode 100644 G/DOC/GIFINTO.DOC create mode 100644 G/DOC/GIFPOS.DOC create mode 100644 G/DOC/GIFROTAT.DOC create mode 100644 G/DOC/GIFRSIZE.DOC create mode 100644 G/DOC/GIFTEXT.DOC create mode 100644 G/DOC/GIFWEDGE.DOC create mode 100644 G/DOC/GIF_LIB.DOC create mode 100644 G/DOC/LIBERROR.DOC create mode 100644 G/DOC/RAW2GIF.DOC create mode 100644 G/DOC/RGB2GIF.DOC create mode 100644 G/DOC/RLE2GIF.DOC create mode 100644 G/DOC/TEXT2GIF.DOC create mode 100644 G/DOS2UNIX create mode 100644 G/GIF/BGI.EXE create mode 100644 G/GIF/CHERYL.GIF create mode 100644 G/GIF/DISCO.GIF create mode 100644 G/GIF/GIF.EXE create mode 100644 G/GIF/GIF2BGI.EXE create mode 100644 G/GIF/GIF2EPSN.EXE create mode 100644 G/GIF/GIF2HERC.EXE create mode 100644 G/GIF/GIF2PS.EXE create mode 100644 G/GIF/GIF2RGB.EXE create mode 100644 G/GIF/GIFCLRMP.EXE create mode 100644 G/GIF/GIFCOMB.EXE create mode 100644 G/GIF/GIFFIX.EXE create mode 100644 G/GIF/GIFFLIP.EXE create mode 100644 G/GIF/GIFHISTO.EXE create mode 100644 G/GIF/GIFINTER.EXE create mode 100644 G/GIF/GIFINTO.EXE create mode 100644 G/GIF/GIFPOS.EXE create mode 100644 G/GIF/GIFROTAT.EXE create mode 100644 G/GIF/GIFRSIZE.EXE create mode 100644 G/GIF/GIFTEXT.EXE create mode 100644 G/GIF/GIFWEDGE.EXE create mode 100644 G/GIF/HERC2GIF.EXE create mode 100644 G/GIF/PORSCHE.GIF create mode 100644 G/GIF/RAW2GIF.EXE create mode 100644 G/GIF/RGB2GIF.EXE create mode 100644 G/GIF/SOLID2.GIF create mode 100644 G/GIF/TEXT2GIF.EXE create mode 100644 G/LIB/DEV2GIF.C create mode 100644 G/LIB/DGIF_LIB.C create mode 100644 G/LIB/EGIF_LIB.C create mode 100644 G/LIB/GETARG.C create mode 100644 G/LIB/GETARG.H create mode 100644 G/LIB/GIF_ERR.C create mode 100644 G/LIB/GIF_HASH.C create mode 100644 G/LIB/GIF_HASH.H create mode 100644 G/LIB/GIF_LIB.H create mode 100644 G/LIB/GIF_LIBC.LIB create mode 100644 G/LIB/GIF_LIBC.LST create mode 100644 G/LIB/GIF_LIBH.LIB create mode 100644 G/LIB/GIF_LIBH.LST create mode 100644 G/LIB/GIF_LIBL.LIB create mode 100644 G/LIB/GIF_LIBL.LST create mode 100644 G/LIB/GIF_LIBM.LIB create mode 100644 G/LIB/GIF_LIBM.LST create mode 100644 G/LIB/GIF_LIBS.LIB create mode 100644 G/LIB/GIF_LIBS.LST create mode 100644 G/LIB/MAKEFILE.TC create mode 100644 G/LIB/MAKEFILE.UNX create mode 100644 G/LIB/QPRINTF.C create mode 100644 G/LIB/QUANTIZE.C create mode 100644 G/MAKE-IBM.BAT create mode 100644 G/MAKE-UNX create mode 100644 G/MANIFEST create mode 100644 G/PIC/CHERYL.GIF create mode 100644 G/PIC/PORSCHE.GIF create mode 100644 G/PIC/SOLID2.GIF create mode 100644 G/README.1ST create mode 100644 G/SOURCES.GET create mode 100644 G/TEST-IBM.BAT create mode 100644 G/TEST-UNX create mode 100644 G/UPDATE.NEW create mode 100644 G/UTIL/GETARG.H create mode 100644 G/UTIL/GIF2BGI.C create mode 100644 G/UTIL/GIF2EPSN.C create mode 100644 G/UTIL/GIF2HERC.C create mode 100644 G/UTIL/GIF2IRIS.C create mode 100644 G/UTIL/GIF2PS.C create mode 100644 G/UTIL/GIF2RGB.C create mode 100644 G/UTIL/GIF2RLE.C create mode 100644 G/UTIL/GIF2X11.C create mode 100644 G/UTIL/GIFASM.C create mode 100644 G/UTIL/GIFBG.C create mode 100644 G/UTIL/GIFCLIP.C create mode 100644 G/UTIL/GIFCLRMP.C create mode 100644 G/UTIL/GIFCOMB.C create mode 100644 G/UTIL/GIFDEBUG.DSK create mode 100644 G/UTIL/GIFDEBUG.PRJ create mode 100644 G/UTIL/GIFFIX.C create mode 100644 G/UTIL/GIFFLIP.C create mode 100644 G/UTIL/GIFHISTO.C create mode 100644 G/UTIL/GIFINTER.C create mode 100644 G/UTIL/GIFINTO.C create mode 100644 G/UTIL/GIFPOS.C create mode 100644 G/UTIL/GIFROTAT.C create mode 100644 G/UTIL/GIFRSIZE.C create mode 100644 G/UTIL/GIFTEXT.C create mode 100644 G/UTIL/GIFWEDGE.C create mode 100644 G/UTIL/GIF_LIB.H create mode 100644 G/UTIL/HERC2GIF.C create mode 100644 G/UTIL/M.BAT create mode 100644 G/UTIL/MAKDEBUG.TC create mode 100644 G/UTIL/MAKEFILE.TC create mode 100644 G/UTIL/MAKEFILE.UNX create mode 100644 G/UTIL/RAW2GIF.C create mode 100644 G/UTIL/RGB2GIF.C create mode 100644 G/UTIL/RLE2GIF.C create mode 100644 G/UTIL/TEXT2GIF.C create mode 100644 INT_KEY/INT_KEY.ASM create mode 100644 INT_KEY/INT_KEY.H create mode 100644 MAKE_BOT/MAKE_BO2.CPP create mode 100644 MAKE_BOT/MAKE_BOT.CPP create mode 100644 MAKE_BOT/MAKE_BOT.H create mode 100644 MAKE_BOT/MB_2_C.CPP create mode 100644 MAKE_BOT/MK_BOT.HLP create mode 100644 MODS/DONTYOU.MOD create mode 100644 MODS/EXAMPLE1.C create mode 100644 MODS/EXAMPLE1.DSK create mode 100644 MODS/EXAMPLE1.EXE create mode 100644 MODS/EXAMPLE1.PRJ create mode 100644 MODS/EXAMPLE2.C create mode 100644 MODS/EXAMPLE2.DSK create mode 100644 MODS/EXAMPLE2.EXE create mode 100644 MODS/EXAMPLE2.PRJ create mode 100644 MODS/MODPLAY.INC create mode 100644 MODS/MOD_DRV.OBJ create mode 100644 README.md create mode 100644 WAVPLAV/CIRCUITO.ASC create mode 100644 WAVPLAV/DAC.CPP create mode 100644 WAVPLAV/DAC.H create mode 100644 WAVPLAV/DAC.OBJ create mode 100644 WAVPLAV/LIB.BAT create mode 100644 WAVPLAV/P.BAT create mode 100644 WAVPLAV/PLAY.DSK create mode 100644 WAVPLAV/PLAY.LIB create mode 100644 WAVPLAV/PLAY.PRJ create mode 100644 WAVPLAV/SB.CPP create mode 100644 WAVPLAV/SB.H create mode 100644 WAVPLAV/SB.OBJ create mode 100644 WAVPLAV/SPEAKER.CPP create mode 100644 WAVPLAV/SPEAKER.H create mode 100644 WAVPLAV/SPEAKER.OBJ create mode 100644 WAVPLAV/VOCPLAY.CPP create mode 100644 WAVPLAV/VOCPLAY.OBJ create mode 100644 WAVPLAV/WAVPLAY.H create mode 100644 WAVPLAV/WAVPLAYC.LIB diff --git a/BDATOS/BDATOS.CPP b/BDATOS/BDATOS.CPP new file mode 100644 index 0000000..1c2f39f --- /dev/null +++ b/BDATOS/BDATOS.CPP @@ -0,0 +1,781 @@ +#include +#include +#include +#include + +#define __BDatos_CPP +#include "c:\program\src_dos\libs\bdatos\BDatos.hh" + + +// Ŀ +#define PROG_NAME "BDatos::JD::" +// +#define VER_HI 1 +#define VER_LOW 0 +#define ARCH_LEN 12 + +#define FALSO 0 +#define CIERTO 1 + +typedef struct +{ + char code; + long pos; +} BTree; + + /**************************************************************************\ +| | +| Contructor de Clase | +| | +| Descripcion: | +| Se encarga de poner a cero todas las variables utilizadas | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +BDatos::BDatos() +{ + BDatosHeader.NRegistros = 0; + BDatosHeader.NRegTotal = 0; + BDatosHeader.SizeReg = 0; + BDatosHeader.VerHi = VER_HI; + BDatosHeader.VerLow = VER_LOW; + BDatosHeader.Eof_Code = 26; + + strcpy( BDatosHeader.NBD, "BDatos::JD::" ); + + memset( BDatosHeader.MyHeader.ProgName, 32, sizeof(char)* 15 ); + BDatosHeader.MyHeader.VerHi = 0; + BDatosHeader.MyHeader.VerLow = 0; + + memset( BDatosHeader.MyHeader.Other, 32, sizeof(char)*200 ); + + NRegActual = 0; + lError = 0x00; + *cError = 0x00; + rError = ERROR; +} + + /**************************************************************************\ +| | +| Destructor de clase | +| | +| Descripcion: | +| Finaliza las operaciones pendientes. | +| | +| | +| Entradas: (ninguno) | +| | +| Salidas: (ninguna) | +| | +| | + \**************************************************************************/ +BDatos::~BDatos() +{ + if ( rError == ERROR ) return; + fclose( handle_BDatos ); +} + + + /**************************************************************************\ +| | +| Registros | +| | +| Descripcion: | +| Obtiene el nmero de registros total de la base de datos. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registros | +| | + \**************************************************************************/ +long BDatos::Registros(void) +{ + return BDatosHeader.NRegistros; +} + + /**************************************************************************\ +| | +| NRegTotal | +| | +| Descripcion: | +| Obtiene el nmero de registros total, total del la base. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registros | +| | + \**************************************************************************/ +long BDatos::NRegTotal(void) +{ + return BDatosHeader.NRegTotal; +} + + /**************************************************************************\ +| | +| RegActual | +| | +| Descripcion: | +| Obtiene el nmero de registro actual. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: numero de registro en tratamiento | +| | + \**************************************************************************/ +long BDatos::RegActual(void) +{ + return NRegActual; +} + + /**************************************************************************\ +| | +| AbrirReg | +| | +| Descripcion: | +| Abre los ficheros indices y datos. | +| | +| | +| Entradas: nombre fichero "sin comodines" | +| longitud de un registro "en bytes" | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | +| | + \**************************************************************************/ +int BDatos::AbrirReg(char *file, long sizereg) +{ +// char bdatos[ARCH_LEN]; + char *bdatos; + + BDatosHeader.MyHeader = MyHeader; + + Header NewHeader = BDatosHeader; + + rError = OK; + + bdatos = file; + + if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL ) + { + // Inicializamos una nueva base de datos + if ( (handle_BDatos = fopen( bdatos, "w" ) ) == NULL ) + { + lError = 0x01; ObtenError( lError ); + return (rError = ERROR); + } + + rewind( handle_BDatos ); + BDatosHeader.SizeReg = sizereg; + BDatosHeader.NRegistros = 0; + BDatosHeader.NRegTotal = 0; + fwrite( &BDatosHeader, sizeof( BDatosHeader ), 1, handle_BDatos ); + + fclose( handle_BDatos ); + + if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL ) + { + lError = 0x01; ObtenError( lError ); + return (rError = ERROR); + } + } else { + + rewind( handle_BDatos ); + fread( &BDatosHeader, sizeof(BDatosHeader), 1, handle_BDatos); + + if ( BDatosHeader.SizeReg != sizereg || BDatosHeader.VerHi != NewHeader.VerHi ) + { + lError = 0x03; ObtenError( lError ); + fclose( handle_BDatos ); + return (rError = ERROR); + } + } + + return OK; +} + + /**************************************************************************\ +| | +| CerrarReg | +| | +| Descripcion: | +| Cierra la base de datos. | +| | +| | +| Entradas: (ninguno) | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +void BDatos::CerrarReg( void ) +{ + if ( rError == ERROR ) return; + fclose( handle_BDatos ); + rError = ERROR; +} + + /**************************************************************************\ +| | +| LeeReg | +| | +| Descripcion: | +| Lee el registro de la posicin 'pos' y lo almacena en 'dato' | +| | +| | +| Entradas: puntero a los datos | +| posicion a leer | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +int BDatos::LeeReg( void *dato, long pos ) +{ + BTree inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + if ( pos >= BDatosHeader.NRegistros || pos < 0 ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + NRegActual = pos; + fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + if ( inx.pos < 0 || inx.code != ' ' ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fread ( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| EscribeReg | +| | +| Descripcion: | +| Escribe el registro en la posicin 'pos' de 'dato' | +| | +| | +| Entradas: puntero a los datos | +| posicion a escribir | +| | +| Salidas: OK ( todo va bien ) | +| ERROR ( error ) | +| | + \**************************************************************************/ +int BDatos::EscribeReg( void *dato, long pos ) +{ + BTree inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + if ( pos > BDatosHeader.NRegistros || pos < 0 ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + NRegActual = pos; + fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + if ( inx.pos < 0 || inx.code != ' ' ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| InsReg | +| | +| Descripcion: | +| Inserta un registro, en la posicin 'pos' por arriba o abajo | +| | +| | +| Entradas: puntero a los datos a insertar, posicin, ARRIBA o ABAJO | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::InsReg( void *dato, long pos, char ab ) +{ + BTree inx, old_inx; + unsigned long avance; + + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + // Filtro los datos conflictivos + if ( pos == 0 && BDatosHeader.NRegistros == 1 && ab == ARRIBA ) + { + pos = 1; + } else + if ( pos == (BDatosHeader.NRegistros - 1) && ab == ARRIBA ) + { + pos = BDatosHeader.NRegistros; + } + + BDatosHeader.NRegistros++; + if ( pos > (BDatosHeader.NRegistros-1) || pos < 0 ) +// if ( pos >= (BDatosHeader.NRegistros-1) && BDatosHeader.NRegistros!=1 ) + { + BDatosHeader.NRegistros--; + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + // Si hay fichas eliminadas, utilizamos sus direcciones intermedias. + if ( (BDatosHeader.NRegTotal - ( BDatosHeader.NRegistros - 1 ) ) > 0 ) + { + fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + } else { + old_inx.pos = ( BDatosHeader.NRegistros - 1 ); + BDatosHeader.NRegTotal++; + } + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// Ŀ +// 1 2 5 6 4 3 * * +// +// +// 2 up pos+1 +// Ŀ +// 1 2 * 5 6 4 3 * +// +// 2 down pos +// Ŀ +// 1 * 2 5 6 4 3 * +// + + avance = ( BDatosHeader.NRegistros - 1 ); + while ( avance > ( pos + ab ) ) + { + fseek( handle_BDatos, (long)( ( avance - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx, sizeof( BTree ), 1, handle_BDatos ); + + avance--; + }; + + if ( ( BDatosHeader.NRegistros - 1 ) == 0 ) + fseek( handle_BDatos, sizeof( Header ), SEEK_SET); + else { + ab = ( ( BDatosHeader.NRegistros - 1 ) <= ( pos + ab ) ) ? 0 : ab; + fseek( handle_BDatos, (long)( ( pos + ab ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + } + + NRegActual = ( BDatosHeader.NRegistros - 1 ) == 0 ? 0 : pos + ab; + old_inx.code = ' '; + fwrite( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( ( old_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( dato, BDatosHeader.SizeReg, 1, handle_BDatos ); + + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + return OK; + +} + + + + /**************************************************************************\ +| | +| DelReg | +| | +| Descripcion: | +| Borra un registro, de la posicin 'pos' | +| | +| | +| Entradas: posicin a borrar | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::DelReg( long pos ) +{ + BTree inx, old_inx; + + if ( rError == ERROR ) + { + lError = 0x05; ObtenError( lError ); + return ERROR; + } + + BDatosHeader.NRegistros--; + if ( pos > BDatosHeader.NRegistros || pos < 0) + { + BDatosHeader.NRegistros++; + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + fseek( handle_BDatos, (long)( ( pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + +// |<---------- RegTot ----------->| +// |<----- NRegistros ---->| | +// Ŀ +// 1 2 5 6 4 3 * * +// +// + + unsigned long avance; + + avance = pos; + while ( avance < BDatosHeader.NRegistros ) + { + fseek ( handle_BDatos, (long)( ( avance + 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread ( &inx, sizeof( BTree ), 1, handle_BDatos ); + + fseek ( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx, sizeof( BTree ), 1, handle_BDatos ); + + avance++; + }; + + NRegActual = BDatosHeader.NRegistros == 1 ? 0 : ( BDatosHeader.NRegistros - 1); + fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + + old_inx.code = '*'; + fwrite( &old_inx, sizeof( BTree ), 1, handle_BDatos ); + + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + return OK; +} + + /**************************************************************************\ +| | +| ShortReg | +| | +| Descripcion: | +| Corta el fichero y lo hace mas pequeo. | +| | +| | +| Entradas: (ninguna) | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +int BDatos::ShortReg(void) +{ + long avance, recorrido; + BTree inx, curr_inx; + void *SWAPdatos; + char enc; + + if ( ( BDatosHeader.NRegTotal - BDatosHeader.NRegistros ) <= 0 ) return OK; + + if ( ( SWAPdatos = calloc( 1, BDatosHeader.SizeReg ) ) == NULL ) + { + lError = 0x07; ObtenError( lError ); + return ERROR; + } + + avance = BDatosHeader.NRegTotal-1; + while( avance >= BDatosHeader.NRegistros ) + { + // Obtengo la direccin del campo que est libre y el dato. + fseek( handle_BDatos, (long)( ( avance ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx, sizeof( BTree ), 1, handle_BDatos ); + fread( SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos ); + + // Busco la direccin del indice para la ficha actual. + recorrido = avance; enc = FALSO; + while( recorrido >= 0 && !enc ) + { + fseek( handle_BDatos, (long)( ( recorrido ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &curr_inx, sizeof( BTree ), 1, handle_BDatos ); + if ( curr_inx.pos == avance ) + enc = CIERTO; + else + recorrido--; + } + + // Si alguien de fuera referencia a esa ficha... + if ( enc ) + { + curr_inx.pos = inx.pos; + //Actualizo el indice para comunicarle la nueva posicin. + fseek( handle_BDatos, (long)( ( recorrido ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &curr_inx, sizeof( BTree ), 1, handle_BDatos ); + // Pongo la ficha actual en la direccin libre. + fseek ( handle_BDatos, (long)( ( curr_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET ); + fwrite( SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos ); + } + + avance--; + + }; + + // Actualizo la base de registros + NRegActual = BDatosHeader.NRegistros - 1; + BDatosHeader.NRegTotal = BDatosHeader.NRegistros; + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); + + // Corto todo lo que sobra de fichero + if ( chsize( fileno(handle_BDatos), (long)(sizeof( Header ) + ( BDatosHeader.NRegistros * ( sizeof( BTree ) + BDatosHeader.SizeReg ) )) ) == -1 ) + { + lError = 0x08; ObtenError( lError ); + return OK; // Este error no es del todo grave, pero se avisa. + } + + free( SWAPdatos ); + return OK; +} + + + /**************************************************************************\ +| | +| ObtenError | +| | +| Descripcion: | +| Obtiene el error correspondiente al codigo dado. | +| | +| | +| Entradas: codigo de error | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +void BDatos::ObtenError( int code ) +{ + + switch( code ) + { + case 0x00: + strcpy( cError, "No hay errores" ); + break; + case 0x01: + strcpy( cError, "Imposible inicializar base de datos" ); + break; + case 0x02: + strcpy( cError, "No se puede abrir el fichero" ); + break; + case 0x03: + strcpy( cError, "Version de fich. incompatible" ); + break; + case 0x04: + strcpy( cError, "No se pudo acceder a esa posicin." ); + break; + case 0x05: + strcpy( cError, "No hay base de datos en uso..." ); + break; + case 0x06: + strcpy( cError, "Tamaos de estructuras no coinciden" ); + break; + case 0x07: + strcpy( cError, "Memoria insuficiente. Operacin cancelada" ); + break; + case 0x08: + strcpy( cError, "Acceso de operacion no permitida." ); + break; + } + +} + + + /**************************************************************************\ +| | +| SortReg | +| | +| Descripcion: | +| Ordena la base de datos segn especifique el usuario en su | +| funcin fcmp... | +| | +| Entradas: /**************************************************************\ | +| | fcmp || +| | || +| | Descripcion: || +| | funcin de entrada a SortReg, debe ser realizada || +| | por el usuario y debe ceirse a sus parmetros.. || +| | || +| | Entradas: ptrs. a dos estructuras de usuario. ( ejm. A, B ) || +| | Salidas: >> 0 si A >> B || +| | == 0 si A == B || +| | << 0 si A << B || +| \************************************************************** | +| | +| | +| | +| | +| Salidas: ERROR se cargan los registros con el codigo de error esp. | +| OK todo ha ido bien | +| | + \**************************************************************************/ +int BDatos::SortReg( int (*fcmp)(const void *, const void *) ) +{ + char dev; + + // Pido memoria para mantener dos elementos auxiliares + if ( + ( A = calloc( 1, BDatosHeader.SizeReg ) ) == NULL || + ( B = calloc( 1, BDatosHeader.SizeReg ) ) == NULL + ) + { + lError = 0x07; ObtenError( lError ); + return ERROR; + } + + dev = SortRegi( fcmp, 0, BDatosHeader.NRegistros-1 ); + + free(A); free(B); + + return dev; +} + +int BDatos::SortRegi( int (*fcmp)(const void *, const void *), long izquierda, long derecha ) +{ + BTree inx1, inx2; + register long i, j; + + i = izquierda; j = derecha; + if ( LeeReg( A, (long)(izquierda+derecha)/2 + 1 ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + + do { + if ( LeeReg( B, i )!= OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + while( i < derecha && fcmp( B, A ) < 0 ) + { + i++; + if ( LeeReg( B, i ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + }; + + LeeReg( B, j ); + while( j > izquierda && fcmp( A, B ) < 0 ) + { + j--; + if ( LeeReg( B, j ) != OK ) + { + lError = 0x04; ObtenError( lError ); + return ERROR; + } + }; + + if ( i <= j ) + { + // Intercambiamos solo los indices sin chequear si son + // accesibles, ( si no lo fueran, se abria abortado ) + fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx1, sizeof( BTree ), 1, handle_BDatos ); + fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fread( &inx2, sizeof( BTree ), 1, handle_BDatos ); + + fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx1, sizeof( BTree ), 1, handle_BDatos ); + fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg ) + sizeof( Header ) ), SEEK_SET ); + fwrite( &inx2, sizeof( BTree ), 1, handle_BDatos ); + + i++; j--; + } + + } while( i <= j ); + + if ( izquierda < j ) SortRegi( fcmp, izquierda, j ); + if ( i < derecha ) SortRegi( fcmp, i, derecha ); + + return OK; +} + + + + /**************************************************************************\ +| | +| SalvaDatosUsuario | +| | +| Descripcion: | +| Salva los 256 bytes concedidos al usuario. | +| | +| | +| Entradas: Puntero a los datos del usuario | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +void BDatos::SalvaDatosUsuario( void * Datos ) +{ + // Copio los datos de usuario a mi estructura + memcpy( (void *)BDatosHeader.MyHeader.Other, Datos, sizeof(char)*200 ); + // Guardo estos datos + rewind( handle_BDatos ); + fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos ); +} + + /**************************************************************************\ +| | +| CargaDatosUsuario | +| | +| Descripcion: | +| Carga los datos de usuario, tantos como nos indiquen | +| | +| | +| Entradas: Puntero a los datos del usuario | +| Tamao de los datos a cargar | +| | +| Salidas: (ninguna) | +| | + \**************************************************************************/ +void BDatos::CargaDatosUsuario( void * Datos, unsigned char size ) +{ + // Los datos no tienen que ser cargados, ya que esto se produce al + // abrir el archivo + + // Copio los datos de usuario a mi estructura + memcpy( Datos, (void *)BDatosHeader.MyHeader.Other, size ); + +} \ No newline at end of file diff --git a/BDATOS/BDATOS.DSK b/BDATOS/BDATOS.DSK new file mode 100644 index 0000000000000000000000000000000000000000..e1214c50da23ec8139ce882c0f956412cbecc1ba GIT binary patch literal 2754 zcmb_eT~8B16g^wM8oz@m>Vw@VB7#=XL`_9QyIZ7M+S<}6$ttXLm1=EuDW)2E^vM?! zA;$P4{0;hKjK2BkgMYz9jXvR--7c_nYXRwGIx}}>&%O7|y)!d5Yu+l!ima51WusD- zhw}wPJ^*QZd#7{&*pkD0v;tVbG|poOOGFKiB{M-Km4bw?l7tVe?(!T1K2iNhrL)mU zxVqTA$Qd2NQAt$48~Kw@!aLU0MaVy`7ui4sTd@}!J!xfcC-&noPM{yBaShkeYgyPE z92sHPs^^zP$CrAt-BUwQLQq3mDxJKP4v%V)WI7&BsEQU#DDkWs)s$o+mLv|rda3yt z^&Nyx-EHKr1N0Whsreik9YGvf+I0g{QPV7$DA-MRPA``*trv3zVszlD6UjN-{tIMsXi!~m?eZ-6}=d10+-Oik;!i~N&^vw6eJ>6pVE zG{cW^D&B`PI4khvi?Z!|FhOtgGi8(NR?2NoR?bqhW!2KBwM%|TuUZ-V`>BclFS{oX zIjtY^!5(WS(>ByP6c`FPZ8Mj=X%QbtI7T)AZv-EC@}6nJH{YbdmIO*wE87R1VyuL; zNLaa&O=-i~Xksjy(d;~|Hq{K<$K>enNSZFnx_rQ-W&0dnNE^eCGSvrb(p_M04*nN9 z|B-cdap8OLjWAga!(C9IiswD!8Kv=1ANMlEw;whYB zbPht|ndG&-&KD%H&aYl*H0G9(?Ieh!#%V*i%p?CYO}ky^VDYcKCo^efLQQ70cr3DX ze7Oj4aNX_l17Q$NbqHwTRpkE49<}hYYUUg^$->vvvQVRG*}_SW13c9MGPJe>{3b&w z?h(R5ev?n6pVFf3Nxd|2-XvaJyOO2R%gy_e^5Jv9d&Z9&0X{T5_s8;n4VE#~cGZw; UZ{#k%)y2%%Z*5D;Pr0iq$nPIrR7A%tla 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 + +#define OK 0 +#define ERROR 1 +#define NO_ENC -1 + +#define ARRIBA 1 +#define ABAJO 0 + +#if !defined(__BDatos_CPP) + #ifdef __cplusplus + extern "C" { + #endif +#endif + + typedef struct + { + char ProgName[15]; // Estos datos se comprueban al abrir la base + char VerHi, VerLow; // para saber si es la adecuada para su progr. + + char Other[200]; + } YourHeader; + + typedef struct + { + char NBD[13]; + char Eof_Code; + char VerHi, VerLow; + YourHeader MyHeader; + long NRegistros; + long NRegTotal; + long SizeReg; + } Header; + + class BDatos { + + public: + + char lError; + char cError[80]; + YourHeader MyHeader; + + void ObtenError(int code); // Obtiene el error "code" + long Registros(void); // N de registros + long NRegTotal(void); // N de registros + long RegActual(void); // Reg. Actual + + BDatos(); // Constructor de Clase + ~BDatos(); // Destructor de Clase + int AbrirReg( char *file, long sizereg ); // Abre el Fichero + void SalvaDatosUsuario( void * Datos ); // Salva los 256 bytes de usuario + // Carga los datos de usuario + void CargaDatosUsuario( void * Datos, unsigned char size ); + void CerrarReg( void ); // Cierra el Fich. + int EscribeReg( void *dato, long pos ); // Escribe un Dato + int LeeReg( void *dato, long pos ); // Lee un Dato + int InsReg( void *dato, long pos, char ab ); // Inserta un Reg en pos. + int DelReg( long pos ); // Borra un Reg de pos. + + int ShortReg(void); // Corta el fich. y lo hace mas pequeo + + // Ordena la Base + int SortReg( int (*fcmp)(const void *, const void *) ); + // Busca un registro en una base ordenada + int BuscReg( long PosIni, int (*fcmp)(const void *, const void *) ); + + private: + // Funcion auxiliar de ordenacin + int SortRegi( int (*fcmp)(const void *, const void *), long izquierda, long derecha ); + FILE *handle_BDatos; // Handle a la Base + Header BDatosHeader; + long NRegActual; + char filename[80]; + char rError; + void *A, *B; + }; + + +#if !defined(__BDatos_CPP) + #ifdef __cplusplus + } + #endif +#endif + +#endif + + + +/* + 1 2 3 4 5 6 7 8 9 0 + Ŀ + 2 3 6 9 1 4 5 + + +INS (2_3) + (si existen archivos borrados: " (TotalRecords+1) mark * " coge su posicion ) + + 1 2 3 4 5 6 7 8 9 0 + Ŀ + 2 3 6 9 1 4 5 *X1*X2 + + ^^^^^ + + Ŀ + 2 3 X2 6 9 1 4 5 *X2 + + + (si no existen archivos borrados: coge la posicion de Records + 1 ) + + 1 2 3 4 5 6 7 8 9 0 + Ŀ + 2 3 6 7 1 4 5 + + ^^^^^ + records = 7 + + Ŀ + 2 3 7+1 6 7 1 4 5 + + +DEL (3) + 1 2 3 4 5 6 7 8 9 0 + Ŀ + 2 3 X 6 9 1 4 5 + + ^^^^ /.\ + + Ŀ + 2 3 6 9 1 4 5 *X + + Reg Mark * +*/ + + diff --git a/BDATOS/BDATOS.PRJ b/BDATOS/BDATOS.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..9aeef56f8d8bd84faefebb825583aa851eb5ce8b GIT binary patch literal 7932 zcmeI1>vJ1d6~NEhPU6^g^J*G9X~PW_jvU*vGDUV&&ueTaNF7^uNci7|Ay8U>3QZuvMI^wh zynTuDGVghfw_k3j(I0XC7%9OkoWJ0szvTQCvKd}S-U)B;o;Nw)LPGP~MEC=0!XF9m z5dMUa{!FdEKnuWmfOqNQuY|u5{!Uu#xfW#8@41E7+p+r%!kgTix2X9xHaEj>kS*{Y z>AkoK@egcC|D?HzB0$)Vi6lLlQCUq>C7DK>?3AYhEgpUxq zQMr6>FSdHQnfscsc@ILmm+%R~3?W0v5;Q`NFiV(2z&xQqFsSd-)UpUA!g1<5L9LV2 zx}R{0aGG!i0beDYrOQRaIl_6uX9y1vK8t|QQS0-BFVN)|2@lfcmk3`be1-4`;cJAi z6TU%c*^F36SWnnMXeIPZA%M}TU?P@`MCGaRgc6nGq2N?vGKGgaFsadDly_Jal5O;9j+3it`dh_B@VkvjJZl2 zag_+TO5BNw8;z(bS^3ziyK_AUD2!L9?c|P={FEBK?J4=81)4-h;zE%o9(j zAC;5LgXeH8nPQ$GUc}T1FF7}ajh^F%o@M)d8CLfM{~^Iw%hF_#;&D*Aa*w!_;`d3B$%hswy(vXYt^|_1`)xkjkM!isE`Vqu~E@9 z&=rf((kzxS3c0+VDeA`!tLhRimHZiG-Q9Lvj%n$vX8PjjzHXrfKJKS+3zsJ?^F*w8eyC!44w5yS@bY-OQ^)hxwh(vwlo%hgIPi zE+7Anh?rKgJ!fg!eO`2|kj-n;Lb;E5scw3_uIBckgr%R-j2uqP%d&^{E_Xr2Va#BL zQ}{))XoaHW@rIN6(DC%+|rI=ZW3R&oiEmr)gK+cEMH` zdw3m!UK?|ad^bN_uh>|Jkgvgg+S49(J={NG>P5}YnYFtwqATkDEbbaEiJwz0`zwxX z@zt^N238_iN%y5>=ebS?w4JGRqGN8j&3KrED4Qz@!~$5(qnJ%1dslX2shVq48@~;r zI;aZdOtFN=k!yvB2#O_CT%(0l>NaC!HMFvq?WNw_vRz*5(Le@V&brF9tzs)| zgf{-Fssk?IBd{m80*v51zs2`4!ZM#rRf5wYoCSZPRA;Oiu5ZQ-_@HeazI220#lUEQ z1;zuRfE-8#5&;#jF0c7-KWf|)=p4P5Yi{ws@4v9^%D;nfuBi*%JKSV6;V+4r&nNME z7%t&kyXn93;|BEfS&Rt2Andx>xs`Jp=S`g3IdA6N!PyS) zy!0OHLrNdTbqyM8kE+g~CTw_c=v0Xp`(}IA$-prZ`4mH?(6yiQMaiF4zgT!Y!~1I_`NW(BeVI3FIT literal 0 HcmV?d00001 diff --git a/BDATOS/PRUEBA.CPP b/BDATOS/PRUEBA.CPP new file mode 100644 index 0000000..8fd36ec --- /dev/null +++ b/BDATOS/PRUEBA.CPP @@ -0,0 +1,297 @@ + /*************************************************************************\ +| | +| Programa para probar el buen funcionamiento de la libreria BDatos .(JD) | +| | +| 12.03.96 | + \*************************************************************************/ +#include +#include +#include +#include + +#include "BDatos.hh" + +void Altas(void); +void Bajas(void); +void Listar(void); +void Modificar(void); +void MuestraMenu(void); +int Busca( char *nombre ); +void Insertar_Especial(void); + +void RellenaBase(void); +int fcmp( const void *A, const void *B ); + + +typedef struct +{ + char nombre[15]; + char apellidos[50]; + long DNI; + int Grupo; +} DummyStruct; + +DummyStruct dummy; + +BDatos DummyBase; + +int main(void) +{ + int ok = 0; + + strcpy( DummyBase.MyHeader.ProgName, "Dummy Prog..." ); + DummyBase.MyHeader.VerHi = 1; + DummyBase.MyHeader.VerLow = 0; + if ( DummyBase.AbrirReg( "dummy.fil", sizeof( DummyStruct ) ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + return 1; + } + + do + { + MuestraMenu(); + switch( getch() ) + { + // Altas + case '1': + Altas(); + break; + // Bajas + case '2': + Bajas(); + break; + // Modificaciones + case '3': + Modificar(); + break; + // Listar + case '4': + Listar(); + break; + // CortarRegistros + case '5': + DummyBase.ShortReg(); + break; + // Altas + case '6': + Insertar_Especial(); + break; + // Ordena la base segun nombre + case '7': + DummyBase.SortReg( fcmp ); + break; + case '8': + RellenaBase(); + break; + + // Fin + case '0': + ok = 1; + break; + + }; + }while( !ok ); + + DummyBase.CerrarReg(); + + return 0; +} + +void MuestraMenu(void) +{ + clrscr(); + cprintf(" M E N P R I N C I P A L \r\n"); + cprintf("-------------------------------\r\n"); + + cprintf(" 1 Altas nReg: %ld \r\n", DummyBase.Registros() ); + cprintf(" 2 Bajas nRegT: %ld \r\n", DummyBase.NRegTotal() ); + cprintf(" 3 Modificaciones CReg: %ld \r\n", DummyBase.RegActual() ); + cprintf(" 4 Listar --- \r\n"); + cprintf(" 5 Cortar Fichero _- J.D -_\r\n"); + cprintf(" -_ F.V _-\r\n"); + cprintf(" 0 Salir al DOS --- \r\n"); + cprintf(" F R i \r\n"); + cprintf(" 6 Ins. Especial u e S \r\n"); + cprintf(" 7 Ordenar Campo T N i \r\n"); + cprintf(" u O V \r\n"); +} + +void RellenaBase(void) +{ + int ficha; + + cprintf("\r\nRellenando base con 800 fichas. Por favor, espere..."); + + for( ficha=0; ficha<800; ficha++ ) + { + sprintf( dummy.nombre, "P%03d", (800-ficha) ); + sprintf( dummy.apellidos, "P%03d", ficha ); + dummy.DNI = ficha; + dummy.Grupo = ficha; + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, ficha, ARRIBA ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + } +} + +void Altas(void) +{ + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, DummyBase.Registros(), ARRIBA ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } +} + +void Insertar_Especial(void) +{ + int PorDonde, Adonde; + + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + fflush(stdin); + + cprintf("\r\nIntroduzca donde y por donde insertar (1==ARRIBA)(0==ABAJO): "); + scanf( "%d %d", &Adonde, &PorDonde ); + fflush(stdin); + + PorDonde = ( PorDonde == 1 ) ? ARRIBA : ABAJO ; + + // Inserta un Reg por arriba de pos. + if ( DummyBase.InsReg( (void *)&dummy, Adonde, PorDonde ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + + cprintf("\r\nRegistros aun abiertos, condicin metaestable"); + } +} + +void Bajas(void) +{ + char nombTMP[80]; + cprintf("\r\nIntroduzca nombre a eliminar: "); + scanf( "%14s", nombTMP ); + + if ( Busca( nombTMP ) != OK ) + { + cprintf( "\r\nFichero no se encuentra en la base" ); + getch(); + return; + } + + if ( DummyBase.LeeReg( (void *)&dummy, DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + + cprintf( "%14s %40s %5ld %5d\n\r", dummy.nombre, dummy.apellidos, dummy.DNI, dummy.Grupo ); + + if ( getch() == 32 ) return; + + // Borra el registro de la posicion actual + if ( DummyBase.DelReg( DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } +} + +void Modificar(void) +{ + char nombTMP[80]; + + cprintf("\r\nIntroduzca nombre a modificar: "); + scanf( "%14s", nombTMP ); + + if ( Busca( nombTMP ) != OK ) + { + cprintf( "\r\nFichero no se encuentra en la base" ); + getch(); + return; + } + + + cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n"); + scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo ); + + // Escribe el Reg en la base + if ( DummyBase.EscribeReg( (void *)&dummy, DummyBase.RegActual() ) != OK ) + { + cprintf("\r\nSe producio un error: %d", DummyBase.lError ); + cprintf("\r\n%s\r\n", DummyBase.cError ); + DummyBase.CerrarReg(); + exit(1); + } + +} + +void Listar( void ) +{ + int i; + cprintf( " Nombre Apelidos D.N.I Grupo \n\r" ); + cprintf( "------------------------------------------------------------------------------\n\r" ); + + + for( i=0; i nombre, ((DummyStruct *)B) -> nombre ); +} + diff --git a/G/BACKUP.BAT b/G/BACKUP.BAT new file mode 100644 index 0000000..232f8b9 --- /dev/null +++ b/G/BACKUP.BAT @@ -0,0 +1,2 @@ +pkzip -ex -rp -u \programs.my\c\gif_lib -x*.sym -x*.obj -x*.bak -x*.exe -x*.lib -x*.lst *.* + \ No newline at end of file diff --git a/G/BIN/BGI.CPP b/G/BIN/BGI.CPP new file mode 100644 index 0000000..e22dcb3 --- /dev/null +++ b/G/BIN/BGI.CPP @@ -0,0 +1,300 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gif_lib.h" + +#define ARCHIVO_Abrir 10 +#define ARCHIVO_Cerrar 11 +#define MEMORIA 50 +#define DECODING 60 +#define TAMANYO 70 +#define DESCRIPCION 80 +#define OK 00 + + +typedef unsigned char DacPalette256[256][3]; +void setvgapalette256(DacPalette256 *PalBuf); + +extern int far _Cdecl Svga256_fdriver[]; +int huge DetectVGA256(){ return 2; } + +int MuestraGif( char *file, int PosX, int PosY ); + +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ + + + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ +/* Make some variables global, so we could access them faster: */ + int GraphDriver, GraphMode; + char Str[80]; + + + struct text_info TextInfo; /* So we can restore starting text mode. */ + + installuserdriver("Svga256",DetectVGA256); + + gettextinfo(&TextInfo); /* Save current mode so we can recover. */ + + + GraphDriver = DETECT; + initgraph(&GraphDriver, &GraphMode, ""); + + MuestraGif( argv[1], 0, 0 ); + + while( !kbhit() ); + + closegraph(); + + textmode(TextInfo.currmode); +} + + + /**************************************************************************\ +|* *| +|* MuestraGif *| +|* *| +|* Descripcion: *| +|* Dado el nombre del .GIF, y la posicin de inicio fsica *| +|* decodifica y muestra est en pantalla... *| +|* *| +|* Entradas: *| +|* Nombre de Archivo, Posiciones iniciales X, Y *| +|* Salidas: *| +|* OK *| +|* Cdigos de Errores *| +|* *| + \*************************************************************************/ +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +int MuestraGif( char *file, int PosX, int PosY ) +{ + // int k, sum; + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, + ColorMapSize; + DacPalette256 Palette256; + int + RecX, + // ImageNum = 0, + // BackGround = 0, + // ForeGround = 1, /* As close to white as possible. */ + MaximumScreenHeight, + // DeviceMaxX = 640, DeviceMaxY = 400, /* Physical device dimensions. */ + // ScreenWidth = 320, ScreenHeight = 200, /* Gif image screen size. */ + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ + GifColorType + *ColorMap; + + GifRecordType RecordType; + GifByteType *Extension; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((GifFile = DGifOpenFileName( file )) == NULL) + { + return ARCHIVO_Abrir; + } + + if ((ScreenBuffer = (GifRowType *) + malloc( sizeof(GifRowType *))) == NULL) + return MEMORIA; + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes of one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + { + free( ScreenBuffer ); + return MEMORIA; + } + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + + MaximumScreenHeight = GifFile -> SHeight - 1; + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) + break; + + switch (RecordType) + { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) + return DESCRIPCION; + + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) + { + free( ScreenBuffer[0] ); + free( ScreenBuffer ); + return TAMANYO; + } + + if (GifFile -> IInterlace) + { + /* Need to perform 4 passes on the images: */ + for ( i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) + { + if (DGifGetLine(GifFile, + &ScreenBuffer[/*MIN(j, MaximumScreenHeight)*/0][Col], + Width) == GIF_ERROR) + { + free( ScreenBuffer[0] ); + free( ScreenBuffer ); + return DECODING; + } + + ///////////////////////////////////////////////// + ///Procesa linea obtenida//////////////////////// + ///////////////////////////////////////////////// + for ( i = 0; i < Width; i ++ ) + putpixel( RecX+PosX, j+PosY, ScreenBuffer[/*MIN(j, MaximumScreenHeight)*/0][RecX] ); + ///////////////////////////////////////////////// + ///////////////////////////////////////////////// + } + } + else { + for (i = 0; i < Height; i++, Row++) + { + if (DGifGetLine(GifFile, &ScreenBuffer[/*MIN(Row, MaximumScreenHeight)*/0][Col], + Width) == GIF_ERROR) + { + MaximumScreenHeight = MIN(i - 1, MaximumScreenHeight); + } + ///////////////////////////////////////////////// + ///Procesa linea obtenida//////////////////////// + ///////////////////////////////////////////////// + for ( RecX = 0; RecX < Width; RecX ++ ) + putpixel( RecX+PosX, Row+PosY, ScreenBuffer[/*MIN(j, MaximumScreenHeight)*/0][RecX] ); + ///////////////////////////////////////////////// + ///////////////////////////////////////////////// + + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) + { + free( ScreenBuffer[0] ); + free( ScreenBuffer ); + return DECODING; + } + + while (Extension != NULL) + { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) + { + free( ScreenBuffer[0] ); + free( ScreenBuffer ); + return DECODING; + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + + /* Initialize hardware pallete and also select fore/background color. */ + /* + Sum = ((int) ColorMap[1].Red) + + ((int) ColorMap[1].Green) + + ((int) ColorMap[1].Blue); + j = k = Sum; + */ + for (i = 0; i < ColorMapSize; i++) + { + + Palette256[i][0] = ColorMap[i].Red >> 2; + Palette256[i][1] = ColorMap[i].Green >> 2; + Palette256[i][2] = ColorMap[i].Blue >> 2; + /* + Sum = ((int) ColorMap[i].Red) + + ((int) ColorMap[i].Green) + + ((int) ColorMap[i].Blue); + + if (i != 0 && Sum > j) // * Dont use color 0. * + { + ForeGround = i; + j = Sum; + } + if (i != 0 && Sum <= k) // * Dont use color 0. * + { + BackGround = i; + k = Sum; + } + */ + } + setvgapalette256( &Palette256 ); + /* + ScreenWidth = GifFile -> SWidth; + ScreenHeight = MIN(GifFile -> SHeight, MaximumScreenHeight); + */ + if (DGifCloseFile(GifFile) == GIF_ERROR) + { + free( ScreenBuffer[0] ); + free( ScreenBuffer ); +// closegraph(); + return ARCHIVO_Cerrar; + } + + free( ScreenBuffer[0] ); + free( ScreenBuffer ); + + return OK; +} + + +/* Setvgapalette256 sets the entire 256 color palette */ +/* PalBuf contains RGB values for all 256 colors */ +/* R,G,B values range from 0 to 63 */ +/* Usage: */ +/* DacPalette256 dac256; */ +/* */ +/* setvgapalette256(&dac256); */ +void setvgapalette256(DacPalette256 *PalBuf) +{ + struct REGPACK reg; + + reg.r_ax = 0x1012; + reg.r_bx = 0; + reg.r_cx = 256; + reg.r_es = FP_SEG(PalBuf); + reg.r_dx = FP_OFF(PalBuf); + intr(0x10,®); +} diff --git a/G/BIN/DISCO.GIF b/G/BIN/DISCO.GIF new file mode 100644 index 0000000000000000000000000000000000000000..f3d6b76229838a0ccf4821ca4690cd832722fdd2 GIT binary patch literal 6838 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 X9BE@skljyOlWu16>>r~1qa)xSY$dK| literal 0 HcmV?d00001 diff --git a/G/BIN/GIF.EXE b/G/BIN/GIF.EXE new file mode 100644 index 0000000000000000000000000000000000000000..cab0bf5a9557560ec5a14a22cbf622b85316e46b GIT binary patch literal 47842 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 z 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 K7uL=mlK%!Ke!AHJ literal 0 HcmV?d00001 diff --git a/G/BIN/GIF.PRJ b/G/BIN/GIF.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..533e691c5f1b51d54baff5364ce858750eb7e33c GIT binary patch literal 5665 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

S^ygDx`F-{1h>w*fGd4g>9V zSkGF#0dx|rtv*4{Ns$xZhMN;3ybu*F8iN=o`q6c*=p!)g8BD0khsCA zbL3SCWl@L`pdadObT)Zv8mbD|FGgCf=wwbLOQ_MA7GsMe}8{U50v2LxopRB z2E~2G3dzA&81Z)#W3!6)FgBHSrs`KZ=H;7Gb#YAIJZqMI#hiX6UA_q)n$a$Oi(fmJ zZ;HdXnkp$E=bO^?baa~>-kYL_6Boh(I+a89+up=gaFic?%SDIM9dJ)2e}D2RrhRTQ z>60sfW|k+j?(?h$ONTjR!1dSl*Gc1xzrxLo<$s5*_!_%`UCkIYU+K@kk=35NXV$}Z z?US&1SZt~K=dbdfVyVz2=BBuLkDKk98Cf38;NoLT^TIf`iHiW^GsQTH`KFQI_moC{ zXB1kRqi)ZS)ZfN=s5M1!UwmksddX{*=<=@$ct~e*4RD z_vErKqqZB^nu`jjewR&WT?pOIZe1ptK%%Y9-+0s}RJ!vXv2f#S7;EKWtz_`E8Nb02 zBRck#lYCUMUZI?;-D#O`nxwCGZY+>*8tWrSPoeLVzuELuVqD{x$>o0K@{5RS*51i=NDR&6)G~&Ue1o`S#=(#?~=rV%onA@yxnlp?tmTR>|Kq0hwv;`8UpT+)`ar zSyWZxn19t(j;ze#i@aD9bGVS<@BBn>+E<2~!u$ zz9(9WQ1au>|M=hoc$if+2*>7%P%Smmv(%v@z{%G7$|JXcT3Yl_yaswhThUL9TYwVslS>daMxO*6IT zr=6?$!m6^0%F@hLzvc6q__%d^Jm$2pvSMZCsymykjGd-ss&B$_g*MR|92Leq`1qBK zC2DI{=w7(OZJxh$!NN$+f_d(FHfi3nLW%^Ru(BC%#EB*$AF)LTm^n`P@}}=Fn^d@X z#ggTV=Q1l|3vQL?vN46Oin7H;wVs7FHPtmNsc<3E^DC=sOC|J?CGvEh*R!~ys+5h@ zQ@5@zDlc77T3gIg^{hLKYf4M2c%E8q>6+3iY9qI3bt$tJuI3BI;tI=9k68*UsysK& zVy#=!855EV7kF2%QCqkk-^b{Gwasi67+W4V<~x=s=V!Dswt0V`A+ba1W2{3u#aKYH z=UAEN>c$BbVSB5hOerh~ zynk<3^a~sC1v4|Nt!`6WoyI~peG#pSF|AHuq4yZ?s~AoiZO63XY8}IHx2a7e(r_=z z5t%0=d}XvTjM*7YVa$dZc;|vr?7ZDYMMH5+2GdJA#ENb*GiOe(i-+ zEcMk{JF;HOTh=PDJZev?hA3~{P&qAOhxan2ZcwQk&|WudjXjI~>I<4RXvpddFO{`= zYp|bvL5uofdNbzp_EEMd1=^p?PETa(e(tqoTkNc6TTCOewV%S3OFm;#h*LK++roE=_v{#tA(_YfEu{wV=vnM|}^JLz#tQ~)_vAku< zEE}JCK5JjSn?Ld*^!*X2v>uzy(H`2dFcoun&$(DAXTWm)g zyGvzj`#p%SKyV{0LEe{STl);ery)L0j&DyvoVmreK7^A9M-dJq97NcU@ESrV!cK&j z5q^*GEW!^F9!J=M(1h>}gbIX0gs&ppiGc65Wg~nU!HF;#AsqqVY_q$?U_Zjg2>50Y z-wf_SXh+zA@CStL2u~xlAbb~LGXmx%xCY@qgc5`T1dK1Z%q@1JP4l+51c8~ua{>jY zHv`)_o2^ZfqDZH+ln$wX0}DHvC1pE%Nb2{PpBKX7^DJ0kF%=9ro2-g7u(zt;= z6qcuLBRhTXV6(IzUsOTe#@4+?pl)F`ug0{K*e)H}*dZNbY~+?ktSp?p@{@s#L>5T0 zGv6zUZ=aIA&+E;8#d|+`yIkuz|DwO{_&Gj0yyn@y7}>~Ad&lsNyj7bl<5m>agO5*+ zUjouFU^v?9al9lT4Njr6$J(-l^>oRmo#h&$YLeHIY0*A5* zNGHe%-3R3a4n?Tf{avJGSquU)gG&*tZt=No2bsv2f`0-l0p6t`69VR$^w$s=`vv}E zzxW0H;SWTY(?13OEk`3fh6kdIf%Yt1eCsXC<}Leb{H?bv$(!$R$fY&471dRa>oTvO z>4&W4-E_lDhr@B*tl8IIJNw$}>@((H;h0~&W^GMH z`6>^JZ@kG7`=%oojTBd}UR_#KTv1f%@Ya?(s;es3X4={0mN?d(Hhth(pJ@h(n?ymyV9=j1bHh zNOg{i8vlFJ*R^YF@2T|^c`{c$JGzmU6<2vczS~Dv`@*R4T2Do7(KlPHZI&59w?j}ei6ax94S>xoGJ5fSNYHod{(iAZ0* z?9N4VReF7KB*rOsdm&NmDz!eguyEl66}6t)Md+BjXe9`CWZha-TUz6ZW~CGs&aW&j zs)^<#Q>6++6e+<$1)${|`r zsCd(egW3TS9$jHsuYuw#xVKB*iXIR(O$m+H(parJODo%uCu_&DIit0OMN*)x`~1?W zRyLOiW0huBiEOQUV(X=m6J4X!6Lxyjqg}9SU7%AdSTK;a!|8XWA%aJ$`bbe9N$Mj} zeSkWkDmL|DQ6FaY0a^!TR{W(7q1I%lKYx;1HUZIeoef9^0XjzKBg}b3>?^ZkG82bp znD5HoMv>pTL4@i9h z`4sXqkUyF7JFJ4*XI|<1mkLh*BM#y0vl{IzSY>%IAPr36{3%vhUEx*}#?9%8ACF;i zCQM3lWXb`dZd-fh8MgglZ zr~w_dfZ4)YyRg)eZQtDMk#shraOs%(DsUuARq zFY$a9VIz2!)!|lQ_Rpig-Tq!5_8dfhv4WHh1Fv?w910?qA7cx;M#*!AC$n zHpr=+_v4BF1(%}EBGkD_9@jlZ9@lAci&l=x%=&0uVv{s*zUd;djsbLt#n&K9(xD)` zz44pWj4xS4mXUBa04`9-h=6Nmo*De*#z{&|M!nVPYn;I93|}O9!Kh&w+y(%THi-() zz*vCBM*6r4!a!(!o*uNyo>- zz#iDnHHm}$1VH}qH|*`w>6ykU2XqdDP(!&=XV+m zW#BI7(w@4@zNcAAGb{EzP4a0&i`27Wy;Iv6wtv!x?jN2J-9G?2HRp=}I;@cjbhJF_ zSe^;qOATvf#C378;Nwd+2RfdFtRrRFlbYaz28=TbD~C1XoSm4+rAHXL5tuDeEF25W z12|%W1*d_9&x&Rf6fe$1^tLexpQp-KxF(?Q6Py$AGy=uxtDYe6S@RW6V%oG#=d}*%XY^JOxR}>O{b065<}^Bx(|)<1r~?iShHga$fVBMJsO5mm!i}qY5jvZgbuxE8_`W0ZG%8r8>sJC6cVDnKJWD7 zgM4!M1_5J$X|P3`w2Uwjv@L*-6Qo4XtpxGf7y-CAXt#rERfl4jY65C!^Z4JhTe5e0 zz7~Z6e&|s5!?(9f3I-c#jGCZ;6JCi-7>Uje6CZh--s^BpVhn#LFcvc>c69&&$&w)1 zyjC1JDg+tMte9%H9;Ei zT+craTGW~F$fbhkBL3MIL7yrwIs_e(RcUuLWfWsU1P{_&FM|}`Fv563L^K~UQ>ID9 znk5T>7!&t`ZC^i$F*y=y6(b8X7+n~Vd2M#FwG3sq19ds@oG6LWHunE#c)B=(i zd24?bnN%uocR2_J;2oS|X3TJN?%=+6sDzX6{QyhLTr~-U7T~^d0Z(1$R>(F4x>h(FGLayJtdW)aKLk@4V=r-SjrcD}j@)&}9OzU7r$~ zD1_3HPz#%+PhF6izhL8F-dynMi!3kjugjji`>UqTaR>Yb1O8lSmsE{VACy(vZm?k? z5_YV!1nLGuyO^xheXP`-+!`I0;mGF0QdN-6(x=;5fOmUiqg_c}S519VXj(?~J|6*J zr;}J5tP_UsGGo~&iM2XuSS!i`dN%ag9CoO0*qw@t&b(oxvS&9Wtv7`Z;rzkt^_W5W zzyuIelb|@*IO=iIdrCb}$*4xv%2Lpo(N#5)Upiob1OAi1HYzLyoqU3Y?^NL=ZMuS` zlq_)$$OLS8l&KvzTaTo0QV8HDW`SA8X3S5=K+`lRpd5%LFoB#)^;M^0hgiUcq_W0m zD8`{4-5%Srp7rj760FrNbU~5SQ37;zFVNK;prUR<{CdQlh$kR!1}f@@vg=jZvis*y za1{eR-GjV5x6pnW;*$|i0o8O$j_c`>#a*P7S`1XR5Def=$e$)#yT1)o^;MuCLPt;< z{bt)KD2-CiH%d&)x4_tjnpx-(sFFczS^y}i9F!>@?@DvV=X2I1KwxBX3a-?@=QP^Z z^JxrluFRS3N?LcxMny?(98cd?T#3#=1m$2QTuFg;P^|`%Y-2+bU+ixJ*VvsK<}lA( zmB{79!YBxdu|o(6l6Bdg?N)*mXsUtkMxaE9hG-b}V)*N79~7_a3+jV9h`}B7Y{Fph zH0^JO1g6PK2j#t8%`G>vHfWM|wE{Grfjq#2_-e$zhIlsOUqXC}oYeUrIKjRn3*8Uk zM7vQIyT`kQGuxga%@Gq!*5oO38Wk82vF{=LcToDE4>#UW#OhbFn_A*o_Zaj(-Yp7E z5H}wY33Zk|6zIC1UnHq&qZM(D&#PAUbnItH<8#cyK8tN9 zqVajr%QdZERW8{%wxPZr3zE^q#KNQ8hldGxm<*dwQX! z@i`sQ`1p=#Oirt?0c4ATUm_AdM^TKDrcza#LUcUI1@R4#y<(I{PSf;9fniFWr(={l z$Nkc=AxfR&O5HJy7#*V2Aq`Nh`eC&}sndGdJe^N~9^_-cbP{z98kE&I1C2yuRD%*M zI2DjS4#-4VYFd#~u^JuHi$Kaxqy*8Ako%tuNXG;6G2~y0d`^FMz>ZQS5HAHm=4iD< zxWazDV~IHy=D9w4)Rv)7oIb?-VFF>%HF6Kzr9npW60rXLc^R!giKX;3Kn@WT(DZhx&9if6Z-XJlLl#eJ|8Y0~W?;0b*@oc56w&$G&8;HWm|8q zY;XSv1pHAD@PCzUyCFZ={VfpnYmirga4X~z*Wft=<>_()Wr7iblTjaXWM5cSeR+-vr%$olxE;CH>WkQplSbN(hD^hDG~`CNquTo?bu_lf85^sjiNUxABMiO+xJEvqPt(xUg9Ake`k|qjj6O_;hK5AC z8NSm>&7^u940VS0D+zS@`w$Bm^e^96^)FamZw|FZ?IgG|yqDv&8qg^TkX$N8_uBMU zU?7kn4SL@syu_Q;3pjc@yX;X_H$?aL!IpW1R1Z&z*)Bfr%i%|F6n;?%i_y?j4|@ev8n8uue{B zccE-9!dQq)KLB=m8`x<#Y-!dZ4hpJgm2BHJ8&nm{_$5`jgx6e9^uUmVVqou~#HUyaG1z@zY}Sh5)Lihgrh`y3Vf#Sc)MRz>q5=`R zly!$fvZ$RvA1HN)xBd&nt(;*qkb}Uz+0tomCT#2$Wp{YTsNdkUfsqlsKgx%>LQLdu z^?Qpt!1A&%%#{Xdj*e(^q)3As8)%w7R9mBEI;<`e4S-Zel!UDRuwkhv3rlslRZKyQ zMj86Ppnhn5G9RAGQn^ARW$Pc@I7dwJ-a}16pdUA=WJ?3yS>So0kmDNUQ%c=YrS8bq z=egDefJ5^|hYDUOv~QMoCLjk2g=7?EOZ^SjjSYR6jUbv$jN z=pcxsdOX3@^)3c;*94Ta5h!V?TiEq0ppds@TPL2u`+!2A+38*e6azHUxa|>>a4LBu zAo0WzguK78;gp!-xnG-&z3*+7j+zPpoV0IX{bHQd%SWEhA=4P1&Z|MW7dz`is_{8J zr7HZMhDQ0Y`blg|fI&U+4pA;xGlY=sS-ZlCft@tj7C>5He72m}U<+(>pQq7{qLXSWRR`#?JF~6cYYcQ<(vjt-)lH?>#n=)+GQUNYJFJQl2D}qZ z2pq=WzD{e5XLIC5rL-$ZJ3f-qI|kQkCwTZybVA|Ew`m&VM=C~DH1izv;;;&W%t-GP zr<}50BLv;NRJD1fcswL#@njAS1*0pSD;i6W3$gTbz5#`2z|#!*F#g z9#zjqnnaCqIjfG$pj_jJC&@lZOiJA*D<4ih!U||ERy;yE@4>ep4?Fk-cJLt( z8UF&dr(71=7xT-7V$a9e)q6oSTnC~7<{rCJv8!?6k60Tr3F&sbg(=&fCq)`gWBe0v zgWt-M*%UU1HRA4-A}A)ssw8WgssGZeR5dF}xhF4N#vZ0iRk$;mqiNKlDlpQB?TFs0 z;$z}}NWVsdSTyg>MHh`$zg9fkc~SIQPVwIV75cSN`7ijNtT5BT#Go*XWW^}V{+$$N zKN6rY`wl70nn+>x$fg;FOI3!OR{XXTt~W(5GF_)>X@=ggI>p$}^`ap+t>Cv{o~Gg& za^q?NWB;jX#fIFxVrG@iQ2npI^jbayKbPw_8;c2}?imq3 z!(YrDdCP9ibxVs!gPzG>%)dSTTzdTdYjC;J1Aj3;y}+xRS7~=;N9QqSR8|L3w=1J- zTz45Ws>Wf`P*j6kq+3V4MG868X*%de^68?@YZRX)>Nzp!>^4GY%NWqvyM)d}LT6(( zO=0ncb+zgw!>LNy8n34oS#*iBv}koLOWOhhQAnUGqjzYvaIcUQ_hJ&y^x_(49<332 z_sTXIBnDxkjmN&pR7?Wl=O*rH!}k@`@LsFp9u=>oKl<>xsO>YDs=U@2Bri4Osv^ZF zTPCt@33tnH#^$(DHg#Vs3qjmL?}XirZ<~c%3b7U19qb6m5CHu|v%dlS(bieGY}vBW z!e0r1nfui#t*OZ@zWN^*{%A8@h?5{~q6`3~=fnV%OaS!}osaVfpw5T@sMJmAxaM1? zL5cy6Zrp-ih{n6e00zy-0C;Aet%4hBH>`p%R=1hSVkF7TbPAodVzOu5~6#$0C#eM#8+UZ(Q14+Y=wc!CYc0B3fFB~Yu}1`$imK74h0vo~6kq#> z7Ht>852)qu3*jm?#>8-m8p{yFcd0Rp5YAI$*Jk3eI#;`tTGD>Nb6sRmD+jfIN=iE za^X55TUaP86}~DI3#)~CVGH{K`zd>Yz06Lw{FSxg&Q9BZAcPS@2p=N6kAQnXZSNwy zjqq0lD23W^x2Nq5gx3-FA?$_Xr%e{xUcu@6FS6JMQEuDsa0>qndCws4N67mD^425N zB2*xdo0a7VwTIw5MZ1id=UXoF@irvfEyRM zRuSMr1tKioo zzoNvm%5kM*Q7Jj`;Qge|ahC!`=x9yp{oaZi3<^F8s%zFVwfkl2KxdRx)PCJj1_y6* zt}qOdJ0>uW&lQ;nM}1MPqpI4&CkU;Up=+u`gXjz`!^jO%cb~bzp4u+D1NV9O7zQ~L z(c%#{PmSDl{xEW*x7ZEz7iwu7CGFsuXO_>FQKTrT#8APmxdz0ox zf&Q?tG(l-dfPfT=sSR@+jVDP~x?!z2-E*H7o9g+RQV08)N!nfEttYq*4J5>nC|jM1 zRb}Ssns#uCC0Li_44ADDKDWXI7fu|MIyeOxRudKhPUVKJ^HqbFEG0Y}(q-O-tG%%Q zvY-pfRPXd3i!1;I;4>EHPbZ-^#M$!(gP<&-3=&%7NdItemn+Z_D=Z<8A2q*$p@w!N z1opTQ)n}4(L!)@LCk_(du$Z-jYc-KK=W0(nZg&UdB<))y5mrrU`oh-+3sN=xU6OOQ zOYp*0E!DZ<0b#lav%q6hy;=-yPl9(a7+PwB*QTEL>BX}Z4EeUGeH)EG?{GHFg&;c> z4@kGEA8_Z!ml3u@r@wPP_cCWE=sR_+vWLPQ2b^Q?LMmbGd`t`#nsSy?^czCX3VOaQgch4} zYS}X_e%1wjeD9;MPD+E44a8sj+Yrfj%fjw|hIqal>0%LincQdpCFt< zI0@pj7ewhd5hPjY!JQZG!|ytj%|rl!*ft$?Cd-z#afpN1+=XjY-G75f2)9GKS0h{| zi=7E>@dQUnX7uj&V&k}+GV145Voo(Z-(;a{OgUcWS(5Vrr5|CTDI+b9x(_m16IdSK zC4^sYaQdufxcgB&*dt%ksrf*E=xwgh7_z{63rVAC;i+@AFm^O8+(Diw^cr-11?_4cR8BGg!o~wn+M$^LBbG2~!C|WqjBwRU)*F#&_p9Mx( zTEowPI&P_T)^>Gt9mYvO2ZD-!ATc(PcSE|NX+RFYfZWU%Ov90{s zTuMbx&W*=fgcuw}#vp{8M2?&a8?RN7laF>ZM@oOzkW!N=lx9Ex(HcC#*Y3{56R4%hLY&c>se6} z=%COupRaL_tk$`0{hS1vc^&8mmX$r;l2U!4lagoif9o>!yamb^oSX3xeU|Cd4BgX6UAW z4gopXt$rMSXCWo@(=NiULAtG3Ipu=bPvp&Ky%zp5aV`fia!y36(W%~yz=6$@%|x6G z&M0p@z2LKoVX%>j;F)g8-n*_t)#++&%1L1`N@V^*Y!10>wkwh)u=6(92Ynb@(-Ma9 zkB#_GeabDQ3ca^Wt^FPjJi|@+jMhvjcQgf$&IkqyEWR^wkfnc1m8E-=GFq1ouNJ;P zqqT5^?7K2r?;jz1enxB42-!0;TAvvq`=X52mxpI_7whozp3&MptdKk?^^7?@=FFJX zq$`rrJ3gaz$*}r1x-3QCQfNdU4lB2VpPqlA&75Omrh8zVs1AIp zXTCP@6D?mBdf$Y}K3Ce)Clc&BjlqE+%IXr4fzuCZ$X;8DrO;l4boR3?Lc}m(i4z| zdSG`v(s4)&xNiqTfgaq6X*({*?K+C|2S~q#^czU;L%J7SVi)k{cH}*eyyuYjb8wAM zBh(-)f~oYrz!SK5+KxMlEdgH#H*0NS*|P)lo)k z-|&xex>%iAF=Dv%e#_t3?jOt6-QUCB_%`;&qu48c?3J&}mRBKh*}W9`w{ zVJ{EaS3Ms=;<6w6fhg$ZHSEfZThu^?w64U4(Z&E^z%q>Lb?g*Zz8<`>2jojCprs} z2A=57g)tDkq6Du+-b~~{64cFPVZydFfvX5cPEzyUnysP1UKcbSWE%H>~B~HT^}%%*q7tIH(6g0RReQ@)M`|T&BGgI_QY-Bt^QSqR@}oawWh1xw=kS$3qFIZj z@cvpTNTXJt+Rsxxs2OYCp+VCv-m)@m0>5~h z=ooTw*$HL{_zPo0^>z+Rsd-HOsI1Af$T*%{E6^1`@J=LDBhQz}I*o9MF8rk%Gfg}B z4=oKuJBlj=X2I#p$1f;x|BIhg*|Md<`X8y^sU<$kyzjk7A3k~lvLJpHa~562jN~6i ze%20>8fi5j|KNn_fL7CQ1?hRYR$_Yl(T5LGD{z`+$a+`JQt)durkcNK0~Kl>Ry*K` zof2Q8g{_Nk91G8CW>yc5h%PN*THe&F;l5UY=HLJLu@ixv{vRGa5!mOK-to%^@tZi% z@!X+T`HMEQx-aR4dMm-YgHFF2S10a)9jUrBdXZm#$6s(zk^1?x4d$Q| z&jt$)V!7a91ApP-H2}}*4<9}O-YRPsEMT)<0esH*<)d&A2#8`Lrxk_v+B0sr7I_@8~(}xdi&j zgO;mV?-6+9dsh~Fci{PwEbe|9*GA!xV|OKl99P5g*NOXCxLQhTo+YZ92mPS?fah*s z3{S~u{SgCK_8t1uJdCzVQK1KGS!)XYVK55{Nb<#l>xAlhyaDA17hZn>8@<_O+725% z+z^`tl%U?rgV`9t4e|gte2Mh$0gGIG^6vJ`g)2!`h$$ovN!iU$rmhQvijbAHps%;PjEkG_=O>F%7LjW9l0|rlHk_ zk7;O)(R>OJ&Vk;do-~j-UHn-rq61a}UL%tMZNx5MfJl_HyN5r4(Z_<8gz{8Ac8=m<#; z)c*jUbrmo90H0F$GoXzQXqvkqC+&61@!fO5Bit-oU=wW#ehDUp*C1R8o?$Hb2s`Yh z$%h5AaT@}RF7j<4I*TgoBzA)T7$VTvWiAhVDpfTU#o@V()WVL&Vm}h*E z%V%-#6G%g~fl&q1!Meky|8xe)6ATW`e48t#EsPY`mFr&_mPzAR8-py?aDdXqQnh(? ztoWfjB1VFB7JS9O06#F|hKAA5J2QTn5W1~pF<(&X;k~wA_0~&Ma+S;Myf`1fdqbYg zI8~rd6mCuCo7Icm*Ty(UTFDjpHs?eaZNA7mG`6c~=xAv?a!INQ={7F+8*72mp)A10 z5@R;)L5QzoUPT^J#?ddR8+C+QE)(B^zve~JQD}2B^aYwk(Pg?)!ZgKxkV-fW5;Gap zjCyA~rZYVEl=Dg}oSQ_3%Ri|#p{N4_KCt7+{^v6>I7*e>V~QY%kE|gPS(JRIWghE* z7N+YRD1=``fI)Ic0KtQB7s3KaCn05MzX;Nd2O;5D0j%-|*^1wU6gr=Pv=CQN7jH{p z!kGjD7=A!Q0RCNAYzCQIT)6EoboqiC;QzO`m#U|u{xXp}j_2ymFjY^P)E@nmo1RN9GPlS6AoX^p{r+^!FRmdsxiFS< z|E0xnb!8J>#QWd%uZh+d|FTvxHhn8w^lf$r!+kDTF4ModyIAGKjZ>brX+JMM6}F=B z`tKM{-Ol3aRs&tlo@zJSw99EzOUzgc%`Ym!g>h}8eo`ZlVq8VHIP?dT(eR&->KynI!$ zUtw>px%_pDV{{1NcRt+WNWX!&9djT1la1S>>l(o%+wn{FS}oodrL{HWrr_~$vA<-$ k$!xszSYjS>+Y!*4R2XwZ4I>@)Lz!6c;XkqYj|c_-7XhpV!2kdN literal 0 HcmV?d00001 diff --git a/G/BIN/GIF_LIBL.LIB b/G/BIN/GIF_LIBL.LIB new file mode 100644 index 0000000000000000000000000000000000000000..9839f378fb0e2dbd5b88e8f49e3bf398e6eb1499 GIT binary patch literal 32256 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 literal 0 HcmV?d00001 diff --git a/G/BIN/GIF_LIBS.LIB b/G/BIN/GIF_LIBS.LIB new file mode 100644 index 0000000000000000000000000000000000000000..1612f3d33b0bbb4211c0542fbbad865e9e62ca81 GIT binary patch literal 27136 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 AFaQ7m literal 0 HcmV?d00001 diff --git a/G/COMPILE.ME b/G/COMPILE.ME new file mode 100644 index 0000000..3cf80b4 --- /dev/null +++ b/G/COMPILE.ME @@ -0,0 +1,106 @@ +The gif_lib library and utilities has been successfully compiled on the +following platforms (you will need ansi c compiler for that): + +1. IBM-PC, using Turbo C version 2.0/Borland C++ 2.0. +2. Sun 3, with O.S. 3.5 and O.S. 4.0.3, using gcc (gnu c compiler). +3. Sun 4, with O.S. 4.1.1, using gcc (gnu c compiler). +4. HP workstations, running unix BSD4.3, using gcc (gnu c compiler). +5. SGI personal iris (iris4d) running IRIX 4.3, using its cc. +6. IBM R6000 running aix, using xlc (Ansi C compiler). + +The first one (IBM-PC) was the main target of this package. The unix version +compiles all the device independent utilities and more (such as gif to rle +conversions, gif2x11 etc.). The IBM-PC compilation and testing is different +from the unix ones, and are described in seperated section below. + +Compile and test - IBM PC +------------------------- + +O.k. if you have TC/BC you are in good shape (otherwise you are on your own) +and compilation will be simple: + +1. Goto to the makefiles in .\lib and .\util (called makefile.tc in both + places) and change the variable CC_LIBS to the exact place you have your + cc libraries. I use to put them in ram disk (disk f:) for fast access. + Make sure this is short variable or otherwise dos will complain about + lines too long (the stupid 128 chars per line), in linkage... +2. Few of the utilities on .\util needs the TC graphic libraries (the gif2xxxx + utilities). You need to create a library named graphbgi.lib that holds all + the BGI drivers and CHR fonts. You do so by a sequence similar to: + + a. bgiobj herc (bgiobj.exe is on one of your TC 2.0 diskettes). + b. bgiobj egavga + c. bgiobj cga + d. bgiobj ibm8514 + e. bgiobj pc3270 + f. bgiobj goth + g. bgiobj litt + h. bgiobj sans + i. bgiobj trip + + This will convert all this drivers/fonts into .OBJ files, which can be all + linked to creat the library: + + tlib graphbgi.lib +herc.obj +egavga.obj ... +trip.obj, graphbgi.lst + + Copy this library to the same directory as specified by CC_LIBS in 1. + +3. Decide what directory you want the executables to br copied to and create + it if it is new. Goto .\util and set the DEST variable in the makefile + (makefile.tc) to that directory. +4. Fire the compilation by executing make-ibm.bat + + +To test most of the utilities reconfigure test-ibm.bat as follows: +1. make sure the new exectuables directory is in your path variable. +2. The default display program is gif2bgi (in this package). If may want + to change its setup. See ./doc/gif2bgi.doc for more. +3. Set the GIF_DIR variable in the batch file to the absolute path of + ./pic directory (hold some gif examples). + +Run test-ibm.bat. You will want to print gif2bgi.doc in ./doc so you will +know how to use it (at list how to exit...). + + +Compile and test - UNIX +----------------------- + +Compiling are testing under unix is simpler than the IBMPC: + +1. If you are to use the unix unzip utility to unpack this library, you + need to use the -d flag to enforce creation of subdirectories. The + following subdirectories are to be created: bin doc lib pic util. + But I guess you are after this if you are reading this file now... +2. You need to convert all files (almost - gif2X11.* has X capitalized), from + MSDOS convension to unix one. This involves converting to lower case, and + stripping off ^Z from end of file and CR from CR/LF end of line. + You can do it manually, However the DOS2UNIX script will do %99 of the job. + It will convert ALL files found in subdirectories of the current working + directory from upper case to lower case, and strip the CR from the CR/LF + end of line used by MSDOS and ^Z from end of file. It does not check if + the file is binary or a text one, and it will DESTROY the gif images in + ./pic/*.gif, as it will strip off any CR or ^Z in them. You better move + the ./pic directory to someplace else before invoking DOS2UNIX and move it + back afterwords. Also you will probably need to issue 'chmod +x dos2unix' + to make it executable. + MAKE SURE no other files but from this unpacked library, exists in the + current and sub directories, and execute dos2unix. +3. Go to the ./lib and ./util directories (they should be lower case, after + dos2unix has been executed), and edit the unix makefiles (makefile.unx) + for the following: + a. Set CC to your c compiler name (usually cc but can be gcc - see in the + makefile.unx). + b. Select the right flags to the c compilers. Flags for SGI cc, and gcc are + provided. +4. Fire the compilation using make-unx. This will leave the executables in + ./bin. + +Test the package by adding ./bin to your path and firing the 'test-unx' script. +This assumes the display is X11, and the environment variable DISPLAY is set +properly - uses gif2X11 as display utility. + + + + +Gershon Elber +gershon@cs.utah.edu diff --git a/G/DOC/GENERAL.DOC b/G/DOC/GENERAL.DOC new file mode 100644 index 0000000..600302a --- /dev/null +++ b/G/DOC/GENERAL.DOC @@ -0,0 +1,22 @@ + General information - GIF utilities + ----------------------------------- + + Each of the utilities provided in 'util' directory perform some kind of +filtering, generating new image, or dumping it to a device. + + Because they are not fast, a filter will print (in increasing) order the +current input image line number, any time it needs to read the input, and +will print output image line number (in decreasing order) any time it dumps +out. Other utilities, that only read or write, will always print that half +the same way (but in increasing order). This is true only for utilities +that decodes the data. Utilities (like GifPos that only change positions) +that copies the image as block of compressed data, will print nothing for +two reasons: they can not idetify line number, and mainly as they are much +faster. + + Some of the utilities requirs memory in the order of the whole screen, while +others read one scan line at a time. Each utility DOC file, has entry called +'Memory Usage' which will be one of: Line (memory required is in the order +of one scan line), Image (order of biggest image in GIF file), or Screen (order +of GIF file screen). In all cases, a byte is allocated per pixel, so image of +320 by 200 pixels will requires ~64k bytes to hold. diff --git a/G/DOC/GIF2BGI.DOC b/G/DOC/GIF2BGI.DOC new file mode 100644 index 0000000..0efd112 --- /dev/null +++ b/G/DOC/GIF2BGI.DOC @@ -0,0 +1,88 @@ + Gif2BGI + -------- + +Program to display images saved as GIF files on IBM PC display devices using +the BGI (Borland) driver interface. + + The program has few stages as follows: +1. Reads GIF file header and determines size of it. +2. Dynamically allocate enough memory to hold all the image internally. + One byte per pixel is always allocated, so a little bit more than + width*height (of screen, not image) bytes are required. +3. Reads all the image in. Interlaced images are read correctly in, although + they are displayed sequentially. +4. Display first image using the defaults as set by the command line option. +5. Goes to interactive mode. For full description of the interactive mode + see below + + +Usage: +------ + +Gif2BGI [-q] [-d BGI Directory] [-u UserBGIDrv.Mode] [-z ZoomFactor] [-b] + [-h] GifFile + +If no GifFile is given, Gif2BGI will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-d BGI Directory] : Where should we look for default drivers (as supplied + by Borland). For example '-d c:/tc/bgi'. +3. [-u UserBGIDrv.Mode] : Specifies user defined BGI driver. If for example + you have a BGI driver for your special vga called MYVGA.BGI and you want + to run it in mode 2 then type '-u c:/tc/bgi/myvga.2'. Note the absolute + path to the driver must be specified. Also note that we use '/' and not + '\' so they would not be treated as options. +4. [-z ZoomFactor] : Sets zoom factor of the image. Zoom factor should be + power of 2 up to 256. Default is 1 (no zoom). +5. [-h] : print one command line help, similar to Usage above. + +Interactive mode: +----------------- + + Once the image is displayed, the program goes into interactive mode +which recognizes the following commands: +1. C - get Color and Position. + In this sub menu, a cursor appears, and the Color of the pixel the cursor + is on, with its position in GIF file screen are printed. The 4 arrows may + be used (shifted for faster movement) to move the cursor. Any other key will + abort this sub mode. +2. D - Zoom Down by factor of 2 unless current zoom factor is 1. +3. R - Redraw the image. +4. S - print Status of image and program. +5. U - Zoom Up by factor of 2 unless current zoom factor is 256. +6. 4 arrow keys can be used to pan to the desire direction, if the image + overflow to that direction. If, on the other hand, the image fit into the + Hercules device, arrow keys are ignored. The panning steps are 1/2 screen if + not on image end. +7. ' ' - Space bar may be used to abort current image drawing. +8. ESC - Escape key may be used to abort the program. + + +Notes: +------ + + As no color quantization is used in this program if a GIF image has more +colors than the BGI driver support, this program will abort. + This driver is optimized for drivers with one byte per pixel (256 colors) +and will run MUCH faster in these cases. + + +Bugs: +----- + + For some reason I could not figure out on my ATI wonder card, int 10h call +10h (AH = AL = 10h) to set the color registers sometimes result with wrong +colors. Direct access of the card registers gives correct results. I dont do +that to make this program portable but if your driver gives wrong colors it +is probably because it is using this bios call. Any one has anything to add? \ No newline at end of file diff --git a/G/DOC/GIF2EPSN.DOC b/G/DOC/GIF2EPSN.DOC new file mode 100644 index 0000000..67883c7 --- /dev/null +++ b/G/DOC/GIF2EPSN.DOC @@ -0,0 +1,62 @@ + Gif2Epsn + -------- + +Program to dump images saved as GIF files on Epson type printers. + + +Usage: +------ + +Usage: Gif2Epsn [-q] [-d DitherSize] [-t BWThreshold] [-m Mapping] [-i] [-n] + [-p PrinterName] [-h] GifFile + +If no GifFile is given, Gif2Epsn will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-d DitherSize] : Sets size of dithering matrix, where DitherSize can be + 2,3 or 4 only (for 2x2, 3x3 and 4x4 dithering matrices). Default is 2. + Note image will be displayed in this mode only if Mapping (see -m) + selected this mode. +3. [-t BWThreshold] : Sets threshold level for B&W mapping in percent. + This threshold level is used in the different mappings as selected via -m. + Default is 19%. +4. [-m mapping] : Select method to map colors to B&W. Mapping can be: + 0 : Every none background color is considered foreground (white color but + is drawn as black by printer, unless -i is specified). + 1 : 0.3 * RED + 0.59 * GREEN + 0.11 * YELLOW > BWThreshold is considered + white color. + 2 : Colors are mapped as in 1, and use dithering of size as defined using + -d option. BWthreshold is used here as scaler. + Default is option 0. +5. [-i] : Invert the image, i.e. black -> white, white -> black. +6. [-n] : Nicer image. Uses double density feature of Epson printer, to make + nicer result. This takes more time (and kill your ink cartridge + faster...) but results are usually better. +7. [-p PrinterName] : by default output is sent to LPT1:. If other device + or disk file is required, they should be specified here. Note + devices are NOT specifed with colon, so to use LPT2: instead: + '-p lpt2' is required. Nothing is sent to stdout. If a disk file is + created: '-p file1.eps' then it can be printed any time by the + copy command: 'copy file1.eps prn:/b'. Note the /b for binary copy. +8. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + The output has aspect ratio of 1, so square image, will be square in its +hardcopy as well. + The widest image can be printed is 640 pixels, on 8 inches paper. You +probably will need to flip wider images, if height is less than that: +'gifflip -r x29.gif | gif2epsn'. Wider images will be clipped. + This utility dumps output to a file/printer directly. I guess it will have +only a limited usage on unix system... diff --git a/G/DOC/GIF2HERC.DOC b/G/DOC/GIF2HERC.DOC new file mode 100644 index 0000000..3819f1d --- /dev/null +++ b/G/DOC/GIF2HERC.DOC @@ -0,0 +1,82 @@ + Gif2Herc + -------- + +Program to display images saved as GIF files on IBM PC Hercules graphic card. + The program has few stages as follows: +1. Reads GIF file header and determines size of it. +2. Dynamically allocate enough memory to hold all the image internally. + One byte per pixel is always allocated, so a little bit more than + width*height (of screen, not image) bytes are required. +3. Reads all the image in. Interlaced images are read correctly in, although + they are displayed sequentially. +4. Display first image using the defaults as set by the command line option. +5. Goes to interactive mode. For full description of the interactive mode + see below + + +Usage: +------ + +Gif2Herc [-q] [-d DitherSize] [-z ZoomFactor] [-t BWThreshold] [-m Mapping] + [-i] [-b] [-h] GifFile + +If no GifFile is given, Gif2Herc will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-d DitherSize] : Sets size of dithering matrix, where DitherSize can be + 2,3 or 4 only (for 2x2, 3x3 and 4x4 dithering matrices). Default is 2. + Note image will be displayed in this mode only if Mapping (see -m) + selected this mode. +3. [-z ZoomFactor] : Sets zoom factor of the image. Zoom factor should be + power of 2 up to 256. Default is 1 (no zoom). +4. [-t BWThreshold] : Sets threshold level for B&W mapping in percent. + This threshold level is used in the different mappings as selected via -m. + Default is 19%. +5. [-m mapping] : Select method to map colors to B&W. Mapping can be: + 0 : Every none background color is considered foreground (white). + 1 : 0.3 * RED + 0.59 * GREEN + 0.11 * YELLOW > BWThreshold is considered + white. + 2 : Colors are mapped as in 1, and use dithering of size as defined using + -d option. BWthreshold is used here as scaler. + Default is option 0 which is much faster than the other two. +6. [-i] : Invert the image, i.e. black -> white, white -> black. +7. [-b] : Disable beeps. Every time image is complete, or wrong key was + presses, sound is generated. -b disables that. +8. [-h] : print one command line help, similar to Usage above. + +Interactive mode: +----------------- + + Once the image is displayed, the program goes into interactive mode +which recognizes the following commands: +1. C - get Color and Position. + In this sub menu, a cursor appears, and the Color of the pixel the cursor + is on, with its position in GIF file screen are printed. The 4 arrows may + be used (shifted for faster movement) to move the cursor. Any other key will + abort this sub mode. +2. D - Zoom Down by factor of 2 unless current zoom factor is 1. +3. H - Increase dither matrix size, unless current size is maximum (4), were + size is set to minimum (2). +4. I - Invert the image, i.e. white -> black, black -> white. +5. M - increase Color -> BW mapping method, unless current method is maximum + (2), were method is set to minimum (0). +6. R - Redraw the image. +7. S - print Status of image and program. +8. U - Zoom Up by factor of 2 unless current zoom factor is 256. +9. 4 arrow keys can be used to pan to the desire direction, if the image + overflow to that direction. If, on the other hand, the image fit into the + Hercules device, arrow keys are ignored. The panning steps are 1/2 screen if + not on image end. +9. ' ' - Space bar may be used to abort current image drawing. +10. ESC - Escape key may be used to abort the program. diff --git a/G/DOC/GIF2IRIS.DOC b/G/DOC/GIF2IRIS.DOC new file mode 100644 index 0000000..aeb3b3a --- /dev/null +++ b/G/DOC/GIF2IRIS.DOC @@ -0,0 +1,30 @@ + Gif2Iris + -------- + +Program to display images saved as GIF files under SGI NeWs window system. + + +Usage: +------ + +Gif2Iris [-q] [-f] [-p PosX PosY] [-f] [-h] GifFile + +If no GifFile is given, Gif2Iris will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +4. [-f] : Force Gif2Iris to stay in foreground. +2. [-p PosX PosY] : defines position of image on screen. By default the + program will prompt for position. +5. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIF2PS.DOC b/G/DOC/GIF2PS.DOC new file mode 100644 index 0000000..917f63e --- /dev/null +++ b/G/DOC/GIF2PS.DOC @@ -0,0 +1,42 @@ + Gif2PS + ------ + +Program to print GIF file on later printers supporting Postscript. + + +Usage: +------ + +Usage: Gif2PS [-q] [-x] [-y] [-s SizeX SizeY] [-p PosX PosY] [-i] + [-n #Copies] [-h] GifFile + + If no GifFile is given, Gif2PS will try to read stdin for GIF file. + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-x] : Force image to be horizontal. By default image will be positioned + so it will be the biggest. If -x then image will be scaled to be biggest + possible horizontally. +3. [-y] : Same as -x but vertically. +4. [-s SizeX SizeY] : Force image size to be SizeX by SizeY inches. + If image will exit page dimensions, it will scream and die. + Page dimensions are 8.5 by 11.0 inches but only 7.5 by 9.0 are assumed to + be printable. +5. [-p PosX PosY] : Force image lower left corner to be as PosX PosY. + If image will exit page dimensions, it will scream and die. +6. [-i] : Image will be inverted (Black -> White and vice versa). + Mapping from colors is done by 0.3 * RED + 0.59 * GREEN + 0.11 * BLUE + and sometimes inverting the image will look better. +7. [-n #Copies] : Number of copies to print. 1 by default. +8. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIF2RGB.DOC b/G/DOC/GIF2RGB.DOC new file mode 100644 index 0000000..b74e721 --- /dev/null +++ b/G/DOC/GIF2RGB.DOC @@ -0,0 +1,36 @@ + Gif2RGB + ------- + +Program to convert images saved as GIF to 24 bits RGB image(s). + + +Usage: +------ + +Usage: Gif2RGB [-q] [-1] [-o OutFileName] [-h] GifFile + +If no GifFile is given, Gif2RGB will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off.2 +2. [-1] : Only one file in the format of RGBRGB... triplates (Each of R, G, B + is a byte) is being written. This file size is 3 * Width * Height. + If stdout is used for output, this option is implicitly applied. + The default (if not '-1') is 3 files with the names OutFileName.R, + OutFileName.G, OutFileName.B, each of which is Width * Height bytes. +3. [-o OutFileName] : specifies the name of the out file (see also '-1' + above). +3. [-h] : print one command line help, similar to Usage above. + +Notes: +------ diff --git a/G/DOC/GIF2RLE.DOC b/G/DOC/GIF2RLE.DOC new file mode 100644 index 0000000..12d5ff5 --- /dev/null +++ b/G/DOC/GIF2RLE.DOC @@ -0,0 +1,33 @@ + Gif2Rle + ------- + +Program to convert images saved as GIF to RLE (utah raster toolkit) format. + + +Usage: +------ + +Usage: Gif2Rle [-q] [-a] [-h] GifFile + +If no GifFile is given, Gif2Rle will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-a] : Add alpha channel (see rle document) to the output data file.n +3. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + This routine must be linked with the rle toolkit library librle.a. +As you want to convert images to RLE format, it is reasonable to assume you +have this library available... diff --git a/G/DOC/GIF2X11.DOC b/G/DOC/GIF2X11.DOC new file mode 100644 index 0000000..5071908 --- /dev/null +++ b/G/DOC/GIF2X11.DOC @@ -0,0 +1,37 @@ + Gif2X11 + -------- + +Program to display images saved as GIF files under X window system. + + +Usage: +------ + +Gif2X11 [-q] [-p PosX PosY] [-d Display] [-f] [-h] GifFile + +If no GifFile is given, Gif2X11 will try to read stdin for GIF file. +Note no support exists for setting this program option through X data base +(i.e .Xdefaults) + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-p PosX PosY] : set the position of image on screen. By default the + program will prompt for position. +3. [-d Display] : what server should be connect to. +4. Force attempt to allocate exact colors. This usually will result with + very wrong image if not enough colors can be allocated as the rest of + them will be approximated to the closest one. By default the list bits + of the colors are stripped until success (in allocation) which looks much + better. +5. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIFASM.DOC b/G/DOC/GIFASM.DOC new file mode 100644 index 0000000..5da2b38 --- /dev/null +++ b/G/DOC/GIFASM.DOC @@ -0,0 +1,35 @@ + GifAsm + ------ + +Program to assemble few GIF files into one, or disassemble single GIF file +with multiple images into single image files. + +Usage: +------ + +Usage: GifAsm [-q] [-a] [-d OutFileName] [-h] GifFile(s) + + If no GifFile is given, GifAsm will try to read stdin for GIF file, if +in disassembly mode only (-d). + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-a] : Assemble. This is the default, and the GifFile(s) are assembled to + stdout. Note the screen descriptor (including screen color map) is taken + from the first file, while other screen descriptors are ignored. + As this mode requires at list 2 GIF files as input, no attempt will be + made to read stdin if none specified on command line. +3. [-d OutFileName] : Disassmble GifFile (if specified on command line) or + stdin, into several files of the form OutFileNameXX, where XX are two + decimal digits. Obviously up to 100 files can be generated this way. + Note in this mode nothing is sent to stdout. +4. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFBG.DOC b/G/DOC/GIFBG.DOC new file mode 100644 index 0000000..7f630df --- /dev/null +++ b/G/DOC/GIFBG.DOC @@ -0,0 +1,53 @@ + GifBG + ----- + +Program to generate Back Ground with optionally gradually changing intensity +in any of the basic 8 directions, as a GIF file. + +Usage: +------ + +Usage: GifBG [-q] [-d Dir] [-l #Lvls] [-c R G B] [-m MinI] [-M MaxI] + [-s W H] [-h] + + GifBG reads no input, and will dump the created GIF file to stdout. + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-d Dir] : select direction the intensity of the background should increase. + Direction can be one of the 8 principle directions: + "T" - for Top "TR" - for Top Right + "R" - for Right "BR" - for Bottom Right + "B" - for Bottom "BL" - for Bottom Left + "L" - for left "TL" - for Top Left + The compass directions may be use as synonym for the above directions, so + for example "NE" is equal to "TR". + Direction is case insensitive. + Default direction is Top (North). +3. [-l #Lvls] : Number of levels the color is going to be scaled to. + Default is 16. +4. [-c R G B] : The color to use as the primary back ground color to scale. + This color is scaled between the minimum intensity (MinI) and maximum + intensity (MaxI) from one end of the screen to the end as defined by Dir. + see below (-m & -M) for MinI & MaxI. Default is Blue (0, 0, 255). +5. [-m MinI] : Minimum intensity (in percent) to scale color. Default 10% +6. [-M MaxI] : Maximum intensity (in percent) to scale color. Default 100% +7. [-s W H] : Size of image to create. Default 640 by 350. +8. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + If MinI == MaxI = 100 (%) and #Lvls == 2 then boolean mask image of specified +size will be created - all forground. This can be used as a square mask for +gifcomb utility. + \ No newline at end of file diff --git a/G/DOC/GIFCLIP.DOC b/G/DOC/GIFCLIP.DOC new file mode 100644 index 0000000..6642a15 --- /dev/null +++ b/G/DOC/GIFCLIP.DOC @@ -0,0 +1,40 @@ + GifClip + ------- + +Program to clip images in GIF files. Only one image in GIF file can be modified +at a time. Neither image relative position to screen, nor screen sizes are +modified (use GifPos for that). + +Usage: +------ + +Usage: GifClip [-q] [-i Xmin Ymin Xmax Ymax] [-n n Xmin Ymin Xmax Ymax] [-h] + GifFile + + If no GifFile is given, GifClip will try to read stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-i Xmin Ymin Xmax Ymax] : Clip first image to the dimensions as specified + by the 4 coordinates (Xmin Ymin Xmax Ymax) of a box clipping region. + For example: '-i 11 22 33 44' will crop the box from top left [11,22] + to bottom right [33,44] out of the first image. + If the first parameter is bigger than third one (Xmin > Xmax) - they are + swapped. Same for Y. + Dimensions of cropped image must be confined to original image width and + height. Note the clipped image include both min & max boundry, and image + of width W can have coordinates 0 to W-1 (zero based). + Only one of -i or -n can be specified. +3. [-n n Xmin Ymin Xmax Ymax] : same as -i above but for the nth image: + '-n 1 11 22 33 44' is exactly the same as the example in -i. Only one of + -i or -n can be specified. +4. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFCLRMP.DOC b/G/DOC/GIFCLRMP.DOC new file mode 100644 index 0000000..d618fd9 --- /dev/null +++ b/G/DOC/GIFCLRMP.DOC @@ -0,0 +1,38 @@ + GifCrlMp + -------- + +Program to modify GIF image colormaps. Any specific image in GIF file can +be modified at a time, or the global screen one. + +Usage: +------ + + Usage: GifClrMp [-q] [-s] [-l ColorMapFile] [-g Gamma] [-i Image#] [-h] + GifFile + + If no GifFile is given, GifClip will try to read stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-s] : Select the global screen color map. +3. [-l ColorMapFile] : load color map from this file instead of select color + map. +4. [-g Gamma] : Apply gamma correction to selected color map. +5. [-i Image#] : Select the i image color map. +6. [-h] : print one command line help, similar to Usage above. + +Notes +----- +1. Default operation is to dump out the selected color map in text format. +2. The file to load/dump is simply one color map entry per line. Each such + entry line has four integers: "ColorIndex Red Green Blue", where color + index is in ascending order starting from 1. diff --git a/G/DOC/GIFCOMB.DOC b/G/DOC/GIFCOMB.DOC new file mode 100644 index 0000000..a08c16c --- /dev/null +++ b/G/DOC/GIFCOMB.DOC @@ -0,0 +1,34 @@ + GifComb + ------- + +Program to combine 2 GIF images of exactly same size, into one. The color maps +are merged and the result should not exceed 256 colors. A boolean mask GIF +file can be used to set which pixel from two images to use each location. +Otherwise any background color from first image is converted to second image +color at that point. Only first image of each file is combined, which again +all file first images must be of exactly the same size. + +Usage: +------ + +Usage: GifComb [-q] [-m MaskGIFFile] [-h] GifFiles + + Two GIF files must be specified although the mask GIF file is optional. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-m MaskGIFFile] : the MaskGIFfile can be regular GIF file whose first + image has same dimensions as the combined images. Any non background color + in it will select Image 1 Pixel to output, otherwise Image2 pixel will be + selected. Usually this image will be boolean (two colors only) but does + not have to be! +3. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFFIX.DOC b/G/DOC/GIFFIX.DOC new file mode 100644 index 0000000..7925226 --- /dev/null +++ b/G/DOC/GIFFIX.DOC @@ -0,0 +1,26 @@ + GifFix + ------ + +Program to attempt and fix broken GIF images. +Currently will "fix" images terminated prematurely by filling the rest of +the image with the darkest color found in image. + +Usage: +------ + +Usage: GifFix [-q] [-h] GifFile + + If no GifFile is given, GifFix will try to read stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFFLIP.DOC b/G/DOC/GIFFLIP.DOC new file mode 100644 index 0000000..96abf20 --- /dev/null +++ b/G/DOC/GIFFLIP.DOC @@ -0,0 +1,32 @@ + GifFlip + ------- + +Program to flip (mirror) GIF file along X or Y axes, or rotate the GIF +file 90 degrees to the left or to the right + +Usage: +------ + +Usage: GifFlip [-q] [-r] [-l] [-x] [-y] [-h] GifFile + + If no GifFile is given, GifFlip will try to read stdin for GIF file. + +Memory required: +---------------- + +Image. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-r] : Rotate the GIF file to the right. +3. [-l] : Rotate the GIF file to the left. +4. [-x] : mirror the GIF file along X axis. Very useful if GIF file was + created from another format in with the first line in at image bottom. + Effectively flips first row with last. +5. [-y] : mirror the GIF file along Y axis. + Effectively flips first column with last. +6. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFHISTO.DOC b/G/DOC/GIFHISTO.DOC new file mode 100644 index 0000000..eea2799 --- /dev/null +++ b/G/DOC/GIFHISTO.DOC @@ -0,0 +1,43 @@ + GifHisto + -------- + +Program to create histogram of number of pixels using each color. Output +can be formated into a GIF histogram file, or text file - both goes to +stdout. + + +Usage: +------ + +Usage: GifHisto [-q] [-t] [-s Width Height] [-n ImageNumber] [-b] [-h] GifFile + + If no GifFile is given, GifHisto will try to read stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-t] : Force output to be text file of the form: Size of colormap lines + each contains two integers: number of times color appeared, and color + index. This in increasing color index order. This output can be fed + directly to msdos SORT program if number of times color appears ordering + is desired. + The colrmap picked is the one to be used for the image to generate + histogram for, as defined in GIF format. +3. [-s Width Height] : Size of GIF histogram file. The Height of the + histogram should be power of 2 dividable by number of colors in colormap. + Width sets the resolution (accuracy if you like) of the histogram as + the maximum histogram bar is scaled to fit it. +4. [-n ImageNumber] : Image number to test. Default is one. +5. [-b] : Zeros the background color count. As only linear scale bars is + supported and usually the background appears much more times then rest + of colors, deleting back ground count will improve the scaling of other + colors. +6. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFINTER.DOC b/G/DOC/GIFINTER.DOC new file mode 100644 index 0000000..dbfee69 --- /dev/null +++ b/G/DOC/GIFINTER.DOC @@ -0,0 +1,28 @@ + GifInter + -------- + +Program to convert between interlaced and non interlaced images in GIF file. + +Usage: +------ + +Usage: GifInter [-q] [-i] [-s] [-h] GifFile + + If no GifFile is given, GifInter will try to read stdin for GIF file. + + +Memory required: +---------------- + +Image. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-i] : Force all images in GIF file be interlaced. +3. [-s] : Force all images in GIF file be sequencial (default). +4. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIFINTO.DOC b/G/DOC/GIFINTO.DOC new file mode 100644 index 0000000..c33a271 --- /dev/null +++ b/G/DOC/GIFINTO.DOC @@ -0,0 +1,32 @@ + GifInto + ------- + +Program to save stdin into a file with given name, iff the result file has +size bigger than specified (see below). This can be used to save result in +same files name we started a chain of pipes. + +Usage: +------ + +Usage: GifInto [-q] [-s MinFileSize] [-h] GifFile + + GifInto always read from stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-s MinFileSize] : If file is less than MinFileSize, it is deleted and + not renamed to given name. This will prevent from killing the file we + start with along the pipe, if result is empty file, or none complete. + The default for file size is 14 bytes which is 1 bigger than GIF file + stamp (6 bytes) and GIF file screen descriptor (7 bytes), so GIF file with + only GIF stamp and screen descriptor will not be renamed. +3. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFPOS.DOC b/G/DOC/GIFPOS.DOC new file mode 100644 index 0000000..f8fe0da --- /dev/null +++ b/G/DOC/GIFPOS.DOC @@ -0,0 +1,33 @@ + GifPos + ------ + +Program to change GIF screen size and reposition images. No test is made to +make sure changes will generate valid GIF files (i.e. images are still +confined to screen etc.) + +Usage: +------ + +Usage: GifPos [-q] [-s Width Height] [-i Left Top] [-n n Left Top] [-h] GifFile + + If no GifFile is given, GifPos will try to read stdin for GIF file. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-s Width Height] : set the new screen dimensions, so for example + '-s 1000 800' will set screen to width of 1000 and height of 800. +3. [-i Left Top] : set image relative to screen position, so for example + '-i 100 80' will set image left position to 100 and top position to 80. + This sets the position of the first image only. +4. [-n n Left Top] : set image n relative to screen position, so for + example '-n 3 100 80' will set the third image position as in 2. +5. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFROTAT.DOC b/G/DOC/GIFROTAT.DOC new file mode 100644 index 0000000..ee9cbe7 --- /dev/null +++ b/G/DOC/GIFROTAT.DOC @@ -0,0 +1,40 @@ + GifRotat + -------- + +Program to rotate a gif image by an arbitrary angle. + + +Usage: +------ + +Usage: GifRotat -a Angle [-q] [-s Width Height] [-h] GifFile + +If no GifFile is given, GifRotat will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen (of source image). + + +Options: +-------- + +1. -a Angle : Specifies the angle to rotate in degrees with respect to + the X (horizontal) axis. +2. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off.2 +3. [-s Width Height] : Since rotated image will have the same image size as + original, some parts of the image will by clipped out and lost. By + specifing a (bigger) size explicitly using the '-s' option, these parts + may be saved. +3. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + +Image is rotated around its center. No filtering is performed on the output +which have identical color map as the input. This is mainly since filtering +will require color quantization which is very memory/time intensive and +out of MSDOS memory limits even for small images. diff --git a/G/DOC/GIFRSIZE.DOC b/G/DOC/GIFRSIZE.DOC new file mode 100644 index 0000000..b426a0e --- /dev/null +++ b/G/DOC/GIFRSIZE.DOC @@ -0,0 +1,33 @@ + GifRSize + -------- + +Program to resize image size by integer factor, using bits deleting (scaling +down) and bits duplication (scaling up). + +Usage: +------ + +Usage: GifRSize [-q] [-S X Y] [-s Scale] [-x XScale] [-y YScale] [-h] GifFile + + If no GifFile is given, GifRSize will try to read stdin for GIF file. + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-S X Y] : specifies the exact screen dimension of the output GIF. +2. [-s Scale] : Set scaling factor for both x & y direction to Scale. + Default is 0.5. Note this is a floating point number. +3. [-x XScale] : Set scaling factor for x direction to Scale. Default is 0.5. + Note this is a floating point number. +4. [-y YScale] : Set scaling factor for y direction to Scale. Default is 0.5. + Note this is a floating point number. +7. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/GIFTEXT.DOC b/G/DOC/GIFTEXT.DOC new file mode 100644 index 0000000..f26ec07 --- /dev/null +++ b/G/DOC/GIFTEXT.DOC @@ -0,0 +1,41 @@ + GifText + ------- + +Program to print (text only) general information about GIF file + +Usage: +------ + +Usage: GifText [-q] [-c] [-e] [-z] [-p] [-r] [-h] GifFile + + If no GifFile is given, GifText will try to read stdin for GIF file. + As giftext can generate huge amount of data, ^C will kill it, but 'q' will +stop only the printing (of one of -e, -z, -p), while file integrity will still +be checked. + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-c] : Dumps also color maps. +3. [-e] : Dumps also encoded bytes - the pixels after compressed using LZ + algorithm and chained to form bytes. This is the form the data is saved + in the GIF file. Dumps in hex - 2 digit per byte. +4. [-z] : Dumps also the LZ codes of the image. Dumps in hex - 3 digits per + code (as we are limited to 12 bits). +5. [-p] : Dumps aslo the pixels of the image. Dumps in hex - 2 digit per + pixel (<=byte). +6. [-r] : Dumps raw pixels as one byte per pixel. This option inhibit all other + options and only the pixels are dumped. This option may be used to convert + gif file into raw data. Note the color map can be extracted by gifclrmp + utility. If more than one image exists, all images will be dumped in order. +7. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIFWEDGE.DOC b/G/DOC/GIFWEDGE.DOC new file mode 100644 index 0000000..4af4b92 --- /dev/null +++ b/G/DOC/GIFWEDGE.DOC @@ -0,0 +1,32 @@ + GifWedge + -------- + +Program to create a test GIF image with intensity levels of the RGB colors +YCM colors and white. + + +Usage: +------ + +Usage: GifWedge [-q] [-l #Lvls] [-s SizeX SizeY] [-h] + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-l #Lvls] : Set number of intensity levels per color. This number must be + power of two up to 32 as Gif format can only have 256 color simultanuously + and 7 basic colors are to be displayed. +3. [-s SizeX SizeY] : Force image size to be SizeX by SizeY pixels. + Image size will be rounded down to be a multiple of number of intensities + horizontally, and 7 (colors) vertically. +4. [-h] : print one command line help, similar to Usage above. + diff --git a/G/DOC/GIF_LIB.DOC b/G/DOC/GIF_LIB.DOC new file mode 100644 index 0000000..6e78254 --- /dev/null +++ b/G/DOC/GIF_LIB.DOC @@ -0,0 +1,477 @@ + GIF library document + -------------------- + + Gershon Elber, May 1991 + ----------------------- + + Version 1.2 + ----------- + + The Graphics Interchange Format(c) is the Copyright property of +CompuServe Incorporated. GIF(sm) is a Service Mark property of CompuServe +Incorporated. + + This library was written once I didnt find anything similar and I +wanted one. I was inspired from the rle Utah tool kit, which I hoped to port +to an IBM PC, but found it to be too machine specific, and its compression +ratio too low. I compromised on the GIF format while I am not sure how long +8 bits per pixel will be enough. + + + This document explains the GIF library kernel on directory GIF/LIB. +The kernel is built to the gif_libl.lib which is used in all the utilities +on GIF/UTIL, or can be used in any application needs to read/write GIF file +format. This document does NOT explain the GIF file format and assumes it +is known, at list to the level of the GIF file structure. + + When a GIF file is opened, a GIF file descriptor is maintained which +is a pointer to GifFileType structure as follows: + +typedef struct GifFileType { + int SWidth, SHeight, /* Screen dimensions */ + SColorResolution, SBitsPerPixel; /* How many colors can we generate? */ + SBackGroundColor, /* I hope you understand this one... */ + ILeft, ITop, IWidth, IHeight, /* Current image dimensions */ + IInterlace, /* Sequential/Interlaced lines */ + IBitsPerPixel; /* How many colors this image has? */ + GifColorType *SColorMap, *IColorMap; /* NULL if not exists */ + void *Private; /* The regular user should not mess with this one! */ +} GifFileType; + + This structure was copied from gif_lib.h - the header file for the GIF +library. Any application program that uses the gif_libl.lib library should +include it. All items begin with S refer to GIF Screen, while the ones with I +to current image (note GIF file may have more than one image). The user NEVER +writes into this structure, but can read any of these items at any time it is +proper (image information is invalid until first image was read/write). + As the library needs to save its own internal data also, a Private +pointer to internal structure is also saved there. Applications should ignore +this item. + The library has no static data. This means that it is fully reentrant +and any number of GIF files (up to memory limits) can be opened for +read/write. Instead of the static data, internal structure pointed by the +Private pointer is used. + The library do allocates its own memory dynamically, on opening of +file, and releases that once closed. The user is NEVER requires to allocate +any memory for any of the functions of this library (unless the provided +parameters, such as image line, were prefered to be allocated dynammically by +the user) nor to free them directly. In order to reduce disk access, the file +buffer is increased to FILE_BUFFER_SIZE (defined in gif_lib.h). The library +was compiled in large model as the memory allocated per file is quite big: +about 17k for decoding (DGIF_LIB.C), and 32k for encoding (EGIF_LIB.C), +excluding the FILE_BUFFER_SIZE. + + We now can see what the library contains (directory GIF/LIB): + +1. EGIF_LIB.C - Encoding routines, all prefixed with E. +2. DGIF_LIB.C - Decoding routines, all prefixed with D. +3. DEV2GIF.C - Routines to convert specific device buffers into GIF files. +4. GIF_ERR.C - Error handler for the library. + The library has fifth hashing table file in which is accessed internally +only. + Major part of the routines returns ERROR (see gif_lib.h) if something went +wrong or OK otherwise. Once ERROR received, GIF_ERR.C module can be used to +do something about it. + + In addition a module to scan the command line arguments was added. +This module is called GETARG.C and its headers are in GETARG.H. see header +of GETARG.C for details on its usage. + + +ENCODING (EGIF_LIB.C) +--------------------- + +GifFileType *EGifOpenFileName(char *GifFileName, int GifTestExistance); + + Open a new GIF file using the given GifFileName. If GifTestExistance + is TRUE, and file exists, the file is not destroyed, and NULL returned. + If any error occurs, NULL is returned and Error handler can be used + to get the exact error (see GIF_ERR.C). + The file is opened in binary mode, and its buffer size is set to + FILE_BUFFER_SIZE bytes. + + +GifFileType *EGifOpenFileHandle(int GifFileHandle); + + Open a new GIF file using the given GifFileHandle + If any error occurs, NULL is returned and Error handler can be used + to get the exact error (see GIF_ERR.C) + The file is opened in binary mode, and its buffer size is set to + FILE_BUFFER_SIZE bytes. + + +void EGifSetGifVersion(char *Version); + + Sets the GIF version of all files to be open from this point (until + another call to this routine is made. Version is a 3 characters + string of the form "87a" or "89a". No test is made to validate this + string. + + +int EGifPutScreenDesc(GifFileType *GifFile, + int GifWidth, int GifHeight, int GifColorRes, int GifBackGround, + int GifBitsPerPixel, GifColorType *GifColorMap); + + Update GifFile Screen parameters, in GifFile structure and in real + file. if error occurs returns ERROR (see gif_lib.h), otherwise OK. + This routine should be called immediately after the GIF file was + opened. + + +int EGifPutImageDesc(GifFileType *GifFile, + int GifLeft, int GifTop, int Width, int GifHeight, int GifInterlace, + int GifBitsPerPixel, GifColorType *GifColorMap); + + Update GifFile Image parameters, in GifFile structure and in real + file. if error occurs returns ERROR (see gif_lib.h), otherwise OK. + This routine should be called each time a new image should be + dumped to the file. + + +int EGifPutLine(GifFileType *GifFile, PixelType *GifLine, int GifLineLen); + + Dumps block of pixels out to the GIF file. The line length can be + of any length. More than that, this routine may be interleaved with + EGifPutPixel, until all pixels were sent. + Returns ERROR if something went wrong, OK otherwise. + + +int EGifPutPixel(GifFileType *GifFile, PixelType GifPixel); + + Dumps one pixel to the GIF file. This routine may be interleaved + with EGifPutLine, until all pixels were sent. Because of the overhead + per each call, the usage of this routine is not recommended. + Returns ERROR if something went wrong, OK otherwise. + + +int EGifPutComment(GifFileType *GifFile, char *GifComment); + + Uses extension GIF records to save a string as a comment is the file. + The extension code is 'C' (for Comment). This is optional in GIF file. + Returns ERROR if something went wrong, OK otherwise. + + +int EGifPutExtension(GifFileType *GifFile, int GifExtCode, int GifExtLen, + void *GifExtension); + + Dumps the given extension block into the GIF file. Extension blocks + are optional in GIF file. Extension blocks of more than 255 bytes or + more than one block are not supported. + Returns ERROR if something went wrong, OK otherwise. + + +int EGifPutCode(GifFileType *GifFile, int *GifCodeSize, + ByteType **GifCodeBlock); + + It sometimes may be desired to write the compressed code as is + without decoding it. For example a filter for GIF file that change + only screen size (GifPos), does not need the exact pixel values and + pipes out the compressed image as is, make this process much faster. + This routine do exactly that (with EGifPutCodeNext), and can be + used instead of EGifPutLine. This usually works with the + DGifGetCode/DgifGetCodeNext routines, which reads the compressed + code, while EGifPutCode/EGifPutCodeNext write it out. See GifPos.c + for example. + Returns ERROR if something went wrong, OK otherwise. + + +int EGifPutCodeNext(GifFileType *GifFile, ByteType **GifCodeBlock); + + See EGifPutCode above. + + +int EGifCloseFile(GifFileType *GifFile); + + Close GIF file and free all memory allocated for it. GifFile should + not be used, once this routine was called. + Returns ERROR if something went wrong, OK otherwise. + + +DECODING (DGIF_LIB.C) +--------------------- + +GifFileType *DGifOpenFileName(char *GifFileName); + + Open a new GIF file using the given GifFileName, and read its Screen + information. + If any error occurs, NULL is returned and Error handler can be used + to get the exact error (see GIF_ERR.C). + The file is opened in binary mode, and its buffer size is set to + FILE_BUFFER_SIZE bytes. + + +GifFileType *DGifOpenFileHandle(int GifFileHandle); + + Open a new GIF file using the given GifFileHandle, and read its + Screen information. + If any error occurs, NULL is returned and Error handler can be used + to get the exact error (see GIF_ERR.C) + The file is opened in binary mode, and its buffer size is set to + FILE_BUFFER_SIZE bytes. + + +int DGifGetScreenDesc(GifFileType *GifFile); + + Reads the screen information into the GifFile structure. Note this + routine is automatically called once a file is opened, and therefore + usually not needed. + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); + + As the GIF file can have different records in arbitrary order, this + routine should be called once the file was open to detect the next + record type, and act upon it. Few types might be returned in GifType: + 1. UndefinedRecordType - something is wrong! + 2. ScreenDescRecordType - screen information. As the screen information + is automatically read in when the file is open, this usually would + not happen. + 3. ImageDescRecordType - next record is Image. + 4. ExtensionRecordType - next record is extension block. + 5. TerminateRecordType - last record reached, can close the file. + The first Two types can usually be ignored. + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetImageDesc(GifFileType *GifFile); + + Reads the image information into the GifFile structure. + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetLine(GifFileType *GifFile, PixelType *GifLine, int GifLineLen); + + Load block of pixels from the GIF file. The line length can be + of any length. More than that, this routine may be interleaved with + DGifGetPixel, until all pixels were read. + Returns ERROR if something went wrong, OK otherwise. + +int DGifGetPixel(GifFileType *GifFile, PixelType GifPixel); + + Loads one pixel from the GIF file. This routine may be interleaved + with DGifGetLine, until all pixels were read. Because of the overhead + per each call, the usage of this routine is not recommended. + Returns ERROR if something went wrong, OK otherwise. + +int DGifGetComment(GifFileType *GifFile, char *GifComment); + + Load comment from the GIF file. Because DGifGetRecordType will + only tell this records is of type extension, this routine should be + called iff it is known %100 that is must be a comment. + For definition of comment, see EGifPutComment. + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, + ByteType **GifExtension); + + Loads the given extension block from the GIF file. Extension blocks + are optional in GIF file. This routine should be follows by + DGifGetExtensionNext - see below + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetExtensionNext(GifFileType *GifFile, ByteType **GifExtension); + + As extensions may contain more than one block, use this routine to + continue after DGifGetExtension, until *GifExtension is NULL. + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, + ByteType **GifCodeBlock); + + It sometimes may be desired to read the compressed code as is + without decoding it. This routine do exactly that (with + DGifGetCodeNext), and can be used instead of DGifGetLine. + This compressed code information can be written out using the + EGifPutCode/EGifPutCodeNext sequence (see GifPos.c for example). + Returns ERROR if something went wrong, OK otherwise. + + +int DGifGetCodeNext(GifFileType *GifFile, ByteType **GifCodeBlock); + + See DGifGetCode above. + + +int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); + + This routine can be called instead of DGifGetLine/DGifGetPixel or + DGifGetCode/DGifGetCodeNext to get the 12 bits LZ codes of the images. + It may be used mainly for debugging purposes (see GifText.c for + example). + Returns ERROR if something went wrong, OK otherwise. + + +int DGifCloseFile(GifFileType *GifFile); + + Close GIF file and free all memory allocated for it. GifFile should + not be used, once this routine was called. + Returns ERROR if something went wrong, OK otherwise. + + + +ERROR HANDLING (EGIF_LIB.C) +--------------------------- + +void PrintGifError(void) + + Print one line diagnostic on the last gif_lib error to stderr. + + +int GifLastError(void) + + Return last gif_lib error, and clear the error. + Note it is the user responsibility to call the file closing routine, + so the file will be closed (if was opened), and memory will be released + (if was allocated). + The different error types are defined in gif_lib.h. + + +DEVICE SPECIFIC (XXX2GIF.C) +--------------------------- + +int DumpScreen2Gif(char *FileName, int ReqGraphDriver, int ReqGraphMode1, + int ReqGraphMode2); + + Dumps the whole device buffer as specified by GraphDriver and + GraphMode (as defined in TC 2.0 graphics.h) into FileName as GIF file. + Current devices supported: + 1. Hercules. + 2. EGA, EGA64, EGAMONO (all modes - see TC graphics.h). + 3. VGA (all modes - see TC graphics.h). + 4. SVGA_SPECIAL. This mode is special and not supported by Borland + graphics.h. ReqGraphDriver must be equal to 999, and ReqGraphMode + is ignored. This modes assumes 800 by 600 in 16 colors. + Returns ERROR if something went wrong, OK otherwise. + 5. SGI 4D using gl graphic library - window dump. + 6. X11 window dump. + + +COMMAND LINE PARSING (GETARG.C) +------------------------------- + +int GAGetArgs(int argc, char **argv, char *CtrlStr, ...); + + Main routine of this module. Given the argc & argv as received by + the main procedure, the command line CtrlStr, and the addresses of + all parameters, parse the command line, and update the parameters. + The CtrlStr defines what types of variables should follow. Look + at the beginning of getarg.c for exact usage. + Returns 0 if successful, error number (as defined by getarg.h) + otherwise. + + +void GAPrintErrMsg(int Error); + + If error occurred in GAGetARgs, this routine may be used to print + one line diagnostic to stderr. + + +void GAPrintHowTo(char *CtrlStr); + + Given same CtrlStr as for GAGetArgs, can be used to print a + one line 'how to use' + + +Skeleton of GIF filter +---------------------- + + This completes the functions, application can access. An application +skeleton usually will look like (assuming it is a filter - read GIF file, +modifies it, and write new GIF file) the following example, which only copy +a GIF file from stdin to stdout. Please give a pick to the utilities on the +util directory to get more idea once you fill comfortable with this skeleton. +Also try to follow the coding standards of this package if you want me to +officially add your new utility to it. + +#include "getarg.h" + +main(... ) +{ + GifFile *GifFileIn, *GifFileOut; + + GAGetArgs( argc, argv, CtrlStr, ... ); /* Process command line */ + + /* Use the stdin as input (note this also read screen descriptor in: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* Use the stdout as output: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + /* And dump out its screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the input GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont really */ + /* care what we have there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == ERROR || + EGifPutCode(GifFileOut, CodeSize, CodeBlock) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) { + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/DOC/LIBERROR.DOC b/G/DOC/LIBERROR.DOC new file mode 100644 index 0000000..07a8477 --- /dev/null +++ b/G/DOC/LIBERROR.DOC @@ -0,0 +1,125 @@ + GIF_LIB ERROR + ------------- + +Errors as reported from the GIF_LIB library are divided to 2 major parts: +the encoder (errors prefixed by E_GIF_ERR), and the decoder (errors prefixed +by D_GIF_ERR). This document explains them briefly: + +Encoding errors: +---------------- + +1. E_GIF_ERR_OpenFailed + Message printed using PrintGifError: "Failed to open given file" + IO error result when attempt to open the given GIF file. + +2. E_GIF_ERR_WriteFailed + Message printed using PrintGifError: "Failed to Write to given file" + IO error result when attempt to write to the given GIF file. + +3. E_GIF_ERR_HasScrnDscr + Message printed using PrintGifError: "Screen Descriptor already been set" + Attempt to write second screen descriptor to same GIF file. GIF file should + have exactly one screen descriptor which should be set directly after the + file is opened. + +4. E_GIF_ERR_HasImagDscr + Message printed using PrintGifError: "Image Descriptor is still active" + Image descriptor should be sent before and image dump, and no second + image descriptor should be sent before current image dump ended. This error + occured probably because current image was not complete. + +5. E_GIF_ERR_NoColorMap + Message printed using PrintGifError: "Neither Global Nor Local color map" + An image must have either global (screen) or local (image) color map. + Neither were given in this case. + +6. E_GIF_ERR_DataTooBig + Message printed using PrintGifError: "#Pixels bigger than Width * Height" + The number of pixels dumped for this image is bigger than specified by + image Height times image Width. + +7. E_GIF_ERR_NotEnoughMem + Message printed using PrintGifError: "Fail to allocate required memory" + Once an attemp is made to open GIF file, special structures are allocated + to hold internal data for it. If allocation fails this error is returned. + +8. E_GIF_ERR_DiskIsFull + Message printed using PrintGifError: "Write failed (disk full?)" + Writing encoded data failed. + +9. E_GIF_ERR_CloseFailed + Message printed using PrintGifError: "Failed to close given file" + Closing file failed. + +10. E_GIF_ERR_NotWriteable + Message printed using PrintGifError: "Given file was not opened for write" + GIF files can be opened both for read (DGIF part of library) and write + (EGIF part of library). This error occurs when a file is opened for read + (using DGIF) is given to one of the encoding (EGIF) routines. + + +Encoding errors: +---------------- + +1. D_GIF_ERR_OpenFailed + Message printed using PrintGifError: "Failed to open given file" + IO error result when attempt to open the given GIF file. + +2. D_GIF_ERR_ReadFailed + Message printed using PrintGifError: "Failed to Read from given file" + IO error result when attempt to write to the given GIF file. + +3. D_GIF_ERR_NotGifFile + Message printed using PrintGifError: "Given file is NOT GIF file" + GIF files should have special stamp identifies them as such, If that stamp + is not found, this error is issued. + +4. D_GIF_ERR_NoScrnDscr + Message printed using PrintGifError: "No Screen Descriptor detected" + Each GIF file should have screen descriptor in its header. This error will + be generated if no such descriptor was found. + +5. D_GIF_ERR_NoImagDscr + Message printed using PrintGifError: "No Image Descriptor detected" + Each image should have image descriptor in its header. This error will + be generated if no such descriptor was found. + +6. D_GIF_ERR_NoColorMap + Message printed using PrintGifError: "Neither Global Nor Local color map" + An image must have either global (screen) or local (image) color map. + Neither were given in this case. + +7. D_GIF_ERR_WrongRecord + Message printed using PrintGifError: "Wrong record type detected" + Each record in GIF file has special identifier, in its header. If the + record has wrong identifier, this error is generated. + +8. D_GIF_ERR_DataTooBig + Message printed using PrintGifError: "#Pixels bigger than Width * Height" + The number of pixels dumped for this image is bigger than specified by + image Height times image Width. + +9. D_GIF_ERR_NotEnoughMem + Message printed using PrintGifError: "Fail to allocate required memory" + Once an attemp is made to open GIF file, special structures are allocated + to hold internal data for it. If allocation fails this error is returned. + +10. D_GIF_ERR_CloseFailed + Message printed using PrintGifError: "Failed to close given file" + Closing file failed. + +11. D_GIF_ERR_NotReadable + Message printed using PrintGifError: "Given file was not opened for read" + GIF files can be opened both for read (DGIF part of library) and write + (EGIF part of library). This error occurs when a file is opened for write + (using EGIF) is given to one of the decoding (DGIF) routines. + +12. D_GIF_ERR_ImageDefect + Message printed using PrintGifError: "Image is defective, decoding aborted" + This error is generated, once the decoding failed - probably image is + defect. + +13. D_GIF_ERR_EOFTooSoon + Message printed using PrintGifError: "Image EOF detected, before image complete" + This error is generated once EOF code is detected in encoded image before + all the pixels (Width * Height) has be decoded. diff --git a/G/DOC/RAW2GIF.DOC b/G/DOC/RAW2GIF.DOC new file mode 100644 index 0000000..b1d2d7b --- /dev/null +++ b/G/DOC/RAW2GIF.DOC @@ -0,0 +1,36 @@ + Raw2Gif + ------- + +Program to convert RAW image data into GIF files. Only one image can be +handled. The RAW image file, assumes to hold one pixel color in one byte, +and therefore the file size must be Width times Height as specified by the +-s option below. + +Usage: +------ + +Usage: Raw2Gif [-q] -s Width Height [-p ColorMapFile] [-h] RawFile + + If no RawFile is given, Raw2Gif will try to read stdin for RAW data. +Gif File is dumped to stdout. + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. -s Width Height : the dimensions of the image MUST be specified in the + command line. The RAW image file size must be exactly Width times Height + bytes (each byte is one pixel color). +3. [-p ColorMapFile] : Color map to load for given RAW image. This file has + 4 integers in line (ColorIndex Red Green Blue), and the ColorIndex is + in order starting from 1. See GifClrMp, which can also use/create these + bitmap files. If no color map is specified, uses the EGA 16 color pallete + as default color map. +4. [-h] : print one command line help, similar to Usage above. diff --git a/G/DOC/RGB2GIF.DOC b/G/DOC/RGB2GIF.DOC new file mode 100644 index 0000000..5cb21c3 --- /dev/null +++ b/G/DOC/RGB2GIF.DOC @@ -0,0 +1,39 @@ + RGB2Gif + ------- + +Program to convert 24 bit images to a GIF image using color quantization. + + +Usage: +------ + +Usage: RGB2Gif [-q] [-c #Colors] [-1] -s Width Height [-h] RGBFile + +If no RGBFile is given, RGB2Gif will try to read stdin for GIF file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-c #Colors] specifies number of colors to use, in bits per pixels, so + '-c 8' specifies actually 256 colors (maximum and default). +3. [-1] : Only one file in the format of RGBRGB... triplates (Each of R, G, B + is a byte) is read from input. This file size is 3 * Width * Height (see + '-s' below. If stdin is used for input, this option is implicitly applied. + The default (if not '-1') is 3 files with the names RGBFile.R, RGBFile.G, + RGBFile.B, each of which is Width * Height bytes. +4. [-s Width Height] specifies the size of the image to read. +5. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + Due to 8088 limitation, on MSDOS, maximum image size can not exceed +64k pixels. diff --git a/G/DOC/RLE2GIF.DOC b/G/DOC/RLE2GIF.DOC new file mode 100644 index 0000000..eb46a0d --- /dev/null +++ b/G/DOC/RLE2GIF.DOC @@ -0,0 +1,36 @@ + Rle2Gif + ------- + +Program to convert images saved as RLE (utah raster toolkit) to GIF format. + + +Usage: +------ + +Usage: Rle2Gif [-q] [-c #Colors] [-h] RleFile + +If no RleFile is given, Rle2Gif will try to read stdin for Rle file. + + +Memory required: +---------------- + +Screen. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-c #Colors] : Select size of color map in the output Gif file. #Colors + should be given as the based 2 log of number of colors. Default is 8 + which is 256 colors, and which is also the maximum. +3. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + As the RLE format allows full 24 bits per pixel (8 per primmery color) +Colors must be quantized to the number of colors as set by the [-c] option, +above. This process is quite slow. See the quantize.c file in the lib +directory for the reference for this quantization algorithm (median cut). diff --git a/G/DOC/TEXT2GIF.DOC b/G/DOC/TEXT2GIF.DOC new file mode 100644 index 0000000..c93ebf7 --- /dev/null +++ b/G/DOC/TEXT2GIF.DOC @@ -0,0 +1,48 @@ + Text2Gif + -------- + +Program to generate gif images out of regular text. Text can be one line +or multi line, and is converted using 8 by 8 fix font. + +Usage: +------ + +Usage: Text2Gif [-q] [-s ClrMapSize] [-f FGClr] [-c R G B] [-t "Text"] [-h] + + Text2Gif read stdin if no text is provided in the command line (-t), +and will dump the created GIF file to stdout. + + +Memory required: +---------------- + +Line. + + +Options: +-------- + +1. [-q] : quite mode. Default off on MSDOS, on on unix. Controls printout + of running scan lines. Use -q- to turn off. +2. [-s ClrMapSize] explicitly defines the size of the color map of the + resulting gif image. Usually the image will be bicolor with fg as color + 1, unless [-f] is explicitly given in case the color map size will be + big enough to hold it. However it is sometimes convenient to set the + color map size to certain size while the fg color is small mainly so + this image may be merged with another (images must match color map size). +3. [-f FG] : select foreground index (background is always 0). By default + it is one and therefore the image result is bicolored. + if FG is set to n then color map will be created with 2^k entries where + 2^k > n for minimum k, assuming k <= 8. This color map will be all zeros + except this forground index. This option is useful if this text image + should be integrated into other image colormap using their colors. +4. [-c R G B] : The color to use as the foreground color. While by default. +5. [-t "Text"] : in case of one line text, it can be provided on the command + line. Note you must encapsulate the Text within quotes if it has spaces + (The quotes themselves are not part of the text). If no -t option is + provided, stdin is read until end of file. +6. [-h] : print one command line help, similar to Usage above. + +Notes: +------ + There is a hard bound limit on the number of lines, and it is set to 100. diff --git a/G/DOS2UNIX b/G/DOS2UNIX new file mode 100644 index 0000000..d91eec0 --- /dev/null +++ b/G/DOS2UNIX @@ -0,0 +1,36 @@ +#!/bin/csh -f +# +# Gershon Elber, Feb 90. +# + +set upcase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +set locase = "abcdefghijklmnopqrstuvwxyz" + +echo +echo +++++ Rename directories: +echo +foreach d (`find . -type d -print`) + set new_d = `echo $d | tr $upcase $locase` + + if ( "$d" != "$new_d" ) then + echo $d to $new_d + mv $d $new_d + endif +end + +echo +echo +++++ Rename files, strip CR/LF to LF and remove DOS ^Z: +echo +foreach f (`find . -type f -print`) + set new_f = `echo $f | tr $upcase $locase` + echo $f to $new_f + + tr -d "\015\032" < $f > $new_f.tmp + rm -r $f + mv $new_f.tmp $new_f +end + +# +# Do small fixes manually. +# +(chmod +x dos2unix make-unx test-unx) diff --git a/G/GIF/BGI.EXE b/G/GIF/BGI.EXE new file mode 100644 index 0000000000000000000000000000000000000000..01d37f828d14cacdefd0223a81b355d114a94843 GIT binary patch literal 60502 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 literal 0 HcmV?d00001 diff --git a/G/GIF/CHERYL.GIF b/G/GIF/CHERYL.GIF new file mode 100644 index 0000000000000000000000000000000000000000..b250eec128fb590ac8007b326a738a938be746fb GIT binary patch literal 21504 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

4ILJ| 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 HJrMps?zUXn literal 0 HcmV?d00001 diff --git a/G/GIF/GIF2HERC.EXE b/G/GIF/GIF2HERC.EXE new file mode 100644 index 0000000000000000000000000000000000000000..5057759b42b91eb2569ce7fe4ca6c154588646ab GIT binary patch literal 69114 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 S12E-IKC_Fa7v#t{xc?V!ZsR8a literal 0 HcmV?d00001 diff --git a/G/GIF/GIF2PS.EXE b/G/GIF/GIF2PS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..51f9bf71502079522ed9b934f5662811f7ec6ec9 GIT binary patch literal 50047 zcmeFae|!|x)jvKvvpc)lO*VmqfCQJ{E4qqEB#N6r6xpa~h=3bV2)4FpZL4kAO|(rm zn{F#?22zoyiab6(qPA7AKG32r(87|0gddG&lZqj+fPlEmAjW{%{9@<(J~OjPKy3B- ze!qWwU*C^-vv=-~bMHO(+;h%7_spI99?WGPWd6xK%rJ~3{l)0TFa0+QLBsSFJYFn6 ze#0LP(u)vYLzqtw+WlNTx1ZaI@Joan5GEmvLWr{axpN375cVOwjPM-7!w5GaOh)L_ z?B_m1Xh(PlVH3gzgl7UCe&24dH!+-3S{I+z4Iz{agg$V}wHp zI}qMNcm*LDA;bf=Za?>11Rp{&0*}y(F`PtbLwFzIZG_(=yom4wLJq>s2vaC-!kCQv zxfc-bMVO5+9pUkW{ail69SCC(QW1EBV}|`)Gs5c#

UhnF!Y-3`5W&)HB-?UP9P_ z@C8?<%|#f7@JF^x+odVfh7tB4Y(sbvp#^%jI>PS|u19#wRHnTNq1jlb%|JMrP^SG5p#fnV!a9T=Lz#9X!i@;84lC3C452@z zO#22xv37gHZ0051^$5E(ujn=*Owesl*v0PFy^4^IFiW#rHw_^TVIs3z_d9;K&WVtQ z(5&07dln%dAraxAcDHUdf&<}Y({A1E2&as@b*m7rLugFct@{~5D#E*l-MS?RpC#|s zg%I9Dcn0D72y+p}BWMvmGVj*Cgs>Rl7K9XpuB6?%6A14k>_qqj!gB~eN9Y>1TXzPb z4&i?go=5mK!eWHk2o?k$A(FCN7eM$Agi?fs2w4aT2uE3lIf?KE!a|N=j9P}tK$whh z6M`LKJHn!Cj`5olwkN!f@G`;%gy#^}AUuPx*|a_34+yU!ym&3cJa#MA*#G(O|6t(% zF%0b7o-oy)zK-2Kt#Q0Cm1P9W^-Oi!Yvs%u{+Ep3Qp)(Ju4BRvXf~BH)xpf5&?DB?Ae}B-Cz}F{RdMi zG3-ji9)`90@w83b@L)m`=I~)X5Xyrq_mPe@2ql$E6y#|duMqVOYtoM&Ej1w z(>T8Py6uk&mh2?N#%;fAmxhu?=DxO$xeJZljRzx@WRQ%mJfYdnG>-PCS2BLHk1+;a ziGf^#_?lo0b=sL^oKBnv6g@q(d9~1hv*|plt=VY ziXI9u8sQ`1sQsAhDyw(4E0H1yXfCdFXuy%W{JU6vFEX>XvW@@!% z9UDF)1vrKc3yMDTw{-QJ3V>A}+-TgRP#<@C74jqC>nfxj3xPSX}96!VME5X|*N zOReEA5*B}8aTW&dWU^i}GrAytQkYG*CuF^5WM0Wl$a+=JtT`}!fAx{T%`T`gNKlm*Xb`3AGavQrOsTvE&TFqb2*d(l&tqiT1vDVvk zuF=-YoLg^kcUXl7SZ{BR`?ERT)5pBAC2q}};h`qeJIK_IJ$YR!O>fo z(BSB=M=VyD;7&v8g7HW_#v}E(6{*Mgz|E6)7@2*}?#A)CC;9@jChv3hH;xamlg(py zehj3k09|RD%9&@5=WuCmW57+BjmT`gZr^lgg5S|ioq)dM%kO3z zXFSm@IJ&dO^DL7Yd{Ovx8BshSE_J5YHxBGJod(! z4y|}^;|xzMz$7;2m>e;`qaR)BZ@lG+M7g%HaYm80aR!PR8fPMg3doO%*9kQy$8eJ) z#pE!X9Eq-UdrSH7#u?{K2V7j^jN=V_1v7yWwFC!as!3zev#rY~)MV$m%~o%PG|jD_ zXFpPUK{U|QRJUf{vRb+G)0~C8;4tS*VM_SG6vpo`qf1pzgZIQSZ?D5`ine-EY(XT8 z38r9$E}&t=1aI$Lw>DRDn5B~8Qb|fd`r4w{!t}KzO-{j~EeL<8U0>%h_E+{{;D*Y+ zScPkZI5}Xu+vkZfE;cuJOCaB|C6b^C*zyOGw%)!a5@ozpg4=q-X1N2)(E(RF8gs4m z^<6A`0^KwP-I`o`YsL3{eN!ryfuNHE)243OpTF5orJc8eB-KP;X|=ieRhx0%>k77 z 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 z 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 PN-47zOe-l=FS!4oN^g)h literal 0 HcmV?d00001 diff --git a/G/GIF/GIFFIX.EXE b/G/GIF/GIFFIX.EXE new file mode 100644 index 0000000000000000000000000000000000000000..4adf0076028535e98b23619bc455c13c6474b813 GIT binary patch literal 38471 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

0`6H*SK z<2dYo0EI`{0|0u7k5vHZTRm(g;Bi7K0Y^z>ssJ_;nN@(rgggik*ieDFfyCpRkgOUA zeH@Z`fQ-fm9GMpgeaVs40HH4rvRWYYjV-ns$TB04hk$%Z$Pa@(=#eUnrH@c}VvfiwW2Z#J@rfjIFEM&<`XpIT!-29k#F@Ufo&p%3!0 zM}W{L^Vm8d^yMqI9!RbkNC3zagfs$qBngNJgg%JGHUOdbuh~W*^qMtm0z&VNvqyo@ z_u$xLK=4m}>)GQ#=rdb5AVq&84D3l<=o6;wr$Fetr0i$(1Q9Cs6fTPic^XIwACUTpAhmJAnOQu35ZC@%Rn9_Os)O-B1 z4LrY2z5hVH*Q@s*s`m!<{(sbaqk8`y+xq&esk_+50{!6k*-!A>!In;P4Eh86_!qCH z?q+=(5tgim?02mOenHC-6uRxD2?vtQygmvLBYYt5^y5 z;MvT)!nt=B`Az0iZZ3nNbyERvF6QZQ}iOe&*Xm0zUJyL&oM7H$QLw+-bn>=9h}R9Q^cFl5vd`S3%+I{P~C>(%{U_pFv2q zXVubGL_`UX1QSwGT1{LoaaYw)mCF$$!*8iuK@i7BfS4ylP!JJKi{d3q+|*_@zm!)k z^$<;kv!>lS!$mSd6nmRFw#>Gm?s+NNU z^=A1pifZA0d4;$7K3wSnl8}9F!K{2|0g${|^Xa-=&B^@|ssh22YFrdPE>{@8+*3w{ zmn#7>a0bGL9+%{+NbKdlQm_c2a?V7M4V2#lWhF{ukqfm&jElMO(k0GW$hD^)80)z9|a5l-h@0 zw4roPEz#3CHQ~-hlmzK5nO#}#xvjMNzWJp~sJA6Epcvh;39~D!%iO)P%vxPu?WvB* z0|M@fh#BxZp#=E;6e}qpA0A2SZQe9cHqE^P4d+ec&+uSQ^@`~2ZB@1NtJutG^QX<5 zl}8F3J53W@2-H?#s?g1iu{Srx-eg5@W=z0}LX(aoH5@6ctSLv}7&x#yE72k$)nzI& zul$G9`Bl{r_L8bJfX^}FofpA$&JCpZFiTyumXZvYETu>{uCxg8dCf6ZC2?F; z7?`SMr7LM-@UT5nlvPq!$>E9@==;!HP3}7Dhp|C#$6%Q z^o$x$l*RL)ZRb}li{2~iD-@yxXD(((d95kTY^sb748;nQ*0)S@WkA=BXFl|6j*E&Vv8| literal 0 HcmV?d00001 diff --git a/G/GIF/GIFHISTO.EXE b/G/GIF/GIFHISTO.EXE new file mode 100644 index 0000000000000000000000000000000000000000..bd621a4cad87ad6520de51dc976960a6cfb11f73 GIT binary patch literal 39256 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

8-^HHx3x86V%I)PRuq|BkF0GR66IY%2b~&i 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 literal 0 HcmV?d00001 diff --git a/G/GIF/GIFPOS.EXE b/G/GIF/GIFPOS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..75fe0f66f0ee9c7d6ed52e1c56a57fbc7bbb0a1a GIT binary patch literal 37671 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 DfCCq6 literal 0 HcmV?d00001 diff --git a/G/GIF/GIFROTAT.EXE b/G/GIF/GIFROTAT.EXE new file mode 100644 index 0000000000000000000000000000000000000000..441242ac164989e0db025c0452ef99eab4774c74 GIT binary patch literal 55574 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 bUprjUCt@fQRP3^?H;i2)Lb27;5B1Y1ak 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 lqGn8kT002`v17(xQkkkHMu2`VH@ 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 literal 0 HcmV?d00001 diff --git a/G/GIF/PORSCHE.GIF b/G/GIF/PORSCHE.GIF new file mode 100644 index 0000000000000000000000000000000000000000..916014e2c466fee2aead7b9d8ba5f7fa9c5cca99 GIT binary patch literal 6144 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 utT6Oh~DC8*s literal 0 HcmV?d00001 diff --git a/G/GIF/RAW2GIF.EXE b/G/GIF/RAW2GIF.EXE new file mode 100644 index 0000000000000000000000000000000000000000..83a933340fcc8b05cf619a118d4eb3722d13a598 GIT binary patch literal 33261 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 literal 0 HcmV?d00001 diff --git a/G/GIF/RGB2GIF.EXE b/G/GIF/RGB2GIF.EXE new file mode 100644 index 0000000000000000000000000000000000000000..b9e08de52e33bc4a355587d894919d1c7caf7e11 GIT binary patch literal 37736 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

~ep&zYe+%!#~USP;eAWHBuFQKOgI2?8b%Q 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

^gUKRH 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 +#include +#include +#endif /* __MSDOS__ */ + +#ifdef __SGI_GL__ +#include +#endif /* __SGI_GL__ */ + +#ifdef __X11__ +#include +#endif /* __X11__ */ + +#include +#include "gif_lib.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +#define SVGA_SPECIAL 999 /* 800 by 600 Super VGA mode. */ + +static int GraphDriver = -1, /* Device parameters - reasonable values. */ + GraphMode = -1, + ScreenColorBits = 1; +static long ScreenXMax = 100, + ScreenYMax = 100; +static unsigned int ScreenBase; + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +#if defined(__SGI_GL__) || defined(__X11__) + GifByteType *GlblGifBuffer = NULL, *GlblGifBufferPtr = NULL; +#endif /* __SGI_GL__ || __X11__ */ + +#ifdef __SGI_GL__ +static int QuantizeRGBBuffer(int Width, int Height, long *RGBBuffer, + GifColorType *ColorMap, GifByteType *GIFBuffer); +#endif /* __SGI_GL__ */ + +static void GetScanLine(GifPixelType *ScanLine, int Y); +static int HandleGifError(GifFileType *GifFile); + +/****************************************************************************** +* Dump the given Device, into given File as GIF format: * +* Return 0 on success, -1 if device not supported, or GIF-LIB error number. * +* Device is selected via the ReqGraphDriver. Device mode is selected via * +* ReqGraphMode1/2 as follows: * +* 1. IBM PC Hercules card: HERCMONO (one mode only) in ReqGraphMode1, * +* ReqGraphMode2/3 are ignored. * +* 2. IBM PC EGA card: EGALO/EGAHI in ReqGraphMode1, * +* ReqGraphMode2/3 are ignored. * +* 3. IBM PC EGA64 card: EGA64LO/EGA64HI in ReqGraphMode1, * +* ReqGraphMode2/3 are ignored. * +* 4. IBM PC EGAMONO card: EGAMONOHI (one mode only) in ReqGraphMode1, * +* ReqGraphMode2/3 are ignored. * +* 5. IBM PC VGA card: VGALO/VGAMED/VGAHI in ReqGraphMode1, * +* ReqGraphMode2/3 are ignored. * +* 6. IBM PC SVGA card: ReqGraphMode1/2 are both ignored. Fixed mode (800x600 * +* 16 colors) is assumed. * +* 7. SGI 4D using GL: window id to dump (as returned by winget()) in * +* ReqGraphMode1, ReqGraphMode2/3 are ignored. * +* 8. X11: Window id in ReqGraphMode1, Display id in ReqGraphMode2, Color * +* map id in ReqGraphMode3. * +******************************************************************************/ +int DumpScreen2Gif(char *FileName, int ReqGraphDriver, int ReqGraphMode1, + int ReqGraphMode2, + int ReqGraphMode3) +{ + int i, j, k; + GifPixelType *ScanLine; + GifFileType *GifFile; + GifColorType *ColorMap = NULL; +#ifdef __MSDOS__ + static GifColorType MonoChromeColorMap[] = { + { 0, 0, 0 }, + { 255, 255, 255 } + }; + /* I have no idea what default EGA64 (4 colors) should be (I guessed...).*/ + static GifColorType EGA64ColorMap[] = { + { 0, 0, 0 }, /* 0. Black */ + { 255, 0, 0 }, /* 1. Red */ + { 0, 255, 0 }, /* 2. Green */ + { 0, 0, 255 }, /* 3. Blue */ + }; + static GifColorType EGAColorMap[] = { + { 0, 0, 0 }, /* 0. Black */ + { 0, 0, 170 }, /* 1. Blue */ + { 0, 170, 0 }, /* 2. Green */ + { 0, 170, 170 }, /* 3. Cyan */ + { 170, 0, 0 }, /* 4. Red */ + { 170, 0, 170 }, /* 5. Magenta */ + { 170, 170, 0 }, /* 6. Brown */ + { 170, 170, 170 }, /* 7. LightGray */ + { 85, 85, 85 }, /* 8. DarkGray */ + { 85, 85, 255 }, /* 9. LightBlue */ + { 85, 255, 85 }, /* 10. LightGreen */ + { 85, 255, 255 }, /* 11. LightCyan */ + { 255, 85, 85 }, /* 12. LightRed */ + { 255, 85, 255 }, /* 13. LightMagenta */ + { 255, 255, 85 }, /* 14. Yellow */ + { 255, 255, 255 }, /* 15. White */ + }; +#endif /* __MSDOS__ */ +#if defined(__SGI_GL__) || defined(__X11__) + long *RGBBuffer; + GifColorType ColorMap256[256]; +#endif +#ifdef __X11__ + XImage *XImg; + unsigned long XPixel; + XColor XColorTable[256]; /* Up to 256 colors in X. */ + XWindowAttributes WinAttr; +#endif /* __X11__ */ + + switch (ReqGraphDriver) { /* Return on non supported screens. */ +#ifdef __MSDOS__ + case HERCMONO: + ScreenXMax = 720; + ScreenYMax = 350; + ScreenColorBits = 1; + ScreenBase = 0xb000; + ColorMap = MonoChromeColorMap; + break; + case EGA: + switch (ReqGraphMode1) { + case EGALO: + ScreenYMax = 200; + break; + case EGAHI: + ScreenYMax = 350; + break; + default: + return -1; + } + ScreenXMax = 640; + ScreenColorBits = 4; + ScreenBase = 0xa000; + ColorMap = EGAColorMap; + break; + case EGA64: + switch (ReqGraphMode1) { + case EGA64LO: + ScreenYMax = 200; + break; + case EGA64HI: + ScreenYMax = 350; + break; + default: + return -1; + } + ScreenXMax = 640; + ScreenColorBits = 2; + ScreenBase = 0xa000; + ColorMap = EGA64ColorMap; + break; + case EGAMONO: + switch (ReqGraphMode1) { + case EGAMONOHI: + ScreenYMax = 350; + break; + default: + return -1; + } + ScreenXMax = 640; + ScreenColorBits = 1; + ScreenBase = 0xa000; + ColorMap = MonoChromeColorMap; + break; + case VGA: + switch (ReqGraphMode1) { + case VGALO: + ScreenYMax = 200; + break; + case VGAMED: + ScreenYMax = 350; + break; + case VGAHI: + ScreenYMax = 480; + break; + default: + return -1; + } + ScreenXMax = 640; + ScreenColorBits = 4; + ScreenBase = 0xa000; + ColorMap = EGAColorMap; + break; + case SVGA_SPECIAL: + ScreenXMax = 800; + ScreenYMax = 600; + ScreenColorBits = 4; + ScreenBase = 0xa000; + ColorMap = EGAColorMap; + break; +#endif /* __MSDOS__ */ +#ifdef __SGI_GL__ + case GIF_DUMP_SGI_WINDOW: + winset(ReqGraphMode1); /* Select window as active window. */ + getsize(&ScreenXMax, &ScreenYMax); + + RGBBuffer = (long *) malloc(sizeof(long) * ScreenXMax * ScreenYMax); + readsource(SRC_FRONT); + if (lrectread((short) 0, + (short) 0, + (short) (ScreenXMax - 1), + (short) (ScreenYMax - 1), RGBBuffer) != + ScreenXMax * ScreenYMax) { /* Get data. */ + free(RGBBuffer); + return -1; + } + GlblGifBuffer = (GifByteType *) malloc(sizeof(GifByteType) * + ScreenXMax * ScreenYMax); + i = QuantizeRGBBuffer(ScreenXMax, ScreenYMax, RGBBuffer, + ColorMap256, GlblGifBuffer); + /* Find minimum color map size to hold all quantized colors. */ + for (ScreenColorBits = 1; + (1 << ScreenColorBits) < i && ScreenColorBits < 8; + ScreenColorBits++); + + /* Start to dump with top line as GIF expects it. */ + GlblGifBufferPtr = GlblGifBuffer + ScreenXMax * (ScreenYMax - 1); + ColorMap = ColorMap256; + free(RGBBuffer); + break; +#endif /* __SGI_GL__ */ +#ifdef __X11__ + case GIF_DUMP_X_WINDOW: + XGetWindowAttributes((Display *) ReqGraphMode2, + (Window) ReqGraphMode1, + &WinAttr); + ScreenXMax = WinAttr.width; + ScreenYMax = WinAttr.height; + + XImg = XGetImage((Display *) ReqGraphMode2, + (Window) ReqGraphMode1, + 0, 0, ScreenXMax - 1, ScreenYMax - 1, + AllPlanes, XYPixmap); + + GlblGifBuffer = (GifByteType *) malloc(sizeof(GifByteType) * + ScreenXMax * ScreenYMax); + + /* Scan the image for all different colors exists. */ + for (i = 0; i < 256; i++) XColorTable[i].pixel = 0; + k = FALSE; + for (i = 0; i < ScreenXMax; i++) + for (j = 0; j < ScreenYMax; j++) { + XPixel = XGetPixel(XImg, i, j); + if (XPixel > 255) { + if (!k) { + /* Make sure we state it once only.*/ + fprintf(stderr, "X Color table - truncated.\n"); + k = TRUE; + } + XPixel = 255; + } + XColorTable[XPixel].pixel = XPixel; + } + /* Find the RGB representation of the colors. */ + XQueryColors((Display *) ReqGraphMode2, + (Colormap) ReqGraphMode3, + XColorTable, + 256); + /* Count number of active colors (Note color 0 is always in) */ + /* and create the Gif color map from it. */ + ColorMap = ColorMap256; + ColorMap[0].Red = ColorMap[0].Green = ColorMap[0].Blue = 0; + for (i = j = 1; i < 256; i++) + if (XColorTable[i].pixel) { + ColorMap[j].Red = XColorTable[i].red / 256; + ColorMap[j].Green = XColorTable[i].green / 256; + ColorMap[j].Blue = XColorTable[i].blue / 256; + /* Save the X color index into the Gif table: */ + XColorTable[i].pixel = j++; + } + /* and set the number of colors in the Gif color map. */ + for (ScreenColorBits = 1; + (1 << ScreenColorBits) < j && ScreenColorBits < 8; + ScreenColorBits++); + + /* Prepare the Gif image buffer as indices into the Gif color */ + /* map from the X image. */ + GlblGifBufferPtr = GlblGifBuffer; + for (i = 0; i < ScreenXMax; i++) + for (j = 0; j < ScreenYMax; j++) + *GlblGifBufferPtr++ = + XColorTable[XGetPixel(XImg, j, i) & 0xff].pixel; + XDestroyImage(XImg); + + GlblGifBufferPtr = GlblGifBuffer; + ColorMap = ColorMap256; + break; +#endif /* __X11__ */ + default: + return -1; + } + + ScanLine = (GifPixelType *) malloc(sizeof(GifPixelType) * ScreenXMax); + + GraphDriver = ReqGraphDriver; + GraphMode = ReqGraphMode1; + + if ((GifFile = EGifOpenFileName(FileName, FALSE)) == NULL || + EGifPutScreenDesc(GifFile, ScreenXMax, ScreenYMax, ScreenColorBits, + 0, ScreenColorBits, ColorMap) == GIF_ERROR || + EGifPutImageDesc(GifFile, 0, 0, ScreenXMax, ScreenYMax, FALSE, 1, + NULL) == GIF_ERROR) { + free((char *) ScanLine); +#if defined(__SGI_GL__) || defined(__X11__) + free((char *) GlblGifBuffer); +#endif + return HandleGifError(GifFile); + } + + for (i = 0; i < ScreenYMax; i++) { + GetScanLine(ScanLine, i); + if (EGifPutLine(GifFile, ScanLine, ScreenXMax) == GIF_ERROR) { + free((char *) ScanLine); +#if defined(__SGI_GL__) || defined(__X11__) + free((char *) GlblGifBuffer); +#endif + return HandleGifError(GifFile); + } + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) { + free((char *) ScanLine); +#if defined(__SGI_GL__) || defined(__X11__) + free((char *) GlblGifBuffer); +#endif + return HandleGifError(GifFile); + } + + free((char *) ScanLine); +#if defined(__SGI_GL__) || defined(__X11__) + free((char *) GlblGifBuffer); +#endif + return 0; +} + +#ifdef __SGI_GL__ +/****************************************************************************** +* Quantize the given 24 bit (8 per RGB) into 256 colors. * +******************************************************************************/ +static int QuantizeRGBBuffer(int Width, int Height, long *RGBBuffer, + GifColorType *ColorMap, GifByteType *GIFBuffer) +{ + int i; + GifByteType *RedInput, *GreenInput, *BlueInput; + + /* Convert the RGB Buffer into 3 seperated buffers: */ + RedInput = (GifByteType *) malloc(sizeof(GifByteType) * Width * Height); + GreenInput = (GifByteType *) malloc(sizeof(GifByteType) * Width * Height); + BlueInput = (GifByteType *) malloc(sizeof(GifByteType) * Width * Height); + + for (i = 0; i < Width * Height; i++) { + RedInput[i] = RGBBuffer[i] & 0xff; + GreenInput[i] = (RGBBuffer[i] >> 8) & 0xff; + BlueInput[i] = (RGBBuffer[i] >> 16) & 0xff; + } + for (i = 0; i < 256; i++) + ColorMap[i].Red = ColorMap[i].Green = ColorMap[i].Blue = 0; + + i = 256; + QuantizeBuffer(Width, Height, &i, + RedInput, GreenInput, BlueInput, + GIFBuffer, ColorMap); + + free(RedInput); + free(GreenInput); + free(BlueInput); + + return i; /* Real number of colors in color table. */ +} +#endif /* __SGI_GL__ */ + +/****************************************************************************** +* Update the given scan line buffer with the pixel levels of the Y line. * +* This routine is device specific, so make sure you know was you are doing * +******************************************************************************/ +static void GetScanLine(GifPixelType *ScanLine, int Y) +{ + unsigned char ScreenByte; + int i, j, k; + unsigned int BufferOffset, Bit; +#ifdef __MSDOS__ + union REGS InRegs, OutRegs; +#endif /* __MSDOS__ */ + + switch (GraphDriver) { +#ifdef __MSDOS__ + case HERCMONO: + BufferOffset = 0x2000 * (Y % 4) + (Y / 4) * (ScreenXMax / 8); + /* In one scan lines we have ScreenXMax / 8 bytes: */ + for (i = 0, k = 0; i < ScreenXMax / 8; i++) { + ScreenByte = (unsigned char) peekb(ScreenBase, BufferOffset++); + for (j = 0, Bit = 0x80; j < 8; j++) { + ScanLine[k++] = (ScreenByte & Bit ? 1 : 0); + Bit >>= 1; + } + } + break; + case EGA: + case EGA64: + case EGAMONO: + case VGA: + case SVGA_SPECIAL: + InRegs.x.dx = Y; + InRegs.h.bh = 0; + InRegs.h.ah = 0x0d; /* BIOS Read dot. */ + for (i = 0; i < ScreenXMax; i++) { + InRegs.x.cx = i; + int86(0x10, &InRegs, &OutRegs); + ScanLine[i] = OutRegs.h.al; + } + + /* Makr this line as done by putting a xored dot on the left. */ + InRegs.x.dx = Y; + InRegs.h.bh = 0; + InRegs.h.ah = 0x0c; /* BIOS Write dot (xor mode). */ + InRegs.h.al = 0x81; /* Xor with color 1. */ + InRegs.x.cx = 0; + int86(0x10, &InRegs, &OutRegs); + InRegs.x.dx = Y; + InRegs.h.bh = 0; + InRegs.h.ah = 0x0c; /* BIOS Write dot (xor mode). */ + InRegs.h.al = 0x81; /* Xor with color 1. */ + InRegs.x.cx = 1; + int86(0x10, &InRegs, &OutRegs); + + if (Y == ScreenYMax - 1) {/* Last row - clear all marks we made. */ + for (i = 0; i < ScreenYMax; i++) { + InRegs.h.bh = 0; + InRegs.h.ah = 0x0c; /* BIOS Write dot (xor mode). */ + InRegs.h.al = 0x81; /* Xor back with color 1. */ + InRegs.x.dx = i; + InRegs.x.cx = 0; + int86(0x10, &InRegs, &OutRegs); + InRegs.h.bh = 0; + InRegs.h.ah = 0x0c; /* BIOS Write dot (xor mode). */ + InRegs.h.al = 0x81; /* Xor back with color 1. */ + InRegs.x.dx = i; + InRegs.x.cx = 1; + int86(0x10, &InRegs, &OutRegs); + } + } + break; +#endif /* __MSDOS__ */ +#ifdef __SGI_GL__ + case GIF_DUMP_SGI_WINDOW: + memcpy(ScanLine, GlblGifBufferPtr, ScreenXMax * sizeof(GifPixelType)); + GlblGifBufferPtr -= ScreenXMax; + break; +#endif /* __SGI_GL__ */ +#ifdef __X11__ + case GIF_DUMP_X_WINDOW: + memcpy(ScanLine, GlblGifBufferPtr, ScreenXMax * sizeof(GifPixelType)); + GlblGifBufferPtr += ScreenXMax; + break; +#endif /* __X11__ */ + default: + break; + } +} + +/****************************************************************************** +* Handle last GIF error. Try to close the file and free all allocated memory. * +******************************************************************************/ +static int HandleGifError(GifFileType *GifFile) +{ + int i = GifLastError(); + + if (EGifCloseFile(GifFile) == GIF_ERROR) { + GifLastError(); + } + return i; +} + + + + + + + + + diff --git a/G/LIB/DGIF_LIB.C b/G/LIB/DGIF_LIB.C new file mode 100644 index 0000000..6719cee --- /dev/null +++ b/G/LIB/DGIF_LIB.C @@ -0,0 +1,837 @@ +/****************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber IBM PC Ver 1.1, Aug. 1990 * +******************************************************************************* +* The kernel of the GIF Decoding process can be found here. * +******************************************************************************* +* History: * +* 16 Jun 89 - Version 1.0 by Gershon Elber. * +* 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). * +******************************************************************************/ + + +#ifdef __MSDOS__ +#include +#include +#include +#include +#else +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "gif_hash.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +#define COMMENT_EXT_FUNC_CODE 0xfe /* Extension function code for comment. */ +#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */ +#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1 +#define GIF_VERSION_POS 3 /* Version first character in stamp. */ + +#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ +#define LZ_BITS 12 + +#define FILE_STATE_READ 0x01/* 1 write, 0 read - EGIF_LIB compatible.*/ + +#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ +#define FIRST_CODE 4097 /* Impossible code, to signal first. */ +#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ + +#define IS_READABLE(Private) (!(Private -> FileState & FILE_STATE_READ)) + +typedef struct GifFilePrivateType { + int FileState, + FileHandle, /* Where all this data goes to! */ + BitsPerPixel, /* Bits per pixel (Codes uses at list this + 1). */ + ClearCode, /* The CLEAR LZ code. */ + EOFCode, /* The EOF LZ code. */ + RunningCode, /* The next code algorithm can generate. */ + RunningBits,/* The number of bits required to represent RunningCode. */ + MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ + LastCode, /* The code before the current code. */ + CrntCode, /* Current algorithm code. */ + StackPtr, /* For character stack (see below). */ + CrntShiftState; /* Number of bits in CrntShiftDWord. */ + unsigned long CrntShiftDWord, /* For bytes decomposition into codes. */ + PixelCount; /* Number of pixels in image. */ + FILE *File; /* File as stream. */ + GifByteType Buf[256]; /* Compressed input is buffered here. */ + GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ + GifByteType Suffix[LZ_MAX_CODE+1]; /* So we can trace the codes. */ + unsigned int Prefix[LZ_MAX_CODE+1]; +} GifFilePrivateType; + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +extern int _GifError; + +static int DGifGetWord(FILE *File, int *Word); +static int DGifSetupDecompress(GifFileType *GifFile); +static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen); +static int DGifGetPrefixChar(unsigned int *Prefix, int Code, int ClearCode); +static int DGifDecompressInput(GifFilePrivateType *Private, int *Code); +static int DGifBufferedInput(FILE *File, GifByteType *Buf, + GifByteType *NextByte); + +/****************************************************************************** +* Open a new gif file for read, given by its name. * +* Returns GifFileType pointer dynamically allocated which serves as the gif * +* info record. _GifError is cleared if succesfull. * +******************************************************************************/ +GifFileType *DGifOpenFileName(char *FileName) +{ + int FileHandle; + + if ((FileHandle = open(FileName, O_RDONLY +#ifdef __MSDOS__ + | O_BINARY +#endif /* __MSDOS__ */ + )) == -1) { + _GifError = D_GIF_ERR_OPEN_FAILED; + return NULL; + } + + return DGifOpenFileHandle(FileHandle); +} + +/****************************************************************************** +* Update a new gif file, given its file handle. * +* Returns GifFileType pointer dynamically allocated which serves as the gif * +* info record. _GifError is cleared if succesfull. * +******************************************************************************/ +GifFileType *DGifOpenFileHandle(int FileHandle) +{ + char Buf[GIF_STAMP_LEN+1]; + GifFileType *GifFile; + GifFilePrivateType *Private; + FILE *f; + +#ifdef __MSDOS__ + setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ + f = fdopen(FileHandle, "rb"); /* Make it into a stream: */ + setvbuf(f, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE);/* And inc. stream buffer.*/ +#else + f = fdopen(FileHandle, "r"); /* Make it into a stream: */ +#endif /* __MSDOS__ */ + + if ((GifFile = (GifFileType *) malloc(sizeof(GifFileType))) == NULL) { + _GifError = D_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + if ((Private = (GifFilePrivateType *) malloc(sizeof(GifFilePrivateType))) + == NULL) { + _GifError = D_GIF_ERR_NOT_ENOUGH_MEM; + free((char *) GifFile); + return NULL; + } + GifFile -> Private = (VoidPtr) Private; + GifFile -> SColorMap = GifFile -> IColorMap = NULL; + Private -> FileHandle = FileHandle; + Private -> File = f; + Private -> FileState = 0; /* Make sure bit 0 = 0 (File open for read). */ + + /* Lets see if this is GIF file: */ + if (fread(Buf, 1, GIF_STAMP_LEN, Private -> File) != GIF_STAMP_LEN) { + _GifError = D_GIF_ERR_READ_FAILED; + free((char *) Private); + free((char *) GifFile); + return NULL; + } + + /* The GIF Version number is ignored at this time. Maybe we should do */ + /* something more useful with it. */ + Buf[GIF_STAMP_LEN] = 0; + if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { + _GifError = D_GIF_ERR_NOT_GIF_FILE; + free((char *) Private); + free((char *) GifFile); + return NULL; + } + + if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { + free((char *) Private); + free((char *) GifFile); + return NULL; + } + + _GifError = 0; + + return GifFile; +} + +/****************************************************************************** +* This routine should be called before any other DGif calls. Note that * +* this routine is called automatically from DGif file open routines. * +******************************************************************************/ +int DGifGetScreenDesc(GifFileType *GifFile) +{ + int Size, i; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + /* Put the screen descriptor into the file: */ + if (DGifGetWord(Private -> File, &GifFile -> SWidth) == GIF_ERROR || + DGifGetWord(Private -> File, &GifFile -> SHeight) == GIF_ERROR) + return GIF_ERROR; + + if (fread(Buf, 1, 3, Private -> File) != 3) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile -> SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1; + GifFile -> SBitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile -> SBackGroundColor = Buf[1]; + if (Buf[0] & 0x80) { /* Do we have global color map? */ + Size = (1 << GifFile -> SBitsPerPixel); + GifFile -> SColorMap = + (GifColorType *) malloc(sizeof(GifColorType) * Size); + for (i = 0; i < Size; i++) { /* Get the global color map: */ + if (fread(Buf, 1, 3, Private -> File) != 3) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile -> SColorMap[i].Red = Buf[0]; + GifFile -> SColorMap[i].Green = Buf[1]; + GifFile -> SColorMap[i].Blue = Buf[2]; + } + } + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called before any attemp to read an image. * +******************************************************************************/ +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *Type) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (fread(&Buf, 1, 1, Private -> File) != 1) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + switch (Buf) { + case ',': + *Type = IMAGE_DESC_RECORD_TYPE; + break; + case '!': + *Type = EXTENSION_RECORD_TYPE; + break; + case ';': + *Type = TERMINATE_RECORD_TYPE; + break; + default: + *Type = UNDEFINED_RECORD_TYPE; + _GifError = D_GIF_ERR_WRONG_RECORD; + return GIF_ERROR; + } + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called before any attemp to read an image. * +* Note it is assumed the Image desc. header (',') has been read. * +******************************************************************************/ +int DGifGetImageDesc(GifFileType *GifFile) +{ + int Size, i; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifGetWord(Private -> File, &GifFile -> ILeft) == GIF_ERROR || + DGifGetWord(Private -> File, &GifFile -> ITop) == GIF_ERROR || + DGifGetWord(Private -> File, &GifFile -> IWidth) == GIF_ERROR || + DGifGetWord(Private -> File, &GifFile -> IHeight) == GIF_ERROR) + return GIF_ERROR; + if (fread(Buf, 1, 1, Private -> File) != 1) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile -> IBitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile -> IInterlace = (Buf[0] & 0x40); + if (Buf[0] & 0x80) { /* Does this image have local color map? */ + Size = (1 << GifFile -> IBitsPerPixel); + if (GifFile -> IColorMap) free((char *) GifFile -> IColorMap); + GifFile -> IColorMap = + (GifColorType *) malloc(sizeof(GifColorType) * Size); + for (i = 0; i < Size; i++) { /* Get the image local color map: */ + if (fread(Buf, 1, 3, Private -> File) != 3) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile -> IColorMap[i].Red = Buf[0]; + GifFile -> IColorMap[i].Green = Buf[1]; + GifFile -> IColorMap[i].Blue = Buf[2]; + } + } + + Private -> PixelCount = (long) GifFile -> IWidth * + (long) GifFile -> IHeight; + + DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */ + + return GIF_OK; +} + +/****************************************************************************** +* Get one full scanned line (Line) of length LineLen from GIF file. * +******************************************************************************/ +int DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) +{ + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (!LineLen) LineLen = GifFile -> IWidth; + +#ifdef __MSDOS__ + if ((Private -> PixelCount -= LineLen) > 0xffff0000UL) { +#else + if ((Private -> PixelCount -= LineLen) > 0xffff0000) { +#endif /* __MSDOS__ */ + _GifError = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) { + if (Private -> PixelCount == 0) { + /* We probably would not be called any more, so lets clean */ + /* everything before we return: need to flush out all rest of */ + /* image until empty block (size 0) detected. We use GetCodeNext.*/ + do if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) + return GIF_ERROR; + while (Dummy != NULL); + } + return GIF_OK; + } + else + return GIF_ERROR; +} + +/****************************************************************************** +* Put one pixel (Pixel) into GIF file. * +******************************************************************************/ +int DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel) +{ + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + +#ifdef __MSDOS__ + if (--Private -> PixelCount > 0xffff0000UL) +#else + if (--Private -> PixelCount > 0xffff0000) +#endif /* __MSDOS__ */ + { + _GifError = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, &Pixel, 1) == GIF_OK) { + if (Private -> PixelCount == 0) { + /* We probably would not be called any more, so lets clean */ + /* everything before we return: need to flush out all rest of */ + /* image until empty block (size 0) detected. We use GetCodeNext.*/ + do if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) + return GIF_ERROR; + while (Dummy != NULL); + } + return GIF_OK; + } + else + return GIF_ERROR; +} + +/****************************************************************************** +* Get an extension block (see GIF manual) from gif file. This routine only * +* returns the first data block, and DGifGetExtensionNext shouldbe called * +* after this one until NULL extension is returned. * +* The Extension should NOT be freed by the user (not dynamically allocated).* +* Note it is assumed the Extension desc. header ('!') has been read. * +******************************************************************************/ +int DGifGetExtension(GifFileType *GifFile, int *ExtCode, + GifByteType **Extension) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (fread(&Buf, 1, 1, Private -> File) != 1) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *ExtCode = Buf; + + return DGifGetExtensionNext(GifFile, Extension); +} + +/****************************************************************************** +* Get a following extension block (see GIF manual) from gif file. This * +* routine sould be called until NULL Extension is returned. * +* The Extension should NOT be freed by the user (not dynamically allocated).* +******************************************************************************/ +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **Extension) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (fread(&Buf, 1, 1, Private -> File) != 1) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + if (Buf > 0) { + *Extension = Private -> Buf; /* Use private unused buffer. */ + (*Extension)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ + if (fread(&((*Extension)[1]), 1, Buf, Private -> File) != Buf) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } + else + *Extension = NULL; + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called last, to close GIF file. * +******************************************************************************/ +int DGifCloseFile(GifFileType *GifFile) +{ + GifFilePrivateType *Private; + FILE *File; + + if (GifFile == NULL) return GIF_ERROR; + + Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + File = Private -> File; + + if (GifFile -> IColorMap) free((char *) GifFile -> IColorMap); + if (GifFile -> SColorMap) free((char *) GifFile -> SColorMap); + if (Private) free((char *) Private); + free(GifFile); + + if (fclose(File) != 0) { + _GifError = D_GIF_ERR_CLOSE_FAILED; + return GIF_ERROR; + } + return GIF_OK; +} + +/****************************************************************************** +* Get 2 bytes (word) from the given file: * +******************************************************************************/ +static int DGifGetWord(FILE *File, int *Word) +{ + unsigned char c[2]; + + if (fread(c, 1, 2, File) != 2) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + *Word = (((unsigned int) c[1]) << 8) + c[0]; + return GIF_OK; +} + +/****************************************************************************** +* Get the image code in compressed form. his routine can be called if the * +* information needed to be piped out as is. Obviously this is much faster * +* than decoding and encoding again. This routine should be followed by calls * +* to DGifGetCodeNext, until NULL block is returned. * +* The block should NOT be freed by the user (not dynamically allocated). * +******************************************************************************/ +int DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock) +{ + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + *CodeSize = Private -> BitsPerPixel; + + return DGifGetCodeNext(GifFile, CodeBlock); +} + +/****************************************************************************** +* Continue to get the image code in compressed form. This routine should be * +* called until NULL block is returned. * +* The block should NOT be freed by the user (not dynamically allocated). * +******************************************************************************/ +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (fread(&Buf, 1, 1, Private -> File) != 1) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + if (Buf > 0) { + *CodeBlock = Private -> Buf; /* Use private unused buffer. */ + (*CodeBlock)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ + if (fread(&((*CodeBlock)[1]), 1, Buf, Private -> File) != Buf) { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } + else { + *CodeBlock = NULL; + Private -> Buf[0] = 0; /* Make sure the buffer is empty! */ + Private -> PixelCount = 0; /* And local info. indicate image read. */ + } + + return GIF_OK; +} + +/****************************************************************************** +* Setup the LZ decompression for this image: * +******************************************************************************/ +static int DGifSetupDecompress(GifFileType *GifFile) +{ + int i, BitsPerPixel; + GifByteType CodeSize; + unsigned int *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + fread(&CodeSize, 1, 1, Private -> File); /* Read Code size from file. */ + BitsPerPixel = CodeSize; + + Private -> Buf[0] = 0; /* Input Buffer empty. */ + Private -> BitsPerPixel = BitsPerPixel; + Private -> ClearCode = (1 << BitsPerPixel); + Private -> EOFCode = Private -> ClearCode + 1; + Private -> RunningCode = Private -> EOFCode + 1; + Private -> RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ + Private -> MaxCode1 = 1 << Private -> RunningBits; /* Max. code + 1. */ + Private -> StackPtr = 0; /* No pixels on the pixel stack. */ + Private -> LastCode = NO_SUCH_CODE; + Private -> CrntShiftState = 0; /* No information in CrntShiftDWord. */ + Private -> CrntShiftDWord = 0; + + Prefix = Private -> Prefix; + for (i = 0; i <= LZ_MAX_CODE; i++) Prefix[i] = NO_SUCH_CODE; + + return GIF_OK; +} + +/****************************************************************************** +* The LZ decompression routine: * +* This version decompress the given gif file into Line of length LineLen. * +* This routine can be called few times (one per scan line, for example), in * +* order the complete the whole image. * +******************************************************************************/ +static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen) +{ + int i = 0, j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr; + GifByteType *Stack, *Suffix; + unsigned int *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + StackPtr = Private -> StackPtr; + Prefix = Private -> Prefix; + Suffix = Private -> Suffix; + Stack = Private -> Stack; + EOFCode = Private -> EOFCode; + ClearCode = Private -> ClearCode; + LastCode = Private -> LastCode; + + if (StackPtr != 0) { + /* Let pop the stack off before continueing to read the gif file: */ + while (StackPtr != 0 && i < LineLen) Line[i++] = Stack[--StackPtr]; + } + + while (i < LineLen) { /* Decode LineLen items. */ + if (DGifDecompressInput(Private, &CrntCode) == GIF_ERROR) + return GIF_ERROR; + + if (CrntCode == EOFCode) { + /* Note however that usually we will not be here as we will stop */ + /* decoding as soon as we got all the pixel, or EOF code will */ + /* not be read at all, and DGifGetLine/Pixel clean everything. */ + if (i != LineLen - 1 || Private -> PixelCount != 0) { + _GifError = D_GIF_ERR_EOF_TOO_SOON; + return GIF_ERROR; + } + i++; + } + else if (CrntCode == ClearCode) { + /* We need to start over again: */ + for (j = 0; j <= LZ_MAX_CODE; j++) Prefix[j] = NO_SUCH_CODE; + Private -> RunningCode = Private -> EOFCode + 1; + Private -> RunningBits = Private -> BitsPerPixel + 1; + Private -> MaxCode1 = 1 << Private -> RunningBits; + LastCode = Private -> LastCode = NO_SUCH_CODE; + } + else { + /* Its regular code - if in pixel range simply add it to output */ + /* stream, otherwise trace to codes linked list until the prefix */ + /* is in pixel range: */ + if (CrntCode < ClearCode) { + /* This is simple - its pixel scalar, so add it to output: */ + Line[i++] = CrntCode; + } + else { + /* Its a code to needed to be traced: trace the linked list */ + /* until the prefix is a pixel, while pushing the suffix */ + /* pixels on our stack. If we done, pop the stack in reverse */ + /* (thats what stack is good for!) order to output. */ + if (Prefix[CrntCode] == NO_SUCH_CODE) { + /* Only allowed if CrntCode is exactly the running code: */ + /* In that case CrntCode = XXXCode, CrntCode or the */ + /* prefix code is last code and the suffix char is */ + /* exactly the prefix of last code! */ + if (CrntCode == Private -> RunningCode - 2) { + CrntPrefix = LastCode; + Suffix[Private -> RunningCode - 2] = + Stack[StackPtr++] = DGifGetPrefixChar(Prefix, + LastCode, ClearCode); + } + else { + _GifError = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + } + else + CrntPrefix = CrntCode; + + /* Now (if image is O.K.) we should not get an NO_SUCH_CODE */ + /* During the trace. As we might loop forever, in case of */ + /* defective image, we count the number of loops we trace */ + /* and stop if we got LZ_MAX_CODE. obviously we can not */ + /* loop more than that. */ + j = 0; + while (j++ <= LZ_MAX_CODE && + CrntPrefix > ClearCode && + CrntPrefix <= LZ_MAX_CODE) { + Stack[StackPtr++] = Suffix[CrntPrefix]; + CrntPrefix = Prefix[CrntPrefix]; + } + if (j >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) { + _GifError = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + /* Push the last character on stack: */ + Stack[StackPtr++] = CrntPrefix; + + /* Now lets pop all the stack into output: */ + while (StackPtr != 0 && i < LineLen) + Line[i++] = Stack[--StackPtr]; + } + if (LastCode != NO_SUCH_CODE) { + Prefix[Private -> RunningCode - 2] = LastCode; + + if (CrntCode == Private -> RunningCode - 2) { + /* Only allowed if CrntCode is exactly the running code: */ + /* In that case CrntCode = XXXCode, CrntCode or the */ + /* prefix code is last code and the suffix char is */ + /* exactly the prefix of last code! */ + Suffix[Private -> RunningCode - 2] = + DGifGetPrefixChar(Prefix, LastCode, ClearCode); + } + else { + Suffix[Private -> RunningCode - 2] = + DGifGetPrefixChar(Prefix, CrntCode, ClearCode); + } + } + LastCode = CrntCode; + } + } + + Private -> LastCode = LastCode; + Private -> StackPtr = StackPtr; + + return GIF_OK; +} + +/****************************************************************************** +* Routine to trace the Prefixes linked list until we get a prefix which is * +* not code, but a pixel value (less than ClearCode). Returns that pixel value.* +* If image is defective, we might loop here forever, so we limit the loops to * +* the maximum possible if image O.k. - LZ_MAX_CODE times. * +******************************************************************************/ +static int DGifGetPrefixChar(unsigned int *Prefix, int Code, int ClearCode) +{ + int i = 0; + + while (Code > ClearCode && i++ <= LZ_MAX_CODE) Code = Prefix[Code]; + return Code; +} + +/****************************************************************************** +* Interface for accessing the LZ codes directly. Set Code to the real code * +* (12bits), or to -1 if EOF code is returned. * +******************************************************************************/ +int DGifGetLZCodes(GifFileType *GifFile, int *Code) +{ + GifByteType *CodeBlock; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + _GifError = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifDecompressInput(Private, Code) == GIF_ERROR) + return GIF_ERROR; + + if (*Code == Private -> EOFCode) { + /* Skip rest of codes (hopefully only NULL terminating block): */ + do if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) + return GIF_ERROR; + while (CodeBlock != NULL); + + *Code = -1; + } + else if (*Code == Private -> ClearCode) { + /* We need to start over again: */ + Private -> RunningCode = Private -> EOFCode + 1; + Private -> RunningBits = Private -> BitsPerPixel + 1; + Private -> MaxCode1 = 1 << Private -> RunningBits; + } + + return GIF_OK; +} + +/****************************************************************************** +* The LZ decompression input routine: * +* This routine is responsable for the decompression of the bit stream from * +* 8 bits (bytes) packets, into the real codes. * +* Returns GIF_OK if read succesfully. * +******************************************************************************/ +static int DGifDecompressInput(GifFilePrivateType *Private, int *Code) +{ + GifByteType NextByte; + static unsigned int CodeMasks[] = { + 0x0000, 0x0001, 0x0003, 0x0007, + 0x000f, 0x001f, 0x003f, 0x007f, + 0x00ff, 0x01ff, 0x03ff, 0x07ff, + 0x0fff + }; + + while (Private -> CrntShiftState < Private -> RunningBits) { + /* Needs to get more bytes from input stream for next code: */ + if (DGifBufferedInput(Private -> File, Private -> Buf, &NextByte) + == GIF_ERROR) { + return GIF_ERROR; + } + Private -> CrntShiftDWord |= + ((unsigned long) NextByte) << Private -> CrntShiftState; + Private -> CrntShiftState += 8; + } + *Code = Private -> CrntShiftDWord & CodeMasks[Private -> RunningBits]; + + Private -> CrntShiftDWord >>= Private -> RunningBits; + Private -> CrntShiftState -= Private -> RunningBits; + + /* If code cannt fit into RunningBits bits, must raise its size. Note */ + /* however that codes above 4095 are used for special signaling. */ + if (++Private -> RunningCode > Private -> MaxCode1 && + Private -> RunningBits < LZ_BITS) { + Private -> MaxCode1 <<= 1; + Private -> RunningBits++; + } + return GIF_OK; +} + +/****************************************************************************** +* This routines read one gif data block at a time and buffers it internally * +* so that the decompression routine could access it. * +* The routine returns the next byte from its internal buffer (or read next * +* block in if buffer empty) and returns GIF_OK if succesful. * +******************************************************************************/ +static int DGifBufferedInput(FILE *File, GifByteType *Buf, + GifByteType *NextByte) +{ + if (Buf[0] == 0) { + /* Needs to read the next buffer - this one is empty: */ + if (fread(Buf, 1, 1, File) != 1) + { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + if (fread(&Buf[1], 1, Buf[0], File) != Buf[0]) + { + _GifError = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *NextByte = Buf[1]; + Buf[1] = 2; /* We use now the second place as last char read! */ + Buf[0]--; + } + else { + *NextByte = Buf[Buf[1]++]; + Buf[0]--; + } + + return GIF_OK; +} diff --git a/G/LIB/EGIF_LIB.C b/G/LIB/EGIF_LIB.C new file mode 100644 index 0000000..d3103ea --- /dev/null +++ b/G/LIB/EGIF_LIB.C @@ -0,0 +1,774 @@ +/****************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 1.1, Aug. 1990 * +******************************************************************************* +* The kernel of the GIF Encoding process can be found here. * +******************************************************************************* +* History: * +* 14 Jun 89 - Version 1.0 by Gershon Elber. * +* 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). * +******************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#else +#include +#include +#ifdef R6000 +#include +#endif +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "gif_hash.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +#define COMMENT_EXT_FUNC_CODE 0xfe /* Extension function code for comment. */ +#define GIF_STAMP "GIF87a" /* First chars in file - GIF stamp. */ +#define ZL_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ + +#define FILE_STATE_WRITE 0x01/* 1 write, 0 read - DGIF_LIB compatible.*/ +#define FILE_STATE_SCREEN 0x02 +#define FILE_STATE_IMAGE 0x04 + +#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ +#define FIRST_CODE 4097 /* Impossible code, to signal first. */ + +#define IS_WRITEABLE(Private) (Private -> FileState & FILE_STATE_WRITE) + +/* #define DEBUG_NO_PREFIX Dump only compressed data. */ + +typedef struct GifFilePrivateType { + int FileState, + FileHandle, /* Where old this data goes to! */ + BitsPerPixel, /* Bits per pixel (Codes uses at list this + 1). */ + ClearCode, /* The CLEAR LZ code. */ + EOFCode, /* The EOF LZ code. */ + RunningCode, /* The next code algorithm can generate. */ + RunningBits,/* The number of bits required to represent RunningCode. */ + MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ + CrntCode, /* Current algorithm code. */ + CrntShiftState; /* Number of bits in CrntShiftDWord. */ + unsigned long CrntShiftDWord, /* For bytes decomposition into codes. */ + PixelCount; + FILE *File; /* File as stream. */ + GifByteType Buf[256]; /* Compressed output is buffered here. */ + GifHashTableType *HashTable; +} GifFilePrivateType; + +extern int _GifError; + +/* Masks given codes to BitsPerPixel, to make sure all codes are in range: */ +static GifPixelType CodeMask[] = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff +}; + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +static char *GifVersionPrefix = GIF_STAMP; + +static int EGifPutWord(int Word, FILE *File); +static int EGifSetupCompress(GifFileType *GifFile); +static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen); +static int EGifCompressOutput(GifFilePrivateType *Private, int Code); +static int EGifBufferedOutput(FILE *File, GifByteType *Buf, int c); + +/****************************************************************************** +* Open a new gif file for write, given by its name. If TestExistance then * +* if the file exists this routines fails (returns NULL). * +* Returns GifFileType pointer dynamically allocated which serves as the gif * +* info record. _GifError is cleared if succesfull. * +******************************************************************************/ +GifFileType *EGifOpenFileName(char *FileName, int TestExistance) +{ + int FileHandle; + + if (TestExistance) + FileHandle = open(FileName, + O_WRONLY | O_CREAT | O_EXCL +#ifdef __MSDOS__ + | O_BINARY +#endif /* __MSDOS__ */ + , + S_IREAD | S_IWRITE); + else + FileHandle = open(FileName, + O_WRONLY | O_CREAT | O_TRUNC +#ifdef __MSDOS__ + | O_BINARY +#endif /* __MSDOS__ */ + , + S_IREAD | S_IWRITE); + + if (FileHandle == -1) { + _GifError = E_GIF_ERR_OPEN_FAILED; + return NULL; + } + + return EGifOpenFileHandle(FileHandle); +} + +/****************************************************************************** +* Update a new gif file, given its file handle, which must be opened for * +* write in binary mode. * +* Returns GifFileType pointer dynamically allocated which serves as the gif * +* info record. _GifError is cleared if succesfull. * +******************************************************************************/ +GifFileType *EGifOpenFileHandle(int FileHandle) +{ + GifFileType *GifFile; + GifFilePrivateType *Private; + FILE *f; + +#ifdef __MSDOS__ + setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ + f = fdopen(FileHandle, "wb"); /* Make it into a stream: */ + setvbuf(f, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE); /* And inc. stream buffer. */ +#else + f = fdopen(FileHandle, "w"); /* Make it into a stream: */ +#endif /* __MSDOS__ */ + + if ((GifFile = (GifFileType *) malloc(sizeof(GifFileType))) == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + GifFile -> SWidth = GifFile -> SHeight = + GifFile -> SColorResolution = GifFile -> SBitsPerPixel = + GifFile -> SBackGroundColor = + GifFile -> ILeft = GifFile -> ITop = GifFile -> IWidth = GifFile -> IHeight = + GifFile -> IInterlace = + GifFile -> IBitsPerPixel = 0; + + GifFile -> SColorMap = GifFile -> IColorMap = NULL; + +#ifndef DEBUG_NO_PREFIX + if (fwrite(GifVersionPrefix, 1, strlen(GifVersionPrefix), f) != + strlen(GifVersionPrefix)) { + _GifError = E_GIF_ERR_WRITE_FAILED; + free((char *) GifFile); + return NULL; + } +#endif /* DEBUG_NO_PREFIX */ + + if ((Private = (GifFilePrivateType *) malloc(sizeof(GifFilePrivateType))) + == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + GifFile -> Private = (VoidPtr) Private; + Private -> FileHandle = FileHandle; + Private -> File = f; + Private -> FileState = FILE_STATE_WRITE; + if ((Private -> HashTable = _InitHashTable()) == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + _GifError = 0; + + return GifFile; +} + +/****************************************************************************** +* Routine to set current GIF version. All files open for write will be * +* using this version until next call to this routine. Version consists of * +* 3 characters as "87a" or "89a". No test is made to validate the version. * +******************************************************************************/ +void EGifSetGifVersion(char *Version) +{ + strncpy(&GifVersionPrefix[3], Version, 3); +} + +/****************************************************************************** +* This routine should be called before any other EGif calls, immediately * +* follows the GIF file openning. * +******************************************************************************/ +int EGifPutScreenDesc(GifFileType *GifFile, + int Width, int Height, int ColorRes, int BackGround, + int BitsPerPixel, GifColorType *ColorMap) +{ + int i, Size; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (Private -> FileState & FILE_STATE_SCREEN) { + /* If already has screen descriptor - something is wrong! */ + _GifError = E_GIF_ERR_HAS_SCRN_DSCR; + return GIF_ERROR; + } + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + GifFile -> SWidth = Width; + GifFile -> SHeight = Height; + GifFile -> SColorResolution = ColorRes; + GifFile -> SBitsPerPixel = BitsPerPixel; + GifFile -> SBackGroundColor = BackGround; + if (ColorMap) { + Size = sizeof(GifColorType) * (1 << BitsPerPixel); + GifFile -> SColorMap = (GifColorType *) malloc(Size); + memcpy(GifFile -> SColorMap, ColorMap, Size); + } + + /* Put the screen descriptor into the file: */ + EGifPutWord(Width, Private -> File); + EGifPutWord(Height, Private -> File); + Buf[0] = (ColorMap ? 0x80 : 0x00) | + ((ColorRes - 1) << 4) | + (BitsPerPixel - 1); + Buf[1] = BackGround; + Buf[2] = 0; +#ifndef DEBUG_NO_PREFIX + fwrite(Buf, 1, 3, Private -> File); +#endif /* DEBUG_NO_PREFIX */ + + /* If we have Global color map - dump it also: */ +#ifndef DEBUG_NO_PREFIX + if (ColorMap != NULL) + for (i = 0; i < (1 << BitsPerPixel); i++) { + /* Put the ColorMap out also: */ + Buf[0] = ColorMap[i].Red; + Buf[1] = ColorMap[i].Green; + Buf[2] = ColorMap[i].Blue; + if (fwrite(Buf, 1, 3, Private -> File) != 3) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } +#endif /* DEBUG_NO_PREFIX */ + + /* Mark this file as has screen descriptor, and no pixel written yet: */ + Private -> FileState |= FILE_STATE_SCREEN; + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called before any attemp to dump an image - any * +* call to any of the pixel dump routines. * +******************************************************************************/ +int EGifPutImageDesc(GifFileType *GifFile, + int Left, int Top, int Width, int Height, int Interlace, + int BitsPerPixel, GifColorType *ColorMap) +{ + int i, Size; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (Private -> FileState & FILE_STATE_IMAGE && +#ifdef __MSDOS__ + Private -> PixelCount > 0xffff0000UL) { +#else + Private -> PixelCount > 0xffff0000) { +#endif /* __MSDOS__ */ + /* If already has active image descriptor - something is wrong! */ + _GifError = E_GIF_ERR_HAS_IMAG_DSCR; + return GIF_ERROR; + } + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + GifFile -> ILeft = Left; + GifFile -> ITop = Top; + GifFile -> IWidth = Width; + GifFile -> IHeight = Height; + GifFile -> IBitsPerPixel = BitsPerPixel; + GifFile -> IInterlace = Interlace; + if (ColorMap) { + Size = sizeof(GifColorType) * (1 << BitsPerPixel); + if (GifFile -> IColorMap) free((char *) GifFile -> IColorMap); + GifFile -> IColorMap = (GifColorType *) malloc(Size); + memcpy(GifFile -> IColorMap, ColorMap, Size); + } + + /* Put the image descriptor into the file: */ + Buf[0] = ','; /* Image seperator character. */ +#ifndef DEBUG_NO_PREFIX + fwrite(Buf, 1, 1, Private -> File); +#endif /* DEBUG_NO_PREFIX */ + EGifPutWord(Left, Private -> File); + EGifPutWord(Top, Private -> File); + EGifPutWord(Width, Private -> File); + EGifPutWord(Height, Private -> File); + Buf[0] = (ColorMap ? 0x80 : 0x00) | + (Interlace ? 0x40 : 0x00) | + (BitsPerPixel - 1); +#ifndef DEBUG_NO_PREFIX + fwrite(Buf, 1, 1, Private -> File); +#endif /* DEBUG_NO_PREFIX */ + + /* If we have Global color map - dump it also: */ +#ifndef DEBUG_NO_PREFIX + if (ColorMap != NULL) + for (i = 0; i < (1 << BitsPerPixel); i++) { + /* Put the ColorMap out also: */ + Buf[0] = ColorMap[i].Red; + Buf[1] = ColorMap[i].Green; + Buf[2] = ColorMap[i].Blue; + if (fwrite(Buf, 1, 3, Private -> File) != 3) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } +#endif /* DEBUG_NO_PREFIX */ + if (GifFile -> SColorMap == NULL && GifFile -> IColorMap == NULL) + { + _GifError = E_GIF_ERR_NO_COLOR_MAP; + return GIF_ERROR; + } + + /* Mark this file as has screen descriptor: */ + Private -> FileState |= FILE_STATE_IMAGE; + Private -> PixelCount = (long) Width * (long) Height; + + EGifSetupCompress(GifFile); /* Reset compress algorithm parameters. */ + + return GIF_OK; +} + +/****************************************************************************** +* Put one full scanned line (Line) of length LineLen into GIF file. * +******************************************************************************/ +int EGifPutLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) +{ + int i; + GifPixelType Mask; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + if (!LineLen) LineLen = GifFile -> IWidth; + if ((Private -> PixelCount -= LineLen) < 0) { + _GifError = E_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + /* Make sure the codes are not out of bit range, as we might generate */ + /* wrong code (because of overflow when we combine them) in this case: */ + Mask = CodeMask[Private -> BitsPerPixel]; + for (i = 0; i < LineLen; i++) Line[i] &= Mask; + + return EGifCompressLine(GifFile, Line, LineLen); +} + +/****************************************************************************** +* Put one pixel (Pixel) into GIF file. * +******************************************************************************/ +int EGifPutPixel(GifFileType *GifFile, GifPixelType Pixel) +{ + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + if (--Private -> PixelCount < 0) + { + _GifError = E_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + /* Make sure the code is not out of bit range, as we might generate */ + /* wrong code (because of overflow when we combine them) in this case: */ + Pixel &= CodeMask[Private -> BitsPerPixel]; + + return EGifCompressLine(GifFile, &Pixel, 1); +} + +/****************************************************************************** +* Put a comment into GIF file using extension block. * +******************************************************************************/ +int EGifPutComment(GifFileType *GifFile, char *Comment) +{ + return EGifPutExtension(GifFile, COMMENT_EXT_FUNC_CODE, strlen(Comment), + Comment); +} + +/****************************************************************************** +* Put an extension block (see GIF manual) into gif file. * +******************************************************************************/ +int EGifPutExtension(GifFileType *GifFile, int ExtCode, int ExtLen, + VoidPtr Extension) +{ + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + Buf[0] = '!'; + Buf[1] = ExtCode; + Buf[2] = ExtLen; + fwrite(Buf, 1, 3, Private -> File); + fwrite(Extension, 1, ExtLen, Private -> File); + Buf[0] = 0; + fwrite(Buf, 1, 1, Private -> File); + + return GIF_OK; +} + +/****************************************************************************** +* Put the image code in compressed form. This routine can be called if the * +* information needed to be piped out as is. Obviously this is much faster * +* than decoding and encoding again. This routine should be followed by calls * +* to EGifPutCodeNext, until NULL block is given. * +* The block should NOT be freed by the user (not dynamically allocated). * +******************************************************************************/ +int EGifPutCode(GifFileType *GifFile, int CodeSize, GifByteType *CodeBlock) +{ + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + /* No need to dump code size as Compression set up does any for us: */ + /* + Buf = CodeSize; + if (fwrite(&Buf, 1, 1, Private -> File) != 1) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + */ + + return EGifPutCodeNext(GifFile, CodeBlock); +} + +/****************************************************************************** +* Continue to put the image code in compressed form. This routine should be * +* called with blocks of code as read via DGifGetCode/DGifGetCodeNext. If * +* given buffer pointer is NULL, empty block is written to mark end of code. * +******************************************************************************/ +int EGifPutCodeNext(GifFileType *GifFile, GifByteType *CodeBlock) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + if (CodeBlock != NULL) { + if (fwrite(CodeBlock, 1, CodeBlock[0] + 1, Private -> File) + != CodeBlock[0] + 1) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } + else { + Buf = 0; + if (fwrite(&Buf, 1, 1, Private -> File) != 1) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + Private -> PixelCount = 0; /* And local info. indicate image read. */ + } + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called last, to close GIF file. * +******************************************************************************/ +int EGifCloseFile(GifFileType *GifFile) +{ + GifByteType Buf; + GifFilePrivateType *Private; + FILE *File; + + if (GifFile == NULL) return GIF_ERROR; + + Private = (GifFilePrivateType *) GifFile -> Private; + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + File = Private -> File; + + Buf = ';'; + fwrite(&Buf, 1, 1, Private -> File); + + if (GifFile -> IColorMap) free((char *) GifFile -> IColorMap); + if (GifFile -> SColorMap) free((char *) GifFile -> SColorMap); + if (Private) { + if (Private -> HashTable) free((char *) Private -> HashTable); + free((char *) Private); + } + free(GifFile); + + if (fclose(File) != 0) { + _GifError = E_GIF_ERR_CLOSE_FAILED; + return GIF_ERROR; + } + return GIF_OK; +} + +/****************************************************************************** +* Put 2 bytes (word) into the given file: * +******************************************************************************/ +static int EGifPutWord(int Word, FILE *File) +{ + char c[2]; + + c[0] = Word & 0xff; + c[1] = (Word >> 8) & 0xff; +#ifndef DEBUG_NO_PREFIX + if (fwrite(c, 1, 2, File) == 2) + return GIF_OK; + else + return GIF_ERROR; +#else + return GIF_OK; +#endif /* DEBUG_NO_PREFIX */ +} + +/****************************************************************************** +* Setup the LZ compression for this image: * +******************************************************************************/ +static int EGifSetupCompress(GifFileType *GifFile) +{ + int BitsPerPixel; + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + /* Test and see what color map to use, and from it # bits per pixel: */ + if (GifFile -> IColorMap) + BitsPerPixel = GifFile -> IBitsPerPixel; + else if (GifFile -> SColorMap) + BitsPerPixel = GifFile -> SBitsPerPixel; + else { + _GifError = E_GIF_ERR_NO_COLOR_MAP; + return GIF_ERROR; + } + + Buf = BitsPerPixel = (BitsPerPixel < 2 ? 2 : BitsPerPixel); + fwrite(&Buf, 1, 1, Private -> File); /* Write the Code size to file. */ + + Private -> Buf[0] = 0; /* Nothing was output yet. */ + Private -> BitsPerPixel = BitsPerPixel; + Private -> ClearCode = (1 << BitsPerPixel); + Private -> EOFCode = Private -> ClearCode + 1; + Private -> RunningCode = Private -> EOFCode + 1; + Private -> RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ + Private -> MaxCode1 = 1 << Private -> RunningBits; /* Max. code + 1. */ + Private -> CrntCode = FIRST_CODE; /* Signal that this is first one! */ + Private -> CrntShiftState = 0; /* No information in CrntShiftDWord. */ + Private -> CrntShiftDWord = 0; + + /* Clear hash table and send Clear to make sure the decoder do the same. */ + _ClearHashTable(Private -> HashTable); + if (EGifCompressOutput(Private, Private -> ClearCode) == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + return GIF_OK; +} + +/****************************************************************************** +* The LZ compression routine: * +* This version compress the given buffer Line of length LineLen. * +* This routine can be called few times (one per scan line, for example), in * +* order the complete the whole image. * +******************************************************************************/ +static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen) +{ + int i = 0, CrntCode, NewCode; + unsigned long NewKey; + GifPixelType Pixel; + GifHashTableType *HashTable; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile -> Private; + + HashTable = Private -> HashTable; + + if (Private -> CrntCode == FIRST_CODE) /* Its first time! */ + CrntCode = Line[i++]; + else + CrntCode = Private -> CrntCode; /* Get last code in compression. */ + + while (i < LineLen) { /* Decode LineLen items. */ + Pixel = Line[i++]; /* Get next pixel from stream. */ + /* Form a new unique key to search hash table for the code combines */ + /* CrntCode as Prefix string with Pixel as postfix char. */ + NewKey = (((unsigned long) CrntCode) << 8) + Pixel; + if ((NewCode = _ExistsHashTable(HashTable, NewKey)) >= 0) { + /* This Key is already there, or the string is old one, so */ + /* simple take new code as our CrntCode: */ + CrntCode = NewCode; + } + else { + /* Put it in hash table, output the prefix code, and make our */ + /* CrntCode equal to Pixel. */ + if (EGifCompressOutput(Private, CrntCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + CrntCode = Pixel; + + /* If however the HashTable if full, we send a clear first and */ + /* Clear the hash table. */ + if (Private -> RunningCode >= ZL_MAX_CODE) { + /* Time to do some clearance: */ + if (EGifCompressOutput(Private, Private -> ClearCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + Private -> RunningCode = Private -> EOFCode + 1; + Private -> RunningBits = Private -> BitsPerPixel + 1; + Private -> MaxCode1 = 1 << Private -> RunningBits; + _ClearHashTable(HashTable); + } + else { + /* Put this unique key with its relative Code in hash table: */ + _InsertHashTable(HashTable, NewKey, Private -> RunningCode++); + } + } + } + + /* Preserve the current state of the compression algorithm: */ + Private -> CrntCode = CrntCode; + + if (Private -> PixelCount == 0) + { + /* We are done - output last Code and flush output buffers: */ + if (EGifCompressOutput(Private, CrntCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + if (EGifCompressOutput(Private, Private -> EOFCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + if (EGifCompressOutput(Private, FLUSH_OUTPUT) == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + } + + return GIF_OK; +} + +/****************************************************************************** +* The LZ compression output routine: * +* This routine is responsable for the compression of the bit stream into * +* 8 bits (bytes) packets. * +* Returns GIF_OK if written succesfully. * +******************************************************************************/ +static int EGifCompressOutput(GifFilePrivateType *Private, int Code) +{ + int retval = GIF_OK; + + if (Code == FLUSH_OUTPUT) { + while (Private -> CrntShiftState > 0) { + /* Get Rid of what is left in DWord, and flush it. */ + if (EGifBufferedOutput(Private -> File, Private -> Buf, + Private -> CrntShiftDWord & 0xff) == GIF_ERROR) + retval = GIF_ERROR; + Private -> CrntShiftDWord >>= 8; + Private -> CrntShiftState -= 8; + } + Private -> CrntShiftState = 0; /* For next time. */ + if (EGifBufferedOutput(Private -> File, Private -> Buf, + FLUSH_OUTPUT) == GIF_ERROR) + retval = GIF_ERROR; + } + else { + Private -> CrntShiftDWord |= ((long) Code) << Private -> CrntShiftState; + Private -> CrntShiftState += Private -> RunningBits; + while (Private -> CrntShiftState >= 8) { + /* Dump out full bytes: */ + if (EGifBufferedOutput(Private -> File, Private -> Buf, + Private -> CrntShiftDWord & 0xff) == GIF_ERROR) + retval = GIF_ERROR; + Private -> CrntShiftDWord >>= 8; + Private -> CrntShiftState -= 8; + } + } + + /* If code cannt fit into RunningBits bits, must raise its size. Note */ + /* however that codes above 4095 are used for special signaling. */ + if (Private -> RunningCode >= Private -> MaxCode1 && Code <= 4095) { + Private -> MaxCode1 = 1 << ++Private -> RunningBits; + } + + return retval; +} + +/****************************************************************************** +* This routines buffers the given characters until 255 characters are ready * +* to be output. If Code is equal to -1 the buffer is flushed (EOF). * +* The buffer is Dumped with first byte as its size, as GIF format requires. * +* Returns GIF_OK if written succesfully. * +******************************************************************************/ +static int EGifBufferedOutput(FILE *File, GifByteType *Buf, int c) +{ + if (c == FLUSH_OUTPUT) { + /* Flush everything out. */ + if (Buf[0] != 0 && fwrite(Buf, 1, Buf[0]+1, File) != Buf[0] + 1) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + /* Mark end of compressed data, by an empty block (see GIF doc): */ + Buf[0] = 0; + if (fwrite(Buf, 1, 1, File) != 1) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } + else { + if (Buf[0] == 255) { + /* Dump out this buffer - it is full: */ + if (fwrite(Buf, 1, Buf[0] + 1, File) != Buf[0] + 1) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + Buf[0] = 0; + } + Buf[++Buf[0]] = c; + } + + return GIF_OK; +} diff --git a/G/LIB/GETARG.C b/G/LIB/GETARG.C new file mode 100644 index 0000000..819bf3f --- /dev/null +++ b/G/LIB/GETARG.C @@ -0,0 +1,632 @@ +/*************************************************************************** +* Routines to grab the parameters from the command line : * +* All the routines except the main one, starts with GA (Get Arguments) to * +* prevent from names conflicts. * +* It is assumed in these routine that any pointer, for any type has the * +* same length (i.e. length of int pointer is equal to char pointer etc.) * +* * +* The following routines are available in this module: * +* 1. int GAGetArgs(argc, argv, CtrlStr, Variables...) * +* where argc, argv as received on entry. * +* CtrlStr is the contrl string (see below) * +* Variables are all the variables to be set according to CtrlStr. * +* Note that all the variables MUST be transfered by address. * +* return 0 on correct parsing, otherwise error number (see GetArg.h). * +* 2. GAPrintHowTo(CtrlStr) * +* Print the control string to stderr, in the correct format needed. * +* This feature is very useful in case of error during GetArgs parsing. * +* Chars equal to SPACE_CHAR are not printed (regular spaces are NOT * +* allowed, and so using SPACE_CHAR you can create space in PrintHowTo). * +* 3. GAPrintErrMsg(Error) * +* Print the error to stderr, according to Error (usually returned by * +* GAGetArgs). * +* * +* CtrlStr format: * +* The control string passed to GetArgs controls the way argv (argc) are * +* parsed. Each entry in this string must not have any spaces in it. The * +* First Entry is the name of the program which is usually ignored except * +* when GAPrintHowTo is called. All the other entries (except the last one * +* which we will come back to it later) must have the following format: * +* 1. One letter which sets the option letter. * +* 2. '!' or '%' to determines if this option is really optional ('%') or * +* it must exists ('!')... * +* 3. '-' allways. * +* 4. Alpha numeric string, usually ignored, but used by GAPrintHowTo to * +* print the meaning of this input. * +* 5. Sequences starts with '!' or '%'. Again if '!' then this sequence * +* must exists (only if its option flag is given of course), and if '%' * +* it is optional. Each sequence will continue with one or two * +* characters which defines the kind of the input: * +* a. d, x, o, u - integer is expected (decimal, hex, octal base or * +* unsigned). * +* b. D, X, O, U - long integer is expected (same as above). * +* c. f - float number is expected. * +* d. F - double number is expected. * +* e. s - string is expected. * +* f. *? - any number of '?' kind (d, x, o, u, D, X, O, U, f, F, s) * +* will match this one. If '?' is numeric, it scans until * +* none numeric input is given. If '?' is 's' then it scans * +* up to the next option or end of argv. * +* * +* If the last parameter given in the CtrlStr, is not an option (i.e. the * +* second char is not in ['!', '%'] and the third one is not '-'), all what * +* remained from argv is linked to it. * +* * +* The variables passed to GAGetArgs (starting from 4th parameter) MUST * +* match the order of the CtrlStr: * +* For each option, one integer address must be passed. This integer must * +* initialized by 0. If that option is given in the command line, it will * +* be set to one. * +* In addition, the sequences that might follow an option require the * +* following parameters to pass: * +* 1. d, x, o, u - pointer to integer (int *). * +* 2. D, X, O, U - pointer to long (long *). * +* 3. f - pointer to float (float *). * +* 4. F - pointer to double (double *). * +* 5. s - pointer to char (char *). NO allocation is needed! * +* 6. *? - TWO variables are passed for each wild request. the first * +* one is (address of) integer, and it will return number of * +* parameters actually matched this sequence, and the second * +* one is a pointer to pointer to ? (? **), and will return an * +* address to a block of pointers to ? kind, terminated with * +* NULL pointer. NO pre-allocation is needed. * +* note that these two variables are pretty like the argv/argc * +* pair... * +* * +* Examples: * +* * +* "Example1 i%-OneInteger!d s%-Strings!*s j%- k!-Float!f Files" * +* Will match: Example1 -i 77 -s String1 String2 String3 -k 88.2 File1 File2* +* or match: Example1 -s String1 -k 88.3 -i 999 -j * +* but not: Example1 -i 77 78 (option i expects one integer, k must be). * +* Note the option k must exists, and that the order of the options is not * +* not important. In the first examples File1 & File2 will match the Files * +* in the command line. * +* A call to GAPrintHowTo with this CtrlStr will print to stderr: * +* Example1 [-i OneIngeter] [-s Strings...] [-j] -k Float Files... * +* * +* Notes: * +* * +* 1. This module assumes that all the pointers to all kind of data types * +* have the same length and format, i.e. sizeof(int *) == sizeof(char *).* +* * +* Gershon Elber Ver 0.2 Mar 88 * +**************************************************************************** +* History: * +* 11 Mar 88 - Version 1.0 by Gershon Elber. * +***************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#ifdef USE_VARARGS +#include +#endif /* USE_VARARGS */ + +#include +#include +#include "getarg.h" + +#define MYMALLOC /* If no "MyAlloc" routine elsewhere define this. */ + +#define MAX_PARAM 100 /* maximum number of parameters allowed. */ +#define CTRL_STR_MAX_LEN 1024 + +#define SPACE_CHAR '|' /* The character not to print using HowTo. */ + +#ifndef TRUE +#define TRUE -1 +#define FALSE 0 +#endif /* TRUE */ + +#define ARG_OK 0 + +#define ISSPACE(x) ((x) <= ' ') /* Not conventional - but works fine! */ +/* The two characters '%' and '!' are used in the control string: */ +#define ISCTRLCHAR(x) (((x) == '%') || ((x) == '!')) + +static char *GAErrorToken;/* On error code, ErrorToken is set to point on it.*/ + +static int GATestAllSatis(char *CtrlStrCopy, char *CtrlStr, int *argc, + char ***argv, int *Parameters[MAX_PARAM], int *ParamCount); +static int GAUpdateParameters(int *Parameters[], int *ParamCount, + char *Option, char *CtrlStrCopy, char *CtrlStr, int *argc, + char ***argv); +static int GAGetParmeters(int *Parameters[], int *ParamCount, + char *CtrlStrCopy , char *Option, int *argc, char ***argv); +static int GAGetMultiParmeters(int *Parameters[], int *ParamCount, + char *CtrlStrCopy, int *argc, char ***argv); +static void GASetParamCount(char *CtrlStr, int Max, int *ParamCount); +static void GAByteCopy(char *Dst, char *Src, unsigned n); +static int GAOptionExists(int argc, char **argv); +#ifdef MYMALLOC +static char *MyMalloc(unsigned size); +#endif /* MYMALLOC */ + +/*************************************************************************** +* Routine to access the command line argument and interpret them: * +* Return ARG_OK (0) is case of succesfull parsing, error code else... * +***************************************************************************/ +#ifdef USE_VARARGS +int GAGetArgs(int va_alist, ...) +{ + va_list ap; + int argc, i, Error = FALSE, ParamCount = 0, + *Parameters[MAX_PARAM]; /* Save here parameter addresses. */ + char **argv, *CtrlStr, *Option, CtrlStrCopy[CTRL_STR_MAX_LEN]; + + va_start(ap); + + argc = va_arg(ap, int); + argv = va_arg(ap, char **); + CtrlStr = va_arg(ap, char *); + + va_end(ap); + + strcpy(CtrlStrCopy, CtrlStr); + + /* Using base address of parameters we access other parameters addr: */ + /* Note that me (for sure!) samples data beyond the current function */ + /* frame, but we accesson these set address only by demand. */ + for (i = 1; i <= MAX_PARAM; i++) Parameters[i-1] = va_arg(ap, int *); +#else +int GAGetArgs(int argc, char **argv, char *CtrlStr, ...) +{ + int i, Error = FALSE, ParamCount = 0, + *Parameters[MAX_PARAM]; /* Save here parameter addresses. */ + char *Option, CtrlStrCopy[CTRL_STR_MAX_LEN]; + + strcpy(CtrlStrCopy, CtrlStr); + + /* Using base address of parameters we access other parameters addr: */ + /* Note that me (for sure!) samples data beyond the current function */ + /* frame, but we accesson these set address only by demand. */ + for (i = 1; i <= MAX_PARAM; i++) Parameters[i-1] = (int *) *(i + &CtrlStr); +#endif /* USE_VARARG */ + + --argc; argv++; /* Skip the program name (first in argv/c list). */ + while (argc >= 0) { + if (!GAOptionExists(argc, argv)) break; /* The loop. */ + argc--; + Option = *argv++; + if ((Error = GAUpdateParameters(Parameters, &ParamCount, Option, + CtrlStrCopy, CtrlStr, &argc, &argv)) != FALSE) return Error; + } + /* Check for results and update trail of command line: */ + return GATestAllSatis(CtrlStrCopy, CtrlStr, &argc, &argv, Parameters, + &ParamCount); +} + +/*************************************************************************** +* Routine to search for unsatisfied flags - simply scan the list for !- * +* sequence. Before this scan, this routine updates the rest of the command * +* line into the last two parameters if it is requested by the CtrlStr * +* (last item in CtrlStr is NOT an option). * +* Return ARG_OK if all satisfied, CMD_ERR_AllSatis error else. * +***************************************************************************/ +static int GATestAllSatis(char *CtrlStrCopy, char *CtrlStr, int *argc, + char ***argv, int *Parameters[MAX_PARAM], int *ParamCount) +{ + int i; + static char *LocalToken = NULL; + + /* If LocalToken is not initialized - do it now. Note that this string */ + /* should be writable as well so we can not assign it directly. */ + if (LocalToken == NULL) { + LocalToken = (char *) malloc(3); + strcpy(LocalToken, "-?"); + } + + /* Check is last item is an option. If not then copy rest of command */ + /* line into it as 1. NumOfprm, 2. pointer to block of pointers. */ + for (i = strlen(CtrlStr) - 1; i > 0 && !ISSPACE(CtrlStr[i]); i--); + if (!ISCTRLCHAR(CtrlStr[i + 2])) { + GASetParamCount(CtrlStr, i, ParamCount); /* Point in correct prm.. */ + *Parameters[(*ParamCount)++] = *argc; + GAByteCopy((char *) Parameters[(*ParamCount)++], (char *) argv, + sizeof(char *)); + } + + i = 0; + while (++i < strlen(CtrlStrCopy)) + if ((CtrlStrCopy[i] == '-') && (CtrlStrCopy[i-1] == '!')) { + GAErrorToken = LocalToken; + LocalToken[1] = CtrlStrCopy[i-2]; /* Set the corrent flag. */ + return CMD_ERR_AllSatis; + } + + return ARG_OK; +} + +/*************************************************************************** +* Routine to update the parameters according to the given Option: * +***************************************************************************/ +static int GAUpdateParameters(int *Parameters[], int *ParamCount, + char *Option, char *CtrlStrCopy, char *CtrlStr, int *argc, char ***argv) +{ + int i, BooleanTrue = Option[2] != '-'; + + if (Option[0] != '-') { + GAErrorToken = Option; + return CMD_ERR_NotAnOpt; + } + i = 0; /* Scan the CtrlStrCopy for that option: */ + while (i + 2 < strlen(CtrlStrCopy)) { + if ((CtrlStrCopy[i] == Option[1]) && (ISCTRLCHAR(CtrlStrCopy[i + 1])) + && (CtrlStrCopy[i+2] == '-')) { + /* We found that option! */ + break; + } + i++; + } + if (i + 2 >= strlen(CtrlStrCopy)) { + GAErrorToken = Option; + return CMD_ERR_NoSuchOpt; + } + + /* If we are here, then we found that option in CtrlStr - Strip it off: */ + CtrlStrCopy[i] = CtrlStrCopy[i + 1] = CtrlStrCopy[i + 2] = (char) ' '; + GASetParamCount(CtrlStr, i, ParamCount);/*Set it to point in correct prm.*/ + i += 3; + /* Set boolean flag for that option. */ + *Parameters[(*ParamCount)++] = BooleanTrue; + if (ISSPACE(CtrlStrCopy[i])) + return ARG_OK; /* Only a boolean flag is needed. */ + + /* Skip the text between the boolean option and data follows: */ + while (!ISCTRLCHAR(CtrlStrCopy[i])) i++; + /* Get the parameters and return the appropriete return code: */ + return GAGetParmeters(Parameters, ParamCount, &CtrlStrCopy[i], + Option, argc, argv); +} + +/*************************************************************************** +* Routine to get parameters according to the CtrlStr given from argv/c : * +***************************************************************************/ +static int GAGetParmeters(int *Parameters[], int *ParamCount, + char *CtrlStrCopy , char *Option, int *argc, char ***argv) +{ + int i = 0, ScanRes; + + while (!(ISSPACE(CtrlStrCopy[i]))) { + switch (CtrlStrCopy[i+1]) { + case 'd': /* Get signed integers. */ + ScanRes = sscanf(*((*argv)++), "%d", + (int *) Parameters[(*ParamCount)++]); + break; + case 'u': /* Get unsigned integers. */ + ScanRes = sscanf(*((*argv)++), "%u", + (unsigned *) Parameters[(*ParamCount)++]); + break; + case 'x': /* Get hex integers. */ + ScanRes = sscanf(*((*argv)++), "%x", + (int *) Parameters[(*ParamCount)++]); + break; + case 'o': /* Get octal integers. */ + ScanRes = sscanf(*((*argv)++), "%o", + (int *) Parameters[(*ParamCount)++]); + break; + case 'D': /* Get signed long integers. */ + ScanRes = sscanf(*((*argv)++), "%ld", + (long *) Parameters[(*ParamCount)++]); + break; + case 'U': /* Get unsigned long integers. */ + ScanRes = sscanf(*((*argv)++), "%lu", + (unsigned long *) Parameters[(*ParamCount)++]); + break; + case 'X': /* Get hex long integers. */ + ScanRes = sscanf(*((*argv)++), "%lx", + (long *) Parameters[(*ParamCount)++]); + break; + case 'O': /* Get octal long integers. */ + ScanRes = sscanf(*((*argv)++), "%lo", + (long *) Parameters[(*ParamCount)++]); + break; + case 'f': /* Get float number. */ + ScanRes = sscanf(*((*argv)++), "%f", + (float *) Parameters[(*ParamCount)++]); + case 'F': /* Get double float number. */ + ScanRes = sscanf(*((*argv)++), "%lf", + (double *) Parameters[(*ParamCount)++]); + break; + case 's': /* It as a string. */ + ScanRes = 1; /* Allways O.K. */ + GAByteCopy((char *) Parameters[(*ParamCount)++], + (char *) ((*argv)++), sizeof(char *)); + break; + case '*': /* Get few parameters into one: */ + ScanRes = GAGetMultiParmeters(Parameters, ParamCount, + &CtrlStrCopy[i], argc, argv); + if ((ScanRes == 0) && (CtrlStrCopy[i] == '!')) { + GAErrorToken = Option; + return CMD_ERR_WildEmpty; + } + break; + default: + ScanRes = 0; /* Make optimizer warning silent. */ + } + /* If reading fails and this number is a must (!) then error: */ + if ((ScanRes == 0) && (CtrlStrCopy[i] == '!')) { + GAErrorToken = Option; + return CMD_ERR_NumRead; + } + if (CtrlStrCopy[i+1] != '*') { + (*argc)--; /* Everything is OK - update to next parameter: */ + i += 2; /* Skip to next parameter (if any). */ + } + else + i += 3; /* Skip the '*' also! */ + } + + return ARG_OK; +} + +/*************************************************************************** +* Routine to get few parameters into one pointer such that the returned * +* pointer actually points on a block of pointers to the parameters... * +* For example *F means a pointer to pointers on floats. * +* Returns number of parameters actually read. * +* This routine assumes that all pointers (on any kind of scalar) has the * +* same size (and the union below is totally ovelapped bteween dif. arrays) * +***************************************************************************/ +static int GAGetMultiParmeters(int *Parameters[], int *ParamCount, + char *CtrlStrCopy, int *argc, char ***argv) +{ + int i = 0, ScanRes, NumOfPrm = 0, **Pmain, **Ptemp; + union TmpArray { /* Save here the temporary data before copying it to */ + int *IntArray[MAX_PARAM]; /* the returned pointer block. */ + long *LngArray[MAX_PARAM]; + float *FltArray[MAX_PARAM]; + double *DblArray[MAX_PARAM]; + char *ChrArray[MAX_PARAM]; + } TmpArray; + + do { + switch(CtrlStrCopy[2]) { /* CtrlStr == '!*?' or '%*?' where ? is. */ + case 'd': /* Format to read the parameters: */ + TmpArray.IntArray[NumOfPrm] = (int *) MyMalloc(sizeof(int)); + ScanRes = sscanf(*((*argv)++), "%d", + (int *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'u': + TmpArray.IntArray[NumOfPrm] = (int *) MyMalloc(sizeof(int)); + ScanRes = sscanf(*((*argv)++), "%u", + (unsigned int *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'o': + TmpArray.IntArray[NumOfPrm] = (int *) MyMalloc(sizeof(int)); + ScanRes = sscanf(*((*argv)++), "%o", + (int *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'x': + TmpArray.IntArray[NumOfPrm] = (int *) MyMalloc(sizeof(int)); + ScanRes = sscanf(*((*argv)++), "%x", + (int *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'D': + TmpArray.LngArray[NumOfPrm] = (long *) MyMalloc(sizeof(long)); + ScanRes = sscanf(*((*argv)++), "%ld", + (long *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'U': + TmpArray.LngArray[NumOfPrm] = (long *) MyMalloc(sizeof(long)); + ScanRes = sscanf(*((*argv)++), "%lu", + (unsigned long *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'O': + TmpArray.LngArray[NumOfPrm] = (long *) MyMalloc(sizeof(long)); + ScanRes = sscanf(*((*argv)++), "%lo", + (long *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'X': + TmpArray.LngArray[NumOfPrm] = (long *) MyMalloc(sizeof(long)); + ScanRes = sscanf(*((*argv)++), "%lx", + (long *) TmpArray.IntArray[NumOfPrm++]); + break; + case 'f': + TmpArray.FltArray[NumOfPrm] = (float *) MyMalloc(sizeof(float)); + ScanRes = sscanf(*((*argv)++), "%f", + (float *) TmpArray.LngArray[NumOfPrm++]); + break; + case 'F': + TmpArray.DblArray[NumOfPrm] = + (double *) MyMalloc(sizeof(double)); + ScanRes = sscanf(*((*argv)++), "%lf", + (double *) TmpArray.LngArray[NumOfPrm++]); + break; + case 's': + while ((*argc) && ((**argv)[0] != '-')) { + TmpArray.ChrArray[NumOfPrm++] = *((*argv)++); + (*argc)--; + } + ScanRes = 0; /* Force quit from do - loop. */ + NumOfPrm++; /* Updated again immediately after loop! */ + (*argv)++; /* "" */ + break; + default: + ScanRes = 0; /* Make optimizer warning silent. */ + } + (*argc)--; + } + while (ScanRes == 1); /* Exactly one parameter was read. */ + (*argv)--; NumOfPrm--; (*argc)++; + + /* Now allocate the block with the exact size, and set it: */ + Ptemp = Pmain = (int **) MyMalloc((unsigned) (NumOfPrm+1) * sizeof(int *)); + /* And here we use the assumption that all pointers are the same: */ + for (i = 0; i < NumOfPrm; i++) + *Ptemp++ = TmpArray.IntArray[i]; + *Ptemp = NULL; /* Close the block with NULL pointer. */ + + /* That it save the number of parameters read as first parameter to */ + /* return and the pointer to the block as second, and return: */ + *Parameters[(*ParamCount)++] = NumOfPrm; + GAByteCopy((char *) Parameters[(*ParamCount)++], (char *) &Pmain, + sizeof(char *)); + return NumOfPrm; +} + +/*************************************************************************** +* Routine to scan the CtrlStr, upto Max and count the number of parameters * +* to that point: * +* 1. Each option is counted as one parameter - boolean variable (int) * +* 2. Within an option, each %? or !? is counted once - pointer to something* +* 3. Within an option, %*? or !*? is counted twice - one for item count * +* and one for pointer to block pointers. * +* Note ALL variables are passed by address and so of fixed size (address). * +***************************************************************************/ +static void GASetParamCount(char *CtrlStr, int Max, int *ParamCount) +{ + int i; + + *ParamCount = 0; + for (i = 0; i < Max; i++) if (ISCTRLCHAR(CtrlStr[i])) { + if (CtrlStr[i+1] == '*') + *ParamCount += 2; + else + (*ParamCount)++; + } +} + +/*************************************************************************** +* Routine to copy exactly n bytes from Src to Dst. Note system library * +* routine strncpy should do the same, but it stops on NULL char ! * +***************************************************************************/ +static void GAByteCopy(char *Dst, char *Src, unsigned n) +{ + while (n--) *(Dst++) = *(Src++); +} + +/*************************************************************************** +* Routine to check if more option (i.e. first char == '-') exists in the * +* given list argc, argv: * +***************************************************************************/ +static int GAOptionExists(int argc, char **argv) +{ + while (argc--) + if ((*argv++)[0] == '-') return TRUE; + return FALSE; +} + +/*************************************************************************** +* Routine to print some error messages, for this module: * +***************************************************************************/ +void GAPrintErrMsg(int Error) +{ + fprintf(stderr, "Error in command line parsing - "); + switch (Error) { + case 0:; + fprintf(stderr, "Undefined error"); + break; + case CMD_ERR_NotAnOpt: + fprintf(stderr, "None option Found"); + break; + case CMD_ERR_NoSuchOpt: + fprintf(stderr, "Undefined option Found"); + break; + case CMD_ERR_WildEmpty: + fprintf(stderr, "Empty input for '!*?' seq."); + break; + case CMD_ERR_NumRead: + fprintf(stderr, "Failed on reading number"); + break; + case CMD_ERR_AllSatis: + fprintf(stderr, "Fail to satisfy"); + break; + } + fprintf(stderr, " - '%s'.\n", GAErrorToken); +} + +/*************************************************************************** +* Routine to print correct format of command line allowed: * +***************************************************************************/ +void GAPrintHowTo(char *CtrlStr) +{ + int i = 0, SpaceFlag; + + fprintf(stderr, "Usage: "); + /* Print program name - first word in ctrl. str. (optional): */ + while (!(ISSPACE(CtrlStr[i])) && (!ISCTRLCHAR(CtrlStr[i+1]))) + fprintf(stderr, "%c", CtrlStr[i++]); + + while (i < strlen(CtrlStr)) { + while ((ISSPACE(CtrlStr[i])) && (i < strlen(CtrlStr))) i++; + switch (CtrlStr[i+1]) { + case '%': + fprintf(stderr, " [-%c", CtrlStr[i++]); + i += 2; /* Skip the '%-' or '!- after the char! */ + SpaceFlag = TRUE; + while (!ISCTRLCHAR(CtrlStr[i]) && (i < strlen(CtrlStr)) && + (!ISSPACE(CtrlStr[i]))) + if (SpaceFlag) { + if (CtrlStr[i++] == SPACE_CHAR) + fprintf(stderr, " "); + else + fprintf(stderr, " %c", CtrlStr[i-1]); + SpaceFlag = FALSE; + } + else if (CtrlStr[i++] == SPACE_CHAR) + fprintf(stderr, " "); + else + fprintf(stderr, "%c", CtrlStr[i-1]); + while (!ISSPACE(CtrlStr[i]) && (i < strlen(CtrlStr))) { + if (CtrlStr[i] == '*') fprintf(stderr, "..."); + i++; /* Skip the rest of it. */ + } + fprintf(stderr, "]"); + break; + case '!': + fprintf(stderr, " -%c", CtrlStr[i++]); + i += 2; /* Skip the '%-' or '!- after the char! */ + SpaceFlag = TRUE; + while (!ISCTRLCHAR(CtrlStr[i]) && (i < strlen(CtrlStr)) && + (!ISSPACE(CtrlStr[i]))) + if (SpaceFlag) { + if (CtrlStr[i++] == SPACE_CHAR) + fprintf(stderr, " "); + else + fprintf(stderr, " %c", CtrlStr[i-1]); + SpaceFlag = FALSE; + } + else if (CtrlStr[i++] == SPACE_CHAR) + fprintf(stderr, " "); + else + fprintf(stderr, "%c", CtrlStr[i-1]); + while (!ISSPACE(CtrlStr[i]) && (i < strlen(CtrlStr))) { + if (CtrlStr[i] == '*') fprintf(stderr, "..."); + i++; /* Skip the rest of it. */ + } + break; + default: /* Not checked, but must be last one! */ + fprintf(stderr, " "); + while (!ISSPACE(CtrlStr[i]) && (i < strlen(CtrlStr)) && + !ISCTRLCHAR(CtrlStr[i])) + fprintf(stderr, "%c", CtrlStr[i++]); + fprintf(stderr, "\n"); + return; + } + } + fprintf(stderr, "\n"); +} + +#ifdef MYMALLOC + +/*************************************************************************** +* My Routine to allocate dynamic memory. All program requests must call * +* this routine (no direct call to malloc). Dies if no memory. * +***************************************************************************/ +static char *MyMalloc(unsigned size) +{ + char *p; + + if ((p = (char *) malloc(size)) != NULL) return p; + + fprintf(stderr, "Not enough memory, exit.\n"); + exit(2); + + return NULL; /* Makes warning silent. */ +} + +#endif /* MYMALLOC */ diff --git a/G/LIB/GETARG.H b/G/LIB/GETARG.H new file mode 100644 index 0000000..e09c59c --- /dev/null +++ b/G/LIB/GETARG.H @@ -0,0 +1,28 @@ +/*************************************************************************** +* Error numbers as returned by GAGetArg routine: * +* * +* Gershon Elber Mar 88 * +**************************************************************************** +* History: * +* 11 Mar 88 - Version 1.0 by Gershon Elber. * +***************************************************************************/ + +#ifndef GET_ARG_H +#define GET_ARG_H + +#define CMD_ERR_NotAnOpt 1 /* None Option found. */ +#define CMD_ERR_NoSuchOpt 2 /* Undefined Option Found. */ +#define CMD_ERR_WildEmpty 3 /* Empty input for !*? seq. */ +#define CMD_ERR_NumRead 4 /* Failed on reading number. */ +#define CMD_ERR_AllSatis 5 /* Fail to satisfy (must-'!') option. */ + +#ifdef USE_VARARGS +int GAGetArgs(int va_alist, ...); +#else +int GAGetArgs(int argc, char **argv, char *CtrlStr, ...); +#endif /* USE_VARARGS */ + +void GAPrintErrMsg(int Error); +void GAPrintHowTo(char *CtrlStr); + +#endif /* GET_ARG_H */ diff --git a/G/LIB/GIF_ERR.C b/G/LIB/GIF_ERR.C new file mode 100644 index 0000000..8cb91f9 --- /dev/null +++ b/G/LIB/GIF_ERR.C @@ -0,0 +1,130 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber IBM PC Ver 0.1, Jun. 1989 * +****************************************************************************** +* Handle error reporting for the GIF library. * +****************************************************************************** +* History: * +* 17 Jun 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#include +#include "gif_lib.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +int _GifError = 0; + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +/***************************************************************************** +* Return the last GIF error (0 if none) and reset the error. * +*****************************************************************************/ +int GifLastError(void) +{ + int i = _GifError; + + _GifError = 0; + + return i; +} + +/***************************************************************************** +* Print the last GIF error to stderr. * +*****************************************************************************/ +void PrintGifError(void) +{ + char *Err; + + switch(_GifError) { + case E_GIF_ERR_OPEN_FAILED: + Err = "Failed to open given file"; + break; + case E_GIF_ERR_WRITE_FAILED: + Err = "Failed to Write to given file"; + break; + case E_GIF_ERR_HAS_SCRN_DSCR: + Err = "Screen Descriptor already been set"; + break; + case E_GIF_ERR_HAS_IMAG_DSCR: + Err = "Image Descriptor is still active"; + break; + case E_GIF_ERR_NO_COLOR_MAP: + Err = "Neither Global Nor Local color map"; + break; + case E_GIF_ERR_DATA_TOO_BIG: + Err = "#Pixels bigger than Width * Height"; + break; + case E_GIF_ERR_NOT_ENOUGH_MEM: + Err = "Fail to allocate required memory"; + break; + case E_GIF_ERR_DISK_IS_FULL: + Err = "Write failed (disk full?)"; + break; + case E_GIF_ERR_CLOSE_FAILED: + Err = "Failed to close given file"; + break; + case E_GIF_ERR_NOT_WRITEABLE: + Err = "Given file was not opened for write"; + break; + case D_GIF_ERR_OPEN_FAILED: + Err = "Failed to open given file"; + break; + case D_GIF_ERR_READ_FAILED: + Err = "Failed to Read from given file"; + break; + case D_GIF_ERR_NOT_GIF_FILE: + Err = "Given file is NOT GIF file"; + break; + case D_GIF_ERR_NO_SCRN_DSCR: + Err = "No Screen Descriptor detected"; + break; + case D_GIF_ERR_NO_IMAG_DSCR: + Err = "No Image Descriptor detected"; + break; + case D_GIF_ERR_NO_COLOR_MAP: + Err = "Neither Global Nor Local color map"; + break; + case D_GIF_ERR_WRONG_RECORD: + Err = "Wrong record type detected"; + break; + case D_GIF_ERR_DATA_TOO_BIG: + Err = "#Pixels bigger than Width * Height"; + break; + case D_GIF_ERR_NOT_ENOUGH_MEM: + Err = "Fail to allocate required memory"; + break; + case D_GIF_ERR_CLOSE_FAILED: + Err = "Failed to close given file"; + break; + case D_GIF_ERR_NOT_READABLE: + Err = "Given file was not opened for read"; + break; + case D_GIF_ERR_IMAGE_DEFECT: + Err = "Image is defective, decoding aborted"; + break; + case D_GIF_ERR_EOF_TOO_SOON: + Err = "Image EOF detected, before image complete"; + break; + default: + Err = NULL; + break; + } + if (Err != NULL) + fprintf(stderr, "\nGIF-LIB error: %s.\n", Err); + else + fprintf(stderr, "\nGIF-LIB undefined error %d.\n", _GifError); +} diff --git a/G/LIB/GIF_HASH.C b/G/LIB/GIF_HASH.C new file mode 100644 index 0000000..d30b40e --- /dev/null +++ b/G/LIB/GIF_HASH.C @@ -0,0 +1,155 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber IBM PC Ver 0.1, Jun. 1989 * +****************************************************************************** +* Module to support the following operations: * +* * +* 1. InitHashTable - initialize hash table. * +* 2. ClearHashTable - clear the hash table to an empty state. * +* 2. InsertHashTable - insert one item into data structure. * +* 3. ExistsHashTable - test if item exists in data structure. * +* * +* This module is used to hash the GIF codes during encoding. * +****************************************************************************** +* History: * +* 14 Jun 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#else +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "gif_hash.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +/* #define DEBUG_HIT_RATE Debug number of misses per hash Insert/Exists. */ + +#ifdef DEBUG_HIT_RATE +static long NumberOfTests = 0, + NumberOfMisses = 0; +#endif /* DEBUG_HIT_RATE */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +static int KeyItem(unsigned long Item); + +/****************************************************************************** +* Initialize HashTable - allocate the memory needed and clear it. * +******************************************************************************/ +GifHashTableType *_InitHashTable(void) +{ + GifHashTableType *HashTable; + + if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType))) + == NULL) + return NULL; + + _ClearHashTable(HashTable); + + return HashTable; +} + +/****************************************************************************** +* Routine to clear the HashTable to an empty state. * +* This part is a little machine depended. Use the commented part otherwise. * +******************************************************************************/ +void _ClearHashTable(GifHashTableType *HashTable) +{ + memset(HashTable -> HTable, 0xFF, HT_SIZE * sizeof(long)); +} + +/****************************************************************************** +* Routine to insert a new Item into the HashTable. The data is assumed to be * +* new one. * +******************************************************************************/ +void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code) +{ + int HKey = KeyItem(Key); + unsigned long *HTable = HashTable -> HTable; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + HKey = (HKey + 1) & HT_KEY_MASK; + } + HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); +} + +/****************************************************************************** +* Routine to test if given Key exists in HashTable and if so returns its code * +* Returns the Code if key was found, -1 if not. * +******************************************************************************/ +int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key) +{ + int HKey = KeyItem(Key); + unsigned long *HTable = HashTable -> HTable, HTKey; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + if (Key == HTKey) return HT_GET_CODE(HTable[HKey]); + HKey = (HKey + 1) & HT_KEY_MASK; + } + + return -1; +} + +/****************************************************************************** +* Routine to generate an HKey for the hashtable out of the given unique key. * +* The given Key is assumed to be 20 bits as follows: lower 8 bits are the * +* new postfix character, while the upper 12 bits are the prefix code. * +* Because the average hit ratio is only 2 (2 hash references per entry), * +* evaluating more complex keys (such as twin prime keys) does not worth it! * +******************************************************************************/ +static int KeyItem(unsigned long Item) +{ + return ((Item >> 12) ^ Item) & HT_KEY_MASK; +} + +#ifdef DEBUG_HIT_RATE +/****************************************************************************** +* Debugging routine to print the hit ratio - number of times the hash table * +* was tested per operation. This routine was used to test the KeyItem routine * +******************************************************************************/ +void HashTablePrintHitRatio(void) +{ + printf("Hash Table Hit Ratio is %ld/%ld = %ld%%.\n", + NumberOfMisses, NumberOfTests, + NumberOfMisses * 100 / NumberOfTests); +} +#endif /* DEBUG_HIT_RATE */ diff --git a/G/LIB/GIF_HASH.H b/G/LIB/GIF_HASH.H new file mode 100644 index 0000000..08ac702 --- /dev/null +++ b/G/LIB/GIF_HASH.H @@ -0,0 +1,31 @@ +/****************************************************************************** +* Declarations, global to other of the GIF-HASH.C module. * +* * +* Written by Gershon Elber, Jun 1989 * +******************************************************************************* +* History: * +* 14 Jun 89 - Version 1.0 by Gershon Elber. * +******************************************************************************/ + +#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */ +#define HT_KEY_MASK 0x1FFF /* 13bits keys */ +#define HT_KEY_NUM_BITS 13 /* 13bits keys */ +#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */ +#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ + +/* The 32 bits of the long are divided into two parts for the key & code: */ +/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */ +/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */ +#define HT_GET_KEY(l) (l >> 12) +#define HT_GET_CODE(l) (l & 0x0FFF) +#define HT_PUT_KEY(l) (l << 12) +#define HT_PUT_CODE(l) (l & 0x0FFF) + +typedef struct GifHashTableType { + unsigned long HTable[HT_SIZE]; +} GifHashTableType; + +GifHashTableType *_InitHashTable(void); +void _ClearHashTable(GifHashTableType *HashTable); +void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code); +int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key); G \ No newline at end of file diff --git a/G/LIB/GIF_LIB.H b/G/LIB/GIF_LIB.H new file mode 100644 index 0000000..d4b9834 --- /dev/null +++ b/G/LIB/GIF_LIB.H @@ -0,0 +1,178 @@ +/****************************************************************************** +* In order to make life a little bit easier when using the GIF file format, * +* this library was written, and which does all the dirty work... * +* * +* Written by Gershon Elber, Jun. 1989 * +******************************************************************************* +* History: * +* 14 Jun 89 - Version 1.0 by Gershon Elber. * +* 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). * +******************************************************************************/ + +#ifndef GIF_LIB_H +#define GIF_LIB_H + +#define GIF_LIB_VERSION " Version 1.2, " + +#define GIF_ERROR 0 +#define GIF_OK 1 + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */ + +typedef int GifBooleanType; +typedef unsigned char GifPixelType; +typedef unsigned char * GifRowType; +typedef unsigned char GifByteType; + +#define GIF_MESSAGE(Msg) fprintf(stderr, "\n%s: %s\n", PROGRAM_NAME, Msg) +#define GIF_EXIT(Msg) { GIF_MESSAGE(Msg); exit(-3); } + +#ifdef SYSV +#define VoidPtr char * +#else +#define VoidPtr void * +#endif /* SYSV */ + +typedef struct GifColorType { + GifByteType Red, Green, Blue; +} GifColorType; + +/* Note entries prefixed with S are of Screen information, while entries */ +/* prefixed with I are of the current defined Image. */ +typedef struct GifFileType { + int SWidth, SHeight, /* Screen dimensions. */ + SColorResolution, SBitsPerPixel, /* How many colors can we generate? */ + SBackGroundColor, /* I hope you understand this one... */ + ILeft, ITop, IWidth, IHeight, /* Current image dimensions. */ + IInterlace, /* Sequential/Interlaced lines. */ + IBitsPerPixel; /* How many colors this image has? */ + GifColorType *SColorMap, *IColorMap; /* NULL if not exists. */ + VoidPtr Private; /* The regular user should not mess with this one! */ +} GifFileType; + +typedef enum { + UNDEFINED_RECORD_TYPE, + SCREEN_DESC_RECORD_TYPE, + IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ + EXTENSION_RECORD_TYPE, /* Begin with '!' */ + TERMINATE_RECORD_TYPE /* Begin with ';' */ +} GifRecordType; + +/* DumpScreen2Gif routine constants identify type of window/screen to dump. */ +/* Note all values below 1000 are reserved for the IBMPC different display */ +/* devices (it has many!) and are compatible with the numbering TC2.0 */ +/* (Turbo C 2.0 compiler for IBM PC) gives to these devices. */ +typedef enum { + GIF_DUMP_SGI_WINDOW = 1000, + GIF_DUMP_X_WINDOW = 1001 +} GifScreenDumpType; + +/****************************************************************************** +* O.k. here are the routines one can access in order to encode GIF file: * +* (GIF_LIB file EGIF_LIB.C). * +******************************************************************************/ + +GifFileType *EGifOpenFileName(char *GifFileName, int GifTestExistance); +GifFileType *EGifOpenFileHandle(int GifFileHandle); +void EGifSetGifVersion(char *Version); +int EGifPutScreenDesc(GifFileType *GifFile, + int GifWidth, int GifHeight, int GifColorRes, int GifBackGround, + int GifBitsPerPixel, GifColorType *GifColorMap); +int EGifPutImageDesc(GifFileType *GifFile, + int GifLeft, int GifTop, int Width, int GifHeight, int GifInterlace, + int GifBitsPerPixel, GifColorType *GifColorMap); +int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int EGifPutPixel(GifFileType *GifFile, GifPixelType GifPixel); +int EGifPutComment(GifFileType *GifFile, char *GifComment); +int EGifPutExtension(GifFileType *GifFile, int GifExtCode, int GifExtLen, + VoidPtr GifExtension); +int EGifPutCode(GifFileType *GifFile, int GifCodeSize, + GifByteType *GifCodeBlock); +int EGifPutCodeNext(GifFileType *GifFile, GifByteType *GifCodeBlock); +int EGifCloseFile(GifFileType *GifFile); + +#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ +#define E_GIF_ERR_WRITE_FAILED 2 +#define E_GIF_ERR_HAS_SCRN_DSCR 3 +#define E_GIF_ERR_HAS_IMAG_DSCR 4 +#define E_GIF_ERR_NO_COLOR_MAP 5 +#define E_GIF_ERR_DATA_TOO_BIG 6 +#define E_GIF_ERR_NOT_ENOUGH_MEM 7 +#define E_GIF_ERR_DISK_IS_FULL 8 +#define E_GIF_ERR_CLOSE_FAILED 9 +#define E_GIF_ERR_NOT_WRITEABLE 10 + +/****************************************************************************** +* O.k. here are the routines one can access in order to decode GIF file: * +* (GIF_LIB file DGIF_LIB.C). * +******************************************************************************/ + +GifFileType *DGifOpenFileName(char *GifFileName); +GifFileType *DGifOpenFileHandle(int GifFileHandle); +int DGifGetScreenDesc(GifFileType *GifFile); +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); +int DGifGetImageDesc(GifFileType *GifFile); +int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); +int DGifGetComment(GifFileType *GifFile, char *GifComment); +int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, + GifByteType **GifExtension); +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); +int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, + GifByteType **GifCodeBlock); +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); +int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); +int DGifCloseFile(GifFileType *GifFile); + +#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ +#define D_GIF_ERR_READ_FAILED 102 +#define D_GIF_ERR_NOT_GIF_FILE 103 +#define D_GIF_ERR_NO_SCRN_DSCR 104 +#define D_GIF_ERR_NO_IMAG_DSCR 105 +#define D_GIF_ERR_NO_COLOR_MAP 106 +#define D_GIF_ERR_WRONG_RECORD 107 +#define D_GIF_ERR_DATA_TOO_BIG 108 +#define D_GIF_ERR_NOT_ENOUGH_MEM 109 +#define D_GIF_ERR_CLOSE_FAILED 110 +#define D_GIF_ERR_NOT_READABLE 111 +#define D_GIF_ERR_IMAGE_DEFECT 112 +#define D_GIF_ERR_EOF_TOO_SOON 113 + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file QUANTIZE.C. * +******************************************************************************/ +int QuantizeBuffer(unsigned int Width, unsigned int Height, int *ColorMapSize, + GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput, + GifByteType *OutputBuffer, GifColorType *OutputColorMap); + + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file QPRINTF.C. * +******************************************************************************/ +extern int GifQuitePrint; + +#ifdef USE_VARARGS +void GifQprintf(); +#else +void GifQprintf(char *Format, ...); +#endif /* USE_VARARGS */ + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file GIF_ERR.C. * +******************************************************************************/ +void PrintGifError(void); +int GifLastError(void); + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file DEV2GIF.C. * +******************************************************************************/ +int DumpScreen2Gif(char *FileName, int ReqGraphDriver, int ReqGraphMode1, + int ReqGraphMode2, + int ReqGraphMode3); + +#endif /* GIF_LIB_H */ diff --git a/G/LIB/GIF_LIBC.LIB b/G/LIB/GIF_LIBC.LIB new file mode 100644 index 0000000000000000000000000000000000000000..3f66058dfe1f2281ada6cfee56457da5b5664fe6 GIT binary patch literal 31232 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

S^ygDx`F-{1h>w*fGd4g>9V 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 literal 0 HcmV?d00001 diff --git a/G/LIB/GIF_LIBH.LST b/G/LIB/GIF_LIBH.LST new file mode 100644 index 0000000..4410e2b --- /dev/null +++ b/G/LIB/GIF_LIBH.LST @@ -0,0 +1,39 @@ +Publics by module + +DEV2GIF size = 1713 + _DumpScreen2Gif + +DGIF_LIB size = 5155 + _DGifCloseFile _DGifGetCode + _DGifGetCodeNext _DGifGetExtension + _DGifGetExtensionNext _DGifGetImageDesc + _DGifGetLZCodes _DGifGetLine + _DGifGetPixel _DGifGetRecordType + _DGifGetScreenDesc _DGifOpenFileHandle + _DGifOpenFileName + +EGIF_LIB size = 4751 + _EGifCloseFile _EGifOpenFileHandle + _EGifOpenFileName _EGifPutCode + _EGifPutCodeNext _EGifPutComment + _EGifPutExtension _EGifPutImageDesc + _EGifPutLine _EGifPutPixel + _EGifPutScreenDesc _EGifSetGifVersion + +GETARG size = 5054 + _GAGetArgs _GAPrintErrMsg + _GAPrintHowTo + +GIF_ERR size = 1260 + _GifLastError _PrintGifError + __GifError + +GIF_HASH size = 551 + __ClearHashTable __ExistsHashTable + __InitHashTable __InsertHashTable + +QPRINTF size = 84 + _GifQprintf _GifQuitePrint + +QUANTIZE size = 3287 + _QuantizeBuffer diff --git a/G/LIB/GIF_LIBL.LIB b/G/LIB/GIF_LIBL.LIB new file mode 100644 index 0000000000000000000000000000000000000000..9839f378fb0e2dbd5b88e8f49e3bf398e6eb1499 GIT binary patch literal 32256 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 literal 0 HcmV?d00001 diff --git a/G/LIB/GIF_LIBM.LST b/G/LIB/GIF_LIBM.LST new file mode 100644 index 0000000..ebb2a3f --- /dev/null +++ b/G/LIB/GIF_LIBM.LST @@ -0,0 +1,39 @@ +Publics by module + +DEV2GIF size = 1576 + _DumpScreen2Gif + +DGIF_LIB size = 3718 + _DGifCloseFile _DGifGetCode + _DGifGetCodeNext _DGifGetExtension + _DGifGetExtensionNext _DGifGetImageDesc + _DGifGetLZCodes _DGifGetLine + _DGifGetPixel _DGifGetRecordType + _DGifGetScreenDesc _DGifOpenFileHandle + _DGifOpenFileName + +EGIF_LIB size = 3357 + _EGifCloseFile _EGifOpenFileHandle + _EGifOpenFileName _EGifPutCode + _EGifPutCodeNext _EGifPutComment + _EGifPutExtension _EGifPutImageDesc + _EGifPutLine _EGifPutPixel + _EGifPutScreenDesc _EGifSetGifVersion + +GETARG size = 3871 + _GAGetArgs _GAPrintErrMsg + _GAPrintHowTo + +GIF_ERR size = 1066 + _GifLastError _PrintGifError + __GifError + +GIF_HASH size = 456 + __ClearHashTable __ExistsHashTable + __InitHashTable __InsertHashTable + +QPRINTF size = 62 + _GifQprintf _GifQuitePrint + +QUANTIZE size = 2876 + _QuantizeBuffer diff --git a/G/LIB/GIF_LIBS.LIB b/G/LIB/GIF_LIBS.LIB new file mode 100644 index 0000000000000000000000000000000000000000..1612f3d33b0bbb4211c0542fbbad865e9e62ca81 GIT binary patch literal 27136 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 NeDa&#e~VP`{{XT}hQ + +#ifdef USE_VARARGS +#include +#else +#include +#endif /* USE_VARARGS */ + +#include "gif_lib.h" + +#ifdef __MSDOS__ +int GifQuitePrint = FALSE; +#else +int GifQuitePrint = TRUE; +#endif /* __MSDOS__ */ + +/***************************************************************************** +* Same as fprintf to stderr but with optional print. * +*****************************************************************************/ +#ifdef USE_VARARGS +void GifQprintf(int va_alist) +{ + char *Format, Line[128]; + va_list ArgPtr; + + va_start(ArgPtr); + Format = va_arg(ArgPtr, char *); +#else +void GifQprintf(char *Format, ...) +{ + char Line[128]; + va_list ArgPtr; + + va_start(ArgPtr, Format); +#endif /* USE_VARARGS */ + + if (GifQuitePrint) return; + + vsprintf(Line, Format, ArgPtr); + va_end(ArgPtr); + + fputs(Line, stderr); +} diff --git a/G/LIB/QUANTIZE.C b/G/LIB/QUANTIZE.C new file mode 100644 index 0000000..f0f1729 --- /dev/null +++ b/G/LIB/QUANTIZE.C @@ -0,0 +1,335 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber IBM PC Ver 0.1, Jun. 1989 * +****************************************************************************** +* Module to quatize high resolution image into lower one. You may want to * +* peek into the following article this code is based on: * +* "Color Image Quantization for frame buffer Display", by Paul Heckbert * +* SIGGRAPH 1982 page 297-307. * +****************************************************************************** +* History: * +* 5 Jan 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include "gif_lib.h" + +#define PROGRAM_NAME "GIF_LIBRARY" + +#define ABS(x) ((x) > 0 ? (x) : (-(x))) + +/* The colors are stripped to 5 bits per primary color if non MSDOS system */ +/* or to 4 (not enough memory...) if MSDOS as first step. */ +#ifdef __MSDOS__ +#define COLOR_ARRAY_SIZE 4096 +#define BITS_PER_PRIM_COLOR 4 +#define MAX_PRIM_COLOR 0x0f +#else +#define COLOR_ARRAY_SIZE 32768 +#define BITS_PER_PRIM_COLOR 5 +#define MAX_PRIM_COLOR 0x1f +#endif /* __MSDOS__ */ + +extern int _GifError; + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#else +static char *VersionStr = + PROGRAM_NAME + " IBMPC " + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +#endif /* SYSV */ + +static int SortRGBAxis; + +typedef struct QuantizedColorType { + GifByteType RGB[3]; + GifByteType NewColorIndex; + long Count; + struct QuantizedColorType *Pnext; +} QuantizedColorType; + +typedef struct NewColorMapType { + GifByteType RGBMin[3], RGBWidth[3]; + unsigned int NumEntries;/* # of QuantizedColorType in linked list below. */ + long Count; /* Total number of pixels in all the entries. */ + QuantizedColorType *QuantizedColors; +} NewColorMapType; + +static int SubdivColorMap(NewColorMapType *NewColorSubdiv, + unsigned int ColorMapSize, + unsigned int *NewColorMapSize); +#ifdef __MSDOS__ +static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2); +#else +static int SortCmpRtn(VoidPtr Entry1, VoidPtr Entry2); +#endif /* __MSDOS__ */ + +/****************************************************************************** +* Quantize high resolution image into lower one. Input image consists of a * +* 2D array for each of the RGB colors with size Width by Height. There is no * +* Color map for the input. Output is a quantized image with 2D array of * +* indexes into the output color map. * +* Note input image can be 24 bits at the most (8 for red/green/blue) and * +* the output has 256 colors at the most (256 entries in the color map.). * +* ColorMapSize specifies size of color map up to 256 and will be updated to * +* real size before returning. * +* Also non of the parameter are allocated by this routine. * +* This function returns GIF_OK if succesfull, GIF_ERROR otherwise. * +******************************************************************************/ +int QuantizeBuffer(unsigned int Width, unsigned int Height, int *ColorMapSize, + GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput, + GifByteType *OutputBuffer, GifColorType *OutputColorMap) +{ + unsigned int i, j, Index, NewColorMapSize, NumOfEntries, MaxRGBError[3]; + long Red, Green, Blue; + NewColorMapType NewColorSubdiv[256]; + QuantizedColorType *ColorArrayEntries, *QuantizedColor; + + if ((ColorArrayEntries = (QuantizedColorType *) + malloc(sizeof(QuantizedColorType) * COLOR_ARRAY_SIZE)) == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + for (i = 0; i < COLOR_ARRAY_SIZE; i++) { + ColorArrayEntries[i].RGB[0]= i >> (2 * BITS_PER_PRIM_COLOR); + ColorArrayEntries[i].RGB[1] = (i >> BITS_PER_PRIM_COLOR) & + MAX_PRIM_COLOR; + ColorArrayEntries[i].RGB[2] = i & MAX_PRIM_COLOR; + ColorArrayEntries[i].Count = 0; + } + + /* Sample the colors and their distribution: */ + for (i = 0; i < Width * Height; i++) { + Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + + ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + + (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); + ColorArrayEntries[Index].Count++; + } + + /* Put all the colors in the first entry of the color map, and call the */ + /* recursive subdivision process. */ + for (i = 0; i < 256; i++) { + NewColorSubdiv[i].QuantizedColors = NULL; + NewColorSubdiv[i].Count = NewColorSubdiv[i].NumEntries = 0; + for (j = 0; j < 3; j++) { + NewColorSubdiv[i].RGBMin[j] = 0; + NewColorSubdiv[i].RGBWidth[j] = 255; + } + } + + /* Find the non empty entries in the color table and chain them: */ + for (i = 0; i < COLOR_ARRAY_SIZE; i++) + if (ColorArrayEntries[i].Count > 0) break; + QuantizedColor = NewColorSubdiv[0].QuantizedColors = &ColorArrayEntries[i]; + NumOfEntries = 1; + while (++i < COLOR_ARRAY_SIZE) + if (ColorArrayEntries[i].Count > 0) { + QuantizedColor -> Pnext = &ColorArrayEntries[i]; + QuantizedColor = &ColorArrayEntries[i]; + NumOfEntries++; + } + QuantizedColor -> Pnext = NULL; + + NewColorSubdiv[0].NumEntries = NumOfEntries;/* Different sampled colors. */ + NewColorSubdiv[0].Count = ((long) Width) * Height; /* Pixels. */ + NewColorMapSize = 1; + if (SubdivColorMap(NewColorSubdiv, *ColorMapSize, &NewColorMapSize) != + GIF_OK) { + free((char *) ColorArrayEntries); + return GIF_ERROR; + } + if (NewColorMapSize < *ColorMapSize) { + /* And clear rest of color map: */ + for (i = NewColorMapSize; i < *ColorMapSize; i++) + OutputColorMap[i].Red = + OutputColorMap[i].Green = + OutputColorMap[i].Blue = 0; + } + + /* Average the colors in each entry to be the color to be used in the */ + /* output color map, and plug it into the output color map itself. */ + for (i = 0; i < NewColorMapSize; i++) { + if ((j = NewColorSubdiv[i].NumEntries) > 0) { + QuantizedColor = NewColorSubdiv[i].QuantizedColors; + Red = Green = Blue = 0; + while (QuantizedColor) { + QuantizedColor -> NewColorIndex = i; + Red += QuantizedColor -> RGB[0]; + Green += QuantizedColor -> RGB[1]; + Blue += QuantizedColor -> RGB[2]; + QuantizedColor = QuantizedColor -> Pnext; + } + OutputColorMap[i].Red = (Red << (8 - BITS_PER_PRIM_COLOR)) / j; + OutputColorMap[i].Green = (Green << (8 - BITS_PER_PRIM_COLOR)) / j; + OutputColorMap[i].Blue= (Blue << (8 - BITS_PER_PRIM_COLOR)) / j; + } + else + GIF_MESSAGE("Null entry in quantized color map - thats weird."); + } + + /* Finally scan the input buffer again and put the mapped index in the */ + /* output buffer. */ + MaxRGBError[0] = MaxRGBError[1] = MaxRGBError[2] = 0; + for (i = 0; i < Width * Height; i++) { + Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + + ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + + (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); + Index = ColorArrayEntries[Index].NewColorIndex; + OutputBuffer[i] = Index; + if (MaxRGBError[0] < ABS(OutputColorMap[Index].Red - RedInput[i])) + MaxRGBError[0] = ABS(OutputColorMap[Index].Red - RedInput[i]); + if (MaxRGBError[1] < ABS(OutputColorMap[Index].Green - GreenInput[i])) + MaxRGBError[1] = ABS(OutputColorMap[Index].Green - GreenInput[i]); + if (MaxRGBError[2] < ABS(OutputColorMap[Index].Blue - BlueInput[i])) + MaxRGBError[2] = ABS(OutputColorMap[Index].Blue - BlueInput[i]); + } + +#ifdef DEBUG + fprintf(stderr, + "Quantization L(0) errors: Red = %d, Green = %d, Blue = %d.\n", + MaxRGBError[0], MaxRGBError[1], MaxRGBError[2]); +#endif /* DEBUG */ + + free((char *) ColorArrayEntries); + + *ColorMapSize = NewColorMapSize; + + return GIF_OK; +} + +/****************************************************************************** +* Routine to subdivide the RGB space recursively using median cut in each * +* axes alternatingly until ColorMapSize different cubes exists. * +* The biggest cube in one dimension is subdivide unless it has only one entry.* +* Returns GIF_ERROR if failed, otherwise GIF_OK. * +******************************************************************************/ +static int SubdivColorMap(NewColorMapType *NewColorSubdiv, + unsigned int ColorMapSize, + unsigned int *NewColorMapSize) +{ + int MaxSize; + unsigned int i, j, Index = 0, NumEntries, MinColor, MaxColor; + long Sum, Count; + QuantizedColorType *QuantizedColor, **SortArray; + + while (ColorMapSize > *NewColorMapSize) { + /* Find candidate for subdivision: */ + MaxSize = -1; + for (i = 0; i < *NewColorMapSize; i++) { + for (j = 0; j < 3; j++) { + if (((int) NewColorSubdiv[i].RGBWidth[j]) > MaxSize && + NewColorSubdiv[i].NumEntries > 1) { + MaxSize = NewColorSubdiv[i].RGBWidth[j]; + Index = i; + SortRGBAxis = j; + } + } + } + + if (MaxSize == -1) + return GIF_OK; + + /* Split the entry Index into two along the axis SortRGBAxis: */ + + /* Sort all elements in that entry along the given axis and split at */ + /* the median. */ + if ((SortArray = (QuantizedColorType **) + malloc(sizeof(QuantizedColorType *) * + NewColorSubdiv[Index].NumEntries)) == NULL) + return GIF_ERROR; + for (j = 0, QuantizedColor = NewColorSubdiv[Index].QuantizedColors; + j < NewColorSubdiv[Index].NumEntries && QuantizedColor != NULL; + j++, QuantizedColor = QuantizedColor -> Pnext) + SortArray[j] = QuantizedColor; + qsort(SortArray, NewColorSubdiv[Index].NumEntries, + sizeof(QuantizedColorType *), SortCmpRtn); + + /* Relink the sorted list into one: */ + for (j = 0; j < NewColorSubdiv[Index].NumEntries - 1; j++) + SortArray[j] -> Pnext = SortArray[j + 1]; + SortArray[NewColorSubdiv[Index].NumEntries - 1] -> Pnext = NULL; + NewColorSubdiv[Index].QuantizedColors = QuantizedColor = SortArray[0]; + free((char *) SortArray); + + /* Now simply add the Counts until we have half of the Count: */ + Sum = NewColorSubdiv[Index].Count / 2 - QuantizedColor -> Count; + NumEntries = 1; + Count = QuantizedColor -> Count; + while ((Sum -= QuantizedColor -> Pnext -> Count) >= 0 && + QuantizedColor -> Pnext != NULL && + QuantizedColor -> Pnext -> Pnext != NULL) { + QuantizedColor = QuantizedColor -> Pnext; + NumEntries++; + Count += QuantizedColor -> Count; + } + /* Save the values of the last color of the first half, and first */ + /* of the second half so we can update the Bounding Boxes later. */ + /* Also as the colors are quantized and the BBoxes are full 0..255, */ + /* they need to be rescaled. */ + MaxColor = QuantizedColor -> RGB[SortRGBAxis];/* Max. of first half. */ + MinColor = QuantizedColor -> Pnext -> RGB[SortRGBAxis];/* of second. */ + MaxColor <<= (8 - BITS_PER_PRIM_COLOR); + MinColor <<= (8 - BITS_PER_PRIM_COLOR); + + /* Partition right here: */ + NewColorSubdiv[*NewColorMapSize].QuantizedColors = + QuantizedColor -> Pnext; + QuantizedColor -> Pnext = NULL; + NewColorSubdiv[*NewColorMapSize].Count = Count; + NewColorSubdiv[Index].Count -= Count; + NewColorSubdiv[*NewColorMapSize].NumEntries = + NewColorSubdiv[Index].NumEntries - NumEntries; + NewColorSubdiv[Index].NumEntries = NumEntries; + for (j = 0; j < 3; j++) { + NewColorSubdiv[*NewColorMapSize].RGBMin[j] = + NewColorSubdiv[Index].RGBMin[j]; + NewColorSubdiv[*NewColorMapSize].RGBWidth[j] = + NewColorSubdiv[Index].RGBWidth[j]; + } + NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] = + NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] + + NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] - + MinColor; + NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] = MinColor; + + NewColorSubdiv[Index].RGBWidth[SortRGBAxis] = + MaxColor - NewColorSubdiv[Index].RGBMin[SortRGBAxis]; + + (*NewColorMapSize)++; + } + + return GIF_OK; +} + +/****************************************************************************** +* Routine called by qsort to compare to entries. * +******************************************************************************/ +#ifdef __MSDOS__ +static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2) +#else +static int SortCmpRtn(VoidPtr Entry1, VoidPtr Entry2) +#endif /* __MSDOS__ */ +{ + return (* ((QuantizedColorType **) Entry1)) -> RGB[SortRGBAxis] - + (* ((QuantizedColorType **) Entry2)) -> RGB[SortRGBAxis]; +} diff --git a/G/MAKE-IBM.BAT b/G/MAKE-IBM.BAT new file mode 100644 index 0000000..05b3f4f --- /dev/null +++ b/G/MAKE-IBM.BAT @@ -0,0 +1,8 @@ +cd lib +make -fmakefile.tc +cd .. + +cd util +make -fmakefile.tc +cd .. + \ No newline at end of file diff --git a/G/MAKE-UNX b/G/MAKE-UNX new file mode 100644 index 0000000..7ab4ad6 --- /dev/null +++ b/G/MAKE-UNX @@ -0,0 +1,13 @@ +#/bin/csh -f +# +# Gershon Elber, Feb 90. +# + +cd lib +make -f makefile.unx libgif.a +cd .. +cd util +make -f makefile.unx all +make -f makefile.unx rle # Only if you have the rle tool kit! +cd .. +strip bin/* diff --git a/G/MANIFEST b/G/MANIFEST new file mode 100644 index 0000000..03b7f67 --- /dev/null +++ b/G/MANIFEST @@ -0,0 +1,108 @@ +D:\C\GIF: +total 15 +-rwx--a 86 May 13 18:07 BACKUP.BAT +drw---- Dec 08 1990 BIN +-rw---- 5065 Nov 13 1990 COMPILE.ME +drw---- Dec 08 1990 DOC +-rw---- 671 May 05 10:10 DOS2UNIX +drw---- Dec 08 1990 LIB +-rwx--- 74 Feb 24 1990 MAKE-IBM.BAT +-rw---- 200 Feb 27 1990 MAKE-UNX +drw---- Dec 08 1990 PIC +-rw---- 3397 Nov 13 1990 README.1ST +-rw---- 1747 Mar 27 21:33 SOURCES.GET +-rwx--- 2772 Nov 12 1990 TEST-IBM.BAT +-rw---- 2191 May 05 13:39 TEST-UNX +-rw---a 988 May 13 18:09 UPDATE.NEW +drw---- Dec 08 1990 UTIL + +D:\C\GIF\BIN: +total 1 +-rw---- 184 Feb 26 1990 DUMMY + +D:\C\GIF\DOC: +total 41 +-rw---- 1280 Feb 23 1990 GENERAL.DOC +-rw---a 3493 May 13 17:36 GIF2BGI.DOC +-rw---a 2572 May 13 17:23 GIF2EPSN.DOC +-rw---a 3640 May 13 17:25 GIF2HERC.DOC +-rw---a 678 May 13 17:41 GIF2IRIS.DOC +-rw---a 1391 May 13 17:26 GIF2PS.DOC +-rw---a 771 May 13 17:26 GIF2RLE.DOC +-rw---a 1087 May 13 17:27 GIF2X11.DOC +-rw---a 1222 May 13 17:28 GIFASM.DOC +-rw---a 1897 May 13 17:28 GIFBG.DOC +-rw---a 1490 May 13 17:29 GIFCLIP.DOC +-rw---a 1142 May 13 17:30 GIFCLRMP.DOC +-rw---a 1206 May 13 17:30 GIFCOMB.DOC +-rw---a 582 May 13 17:31 GIFFIX.DOC +-rw---a 923 May 13 17:32 GIFFLIP.DOC +-rw---a 1625 May 13 17:33 GIFHISTO.DOC +-rw---a 631 May 13 17:33 GIFINTER.DOC +-rw---a 1043 May 13 17:33 GIFINTO.DOC +-rw---a 1114 May 13 17:34 GIFPOS.DOC +-rw---a 893 May 13 17:34 GIFRSIZE.DOC +-rw---a 1446 May 13 17:35 GIFTEXT.DOC +-rw---a 862 May 13 17:35 GIFWEDGE.DOC +-rw---- 18592 Aug 15 1990 GIF_LIB.DOC +-rw---- 5320 Feb 23 1990 LIBERROR.DOC +-rw---a 1246 May 13 17:36 RAW2GIF.DOC +-rw---a 1028 May 13 17:36 RLE2GIF.DOC +-rw---a 1963 May 13 17:37 TEXT2GIF.DOC + +D:\C\GIF\LIB: +total 100 +-rw---a 16668 Oct 17 1990 DEV2GIF.C +-rw---a 30190 May 05 13:11 DGIF_LIB.C +-rw---a 27253 Oct 17 1990 EGIF_LIB.C +-rw---a 25555 Sep 06 1990 GETARG.C +-rw---a 1040 Oct 17 1990 GETARG.H +-rw---a 3968 Sep 06 1990 GIF_ERR.C +-rw---a 5581 Sep 06 1990 GIF_HASH.C +-rw---a 1487 Feb 23 1990 GIF_HASH.H +-rw---a 7620 May 12 20:04 GIF_LIB.H +-rw---a 25088 May 12 20:22 GIF_LIBL.LIB +-rw---a 1218 May 12 20:22 GIF_LIBL.LST +-rw---a 1514 May 12 20:04 MAKEFILE.TC +-rw---a 2015 May 12 20:02 MAKEFILE.UNX +-rw---a 1609 May 12 20:22 QPRINTF.C +-rw---a 12813 Sep 06 1990 QUANTIZE.C + +D:\C\GIF\PIC: +total 24 +-rw---- 21504 May 04 1988 CHERYL.GIF +-rw---- 6144 May 05 1988 PORSCHE.GIF +-rw---- 18599 Sep 03 1990 SOLID2.GIF + +D:\C\GIF\UTIL: +total 239 +-rw---a 28863 May 12 20:26 GIF2BGI.C +-rw---a 20860 May 12 22:13 GIF2EPSN.C +-rw---a 35693 May 12 21:41 GIF2HERC.C +-rw---a 9075 May 12 22:13 GIF2IRIS.C +-rw---a 12351 May 12 22:13 GIF2PS.C +-rw---a 8996 May 12 21:40 GIF2RLE.C +-rw---a 17657 May 12 21:44 GIF2X11.C +-rw---a 11474 May 12 21:44 GIFASM.C +-rw---a 11723 May 12 21:46 GIFBG.C +-rw---a 9194 May 12 21:48 GIFCLIP.C +-rw---a 9979 May 12 21:49 GIFCLRMP.C +-rw---a 12624 May 12 21:50 GIFCOMB.C +-rw---- 2401 May 04 14:53 GIFDEBUG.DSK +-rw---- 11415 May 04 14:53 GIFDEBUG.PRJ +-rw---a 7336 May 12 21:52 GIFFIX.C +-rw---a 12280 May 12 21:53 GIFFLIP.C +-rw---a 9414 May 12 21:54 GIFHISTO.C +-rw---a 9856 May 12 21:56 GIFINTER.C +-rw---a 5236 May 12 21:58 GIFINTO.C +-rw---a 7385 May 12 21:58 GIFPOS.C +-rw---a 12345 May 12 21:59 GIFRSIZE.C +-rw---a 14477 May 12 22:30 GIFTEXT.C +-rw---a 5862 May 12 22:02 GIFWEDGE.C +-rw---- 1068 Sep 03 1990 HERC2GIF.C +-rw---- 2050 Dec 01 1990 MAKDEBUG.TC +-rw---- 3996 May 04 14:14 MAKEFILE.TC +-rw---- 4825 May 05 13:41 MAKEFILE.UNX +-rw---a 8528 May 12 22:03 RAW2GIF.C +-rw---a 7533 May 12 22:04 RLE2GIF.C +-rw---a 16524 May 12 22:06 TEXT2GIF.C diff --git a/G/PIC/CHERYL.GIF b/G/PIC/CHERYL.GIF new file mode 100644 index 0000000000000000000000000000000000000000..b250eec128fb590ac8007b326a738a938be746fb GIT binary patch literal 21504 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 utT6Oh~DC8*s literal 0 HcmV?d00001 diff --git a/G/PIC/SOLID2.GIF b/G/PIC/SOLID2.GIF new file mode 100644 index 0000000000000000000000000000000000000000..4e9524b0ae57b379fc324394d2f06ece64410185 GIT binary patch literal 18599 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 bg1.gif +gifcomb %GIF_DIR%porsche.gif bg1.gif | %GIF_DISPLAY% +del bg1.gif + +text2gif -f 1 -s 7 -c 0 255 0 -t "Created using the IRIT solid modeler, Gershon Elber 1990" > credit.gif +gifasm %GIF_DIR%solid2.gif credit.gif | %GIF_DISPLAY% +del credit.gif + +gifhisto -t %GIF_DIR%cheryl.gif +gifhisto -b -s 200 512 %GIF_DIR%cheryl.gif | gifflip -l | %GIF_DISPLAY% + +gifflip -r %GIF_DIR%solid2.gif | gifrsize | %GIF_DISPLAY% + +gifinter %GIF_DIR%cheryl.gif | gifflip -x | %GIF_DISPLAY% + +gifbg -d "TL" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 0 0 > b1.gif +gifbg -d "BL" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 0 175 > b2.gif +gifbg -d "TR" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 320 0 > b3.gif +gifbg -d "BR" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 320 175 > b4.gif +gifasm b1.gif b2.gif b3.gif b4.gif > backgrnd.gif +%GIF_DISPLAY% backgrnd.gif +del b?.gif +del backgrnd.gif + +copy %GIF_DIR%solid2.gif s1.gif +gifrsize s1.gif > s2.gif +gifrsize s2.gif > s3.gif +gifrsize s3.gif > s4.gif +gifpos -i 320 0 s2.gif | gifinto s2.gif +gifpos -i 480 0 s3.gif | gifinto s3.gif +gifpos -i 560 0 s4.gif | gifinto s4.gif +gifasm s1.gif s2.gif s3.gif s4.gif > sall.gif +giftext sall.gif +%GIF_DISPLAY% sall.gif +gifrsize -s 0.45 sall.gif | %GIF_DISPLAY% +del s?.gif +del sall.gif + +gifpos -s 720 348 -i 400 148 %GIF_DIR%porsche.gif | %GIF_DISPLAY% + +gifrsize -S 300 600 %GIF_DIR%solid2.gif | %GIF_DISPLAY% + +gifinter %GIF_DIR%cheryl.gif | gifrsize | %GIF_DISPLAY% -z 2 + +rem This is broken since it overflow the 128 chars limit: +gifinter %GIF_DIR%cheryl.gif | gifclip -i 222 0 390 134 | gifpos -s 169 135 | gifrsize -s 2.0 > t.gif +%GIF_DISPLAY% t.gif +del t.gif + +gifrotat -a 45 %GIF_DIR%cheryl.gif | %GIF_DISPLAY% + +@echo off + +rem Remove these variables from current shell +Exit: + +set GIF_DIR= +set GIF_DISPLAY= + + + + diff --git a/G/TEST-UNX b/G/TEST-UNX new file mode 100644 index 0000000..ecb3562 --- /dev/null +++ b/G/TEST-UNX @@ -0,0 +1,71 @@ +#! /bin/csh -f +# +# Tests for the gif_lib utilities. +# Usage: +# test-unx [GIF_DIR] [display_prgm] +# +# This test assumes the gif_lib utilities are available from one of the +# path directorys, and that GIF_DIR is set (directly or through command line) +# to the directory holf these gif files: +# 1. solid2.gif +# 2. cheryl.gif +# 3. porsche.gif +# In addition, set GIF_DISPLAY ( directly or through command line) to the +# program to display gif files in our system. +# +# Gershon Elber, Feb 90. +# + +set GIF_DIR = ./pic +if ($1 != "") set GIF_DIR = $1 + +set GIF_DISPLAY = gif2iris +if ($2 != "") set GIF_DISPLAY = $2 + +gifbg -d tl -s 320 200 -c 255 255 255 -l 64 > bg1.gif +gifcomb $GIF_DIR/porsche.gif bg1.gif | $GIF_DISPLAY +rm -f bg1.gif + +text2gif -f 1 -s 7 -c 0 255 0 -t "Created using the IRIT solid modeler, Gershon Elber 1990" > credit.gif +gifasm $GIF_DIR/solid2.gif credit.gif | $GIF_DISPLAY +rm -f credit.gif + +gifhisto -t $GIF_DIR/cheryl.gif | sort -r | more +gifhisto -b -s 200 512 $GIF_DIR/cheryl.gif | gifflip -l | $GIF_DISPLAY + +gifflip -r $GIF_DIR/solid2.gif | gifrsize | $GIF_DISPLAY + +gifinter $GIF_DIR/cheryl.gif | gifflip -x | $GIF_DISPLAY + +gifbg -d "TL" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 0 0 > b1.gif +gifbg -d "BL" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 0 175 > b2.gif +gifbg -d "TR" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 320 0 > b3.gif +gifbg -d "BR" -s 320 175 -c 255 255 255 -l 64 | gifpos -s 640 350 -i 320 175 > b4.gif +gifasm b1.gif b2.gif b3.gif b4.gif > backgrnd.gif +$GIF_DISPLAY backgrnd.gif +rm -f b?.gif backgrnd.gif + +cp $GIF_DIR/solid2.gif s1.gif +gifrsize s1.gif > s2.gif +gifrsize s2.gif > s3.gif +gifrsize s3.gif > s4.gif +gifpos -i 320 0 s2.gif | gifinto s2.gif +gifpos -i 480 0 s3.gif | gifinto s3.gif +gifpos -i 560 0 s4.gif | gifinto s4.gif +gifasm s1.gif s2.gif s3.gif s4.gif > sall.gif +giftext sall.gif +$GIF_DISPLAY sall.gif +gifrsize -s 0.45 sall.gif | $GIF_DISPLAY +rm -f s?.gif sall.gif + +gifpos -s 720 348 -i 400 148 $GIF_DIR/porsche.gif | $GIF_DISPLAY + +gifrsize -S 800 600 $GIF_DIR/solid2.gif | $GIF_DISPLAY + +gifinter $GIF_DIR/cheryl.gif | gifrsize | $GIF_DISPLAY + +gifinter $GIF_DIR/cheryl.gif | gifclip -i 222 0 390 134 | gifpos -s 169 135 | gifrsize -s 2.0 | $GIF_DISPLAY + +gifrotat -a 45 $GIF_DIR/cheryl.gif | $GIF_DISPLAY + +Exit: diff --git a/G/UPDATE.NEW b/G/UPDATE.NEW new file mode 100644 index 0000000..29cca2b --- /dev/null +++ b/G/UPDATE.NEW @@ -0,0 +1,24 @@ +Version 1.2 +----------- +1. GIFFIX - a new tool to attempt and fix broken GIF images. Currently fix + images that has EOF prematurely by padding with the darkest color. +2. Make GIF2BGI display as much as it can considering the mem. avail. +3. Add -q flag to all tools for quite running scan line number mode. +4. Fix a (minor!?) bug in the GIF decoder when encountering code 4095. +5. New tools (RGB2GIF and GIF2RGB) to convert GIF to/from 24 bits RGB images. +6. New tool GIFROTAT to rotate a gif image by an arbitrary angle. +7. GifRSize was updated to resize by an arbitrary factor. + +Version 1.1 +----------- +1. GIF2BGI - a new utility to display GIF images using Borland's BGI drivers + (if you have one...) +2. TEXT2GIF - Converts plain text into GIF images. +3. GIF2IRIS - SGI4D display program for GIF images. +4. GIF_LIB naming convension has been modified to make sure it has unique + names (see gif_lib.h). +5. Support for SGI4D gl and X11 window grabbing has been added to the + library. SGI4D input is quantizied into 8 bits. + Also support for EGA/VGA devices has been added as well. + see Dev2gif.c module. +6. Support for the new gif89a format has been added. diff --git a/G/UTIL/GETARG.H b/G/UTIL/GETARG.H new file mode 100644 index 0000000..e09c59c --- /dev/null +++ b/G/UTIL/GETARG.H @@ -0,0 +1,28 @@ +/*************************************************************************** +* Error numbers as returned by GAGetArg routine: * +* * +* Gershon Elber Mar 88 * +**************************************************************************** +* History: * +* 11 Mar 88 - Version 1.0 by Gershon Elber. * +***************************************************************************/ + +#ifndef GET_ARG_H +#define GET_ARG_H + +#define CMD_ERR_NotAnOpt 1 /* None Option found. */ +#define CMD_ERR_NoSuchOpt 2 /* Undefined Option Found. */ +#define CMD_ERR_WildEmpty 3 /* Empty input for !*? seq. */ +#define CMD_ERR_NumRead 4 /* Failed on reading number. */ +#define CMD_ERR_AllSatis 5 /* Fail to satisfy (must-'!') option. */ + +#ifdef USE_VARARGS +int GAGetArgs(int va_alist, ...); +#else +int GAGetArgs(int argc, char **argv, char *CtrlStr, ...); +#endif /* USE_VARARGS */ + +void GAPrintErrMsg(int Error); +void GAPrintHowTo(char *CtrlStr); + +#endif /* GET_ARG_H */ diff --git a/G/UTIL/GIF2BGI.C b/G/UTIL/GIF2BGI.C new file mode 100644 index 0000000..5e1c4fc --- /dev/null +++ b/G/UTIL/GIF2BGI.C @@ -0,0 +1,941 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to display GIF file using the BGI device indepedent routines * +* Options: * +* -q : quite printing mode. * +* -d BGI path : specify the directory where to look for bgi drivers. * +* -u BGIUserDriverName.Mode : use user driver instead of auto detection. * +* -z factor : zoom the pixels by the given factor. * +* -b : beeps disabled. * +* -h : on line help. * +* * +* In this file Screen refers to GIF file screen, while Device to BGI size. * +****************************************************************************** +* History: * +* 31 Jul 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2BGI" + +#define KEY_LEFT 256 /* Key Codes returned for operational keys */ +#define KEY_RIGHT 257 /* as return by the GetKey routine. */ +#define KEY_UP 258 +#define KEY_DOWN 259 +#define KEY_RETURN 260 +#define KEY_DELETE 261 +#define KEY_INSERT 262 +#define KEY_BSPACE 263 +#define KEY_ESC 264 +#define KEY_HOME 265 +#define KEY_END 266 +#define KEY_PGUP 267 +#define KEY_PGDN 268 + +#define SET_POSITION_RESET 0 /* Situations need positionings: */ +#define SET_POSITION_ZOOM_U 1 +#define SET_POSITION_ZOOM_D 2 +#define SET_POSITION_PAN 3 + +#define CURSOR_TEXT_X 120 + +#define BGI_USER_INSTALL 999 /* BGI User installed driver device. */ + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ + +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- d%-BGI|Directory!s u%-UserBGIDrv.Mode!s z%-ZoomFactor!d b%- h%- GifFile!*s"; +static char + *GifFileName, + *BGIPath = "", + *BGIUserDriverName = NULL; + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + ForeGround = 1, /* As close to white as possible. */ + BeepsDisabled = FALSE, + ZoomFactor = 1, + MaximumScreenHeight = 1, + BGIUserDriverMode = -1, + DeviceMaxX = 640, DeviceMaxY = 400, /* Physical device dimensions. */ + ScreenWidth = 320, ScreenHeight = 200, /* Gif image screen size. */ + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + +static int huge detectVGA(void); +static void BGIInstallUserDriver(char *BGIUserDriverNameMode); +static void DisplayScreen(GifRowType *ScreenBuffer, GifFileType *GifFile); +static void PrintSettingStatus(GifFileType *GifFile); +static void CPrintStr(char *Str, int y); +static void SetPosition(int Why, + int *ScreenLeft, int *ScreenTop, + int *DeviceLeft, int *DeviceTop, + int MoveX, int MoveY); +static void DrawScreen(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int DeviceLeft, int DeviceTop); +static void DoCursorMode(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int DeviceLeft, int DeviceTop); +static int MyKbHit(void); +static int MyGetCh(void); +static int GetKey(void); +static void Tone(int Frequency, int Time); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, k, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, + Count, ColorMapSize, GraphDriver, GraphMode, Sum, + HelpFlag = FALSE, + BGIPathFlag = FALSE, + BGIUserDriverFlag = FALSE, + ZoomFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension; + char Str[80], *BGIUserDriverNameMode, + **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + struct text_info TextInfo; /* So we can restore starting text mode. */ + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &BGIPathFlag, &BGIPath, + &BGIUserDriverFlag, &BGIUserDriverNameMode, + &ZoomFlag, &ZoomFactor, + &BeepsDisabled, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (BGIUserDriverFlag) { + /* Use the driver supplied by the user! */ + BGIInstallUserDriver(BGIUserDriverNameMode); + installuserdriver(BGIUserDriverName, detectVGA); + GraphDriver = BGI_USER_INSTALL; + } + else { + /* Sense type of display we have and attempt to load right driver. */ + detectgraph(&GraphDriver, &GraphMode); + if (GraphDriver < 0) + GIF_EXIT("BGI Auto detect: No graphics device detected."); + } + + /* Put in the following any graphic driver specific setup: */ + switch (GraphDriver) { + case CGA: + GraphMode = CGAHI; + break; + case EGA: + GraphMode = EGAHI; + break; + case EGA64: + GraphMode = EGA64HI; + break; + case EGAMONO: + GraphMode = EGAMONOHI; + break; + case HERCMONO: + GraphMode = HERCMONOHI; + break; + case VGA: + GraphMode = VGAHI; + break; + case BGI_USER_INSTALL: + GraphDriver = DETECT; + GraphMode = BGIUserDriverMode; + break; + default: + GIF_EXIT("Requested graphic device is not supported."); + break; + } + + if (NumFiles == 1) { + GifFileName = *FileName; + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + GifFileName = "Stdin"; + setmode(0, O_BINARY); + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes of one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + MaximumScreenHeight = GifFile -> SHeight - 1; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) { + if (i > 30) { + /* Free some memory for the BGI driver and auxilary. */ + for (j = 1; j < 28; j++) + free((char *) ScreenBuffer[i - j]); + MaximumScreenHeight = i - 28; + fprintf(stderr, "\n%s: Failed to allocate all memory required, last line %d.\n", + PROGRAM_NAME, MaximumScreenHeight); + break; + } + else + GIF_EXIT("Failed to allocate memory required, aborted."); + } + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + break; + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, + &ScreenBuffer[MIN(j, MaximumScreenHeight)][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++, Row++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[MIN(Row, MaximumScreenHeight)][Col], + Width) == GIF_ERROR) { + PrintGifError(); + MaximumScreenHeight = MIN(i - 1, MaximumScreenHeight); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + + gettextinfo(&TextInfo); /* Save current mode so we can recover. */ + + initgraph(&GraphDriver, &GraphMode, BGIPath); + if (graphresult() != grOk) /* Error occured during init. */ + GIF_EXIT("Graphics System Error, failed to initialize driver."); + + if (getmaxcolor() + 1 < ColorMapSize) { + sprintf(Str, "GIF Image color map (%d) is too big for device (%d).\n", + ColorMapSize, getmaxcolor() + 1); + closegraph(); + GIF_EXIT(Str); + } + + /* Initialize hardware pallete and also select fore/background color. */ + BackGround = ForeGround = 1; + Sum = ((int) ColorMap[1].Red) + + ((int) ColorMap[1].Green) + + ((int) ColorMap[1].Blue); + j = k = Sum; + for (i = 0; i < ColorMapSize; i++) { + setrgbpalette(i, ColorMap[i].Red >> 2, + ColorMap[i].Green >> 2, + ColorMap[i].Blue >> 2); + + Sum = ((int) ColorMap[i].Red) + + ((int) ColorMap[i].Green) + + ((int) ColorMap[i].Blue); + if (i != 0 && Sum > j) { /* Dont use color 0. */ + ForeGround = i; + j = Sum; + } + if (i != 0 && Sum <= k) { /* Dont use color 0. */ + BackGround = i; + k = Sum; + } + } + + DeviceMaxX = getmaxx(); /* Read size of physical screen. */ + DeviceMaxY = getmaxy(); + ScreenWidth = GifFile -> SWidth; + ScreenHeight = MIN(GifFile -> SHeight, MaximumScreenHeight); + + Tone(500, 10); + DisplayScreen(ScreenBuffer, GifFile); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + closegraph(); + exit(-1); + } + + closegraph(); + + textmode(TextInfo.currmode); +} + +/**************************************************************************** +* Routine to be called for the user installed driver: * +****************************************************************************/ +static int huge detectVGA(void) +{ + return BGIUserDriverMode; +} + +/**************************************************************************** +* Routine to install the user BGI driver information. * +****************************************************************************/ +static void BGIInstallUserDriver(char *BGIUserDriverNameMode) +{ + char *p; + + if ((p = strrchr(BGIUserDriverNameMode, '/')) != NULL || + (p = strrchr(BGIUserDriverNameMode, '\\')) != NULL) { + p[0] = 0; + BGIPath = strdup(BGIUserDriverNameMode); + p++; + } + + p = strtok(p, "."); + BGIUserDriverName = strdup(p); + + p = strtok(NULL, "."); + if (sscanf(p, "%d", &BGIUserDriverMode) != 1 || BGIUserDriverName == NULL) + GIF_EXIT("User [-u] BGI specification has wrong format."); +} + +/****************************************************************************** +* Given the screen buffer, display it: * +* The following commands are available (case insensitive). * +* 1. Four arrow to move along the screen (only if ScreenBuffer > physical * +* screen in that direction. * +* 2. C - goto cursor mode - print current color & position in GIF screen * +* of the current pixel cursor is on. * +* 3. D - zoom out by factor of 2. * +* 4. R - redraw current image. * +* 5. S - Print Current status/options. * +* 6. U - zoom in by factor of 2. * +* 7. ' ' - stop drawing current image. * +* 8. ESC - to quit. * +******************************************************************************/ +static void DisplayScreen(GifRowType *ScreenBuffer, GifFileType *GifFile) +{ + int DeviceTop, DeviceLeft, /* Where ScreenBuffer is to mapped to ours. */ + ScreenTop, ScreenLeft, /* Porsion of ScreenBuffer to start display. */ + XPanning, YPanning, /* Amount to move using the arrows. */ + GetK, DrawIt = TRUE; + + XPanning = DeviceMaxX / 2; + YPanning = DeviceMaxY / 2; + + SetPosition(SET_POSITION_RESET, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + + do { + if (DrawIt && !MyKbHit()) { + DrawScreen(ScreenBuffer, ScreenLeft, ScreenTop, + DeviceLeft, DeviceTop); + Tone(2000, 200); + } + DrawIt = TRUE; + switch (GetK = GetKey()) { + case 'C': + DoCursorMode(ScreenBuffer, ScreenLeft, ScreenTop, + DeviceLeft, DeviceTop); + DrawIt = TRUE; + break; + case 'D': + if (ZoomFactor > 1) { + ZoomFactor >>= 1; + SetPosition(SET_POSITION_ZOOM_D, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + } + else { + Tone(1000, 100); + DrawIt = FALSE; + } + break; + case 'R': + break; + case 'S': + PrintSettingStatus(GifFile); + break; + case 'U': + if (ZoomFactor < 256) { + ZoomFactor <<= 1; + SetPosition(SET_POSITION_ZOOM_U, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + } + else { + Tone(1000, 100); + DrawIt = FALSE; + } + break; + case KEY_ESC: + break; + case KEY_LEFT: + SetPosition(SET_POSITION_PAN, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + -XPanning, 0); + break; + case KEY_RIGHT: + SetPosition(SET_POSITION_PAN, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + XPanning, 0); + break; + case KEY_UP: + SetPosition(SET_POSITION_PAN, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, -YPanning); + break; + case KEY_DOWN: + SetPosition(SET_POSITION_PAN, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, YPanning); + break; + default: + DrawIt = FALSE; + Tone(800, 100); + Tone(300, 200); + break; + } + } + while (GetK != KEY_ESC); +} + +/****************************************************************************** +* Routine to print (in text mode), current program status. * +******************************************************************************/ +static void PrintSettingStatus(GifFileType *GifFile) +{ + char s[80]; + + setcolor(ForeGround); + + CPrintStr(PROGRAM_NAME, 1); + + sprintf(s, "GIF File - %s.", GifFileName); + CPrintStr(s, 10); + + sprintf(s, "Gif Screen Size = [%d, %d]. Contains %d image(s).", + GifFile -> SWidth, GifFile -> SHeight, ImageNum); + CPrintStr(s, 20); + + if (GifFile -> SColorMap) + sprintf(s, + "Has Screen Color map of %d bits. BackGround = [%d, %d, %d].", + GifFile -> SBitsPerPixel, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Red, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Green, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Blue); + else + sprintf(s, "No Screen color map."); + CPrintStr(s, 30); + + if (GifFile -> IColorMap) + sprintf(s, "Has Image map of %d bits (last image). Image is %s.", + GifFile -> IBitsPerPixel, + (GifFile -> IInterlace ? "interlaced" : "non interlaced")); + else + sprintf(s, "No Image color map."); + CPrintStr(s, 40); + + CPrintStr("Press anything to continue:", 60); + MyGetCh(); +} + +/****************************************************************************** +* Routine to cprintf given string centered at given Y level, and attr: * +******************************************************************************/ +static void CPrintStr(char *Str, int y) +{ + setfillstyle(SOLID_FILL, BackGround); + bar(0, y, textwidth(Str) + 2, y + textheight(Str) + 2); + + setcolor(ForeGround); + outtextxy(1, y + 1, Str); +} + +/****************************************************************************** +* Routine to set the position of Screen in Device, and what porsion of the * +* screen should be visible: * +* MoveX, MoveY are the panning factors (if both zero - initialize). * +******************************************************************************/ +static void SetPosition(int Why, + int *ScreenLeft, int *ScreenTop, + int *DeviceLeft, int *DeviceTop, + int MoveX, int MoveY) +{ + + MoveX /= ZoomFactor; /* Make sure move move same amount independent. */ + MoveY /= ZoomFactor; /* of what ZommFactor is. */ + + /* Figure out position of GIF file in real device X axis: */ + if (ScreenWidth * ZoomFactor <= DeviceMaxX + 1) { + /* Device is big enough to hold all the image X axis: */ + *ScreenLeft = 0; + *DeviceLeft = (DeviceMaxX - ScreenWidth * ZoomFactor) / 2; + } + else { + /* Device is too small to hold all the image X axis: */ + switch (Why) { + case SET_POSITION_RESET: + *ScreenLeft = 0; + break; + case SET_POSITION_ZOOM_U: + *ScreenLeft += DeviceMaxX / (2 * ZoomFactor); + break; + case SET_POSITION_ZOOM_D: + *ScreenLeft -= DeviceMaxX / (4 * ZoomFactor); + break; + case SET_POSITION_PAN: + if (MoveX != 0) *ScreenLeft += MoveX; + break; + } + if (*ScreenLeft < 0) *ScreenLeft = 0; + if ((ScreenWidth - *ScreenLeft) * ZoomFactor < DeviceMaxX + 1) + *ScreenLeft = (ScreenWidth * ZoomFactor - + DeviceMaxX + 1) / ZoomFactor; + *DeviceLeft = 0; + } + + /* Figure out position of GIF file in real device Y axis: */ + if (ScreenHeight * ZoomFactor <= DeviceMaxY + 1) { + /* Device is big enough to hold all the image Y axis: */ + *ScreenTop = 0; + *DeviceTop = (DeviceMaxY - ScreenHeight * ZoomFactor) / 2; + } + else { + /* Device is too small to hold all the image Y axis: */ + switch (Why) { + case SET_POSITION_RESET: + *ScreenTop = 0; + break; + case SET_POSITION_ZOOM_U: + *ScreenTop += DeviceMaxY / (2 * ZoomFactor); + break; + case SET_POSITION_ZOOM_D: + *ScreenTop -= DeviceMaxY / (4 * ZoomFactor); + break; + case SET_POSITION_PAN: + if (MoveY != 0) *ScreenTop += MoveY; + break; + } + if (*ScreenTop < 0) *ScreenTop = 0; + if ((ScreenHeight - *ScreenTop) * ZoomFactor < DeviceMaxY + 1) + *ScreenTop = (ScreenHeight * ZoomFactor - + DeviceMaxY - 1) / ZoomFactor; + *DeviceTop = 0; + } + + /* Make sure the position is on Byte boundary (8 pixels per byte): */ + *DeviceLeft &= 0xfff8; +} + +/****************************************************************************** +* The real drawing of the image is performed here. Few things are taken into * +* account: * +* 1. The zoom factor. If > 1 each pixel is multiplied this amount vertically * +* and horizontally. * +* The image is drawn from ScreenBuffer ScreenTop/Left in the bottom/right * +* directions, onto the Device DeviceTop/Left in the bottom/right direction * +* Pressing space during drawing will abort this routine. * +******************************************************************************/ +static void DrawScreen(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int DeviceLeft, int DeviceTop) +{ + int i, j, k, l, CountZoomJ, CountZoomI, + DeviceWidth, DeviceRight, ScreenBottom; + unsigned char *ImageBuffer, *p; + GifPixelType *Line; + + /* Make sure we start from scratch. Note cleardevice() uses color 0 even */ + /* if it may be non black. */ + cleardevice(); + + if (getmaxcolor() + 1 == 256) { + /* Optimize this case - one byte per pixel. */ + DeviceWidth = ScreenWidth * ZoomFactor; + if (DeviceWidth + DeviceLeft > DeviceMaxX) + DeviceWidth = DeviceMaxX - DeviceLeft; + DeviceRight = DeviceLeft + DeviceWidth - 1; + ScreenBottom = ScreenTop + ScreenHeight - 1; + + if ((ImageBuffer = malloc(imagesize(DeviceLeft, DeviceTop, + DeviceRight, DeviceTop))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + getimage(DeviceLeft, DeviceTop, DeviceRight, DeviceTop, ImageBuffer); + + for (k = DeviceTop; k < DeviceMaxY && ScreenTop <= ScreenBottom;) { + Line = ScreenBuffer[ScreenTop++]; + p = ImageBuffer + 4; /* point on first pixel in bitmap. */ + if (ZoomFactor == 1) + memcpy(p, &Line[ScreenLeft], DeviceWidth); + else { + for (i = 0, j = ScreenLeft, CountZoomI = ZoomFactor; + i < DeviceWidth; + i++) { + *p++ = Line[j]; + if (--CountZoomI == 0) { + CountZoomI = ZoomFactor; + j++; + } + } + } + + /* Abort drawing if space bar was pressed: */ + if (MyKbHit() && GetKey() == ' ') break; + + for (i = 0; i < ZoomFactor; i++) + putimage(DeviceLeft, k++, ImageBuffer, COPY_PUT); + } + + free((char *) ImageBuffer); + } + else { + for (CountZoomJ = ZoomFactor, j = ScreenTop, l = DeviceTop; + j < ScreenHeight && l <= DeviceMaxY; l++) { + Line = ScreenBuffer[j]; + + /* Abort drawing if space bar was pressed: */ + if (MyKbHit() && GetKey() == ' ') break; + + for (CountZoomI = ZoomFactor, i = ScreenLeft, k = DeviceLeft; + i < ScreenWidth && k <= DeviceMaxX;) { + putpixel(k++, l, Line[i]); + + if (!--CountZoomI) { + /* Go to next column: */ + i++; + CountZoomI = ZoomFactor; + } + } + + if (!--CountZoomJ) { + /* Go to next row: */ + j++; + CountZoomJ = ZoomFactor; + } + } + } +} + +/****************************************************************************** +* Walks along the current image, while printing pixel value and position. * +* 4 arrows may be used, and any other key will abort this operation * +******************************************************************************/ +static void DoCursorMode(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int DeviceLeft, int DeviceTop) +{ + int GetK, DeviceRight, DeviceBottom, x, y, Step; + GifPixelType Pixel; + char s[80]; + + DeviceRight = DeviceLeft + (ScreenWidth - ScreenLeft) * ZoomFactor; + if (DeviceRight > DeviceMaxX) DeviceRight = DeviceMaxX; + + DeviceBottom = DeviceTop + (ScreenHeight - ScreenTop) * ZoomFactor; + if (DeviceBottom > DeviceMaxY) DeviceBottom = DeviceMaxY; + + x = (DeviceLeft + DeviceRight) / 2; + y = (DeviceTop + DeviceBottom) / 2; + + setwritemode(XOR_PUT); + + while (TRUE) { + Pixel = ScreenBuffer[ScreenTop + (y - DeviceTop) / ZoomFactor] + [ScreenLeft + (x - DeviceLeft) / ZoomFactor]; + sprintf(s, "Color = %3d [%3d, %3d, %3d], X = %3d, Y = %3d", + Pixel, + ColorMap[Pixel].Red, + ColorMap[Pixel].Green, + ColorMap[Pixel].Blue, + (x - DeviceLeft) / ZoomFactor, + (y - DeviceTop) / ZoomFactor); + + setfillstyle(SOLID_FILL, BackGround); + bar(0, 0, textwidth(s) + 2, textheight(s) + 2); + + setcolor(ForeGround); + outtextxy(1, 1, s); + + line(0, y, DeviceMaxX, y); + line(x, 0, x, DeviceMaxY); + GetK = GetKey(); + line(0, y, DeviceMaxX, y); + line(x, 0, x, DeviceMaxY); + + Step = 10; + switch (GetK) { + case '1': + GetK = KEY_END; + break; + case '2': + GetK = KEY_DOWN; + break; + case '3': + GetK = KEY_PGDN; + break; + case '4': + GetK = KEY_LEFT; + break; + case '6': + GetK = KEY_RIGHT; + break; + case '7': + GetK = KEY_HOME; + break; + case '8': + GetK = KEY_UP; + break; + case '9': + GetK = KEY_PGUP; + break; + default: + Step = 1; + } + + switch (GetK) { + case KEY_LEFT: + x -= Step; + break; + case KEY_RIGHT: + x += Step; + break; + case KEY_UP: + y -= Step; + break; + case KEY_DOWN: + y += Step; + break; + case KEY_PGUP: + y -= Step; + x += Step; + break; + case KEY_PGDN: + y += Step; + x += Step; + break; + case KEY_HOME: + y -= Step; + x -= Step; + break; + case KEY_END: + y += Step; + x -= Step; + break; + default: + setwritemode(COPY_PUT); + return; + } + if (x < DeviceLeft) x = DeviceLeft; + if (x >= DeviceRight) x = DeviceRight; + if (y < DeviceTop) y = DeviceTop; + if (y >= DeviceBottom) y = DeviceBottom; + } +} + +/****************************************************************************** +* Return non zero value if at list one character exists in keyboard queue. * +* This routine emulates kbhit() which do uses stdin and useless for us. * +******************************************************************************/ +static int MyKbHit(void) +{ + return bioskey(1); +} + +/****************************************************************************** +* Get a key from keyboard directly (bypass stdin as we might redirect it). * +* This routine emulates getch() which do uses stdin and useless for us. * +******************************************************************************/ +static int MyGetCh(void) +{ + static int Extended = 0; + int c; + + if (Extended) { + c = Extended; + Extended = 0; + return c; + } + else { + c = bioskey(0); + if (c & 0x0ff) + return c; + else { + Extended = c >> 8; + return 0; + } + } +} + +/****************************************************************************** +* Get a key from keyboard, and translating operational keys into special * +* codes (>255). Lower case characters are upercased. * +******************************************************************************/ +static int GetKey(void) +{ + char c; + + while (TRUE) switch (c = MyGetCh()) { + case 0: /* Extended code - get the next extended char. */ + switch (MyGetCh()) { + case 75: return KEY_LEFT; + case 77: return KEY_RIGHT; + case 72: return KEY_UP; + case 80: return KEY_DOWN; + case 71: return KEY_HOME; + case 79: return KEY_END; + case 73: return KEY_PGUP; + case 81: return KEY_PGDN; + case 83: return KEY_DELETE; + case 82: return KEY_INSERT; + } + break; + case 8: + return KEY_BSPACE; + case 10: + case 13: + return KEY_RETURN; + case 27: + return KEY_ESC; + default: + if (isprint(c)) { + if (islower(c)) + return toupper(c); + else + return c; + } + else { + Tone(800, 100); + Tone(300, 200); + } + } +} + +/****************************************************************************** +* Routine to make some sound with given Frequency, Time milliseconds: * +******************************************************************************/ +static void Tone(int Frequency, int Time) +{ + if (BeepsDisabled) return; + + sound(Frequency); + delay(Time); + nosound(); +} diff --git a/G/UTIL/GIF2EPSN.C b/G/UTIL/GIF2EPSN.C new file mode 100644 index 0000000..38b35a4 --- /dev/null +++ b/G/UTIL/GIF2EPSN.C @@ -0,0 +1,590 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to dump GIF file into EPSON type printers * +* Options: * +* -q : quite printing mode. * +* -d factor : use dithering of matrix of size factor by factor. * +* -t level : set the threshold level of white in the result (0..100). * +* -m mapping : methods for mapping the 24bits colors into 1 BW bit. * +* -p printer : specify printer to print to (lpt1: by default). * +* -n : nice mode : uses double density to achieve better quality. * +* -i : invert the image. * +* -h : on line help. * +****************************************************************************** +* History: * +* 15 Jul 89 - Version 1.0 by Gershon Elber. * +* 22 Dec 89 - Fix problems with const strings been modified (Version 1.1). * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2Epsn" + +#define C2BW_BACK_GROUND 0 /*Methods to map 24bits Colors to 1 BW bit.*/ +#define C2BW_GREY_LEVELS 1 +#define C2BW_DITHER 2 +#define C2BW_NUM_METHODS 3 /* Always hold # of methods. */ + +#define DEFAULT_THRESHOLD 5000 /* Color -> BW threshold level. */ + +#define DITHER_MIN_MATRIX 2 +#define DITHER_MAX_MATRIX 4 + +/* The epson specific are defined here: */ +#define EPSON_WIDTH 80 /* 80 char per line. */ +#define EPSON_PIXEL_2_CHAR 8 /* 8 pixels per char, in REG_DENSITY. */ + +#define EPSON_ESC "\033" /* Actually regular escape char. */ +#define EPSON_RESET "\033@" /* Reset the printer. */ +#define EPSON_VERTICAL_SPACE "\033A\010" /* 8/72 inch vertically. */ +#define EPSON_REG_DENSITY "\033K" /* 640 pixels per 7.5" (line). */ +#define EPSON_DUAL_DENSITY "\033L" /* 1280 pixels per 7.5" (line). */ + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2Epsn q%- d%-DitherSize!d t%-BWThreshold!d m%-Mapping!d i%- n%- p%-PrinterName!s h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- d%-DitherSize!d t%-BWThreshold!d m%-Mapping!d i%- n%- p%-PrinterName!s h%- GifFile!*s"; +#endif /* SYSV */ + +static char + *PrinterName = NULL; +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + DitherSize = 2, DitherFlag = FALSE, + BWThresholdFlag = FALSE, Threshold, + BWThreshold = DEFAULT_THRESHOLD, /* Color -> BW mapping threshold. */ + Mapping, MappingFlag = FALSE, + InvertFlag = FALSE, + NiceFlag = FALSE, + PrinterFlag = FALSE, + HelpFlag = FALSE, + ColorToBWMapping = C2BW_BACK_GROUND, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + +static void EvalDitheredScanline(GifRowType *ScreenBuffer, int Row, + int RowSize, GifRowType *DitherBuffer); +static void DumpScreen2Epsn(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); +static void PutString(FILE *Prt, int DirectPrint, char *Str, int Len); +static void PutString2(FILE *Prt, int DirectPrint, char *Str, int Len); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &DitherFlag, &DitherSize, + &BWThresholdFlag, &Threshold, + &MappingFlag, &Mapping, &InvertFlag, + &NiceFlag, &PrinterFlag, &PrinterName, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (!PrinterFlag) PrinterName = ""; + + if (DitherFlag) { + /* Make sure we are o.k.: */ + if (DitherSize > DITHER_MAX_MATRIX) DitherSize = DITHER_MAX_MATRIX; + if (DitherSize < DITHER_MIN_MATRIX) DitherSize = DITHER_MAX_MATRIX; + } + + /* As Threshold is in [0..100] range and BWThreshold is [0..25500]: */ + if (BWThresholdFlag) { + if (Threshold > 100 || Threshold < 0) + GIF_EXIT("Threshold not in 0..100 percent."); + BWThreshold = Threshold * 255; + if (BWThreshold == 0) BWThreshold = 1; /* Overcome divide by zero! */ + } + + /* No message is emitted, but mapping method is clipped to exists method.*/ + if (MappingFlag) ColorToBWMapping = Mapping % C2BW_NUM_METHODS; + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, andset their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted.\n"); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + DumpScreen2Epsn(ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/***************************************************************************** +* Routine to evaluate dithered scanlines out of given ones, using Size * +* dithering matrix, starting from Row. The given scanlines are NOT modified. * +*****************************************************************************/ +static void EvalDitheredScanline(GifRowType *ScreenBuffer, int Row, + int RowSize, GifRowType *DitherBuffer) +{ + static char Dither2[2][2] = { /* See Foley & Van Dam pp. 597-601. */ + { 1, 3 }, + { 4, 2 } + }; + static char Dither3[3][3] = { + { 7, 9, 5 }, + { 2, 1, 4 }, + { 6, 3, 8 } + }; + static char Dither4[4][4] = { + { 1, 9, 3, 11 }, + { 13, 5, 15, 7 }, + { 4, 12, 2, 10 }, + { 16, 8, 14, 6 } + }; + int i, j, k, Level; + long Intensity; + GifColorType *ColorMapEntry; + + /* Scan the Rows (Size rows) evaluate intensity every Size pixel and use */ + /* the dither matrix to set the dithered result; */ + for (i = 0; i <= RowSize - DitherSize; i += DitherSize) { + Intensity = 0; + for (j = Row; j < Row + DitherSize; j++) + for (k = 0; k < DitherSize; k++) { + ColorMapEntry = &ColorMap[ScreenBuffer[j][i+k]]; + Intensity += 30 * ((int) ColorMapEntry->Red) + + 59 * ((int) ColorMapEntry->Green) + + 11 * ((int) ColorMapEntry->Blue); + } + + /* Find the intensity level (between 0 and Size^2) of our matrix: */ + /* Expression is "Intensity * BWThreshold / (25500 * DefThresh)" */ + /* but to prevent from overflow in the long evaluation we do this: */ + Level = ((Intensity / 2550) * ((long) DEFAULT_THRESHOLD) / + (((long) BWThreshold) * 10)); + switch (DitherSize) { + case 2: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither2[j][k] <= Level; + break; + case 3: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither3[j][k] <= Level; + break; + case 4: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither4[j][k] <= Level; + break; + } + } +} + +/****************************************************************************** +* The real dumping routine. Few things are taken into account: * +* 1. The Nice flag. If TRUE each pixel is printed twice in double density. * +* 2. The Invert flag. If TRUE each pixel before drawn is inverted. * +* 3. The rendering mode and dither matrix flag if dithering is selected. * +* The image is drawn from ScreenBuffer ScreenTop/Left in the bottom/right * +* directions. * +* Unfortunatelly, there is a BUG in DOS that does not handle ctrl-Z * +* correctly if we open lptx: device in binary mode (should treat it as any * +* other char). Therefore I had to write to it directly using biosprint. I * +* dont like it either, and if you have better way to do it, let me know. * +******************************************************************************/ +static void DumpScreen2Epsn(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + int i, j, p, Size, LeftCWidth, Len, DirectPrint = 0, + DitheredLinesLeft = 0, DitheredLinesCount = 0, MapInvert[2]; + char LinePrefixLen[2]; /* Length of scan line. */ + GifByteType *EpsonBuffer; + GifPixelType *Line; + GifRowType *DitherBuffer; + GifColorType *ColorMapEntry; + FILE *Prt = NULL; + +#ifdef __MSDOS__ + for (i = 0; i < strlen(PrinterName); i++) + if (islower(PrinterName[i])) + PrinterName[i] = toupper(PrinterName[i]); + + if (strcmp(PrinterName, "LPT1") == 0 || + strcmp(PrinterName, "PRN") == 0) + DirectPrint = 1; + else if (strcmp(PrinterName, "LPT2") == 0) + DirectPrint = 2; + else if (strcmp(PrinterName, "LPT3") == 0) + DirectPrint = 3; +#endif /* __MSDOS__ */ + + if (!DirectPrint) { +#ifdef __MSDOS__ + if (strlen(PrinterName) == 0) { + setmode(1, O_BINARY); /* Make sure it is in binary mode. */ + Prt = stdout; + } + else if ((Prt = fopen(PrinterName, "wb")) == NULL || + setvbuf(Prt, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE)) +#else + if (strlen(PrinterName) == 0) + Prt = stdout; + else if ((Prt = fopen(PrinterName, "w")) == NULL) +#endif /* __MSDOS__ */ + GIF_EXIT("Failed to open output (printer) file."); + } + + if ((EpsonBuffer = (GifByteType *) malloc(ScreenWidth)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + /* Allocate the buffer to save the dithered information. */ + if (ColorToBWMapping == C2BW_DITHER) { + if ((DitherBuffer = (GifRowType *) + malloc(DITHER_MAX_MATRIX * sizeof(GifRowType *))) != NULL) { + Size = ScreenWidth * sizeof(GifPixelType); /* Size of one row. */ + for (i = 0; i < DITHER_MAX_MATRIX; i++) { + if ((DitherBuffer[i] = (GifRowType) malloc(Size)) == NULL) { + DitherBuffer = NULL; + break; + } + } + } + if (DitherBuffer == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + } + else + DitherBuffer = NULL; + + /* Reset the printer, and make sure no space between adjacent lines: */ + PutString(Prt, DirectPrint, EPSON_RESET, 2); + PutString(Prt, DirectPrint, EPSON_VERTICAL_SPACE, 3); + + /* Prepar left spacing to begin with, so image will be in the middle. */ + LeftCWidth = (EPSON_WIDTH - (ScreenWidth / EPSON_PIXEL_2_CHAR)) / 2; + + if (InvertFlag) { /* Make the inversion as fast a possible. */ + MapInvert[0] = 1; + MapInvert[1] = 0; + } + else { + MapInvert[0] = 0; + MapInvert[1] = 1; + } + + for (i = 0, p = 0; i < ScreenHeight; i++, p++) { + GifQprintf("\b\b\b\b%-4d", ScreenHeight - i); + Line = ScreenBuffer[i]; + + /* If 8 lines were accumulated in printer buffer - dump them out. */ + if (p == 8) { + for (Len = ScreenWidth-1; Len >= 0; Len--) + if (EpsonBuffer[Len]) break; + + /* Only in case this line is not empty: */ + if (Len++ >= 0) { + /* Make the left space, so image will be centered: */ + for (j = 0; j < LeftCWidth; j++) + PutString(Prt, DirectPrint, " ", 1); + + /* Full printer line is ready to be dumped - send it out: */ + if (NiceFlag) { + PutString(Prt, DirectPrint, EPSON_DUAL_DENSITY, 2); + LinePrefixLen[0] = (Len * 2) % 256; + LinePrefixLen[1] = (Len * 2) / 256; + PutString(Prt, DirectPrint, LinePrefixLen, 2); + PutString2(Prt, DirectPrint, (char *) EpsonBuffer, Len); + } + else { + PutString(Prt, DirectPrint, EPSON_REG_DENSITY, 2); + LinePrefixLen[0] = Len % 256; + LinePrefixLen[1] = Len / 256; + PutString(Prt, DirectPrint, LinePrefixLen, 2); + PutString(Prt, DirectPrint, (char *) EpsonBuffer, Len); + } + } + PutString(Prt, DirectPrint, "\015\012", 2); + p = 0; + } + + /* We decide right here what method to map Colors to BW so the inner */ + /* loop will be independent of it (and therefore faster): */ + switch(ColorToBWMapping) { + case C2BW_BACK_GROUND: + for (j = 0; j < ScreenWidth; j++) + EpsonBuffer[j] = (EpsonBuffer[j] << 1) + + MapInvert[Line[j] != BackGround]; + break; + case C2BW_GREY_LEVELS: + for (j = 0; j < ScreenWidth; j++) { + ColorMapEntry = &ColorMap[Line[j]]; + /* For the transformation from RGB to BW, see Folley & */ + /* Van Dam pp 613: The Y channel is the BW we need: */ + /* As colors are 255 maximum, the result can be up to */ + /* 25500 which is still in range of our 16 bits integers */ + EpsonBuffer[j] = (EpsonBuffer[j] << 1) + + MapInvert[(30 * (int) ColorMapEntry->Red) + + 59 * ((int) ColorMapEntry->Green) + + 11 * ((int) ColorMapEntry->Blue) > + BWThreshold]; + } + break; + case C2BW_DITHER: + if (DitheredLinesLeft-- == 0) { + EvalDitheredScanline(ScreenBuffer, + (i < ScreenHeight - DitherSize ? i : + ScreenHeight - DitherSize), + ScreenWidth, DitherBuffer); + DitheredLinesLeft = DitherSize - 1; + DitheredLinesCount = 0; + } + Line = DitherBuffer[DitheredLinesCount++]; + for (j = 0; j < ScreenWidth; j++) + EpsonBuffer[j] = (EpsonBuffer[j] << 1) + + MapInvert[Line[j]]; + break; + } + } + + /* If buffer in incomplete - complete it and dump it out: */ + if (p != 0) { + for (Len = ScreenWidth - 1; Len >= 0; Len--) + if (EpsonBuffer[Len]) break; + if (Len++ >= 0) { + i = 8 - p; /* Amount to shift. */ + for (j = 0; j < ScreenWidth; j++) EpsonBuffer[j] <<= i; + + /* Make the left space, so image will be centered: */ + for (j = 0; j < LeftCWidth; j++) + PutString(Prt, DirectPrint, " ", 1); + + if (NiceFlag) { + PutString(Prt, DirectPrint, EPSON_DUAL_DENSITY, 2); + LinePrefixLen[0] = (Len * 2) % 256; + LinePrefixLen[1] = (Len * 2) / 256; + PutString(Prt, DirectPrint, LinePrefixLen, 2); + PutString2(Prt, DirectPrint, (char *) EpsonBuffer, Len); + } + else { + PutString(Prt, DirectPrint, EPSON_REG_DENSITY, 2); + LinePrefixLen[0] = Len % 256; + LinePrefixLen[1] = Len / 256; + PutString(Prt, DirectPrint, LinePrefixLen, 2); + PutString(Prt, DirectPrint, (char *) EpsonBuffer, Len); + } + } + PutString(Prt, DirectPrint, "\015\012", 2); + } + + fclose(Prt); +} + +/****************************************************************************** +* Dumps the string of given length, to Prt. No char in Str has special * +* meaning, and even zero (NULL) chars are dumped. * +* If however DirectPrint is non zero, string is dumped to specifed lpt port. * +******************************************************************************/ +static void PutString(FILE *Prt, int DirectPrint, char *Str, int Len) +{ + int i; + + if (DirectPrint) { +#ifdef __MSDOS__ + for (i = 0; i < Len; i++) biosprint(0, Str[i], DirectPrint - 1); +#else + GIF_EXIT("Can not print directly to a printer if not MSDOS."); +#endif /* __MSDOS__ */ + } + else + for (i = 0; i < Len; i++) fputc(Str[i], Prt); +} + +/****************************************************************************** +* Dumps the string of given length, to Prt. No char in Str has special * +* meaning, and even zero (NULL) chars are dumped. Every char is dumped twice. * +* If however DirectPrint is non zero, string is dumped to specifed lpt port. * +******************************************************************************/ +static void PutString2(FILE *Prt, int DirectPrint, char *Str, int Len) +{ + int i; + + if (DirectPrint) { +#ifdef __MSDOS__ + for (i = 0; i < Len; i++) { + biosprint(0, Str[i], DirectPrint - 1); + biosprint(0, Str[i], DirectPrint - 1); + } +#else + GIF_EXIT("Can not print directly to a printer if not MSDOS."); +#endif /* __MSDOS__ */ + } + else + for (i = 0; i < Len; i++) { + fputc(Str[i], Prt); + fputc(Str[i], Prt); + } +} diff --git a/G/UTIL/GIF2HERC.C b/G/UTIL/GIF2HERC.C new file mode 100644 index 0000000..46d04e2 --- /dev/null +++ b/G/UTIL/GIF2HERC.C @@ -0,0 +1,1108 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to display GIF file on hercules device * +* Options: * +* -q : quite printing mode. * +* -z factor : zoom the pixels by the given factor. * +* -t level : set the threshold level of white in the result (0..100). * +* -m mapping : methods for mapping the 24bits colors into 1 BW bit. * +* -i : invert the image. * +* -b : beeps disabled. * +* -h : on line help. * +* * +* This program uses TC2.0 hercules graphic driver. * +* In this file Screen refers to GIF file screen, while Device to Hercules. * +****************************************************************************** +* History: * +* 1 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2Herc" + +#define KEY_LEFT 256 /* Key Codes returned for operational keys */ +#define KEY_RIGHT 257 /* as return by the GetKey routine. */ +#define KEY_UP 258 +#define KEY_DOWN 259 +#define KEY_RETURN 260 +#define KEY_DELETE 261 +#define KEY_INSERT 262 +#define KEY_BSPACE 263 +#define KEY_ESC 264 +#define KEY_HOME 265 +#define KEY_END 266 +#define KEY_PGUP 267 +#define KEY_PGDN 268 + +#define C2BW_BACK_GROUND 0 /*Methods to map 24bits Colors to 1 BW bit.*/ +#define C2BW_GREY_LEVELS 1 +#define C2BW_DITHER 2 +#define C2BW_NUM_METHODS 3 /* Always hold # of methods. */ + +#define DEFAULT_THRESHOLD 5000 /* Color -> BW threshold level. */ +#define INCREMENT_THRESHOLD 1000 + +#define DITHER_MIN_MATRIX 2 +#define DITHER_MAX_MATRIX 4 + +#define NORMAL_ATTR 0x07 /* Text attributes. */ +#define INVERSE_ATTR 0x70 +#define BLINK_ATTR 0x90 + +#define SET_POSITION_RESET 0 /* Situations need positionings: */ +#define SET_POSITION_ZOOM_U 1 +#define SET_POSITION_ZOOM_D 2 +#define SET_POSITION_PAN 3 + +#define DEVICE_BASE 0xb000 /* Hercules frame buffer base. */ +#define DEVICE_PAGE0 0xb000 +#define DEVICE_PAGE1 0xb800 +#define HERC_MAX_X 719 +#define HERC_MAX_Y 347 + +#define CURSOR_TEXT_X 120 + +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ + +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- d%-DitherSize!d z%-ZoomFactor!d t%-BWThreshold!d m%-Mapping!d i%- b%- h%- GifFile!*s"; +static char + *GifFileName; +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + BeepsDisabled = FALSE, + DitherSize = 2, DitherFlag = FALSE, + ZoomFactor = 1, ZoomFlag = FALSE, + BWThresholdFlag = FALSE, Threshold, + BWThreshold = DEFAULT_THRESHOLD, /* Color -> BW mapping threshold. */ + Mapping, MappingFlag = FALSE, + InvertFlag = FALSE, + HelpFlag = FALSE, + ColorToBWMapping = C2BW_BACK_GROUND, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + + +static void DisplayScreen(GifRowType *ScreenBuffer, GifFileType *GifFile); +static void PrintSettingStatus(GifFileType *GifFile, GifRowType *DitherBuffer); +static void CPrintStr(char *Str, int y, int attr); +static void SetPositon(int Why, + int ScreenWidth, int ScreenHeight, + int DeviceMaxX, int DeviceMaxY, + int *ScreenLeft, int *ScreenTop, + int *DeviceLeft, int *DeviceTop, + int MoveX, int MoveY); +static void ClearGraphDevice(void); +static void OpenGraphDevice(void); +static void CloseGraphDevice(void); +static void EvalDitheredScanline(GifRowType *ScreenBuffer, int Row, + int RowSize, GifRowType *DitherBuffer); +static void DrawScreen(GifRowType *ScreenBuffer, GifRowType *DitherBuffer, + int DeviceTop, int DeviceLeft, int DeviceMaxX, int DeviceMaxY, + int ScreenTop, int ScreenLeft, int ScreenWidth, int ScreenHeight); +static void DoCursorMode(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int ScreenWidth, int ScreenHeight, + int DeviceLeft, int DeviceTop); +static int MyKbHit(void); +static int MyGetCh(void); +static int GetKey(void); +static void Tone(int Frequency, int Time); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &DitherFlag, &DitherSize, + &ZoomFlag, &ZoomFactor, &BWThresholdFlag, + &Threshold, &MappingFlag, &Mapping, &InvertFlag, + &BeepsDisabled, &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (DitherFlag) { + /* Make sure we are o.k.: */ + if (DitherSize > DITHER_MAX_MATRIX) DitherSize = DITHER_MAX_MATRIX; + if (DitherSize < DITHER_MIN_MATRIX) DitherSize = DITHER_MAX_MATRIX; + } + + /* As Threshold is in [0..100] range and BWThreshold is [0..25500]: */ + if (BWThresholdFlag) { + if (Threshold > 100 || Threshold < 0) + GIF_EXIT("Threshold not in 0..100 percent."); + BWThreshold = Threshold * 255; + if (BWThreshold == 0) BWThreshold = 1; /* Overcome divide by zero! */ + } + + /* No message is emitted, but mapping method is clipped to exists method.*/ + if (MappingFlag) ColorToBWMapping = Mapping % C2BW_NUM_METHODS; + + if (NumFiles == 1) { + GifFileName = *FileName; + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + GifFileName = "Stdin"; + setmode(0, O_BINARY); + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, andset their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + Tone(500, 10); + DisplayScreen(ScreenBuffer, GifFile); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/****************************************************************************** +* Given the screen buffer, display it: * +* The following commands are available (case insensitive). * +* 1. Four arrow to move along the screen (only if ScreenBuffer > physical * +* screen in that direction. * +* 2. C - goto cursor mode - print current color & position in GIF screen * +* of the current pixel cursor is on. * +* 3. D - zoom out by factor of 2. * +* 4. H - halftoning dithering matrix resize. * +* 5. I - invert the image. * +* 6. M - toggles method of Color -> BW mapping. * +* 7. R - redraw current image. * +* 8. S - Print Current status/options. * +* 9. U - zoom in by factor of 2. * +* 10. ' ' - stop drawing current image. * +* 11. ESC - to quit. * +******************************************************************************/ +static void DisplayScreen(GifRowType *ScreenBuffer, GifFileType *GifFile) +{ + int i, j, Size, + DeviceTop, DeviceLeft, /* Where ScreenBuffer is to mapped to ours. */ + ScreenTop, ScreenLeft, /* Porsion of ScreenBuffer to start display. */ + DeviceMaxX, DeviceMaxY, /* Physical device dimensions. */ + XPanning, YPanning, /* Amount to move using the arrows. */ + GetK, DrawIt = TRUE; + GifRowType *DitherBuffer; /* Used to save dithered pixel scanned. */ + + OpenGraphDevice(); + DeviceMaxX = HERC_MAX_X; /* Read size of physical screen. */ + DeviceMaxY = HERC_MAX_Y; + + XPanning = DeviceMaxX / 2; + YPanning = DeviceMaxY / 2; + + SetPositon(SET_POSITION_RESET, GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + + /* Allocate the buffer to save the dithered information. If fails to */ + /* allocate, set it to NULL, and no dithering will take place. */ + if ((DitherBuffer = (GifRowType *) + malloc(DITHER_MAX_MATRIX * sizeof(GifRowType *))) != NULL) { + Size = GifFile -> SWidth * sizeof(GifPixelType); /* Size of one row. */ + for (i = 0; i < DITHER_MAX_MATRIX; i++) { + if ((DitherBuffer[i] = (GifRowType) malloc(Size)) == NULL) { + for (j = 0; j < i; j++) free((char *) DitherBuffer[i]); + free((char *) DitherBuffer); + DitherBuffer = NULL; + break; + } + } + } + if (DitherBuffer == NULL) { + Tone(300, 100); + Tone(100, 300); + } + + do { + if (DrawIt && !MyKbHit()) { + DrawScreen(ScreenBuffer, DitherBuffer, + DeviceTop, DeviceLeft, DeviceMaxX, DeviceMaxY, + ScreenTop, ScreenLeft, GifFile -> SWidth, GifFile -> SHeight); + Tone(2000, 200); + } + DrawIt = TRUE; + switch (GetK = GetKey()) { + case 'C': + DoCursorMode(ScreenBuffer, ScreenLeft, ScreenTop, + GifFile -> SWidth, GifFile -> SHeight, + DeviceLeft, DeviceTop); + DrawIt = FALSE; + break; + case 'D': + if (ZoomFactor > 1) { + ZoomFactor >>= 1; + SetPositon(SET_POSITION_ZOOM_D, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + } + else { + Tone(1000, 100); + DrawIt = FALSE; + } + break; + case 'H': + if (++DitherSize > DITHER_MAX_MATRIX) + DitherSize = DITHER_MIN_MATRIX; + break; + case 'I': + InvertFlag = !InvertFlag; + break; + case 'M': + ColorToBWMapping = (ColorToBWMapping + 1) % C2BW_NUM_METHODS; + + break; + case 'R': + break; + case 'S': + PrintSettingStatus(GifFile, DitherBuffer); + break; + case 'U': + if (ZoomFactor < 256) { + ZoomFactor <<= 1; + SetPositon(SET_POSITION_ZOOM_U, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, 0); + } + else { + Tone(1000, 100); + DrawIt = FALSE; + } + break; + case KEY_ESC: + break; + case KEY_LEFT: + SetPositon(SET_POSITION_PAN, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + -XPanning, 0); + break; + case KEY_RIGHT: + SetPositon(SET_POSITION_PAN, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + XPanning, 0); + break; + case KEY_UP: + SetPositon(SET_POSITION_PAN, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, -YPanning); + break; + case KEY_DOWN: + SetPositon(SET_POSITION_PAN, + GifFile -> SWidth, GifFile -> SHeight, + DeviceMaxX, DeviceMaxY, + &ScreenLeft, &ScreenTop, + &DeviceLeft, &DeviceTop, + 0, YPanning); + break; + case KEY_DELETE: + BWThreshold += INCREMENT_THRESHOLD; + if (BWThreshold == 0) BWThreshold = 1; + break; + case KEY_INSERT: + BWThreshold -= INCREMENT_THRESHOLD; + if (BWThreshold == 0) BWThreshold = 1; + break; + default: + DrawIt = FALSE; + Tone(800, 100); + Tone(300, 200); + break; + } + } + while (GetK != KEY_ESC); + + CloseGraphDevice(); +} + +/****************************************************************************** +* Routine to print (in text mode), current program status. * +******************************************************************************/ +static void PrintSettingStatus(GifFileType *GifFile, GifRowType *DitherBuffer) +{ + char s[80]; + + CloseGraphDevice(); + + CPrintStr(PROGRAM_NAME, 1, INVERSE_ATTR); + + sprintf(s, "GIF File - %s", GifFileName); + CPrintStr(s, 3, NORMAL_ATTR); + + sprintf(s, "Gif Screen Size = [%d, %d]. Contains %d image(s).", + GifFile -> SWidth, GifFile -> SHeight, ImageNum); + CPrintStr(s, 5, NORMAL_ATTR); + + if (GifFile -> SColorMap) + sprintf(s, + "Has Screen Color map of %d bits. BackGround = [%d, %d, %d]", + GifFile -> SBitsPerPixel, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Red, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Green, + GifFile -> SColorMap[GifFile -> SBackGroundColor].Blue); + else + sprintf(s, "No Screen color map."); + CPrintStr(s, 7, NORMAL_ATTR); + + if (GifFile -> IColorMap) + sprintf(s, "Has Image map of %d bits (last image). Image is %s.", + GifFile -> IBitsPerPixel, + (GifFile -> IInterlace ? "interlaced" : "non interlaced")); + else + sprintf(s, "No Image color map."); + CPrintStr(s, 9, NORMAL_ATTR); + + sprintf(s, "Color to BW threshold level - %d%%.\n", BWThreshold / 255); + CPrintStr(s, 11, NORMAL_ATTR); + + CPrintStr("Color To BW mapping:", 15, NORMAL_ATTR); + switch(ColorToBWMapping) { + case C2BW_BACK_GROUND: + CPrintStr("Color != BackGround", 16, NORMAL_ATTR); + break; + case C2BW_GREY_LEVELS: + CPrintStr(".3 * R + .59 * G + .11 * B > threshold", 16, + NORMAL_ATTR); + break; + case C2BW_DITHER: + sprintf(s, ".3 * R + .59 * G + .11 * B dithered (Size = %d).", + DitherSize); + CPrintStr(s, 16, NORMAL_ATTR); + break; + } + + sprintf(s, "Dither Buffer %s (Size = %d), Zoom = %d.", + DitherBuffer ? "allocated succesfully" : "not allocated (failed)", + DitherSize, ZoomFactor); + + CPrintStr(s, 18, NORMAL_ATTR); + + CPrintStr("Press anything to continue:", 23, BLINK_ATTR); + MyGetCh(); + + OpenGraphDevice(); +} + +/****************************************************************************** +* Routine to cprintf given string centered at given Y level, and attr: * +******************************************************************************/ +static void CPrintStr(char *Str, int y, int attr) +{ + gotoxy(40 - (strlen(Str) + 1) / 2, y); + textattr(attr); + cputs(Str); +} + +/****************************************************************************** +* Routine to set the position of Screen in Device, and what porsion of the * +* screen should be visible: * +* MoveX, MoveY are the panning factors (if both zero - initialize). * +******************************************************************************/ +static void SetPositon(int Why, + int ScreenWidth, int ScreenHeight, + int DeviceMaxX, int DeviceMaxY, + int *ScreenLeft, int *ScreenTop, + int *DeviceLeft, int *DeviceTop, + int MoveX, int MoveY) +{ + + MoveX /= ZoomFactor; /* Make sure move same amount independent */ + MoveY /= ZoomFactor; /* of what ZoomFactor is. */ + + /* Figure out position of GIF file in real device X axis: */ + if (ScreenWidth * ZoomFactor <= DeviceMaxX + 1) { + /* Device is big enough to hold all the image X axis: */ + *ScreenLeft = 0; + *DeviceLeft = (DeviceMaxX - ScreenWidth * ZoomFactor) / 2; + } + else { + /* Device is too small to hold all the image X axis: */ + switch (Why) { + case SET_POSITION_RESET: + *ScreenLeft = 0; + break; + case SET_POSITION_ZOOM_U: + *ScreenLeft += DeviceMaxX / (2 * ZoomFactor); + break; + case SET_POSITION_ZOOM_D: + *ScreenLeft -= DeviceMaxX / (4 * ZoomFactor); + break; + case SET_POSITION_PAN: + if (MoveX != 0) *ScreenLeft += MoveX; + break; + } + if (*ScreenLeft < 0) *ScreenLeft = 0; + if ((ScreenWidth - *ScreenLeft) * ZoomFactor < DeviceMaxX + 1) + *ScreenLeft = (ScreenWidth * ZoomFactor - + DeviceMaxX + 1) / ZoomFactor; + *DeviceLeft = 0; + } + + /* Figure out position of GIF file in real device Y axis: */ + if (ScreenHeight * ZoomFactor <= DeviceMaxY + 1) { + /* Device is big enough to hold all the image Y axis: */ + *ScreenTop = 0; + *DeviceTop = (DeviceMaxY - ScreenHeight * ZoomFactor) / 2; + } + else { + /* Device is too small to hold all the image Y axis: */ + switch (Why) { + case SET_POSITION_RESET: + *ScreenTop = 0; + break; + case SET_POSITION_ZOOM_U: + *ScreenTop += DeviceMaxY / (2 * ZoomFactor); + break; + case SET_POSITION_ZOOM_D: + *ScreenTop -= DeviceMaxY / (4 * ZoomFactor); + break; + case SET_POSITION_PAN: + if (MoveY != 0) *ScreenTop += MoveY; + break; + } + if (*ScreenTop < 0) *ScreenTop = 0; + if ((ScreenHeight - *ScreenTop) * ZoomFactor < DeviceMaxY + 1) + *ScreenTop = (ScreenHeight * ZoomFactor - + DeviceMaxY - 1) / ZoomFactor; + *DeviceTop = 0; + } + + /* Make sure the position is on Byte boundary (8 pixels per byte): */ + *DeviceLeft &= 0xfff8; +} + +/****************************************************************************** +* Routine to clear graphic device: * +******************************************************************************/ +static void ClearGraphDevice(void) +{ + cleardevice(); +} + +/****************************************************************************** +* Routine to open graphic device: * +******************************************************************************/ +static void OpenGraphDevice(void) +{ + int GraphDriver = HERCMONO, GraphMode = HERCMONOHI; + + if (registerbgidriver(Herc_driver) < 0) + GIF_EXIT("Cannt register graphic device."); + + initgraph(&GraphDriver, &GraphMode, ""); + if (graphresult() != grOk) + GIF_EXIT("Graphics System Error (No Hercules!?)."); +} + +/***************************************************************************** +* Routine to close and shutdown graphic mode : * +*****************************************************************************/ +static void CloseGraphDevice(void) +{ + closegraph(); /* Return the system to text mode. */ +} + +/***************************************************************************** +* Routine to evaluate dithered scanlines out of given ones, using Size * +* dithering matrix, starting from Row. The given scanlines are NOT modified. * +*****************************************************************************/ +static void EvalDitheredScanline(GifRowType *ScreenBuffer, int Row, + int RowSize, GifRowType *DitherBuffer) +{ + static char Dither2[2][2] = { /* See Foley & Van Dam pp. 597-601. */ + { 1, 3 }, + { 4, 2 } + }; + static char Dither3[3][3] = { + { 7, 9, 5 }, + { 2, 1, 4 }, + { 6, 3, 8 } + }; + static char Dither4[4][4] = { + { 1, 9, 3, 11 }, + { 13, 5, 15, 7 }, + { 4, 12, 2, 10 }, + { 16, 8, 14, 6 } + }; + int i, j, k, Level; + long Intensity; + GifColorType *ColorMapEntry; + + /* Scan the Rows (Size rows) evaluate intensity every Size pixel and use */ + /* the dither matrix to set the dithered result; */ + for (i = 0; i <= RowSize - DitherSize; i += DitherSize) { + Intensity = 0; + for (j = Row; j < Row + DitherSize; j++) + for (k = 0; k < DitherSize; k++) { + ColorMapEntry = &ColorMap[ScreenBuffer[j][i+k]]; + Intensity += 30 * ((int) ColorMapEntry->Red) + + 59 * ((int) ColorMapEntry->Green) + + 11 * ((int) ColorMapEntry->Blue); + } + + /* Find the intensity level (between 0 and Size^2) of our matrix: */ + /* Expression is "Intensity * BWThreshold / (25500 * DefThresh)" */ + /* but to prevent from overflow in the long evaluation we do this:*/ + Level = ((Intensity / 2550) * ((long) DEFAULT_THRESHOLD) / + (((long) BWThreshold) * 10)); + switch (DitherSize) { + case 2: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither2[j][k] <= Level; + break; + case 3: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither3[j][k] <= Level; + break; + case 4: + for (j = 0; j < DitherSize; j++) + for (k = 0; k < DitherSize; k++) + DitherBuffer[j][i+k] = Dither4[j][k] <= Level; + break; + } + } +} + +/****************************************************************************** +* The real drawing of the image is performed here. Few things are taken into * +* account: * +* 1. The zoom factor. If > 1 each pixel is multiplied this amount vertically * +* and horizontally. * +* 2. The Invert flag. If TRUE each pixel before drawn is inverted. * +* 3. The rendering mode and dither matrix flag if dithering is selected. * +* The image is drawn from ScreenBuffer ScreenTop/Left in the bottom/right * +* directions, onto the Device DeviceTop/Left in the bottom/right direction * +* This routine was optimized for the hercules graphic card and should be * +* handled carfully as it is device dependent. * +* Pressing space during drawing will abort this routine. * +******************************************************************************/ +static void DrawScreen(GifRowType *ScreenBuffer, GifRowType *DitherBuffer, + int DeviceTop, int DeviceLeft, int DeviceMaxX, int DeviceMaxY, + int ScreenTop, int ScreenLeft, int ScreenWidth, int ScreenHeight) +{ + unsigned int Offset; + int i, j, k, l, m, CountZoomJ, CountZoomI, + DitheredLinesLeft = 0, DitheredLinesCount, MapInvert[2]; + GifByteType DeviceByte; + GifPixelType *Line; + GifColorType *ColorMapEntry; + + ClearGraphDevice(); /* Make sure we start from scratch. */ + + if (InvertFlag) { /* Make the inversion as fast a possible. */ + MapInvert[0] = 1; + MapInvert[1] = 0; + } + else { + MapInvert[0] = 0; + MapInvert[1] = 1; + } + + for (CountZoomJ = ZoomFactor, j = ScreenTop, l = DeviceTop, DeviceByte = 0; + j < ScreenHeight && l <= DeviceMaxY; l++) { + Line = ScreenBuffer[j]; + + /* We are going to access the hercules frame buffer directly: */ + Offset = 0x2000 * (l & 0x03) + (l >> 2) * 90 + (DeviceLeft >> 3); + + /* Abort drawing if space bar was pressed: */ + if (MyKbHit() && GetKey() == ' ') return; + + /* We decide right here what method to map Colors to BW so the inner */ + /* loop will be independent of it (and therefore faster): */ + switch(ColorToBWMapping) { + case C2BW_BACK_GROUND: + for (CountZoomI = ZoomFactor, i = ScreenLeft, k = DeviceLeft, m = 0; + i < ScreenWidth && k <= DeviceMaxX;) { + /* The following lines are equivalent to the putpixel */ + /* (and making it real machine dependent...) by almost */ + /* factor of 3: */ + /* putpixel(k++, l, MapInvert[ColorToBW(Line[i])]); */ + DeviceByte = (DeviceByte << 1) + + MapInvert[Line[i] != BackGround]; + if (++m == 8) { + /* We have byte - place it on hercules frame buffer: */ + k += 8; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + m = 0; + } + + if (!--CountZoomI) { + /* Go to next column: */ + i++; + CountZoomI = ZoomFactor; + } + } + if (k < DeviceMaxX) { + /* Poke last byte also: */ + DeviceByte <<= 8 - m; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + } + break; + case C2BW_GREY_LEVELS: + for (CountZoomI = ZoomFactor, i = ScreenLeft, k = DeviceLeft, m = 0; + i < ScreenWidth && k <= DeviceMaxX;) { + /* The following lines are equivalent to the putpixel */ + /* (and making it real machine dependent...) by almost */ + /* factor of 3: */ + /* putpixel(k++, l, MapInvert[ColorToBW(Line[i])]); */ + + ColorMapEntry = &ColorMap[Line[i]]; + /* For the transformation from RGB to BW, see Folley & */ + /* Van Dam pp 613: The Y channel is the BW we need: */ + /* As colors are 255 maximum, the result can be up to */ + /* 25500 which is still in range of our 16 bits integers.*/ + DeviceByte = (DeviceByte << 1) + + MapInvert[(30 * (int) ColorMapEntry->Red) + + 59 * ((int) ColorMapEntry->Green) + + 11 * ((int) ColorMapEntry->Blue) > + BWThreshold]; + if (++m == 8) { + /* We have byte - place it on hercules frame buffer: */ + k += 8; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + m = 0; + } + + if (!--CountZoomI) { + /* Go to next column: */ + i++; + CountZoomI = ZoomFactor; + } + } + if (k < DeviceMaxX) { + /* Poke last byte also: */ + DeviceByte <<= 8 - m; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + } + break; + case C2BW_DITHER: + if (DitheredLinesLeft-- == 0) { + EvalDitheredScanline(ScreenBuffer, + (j < ScreenHeight - DitherSize ? j : + ScreenHeight - DitherSize), + ScreenWidth, DitherBuffer); + DitheredLinesLeft = DitherSize - 1; + DitheredLinesCount = 0; + } + Line = DitherBuffer[DitheredLinesCount++]; + for (CountZoomI = ZoomFactor, i = ScreenLeft, k = DeviceLeft, m = 0; + i < ScreenWidth && k <= DeviceMaxX;) { + /* The following lines are equivalent to the putpixel */ + /* (and making it real machine dependent...) by almost */ + /* factor of 3: */ + /* putpixel(k++, l, MapInvert[Line[i]]); */ + DeviceByte = (DeviceByte << 1) + MapInvert[Line[i]]; + if (++m == 8) { + /* We have byte - place it on hercules frame buffer: */ + k += 8; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + m = 0; + } + + if (!--CountZoomI) { + /* Go to next column: */ + i++; + CountZoomI = ZoomFactor; + } + } + if (k < DeviceMaxX) { + /* Poke last byte also: */ + DeviceByte <<= 8 - m; + pokeb(DEVICE_BASE, Offset++, DeviceByte); + } + break; + } + + if (!--CountZoomJ) { + /* Go to next row: */ + j++; + CountZoomJ = ZoomFactor; + } + } +} + +/****************************************************************************** +* Walks along the current image, while printing pixel value and position. * +* 4 arrows may be used, and any other key will abort this operation * +* As there is no XOR mode for text, we copy all Page 0 to Page 1 before we * +* start this, and copy it back each time... * +******************************************************************************/ +static void DoCursorMode(GifRowType *ScreenBuffer, + int ScreenLeft, int ScreenTop, int ScreenWidth, int ScreenHeight, + int DeviceLeft, int DeviceTop) +{ + int GetK, DeviceRight, DeviceBottom, x, y, CursorTextY, Step; + GifPixelType Pixel; + char s[80]; + char far *Page0, *Page1; + + Page0 = MK_FP(DEVICE_PAGE0, 0); + Page1 = MK_FP(DEVICE_PAGE1, 0); + + memcpy(Page1, Page0, 0x8000); + + + DeviceRight = DeviceLeft + (ScreenWidth - ScreenLeft) * ZoomFactor; + if (DeviceRight > HERC_MAX_X) DeviceRight = HERC_MAX_X; + + DeviceBottom = DeviceTop + (ScreenHeight - ScreenTop) * ZoomFactor; + if (DeviceBottom > HERC_MAX_Y) DeviceBottom = HERC_MAX_Y; + + x = (DeviceLeft + DeviceRight) / 2; + y = (DeviceTop + DeviceBottom) / 2; + + while (TRUE) { + Pixel = ScreenBuffer[ScreenTop + (y - DeviceTop) / ZoomFactor] + [ScreenLeft + (x - DeviceLeft) / ZoomFactor]; + sprintf(s, "Color = %d [%d, %d, %d], X = %d, Y = %d.", + Pixel, + ColorMap[Pixel].Red, + ColorMap[Pixel].Green, + ColorMap[Pixel].Blue, + (x - DeviceLeft) / ZoomFactor, + (y - DeviceTop) / ZoomFactor); + CursorTextY = (y > HERC_MAX_Y / 2 ? HERC_MAX_Y / 4 : + 3 * HERC_MAX_Y / 4); + setviewport(CURSOR_TEXT_X, CursorTextY, + CURSOR_TEXT_X + textwidth(s), CursorTextY + textheight(s), + TRUE); + clearviewport(); + setviewport(0, 0, HERC_MAX_X, HERC_MAX_Y, TRUE); + setcolor(1); /* We only have one color here. */ + line(0, y, HERC_MAX_X, y); + line(x, 0, x, HERC_MAX_Y); + outtextxy(CURSOR_TEXT_X, CursorTextY, s); + GetK = GetKey(); + + memcpy(Page0, Page1, 0x8000); + + Step = 10; + switch (GetK) { + case '1': + GetK = KEY_END; + break; + case '2': + GetK = KEY_DOWN; + break; + case '3': + GetK = KEY_PGDN; + break; + case '4': + GetK = KEY_LEFT; + break; + case '6': + GetK = KEY_RIGHT; + break; + case '7': + GetK = KEY_HOME; + break; + case '8': + GetK = KEY_UP; + break; + case '9': + GetK = KEY_PGUP; + break; + default: + Step = 1; + } + + switch (GetK) { + case KEY_LEFT: + x -= Step; + break; + case KEY_RIGHT: + x += Step; + break; + case KEY_UP: + y -= Step; + break; + case KEY_DOWN: + y += Step; + break; + case KEY_PGUP: + y -= Step; + x += Step; + break; + case KEY_PGDN: + y += Step; + x += Step; + break; + case KEY_HOME: + y -= Step; + x -= Step; + break; + case KEY_END: + y += Step; + x -= Step; + break; + default: + return; + } + if (x < DeviceLeft) x = DeviceLeft; + if (x >= DeviceRight) x = DeviceRight; + if (y < DeviceTop) y = DeviceTop; + if (y >= DeviceBottom) y = DeviceBottom; + } +} + +/****************************************************************************** +* Return non zero value if at list one character exists in keyboard queue. * +* This routine emulates kbhit() which do uses stdin and useless for us. * +******************************************************************************/ +static int MyKbHit(void) +{ + return bioskey(1); +} + +/****************************************************************************** +* Get a key from keyboard directly (bypass stdin as we might redirect it). * +* This routine emulates getch() which do uses stdin and useless for us. * +******************************************************************************/ +static int MyGetCh(void) +{ + static int Extended = 0; + int c; + + if (Extended) { + c = Extended; + Extended = 0; + return c; + } + else { + c = bioskey(0); + if (c & 0x0ff) + return c; + else { + Extended = c >> 8; + return 0; + } + } +} + +/****************************************************************************** +* Get a key from keyboard, and translating operational keys into special * +* codes (>255). Lower case characters are upercased. * +******************************************************************************/ +static int GetKey(void) +{ + char c; + + while (TRUE) switch (c = MyGetCh()) { + case 0: /* Extended code - get the next extended char. */ + switch (MyGetCh()) { + case 75: return KEY_LEFT; + case 77: return KEY_RIGHT; + case 72: return KEY_UP; + case 80: return KEY_DOWN; + case 71: return KEY_HOME; + case 79: return KEY_END; + case 73: return KEY_PGUP; + case 81: return KEY_PGDN; + case 83: return KEY_DELETE; + case 82: return KEY_INSERT; + } + break; + case 8: + return KEY_BSPACE; + case 10: + case 13: + return KEY_RETURN; + case 27: + return KEY_ESC; + default: + if (isprint(c)) { + if (islower(c)) + return toupper(c); + else + return c; + } + else { + Tone(800, 100); + Tone(300, 200); + } + } + + return 0; /* Should never be here any case. */ +} + +/****************************************************************************** +* Routine to make some sound with given Frequency, Time milliseconds: * +******************************************************************************/ +static void Tone(int Frequency, int Time) +{ + if (BeepsDisabled) return; + + sound(Frequency); + delay(Time); + nosound(); +} diff --git a/G/UTIL/GIF2IRIS.C b/G/UTIL/GIF2IRIS.C new file mode 100644 index 0000000..536e170 --- /dev/null +++ b/G/UTIL/GIF2IRIS.C @@ -0,0 +1,283 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber UNIX Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to display GIF file under X11 window system. * +* Options: * +* -q : quite printing mode. * +* -f : force the process to be in foreground. * +* -p PosX PosY : defines the position where to put the image. * +* -h : on line help. * +****************************************************************************** +* History: * +* 13 mar 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include "gl.h" +#include "device.h" + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2Iris" + +#define ABS(x) ((x) > 0 ? (x) : (-(x))) + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2Iris q%- f%- p%-PosX|PosY!d!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- f%- p%-PosX|PosY!d!d h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + PosFlag = FALSE, + HelpFlag = FALSE, + ForeGroundFlag = FALSE, + ColorMapSize = 0, + BackGround = 0, + IrisPosX = 0, + IrisPosY = 0, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + +static void Screen2Iris(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, ImageNum = 0, Size, Row, Col, Width, Height, + ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &ForeGroundFlag, + &PosFlag, &IrisPosX, &IrisPosY, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + GifQprintf("\n"); + Screen2Iris(ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/****************************************************************************** +* The real display routine. * +******************************************************************************/ +static void Screen2Iris(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + short Val; + int i, j; + unsigned long *IrisScreenBuffer, *PBuffer; + + if (ScreenWidth > XMAXSCREEN + 1 || + ScreenHeight > YMAXSCREEN + 1) + GIF_EXIT("Input image is too big."); + + if (PosFlag) + prefposition(IrisPosX, IrisPosX + ScreenWidth - 1, + IrisPosY, IrisPosY + ScreenHeight - 1); + else + prefsize(ScreenWidth, ScreenHeight); + if (ForeGroundFlag) + foreground(); + + winopen(PROGRAM_NAME); + RGBmode(); + gconfig(); + if ((IrisScreenBuffer = (unsigned long *) + malloc(ScreenWidth * ScreenHeight * sizeof(unsigned long))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + PBuffer = IrisScreenBuffer; + for (i = ScreenHeight - 1; i >= 0; i--) + for (j = 0; j < ScreenWidth; j++) + *PBuffer++ = ColorMap[ScreenBuffer[i][j]].Red + + (ColorMap[ScreenBuffer[i][j]].Green << 8) + + (ColorMap[ScreenBuffer[i][j]].Blue << 16); + + reshapeviewport(); + lrectwrite(0, 0, ScreenWidth - 1, ScreenHeight - 1, IrisScreenBuffer); + + while (TRUE) { + if (qread(&Val) == REDRAW) { + reshapeviewport(); + lrectwrite(0, 0, ScreenWidth - 1, ScreenHeight - 1, + IrisScreenBuffer); + } + } +} diff --git a/G/UTIL/GIF2PS.C b/G/UTIL/GIF2PS.C new file mode 100644 index 0000000..4cad1cd --- /dev/null +++ b/G/UTIL/GIF2PS.C @@ -0,0 +1,387 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to dump GIF file into PostScript type printers * +* Options: * +* -q : quite printing mode. * +* -x : force image to be horizontal. * +* -y : force image to be vertical. * +* -s x y : force image to be of given size. * +* -p x y : force image to be positioned at given position in page. * +* -i : invert the image. * +* -n n : number of copies. * +* -h : on line help. * +****************************************************************************** +* History: * +* 22 Dec 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2PS" + +#define PAGE_WIDTH 7.5 /* All dimensions are in inches. */ +#define PAGE_HEIGHT 9.0 +#define FULL_PAGE_WIDTH 8.5 +#define FULL_PAGE_HEIGHT 11.0 + +#define UNKNOWN_ORIENT 0 +#define HORIZONTAL_ORIENT 1 +#define VERTICAL_ORIENT 2 + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2PS q%- x%- y%- s%-SizeX|SizeY!F!F p%-PosX|PosY!F!F i%- n%-#Copies!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- x%- y%- s%-SizeX|SizeY!F!F p%-PosX|PosY!F!F i%- n%-#Copies!d h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + ForceXFlag = FALSE, + ForceYFlag = FALSE, + SizeFlag = FALSE, + PosFlag = FALSE, + InvertFlag = FALSE, + NumCopiesFlag = FALSE, + HelpFlag = FALSE, + NumOfCopies = 1, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }, /* be read - offsets and jumps... */ + PSOrientation; +static double PSSizeX, PSSizeY, PSPosX, PSPosY; +static GifColorType + *ColorMap; + +static void DumpScreen2PS(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); +static void PutString(unsigned char *Line, int Len); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr,&GifQuitePrint, + &ForceXFlag, &ForceYFlag, &SizeFlag, &PSSizeX, &PSSizeY, + &PosFlag, &PSPosX, &PSPosY, + &InvertFlag, &NumCopiesFlag, &NumOfCopies, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (ForceXFlag) + PSOrientation = HORIZONTAL_ORIENT; + else if (ForceYFlag) + PSOrientation = VERTICAL_ORIENT; + else + PSOrientation = UNKNOWN_ORIENT; + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + DumpScreen2PS(ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/****************************************************************************** +* The real dumping routine. * +******************************************************************************/ +static void DumpScreen2PS(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + int i, j; + double Aspect; + GifByteType *OutLine, Data; + GifPixelType *Line; + GifColorType *ColorMapEntry; + + /* If user did not enforce orientation, pick the best one. */ + if (PSOrientation == UNKNOWN_ORIENT) + if (ScreenWidth > ScreenHeight) + PSOrientation = VERTICAL_ORIENT; + else + PSOrientation = HORIZONTAL_ORIENT; + + Aspect = ((double) ScreenHeight) / ((double) ScreenWidth); + + if (!SizeFlag) + switch (PSOrientation) { + case HORIZONTAL_ORIENT: + if (Aspect > PAGE_HEIGHT / PAGE_WIDTH) { + PSSizeX = PAGE_HEIGHT / Aspect; + PSSizeY = PAGE_HEIGHT; + } + else { + PSSizeX = PAGE_WIDTH; + PSSizeY = PAGE_WIDTH * Aspect; + } + break; + case VERTICAL_ORIENT: + if (1 / Aspect > PAGE_HEIGHT / PAGE_WIDTH) { + PSSizeX = PAGE_HEIGHT * Aspect; + PSSizeY = PAGE_HEIGHT; + } + else { + PSSizeX = PAGE_WIDTH; + PSSizeY = PAGE_WIDTH / Aspect; + } + break; + } + else { + if (PAGE_WIDTH < PSSizeX) { + GIF_MESSAGE("X Size specified is too big, page size selected."); + PSSizeX = PAGE_WIDTH; + } + if (PAGE_HEIGHT < PSSizeY) { + GIF_MESSAGE("Y Size specified is too big, page size selected."); + PSSizeX = PAGE_HEIGHT; + } + } + + if (!PosFlag) { + PSPosX = (FULL_PAGE_WIDTH - PSSizeX) / 2; + PSPosY = (FULL_PAGE_HEIGHT - PSSizeY) / 2; + } + else { + if (PSPosX + PSSizeX > PAGE_WIDTH || PSPosY + PSSizeY > PAGE_HEIGHT) + GIF_EXIT("Requested position will put image out of page, aborted."); + } + + /* Time to dump out the PostScript header: */ + printf("%%!\n"); + printf("%%%%Creator: %s\n", PROGRAM_NAME); + printf("/#copies %d def\n", NumOfCopies); + printf("gsave\n"); + printf("72 72 scale\t\t\t\t%% Lets talk inches.\n"); + printf("/oneline %d string def\t\t\t%% Allocate one scan line.\n", + ScreenWidth); + printf("/drawimage {\n"); + printf("\t%d %d 8 [%d 0 0 %d 0 %d]\n", ScreenWidth, ScreenHeight, + ScreenWidth, -ScreenHeight, ScreenHeight); + printf("\t{ currentfile oneline readhexstring pop } image\n"); + printf("} def\n"); + switch (PSOrientation) { + case HORIZONTAL_ORIENT: + printf("%lf %lf translate\n", PSPosX, PSPosY); + printf("%lf %lf scale\n", PSSizeX, PSSizeY); + break; + case VERTICAL_ORIENT: + printf("%lf %lf translate\n", PSPosX + PSSizeX, PSPosY); + printf("90 rotate\n"); + printf("%lf %lf scale\n", PSSizeY, PSSizeX); + break; + } + printf("drawimage\n"); + + if ((OutLine = (GifByteType *) malloc(sizeof(GifByteType) * ScreenWidth)) + == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < ScreenHeight; i++) { + GifQprintf("\b\b\b\b%-4d", ScreenHeight - i); + + Line = ScreenBuffer[i]; + for (j = 0; j < ScreenWidth; j++) { + ColorMapEntry = &ColorMap[Line[j]]; + Data = (30 * ((unsigned int) ColorMapEntry->Red) + + 59 * ((unsigned int) ColorMapEntry->Green) + + 11 * ((unsigned int) ColorMapEntry->Blue)) / 100; + OutLine[j] = InvertFlag ? 255 - Data : Data; + } + + PutString(OutLine, ScreenWidth); + } + free(OutLine); + + printf("\nshowpage\n"); + printf("grestore\n"); +} + +/****************************************************************************** +* Dumps the string of given length as 2 hexdigits per byte 39 bytes per line. * +******************************************************************************/ +static void PutString(unsigned char *Line, int Len) +{ + int i; + static Counter = 0; + static char *Hex = "0123456789ABCDEF"; + + for (i = 0; i < Len; i++) { + if (++Counter % 40 == 0) { + putchar('\n'); + Counter = 1; + } + putchar(Hex[Line[i] >> 4]); + putchar(Hex[Line[i] & 0x0f]); + } +} diff --git a/G/UTIL/GIF2RGB.C b/G/UTIL/GIF2RGB.C new file mode 100644 index 0000000..6ad2d6f --- /dev/null +++ b/G/UTIL/GIF2RGB.C @@ -0,0 +1,337 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to convert GIF file to RGB 24 bits. * +* Options: * +* -q : quite printing mode. * +* -1 : dump as one file using RGBRGB triples. * +* -h : on line help. * +* -o FileName : specify the output file name(s). * +****************************************************************************** +* History: * +* 5 Jan 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2RGB" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2RGB q%- 1%- o%-OutFileName!s h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- 1%- o%-OutFileName!s h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + OneFileFlag = FALSE, + HelpFlag = FALSE, + ColorMapSize = 0, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + +static void DumpScreen2RGB(char *FileName, int OneFileFlag, + GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, Count, + OutFileFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension; + char *OutFileName, + **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &OneFileFlag, &OutFileFlag, &OutFileName, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (!OutFileFlag) OutFileName = NULL; + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets dump it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + DumpScreen2RGB(OutFileName, OneFileFlag, + ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/****************************************************************************** +* The real dumping routine. * +******************************************************************************/ +static void DumpScreen2RGB(char *FileName, int OneFileFlag, + GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + int i, j; + GifRowType GifRow; + static GifColorType + *ColorMapEntry; + FILE *f[3]; + + if (FileName != NULL) { + char OneFileName[80]; + + if (OneFileFlag) { +#ifdef __MSDOS__ + if ((f[0] = fopen(FileName, "wb")) == NULL) +#else + if ((f[0] = fopen(FileName, "w")) == NULL) +#endif /* __MSDOS__ */ + GIF_EXIT("Can't open input file name."); + } + else { + static char *Postfixes[] = { ".R", ".G", ".B" }; + + for (i = 0; i < 3; i++) { + strcpy(OneFileName, FileName); + strcat(OneFileName, Postfixes[i]); + +#ifdef __MSDOS__ + if ((f[i] = fopen(OneFileName, "wb")) == NULL) +#else + if ((f[i] = fopen(OneFileName, "w")) == NULL) +#endif /* __MSDOS__ */ + + GIF_EXIT("Can't open input file name."); + } + } + } + else { + OneFileFlag = TRUE; + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + + f[0] = stdout; + } + + if (OneFileFlag) { + unsigned char *Buffer, *BufferP; + + if ((Buffer = (unsigned char *) malloc(ScreenWidth * 3)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < ScreenHeight; i++) { + GifRow = ScreenBuffer[i]; + GifQprintf("\b\b\b\b%-4d", ScreenHeight - i); + for (j = 0, BufferP = Buffer; j < ScreenWidth; j++) { + ColorMapEntry = &ColorMap[GifRow[j]]; + *BufferP++ = ColorMapEntry -> Red; + *BufferP++ = ColorMapEntry -> Green; + *BufferP++ = ColorMapEntry -> Blue; + } + if (fwrite(Buffer, ScreenWidth * 3, 1, f[0]) != 1) + GIF_EXIT("Write to file(s) failed."); + } + + free((char *) Buffer); + fclose(f[0]); + } + else { + unsigned char *Buffers[3]; + + if ((Buffers[0] = (unsigned char *) malloc(ScreenWidth)) == NULL || + (Buffers[1] = (unsigned char *) malloc(ScreenWidth)) == NULL || + (Buffers[2] = (unsigned char *) malloc(ScreenWidth)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < ScreenHeight; i++) { + GifRow = ScreenBuffer[i]; + GifQprintf("\b\b\b\b%-4d", ScreenHeight - i); + for (j = 0; j < ScreenWidth; j++) { + ColorMapEntry = &ColorMap[GifRow[j]]; + Buffers[0][j] = ColorMapEntry -> Red; + Buffers[1][j] = ColorMapEntry -> Green; + Buffers[2][j] = ColorMapEntry -> Blue; + } + if (fwrite(Buffers[0], ScreenWidth, 1, f[0]) != 1 || + fwrite(Buffers[1], ScreenWidth, 1, f[1]) != 1 || + fwrite(Buffers[2], ScreenWidth, 1, f[2]) != 1) + GIF_EXIT("Write to file(s) failed."); + } + + free((char *) Buffers[0]); + free((char *) Buffers[1]); + free((char *) Buffers[2]); + fclose(f[0]); + fclose(f[1]); + fclose(f[2]); + } +} diff --git a/G/UTIL/GIF2RLE.C b/G/UTIL/GIF2RLE.C new file mode 100644 index 0000000..3669dcc --- /dev/null +++ b/G/UTIL/GIF2RLE.C @@ -0,0 +1,276 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to convert GIF file RLE format (utah raster toolkit). * +* Options: * +* -q : quite printing mode. * +* -a : add alpha channel with full coverage. * +* -h : on line help. * +****************************************************************************** +* History: * +* 5 Jan 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#include "rle.h" /* The rle tool kit header files. */ + +#define PROGRAM_NAME "Gif2Rle" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2Rle q%- a%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- a%- h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + BackGround = 0, + AlphaFlag = FALSE, + HelpFlag = FALSE, + ColorMapSize = 0, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static GifColorType + *ColorMap; + +static void DumpScreen2Rle(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, Row, Col, Width, Height, ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &AlphaFlag, &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* Lets display it - set the global variables required and do it: */ + BackGround = GifFile -> SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + DumpScreen2Rle(ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } +} + +/****************************************************************************** +* The real dumping routine. * +******************************************************************************/ +static void DumpScreen2Rle(GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + int i, j; + char Comment[80]; + rle_pixel *rows[4]; + GifRowType GifRow; + static GifColorType + *ColorMapEntry; + + if (AlphaFlag) RLE_SET_BIT(rle_dflt_hdr, RLE_ALPHA); + rle_dflt_hdr.alpha = AlphaFlag != 0; + rle_dflt_hdr.rle_file = stdout; + rle_dflt_hdr.xmin = 0; + rle_dflt_hdr.ymin = 0; + rle_dflt_hdr.xmax = ScreenWidth - 1; + rle_dflt_hdr.ymax = ScreenHeight - 1; + sprintf(Comment, "origin=GIF format, %d colors.", ColorMapSize); + rle_putcom(Comment, &rle_dflt_hdr); + rle_put_setup(&rle_dflt_hdr); + + for (i = 0; i < 4; i++) + if ((rows[i] = (rle_pixel *) malloc(sizeof(rle_pixel) * ScreenWidth)) + == NULL) + GIF_EXIT("Failed to allocated memory required, aborted."); + + if (AlphaFlag) { + /* Initial the alpha channel to full coverage: */ + for (i = 0; i < ScreenWidth; i++) rows[0][i] = 255; + } + + for (i = 0; i < ScreenHeight; i++) { + /* Flip the image vertically as rle files start at the bollom... */ + GifRow = ScreenBuffer[ScreenHeight - i - 1]; + GifQprintf("\b\b\b\b%-4d", ScreenHeight - i); + for (j = 0; j < ScreenWidth; j++) { + ColorMapEntry = &ColorMap[GifRow[j]]; + rows[1][j] = ColorMapEntry -> Red; + rows[2][j] = ColorMapEntry -> Green; + rows[3][j] = ColorMapEntry -> Blue; + } + rle_putrow( &rows[1], ScreenWidth, &rle_dflt_hdr ); + } + + rle_puteof( &rle_dflt_hdr ); +} diff --git a/G/UTIL/GIF2X11.C b/G/UTIL/GIF2X11.C new file mode 100644 index 0000000..23bb00f --- /dev/null +++ b/G/UTIL/GIF2X11.C @@ -0,0 +1,517 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to display GIF file under X11 window system. * +* Options: * +* -q : quite printing mode. * +* -p PosX PosY : defines the position where to put the image. * +* -d Display : what display should go to. * +* -f : force attempt to allocate the exact colors. This usually look bad... * +* -h : on line help. * +****************************************************************************** +* History: * +* 28 Dec 89 - Version 1.0 by Gershon Elber, color allocation is based on the * +* xgif program by John Bradley, bradley@cis.ipenn.edu. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Gif2X11" + +#define ICON_SIZE 60 +#define ABS(x) ((x) > 0 ? (x) : (-(x))) + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Gif2X11 q%- p%-PosX|PosY!d!d d%-Display!s f%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- p%-PosX|PosY!d!d d%-Display!s f%- h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + PosFlag = FALSE, + HelpFlag = FALSE, + DisplayFlag = FALSE, + ForceFlag = FALSE, + ColorMapSize = 0, + BackGround = 0, + XPosX = 0, + XPosY = 0, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ +static char + *DisplayName = NULL; +static GifColorType + *ColorMap; + +/* X specific staff goes here. XColorTable will hold the GIF image colors, */ +/* while XPixelTable will hold the pixel number so we can redirect through */ +/* it when forming the image bitmap in X format. */ +/* Note the table has 256 entry which is the maximum allowed in GIF format. */ +static XColor XColorTable[256]; +static unsigned long XPixelTable[256]; +static Display *XDisplay; +static int XScreen; +static Window Xroot, XImageWndw; +static Colormap XColorMap; +static GC XGraphContext; +static Visual *XVisual; +static XImage *XImageBuffer; +static Pixmap XIcon; +static Cursor XCursor; + +static void Screen2X(int argc, char **argv, GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight); +static void AllocateColors1(void); +static void AllocateColors2(void); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, ImageNum = 0, Size, Row, Col, Width, Height, + ExtCode, Count; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ScreenBuffer; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &PosFlag, &XPosX, &XPosY, + &DisplayFlag, &DisplayName, &ForceFlag, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Lets see if we can get access to the X server before we even start: */ + if ((XDisplay = (Display *) XOpenDisplay(DisplayName)) == NULL) + GIF_EXIT("Failed to access X server, abored."); + XScreen = DefaultScreen(XDisplay); + Xroot = RootWindow(XDisplay, XScreen); + XColorMap = DefaultColormap(XDisplay, XScreen); + XGraphContext = DefaultGC(XDisplay, XScreen); + XVisual = DefaultVisual(XDisplay, XScreen); + XSetBackground(XDisplay, XGraphContext, BlackPixel(XDisplay, XScreen)); + XSetForeground(XDisplay, XGraphContext, WhitePixel(XDisplay, XScreen)); + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j SBackGroundColor; + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ColorMapSize = 1 << (GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel); + Screen2X(argc, argv, ScreenBuffer, GifFile -> SWidth, GifFile -> SHeight); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + GifQprintf("\n"); +} + +/****************************************************************************** +* The real display routine. * +******************************************************************************/ +static void Screen2X(int argc, char **argv, GifRowType *ScreenBuffer, + int ScreenWidth, int ScreenHeight) +{ + int i, j, c, Size, x, y, + MinIntensity, MaxIntensity, AvgIntensity, IconSizeX, IconSizeY; + char *XImageData, *XIconData, KeyBuffer[81]; + double Aspect; + GifByteType *OutLine, Data; + unsigned long ValueMask; + GifPixelType *Line; + GifRowType *DitherBuffer; + GifColorType *ColorMapEntry = ColorMap; + XSetWindowAttributes SetWinAttr; + XSizeHints Hints; + XEvent Event; + XExposeEvent *EEvent; + XComposeStatus Stat; + KeySym KS; + + /* Let find out what are the intensities in the color map: */ + MaxIntensity = 0; + MinIntensity = 256 * 100; + for (i = 0; i < ColorMapSize; i++) { + c = ColorMapEntry[i].Red * 30 + + ColorMapEntry[i].Green * 59 + + ColorMapEntry[i].Blue * 11; + if (c > MaxIntensity) MaxIntensity = c; + if (c < MinIntensity) MinIntensity = c; + } + AvgIntensity = (MinIntensity + MaxIntensity) / 2; + + /* The big trick here is to select the colors so lets do this first: */ + if (ForceFlag) + AllocateColors2(); + else + AllocateColors1(); + + SetWinAttr.background_pixel = BlackPixel( XDisplay, XScreen ); + SetWinAttr.border_pixel = WhitePixel( XDisplay, XScreen ); + ValueMask = CWBackPixel | CWBorderPixel; + + Hints.flags = PSize | PMinSize | PMaxSize; + Hints.x = Hints.y = 1; + Hints.width = Hints.min_width = Hints.max_width = ScreenWidth; + Hints.height = Hints.min_height = Hints.max_height = ScreenHeight; + if (PosFlag) { + Hints.flags |= USPosition; + Hints.x = XPosX; + Hints.y = XPosY; + } + + XImageWndw = XCreateWindow(XDisplay, Xroot, XPosX, XPosY, + ScreenWidth, ScreenHeight, + 1, 0, + CopyFromParent, CopyFromParent, + ValueMask, &SetWinAttr); + + /* Set up the icon bit map to be a shrinked BW version of the image: */ + if (ScreenWidth > ScreenHeight) { + IconSizeX = (ICON_SIZE / 8) * 8; + IconSizeY = (ScreenHeight * ICON_SIZE) / ScreenWidth; + } + else { + IconSizeY = ICON_SIZE; + IconSizeX = (((ScreenWidth * ICON_SIZE) / ScreenHeight) / 8) * 8; + } + XIconData = (char *) malloc(IconSizeX * IconSizeY / 8); + memset(XIconData, 0, IconSizeX * IconSizeY / 8); + for (i = 0; i < IconSizeY; i++) { + y = (i * ScreenHeight / IconSizeY); + Size = i * IconSizeX / 8; + for (j = 0; j < IconSizeX; j++) { + x = j * ScreenWidth / IconSizeX; + c = ScreenBuffer[y][x]; + c = ColorMapEntry[c].Red * 30 + + ColorMapEntry[c].Green * 59 + + ColorMapEntry[c].Blue * 11 > AvgIntensity; + XIconData[Size + j / 8] |= c << (j % 8); + } + } + + XIcon = XCreateBitmapFromData(XDisplay, XImageWndw, XIconData, + IconSizeX, IconSizeY); + + XSetStandardProperties(XDisplay, XImageWndw, + PROGRAM_NAME, PROGRAM_NAME, XIcon, + argv, argc, + &Hints); + + XSelectInput(XDisplay, XImageWndw, ExposureMask | KeyPressMask); + + /* Set out own cursor: */ + XCursor = XCreateFontCursor(XDisplay, XC_diamond_cross); + XDefineCursor(XDisplay, XImageWndw, XCursor); + + XMapWindow(XDisplay, XImageWndw); + + /* Create the image in X format: */ + if ((XImageData = (char *) malloc(ScreenWidth * ScreenHeight)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < ScreenHeight; i++) { + y = i * ScreenWidth; + for (j = 0; j < ScreenWidth; j++) + XImageData[y + j] = XPixelTable[ScreenBuffer[i][j]]; + } + XImageBuffer = XCreateImage(XDisplay, XVisual, 8, ZPixmap, 0, + XImageData, ScreenWidth, ScreenHeight, + 8, ScreenWidth); + + while (TRUE) { + XNextEvent(XDisplay, &Event); + switch (Event.type) { + case Expose: + EEvent = (XExposeEvent *) &Event; + XPutImage(XDisplay, XImageWndw, XGraphContext, XImageBuffer, + EEvent -> x, EEvent -> y, + EEvent -> x, EEvent -> y, + EEvent -> width, EEvent -> height); + break; + case KeyPress: + XLookupString(&Event, KeyBuffer, 80, &KS, &Stat); + if (KeyBuffer[0] == 3) return; + break; + } + } +} + +/****************************************************************************** +* Routine to allocate the requested colors from the X server. * +* Colors are allocated until success by stripping off the least bits of the * +* colors. * +******************************************************************************/ +static void AllocateColors1(void) +{ + int Strip, Msk, i, j; + char Msg[80]; + + for (i = 0; i < 256; i++) + XPixelTable[i] = 0; /* Put reasonable color for out of range. */ + + for (Strip = 0, Msk = 0xff; Strip < 8; Strip++, Msk <<= 1) { + for (i = 0; i < ColorMapSize; i++) { + /* Prepere color entry in X format. */ + XColorTable[i].red = (ColorMap[i].Red & Msk) << 8; + XColorTable[i].green = (ColorMap[i].Green & Msk) << 8; + XColorTable[i].blue = (ColorMap[i].Blue & Msk) << 8; + XColorTable[i].flags = DoRed | DoGreen | DoBlue; + if (XAllocColor(XDisplay, XColorMap, &XColorTable[i])) + XPixelTable[i] = XColorTable[i].pixel; + else + break; + } + if (i < ColorMapSize) + XFreeColors(XDisplay, XColorMap, XPixelTable, i, 0L); + else + break; + } + + if (Strip == 8) + GIF_EXIT("Can not display the image - not enough colors available."); + + if (Strip != 0) { + sprintf(Msg, "%d bits were stripped off the color map.", Strip); + GIF_MESSAGE(Msg); + } +} + +/****************************************************************************** +* Routine to allocate the requested colors from the X server. * +* Two stages are performed: * +* 1. Colors are requested directly. * +* 2. If not enough colors can be allocated, the closest current color * +* in current table is selected instead. * +* This allocation is not optimal as when fail to allocate all colors one * +* should pick the right colors to do allocate in order to minimize the * +* closest distance from the unallocated ones under some norm (what is a good * +* norm for the RGB space?). Improve it if you are bored. * +******************************************************************************/ +static void AllocateColors2(void) +{ + int i, j, Index = 0, Count = 0, XNumOfColors; + char Msg[80]; + unsigned long D, Distance, AvgDistance = 0, Red, Green, Blue; + GifBooleanType Failed = FALSE; + XColor *XOldColorTable; + + for (i = 0; i < 256; i++) { + if (i < ColorMapSize) { /* Prepere color entry in X format. */ + XColorTable[i].red = ColorMap[i].Red << 8; + XColorTable[i].green = ColorMap[i].Green << 8; + XColorTable[i].blue = ColorMap[i].Blue << 8; + XColorTable[i].flags = DoRed | DoGreen | DoBlue; + XPixelTable[i] = -1; /* Not allocated yet. */ + } + else + XPixelTable[i] = 0; /* Put reasonable color for out of range. */ + } + + for (i = 0; i < ColorMapSize; i++) /* Allocate the colors from X: */ + if (XAllocColor(XDisplay, XColorMap, &XColorTable[i])) + XPixelTable[i] = XColorTable[i].pixel; + else + Failed = TRUE; + + if (Failed) { + XNumOfColors = DisplayCells(XDisplay, XScreen); + XOldColorTable = (XColor *) malloc(sizeof(XColor) * XNumOfColors); + for (i = 0; i < XNumOfColors; i++) XOldColorTable[i].pixel = i; + XQueryColors(XDisplay, XColorMap, XOldColorTable, XNumOfColors); + + for (i = 0; i < ColorMapSize; i++) { + /* Allocate closest colors from X: */ + if (XPixelTable[i] == -1) { /* Failed to allocate this one. */ + Distance = 0xffffffff; + + Red = XColorTable[i].red; + Green = XColorTable[i].green; + Blue = XColorTable[i].blue; + + for (j = 0; j < XNumOfColors; j++) { + /* Find the closest color in 3D RGB space using L1 norm. */ + if ((D = ABS(Red - XOldColorTable[j].red) + + ABS(Green - XOldColorTable[j].green) + + ABS(Blue - XOldColorTable[j].blue)) < Distance) { + Distance = D; + Index = j; + } + } + XPixelTable[i] = Index; + + AvgDistance += Distance; + Count++; + } + } + free(XOldColorTable); + + sprintf(Msg, "Colors will be approximated (average error = %d).\n", + AvgDistance / Count); + GIF_MESSAGE(Msg); + } +} diff --git a/G/UTIL/GIFASM.C b/G/UTIL/GIFASM.C new file mode 100644 index 0000000..5c4e7a7 --- /dev/null +++ b/G/UTIL/GIFASM.C @@ -0,0 +1,314 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to assemble/disassemble GIF files: disassembles multi image file * +* into seperated files, or assembles few single image GIF files into one. * +* Options: * +* -q : quite printing mode. * +* -a : assemble few files into one (default) * +* -d name : disassmble given GIF file into seperate files derived from name. * +* -h : on line help. * +****************************************************************************** +* History: * +* 7 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifAsm" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifAsm q%- a%- d%-OutFileName!s h%- GifFile(s)!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- a%- d%-OutFileName!s h%- GifFile(s)!*s"; +#endif /* SYSV */ + +static int + AsmFlag = FALSE; + +static void DoAssembly(int NumFiles, char **FileNames); +static void DoDisassembly(char *InFileName, char *OutFileName); +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, DisasmFlag = FALSE, HelpFlag = FALSE; + char **FileNames = NULL, *OutFileName; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &AsmFlag, &DisasmFlag, &OutFileName, + &HelpFlag, &NumFiles, &FileNames)) != FALSE) { + GAPrintErrMsg(Error); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (!AsmFlag && !DisasmFlag) AsmFlag = TRUE; /* Make default - assemble. */ + if (AsmFlag && NumFiles < 2) { + GIF_MESSAGE("At list two GIF files are required to assembly operation."); + GAPrintHowTo(CtrlStr); + exit(1); + } + if (!AsmFlag && NumFiles > 1) { + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (AsmFlag) + DoAssembly(NumFiles, FileNames); + else + DoDisassembly(NumFiles == 1 ? *FileNames : NULL, OutFileName); +} + +/****************************************************************************** +* Perform the assembly operation - take few input files into one output. * +******************************************************************************/ +static void DoAssembly(int NumFiles, char **FileNames) +{ + int i, ExtCode, CodeSize; + GifRecordType RecordType; + GifByteType *Extension, *CodeBlock; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + for (i = 0; i < NumFiles; i++) { + if ((GifFileIn = DGifOpenFileName(FileNames[i])) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* And dump out screen descriptor iff its first image. */ + if (i == 0) + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont */ + /* dont care what is there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR + || EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, discard.*/ + while (Extension != NULL) + if (DGifGetExtensionNext(GifFileIn, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Perform the disassembly operation - take one input files into few output. * +******************************************************************************/ +static void DoDisassembly(char *InFileName, char *OutFileName) +{ + int i, ExtCode, CodeSize, FileNum = 0, FileEmpty; + GifRecordType RecordType; + char CrntFileName[80], *p; + GifByteType *Extension, *CodeBlock; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + /* If name has type postfix, strip it out, and make sure name is less */ + /* or equal to 6 chars, so we will have 2 chars in name for numbers. */ + for (i = 0; i < strlen(OutFileName); i++)/* Make sure all is upper case.*/ + if (islower(OutFileName[i])) + OutFileName[i] = toupper(OutFileName[i]); + + if ((p = strrchr(OutFileName, '.')) != NULL && strlen(p) <= 4) p[0] = 0; + if ((p = strrchr(OutFileName, '/')) != NULL || + (p = strrchr(OutFileName, '\\')) != NULL || + (p = strrchr(OutFileName, ':')) != NULL) { + if (strlen(p) > 7) p[7] = 0; /* p includes the '/', '\\', ':' char. */ + } + else { + /* Only name is given for current directory: */ + if (strlen(OutFileName) > 6) OutFileName[6] = 0; + } + + /* Open input file: */ + if (InFileName != NULL) { + if ((GifFileIn = DGifOpenFileName(InFileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Scan the content of GIF file and dump image(s) to seperate file(s): */ + do { + sprintf(CrntFileName, "%s%02d.gif", OutFileName, FileNum++); + if ((GifFileOut = EGifOpenFileName(CrntFileName, TRUE)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + FileEmpty = TRUE; + + /* And dump out its exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + FileEmpty = FALSE; + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put same image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont */ + /* really care what is there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR + || EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + FileEmpty = FALSE; + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, discard.*/ + while (Extension != NULL) + if (DGifGetExtensionNext(GifFileIn, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != IMAGE_DESC_RECORD_TYPE && + RecordType != TERMINATE_RECORD_TYPE); + + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (FileEmpty) { + /* Might happen on last file - delete it if so: */ + unlink(CrntFileName); + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFBG.C b/G/UTIL/GIFBG.C new file mode 100644 index 0000000..d170e72 --- /dev/null +++ b/G/UTIL/GIFBG.C @@ -0,0 +1,362 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to generate back ground image that can be used to replace constant * +* background. * +* Options: * +* -q : quite printing mode. * +* -d direction : set direction image should increase intensity. * +* -l levels : number of color levels. * +* -c r g b : colors of the back ground. * +* -m min : minimin intensity in percent. * +* -M max : maximum intensity in percent. * +* -s width height : size of image to create. * +* -h : on line help. * +****************************************************************************** +* History: * +* 9 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifBG" + +#define DEFAULT_WIDTH 640 +#define DEFAULT_HEIGHT 350 + +#define DEFAULT_COLOR_RED 0 +#define DEFAULT_COLOR_GREEN 0 +#define DEFAULT_COLOR_BLUE 255 + +#define DEFAULT_MIN_INTENSITY 10 /* In percent. */ +#define DEFAULT_MAX_INTENSITY 100 + +#define DEFAULT_NUM_LEVELS 16 /* Number of colors to gen the image. */ + +#define DIR_NONE 0 /* Direction the levels can be changed: */ +#define DIR_TOP 1 +#define DIR_TOP_RIGHT 2 +#define DIR_RIGHT 3 +#define DIR_BOT_RIGHT 4 +#define DIR_BOT 5 +#define DIR_BOT_LEFT 6 +#define DIR_LEFT 7 +#define DIR_TOP_LEFT 8 + +#define DEFAULT_DIR "T" /* TOP (North) direction. */ + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module \t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifBG q%- d%-Dir!s l%-#Lvls!d c%-R|G|B!d!d!d m%-MinI!d M%-MaxI!d s%-W|H!d!d h%-"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- d%-Dir!s l%-#Lvls!d c%-R|G|B!d!d!d m%-MinI!d M%-MaxI!d s%-W|H!d!d h%-"; +#endif /* SYSV */ + +static int + MaximumIntensity = DEFAULT_MAX_INTENSITY, /* In percent. */ + MinimumIntensity = DEFAULT_MIN_INTENSITY, + NumLevels = DEFAULT_NUM_LEVELS, + ImageWidth = DEFAULT_WIDTH, + ImageHeight = DEFAULT_HEIGHT, + Direction; +static unsigned int + RedColor = DEFAULT_COLOR_RED, + GreenColor = DEFAULT_COLOR_GREEN, + BlueColor = DEFAULT_COLOR_BLUE; + +static void QuitGifError(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + unsigned int Ratio; + int i, j, l, LevelHeight, LevelWidth, Error, LogNumLevels, FlipDir, + Accumulator, StartX, StepX, Count = 0, DoAllMaximum = FALSE, + DirectionFlag = FALSE, LevelsFlag = FALSE, ColorFlag = FALSE, + MinFlag = FALSE, MaxFlag = FALSE, SizeFlag = FALSE, HelpFlag = FALSE; + GifPixelType Color; + char *DirectionStr = DEFAULT_DIR; + GifRowType Line; + GifColorType *ColorMap; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &DirectionFlag, &DirectionStr, &LevelsFlag, &NumLevels, + &ColorFlag, &RedColor, &GreenColor, &BlueColor, + &MinFlag, &MinimumIntensity, &MaxFlag, &MaximumIntensity, + &SizeFlag, &ImageWidth, &ImageHeight, + &HelpFlag)) != FALSE) { + GAPrintErrMsg(Error); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* Make sure intensities are in the right range: */ + if (MinimumIntensity < 0 || MinimumIntensity > 100 || + MaximumIntensity < 0 || MaximumIntensity > 100) + GIF_EXIT("Intensities (-m or -M options) are not in [0..100] range (percent)."); + + /* Convert DirectionStr to our local representation: */ + Direction = DIR_NONE; + FlipDir = FALSE; + for (i = 0; i < strlen(DirectionStr); i++) /* Make sure its upper case. */ + if (islower(DirectionStr[i])) + DirectionStr[i] = toupper(DirectionStr[i]); + + switch(DirectionStr[0]) { + case 'T': /* Top or North */ + case 'N': + if (strlen(DirectionStr) < 2) + Direction = DIR_TOP; + else + switch(DirectionStr[1]) { + case 'R': + case 'E': + Direction = DIR_TOP_RIGHT; + break; + case 'L': + case 'W': + Direction = DIR_TOP_LEFT; + FlipDir = TRUE; + break; + } + break; + case 'R': /* Right or East */ + case 'E': + Direction = DIR_RIGHT; + break; + case 'B': /* Bottom or South */ + case 'S': + if (strlen(DirectionStr) < 2) { + Direction = DIR_BOT; + FlipDir = TRUE; + } + else + switch(DirectionStr[1]) { + case 'R': + case 'E': + Direction = DIR_BOT_RIGHT; + break; + case 'L': + case 'W': + Direction = DIR_BOT_LEFT; + FlipDir = TRUE; + break; + } + break; + case 'L': /* Left or West */ + case 'W': + Direction = DIR_LEFT; + FlipDir = TRUE; + break; + } + if (Direction == DIR_NONE) + GIF_EXIT("Direction requested (-d option) is wierd!"); + + /* We are going to handle only TOP, TOP_RIGHT, RIGHT, BOT_RIGHT so flip */ + /* the complement cases (TOP <-> BOT for example) by flipping the */ + /* Color i with color (NumLevels - i - 1). */ + if (FlipDir) { + switch (Direction) { + case DIR_BOT: + Direction = DIR_TOP; + break; + case DIR_BOT_LEFT: + Direction = DIR_TOP_RIGHT; + break; + case DIR_LEFT: + Direction = DIR_RIGHT; + break; + case DIR_TOP_LEFT: + Direction = DIR_BOT_RIGHT; + break; + } + } + + /* If binary mask is requested (special case): */ + if (MinimumIntensity == 100 && MaximumIntensity == 100 && NumLevels == 2) { + MinimumIntensity = 0; + DoAllMaximum = TRUE; + Direction = DIR_RIGHT; + } + + /* Make sure colors are in the right range: */ + if (RedColor > 255 || GreenColor > 255 || BlueColor > 255) + GIF_EXIT("Colors are not in the ragne [0..255]."); + + /* Make sure number of levels is power of 2 (up to 8 bits per pixel). */ + for (i = 1; i < 8; i++) if (NumLevels == (1 << i)) break; + if (i == 8) GIF_EXIT("#Lvls (-l option) is not power of 2."); + LogNumLevels = i; + + /* Open stdout for the output file: */ + if ((GifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFile); + + /* Dump out screen description with given size and generated color map: */ + if ((ColorMap = (GifColorType *) malloc(NumLevels * sizeof(GifColorType))) + == NULL) GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 1; i <= NumLevels; i++) { + /* Ratio will be in the range of 0..100 for required intensity: */ + Ratio = (MaximumIntensity * (i * (256 / NumLevels)) + + MinimumIntensity * ((NumLevels - i) * (256 / NumLevels))) / + 256; + ColorMap[i-1].Red = (RedColor * Ratio) / 100; + ColorMap[i-1].Green = (GreenColor * Ratio) / 100; + ColorMap[i-1].Blue = (BlueColor * Ratio) / 100; + } + if (EGifPutScreenDesc(GifFile, + ImageWidth, ImageHeight, LogNumLevels, 0, LogNumLevels, ColorMap) + == GIF_ERROR) + QuitGifError(GifFile); + + /* Dump out the image descriptor: */ + if (EGifPutImageDesc(GifFile, + 0, 0, ImageWidth, ImageHeight, FALSE, LogNumLevels, NULL) == GIF_ERROR) + QuitGifError(GifFile); + + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + /* Allocate one scan line twice as big as image is as we are going to */ + /* shift along it, while we dump the scan lines: */ + if ((Line = (GifRowType) malloc(sizeof(GifPixelType) * ImageWidth * 2)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + if (Direction == DIR_TOP) { + /* We must evaluate the line each time level is changing: */ + LevelHeight = ImageHeight / NumLevels; + for (Color = NumLevels, i = l = 0; i < ImageHeight; i++) { + if (i == l) { + /* Time to update the line to next color level: */ + if (Color != 0) Color--; + for (j = 0; j < ImageWidth; j++) + Line[j] = (FlipDir ? NumLevels - Color - 1 : Color); + l += LevelHeight; + } + if (EGifPutLine(GifFile, Line, ImageWidth) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Count++); + } + } + else if (Direction == DIR_RIGHT) { + /* We pre-prepare the scan lines as going from color zero to maximum */ + /* color and dump the same scan line Height times: */ + /* Note this case should handle the Boolean Mask special case. */ + LevelWidth = ImageWidth / NumLevels; + if (DoAllMaximum) { + /* Special case - do all in maximum color: */ + for (i = 0; i < ImageWidth; i++) Line[i] = 1; + } + else { + for (Color = i = 0, l = LevelWidth; i < ImageWidth; i++, l--) { + if (l == 0) { + l = LevelWidth; + if (Color < NumLevels - 1) Color++; + } + Line[i] = (FlipDir ? NumLevels - Color - 1 : Color); + } + } + + for (i = 0; i < ImageHeight; i++) { + if (EGifPutLine(GifFile, Line, ImageWidth) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Count++); + } + } + else { + /* We are in one of the TOP_RIGHT, BOT_RIGHT cases: we will */ + /* initialize the Line with its double ImageWidth length from the */ + /* minimum intensity to the maximum intensity and shift along it */ + /* while we go along the image height. */ + LevelWidth = ImageWidth * 2 / NumLevels; + for (Color = i = 0, l = LevelWidth; i < ImageWidth * 2; i++, l--) { + if (l == 0) { + l = LevelWidth; + if (Color < NumLevels - 1) Color++; + } + Line[i] = (FlipDir ? NumLevels - Color - 1 : Color); + } + /* We need to implement a DDA to know how much to shift Line while */ + /* we go down along image height. we set the parameters for it now: */ + Accumulator = 0; + switch(Direction) { + case DIR_TOP_RIGHT: + StartX = ImageWidth; + StepX = -1; + break; + case DIR_BOT_RIGHT: + default: + StartX = 0; + StepX = 1; + break; + } + + /* Time to dump information out: */ + for (i = 0; i < ImageHeight; i++) { + if (EGifPutLine(GifFile, &Line[StartX], ImageWidth) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Count++); + if ((Accumulator += ImageWidth) > ImageHeight) { + while (Accumulator > ImageHeight) { + Accumulator -= ImageHeight; + StartX += StepX; + } + if (Direction < 0) Direction = 0; + if (Direction > ImageWidth) Direction = ImageWidth; + } + } + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) EGifCloseFile(GifFile); + exit(1); +} diff --git a/G/UTIL/GIFCLIP.C b/G/UTIL/GIFCLIP.C new file mode 100644 index 0000000..d195a0a --- /dev/null +++ b/G/UTIL/GIFCLIP.C @@ -0,0 +1,256 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to clip an image and dump out only portion of it. * +* Options: * +* -q : quite printing mode. * +* -i left top width bottom : clipping information for first image. * +* -n n left top width bottom : clipping information for nth image. * +* -h : on line help * +****************************************************************************** +* History: * +* 8 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifClip" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifClip q%- i%-Xmin|Ymin|Xmax|Ymax!d!d!d!d n%-n|Xmin|Ymin|Xmax|Ymax!d!d!d!d!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- i%-Xmin|Ymin|Xmax|Ymax!d!d!d!d n%-n|Xmin|Ymin|Xmax|Ymax!d!d!d!d!d h%- GifFile!*s"; +#endif /* SYSV */ + +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, Error, NumFiles, ExtCode, CodeSize, ImageNum = 0, + ImageFlag = FALSE, ImageNFlag = FALSE, ImageN, ImageX1, ImageY1, + ImageX2, ImageY2, ImageWidth, HelpFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension, *CodeBlock; + char **FileName = NULL; + GifRowType Line; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + /* Same image dimension vars for both Image & ImageN as only one allowed.*/ + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &ImageFlag, &ImageX1, &ImageY1, &ImageX2, &ImageY2, + &ImageNFlag, &ImageN, &ImageX1, &ImageY1, &ImageX2, &ImageY2, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* Test to make sure exactly one of ImageFlag & ImageNFlag is set: */ + if ((ImageFlag && ImageNFlag) || (!ImageFlag && !ImageNFlag)) { + GIF_MESSAGE("Exactly one of [-i ...] && [-n ...] please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + if (ImageFlag) ImageN = 1; /* Its first image we are after. */ + + /* Make sure the first coordinates of clipping box are smaller: */ + if (ImageX1 > ImageX2) { + i = ImageX1; + ImageX1 = ImageX2; + ImageX2 = i; + } + if (ImageY1 > ImageY2) { + i = ImageX1; + ImageY1 = ImageY2; + ImageY2 = i; + } + ImageWidth = ImageX2 - ImageX1 + 1; /* Width of clipped image. */ + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* And dump out exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (++ImageNum == ImageN) { + /* We can handle only non interlaced images here: */ + if (GifFileIn -> IInterlace) + GIF_EXIT("Image to clip is interlaced - use GifInter first."); + + /* This is the image we should clip - test sizes and */ + /* dump out new clipped screen descriptor if o.k. */ + if (GifFileIn -> IWidth <= ImageX2 || + GifFileIn -> IHeight <= ImageY2) + GIF_EXIT("Image is smaller than given clip dimensions."); + + /* Put the image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + ImageWidth, ImageY2 - ImageY1 + 1, + FALSE, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* o.k. - read the image and clip it: */ + Line = (GifRowType) malloc(GifFileIn -> IWidth * + sizeof(GifPixelType)); + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ImageNum, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight); + + /* Skip lines below ImageY1: */ + for (i = 0; i < ImageY1; i++) { + if (DGifGetLine(GifFileIn, Line, GifFileIn -> IWidth) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + GifQprintf("\b\b\b\b%-4d", i); + } + + /* Clip the lines from ImageY1 to ImageY2 (to X1 - X2): */ + for (i = ImageY1; i <= ImageY2; i++) { + if (DGifGetLine(GifFileIn, Line, GifFileIn -> IWidth) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutLine(GifFileOut, &Line[ImageX1], + ImageWidth) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + GifQprintf("\b\b\b\b%-4d", i); + } + + /* Skip lines above ImageY2: */ + for (i = ImageY2 + 1; i < GifFileIn -> IHeight; i++) { + if (DGifGetLine(GifFileIn, Line, GifFileIn -> IWidth) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + GifQprintf("\b\b\b\b%-4d", i); + } + + free((char *) Line); + } + else { + /* Copy the image as is (we dont modify this one): */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont */ + /* really care what is there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR + || EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} + diff --git a/G/UTIL/GIFCLRMP.C b/G/UTIL/GIFCLRMP.C new file mode 100644 index 0000000..2ed25cb --- /dev/null +++ b/G/UTIL/GIFCLRMP.C @@ -0,0 +1,279 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to modify GIF file color map(s). Images are not modified at all. * +* Options: * +* -q : quite printing mode. * +* -s : save screen color map (unless -i - see below), to stdout. * +* -l colormap.file : substitute given colormap.file colormap into screen * +* colormap (unless -i - see below). * +* -g correction : apply gamma correction to the screen colormap (unless -i - * +* see below). * +* -i n : select image number n color map instead of screen map for above * +* operations (n = 1 for first image). * +* -h : on line help. * +* All color maps are ascii text files, with one line per color of the * +* form: index, Red color, Green color, Blue color - all in the range 0..255. * +* All color maps should be in the exact same length. * +****************************************************************************** +* History: * +* 17 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifClrMp" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifClrMp q%- s%- l%-ColorMapFile!s g%-Gamma!F i%-Image#!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- s%- l%-ColorMapFile!s g%-Gamma!F i%-Image#!d h%- GifFile!*s"; +#endif /* SYSV */ + +static int + SaveFlag = FALSE, + LoadFlag = FALSE, + GammaFlag = FALSE; +static + double Gamma = 1.0; +static + FILE *ColorFile = NULL; + + +static void ModifyColorMap(GifColorType *ColorMap, int BitsPerPixel); +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, ExtCode, CodeSize, ImageNum = 0, + ImageNFlag = FALSE, ImageN, HelpFlag = FALSE, HasGIFOutput; + GifRecordType RecordType; + GifByteType *Extension, *CodeBlock; + char **FileName = NULL, *ColorFileName; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &SaveFlag, &LoadFlag, &ColorFileName, + &GammaFlag, &Gamma, &ImageNFlag, &ImageN, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (SaveFlag && LoadFlag || SaveFlag && GammaFlag || LoadFlag && GammaFlag) + GIF_EXIT("Can not handle more than one of -s -l or -g at the same time."); + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + if (SaveFlag) { + /* We are dumping out the color map as text file to stdout: */ + ColorFile = stdout; + } + else if (LoadFlag) { + /* We are loading new color map from specified file: */ + if ((ColorFile = fopen(ColorFileName, "rt")) == NULL) + GIF_EXIT("Failed to open specified color map file."); + } + + if ((HasGIFOutput = (LoadFlag || GammaFlag)) != 0) { + /* Open stdout for GIF output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + if (!ImageNFlag) { + /* We are suppose to modify the screen color map, so do it: */ + ModifyColorMap(GifFileIn -> SColorMap, GifFileIn -> SBitsPerPixel); + if (!HasGIFOutput) { + /* We can quit here, as we have the color map: */ + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + fclose(ColorFile); + exit(0); + } + } + /* And dump out its new possible repositioned screen information: */ + if (HasGIFOutput) + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (++ImageNum == ImageN && ImageNFlag) { + /* We are suppose to modify this image color map, do it: */ + ModifyColorMap(GifFileIn -> SColorMap, + GifFileIn -> SBitsPerPixel); + if (!HasGIFOutput) { + /* We can quit here, as we have the color map: */ + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + fclose(ColorFile); + exit(0); + } + } + if (HasGIFOutput) + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont really */ + /* care what we have there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (HasGIFOutput) + if (EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) { + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (HasGIFOutput) + if (EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (HasGIFOutput) + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (HasGIFOutput) + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Modify the given colormap according to global variables setting. * +******************************************************************************/ +static void ModifyColorMap(GifColorType *ColorMap, int BitsPerPixel) +{ + int i, Dummy, Red, Green, Blue; + double Gamma1; + + if (SaveFlag) { + /* Save this color map to ColorFile: */ + for (i = 0; i < (1 << BitsPerPixel); i++) + fprintf(ColorFile, "%3d %3d %3d %3d\n", i, + ColorMap[i].Red, ColorMap[i].Green, ColorMap[i].Blue); + } + else if (LoadFlag) { + /* Read the color map in ColorFile into this color map: */ + for (i = 0; i < (1 << BitsPerPixel); i++) { + if (feof(ColorFile)) + GIF_EXIT("Color file to load color map from, too small."); + fscanf(ColorFile, "%3d %3d %3d %3d\n", &Dummy, &Red, &Green, &Blue); + ColorMap[i].Red = Red; + ColorMap[i].Green = Green; + ColorMap[i].Blue = Blue; + } + } + else if (GammaFlag) { + /* Apply gamma correction to this color map: */ + Gamma1 = 1.0 / Gamma; + for (i = 0; i < (1 << BitsPerPixel); i++) { + ColorMap[i].Red = + ((int) (255 * pow(ColorMap[i].Red / 255.0, Gamma1))); + ColorMap[i].Green = + ((int) (255 * pow(ColorMap[i].Green / 255.0, Gamma1))); + ColorMap[i].Blue = + ((int) (255 * pow(ColorMap[i].Blue / 255.0, Gamma1))); + } + } + else + GIF_EXIT("Nothing to do!"); +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} + diff --git a/G/UTIL/GIFCOMB.C b/G/UTIL/GIFCOMB.C new file mode 100644 index 0000000..46fac46 --- /dev/null +++ b/G/UTIL/GIFCOMB.C @@ -0,0 +1,322 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to combine 2 GIF images into single one, using optional mask GIF * +* file. Result colormap will be the union of the two images colormaps. * +* Both images should have exactly the same size, although they may be mapped * +* differently on screen. Only First GIF screen descriptor info. is used. * +* Options: * +* -q : quite printing mode. * +* -m mask : optional boolean image, defines where second GIF should be used. * +* -h : on line help. * +****************************************************************************** +* History: * +* 12 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* _MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifComb" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifComb q%- m%-MaskGIFFile!s h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- m%-MaskGIFFile!s h%- GifFile!*s"; +#endif /* SYSV */ + +static int ReadUntilImage(GifFileType *GifFile); +static int UnionColorMap(GifColorType *ColorIn1, int ColorIn1Size, + GifColorType *ColorIn2, int ColorIn2Size, + GifColorType **ColorUnionPtr, int *ColorUnionSize, + GifPixelType ColorTransIn2[]); +static void QuitGifError(GifFileType *GifFileIn1, GifFileType *GifFileIn2, + GifFileType *GifMaskFile, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Size, ColorUnionSize, + ColorIn1Size = 0, ColorIn2Size = 0, + MaskFlag = FALSE, HelpFlag = FALSE; + char **FileName = NULL, *MaskFileName; + GifPixelType ColorTransIn2[256]; + GifRowType LineIn1 = NULL, LineIn2 = NULL, LineMask = NULL, LineOut = NULL; + GifColorType *ColorIn1 = NULL, *ColorIn2 = NULL, *ColorUnion; + GifFileType *GifFileIn1 = NULL, *GifFileIn2 = NULL, *GifMaskFile = NULL, + *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &MaskFlag, &MaskFileName, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles != 2 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles != 2) + GIF_MESSAGE("Error in command line parsing - two GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* Open all input files (two GIF to combine, and optional mask): */ + if ((GifFileIn1 = DGifOpenFileName(FileName[0])) == NULL || + (GifFileIn2 = DGifOpenFileName(FileName[1])) == NULL || + (MaskFlag && (GifMaskFile = DGifOpenFileName(MaskFileName)) == NULL)) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + + if (ReadUntilImage(GifFileIn1) == GIF_ERROR || + ReadUntilImage(GifFileIn2) == GIF_ERROR || + (MaskFlag && ReadUntilImage(GifMaskFile) == GIF_ERROR)) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + + if (GifFileIn1 -> IWidth != GifFileIn2 -> IWidth || + GifFileIn2 -> IHeight != GifFileIn2 -> IHeight || + (MaskFlag && (GifFileIn1 -> IWidth != GifMaskFile -> IWidth || + GifFileIn1 -> IHeight != GifMaskFile -> IHeight))) + GIF_EXIT("Given GIF files have different image dimensions."); + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + + Size = sizeof(GifPixelType) * GifFileIn1 -> IWidth; + if ((LineIn1 = (GifRowType) malloc(Size)) == NULL || + (LineIn2 = (GifRowType) malloc(Size)) == NULL || + (MaskFlag && (LineMask = (GifRowType) malloc(Size)) == NULL) || + (LineOut = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + if (GifFileIn1 -> IColorMap) { + ColorIn1 = GifFileIn1 -> IColorMap; + ColorIn1Size = 1 << GifFileIn1 -> IBitsPerPixel; + } + else if (GifFileIn1 -> SColorMap) { + ColorIn1 = GifFileIn1 -> SColorMap; + ColorIn1Size = 1 << GifFileIn1 -> SBitsPerPixel; + } + else + GIF_EXIT("Neither Screen nor Image color map exists - GIF file 1."); + + if (GifFileIn2 -> IColorMap) { + ColorIn2 = GifFileIn2 -> IColorMap; + ColorIn2Size = 1 << GifFileIn2 -> IBitsPerPixel; + } + else if (GifFileIn2 -> SColorMap) { + ColorIn2 = GifFileIn2 -> SColorMap; + ColorIn2Size = 1 << GifFileIn2 -> SBitsPerPixel; + } + else + GIF_EXIT("Neither Screen nor Image color map exists - GIF file 2."); + + /* Create union of the two given color maps. ColorIn1 will be copied as */ + /* is while ColorIn2 will be mapped using ColorTransIn2 table. */ + /* ColorUnion is allocated by the procedure itself. */ + if (UnionColorMap(ColorIn1, ColorIn1Size, ColorIn2, ColorIn2Size, + &ColorUnion, &ColorUnionSize, ColorTransIn2) == GIF_ERROR) + GIF_EXIT("Unioned color map is two big (>256 colors)."); + + /* Dump out new image and screen descriptors: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn1 -> SWidth, GifFileIn1 -> SHeight, + ColorUnionSize, GifFileIn1 -> SBackGroundColor, + ColorUnionSize, ColorUnion) == GIF_ERROR) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + free((char *) ColorUnion); /* We dont need this any more... */ + + if (EGifPutImageDesc(GifFileOut, + GifFileIn1 -> ILeft, GifFileIn1 -> ITop, + GifFileIn1 -> IWidth, GifFileIn1 -> IHeight, + GifFileIn1 -> IInterlace, GifFileIn1 -> IBitsPerPixel, NULL) == GIF_ERROR) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + + + /* Time to do it: read 2 scan lines from 2 files (and optionally from */ + /* the mask file, merge them and them result out. Do it Height times: */ + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFileOut -> ILeft, GifFileOut -> ITop, + GifFileOut -> IWidth, GifFileOut -> IHeight); + for (i = 0; i < GifFileIn1 -> IHeight; i++) { + if (DGifGetLine(GifFileIn1, LineIn1, GifFileIn1 -> IWidth) == GIF_ERROR || + DGifGetLine(GifFileIn2, LineIn2, GifFileIn2 -> IWidth) == GIF_ERROR || + (MaskFlag && + DGifGetLine(GifMaskFile, LineMask, GifMaskFile -> IWidth) + == GIF_ERROR)) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + if (MaskFlag) { + /* Every time Mask has non background color, use LineIn1 pixel, */ + /* otherwise use LineIn2 pixel instead. */ + for (j = 0; j < GifFileIn1 -> IWidth; j++) { + if (LineMask[j] != GifMaskFile -> SBackGroundColor) + LineOut[j] = LineIn1[j]; + else + LineOut[j] = ColorTransIn2[LineIn2[j]]; + } + } + else { + /* Every time Color of Image 1 is equal to background - take it */ + /* From Image 2 instead of the background. */ + for (j = 0; j < GifFileIn1 -> IWidth; j++) { + if (LineIn1[j] != GifFileIn1 -> SBackGroundColor) + LineOut[j] = LineIn1[j]; + else + LineOut[j] = ColorTransIn2[LineIn2[j]]; + } + } + if (EGifPutLine(GifFileOut, LineOut, GifFileOut -> IWidth) + == GIF_ERROR) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); + GifQprintf("\b\b\b\b%-4d", i); + } + + if (DGifCloseFile(GifFileIn1) == GIF_ERROR || + DGifCloseFile(GifFileIn2) == GIF_ERROR || + EGifCloseFile(GifFileOut) == GIF_ERROR || + (MaskFlag && DGifCloseFile(GifMaskFile) == GIF_ERROR)) + QuitGifError(GifFileIn1, GifFileIn2, GifMaskFile, GifFileOut); +} + +/****************************************************************************** +* Read until first image in GIF file is detected and read its descriptor. * +******************************************************************************/ +static int ReadUntilImage(GifFileType *GifFile) +{ + int ExtCode; + GifRecordType RecordType; + GifByteType *Extension; + + /* Scan the content of the GIF file, until image descriptor is detected: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) + return GIF_ERROR; + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + return DGifGetImageDesc(GifFile); + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) + return GIF_ERROR; + + while (Extension != NULL) + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) + return GIF_ERROR; + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + return GIF_ERROR; /* We should be here - no image was found! */ +} + +/****************************************************************************** +* Create union of the two given color maps and return it. If result can not * +* fit into 256 colors, GIF_ERROR is returned, GIF_OK otherwise. * +* ColorIn1 is copied as it to ColorUnion, while colors from ColorIn2 are * +* copied iff they dont exists before. ColorTransIn2 is used to map old * +* ColorIn2 into ColorUnion color map table. * +******************************************************************************/ +static int UnionColorMap(GifColorType *ColorIn1, int ColorIn1Size, + GifColorType *ColorIn2, int ColorIn2Size, + GifColorType **ColorUnionPtr, int *ColorUnionSize, + GifPixelType ColorTransIn2[]) +{ + int i, j, CrntSlot; + GifColorType *ColorUnion; + + /* Allocate table which will hold result for sure: */ + *ColorUnionPtr = ColorUnion = (GifColorType *) malloc(sizeof(GifColorType) + * (ColorIn1Size > ColorIn2Size ? ColorIn1Size : ColorIn2Size) * 2); + + /* Copy ColorIn1 to ColorUnionSize; */ + for (i = 0; i < ColorIn1Size; i++) ColorUnion[i] = ColorIn1[i]; + CrntSlot = ColorIn1Size; /* Current Empty slot. */ + + /* Copy ColorIn2 to ColorUnionSize (use old colors if exists): */ + for (i = 0; i < ColorIn2Size && CrntSlot<=256; i++) { + /* Let see if this color already exists: */ + for (j = 0; j < ColorIn1Size; j++) { + /* If memcmp does not exists for you, use the following: */ + /* + if (ColorIn1[j].Red == ColorIn2[i].Red && + ColorIn1[j].Green == ColorIn2[i].Green && + ColorIn1[j].Blue == ColorIn2[i].Blue) break; + */ + if (memcmp(&ColorIn1[j], &ColorIn2[i], 3) == 0) break; + } + if (j < ColorIn1Size) { + /* We found this color aleardy exists in ColorIn1: */ + ColorTransIn2[i] = j; + } + else { + /* Its new - copy it to a new slot: */ + ColorUnion[CrntSlot] = ColorIn2[i]; + ColorTransIn2[i] = CrntSlot++; + } + } + + if (CrntSlot > 256) return GIF_ERROR; + + /* Complete the color map to a power of two: */ + for (i = 1; i <= 8; i++) if ((1 << i) >= CrntSlot) break; + for (j = CrntSlot; j < (1 << i); j++) + ColorUnion[j].Red = ColorUnion[j].Green = ColorUnion[j].Blue = 0; + + *ColorUnionSize = i; + + return GIF_OK; +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn1, GifFileType *GifFileIn2, + GifFileType *GifMaskFile, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn1 != NULL) DGifCloseFile(GifFileIn1); + if (GifFileIn2 != NULL) DGifCloseFile(GifFileIn2); + if (GifMaskFile != NULL) DGifCloseFile(GifMaskFile); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFDEBUG.DSK b/G/UTIL/GIFDEBUG.DSK new file mode 100644 index 0000000000000000000000000000000000000000..c2c13efbe2b8836e782793cfc6ff83138b57590b GIT binary patch literal 133 zcmWG3ElSE)a8_{6&nro-C{b|B%t=*{VqoMI5@(cRVBq@77|RgLz#z%M$N&VB)e@8- zbb&aCcCm`_^>=agjd61Ha&+;JagPZN@$`vt_jEIIa`)782I^W2#Qi{w9WpTd|Ifex E09Wi7TL1t6 literal 0 HcmV?d00001 diff --git a/G/UTIL/GIFDEBUG.PRJ b/G/UTIL/GIFDEBUG.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..c141fe11ef65cec48e1420a0faa116cc68c67e80 GIT binary patch literal 11417 zcmeI2`)?Fg6vxl(F0>#}K$g-6IMP)_<3fvo7GGt%ZI^W0(p{tADz;^*)k5pG-~%lc zU-*6{CjMeH8iFwhTY@0@ezzRtPl z+?kr*o$DVlV`fiony13#s3XnmsGl||1h;QK=Uf#8SCAbrf7q)&w8TW*mK1K$DPGmIaAA6ZS4KSB62@C)!Ogyst& zX5cpnerJUKKBps7KTYEi5M>Y-nX(lSQy6x^D)UCszJpcDa415W3Mt$i!F zbe3plOMq)%%b=|&T@GY`D}XD3ZNODPAJ7jB0Na5qumczbt_FsHVPGe)3m5@Lf$M-A zFb0eRyMaBx^}r3ljlfO7Uf^cn0pJ#30@w#k0=EMDf!l!FfjfXZfxCbMz}>(-z`ekI z!2Q63z(c^pz$3t;z}ZGCFZa=3QDc(Ynlp*6Sm!0J@eQ%&OgiSeOKy?c4bf<(GqLgL z`*gRkN{%7lId_pSCAS=t?%dsr`_)E>)-(|{8Z)SAEsL7C(71Xv(Hdi)=M%?Kc#g4* z&ivc{))uX?u4s+*MQfZ}w8nWwYcv5ON(&%9=lT)~OfZ2#`TLH`w`@$J*?#QQlj z62C0o)sl>Rt4|o|>r+d}N9P@UYW8(P8Xx5vC7jrQWeMM~jNXat*vRhOK-P?n>>Tx9 z#a_hH5?+x~H(0{49a&SxL}KUYNN(Kh9O}>Y<%arp`8=OU_LTHY87XyxKI1<2V&v%Z zbyO>`mOkU>8|d)e!Rl`+`7NE_h#UDGwms3-n@Vhr^I0g-nNjYh+1qTIMV0(1!M?2g zg?ssqhEBGzqjyH(?UHuwBm14f$F>UbHDVoYs*CW$2aHglF3=d*6xbHHA@ES(P~hdj zr-5$+bAqP^?U7j4VVY;GG+K>q#$MwfT@-xMuyv2oCjQ5t9B4Ux$tzVuG(Wj`iD0$h zV!^Or6}|NMJB#PhE2+(4%Svp_w8zsez3tHsq7GuBAX?Uzbq>|i^N03^x$Vkl7IE85 zZkx$%Gr4VM6^(Um4*R!_oe(= z#U`|MJjsp@b|VW*=DfCN+G1VlPOijDM)maj!AN+nnBg43lLTiA&Jtwj&> z7!qX9Vl6wbSflX12416=Z~S7B2oWp9td+huCc0Dh_!M!gr>PBTpHK3oRxMd zv;|W-)s|nCcXv5!ugIO%b#LH?sqMzyg1kYZ$A;n*4N={m;}y4yMSx{`|o$qc-@}{)VvP9USB939>rjDYb$!qQOUkwE5Xk_+%lS z&%}RjnZ1hR7J3pcUm{EzajkfWjDnYTUuUv zLA|hdDcf2qT3krCJ{1Ztpa&-}XI2%)2rd$b2kw zv&_>nXUqI8bGgjxGRMyo_N(%+A|D4>_bq&O8d24p1*zQF7(c_ z{qwI6g-cWR|NQ%y$I=|f{g1PMIU@X{h$!A*EgVA%^3uUO8p2WX*5NHxMp>^k2kR^6 z3Ok+Q7*$VOpYS?j`+YQ6BoeJWb}tm=1%fz&Hi3-0C99`&AzVsC)O*MMy15-AzuF(Bl*Ez1P z%XM$pb(+C-l@`xjDmA3(Dm|(d=={d0#x~f&iERZ8sGU9JJ@^47iQa*;((GsfRzguzi78m~7@)yt7!*~Dy literal 0 HcmV?d00001 diff --git a/G/UTIL/GIFFIX.C b/G/UTIL/GIFFIX.C new file mode 100644 index 0000000..0936ca2 --- /dev/null +++ b/G/UTIL/GIFFIX.C @@ -0,0 +1,215 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to attempt and fix broken GIF images. Currently fix the following: * +* 1. EOF terminates before end of image size (adds black in the end). * +* Options: * +* -q : quite printing mode. * +* -h : on line help * +****************************************************************************** +* History: * +* 5 May 91 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifFix" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifFix q%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0; + +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, ExtCode, ColorMapSize, Row, Col, Width, Height, + DarkestColor = 0, ColorIntens = 10000, HelpFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType LineBuffer; + GifColorType *ColorMap; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* Dump out exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + if ((LineBuffer = (GifRowType) malloc(GifFileIn -> SWidth)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (GifFileIn -> IInterlace) + GIF_EXIT("Cannt fix interlaced images."); + + Row = GifFileIn -> ITop; /* Image Position relative to Screen. */ + Col = GifFileIn -> ILeft; + Width = GifFileIn -> IWidth; + Height = GifFileIn -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + + /* Put the image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, Col, Row, Width, Height, + FALSE, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Find the darkest color in color map to use as a filler. */ + ColorMap = (GifFileIn -> IColorMap ? GifFileIn -> IColorMap : + GifFileIn -> SColorMap); + ColorMapSize = 1 << (GifFileIn -> IColorMap ? + GifFileIn -> IBitsPerPixel : + GifFileIn -> SBitsPerPixel); + for (i = 0; i < ColorMapSize; i++) { + j = ((int) ColorMap[i].Red) * 30 + + ((int) ColorMap[i].Green) * 59 + + ((int) ColorMap[i].Blue) * 11; + if (j < ColorIntens) { + ColorIntens = j; + DarkestColor = i; + } + } + + /* Load the image, and dump it. */ + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFileIn, LineBuffer, Width) + == GIF_ERROR) break; + if (EGifPutLine(GifFileOut, LineBuffer, Width) + == GIF_ERROR) QuitGifError(GifFileIn, GifFileOut); + } + + if (i < Height) { + fprintf(stderr, "\nFollowing error occured (and ignored):"); + PrintGifError(); + + /* Fill in with the darkest color in color map. */ + for (j = 0; j < Width; j++) + LineBuffer[j] = DarkestColor; + for (; i < Height; i++) + if (EGifPutLine(GifFileOut, LineBuffer, Width) + == GIF_ERROR) QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + fprintf(stderr, "\nFollowing unrecoverable error occured:"); + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFFLIP.C b/G/UTIL/GIFFLIP.C new file mode 100644 index 0000000..c84858b --- /dev/null +++ b/G/UTIL/GIFFLIP.C @@ -0,0 +1,341 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to rotate image 90 degrees to the right/left or flip the image * +* horizintally/vertically (mirror). * +* Options: * +* -q : quite printing mode. * +* -r : rotate 90 degrees to the right (default). * +* -l : rotate 90 degrees to the left. * +* -x : Mirror the image horizontally (first line switch places with last). * +* -y : Mirror the image vertically (first column switch places with last). * +* -h : on line help * +****************************************************************************** +* History: * +* 10 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifFlip" + +#define FLIP_NONE 0 +#define FLIP_RIGHT 1 +#define FLIP_LEFT 2 +#define FLIP_HORIZ 3 +#define FLIP_VERT 4 + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifFlip q%- r%- l%- x%- y%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- r%- l%- x%- y%- h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0; + +static int LoadImage(GifFileType *GifFile, GifRowType **ImageBuffer); +static int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer, + int Width, int Height, int FlipDirection); +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, Error, NumFiles, ExtCode, FlipDirection = FLIP_RIGHT, + RightFlag = FALSE, LeftFlag = FALSE, + HorizFlag = FALSE, VertFlag = FALSE, HelpFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ImageBuffer; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &RightFlag, &LeftFlag, &HorizFlag, &VertFlag, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if ((i = (RightFlag != 0) + (LeftFlag != 0) + + (HorizFlag != 0) + (VertFlag != 0)) > 1) + GIF_EXIT("Only one of -r, -l, -x, -y please."); + if (i == 0) + FlipDirection = FLIP_RIGHT; /* Make it the default. */ + else { + if (RightFlag) FlipDirection = FLIP_RIGHT; + if (LeftFlag) FlipDirection = FLIP_LEFT; + if (HorizFlag) FlipDirection = FLIP_HORIZ; + if (VertFlag) FlipDirection = FLIP_VERT; + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + if (RightFlag || LeftFlag) { + /* Dump out same screen information, but flip Screen Width/Height: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SHeight, GifFileIn -> SWidth, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Dump out exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (GifFileIn -> IInterlace) + GIF_EXIT("Cannt flip interlaced images - use GifInter first."); + + /* Put the image descriptor to out file: */ + if (RightFlag) { + /* Rotate to the right: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> SHeight - GifFileIn -> IHeight - + GifFileIn -> ITop, + GifFileIn -> ILeft, + GifFileIn -> IHeight, GifFileIn -> IWidth, + FALSE, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + else if (LeftFlag) { + /* Rotate to the left: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ITop, + GifFileIn -> SWidth - GifFileIn -> IWidth - + GifFileIn -> ILeft, + GifFileIn -> IHeight, GifFileIn -> IWidth, + FALSE, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* No rotation - only flipping vert. or horiz.: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + FALSE, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Load the image (either Interlaced or not), and dump it */ + /* fliped as requrested by Flags: */ + if (LoadImage(GifFileIn, &ImageBuffer) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (DumpImage(GifFileOut, ImageBuffer, GifFileIn -> IWidth, + GifFileIn -> IHeight, FlipDirection) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Routine to read Image out. The image can be Non interlaced only. * +* The memory required to hold the image is allocate by the routine itself. * +* Return GIF_OK if succesful, GIF_ERROR otherwise. * +******************************************************************************/ +static int LoadImage(GifFileType *GifFile, GifRowType **ImageBufferPtr) +{ + int Size, i; + GifRowType *ImageBuffer; + + /* Allocate the image as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + if ((ImageBuffer = (GifRowType *) + malloc(GifFile -> IHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> IWidth * sizeof(GifPixelType);/* One row size in bytes.*/ + for (i = 0; i < GifFile -> IHeight; i++) { + /* Allocate the rows: */ + if ((ImageBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + } + + *ImageBufferPtr = ImageBuffer; + + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + for (i = 0; i < GifFile -> IHeight; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, ImageBuffer[i], GifFile -> IWidth) + == GIF_ERROR) return GIF_ERROR; + } + + return GIF_OK; +} + +/****************************************************************************** +* Routine to dump image out. The given Image buffer should always hold the * +* image sequencially, and Width & Height hold image dimensions BEFORE flip. * +* Image will be dumped according to FlipDirection. * +* Once dumped, the memory holding the image is freed. * +* Return GIF_OK if succesful, GIF_ERROR otherwise. * +******************************************************************************/ +static int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer, + int Width, int Height, int FlipDirection) +{ + int i, j, Count; + GifRowType Line; /* New scan line is copied to it. */ + + /* Allocate scan line that will fit both image width and height: */ + if ((Line = (GifRowType) malloc((Width > Height ? Width : Height) + * sizeof(GifPixelType))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + switch (FlipDirection) { + case FLIP_RIGHT: + for (Count = Width, i = 0; i < Width; i++) { + GifQprintf("\b\b\b\b%-4d", Count--); + for (j = 0; j < Height; j++) + Line[j] = ImageBuffer[Height - j - 1][i]; + if (EGifPutLine(GifFile, Line, Height) == GIF_ERROR) + return GIF_ERROR; + } + break; + case FLIP_LEFT: + for (i = Width - 1; i >= 0; i--) { + GifQprintf("\b\b\b\b%-4d", i + 1); + for (j = 0; j < Height; j++) + Line[j] = ImageBuffer[j][i]; + if (EGifPutLine(GifFile, Line, Height) == GIF_ERROR) + return GIF_ERROR; + } + break; + case FLIP_HORIZ: + for (i = Height - 1; i >= 0; i--) { + GifQprintf("\b\b\b\b%-4d", i); + if (EGifPutLine(GifFile, ImageBuffer[i], Width) == GIF_ERROR) + return GIF_ERROR; + } + break; + case FLIP_VERT: + for (Count = Height, i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", Count--); + for (j = 0; j < Width; j++) + Line[j] = ImageBuffer[i][Width - j - 1]; + if (EGifPutLine(GifFile, Line, Width) == GIF_ERROR) + return GIF_ERROR; + } + break; + } + + /* Free the memory used for this image, and the temporary scan line: */ + for (i = 0; i < Height; i++) free((char *) ImageBuffer[i]); + free((char *) ImageBuffer); + + free((char *) Line); + + return GIF_OK; +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFHISTO.C b/G/UTIL/GIFHISTO.C new file mode 100644 index 0000000..fe4835c --- /dev/null +++ b/G/UTIL/GIFHISTO.C @@ -0,0 +1,264 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to create histogram of the colors used by the given GIF file. * +* Dumps out GIF file of constants size GIF_WIDTH by GIF_HEIGHT. * +* Options: * +* -q : quite printing mode. * +* -t : Dump out text instead of GIF - #Colors lines, each with #appearances. * +* -i W H : size of GIF image to generate. Colors of input GIF file are * +* spread homogeneously along Height, which better by dividable by the * +* number of colors in input image. * +* -n n : select image number to generate histogram to (1 by default). * +* -b : strip off background color count. * +* -h : on line help * +****************************************************************************** +* History: * +* 8 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifHisto" + +#define DEFAULT_HISTO_WIDTH 100 /* Histogram image diemnsions. */ +#define DEFAULT_HISTO_HEIGHT 256 +#define HISTO_BITS_PER_PIXEL 2 /* Size of bitmap for histogram GIF. */ + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifHisto q%- t%- s%-Width|Height!d!d n%-ImageNumber!d b%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- t%- s%-Width|Height!d!d n%-ImageNumber!d b%- h%- GifFile!*s"; +#endif /* SYSV */ + +static int + ImageWidth = DEFAULT_HISTO_WIDTH, + ImageHeight = DEFAULT_HISTO_HEIGHT, + ImageN = 1; +static GifColorType + HistoColorMap[] = { /* Constant bit map for histograms: */ + { 0, 0, 0 }, + { 255, 0, 0 }, + { 0, 255, 0 }, + { 0, 0, 255 } + }; + +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Size, Error, NumFiles, ExtCode, CodeSize, NumColors = 2, Color, + Count, ImageNum = 0, TextFlag = FALSE, SizeFlag = FALSE, + ImageNFlag = FALSE, BackGroundFlag = FALSE, HelpFlag = FALSE; + long Scaler, Histogram[256]; + GifRecordType RecordType; + GifByteType *Extension, *CodeBlock; + char **FileName = NULL; + GifRowType Line; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + /* Same image dimension vars for both Image & ImageN as only one allowed */ + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &TextFlag, &SizeFlag, &ImageWidth, &ImageHeight, + &ImageNFlag, &ImageN, &BackGroundFlag, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + for (i = 0; i < 256; i++) Histogram[i] = 0; /* Reset counters. */ + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + if (GifFileIn -> IColorMap) + NumColors = (1 << GifFileIn -> IBitsPerPixel); + else if (GifFileIn -> SColorMap) + NumColors = (1 << GifFileIn -> SBitsPerPixel); + else + GIF_EXIT("Neither Screen nor Image color map exists."); + + if ((ImageHeight / NumColors) * NumColors != ImageHeight) + GIF_EXIT("Image height specified not dividable by #colors."); + + if (++ImageNum == ImageN) { + /* This is the image we should make histogram for: */ + Line = (GifRowType) malloc(GifFileIn -> IWidth * + sizeof(GifPixelType)); + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ImageNum, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight); + + for (i = 0; i < GifFileIn -> IHeight; i++) { + if (DGifGetLine(GifFileIn, Line, GifFileIn -> IWidth) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + for (j = 0; j < GifFileIn -> IWidth; j++) + Histogram[Line[j]]++; + GifQprintf("\b\b\b\b%-4d", i); + } + + free((char *) Line); + } + else { + /* Skip the image: */ + /* Now read image itself in decoded form as we dont */ + /* really care what is there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + /* We we requested to kill back ground count: */ + if (BackGroundFlag) Histogram[GifFileIn -> SBackGroundColor] = 0; + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + + /* We may required to dump out the histogram as text file: */ + if (TextFlag) { + for (i = 0; i < NumColors; i++) + printf("%12ld %3d\n", Histogram[i], i); + } + else { + /* Open stdout for the histogram output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* Dump out screen descriptor to fit histogram dimensions: */ + if (EGifPutScreenDesc(GifFileOut, + ImageWidth, ImageHeight, HISTO_BITS_PER_PIXEL, 0, + HISTO_BITS_PER_PIXEL, HistoColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Dump out image descriptor to fit histogram dimensions: */ + if (EGifPutImageDesc(GifFileOut, + 0, 0, ImageWidth, ImageHeight, + FALSE, HISTO_BITS_PER_PIXEL, NULL) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Prepare scan line for histogram file, and find scaler to scale */ + /* histogram to be between 0 and ImageWidth: */ + Line = (GifRowType) malloc(ImageWidth * sizeof(GifPixelType)); + for (Scaler = 0, i = 0; i < NumColors; i++) if (Histogram[i] > Scaler) + Scaler = Histogram[i]; + Scaler /= ImageWidth; + if (Scaler == 0) Scaler = 1; /* In case maximum is less than width. */ + + /* Dump out the image itself: */ + for (Count = ImageHeight, i = 0, Color = 1; i < NumColors; i++) { + if ((Size = Histogram[i] / Scaler) > ImageWidth) Size = ImageWidth; + for (j = 0; j < Size; j++) + Line[j] = Color; + for (j = Size; j < ImageWidth; j++) + Line[j] = GifFileOut -> SBackGroundColor; + + /* Move to next color: */ + if (++Color >= (1 << HISTO_BITS_PER_PIXEL)) Color = 1; + + /* Dump this histogram entry as many times as required: */ + for (j = 0; j < ImageHeight / NumColors; j++) { + if (EGifPutLine(GifFileOut, Line, ImageWidth) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + GifQprintf("\b\b\b\b%-4d", Count--); + } + } + + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFINTER.C b/G/UTIL/GIFINTER.C new file mode 100644 index 0000000..4c30aa9 --- /dev/null +++ b/G/UTIL/GIFINTER.C @@ -0,0 +1,268 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to flip interlaced and non interlaced images in GIF files. * +* Options: * +* -q : quite printing mode. * +* -i : Force all images to be intelaced. * +* -s : Force all images to be sequencial (non interlaced). This is default. * +* -h : on line help * +****************************************************************************** +* History: * +* 5 Jul 89 - Version 1.0 by Gershon Elber. * +* 21 Dec 89 - Fix problems with -i and -s flags (Version 1.1). * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifInter" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifInter q%- i%- s%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- i%- s%- h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ImageNum = 0, + SequencialFlag = FALSE, + InterlacedFlag = FALSE, + HelpFlag = FALSE, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ + +static int LoadImage(GifFileType *GifFile, GifRowType **ImageBuffer); +static int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer); +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, ExtCode; + GifRecordType RecordType; + GifByteType *Extension; + char **FileName = NULL; + GifRowType *ImageBuffer; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &InterlacedFlag, &SequencialFlag, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* And dump out exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn -> SWidth, GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Put the image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + InterlacedFlag, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Load the image (either Interlaced or not), and dump it as */ + /* defined in GifFileOut -> IInterlaced. */ + if (LoadImage(GifFileIn, &ImageBuffer) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (DumpImage(GifFileOut, ImageBuffer) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Routine to read Image out. The image can be Interlaced or None interlaced. * +* The memory required to hold the image is allocate by the routine itself. * +* The image is always loaded sequencially into the buffer. * +* Return GIF_OK if succesful, GIF_ERROR otherwise. * +******************************************************************************/ +static int LoadImage(GifFileType *GifFile, GifRowType **ImageBufferPtr) +{ + int Size, i, j, Count; + GifRowType *ImageBuffer; + + /* Allocate the image as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + if ((ImageBuffer = (GifRowType *) + malloc(GifFile -> IHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> IWidth * sizeof(GifPixelType);/* One row size in bytes.*/ + for (i = 0; i < GifFile -> IHeight; i++) { + /* Allocate the rows: */ + if ((ImageBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + } + + *ImageBufferPtr = ImageBuffer; + + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = InterlacedOffset[i]; j < GifFile -> IHeight; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, ImageBuffer[j], GifFile -> IWidth) + == GIF_ERROR) return GIF_ERROR; + } + } + else { + for (i = 0; i < GifFile -> IHeight; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, ImageBuffer[i], GifFile -> IWidth) + == GIF_ERROR) return GIF_ERROR; + } + } + + return GIF_OK; +} + +/****************************************************************************** +* Routine to dump image out. The given Image buffer should always hold the * +* image sequencially. Image will be dumped according to IInterlaced flag in * +* GifFile structure. Once dumped, the memory holding the image is freed. * +* Return GIF_OK if succesful, GIF_ERROR otherwise. * +******************************************************************************/ +static int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer) +{ + int i, j, Count; + + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = GifFile -> IHeight, i = 0; i < 4; i++) + for (j = InterlacedOffset[i]; j < GifFile -> IHeight; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count--); + if (EGifPutLine(GifFile, ImageBuffer[j], GifFile -> IWidth) + == GIF_ERROR) return GIF_ERROR; + } + } + else { + for (Count = GifFile -> IHeight, i = 0; i < GifFile -> IHeight; i++) { + GifQprintf("\b\b\b\b%-4d", Count--); + if (EGifPutLine(GifFile, ImageBuffer[i], GifFile -> IWidth) + == GIF_ERROR) return GIF_ERROR; + } + } + + /* Free the m emory used for this image: */ + for (i = 0; i < GifFile -> IHeight; i++) free((char *) ImageBuffer[i]); + free((char *) ImageBuffer); + + return GIF_OK; +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFINTO.C b/G/UTIL/GIFINTO.C new file mode 100644 index 0000000..feadde6 --- /dev/null +++ b/G/UTIL/GIFINTO.C @@ -0,0 +1,159 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to read stdin, and save it into the specified file iff the result * +* and inspired by the rle utah tool kit I decided to implement and add it. * +* -q : quite printing mode. * +* -s minsize : the minimum file size to keep it. * +* -h : on line help. * +****************************************************************************** +* History: * +* 7 Jul 89 - Version 1.0 by Gershon Elber. * +* 22 Dec 89 - Fix problem with tmpnam (Version 1.1). * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifInto" + +#define DEFAULT_MIN_FILE_SIZE 14 /* More than GIF stamp + screen desc. */ +#define DEFAULT_OUT_NAME "GifInto.Gif" +#define DEFAULT_TMP_NAME "TempInto.$$$" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifInto q%- s%-MinFileSize!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- s%-MinFileSize!d h%- GifFile!*s"; +#endif /* SYSV */ + +static int + MinFileSize = DEFAULT_MIN_FILE_SIZE; + +/****************************************************************************** +* The is simply: read until EOF, then close the output, test its length, and * +* if non zero then rename it. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, + MinSizeFlag = FALSE, HelpFlag = FALSE; + char **FileName = NULL, + TmpName[80], FoutTmpName[80], FullPath[80], DefaultName[80], s[80], *p; + FILE *Fin, *Fout; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &MinSizeFlag, &MinFileSize, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles != 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* Open the stdin in binary mode and increase its buffer size: */ +#ifdef __MSDOS__ + setmode(0, O_BINARY); /* Make sure it is in binary mode. */ + if ((Fin = fdopen(0, "rb")) == NULL || /* Make it into a stream: */ + setvbuf(Fin, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE))/* Incr. stream buf.*/ +#else + if ((Fin = fdopen(0, "r")) == NULL) /* Make it into a stream: */ +#endif /* __MSDOS__ */ + GIF_EXIT("Failed to open input."); + + /* Isolate the directory where our destination is, and set tmp file name */ + /* in the very same directory. */ + strcpy(FullPath, *FileName); + if ((p = strrchr(FullPath, '/')) != NULL || + (p = strrchr(FullPath, '\\')) != NULL) + p[1] = 0; + else if ((p = strrchr(FullPath, ':')) != NULL) + p[1] = 0; + else + FullPath[0] = 0; /* No directory or disk specified. */ + + strcpy(FoutTmpName, FullPath); /* Generate destination temporary name. */ + /* Make sure the temporary is made in the current directory: */ + p = tmpnam(TmpName); + if (strrchr(p, '/')) p = strrchr(p, '/') + 1; + if (strrchr(p, '\\')) p = strrchr(p, '\\') + 1; + if (strlen(p) == 0) p = DEFAULT_TMP_NAME; + strcat(FoutTmpName, p); + +#ifdef __MSDOS__ + if ((Fout = fopen(FoutTmpName, "wb")) == NULL || + setvbuf(Fout, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE))/*Incr. stream buf.*/ +#else + if ((Fout = fopen(FoutTmpName, "w")) == NULL) +#endif /* __MSDOS__ */ + GIF_EXIT("Failed to open output."); + + while (!feof(Fin)) { + if (putc(getc(Fin), Fout) == EOF) + GIF_EXIT("Failed to write output."); + } + + fclose(Fin); + if (ftell(Fout) >= (long) MinFileSize) { + fclose(Fout); + unlink(*FileName); + if (rename(FoutTmpName, *FileName) != 0) { + strcpy(DefaultName, FullPath); + strcat(DefaultName, DEFAULT_OUT_NAME); + if (rename(FoutTmpName, DefaultName) == 0) { + sprintf(s, "Failed to rename out file - left as %s.", + DefaultName); + GIF_MESSAGE(s); + } + else { + unlink(FoutTmpName); + GIF_MESSAGE("Failed to rename out file - deleted."); + } + } + } + else { + fclose(Fout); + unlink(FoutTmpName); + GIF_MESSAGE("File too small - not renamed."); + } +} diff --git a/G/UTIL/GIFPOS.C b/G/UTIL/GIFPOS.C new file mode 100644 index 0000000..8f4841f --- /dev/null +++ b/G/UTIL/GIFPOS.C @@ -0,0 +1,202 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to reposition GIF file, by changing screen size and/or image(s) * +* position. Neither image(s) not colormap(s) are changed by any mean. * +* Options: * +* -q : quite printing mode. * +* -s w h : set new screen size - width & height. * +* -i t l : set new image position - top & left (for first image). * +* -n n w h : set new image position - top & left (for image number n). * +* -h : on line help. * +****************************************************************************** +* History: * +* 6 Jul 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifPos" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifPos q%- s%-Width|Height!d!d i%-Left|Top!d!d n%-n|Left|Top!d!d!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- s%-Width|Height!d!d i%-Left|Top!d!d n%-n|Left|Top!d!d!d h%- GifFile!*s"; +#endif /* SYSV */ + +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, ExtCode, CodeSize, ImageNum = 0, + ScreenFlag = FALSE, ScreenWidth, ScreenHeight, + ImageFlag = FALSE, ImageLeft, ImageTop, + ImageNFlag = FALSE, ImageN, ImageNLeft, ImageNTop, + HelpFlag = FALSE; + GifRecordType RecordType; + GifByteType *Extension, *CodeBlock; + char **FileName = NULL; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &ScreenFlag, &ScreenWidth, &ScreenHeight, + &ImageFlag, &ImageLeft, &ImageTop, + &ImageNFlag, &ImageN, &ImageNLeft, &ImageNTop, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* And dump out its new possible repositioned screen information: */ + if (EGifPutScreenDesc(GifFileOut, + ScreenFlag ? ScreenWidth : GifFileIn -> SWidth, + ScreenFlag ? ScreenHeight : GifFileIn -> SHeight, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put possibly repositioned image descriptor to out file: */ + if (++ImageNum == 1 && ImageFlag) { + /* First image should be repositioned: */ + if (EGifPutImageDesc(GifFileOut, + ImageLeft, ImageTop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + else if (ImageNum == ImageN && ImageNFlag) { + /* Image N should be repositioned: */ + if (EGifPutImageDesc(GifFileOut, + ImageNLeft, ImageNTop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* No repositioning for this image: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn -> ILeft, GifFileIn -> ITop, + GifFileIn -> IWidth, GifFileIn -> IHeight, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + + /* Now read image itself in decoded form as we dont really */ + /* care what we have there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR || + EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) { + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFROTAT.C b/G/UTIL/GIFROTAT.C new file mode 100644 index 0000000..d130ca3 --- /dev/null +++ b/G/UTIL/GIFROTAT.C @@ -0,0 +1,322 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Aug. 1991 * +****************************************************************************** +* Program to rotate a GIF image by an arbitrary angle. * +* Options: * +* -q : quite printing mode. * +* -a Angle : angle to rotate with respect to the X axis. * +* -s Width Height : specifies size of output image. * +* -h : on line help. * +****************************************************************************** +* History: * +* 2 Aug 91 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* M_PI */ + +#define PROGRAM_NAME "GifRotat" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifRotat a!-Angle!d q%- s%-Width|Height!d!d h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " a!-Angle!d q%- s%-Width|Height!d!d h%- GifFile!*s"; +#endif /* SYSV */ + +static int + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ + +static void RotateGifImage(GifRowType *ScreenBuffer, GifFileType *SrcGifFile, + int Angle, GifColorType *ColorMap, + int ExpColorMapSize, int DstWidth, int DstHeight); +static void RotateGifLine(GifRowType *ScreenBuffer, int BackGroundColor, + int SrcWidth, int SrcHeight, + int Angle, GifRowType DstLine, + int DstWidth, int DstHeight, int y); +static void QuitGifError(GifFileType *DstGifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Size, Error, NumFiles, Col, Row, Count, ExtCode, + ExpColorMapSize, DstWidth, DstHeight, Width, Height, + ImageNum = 0, + DstSizeFlag = FALSE, + AngleFlag = FALSE, + Angle = 0, + HelpFlag = FALSE; + char **FileName = NULL; + GifRecordType RecordType; + GifByteType *Extension; + GifFileType *GifFile; + GifRowType *ScreenBuffer; + GifColorType *ColorMap = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &AngleFlag, &Angle, &GifQuitePrint, + &DstSizeFlag, &DstWidth, &DstHeight, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Allocate the screen as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + /* Note this screen is device independent - its the screen as defined by */ + /* the GIF file parameters itself. */ + if ((ScreenBuffer = (GifRowType *) + malloc(GifFile -> SHeight * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile -> SWidth * sizeof(GifPixelType);/* Size in bytes one row.*/ + if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) /* First row. */ + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < GifFile -> SWidth; i++) /* Set its color to BackGround. */ + ScreenBuffer[0][i] = GifFile -> SBackGroundColor; + for (i = 1; i < GifFile -> SHeight; i++) { + /* Allocate the other rows, and set their color to background too: */ + if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); + } + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + Row = GifFile -> ITop; /* Image Position relative to Screen. */ + Col = GifFile -> ILeft; + Width = GifFile -> IWidth; + Height = GifFile -> IHeight; + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, Col, Row, Width, Height); + if (GifFile -> ILeft + GifFile -> IWidth > GifFile -> SWidth || + GifFile -> ITop + GifFile -> IHeight > GifFile -> SHeight) { + fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); + exit(-2); + } + if (GifFile -> IInterlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = Row + InterlacedOffset[i]; j < Row + Height; + j += InterlacedJumps[i]) { + GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], + Width) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + ColorMap = (GifFile -> IColorMap ? GifFile -> IColorMap : + GifFile -> SColorMap); + ExpColorMapSize = GifFile -> IColorMap ? GifFile -> IBitsPerPixel : + GifFile -> SBitsPerPixel; + + if (!DstSizeFlag) { + DstWidth = GifFile -> SWidth; + DstHeight = GifFile -> SHeight; + } + + /* Perform the actual rotation and dump the image: */ + RotateGifImage(ScreenBuffer, GifFile, Angle, ColorMap, ExpColorMapSize, + DstWidth, DstHeight); +} + +/****************************************************************************** +* Save the GIF resulting image. * +******************************************************************************/ +static void RotateGifImage(GifRowType *ScreenBuffer, GifFileType *SrcGifFile, + int Angle, GifColorType *ColorMap, + int ExpColorMapSize, int DstWidth, int DstHeight) +{ + int i, + LineSize = DstWidth * sizeof(GifPixelType); + GifFileType *DstGifFile; + GifRowType LineBuffer; + + if ((LineBuffer = (GifRowType) malloc(LineSize)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + /* Open stdout for the output file: */ + if ((DstGifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(DstGifFile); + + if (EGifPutScreenDesc(DstGifFile, DstWidth, DstHeight, + ExpColorMapSize, 0, ExpColorMapSize, + ColorMap) == GIF_ERROR || + EGifPutImageDesc(DstGifFile, 0, 0, DstWidth, DstHeight, + FALSE, ExpColorMapSize, NULL) == GIF_ERROR) + QuitGifError(DstGifFile); + + for (i = 0; i < DstHeight; i++) { + RotateGifLine(ScreenBuffer, SrcGifFile -> SBackGroundColor, + SrcGifFile -> SWidth, SrcGifFile -> SHeight, + Angle, LineBuffer, DstWidth, DstHeight, i); + if (EGifPutLine(DstGifFile, LineBuffer, DstWidth) == GIF_ERROR) + QuitGifError(DstGifFile); + GifQprintf("\b\b\b\b%-4d", DstHeight - i - 1); + } + + if (EGifCloseFile(DstGifFile) == GIF_ERROR) + QuitGifError(DstGifFile); +} + + +/****************************************************************************** +* Save the GIF resulting image. * +******************************************************************************/ +static void RotateGifLine(GifRowType *ScreenBuffer, int BackGroundColor, + int SrcWidth, int SrcHeight, + int Angle, GifRowType DstLine, + int DstWidth, int DstHeight, int y) +{ + int x, + TransSrcX = SrcWidth / 2, + TransSrcY = SrcHeight / 2, + TransDstX = DstWidth / 2, + TransDstY = DstHeight / 2; + double SinAngle = sin(Angle * M_PI / 180.0), + CosAngle = cos(Angle * M_PI / 180.0); + + for (x = 0; x < DstWidth; x++) + { + int xc = x - TransDstX, + yc = y - TransDstY, + SrcX = xc * CosAngle - yc * SinAngle + TransSrcX, + SrcY = xc * SinAngle + yc * CosAngle + TransSrcY; + + if (SrcX < 0 || SrcX >= SrcWidth || + SrcY < 0 || SrcY >= SrcHeight) + { + /* Out of the source image domain - set it to background color. */ + *DstLine++ = BackGroundColor; + } + else + *DstLine++ = ScreenBuffer[SrcY][SrcX]; + } +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *DstGifFile) +{ + PrintGifError(); + if (DstGifFile != NULL) EGifCloseFile(DstGifFile); + exit(1); +} diff --git a/G/UTIL/GIFRSIZE.C b/G/UTIL/GIFRSIZE.C new file mode 100644 index 0000000..1f69070 --- /dev/null +++ b/G/UTIL/GIFRSIZE.C @@ -0,0 +1,306 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to resize GIF by given factors horizontally and vertically. * +* Options: * +* -q : quite printing mode. * +* -S x y : scale into size as specified by x and y. * +* -s r : resize both x & y direction by factor r. * +* -x r : resize the x direction (horizontally) by factor r. * +* -y r : resize the y direction (vertically) by factor r. * +* -h : on line help. * +****************************************************************************** +* History: * +* 4 Jul 89 - Version 1.0 by Gershon Elber. * +* 22 Dec 89 - Fix minor bag in discarding last line of input (Version 1.1). * +* 3 Aug 91 - make it scale by an arbitrary size value. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifRSize" + +#define MAX_SCALE 16.0 /* Maximum scaling factor. */ + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifRSize q%- S%-X|Y!d!d s%-Scale!F x%-XScale!F y%-YScale!F h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- S%-X|Y!d!d s%-Scale!F x%-XScale!F y%-YScale!F h%- GifFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static GifPixelType + BackGroundColor = 0; +static double + XScale = 0.5, + YScale = 0.5; +static int + XSize = 0, + YSize = 0; + +static void ResizeLine(GifRowType LineIn, GifRowType LineOut, + int InLineLen, int OutLineLen); +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, iy, last_iy, l, t, w, h, Error, NumFiles, ExtCode, + ImageNum = 0, + SizeFlag = FALSE, + ScaleFlag = FALSE, + XScaleFlag = FALSE, + YScaleFlag = FALSE, + HelpFlag = FALSE; + double Scale, y; + GifRecordType RecordType; + char s[80]; + GifByteType *Extension; + GifRowType LineIn, LineOut; + char **FileName = NULL; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &SizeFlag, &XSize, &YSize, &ScaleFlag, &Scale, + &XScaleFlag, &XScale, &YScaleFlag, &YScale, + &HelpFlag, &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* If specific direction was set, set other direction to 1: */ + if (!XScaleFlag && YScaleFlag) XScale = 1.0; + if (!YScaleFlag && XScaleFlag) YScale = 1.0; + + /* If the specific direction was not set, but global one did use it: */ + if (!XScaleFlag && ScaleFlag) XScale = Scale; + if (!YScaleFlag && ScaleFlag) YScale = Scale; + + if (XScale > MAX_SCALE) { + sprintf(s, "XScale too big, maximum scale selected instead (%d).", + MAX_SCALE); + GIF_MESSAGE(s); + XScale = MAX_SCALE; + } + if (YScale > MAX_SCALE) { + sprintf(s, "YScale too big, maximum scale selected instead (%d).", + MAX_SCALE); + GIF_MESSAGE(s); + YScale = MAX_SCALE; + } + + if (NumFiles == 1) { + if ((GifFileIn = DGifOpenFileName(*FileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + else { + /* Use the stdin instead: */ + if ((GifFileIn = DGifOpenFileHandle(0)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + BackGroundColor = GifFileIn -> SBackGroundColor; + + /* If size was specified, it is used to derive the scale: */ + if (SizeFlag) { + XScale = XSize / ((double) GifFileIn -> SWidth); + YScale = YSize / ((double) GifFileIn -> SHeight); + } + else + { + XSize = (int) (GifFileIn -> SWidth * XScale + 0.5); + YSize = (int) (GifFileIn -> SHeight * YScale + 0.5); + } + + /* As at this time we know the Screen size of the input gif file, and as */ + /* all image(s) in file must be less/equal to it, we can allocate the */ + /* scan lines for the input file, and output file. The number of lines */ + /* to allocate for each is set by ScaleDown & XScale & YScale: */ + LineOut = (GifRowType) malloc(XSize * sizeof(GifPixelType)); + LineIn = (GifRowType) malloc(GifFileIn -> SWidth * sizeof(GifPixelType)); + + /* Open stdout for the output file: */ + if ((GifFileOut = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + /* And dump out its new scaled screen information: */ + if (EGifPutScreenDesc(GifFileOut, XSize, YSize, + GifFileIn -> SColorResolution, GifFileIn -> SBackGroundColor, + GifFileIn -> SBitsPerPixel, GifFileIn -> SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put the image descriptor to out file: */ + l = (int) (GifFileIn -> ILeft * XScale + 0.5); + w = (int) (GifFileIn -> IWidth * XScale + 0.5); + t = (int) (GifFileIn -> ITop * YScale + 0.5); + h = (int) (GifFileIn -> IHeight * YScale + 0.5); + if (l < 0) l = 0; + if (t < 0) t = 0; + if (l + w > XSize) w = XSize - l; + if (t + h > YSize) h = YSize - t; + + if (EGifPutImageDesc(GifFileOut, l, t, w, h, + GifFileIn -> IInterlace, GifFileIn -> IBitsPerPixel, + GifFileIn -> IColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + if (GifFileIn -> IInterlace) { + GIF_EXIT("Cannt resize interlaced images - use GifInter first."); + } + else { + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, + GifFileOut -> ILeft, GifFileOut -> ITop, + GifFileOut -> IWidth, GifFileOut -> IHeight); + + for (i = GifFileIn -> IHeight, y = 0.0, last_iy = -1; + i-- > 0; + y += YScale) { + if (DGifGetLine(GifFileIn, LineIn, + GifFileIn -> IWidth) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + iy = (int) y; + if (last_iy < iy && last_iy < YSize) { + ResizeLine(LineIn, LineOut, + GifFileIn -> IWidth, GifFileOut -> IWidth); + + for (; + last_iy < iy && last_iy < GifFileOut -> IHeight - 1; + last_iy++) { + GifQprintf("\b\b\b\b%-4d", last_iy + 1); + if (EGifPutLine(GifFileOut, LineOut, + GifFileOut -> IWidth) == + GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + } + } + + /* If scale is not dividable - dump last lines: */ + while (++last_iy < GifFileOut -> IHeight) { + GifQprintf("\b\b\b\b%-4d", last_iy); + if (EGifPutLine(GifFileOut, LineOut, + GifFileOut -> IWidth) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + } + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + free(LineOut); + free(LineIn); +} + +/****************************************************************************** +* Line resizing routine - scale given lines as follows: * +* Scale (by pixel duplication/elimination) from InLineLen to OutLineLen. * +******************************************************************************/ +static void ResizeLine(GifRowType LineIn, GifRowType LineOut, + int InLineLen, int OutLineLen) +{ + int i, ix, last_ix; + double x; + + OutLineLen--; + + for (i = InLineLen, x = 0.0, last_ix = -1; + i-- > 0; + x += XScale, LineIn++) + { + ix = (int) x; + for (; last_ix < ix && last_ix < OutLineLen; last_ix++) + *LineOut++ = *LineIn; + } + + /* Make sure the line is complete. */ + for (LineIn--; last_ix < OutLineLen; last_ix++) + *LineOut++ = *LineIn; +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); + exit(1); +} diff --git a/G/UTIL/GIFTEXT.C b/G/UTIL/GIFTEXT.C new file mode 100644 index 0000000..eeee457 --- /dev/null +++ b/G/UTIL/GIFTEXT.C @@ -0,0 +1,459 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jun. 1989 * +****************************************************************************** +* Program to dump GIF file content as TEXT information * +* Options: * +* -q : quite printing mode. * +* -c : include the color maps as well. * +* -e : include encoded information packed as bytes as well. * +* -z : include encoded information (12bits) codes as result from the zl alg. * +* -p : dump pixel information instead of encoded information. * +* -r : same as -p but dump one pixel as one byte in binary form with no * +* other information. This will create a file of size Width by Height. * +* -h : on line help. * +****************************************************************************** +* History: * +* 28 Jun 89 - Version 1.0 by Gershon Elber. * +* 21 Dec 89 - Fix segmentation fault problem in PrintCodeBlock (Version 1.1) * +* 25 Dec 89 - Add the -r flag for raw output. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifText" + +#define MAKE_PRINTABLE(c) (isprint(c) ? (c) : ' ') + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifText q%- c%- e%- z%- p%- r%- h%- GifFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- c%- e%- z%- p%- r%- h%- GifFile!*s"; +#endif /* SYSV */ + +static void PrintCodeBlock(GifFileType *GifFile, GifByteType *CodeBlock, int Reset); +static void PrintPixelBlock(GifByteType *PixelBlock, int Len, int Reset); +static void PrintExtBlock(GifByteType *Extension, int Reset); +static void PrintLZCodes(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, ExtCode, CodeSize, Error, NumFiles, Len, + ColorMapFlag = FALSE, EncodedFlag = FALSE, LZCodesFlag = FALSE, + PixelFlag = FALSE, HelpFlag = FALSE, RawFlag = FALSE, ImageNum = 1; + char *GifFileName, **FileName = NULL; + GifPixelType *Line; + GifRecordType RecordType; + GifByteType *CodeBlock, *Extension; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &ColorMapFlag, &EncodedFlag, + &LZCodesFlag, &PixelFlag, &RawFlag, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (NumFiles == 1) { + GifFileName = *FileName; + if ((GifFile = DGifOpenFileName(*FileName)) == NULL) { + PrintGifError(); + exit(-1); + } + } + else { + /* Use the stdin instead: */ + GifFileName = "Stdin"; + if ((GifFile = DGifOpenFileHandle(0)) == NULL) { + PrintGifError(); + exit(-1); + } + } + + /* Because we write binary data - make sure no text will be written. */ + if (RawFlag) { + ColorMapFlag = EncodedFlag = LZCodesFlag = PixelFlag = FALSE; +#ifdef __MSDOS__ + setmode(1, O_BINARY); /* Make sure it is in binary mode. */ +#endif /* __MSDOS__ */ + } + else { + printf("\n%s:\n\n\tScreen Size - Width = %d, Height = %d.\n", + GifFileName, GifFile -> SWidth, GifFile -> SHeight); + printf("\tColorResolution = %d, BitsPerPixel = %d, BackGround = %d.\n", + GifFile -> SColorResolution, GifFile -> SBitsPerPixel, + GifFile -> SBackGroundColor); + if (GifFile -> SColorMap) + printf("\tHas Global Color Map.\n\n"); + else + printf("\tNo Global Color Map.\n\n"); + if (ColorMapFlag && GifFile -> SColorMap) { + printf("\tGlobal Color Map:\n"); + Len = 1 << GifFile -> SBitsPerPixel; + for (i = 0; i < Len; i+=4) { + for (j = 0; j < 4 && j < Len; j++) { + printf("%3d: %02xh %02xh %02xh ", i + j, + GifFile -> SColorMap[i + j].Red, + GifFile -> SColorMap[i + j].Green, + GifFile -> SColorMap[i + j].Blue); + } + printf("\n"); + } + } + } + + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + if (!RawFlag) { + printf("\nImage #%d:\n\n\tImage Size - Left = %d, Top = %d, Width = %d, Height = %d.\n", + ImageNum++, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + printf("\tImage is %s", + GifFile -> IInterlace ? "Interlaced" : + "Non Interlaced"); + if (GifFile -> IColorMap != NULL) + printf(", BitsPerPixel = %d.\n", + GifFile -> IBitsPerPixel); + else + printf(".\n"); + if (GifFile -> IColorMap) + printf("\tImage Has Color Map.\n"); + else + printf("\tNo Image Color Map.\n"); + if (ColorMapFlag && GifFile -> IColorMap) { + Len = 1 << GifFile -> IBitsPerPixel; + for (i = 0; i < Len; i+=4) { + for (j = 0; j < 4 && j < Len; j++) { + printf("%3d: %02xh %02xh %02xh ", i + j, + GifFile -> IColorMap[i + j].Red, + GifFile -> IColorMap[i + j].Green, + GifFile -> IColorMap[i + j].Blue); + } + printf("\n"); + } + } + } + + if (EncodedFlag) { + if (DGifGetCode(GifFile, &CodeSize, &CodeBlock) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + printf("\nImage LZ compressed Codes (Code Size = %d):\n", + CodeSize); + PrintCodeBlock(GifFile, CodeBlock, TRUE); + while (CodeBlock != NULL) { + if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + PrintCodeBlock(GifFile, CodeBlock, FALSE); + } + } + else if (LZCodesFlag) { + PrintLZCodes(GifFile); + } + else if (PixelFlag) { + Line = (GifPixelType *) malloc(GifFile -> IWidth * + sizeof(GifPixelType)); + for (i = 0; i < GifFile -> IHeight; i++) { + if (DGifGetLine(GifFile, Line, GifFile -> IWidth) + == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + PrintPixelBlock(Line, GifFile -> IWidth, i == 0); + } + PrintPixelBlock(NULL, GifFile -> IWidth, FALSE); + free((char *) Line); + } + else if (RawFlag) { + Line = (GifPixelType *) malloc(GifFile -> IWidth * + sizeof(GifPixelType)); + for (i = 0; i < GifFile -> IHeight; i++) { + if (DGifGetLine(GifFile, Line, GifFile -> IWidth) + == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + fwrite(Line, 1, GifFile -> IWidth, stdout); + } + free((char *) Line); + } + else { + /* Skip the image: */ + if (DGifGetCode(GifFile, &CodeSize, &CodeBlock) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + while (CodeBlock != NULL) { + if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + } + + } + break; + case EXTENSION_RECORD_TYPE: + if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + if (!RawFlag) { + printf("\nExtension Record (Ext Code = %d [%c]):\n", + ExtCode, MAKE_PRINTABLE(ExtCode)); + PrintExtBlock(Extension, TRUE); + } + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + PrintExtBlock(Extension, FALSE); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFile) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + + if (!RawFlag) printf("\nGif file terminated normally.\n"); +} + +/****************************************************************************** +* Print the given CodeBlock - a string in pascal notation (size in first * +* place). Save local information so printing can be performed continuously, * +* or reset to start state if Reset. If CodeBlock is NULL, output is flushed * +******************************************************************************/ +static void PrintCodeBlock(GifFileType *GifFile, GifByteType *CodeBlock, int Reset) +{ + static int CrntPlace = 0, Print = TRUE; + static long CodeCount = 0; + char c; + int i, Percent, Len; + long NumBytes; + + if (Reset || CodeBlock == NULL) { + if (CodeBlock == NULL) { + if (CrntPlace > 0) { + if (Print) printf("\n"); + CodeCount += CrntPlace - 16; + } + if (GifFile -> IColorMap) + NumBytes = ((((long) GifFile -> IWidth) * GifFile -> IHeight) + * GifFile -> IBitsPerPixel) / 8; + else + NumBytes = ((((long) GifFile -> IWidth) * GifFile -> IHeight) + * GifFile -> SBitsPerPixel) / 8; + Percent = 100 * CodeCount / NumBytes; + printf("\nCompression ratio: %ld/%ld (%d%%).\n", + CodeCount, NumBytes, Percent); + return; + } + CrntPlace = 0; + CodeCount = 0; + Print = TRUE; + } + + Len = CodeBlock[0]; + for (i = 1; i <= Len; i++) { + if (CrntPlace == 0) { + if (Print) printf("\n%05lxh: ", CodeCount); + CodeCount += 16; + } +#ifdef __MSDOS__ + if (kbhit() && ((c = getch()) == 'q' || c == 'Q')) Print = FALSE; +#endif /* __MSDOS__ */ + if (Print) printf(" %02xh", CodeBlock[i]); + if (++CrntPlace >= 16) CrntPlace = 0; + } +} + +/****************************************************************************** +* Print the given Extension - a string in pascal notation (size in first * +* place). Save local information so printing can be performed continuously, * +* or reset to start state if Reset. If Extension is NULL, output is flushed * +******************************************************************************/ +static void PrintExtBlock(GifByteType *Extension, int Reset) +{ + static int CrntPlace = 0, Print = TRUE; + static long ExtCount = 0; + static char HexForm[49], AsciiForm[17]; + char c; + int i, Len; + + if (Reset || Extension == NULL) { + if (Extension == NULL) { + if (CrntPlace > 0) { + HexForm[CrntPlace * 3] = 0; + AsciiForm[CrntPlace] = 0; + if (Print) printf("\n%05lx: %-49s %-17s\n", + ExtCount, HexForm, AsciiForm); + return; + } + else if (Print) + printf("\n"); + } + CrntPlace = 0; + ExtCount = 0; + Print = TRUE; + } + + if (!Print) return; + + Len = Extension[0]; + for (i = 1; i <= Len; i++) { + sprintf(&HexForm[CrntPlace * 3], " %02x", Extension[i]); + sprintf(&AsciiForm[CrntPlace], "%c", MAKE_PRINTABLE(Extension[i])); +#ifdef __MSDOS__ + if (kbhit() && ((c = getch()) == 'q' || c == 'Q')) Print = FALSE; +#endif /* __MSDOS__ */ + if (++CrntPlace == 16) { + HexForm[CrntPlace * 3] = 0; + AsciiForm[CrntPlace] = 0; + if (Print) printf("\n%05lx: %-49s %-17s", + ExtCount, HexForm, AsciiForm); + ExtCount += 16; + CrntPlace = 0; + } + } +} + +/****************************************************************************** +* Print the given PixelBlock of length Len. * +* Save local information so printing can be performed continuously, * +* or reset to start state if Reset. If PixelBlock is NULL, output is flushed * +******************************************************************************/ +static void PrintPixelBlock(GifByteType *PixelBlock, int Len, int Reset) +{ + static int CrntPlace = 0, Print = TRUE; + static long ExtCount = 0; + static char HexForm[49], AsciiForm[17]; + char c; + int i; + + if (Reset || PixelBlock == NULL) { + if (PixelBlock == NULL) { + if (CrntPlace > 0) { + HexForm[CrntPlace * 3] = 0; + AsciiForm[CrntPlace] = 0; + if (Print) printf("\n%05lx: %-49s %-17s\n", + ExtCount, HexForm, AsciiForm); + } + else if (Print) + printf("\n"); + } + CrntPlace = 0; + ExtCount = 0; + Print = TRUE; + if (PixelBlock == NULL) return; + } + + if (!Print) return; + + for (i = 0; i < Len; i++) { + sprintf(&HexForm[CrntPlace * 3], " %02x", PixelBlock[i]); + sprintf(&AsciiForm[CrntPlace], "%c", MAKE_PRINTABLE(PixelBlock[i])); +#ifdef __MSDOS__ + if (kbhit() && ((c = getch()) == 'q' || c == 'Q')) Print = FALSE; +#endif /* __MSDOS__ */ + if (++CrntPlace == 16) { + HexForm[CrntPlace * 3] = 0; + AsciiForm[CrntPlace] = 0; + if (Print) printf("\n%05lx: %-49s %-17s", + ExtCount, HexForm, AsciiForm); + ExtCount += 16; + CrntPlace = 0; + } + } +} + +/****************************************************************************** +* Print the image as LZ codes (each 12bits), until EOF marker is reached. * +******************************************************************************/ +static void PrintLZCodes(GifFileType *GifFile) +{ + char c; + int Code, Print = TRUE, CrntPlace = 0; + long CodeCount = 0; + + do { + if (Print && CrntPlace == 0) printf("\n%05lx:", CodeCount); + if (DGifGetLZCodes(GifFile, &Code) == GIF_ERROR) { + PrintGifError(); + exit(-1); + } + if (Print && Code >= 0) + printf(" %03x", Code); /* EOF Code is returned as -1. */ + CodeCount++; + if (++CrntPlace >= 16) CrntPlace = 0; +#ifdef __MSDOS__ + if (kbhit() && ((c = getch()) == 'q' || c == 'Q')) Print = FALSE; +#endif /* __MSDOS__ */ + } + while (Code >= 0); +} diff --git a/G/UTIL/GIFWEDGE.C b/G/UTIL/GIFWEDGE.C new file mode 100644 index 0000000..e86a44e --- /dev/null +++ b/G/UTIL/GIFWEDGE.C @@ -0,0 +1,168 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to create a test image of White and Red/Green/Blue levels for * +* test purposes. The Primary (RGB) and Secondary (YCM) are also displayed. * +* background. * +* Options: * +* -q : quite printing mode. * +* -s Width Height : set image size. * +* -l levels : number of color levels. * +* -h : on line help. * +****************************************************************************** +* History: * +* 4 Jan 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "GifWedge" + +#define DEFAULT_WIDTH 640 +#define DEFAULT_HEIGHT 350 + +#define DEFAULT_NUM_LEVELS 16 /* Number of colors to gen the image. */ + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "GifWedge q%- l%-#Lvls!d s%-Width|Height!d!d h%-"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- l%-#Lvls!d s%-Width|Height!d!d h%-"; +#endif /* SYSV */ + +static int + NumLevels = DEFAULT_NUM_LEVELS, + ImageWidth = DEFAULT_WIDTH, + ImageHeight = DEFAULT_HEIGHT; + +static void QuitGifError(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, l, c, Error, LevelStep, LogNumLevels, + Count = 0, LevelsFlag = FALSE, SizeFlag = FALSE, HelpFlag = FALSE; + GifRowType Line; + GifColorType *ColorMap; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &LevelsFlag, &NumLevels, + &SizeFlag, &ImageWidth, &ImageHeight, + &HelpFlag)) != FALSE) { + GAPrintErrMsg(Error); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + /* Make sure the number of levels is power of 2 (up to 32 levels.). */ + for (i = 1; i < 6; i++) if (NumLevels == (1 << i)) break; + if (i == 6) GIF_EXIT("#Lvls (-l option) is not power of 2 up to 32."); + LogNumLevels = i + 3; /* Multiple by 8 (see below). */ + LevelStep = 256 / NumLevels; + + /* Make sure the image dimension is a multiple of NumLevels horizontally */ + /* and 7 (White, Red, Green, Blue and Yellow Cyan Magenta) vertically. */ + ImageWidth = (ImageWidth / NumLevels) * NumLevels; + ImageHeight = (ImageHeight / 7) * 7; + + /* Open stdout for the output file: */ + if ((GifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFile); + + /* Dump out screen description with given size and generated color map: */ + /* The color map has 7 NumLevels colors for White, Red, Green and then */ + /* The secondary colors Yellow Cyan and magenta. */ + if ((ColorMap = (GifColorType *) + malloc(8 * NumLevels * sizeof(GifColorType))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < 8; i++) /* Set color map. */ + for (j = 0; j < NumLevels; j++) { + l = LevelStep * j; + c = i * NumLevels + j; + ColorMap[c].Red = (i == 0 || i == 1 || i == 4 || i == 6) * l; + ColorMap[c].Green = (i == 0 || i == 2 || i == 4 || i == 5) * l; + ColorMap[c].Blue = (i == 0 || i == 3 || i == 5 || i == 6) * l; + } + + if (EGifPutScreenDesc(GifFile, + ImageWidth, ImageHeight, LogNumLevels, 0, LogNumLevels, ColorMap) + == GIF_ERROR) + QuitGifError(GifFile); + + /* Dump out the image descriptor: */ + if (EGifPutImageDesc(GifFile, + 0, 0, ImageWidth, ImageHeight, FALSE, LogNumLevels, NULL) == GIF_ERROR) + QuitGifError(GifFile); + + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + /* Allocate one scan line to be used for all image. */ + if ((Line = (GifRowType) malloc(sizeof(GifPixelType) * ImageWidth)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + /* Dump the pixels: */ + for (c = 0; c < 7; c++) { + for (i = 0, l = 0; i < NumLevels; i++) + for (j = 0; j < ImageWidth / NumLevels; j++) + Line[l++] = i + NumLevels * c; + for (i = 0; i < ImageHeight / 7; i++) { + if (EGifPutLine(GifFile, Line, ImageWidth) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Count++); + } + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) DGifCloseFile(GifFile); + exit(1); +} diff --git a/G/UTIL/GIF_LIB.H b/G/UTIL/GIF_LIB.H new file mode 100644 index 0000000..d4b9834 --- /dev/null +++ b/G/UTIL/GIF_LIB.H @@ -0,0 +1,178 @@ +/****************************************************************************** +* In order to make life a little bit easier when using the GIF file format, * +* this library was written, and which does all the dirty work... * +* * +* Written by Gershon Elber, Jun. 1989 * +******************************************************************************* +* History: * +* 14 Jun 89 - Version 1.0 by Gershon Elber. * +* 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). * +******************************************************************************/ + +#ifndef GIF_LIB_H +#define GIF_LIB_H + +#define GIF_LIB_VERSION " Version 1.2, " + +#define GIF_ERROR 0 +#define GIF_OK 1 + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */ + +typedef int GifBooleanType; +typedef unsigned char GifPixelType; +typedef unsigned char * GifRowType; +typedef unsigned char GifByteType; + +#define GIF_MESSAGE(Msg) fprintf(stderr, "\n%s: %s\n", PROGRAM_NAME, Msg) +#define GIF_EXIT(Msg) { GIF_MESSAGE(Msg); exit(-3); } + +#ifdef SYSV +#define VoidPtr char * +#else +#define VoidPtr void * +#endif /* SYSV */ + +typedef struct GifColorType { + GifByteType Red, Green, Blue; +} GifColorType; + +/* Note entries prefixed with S are of Screen information, while entries */ +/* prefixed with I are of the current defined Image. */ +typedef struct GifFileType { + int SWidth, SHeight, /* Screen dimensions. */ + SColorResolution, SBitsPerPixel, /* How many colors can we generate? */ + SBackGroundColor, /* I hope you understand this one... */ + ILeft, ITop, IWidth, IHeight, /* Current image dimensions. */ + IInterlace, /* Sequential/Interlaced lines. */ + IBitsPerPixel; /* How many colors this image has? */ + GifColorType *SColorMap, *IColorMap; /* NULL if not exists. */ + VoidPtr Private; /* The regular user should not mess with this one! */ +} GifFileType; + +typedef enum { + UNDEFINED_RECORD_TYPE, + SCREEN_DESC_RECORD_TYPE, + IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ + EXTENSION_RECORD_TYPE, /* Begin with '!' */ + TERMINATE_RECORD_TYPE /* Begin with ';' */ +} GifRecordType; + +/* DumpScreen2Gif routine constants identify type of window/screen to dump. */ +/* Note all values below 1000 are reserved for the IBMPC different display */ +/* devices (it has many!) and are compatible with the numbering TC2.0 */ +/* (Turbo C 2.0 compiler for IBM PC) gives to these devices. */ +typedef enum { + GIF_DUMP_SGI_WINDOW = 1000, + GIF_DUMP_X_WINDOW = 1001 +} GifScreenDumpType; + +/****************************************************************************** +* O.k. here are the routines one can access in order to encode GIF file: * +* (GIF_LIB file EGIF_LIB.C). * +******************************************************************************/ + +GifFileType *EGifOpenFileName(char *GifFileName, int GifTestExistance); +GifFileType *EGifOpenFileHandle(int GifFileHandle); +void EGifSetGifVersion(char *Version); +int EGifPutScreenDesc(GifFileType *GifFile, + int GifWidth, int GifHeight, int GifColorRes, int GifBackGround, + int GifBitsPerPixel, GifColorType *GifColorMap); +int EGifPutImageDesc(GifFileType *GifFile, + int GifLeft, int GifTop, int Width, int GifHeight, int GifInterlace, + int GifBitsPerPixel, GifColorType *GifColorMap); +int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int EGifPutPixel(GifFileType *GifFile, GifPixelType GifPixel); +int EGifPutComment(GifFileType *GifFile, char *GifComment); +int EGifPutExtension(GifFileType *GifFile, int GifExtCode, int GifExtLen, + VoidPtr GifExtension); +int EGifPutCode(GifFileType *GifFile, int GifCodeSize, + GifByteType *GifCodeBlock); +int EGifPutCodeNext(GifFileType *GifFile, GifByteType *GifCodeBlock); +int EGifCloseFile(GifFileType *GifFile); + +#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ +#define E_GIF_ERR_WRITE_FAILED 2 +#define E_GIF_ERR_HAS_SCRN_DSCR 3 +#define E_GIF_ERR_HAS_IMAG_DSCR 4 +#define E_GIF_ERR_NO_COLOR_MAP 5 +#define E_GIF_ERR_DATA_TOO_BIG 6 +#define E_GIF_ERR_NOT_ENOUGH_MEM 7 +#define E_GIF_ERR_DISK_IS_FULL 8 +#define E_GIF_ERR_CLOSE_FAILED 9 +#define E_GIF_ERR_NOT_WRITEABLE 10 + +/****************************************************************************** +* O.k. here are the routines one can access in order to decode GIF file: * +* (GIF_LIB file DGIF_LIB.C). * +******************************************************************************/ + +GifFileType *DGifOpenFileName(char *GifFileName); +GifFileType *DGifOpenFileHandle(int GifFileHandle); +int DGifGetScreenDesc(GifFileType *GifFile); +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); +int DGifGetImageDesc(GifFileType *GifFile); +int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); +int DGifGetComment(GifFileType *GifFile, char *GifComment); +int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, + GifByteType **GifExtension); +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); +int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, + GifByteType **GifCodeBlock); +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); +int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); +int DGifCloseFile(GifFileType *GifFile); + +#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ +#define D_GIF_ERR_READ_FAILED 102 +#define D_GIF_ERR_NOT_GIF_FILE 103 +#define D_GIF_ERR_NO_SCRN_DSCR 104 +#define D_GIF_ERR_NO_IMAG_DSCR 105 +#define D_GIF_ERR_NO_COLOR_MAP 106 +#define D_GIF_ERR_WRONG_RECORD 107 +#define D_GIF_ERR_DATA_TOO_BIG 108 +#define D_GIF_ERR_NOT_ENOUGH_MEM 109 +#define D_GIF_ERR_CLOSE_FAILED 110 +#define D_GIF_ERR_NOT_READABLE 111 +#define D_GIF_ERR_IMAGE_DEFECT 112 +#define D_GIF_ERR_EOF_TOO_SOON 113 + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file QUANTIZE.C. * +******************************************************************************/ +int QuantizeBuffer(unsigned int Width, unsigned int Height, int *ColorMapSize, + GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput, + GifByteType *OutputBuffer, GifColorType *OutputColorMap); + + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file QPRINTF.C. * +******************************************************************************/ +extern int GifQuitePrint; + +#ifdef USE_VARARGS +void GifQprintf(); +#else +void GifQprintf(char *Format, ...); +#endif /* USE_VARARGS */ + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file GIF_ERR.C. * +******************************************************************************/ +void PrintGifError(void); +int GifLastError(void); + +/****************************************************************************** +* O.k. here are the routines from GIF_LIB file DEV2GIF.C. * +******************************************************************************/ +int DumpScreen2Gif(char *FileName, int ReqGraphDriver, int ReqGraphMode1, + int ReqGraphMode2, + int ReqGraphMode3); + +#endif /* GIF_LIB_H */ diff --git a/G/UTIL/HERC2GIF.C b/G/UTIL/HERC2GIF.C new file mode 100644 index 0000000..93c6ee3 --- /dev/null +++ b/G/UTIL/HERC2GIF.C @@ -0,0 +1,26 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jun. 1989 * +****************************************************************************** +* Program to dump the hercules graphic screen into a GIF file * +****************************************************************************** +* History: * +* 26 Jun 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#include +#include "gif_lib.h" + +#define DEFAULT_NAME "hercules.gif" + +/****************************************************************************** +* Simple - isnt it? * +******************************************************************************/ +void main(int argc, char **argv) +{ + if (argc == 2) + DumpScreen2Gif(argv[1], HERCMONO, HERCMONOHI, 0, 0); + else + DumpScreen2Gif(DEFAULT_NAME, HERCMONO, HERCMONOHI, 0, 0); +} diff --git a/G/UTIL/M.BAT b/G/UTIL/M.BAT new file mode 100644 index 0000000..77dea68 --- /dev/null +++ b/G/UTIL/M.BAT @@ -0,0 +1 @@ +make -fmakefile.tc \ No newline at end of file diff --git a/G/UTIL/MAKDEBUG.TC b/G/UTIL/MAKDEBUG.TC new file mode 100644 index 0000000..0741f50 --- /dev/null +++ b/G/UTIL/MAKDEBUG.TC @@ -0,0 +1,72 @@ +# +# This is the make file for the util subdirectory of the GIF library +# In order to run it tcc is assumed to be available, in addition to +# tlib and borland make. +# +# Usage: "make [-DMDL=model]" where model can be l (large) or c (compact) etc. +# Note the MDL is optional with large model as default. +# +# +# This make file requires: +# 1. Setting the TC libraries directory as CC_LIBS below. Make sure this +# is really short (because of DOS stupid limit on command line length). +# 2. Setting the executables destination directory as DEST below. Make +# sure that directory do exists. +# 2. Making new library named graphbgi.lib holds the drivers for the different +# devices (using bgiobj.exe and tlib.exe utilities). +# +# Gershon Elber, Jun 1989 +# + + +# Works only on TC++ 1.0 make - swap out make before invoking command. +.SWAP + +# Your C compiler +CC = bcc + +# MDL set? +!if !$d(MDL) +MDL=l +!endif + +# Where all the include files are: +INC = ..\lib +GIF_INC = $(INC)\gif_lib.h $(INC)\getarg.h + +# And libararies: +GIF_LIB = ..\lib\gif_lib$(MDL).lib +CC_LIBS = ..\lib\\ +LIBS = $(GIF_LIB) $(CC_LIBS)graphics.lib $(CC_LIBS)graphbgi.lib \ + $(CC_LIBS)emu.lib $(CC_LIBS)math$(MDL).lib + +# Note the tcc xxxxxx.tc files enables ALL warnings for more strict tests so +# you should use them during debuging. I didnt add it here as command lines +# are limited to 128 chars... +# +# Optimized version: +CFLAGS = -m$(MDL) -a- -f -G -O -r -c -d -w -v- -y- -k- -M- +#CFLAGS = ml -a- -f -G -O- -r -c -d -w -v- -y- -k- -M- +# +# Debugging version: +# CFLAGS = -m$(MDL) -a- -f -c -d -w -v -y -k -M- +# LFLAGS = -lvlc + +ALL = gifdebug.exe + +all: $(ALL) + +# +# Note we go all the way to the exe file using this rule. +# +# LZEXE is an EXE compressor program. If you dont have it remove the two +# lines of 'lzexe $&.exe' and 'del $&.old'. +# +.c.obj: + $(CC) -I$(INC) $(CFLAGS) $&.c + $(CC) -m$(MDL) $(LFLAGS) $&.obj $(LIBS) + del gifdebug.exe + ren gifhn.exe gifdebug.exe + +gifdebug.exe: gifhn.obj +gifhn.obj: $(GIF_INC) diff --git a/G/UTIL/MAKEFILE.TC b/G/UTIL/MAKEFILE.TC new file mode 100644 index 0000000..b775ec1 --- /dev/null +++ b/G/UTIL/MAKEFILE.TC @@ -0,0 +1,158 @@ +# +# This is the make file for the util subdirectory of the GIF library +# In order to run it tcc is assumed to be available, in addition to +# tlib and borland make. +# +# Usage: "make [-DMDL=model]" where model can be l (large) or c (compact) etc. +# Note the MDL is optional with large model as default. +# +# +# This make file requires: +# 1. Setting the TC libraries directory as CC_LIBS below. Make sure this +# is really short (because of DOS stupid limit on command line length). +# 2. Setting the executables destination directory as DEST below. Make +# sure that directory do exists. +# 2. Making new library named graphbgi.lib holds the drivers for the different +# devices (using bgiobj.exe and tlib.exe utilities). +# +# Gershon Elber, Jun 1989 +# + + +# Works only on TC++ 1.0 make and up - swap out make before invoking command. +.SWAP + +# Your C compiler +CC = bcc + +# MDL set? +!if !$d(MDL) +MDL=l +!endif + +# Where all the include files are: +##################################################################### +##################################################################### +INC = E:\ +##################################################################### +##################################################################### +GIF_INC = e:\gif_lib.h e:\getarg.h +# $(INC)\gif_lib.h $(INC)\getarg.h + +# And libararies: +GIF_LIB = e:\gif_lib$(MDL).lib +CC_LIBS = e:\ +BGI_LIB = e:\graphbgi.lib +LIBS = $(GIF_LIB) $(CC_LIBS)graphics.lib $(BGI_LIB) \ + $(CC_LIBS)emu.lib $(CC_LIBS)math$(MDL).lib + +# Where to copy executables to: +DEST = ..\gif + +# Note the tcc xxxxxx.tc files enables ALL warnings for more strict tests so +# you should use them during debuging. I didnt add it here as command lines +# are limited to 128 chars... +# +# Optimized version: +CFLAGS = -m$(MDL) -a- -f -G -O -r -c -d -w -v- -y- -k- -M- +# +# Debugging version: +# CFLAGS = -m$(MDL) -a- -f -c -d -w -v -y -k -M- +# LFLAGS = -lvlc + +ALL = $(DEST)\gif2bgi.exe $(DEST)\gif2epsn.exe $(DEST)\gif2herc.exe \ + $(DEST)\gif2ps.exe $(DEST)\gif2rgb.exe $(DEST)\gifasm.exe \ + $(DEST)\gifbg.exe $(DEST)\gifclip.exe $(DEST)\gifclrmp.exe \ + $(DEST)\gifcomb.exe $(DEST)\giffix.exe $(DEST)\gifflip.exe \ + $(DEST)\gifhisto.exe $(DEST)\gifinter.exe $(DEST)\gifinto.exe \ + $(DEST)\gifpos.exe $(DEST)\gifrotat.exe $(DEST)\gifrsize.exe \ + $(DEST)\giftext.exe $(DEST)\gifwedge.exe $(DEST)\herc2gif.exe \ + $(DEST)\raw2gif.exe $(DEST)\rgb2gif.exe $(DEST)\text2gif.exe + +allexe: $(ALL) + +# +# Note we go all the way to the exe file using this rule. +# +# LZEXE is an EXE compressor program. If you dont have it remove the two +# lines of 'lzexe $&.exe' and 'del $&.old'. +# +.c.obj: + $(CC) $(CFLAGS) -I$(INC) $&.c + $(CC) -m$(MDL) $(LFLAGS) $&.obj $(LIBS) +# lzexe $&.exe +# del $&.old +# copy $&.exe $(DEST) +# del $&.exe + +$(DEST)\gif2bgi.exe: gif2bgi.obj +gif2bgi.obj: $(GIF_INC) + +$(DEST)\gif2epsn.exe: gif2epsn.obj +gif2epsn.obj: $(GIF_INC) + +$(DEST)\gif2herc.exe: gif2herc.obj $(GIF_LIB) +gif2herc.obj: $(GIF_INC) + +$(DEST)\gif2ps.exe: gif2ps.obj $(GIF_LIB) +gif2ps.obj: $(GIF_INC) + +$(DEST)\gif2rgb.exe: gif2rgb.obj $(GIF_LIB) +gif2rgb.obj: $(GIF_INC) + +$(DEST)\gifasm.exe: gifasm.obj $(GIF_LIB) +gifasm.obj: $(GIF_INC) + +$(DEST)\gifbg.exe: gifbg.obj $(GIF_LIB) +gifbg.obj: $(GIF_INC) + +$(DEST)\gifclip.exe: gifclip.obj $(GIF_LIB) +gifclip.obj: $(GIF_INC) + +$(DEST)\gifclrmp.exe: gifclrmp.c gifclrmp.obj $(GIF_LIB) +gifclrmp.obj: $(GIF_INC) + +$(DEST)\gifcomb.exe: gifcomb.obj $(GIF_LIB) +gifcomb.obj: $(GIF_INC) + +$(DEST)\giffix.exe: giffix.obj $(GIF_LIB) +giffix.obj: $(GIF_INC) + +$(DEST)\gifflip.exe: gifflip.obj $(GIF_LIB) +gifflip.obj: $(GIF_INC) + +$(DEST)\gifhisto.exe: gifhisto.obj $(GIF_LIB) +gifhisto.obj: $(GIF_INC) + +$(DEST)\gifinter.exe: gifinter.obj $(GIF_LIB) +gifinter.obj: $(GIF_INC) + +$(DEST)\gifinto.exe: gifinto.obj $(GIF_LIB) +gifinto.obj: $(GIF_INC) + +$(DEST)\gifpos.exe: gifpos.obj $(GIF_LIB) +gifpos.obj: $(GIF_INC) + +$(DEST)\gifrotat.exe: gifrotat.obj $(GIF_LIB) +gifrotat.obj: $(GIF_INC) + +$(DEST)\gifrsize.exe: gifrsize.obj $(GIF_LIB) +gifrsize.obj: $(GIF_INC) + +$(DEST)\giftext.exe: giftext.obj $(GIF_LIB) +giftext.obj: $(GIF_INC) + +$(DEST)\gifwedge.exe: gifwedge.obj $(GIF_LIB) +gifwedge.obj: $(GIF_INC) + +$(DEST)\herc2gif.exe: herc2gif.obj $(GIF_LIB) +herc2gif.obj: $(GIF_INC) + +$(DEST)\raw2gif.exe: raw2gif.obj $(GIF_LIB) +raw2gif.obj: $(GIF_INC) + +$(DEST)\rgb2gif.exe: rgb2gif.obj $(GIF_LIB) +rgb2gif.obj: $(GIF_INC) + +$(DEST)\text2gif.exe: text2gif.obj $(GIF_LIB) +text2gif.obj: $(GIF_INC) diff --git a/G/UTIL/MAKEFILE.UNX b/G/UTIL/MAKEFILE.UNX new file mode 100644 index 0000000..2f7732c --- /dev/null +++ b/G/UTIL/MAKEFILE.UNX @@ -0,0 +1,189 @@ +# +# This is the make file for the util subdirectory of the GIF library +# In order to run it gcc is assumed to be available (gnu c compiler) +# You may try other c compilers but the must support ansi c! +# +# Usage: "make -f makefile.unx [all] [rle] [iris] +# +# This make file is for Unix BSD type of machines. +# +# Gershon Elber, Dec 1989 +# + +# +# If you have the utah raster tool kit and wants conversion routines to and +# from it set the ones below properly. +# +RLE_INC = -I/u/urt/urt3.0/include +RLE_LIB = /u/urt/urt3.0/lib/librle.a +X_LIB_DIR = /server/sun4/usr/new/lib/X11R4 + +# Where are all the include files and libraryies for the gif utils: +INC = -I../lib +GIF_LIB = ../lib/libgif.a +GIF_LIB_DEPEND = ../lib/libgif.a ../lib/gif_lib.h ../lib/getarg.h + +# Where to copy executables to: +DEST = ../bin + +# +# These are the flags for gcc, in BSD4.3 or Sun O.S. 4.0.3 +# +# If your system has all function prototypes for gcc, replace all +# the -Wxxx with -Wall. I can not add -Wimplicit as my system uses old cc +# h files. +# +# +# CC = gcc +# +# CFLAGS = -O -c -W -Wreturn-type -Wcomment +# CFLAGS = -g -pg -c -W -Wreturn-type -Wcomment +# +# for sun 4 (gunnars@ifi.uib.no). Tested using gcc 1.39. +# +# CFLAGS = -O -c -sun4 -W -Wreturn-type -Wcomment -DUSE_VARARGS +# CFLAGS = -g -c -sun4 -W -Wreturn-type -Wcomment -DUSE_VARARGS +# +# MORELIBS = + +# +# These are the flags for cc on SGI iris4d. O.S. IRIX 3.2. Note you must +# Define MORELIBS as well. +# +CC = cc +# +CFLAGS = -O -c -DSYSV -DNO_VOID_PTR -Olimit 1000 -Wf,-XNh5000 -Wf,-XNd5000 -G 4 +# CFLAGS = -g -p -c -DSYSV -DNO_VOID_PTR -Olimit 1000 -Wf,-XNh5000 -Wf,-XNd5000 -G 4 +# MORELIBS = -lbsd + +# +# These are the flags for xlc, ansi compiler for IBM R6000 +# +# CC = xlc +# +# CFLAGS = -O -c -qnoro -D_POSIX_SOURCE -D_ALL_SOURCE -DR6000 +# CFLAGS = -g -pg -c -qnoro -D_POSIX_SOURCE -D_ALL_SOURCE -DR6000 +# MORELIBS = + + +ALL = $(DEST)/gif2epsn $(DEST)/gif2ps $(DEST)/gif2rgb \ + $(DEST)/gif2x11 $(DEST)/gifasm $(DEST)/gifbg \ + $(DEST)/gifclip $(DEST)/gifclrmp $(DEST)/gifcomb \ + $(DEST)/giffix $(DEST)/gifflip $(DEST)/gifhisto \ + $(DEST)/gifinter $(DEST)/gifinto $(DEST)/gifpos \ + $(DEST)/gifrotat $(DEST)/gifrsize $(DEST)/giftext \ + $(DEST)/gifwedge $(DEST)/raw2gif $(DEST)/rgb2gif \ + $(DEST)/text2gif + +RLE = $(DEST)/gif2rle $(DEST)/rle2gif + +IRIS = $(DEST)/gif2iris + +.c.o: + $(CC) $(CFLAGS) $(INC) $(RLE_INC) $< + +all: $(ALL) +rle: $(RLE) +iris: $(IRIS) + +$(DEST)/gif2epsn: gif2epsn.o $(GIF_LIB_DEPEND) + $(CC) gif2epsn.o -o gif2epsn $(GIF_LIB) + mv -f gif2epsn $(DEST) + +$(DEST)/gif2iris: gif2iris.o $(GIF_LIB_DEPEND) + $(CC) gif2iris.o -o gif2iris $(GIF_LIB) -lgl_s + mv -f gif2iris $(DEST) + +$(DEST)/gif2ps: gif2ps.o $(GIF_LIB_DEPEND) + $(CC) gif2ps.o -o gif2ps $(GIF_LIB) + mv -f gif2ps $(DEST) + +$(DEST)/gif2rgb: gif2rgb.o $(GIF_LIB_DEPEND) + $(CC) gif2rgb.o -o gif2rgb $(GIF_LIB) + mv -f gif2rgb $(DEST) + +$(DEST)/gif2x11: gif2x11.o $(GIF_LIB_DEPEND) + $(CC) gif2x11.o -o gif2x11 $(GIF_LIB) -L$(X_LIB_DIR) -lX11 $(MORELIBS) + mv -f gif2x11 $(DEST) + +$(DEST)/gifasm: gifasm.o $(GIF_LIB_DEPEND) + $(CC) gifasm.o -o gifasm $(GIF_LIB) + mv -f gifasm $(DEST) + +$(DEST)/gifbg: gifbg.o $(GIF_LIB_DEPEND) + $(CC) gifbg.o -o gifbg $(GIF_LIB) + mv -f gifbg $(DEST) + +$(DEST)/gifclip: gifclip.o $(GIF_LIB_DEPEND) + $(CC) gifclip.o -o gifclip $(GIF_LIB) + mv -f gifclip $(DEST) + +$(DEST)/gifclrmp: gifclrmp.o $(GIF_LIB_DEPEND) + $(CC) gifclrmp.o -o gifclrmp $(GIF_LIB) -lm + mv -f gifclrmp $(DEST) + +$(DEST)/gifcomb: gifcomb.o $(GIF_LIB_DEPEND) + $(CC) gifcomb.o -o gifcomb $(GIF_LIB) + mv -f gifcomb $(DEST) + +$(DEST)/giffix: giffix.o $(GIF_LIB_DEPEND) + $(CC) giffix.o -o giffix $(GIF_LIB) + mv -f giffix $(DEST) + +$(DEST)/gifflip: gifflip.o $(GIF_LIB_DEPEND) + $(CC) gifflip.o -o gifflip $(GIF_LIB) + mv -f gifflip $(DEST) + +$(DEST)/gifhisto: gifhisto.o $(GIF_LIB_DEPEND) + $(CC) gifhisto.o -o gifhisto $(GIF_LIB) + mv -f gifhisto $(DEST) + +$(DEST)/gifinter: gifinter.o $(GIF_LIB_DEPEND) + $(CC) gifinter.o -o gifinter $(GIF_LIB) + mv -f gifinter $(DEST) + +$(DEST)/gifinto: gifinto.o $(GIF_LIB_DEPEND) + $(CC) gifinto.o -o gifinto $(GIF_LIB) + mv -f gifinto $(DEST) + +$(DEST)/gifpos: gifpos.o $(GIF_LIB_DEPEND) + $(CC) gifpos.o -o gifpos $(GIF_LIB) + mv -f gifpos $(DEST) + +$(DEST)/gifrotat: gifrotat.o $(GIF_LIB_DEPEND) + $(CC) gifrotat.o -o gifrotat $(GIF_LIB) -lm + mv -f gifrotat $(DEST) + +$(DEST)/gifrsize: gifrsize.o $(GIF_LIB_DEPEND) + $(CC) gifrsize.o -o gifrsize $(GIF_LIB) + mv -f gifrsize $(DEST) + +$(DEST)/giftext: giftext.o $(GIF_LIB_DEPEND) + $(CC) giftext.o -o giftext $(GIF_LIB) + mv -f giftext $(DEST) + +$(DEST)/gifwedge: gifwedge.o $(GIF_LIB_DEPEND) + $(CC) gifwedge.o -o gifwedge $(GIF_LIB) + mv -f gifwedge $(DEST) + +$(DEST)/raw2gif: raw2gif.o $(GIF_LIB_DEPEND) + $(CC) raw2gif.o -o raw2gif $(GIF_LIB) + mv -f raw2gif $(DEST) + +$(DEST)/text2gif: text2gif.o $(GIF_LIB_DEPEND) + $(CC) text2gif.o -o text2gif $(GIF_LIB) + mv -f text2gif $(DEST) + +$(DEST)/rgb2gif: rgb2gif.o $(GIF_LIB_DEPEND) + $(CC) rgb2gif.o -o rgb2gif $(GIF_LIB) + mv -f rgb2gif $(DEST) + +# +# The utah raster toolkit conversion routines: +# +$(DEST)/gif2rle: gif2rle.o $(GIF_LIB_DEPEND) + $(CC) gif2rle.o -o gif2rle $(GIF_LIB) $(RLE_LIB) + mv -f gif2rle $(DEST) +$(DEST)/rle2gif: rle2gif.o $(GIF_LIB_DEPEND) + $(CC) rle2gif.o -o rle2gif $(GIF_LIB) $(RLE_LIB) + mv -f rle2gif $(DEST) diff --git a/G/UTIL/RAW2GIF.C b/G/UTIL/RAW2GIF.C new file mode 100644 index 0000000..8968939 --- /dev/null +++ b/G/UTIL/RAW2GIF.C @@ -0,0 +1,254 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jun. 1989 * +****************************************************************************** +* Module to conver raw image into a GIF file. * +* Options: * +* -q : quite printing mode. * +* -s Width Height : specifies size of raw image. * +* -p ColorMapFile : specifies color map for ray image (see gifclrmp). * +* -h : on line help. * +****************************************************************************** +* History: * +* 15 Oct 89 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "getarg.h" +#include "gif_lib.h" + +#define PROGRAM_NAME "Raw2Gif" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Raw2Gif q%- s!-Width|Height!d!d p%-ColorMapFile!s h%- RawFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- s!-Width|Height!d!d p%-ColorMapFile!s h%- RawFile!*s"; +#endif /* SYSV */ + +static GifColorType EGAPallete[] = /* Default color map is EGA pallete. */ +{ + { 0, 0, 0 }, /* 0. Black */ + { 0, 0, 170 }, /* 1. Blue */ + { 0, 170, 0 }, /* 2. Green */ + { 0, 170, 170 }, /* 3. Cyan */ + { 170, 0, 0 }, /* 4. Red */ + { 170, 0, 170 }, /* 5. Magenta */ + { 170, 170, 0 }, /* 6. Brown */ + { 170, 170, 170 }, /* 7. LightGray */ + { 85, 85, 85 }, /* 8. DarkGray */ + { 85, 85, 255 }, /* 9. LightBlue */ + { 85, 255, 85 }, /* 10. LightGreen */ + { 85, 255, 255 }, /* 11. LightCyan */ + { 255, 85, 85 }, /* 12. LightRed */ + { 255, 85, 255 }, /* 13. LightMagenta */ + { 255, 255, 85 }, /* 14. Yellow */ + { 255, 255, 255 }, /* 15. White */ +}; +#define EGA_PALLETE_SIZE (sizeof(EGAPallete) / sizeof(GifColorType)) + +int Raw2Gif(int ImagwWidth, int ImagwHeight, + GifColorType *ColorMap, int ColorMapSize); +static int HandleGifError(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line, prepar global data and call the Gif routines. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, ImageWidth, ImageHeight, Dummy, Red, Green, Blue, + ColorMapSize, InFileHandle, + ImageSizeFlag = FALSE, ColorMapFlag = FALSE, HelpFlag = FALSE; + char **FileName = NULL, *ColorMapFile; + GifColorType *ColorMap; + FILE *InColorMapFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &ImageSizeFlag, &ImageWidth, &ImageHeight, + &ColorMapFlag, &ColorMapFile, + &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (ColorMapFlag) { + /* Read color map from given file: */ + if ((InColorMapFile = fopen(ColorMapFile, "rt")) == NULL) { + GIF_MESSAGE("Failed to open COLOR MAP file (not exists!?)."); + exit(2); + } + if ((ColorMap = (GifColorType *) + malloc(sizeof(GifColorType) * 255)) /* Biggest map. */ + == NULL) { + GIF_MESSAGE("Failed to allocate bitmap, aborted."); + exit(3); + } + + for (ColorMapSize = 0; + ColorMapSize < 256 && !feof(InColorMapFile); + ColorMapSize++) { + fscanf(InColorMapFile, "%3d %3d %3d %3d\n", + &Dummy, &Red, &Green, &Blue); + ColorMap[ColorMapSize].Red = Red; + ColorMap[ColorMapSize].Green = Green; + ColorMap[ColorMapSize].Blue = Blue; + } + } + else { + ColorMap = EGAPallete; + ColorMapSize = EGA_PALLETE_SIZE; + } + + if (NumFiles == 1) { +#ifdef __MSDOS__ + if ((InFileHandle = open(*FileName, O_RDONLY | O_BINARY)) == -1) { +#else + if ((InFileHandle = open(*FileName, O_RDONLY)) == -1) { +#endif /* __MSDOS__ */ + GIF_MESSAGE("Failed to open RAW image file (not exists!?)."); + exit(2); + } + dup2(InFileHandle, 0); /* Make stdin from this file. */ + } + else { +#ifdef __MSDOS__ + setmode(0, O_BINARY); /* Make sure it is in binary mode. */ +#endif /* __MSDOS__ */ + } + +#ifdef __MSDOS__ + setvbuf(stdin, NULL, _IOFBF, GIF_FILE_BUFFER_SIZE); +#endif /* __MSDOS__ */ + + /* Conver Raw image from stdin to Gif file in stdout: */ + Raw2Gif(ImageWidth, ImageHeight, ColorMap, ColorMapSize); +} + +/****************************************************************************** +* Convert Raw image (One byte per pixel) into Gif file. Raw data is read from * +* stdin, and Gif is dumped to stdout. ImagwWidth times ImageHeight bytes are * +* read. Color map is dumped from ColorMap. * +******************************************************************************/ +int Raw2Gif(int ImageWidth, int ImageHeight, + GifColorType *ColorMap, int ColorMapSize) +{ + static int BitsPerPixelArray[] = { 2, 4 ,8, 16, 32, 64, 128, 256 }; + int i, j, BitsPerPixel; + static GifPixelType *ScanLine; + GifFileType *GifFile; + + for (BitsPerPixel = 0; + BitsPerPixel < 8 && BitsPerPixelArray[BitsPerPixel] != ColorMapSize; + BitsPerPixel++); + if (++BitsPerPixel > 8) { + GIF_MESSAGE("Number of color map is NOT power of 2 up to 256."); + exit(3); + } + + if ((ScanLine = (GifPixelType *) malloc(sizeof(GifPixelType) * ImageWidth)) + == NULL) { + GIF_MESSAGE("Failed to allocate scan line, aborted."); + exit(3); + } + + if ((GifFile = EGifOpenFileHandle(1)) == NULL) { /* Gif to stdout. */ + free((char *) ScanLine); + return HandleGifError(GifFile); + } + + if (EGifPutScreenDesc(GifFile, ImageWidth, ImageHeight, BitsPerPixel, + 0, BitsPerPixel, ColorMap) == GIF_ERROR) { + free((char *) ScanLine); + return HandleGifError(GifFile); + } + + if (EGifPutImageDesc(GifFile, 0, 0, ImageWidth, ImageHeight, FALSE, 1, + NULL) == GIF_ERROR) { + free((char *) ScanLine); + return HandleGifError(GifFile); + } + + /* Here it is - get one raw line from stdin, and dump to stdout Gif: */ + GifQprintf("\n%s: Image 1 at (0, 0) [%dx%d]: ", + PROGRAM_NAME, ImageWidth, ImageHeight); + for (i = 0; i < ImageHeight; i++) { + /* Note we assume here PixelSize == Byte, which is not necessarily */ + /* so. If not - must read one byte at a time, and coerce to pixel. */ + if (fread(ScanLine, 1, ImageWidth, stdin) != ImageWidth) { + GIF_MESSAGE("RAW input file ended prematurely."); + exit(3); + } + + for (j = 0; j < ImageWidth; j++) + if (ScanLine[j] >= ColorMapSize) + GIF_MESSAGE("Warning: RAW data color > maximum color map entry."); + + if (EGifPutLine(GifFile, ScanLine, ImageWidth) == GIF_ERROR) { + free((char *) ScanLine); + return HandleGifError(GifFile); + } + GifQprintf("\b\b\b\b%-4d", i); + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) { + free((char *) ScanLine); + return HandleGifError(GifFile); + } + + free((char *) ScanLine); + return 0; +} + +/****************************************************************************** +* Handle last GIF error. Try to close the file and free all allocated memory. * +******************************************************************************/ +static int HandleGifError(GifFileType *GifFile) +{ + int i = GifLastError(); + + if (EGifCloseFile(GifFile) == GIF_ERROR) { + GifLastError(); + } + return i; +} diff --git a/G/UTIL/RGB2GIF.C b/G/UTIL/RGB2GIF.C new file mode 100644 index 0000000..f080aea --- /dev/null +++ b/G/UTIL/RGB2GIF.C @@ -0,0 +1,292 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jun. 1991 * +****************************************************************************** +* Program to convert 24bits RGB files to GIF format. * +* Options: * +* -q : quite printing mode. * +* -c #colors : in power of two, i.e. 7 will allow upto 128 colors in output. * +* -1 : one file holding RGBRGB.. triples of bytes * +* -s Width Height : specifies size of raw image. * +* -h : on line help. * +****************************************************************************** +* History: * +* 15 Jun 91 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "RGB2Gif" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "RGB2Gif q%- c%-#Colors!d 1%- s!-Width|Height!d!d h%- RGBFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- c%-#Colors!d 1%- s!-Width|Height!d!d h%- RGBFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ColorFlag = FALSE, + ExpNumOfColors = 8, + OneFileFlag = FALSE, + HelpFlag = FALSE, + ColorMapSize = 256; + +static void LoadRGB(char *FileName, + int OneFileFlag, + GifByteType **RedBuffer, + GifByteType **GreenBuffer, + GifByteType **BlueBuffer, + int Width, int Height); +static void SaveGif(GifByteType *OutputBuffer, + GifColorType *OutputColorMap, + int ExpColorMapSize, int Width, int Height); +static void QuitGifError(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int Error, NumFiles, Width, Height, SizeFlag; + char **FileName = NULL; + GifByteType *RedBuffer = NULL, *GreenBuffer = NULL, *BlueBuffer = NULL, + *OutputBuffer = NULL; + GifColorType *OutputColorMap = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &ColorFlag, &ExpNumOfColors, &OneFileFlag, + &SizeFlag, &Width, &Height, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + ColorMapSize = 1 << ExpNumOfColors; + + if (NumFiles == 1) { + LoadRGB(*FileName, OneFileFlag, + &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height); + } + else { + LoadRGB(NULL, OneFileFlag, + &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height); + } + + if ((OutputColorMap = (GifColorType *) malloc(ColorMapSize * + sizeof(GifColorType))) == NULL || + (OutputBuffer = (GifByteType *) malloc(Width * Height * + sizeof(GifByteType))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + if (QuantizeBuffer(Width, Height, &ColorMapSize, + RedBuffer, GreenBuffer, BlueBuffer, + OutputBuffer, OutputColorMap) == GIF_ERROR) + QuitGifError(NULL); + free((char *) RedBuffer); + free((char *) GreenBuffer); + free((char *) BlueBuffer); + + SaveGif(OutputBuffer, OutputColorMap, ExpNumOfColors, Width, Height); +} + +/****************************************************************************** +* Load RGB file into internal frame buffer. * +******************************************************************************/ +static void LoadRGB(char *FileName, + int OneFileFlag, + GifByteType **RedBuffer, + GifByteType **GreenBuffer, + GifByteType **BlueBuffer, + int Width, int Height) +{ + int i, j; + unsigned long Size; + GifByteType *RedP, *GreenP, *BlueP; + FILE *f[3]; + + Size = ((long) Width) * Height * sizeof(GifByteType); +#ifdef __MSDOS__ + if (Size > 65500L) + GIF_EXIT("Can't allocate more than 64k."); +#endif /* __MSDOS__ */ + + if ((*RedBuffer = (GifByteType *) malloc((unsigned int) Size)) == NULL || + (*GreenBuffer = (GifByteType *) malloc((unsigned int) Size)) == NULL || + (*BlueBuffer = (GifByteType *) malloc((unsigned int) Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + RedP = *RedBuffer; + GreenP = *GreenBuffer; + BlueP = *BlueBuffer; + + if (FileName != NULL) { + char OneFileName[80]; + + if (OneFileFlag) { +#ifdef __MSDOS__ + if ((f[0] = fopen(FileName, "rb")) == NULL) +#else + if ((f[0] = fopen(FileName, "r")) == NULL) +#endif /* __MSDOS__ */ + GIF_EXIT("Can't open input file name."); + } + else { + static char *Postfixes[] = { ".R", ".G", ".B" }; + + for (i = 0; i < 3; i++) { + strcpy(OneFileName, FileName); + strcat(OneFileName, Postfixes[i]); + +#ifdef __MSDOS__ + if ((f[i] = fopen(OneFileName, "rb")) == NULL) +#else + if ((f[i] = fopen(OneFileName, "r")) == NULL) +#endif /* __MSDOS__ */ + GIF_EXIT("Can't open input file name."); + } + } + } + else { + OneFileFlag = TRUE; + +#ifdef __MSDOS__ + setmode(0, O_BINARY); +#endif /* __MSDOS__ */ + + f[0] = stdin; + } + + GifQprintf("\n%s: RGB image: ", PROGRAM_NAME); + + if (OneFileFlag) { + GifByteType *Buffer, *BufferP; + + if ((Buffer = (GifByteType *) malloc(Width * 3)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (fread(Buffer, Width * 3, 1, f[0]) != 1) + GIF_EXIT("Input file(s) terminated prematurly."); + for (j = 0, BufferP = Buffer; j < Width; j++) { + *RedP++ = *BufferP++; + *GreenP++ = *BufferP++; + *BlueP++ = *BufferP++; + } + } + + free((char *) Buffer); + fclose(f[0]); + } + else { + for (i = 0; i < Height; i++) { + GifQprintf("\b\b\b\b%-4d", i); + if (fread(RedP, Width, 1, f[0]) != 1 || + fread(GreenP, Width, 1, f[1]) != 1 || + fread(BlueP, Width, 1, f[2]) != 1) + GIF_EXIT("Input file(s) terminated prematurly."); + RedP += Width; + GreenP += Width; + BlueP += Width; + } + + fclose(f[0]); + fclose(f[1]); + fclose(f[2]); + } +} + +/****************************************************************************** +* Save the GIF resulting image. * +******************************************************************************/ +static void SaveGif(GifByteType *OutputBuffer, + GifColorType *OutputColorMap, + int ExpColorMapSize, int Width, int Height) +{ + int i; + GifFileType *GifFile; + GifByteType *Ptr = OutputBuffer; + + /* Open stdout for the output file: */ + if ((GifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFile); + + if (EGifPutScreenDesc(GifFile, + Width, Height, ExpColorMapSize, 0, ExpColorMapSize, + OutputColorMap) == GIF_ERROR || + EGifPutImageDesc(GifFile, + 0, 0, Width, Height, FALSE, ExpColorMapSize, NULL) == + GIF_ERROR) + QuitGifError(GifFile); + + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + for (i = 0; i < Height; i++) { + if (EGifPutLine(GifFile, Ptr, Width) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Height - i - 1); + + Ptr += Width; + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) EGifCloseFile(GifFile); + exit(1); +} diff --git a/G/UTIL/RLE2GIF.C b/G/UTIL/RLE2GIF.C new file mode 100644 index 0000000..bb61842 --- /dev/null +++ b/G/UTIL/RLE2GIF.C @@ -0,0 +1,234 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to convert RLE (utah raster toolkit) file to GIF format. * +* Options: * +* -q : quite printing mode. * +* -c #colors : in power of two, i.e. 7 will allow upto 128 colors in output. * +* -h : on line help. * +****************************************************************************** +* History: * +* 5 Jan 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#include +#include +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#include "rle.h" /* The rle tool kit header files. */ + +#define PROGRAM_NAME "Rle2Gif" + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module,\t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Rle2Gif q%- c%-#Colors!d h%- RleFile!*s"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- c%-#Colors!d h%- RleFile!*s"; +#endif /* SYSV */ + +/* Make some variables global, so we could access them faster: */ +static int + ColorFlag = FALSE, + ExpNumOfColors = 8, + HelpFlag = FALSE, + ColorMapSize = 256; + +static void LoadRle(char *FileName, + GifByteType **RedBuffer, + GifByteType **GreenBuffer, + GifByteType **BlueBuffer, + int *Width, int *Height); +static void SaveGif(GifByteType *OutputBuffer, + GifColorType *OutputColorMap, + int ExpColorMapSize, int Width, int Height); +static void QuitGifError(GifFileType *GifFile); + +/****************************************************************************** +* Interpret the command line and scan the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, Error, NumFiles, Width, Height; + char **FileName = NULL; + GifByteType *RedBuffer = NULL, *GreenBuffer = NULL, *BlueBuffer = NULL, + *OutputBuffer = NULL; + GifColorType *OutputColorMap = NULL; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifQuitePrint, + &ColorFlag, &ExpNumOfColors, &HelpFlag, + &NumFiles, &FileName)) != FALSE || + (NumFiles > 1 && !HelpFlag)) { + if (Error) + GAPrintErrMsg(Error); + else if (NumFiles > 1) + GIF_MESSAGE("Error in command line parsing - one GIF file please."); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + ColorMapSize = 1 << ExpNumOfColors; + + if (NumFiles == 1) { + LoadRle(*FileName, + &RedBuffer, &GreenBuffer, &BlueBuffer, &Width, &Height); + } + else { + LoadRle(NULL, + &RedBuffer, &GreenBuffer, &BlueBuffer, &Width, &Height); + } + + if ((OutputColorMap = (GifColorType *) malloc(ColorMapSize * + sizeof(GifColorType))) == NULL || + (OutputBuffer = (GifByteType *) malloc(Width * Height * + sizeof(GifByteType))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + if (QuantizeBuffer(Width, Height, &ColorMapSize, + RedBuffer, GreenBuffer, BlueBuffer, + OutputBuffer, OutputColorMap) == GIF_ERROR) + QuitGifError(NULL); + free((char *) RedBuffer); + free((char *) GreenBuffer); + free((char *) BlueBuffer); + + SaveGif(OutputBuffer, OutputColorMap, ExpNumOfColors, Width, Height); +} + +/****************************************************************************** +* Load RLE file into internal frame buffer. * +******************************************************************************/ +static void LoadRle(char *FileName, + GifByteType **RedBuffer, + GifByteType **GreenBuffer, + GifByteType **BlueBuffer, + int *Width, int *Height) +{ + int i, j, k, Size; + GifByteType *OutputPtr[3]; + rle_hdr in_hdr; + rle_pixel **rows, *ptr; + + if (FileName != NULL) { + if ((in_hdr.rle_file = fopen(FileName, "r")) == NULL) + GIF_EXIT("Can't open input file name."); + } + else + in_hdr.rle_file = stdin; + + rle_get_setup_ok( &in_hdr, "rle2gif", FileName ); + + *Width = in_hdr.xmax - in_hdr.xmin + 1; + *Height = in_hdr.ymax - in_hdr.ymin + 1; + + if (in_hdr.ncolors != 3) + GIF_EXIT("Input Rle file does not hold 3 (RGB) colors, aborted."); + + Size = *Width * *Height * sizeof(GifByteType); + if (rle_row_alloc(&in_hdr, &rows) || + (*RedBuffer = (GifByteType *) malloc(Size)) == NULL || + (*GreenBuffer = (GifByteType *) malloc(Size)) == NULL || + (*BlueBuffer = (GifByteType *) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + OutputPtr[0] = *RedBuffer; + OutputPtr[1] = *GreenBuffer; + OutputPtr[2] = *BlueBuffer; + + for (i = 0; i < *Height; i++) { + rle_getrow(&in_hdr, rows); /* Get one scan line (3 colors). */ + + for (j = 0; j < 3; j++) { /* Copy the 3 colors to the given buffers. */ + ptr = &rows[j][in_hdr.xmin]; + + for (k = 0; k < *Width; k++) + *OutputPtr[j]++ = *ptr++; + } + } +} + +/****************************************************************************** +* Save the GIF resulting image. * +******************************************************************************/ +static void SaveGif(GifByteType *OutputBuffer, + GifColorType *OutputColorMap, + int ExpColorMapSize, int Width, int Height) +{ + int i; + GifFileType *GifFile; + GifByteType *Ptr = OutputBuffer + Width * (Height - 1); + + /* Open stdout for the output file: */ + if ((GifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFile); + + if (EGifPutScreenDesc(GifFile, + Width, Height, ExpColorMapSize, 0, ExpColorMapSize, + OutputColorMap) == GIF_ERROR || + EGifPutImageDesc(GifFile, + 0, 0, Width, Height, FALSE, ExpColorMapSize, NULL) == + GIF_ERROR) + QuitGifError(GifFile); + + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + for (i = 0; i < Height; i++) { + if (EGifPutLine(GifFile, Ptr, Width) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", Height - i - 1); + + Ptr -= Width; + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) EGifCloseFile(GifFile); + exit(1); +} diff --git a/G/UTIL/TEXT2GIF.C b/G/UTIL/TEXT2GIF.C new file mode 100644 index 0000000..19a1aa7 --- /dev/null +++ b/G/UTIL/TEXT2GIF.C @@ -0,0 +1,357 @@ +/***************************************************************************** +* "Gif-Lib" - Yet another gif library. * +* * +* Written by: Gershon Elber Ver 0.1, Jul. 1989 * +****************************************************************************** +* Program to generate GIF image page from a given text by drawing the chars * +* using 8 by 8 fixed font. * +* Options: * +* -q : quite printing mode. * +* -s ColorMapSize : in bits, i.e. 6 bits for 64 colors. * +* -f ForeGroundIndex : by default foreground is 1. Must be in range 0..255. * +* -c R G B : set the foregound color values. By default it is white. * +* -t "Text" : Make one line given file (8 pixel high) from the given Text. * +* -h : on line help. * +****************************************************************************** +* History: * +* 3 May 90 - Version 1.0 by Gershon Elber. * +*****************************************************************************/ + +#ifdef __MSDOS__ +#include +#include +#endif /* __MSDOS__ */ + +#include +#include +#include +#include "gif_lib.h" +#include "getarg.h" + +#define PROGRAM_NAME "Text2Gif" + +#define MAX_NUM_TEXT_LINES 100 /* Maximum number of lines in file. */ + +#define LINE_LEN 256 /* Maximum length of one text line. */ + +#define DEFAULT_FG_INDEX 1 /* Text foreground index. */ + +#define DEFAULT_COLOR_RED 255 /* Text foreground color. */ +#define DEFAULT_COLOR_GREEN 255 +#define DEFAULT_COLOR_BLUE 255 + +#ifdef __MSDOS__ +extern unsigned int + _stklen = 16384; /* Increase default stack size. */ +#endif /* __MSDOS__ */ + +#ifdef SYSV +static char *VersionStr = + "Gif library module \t\tGershon Elber\n\ + (C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = "Text2Gif q%- s%-ClrMapSize!d f%-FGClr!d c%-R|G|B!d!d!d t%-\"Text\"!s h%-"; +#else +static char + *VersionStr = + PROGRAM_NAME + GIF_LIB_VERSION + " Gershon Elber, " + __DATE__ ", " __TIME__ "\n" + "(C) Copyright 1989 Gershon Elber, Non commercial use only.\n"; +static char + *CtrlStr = + PROGRAM_NAME + " q%- s%-ClrMapSize!d f%-FGClr!d c%-R|G|B!d!d!d t%-\"Text\"!s h%-"; +#endif /* SYSV */ + +static unsigned int + RedColor = DEFAULT_COLOR_RED, + GreenColor = DEFAULT_COLOR_GREEN, + BlueColor = DEFAULT_COLOR_BLUE; + +/***************************************************************************** +* Ascii 8 by 8 regular font - only first 128 characters are supported. * +*****************************************************************************/ +static unsigned char AsciiTable[][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* Ascii 0 */ + { 0x3c, 0x42, 0xa5, 0x81, 0xbd, 0x42, 0x3c, 0x00 }, /* Ascii 1 */ + { 0x3c, 0x7e, 0xdb, 0xff, 0xc3, 0x7e, 0x3c, 0x00 }, /* Ascii 2 */ + { 0x00, 0xee, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00 }, /* Ascii 3 */ + { 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00 }, /* Ascii 4 */ + { 0x00, 0x3c, 0x18, 0xff, 0xff, 0x08, 0x18, 0x00 }, /* Ascii 5 */ + { 0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x10, 0x38, 0x00 }, /* Ascii 6 */ + { 0x00, 0x00, 0x18, 0x3c, 0x18, 0x00, 0x00, 0x00 }, /* Ascii 7 */ + { 0xff, 0xff, 0xe7, 0xc3, 0xe7, 0xff, 0xff, 0xff }, /* Ascii 8 */ + { 0x00, 0x3c, 0x42, 0x81, 0x81, 0x42, 0x3c, 0x00 }, /* Ascii 9 */ + { 0xff, 0xc3, 0xbd, 0x7e, 0x7e, 0xbd, 0xc3, 0xff }, /* Ascii 10 */ + { 0x1f, 0x07, 0x0d, 0x7c, 0xc6, 0xc6, 0x7c, 0x00 }, /* Ascii 11 */ + { 0x00, 0x7e, 0xc3, 0xc3, 0x7e, 0x18, 0x7e, 0x18 }, /* Ascii 12 */ + { 0x04, 0x06, 0x07, 0x04, 0x04, 0xfc, 0xf8, 0x00 }, /* Ascii 13 */ + { 0x0c, 0x0a, 0x0d, 0x0b, 0xf9, 0xf9, 0x1f, 0x1f }, /* Ascii 14 */ + { 0x00, 0x92, 0x7c, 0x44, 0xc6, 0x7c, 0x92, 0x00 }, /* Ascii 15 */ + { 0x00, 0x00, 0x60, 0x78, 0x7e, 0x78, 0x60, 0x00 }, /* Ascii 16 */ + { 0x00, 0x00, 0x06, 0x1e, 0x7e, 0x1e, 0x06, 0x00 }, /* Ascii 17 */ + { 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x18 }, /* Ascii 18 */ + { 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00 }, /* Ascii 19 */ + { 0xff, 0xb6, 0x76, 0x36, 0x36, 0x36, 0x36, 0x00 }, /* Ascii 20 */ + { 0x7e, 0xc1, 0xdc, 0x22, 0x22, 0x1f, 0x83, 0x7e }, /* Ascii 21 */ + { 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00 }, /* Ascii 22 */ + { 0x18, 0x7e, 0x18, 0x18, 0x7e, 0x18, 0x00, 0xff }, /* Ascii 23 */ + { 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00 }, /* Ascii 24 */ + { 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x00 }, /* Ascii 25 */ + { 0x00, 0x04, 0x06, 0xff, 0x06, 0x04, 0x00, 0x00 }, /* Ascii 26 */ + { 0x00, 0x20, 0x60, 0xff, 0x60, 0x20, 0x00, 0x00 }, /* Ascii 27 */ + { 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0x00 }, /* Ascii 28 */ + { 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00 }, /* Ascii 29 */ + { 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x00, 0x00 }, /* Ascii 30 */ + { 0x00, 0x00, 0x00, 0xfe, 0x7c, 0x38, 0x10, 0x00 }, /* Ascii 31 */ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* */ + { 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x00 }, /* ! */ + { 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* " */ + { 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00 }, /* # */ + { 0x10, 0x7c, 0xd2, 0x7c, 0x86, 0x7c, 0x10, 0x00 }, /* $ */ + { 0xf0, 0x96, 0xfc, 0x18, 0x3e, 0x72, 0xde, 0x00 }, /* % */ + { 0x30, 0x48, 0x30, 0x78, 0xce, 0xcc, 0x78, 0x00 }, /* & */ + { 0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* ' */ + { 0x10, 0x60, 0xc0, 0xc0, 0xc0, 0x60, 0x10, 0x00 }, /* ( */ + { 0x10, 0x0c, 0x06, 0x06, 0x06, 0x0c, 0x10, 0x00 }, /* ) */ + { 0x00, 0x54, 0x38, 0xfe, 0x38, 0x54, 0x00, 0x00 }, /* * */ + { 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00 }, /* + */ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70 }, /* , */ + { 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00 }, /* - */ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00 }, /* . */ + { 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00 }, /* / */ + { 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00 }, /* 0x */ + { 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x3c, 0x00 }, /* 1 */ + { 0x7c, 0xc6, 0x06, 0x0c, 0x30, 0x60, 0xfe, 0x00 }, /* 2 */ + { 0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c, 0x00 }, /* 3 */ + { 0x0e, 0x1e, 0x36, 0x66, 0xfe, 0x06, 0x06, 0x00 }, /* 4 */ + { 0xfe, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0xfc, 0x00 }, /* 5 */ + { 0x7c, 0xc6, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x00 }, /* 6 */ + { 0xfe, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x60, 0x00 }, /* 7 */ + { 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x00 }, /* 8 */ + { 0x7c, 0xc6, 0xc6, 0x7e, 0x06, 0xc6, 0x7c, 0x00 }, /* 9 */ + { 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00 }, /* : */ + { 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00 }, /* }, */ + { 0x00, 0x1c, 0x30, 0x60, 0x30, 0x1c, 0x00, 0x00 }, /* < */ + { 0x00, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x00, 0x00 }, /* = */ + { 0x00, 0x70, 0x18, 0x0c, 0x18, 0x70, 0x00, 0x00 }, /* > */ + { 0x7c, 0xc6, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00 }, /* ? */ + { 0x7c, 0x82, 0x9a, 0xaa, 0xaa, 0x9e, 0x7c, 0x00 }, /* @ */ + { 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x00 }, /* A */ + { 0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0x00 }, /* B */ + { 0x7c, 0xc6, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x00 }, /* C */ + { 0xf8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0x00 }, /* D */ + { 0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xfe, 0x00 }, /* E */ + { 0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0x00 }, /* F */ + { 0x7c, 0xc6, 0xc0, 0xce, 0xc6, 0xc6, 0x7e, 0x00 }, /* G */ + { 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00 }, /* H */ + { 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00 }, /* I */ + { 0x1e, 0x06, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x00 }, /* J */ + { 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6, 0x00 }, /* K */ + { 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00 }, /* L */ + { 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0x00 }, /* M */ + { 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00 }, /* N */ + { 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00 }, /* O */ + { 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00 }, /* P */ + { 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x06 }, /* Q */ + { 0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xc6, 0x00 }, /* R */ + { 0x78, 0xcc, 0x60, 0x30, 0x18, 0xcc, 0x78, 0x00 }, /* S */ + { 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00 }, /* T */ + { 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00 }, /* U */ + { 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00 }, /* V */ + { 0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00 }, /* W */ + { 0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00 }, /* X */ + { 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x00 }, /* Y */ + { 0xfe, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe, 0x00 }, /* Z */ + { 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00 }, /* [ */ + { 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x00 }, /* \ */ + { 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00 }, /* ] */ + { 0x00, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00 }, /* ^ */ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff }, /* _ */ + { 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* ` */ + { 0x00, 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0x7e, 0x00 }, /* a */ + { 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xe6, 0xdc, 0x00 }, /* b */ + { 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7e, 0x00 }, /* c */ + { 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xce, 0x76, 0x00 }, /* d */ + { 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7e, 0x00 }, /* e */ + { 0x1e, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x30, 0x00 }, /* f */ + { 0x00, 0x00, 0x7e, 0xc6, 0xce, 0x76, 0x06, 0x7c }, /* g */ + { 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x00 }, /* */ + { 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00 }, /* i */ + { 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0xf0 }, /* j */ + { 0xc0, 0xc0, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0x00 }, /* k */ + { 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00 }, /* l */ + { 0x00, 0x00, 0xcc, 0xfe, 0xd6, 0xc6, 0xc6, 0x00 }, /* m */ + { 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x00 }, /* n */ + { 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00 }, /* o */ + { 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xe6, 0xdc, 0xc0 }, /* p */ + { 0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xce, 0x76, 0x06 }, /* q */ + { 0x00, 0x00, 0x6e, 0x70, 0x60, 0x60, 0x60, 0x00 }, /* r */ + { 0x00, 0x00, 0x7c, 0xc0, 0x7c, 0x06, 0xfc, 0x00 }, /* s */ + { 0x30, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x1c, 0x00 }, /* t */ + { 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00 }, /* u */ + { 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00 }, /* v */ + { 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xfe, 0x6c, 0x00 }, /* w */ + { 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00 }, /* x */ + { 0x00, 0x00, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0x7c }, /* y */ + { 0x00, 0x00, 0xfc, 0x18, 0x30, 0x60, 0xfc, 0x00 }, /* z */ + { 0x0e, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0e, 0x00 }, /* { */ + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00 }, /* | */ + { 0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00 }, /* } */ + { 0x00, 0x00, 0x70, 0x9a, 0x0e, 0x00, 0x00, 0x00 }, /* ~ */ + { 0x00, 0x00, 0x18, 0x3c, 0x66, 0xff, 0x00, 0x00 } /* Ascii 127 */ +}; + +static void QuitGifError(GifFileType *GifFile); +static void GenRasterTextLine(GifRowType *RasterBuffer, char *TextLine, + int BufferWidth, int ForeGroundIndex); + +/****************************************************************************** +* Interpret the command line and generate the given GIF file. * +******************************************************************************/ +void main(int argc, char **argv) +{ + int i, j, l, Error, ImageWidth, ImageHeight, NumOfLines, LogNumLevels, + NumLevels, ClrMapSizeFlag = FALSE, ColorMapSize = 1, ColorFlag = FALSE, + ForeGroundIndex = DEFAULT_FG_INDEX, ForeGroundFlag = FALSE, + TextLineFlag = FALSE, HelpFlag = FALSE; + char *TextLines[MAX_NUM_TEXT_LINES], Line[LINE_LEN]; + GifRowType RasterBuffer[8]; + GifColorType *ColorMap; + GifFileType *GifFile; + + if ((Error = GAGetArgs(argc, argv, CtrlStr, + &GifQuitePrint, &ClrMapSizeFlag, &ColorMapSize, + &ForeGroundFlag, &ForeGroundIndex, + &ColorFlag, &RedColor, &GreenColor, &BlueColor, + &TextLineFlag, &TextLines[0], + &HelpFlag)) != FALSE) { + GAPrintErrMsg(Error); + GAPrintHowTo(CtrlStr); + exit(1); + } + + if (HelpFlag) { + fprintf(stderr, VersionStr); + GAPrintHowTo(CtrlStr); + exit(0); + } + + if (ForeGroundIndex > 255 || ForeGroundIndex < 1) + GIF_EXIT("Foregound (-f) should be in the range 1..255, aborted."); + + if (ColorMapSize > 8 || ColorMapSize < 1) + GIF_EXIT("ColorMapSize (-s) should be in the range 1..8, aborted."); + + if (TextLineFlag) { + NumOfLines = 1; + ImageHeight = 8; + ImageWidth = 8 * strlen(TextLines[0]); + } + else { + NumOfLines = l = 0; + while (fgets(Line, LINE_LEN - 1, stdin)) { + for (i = strlen(Line); i > 0 && Line[i-1] <= ' '; i--); + Line[i] = 0; + if (l < i) l = i; + TextLines[NumOfLines++] = strdup(Line); + if (NumOfLines == MAX_NUM_TEXT_LINES) + GIF_EXIT("Input file has too many lines, aborted."); + } + if (NumOfLines == 0) + GIF_EXIT("No input text, aborted."); + ImageHeight = 8 * NumOfLines; + ImageWidth = 8 * l; + } + + /* Allocate the raster buffer for 8 scan lines (one text line). */ + for (i = 0; i < 8; i++) + if ((RasterBuffer[i] = (GifRowType) malloc(sizeof(GifPixelType) * + ImageWidth)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + /* Open stdout for the output file: */ + if ((GifFile = EGifOpenFileHandle(1)) == NULL) + QuitGifError(GifFile); + + /* Dump out screen description with given size and generated color map: */ + for (LogNumLevels = 1, NumLevels = 2; + NumLevels < ForeGroundIndex; + LogNumLevels++, NumLevels <<= 1); + if (NumLevels < (1 << ColorMapSize)) { + NumLevels = (1 << ColorMapSize); + LogNumLevels = ColorMapSize; + } + + if ((ColorMap = (GifColorType *) malloc(NumLevels * sizeof(GifColorType))) + == NULL) GIF_EXIT("Failed to allocate memory required, aborted."); + + for (i = 0; i < NumLevels; i++) + ColorMap[i].Red = ColorMap[i].Green = ColorMap[i].Blue = 0; + ColorMap[ForeGroundIndex].Red = RedColor; + ColorMap[ForeGroundIndex].Green = GreenColor; + ColorMap[ForeGroundIndex].Blue = BlueColor; + + if (EGifPutScreenDesc(GifFile, + ImageWidth, ImageHeight, LogNumLevels, 0, LogNumLevels, ColorMap) + == GIF_ERROR) + QuitGifError(GifFile); + + /* Dump out the image descriptor: */ + if (EGifPutImageDesc(GifFile, + 0, 0, ImageWidth, ImageHeight, FALSE, LogNumLevels, NULL) == GIF_ERROR) + QuitGifError(GifFile); + + GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, GifFile -> ILeft, GifFile -> ITop, + GifFile -> IWidth, GifFile -> IHeight); + + for (i = l = 0; i < NumOfLines; i++) { + GenRasterTextLine(RasterBuffer, TextLines[i], ImageWidth, + ForeGroundIndex); + for (j = 0; j < 8; j++) { + if (EGifPutLine(GifFile, RasterBuffer[j], ImageWidth) == GIF_ERROR) + QuitGifError(GifFile); + GifQprintf("\b\b\b\b%-4d", l++); + } + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void GenRasterTextLine(GifRowType *RasterBuffer, char *TextLine, + int BufferWidth, int ForeGroundIndex) +{ + char c; + unsigned char Byte, Mask; + int i, j, k, CharPosX, Len = strlen(TextLine); + + for (i = 0; i < BufferWidth; i++) + for (j = 0; j < 8; j++) RasterBuffer[j][i] = 0; + + for (i = CharPosX = 0; i < Len; i++, CharPosX += 8) { + c = TextLine[i]; + for (j = 0; j < 8; j++) { + Byte = AsciiTable[c][j]; + for (k = 0, Mask = 128; k < 8; k++, Mask >>= 1) + if (Byte & Mask) + RasterBuffer[j][CharPosX + k] = ForeGroundIndex; + } + } +} + +/****************************************************************************** +* Close output file (if open), and exit. * +******************************************************************************/ +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) EGifCloseFile(GifFile); + exit(1); +} diff --git a/INT_KEY/INT_KEY.ASM b/INT_KEY/INT_KEY.ASM new file mode 100644 index 0000000..49cf464 --- /dev/null +++ b/INT_KEY/INT_KEY.ASM @@ -0,0 +1,146 @@ + +_TEXT SEGMENT BYTE PUBLIC 'CODE' + + ASSUME CS:_TEXT + + PUBLIC DIR_MEM_TECLA + +DIR_MEM_TECLA DD 0 + + PUBLIC VECTOR_TECLADO + +VECTOR_TECLADO DD 0 + + PUBLIC GUARDA_VECTORES + +GUARDA_VECTORES PROC NEAR + PUSH AX + PUSH BX + PUSH ES + MOV AH,35h ;Guarda el vector del teclado. + MOV AL,09h + INT 21h + MOV WORD PTR CS:[VECTOR_TECLADO],BX + MOV WORD PTR CS:[VECTOR_TECLADO+2],ES + POP ES + POP BX + POP AX + RET +GUARDA_VECTORES ENDP + + PUBLIC _SET_VECTORES + +_SET_VECTORES PROC NEAR + CALL GUARDA_VECTORES + PUSH BP + MOV BP,SP + PUSH AX + PUSH DS + PUSH DX + PUSH SI + + LDS SI,[BP+4] + MOV WORD PTR CS:[DIR_MEM_TECLA],SI + MOV WORD PTR CS:[DIR_MEM_TECLA+2],DS + + MOV DX,OFFSET CS:TECLADO + MOV AX,_TEXT + MOV DS,AX + MOV AL,09h + MOV AH,25h + INT 21h ;Cambia el vector del teclado. + + POP SI + POP DX + POP DS + POP AX + POP BP + RET +_SET_VECTORES ENDP + + PUBLIC _UNSET_VECTORES + +_UNSET_VECTORES PROC NEAR + PUSH BP + MOV BP,SP + PUSH AX + PUSH DS + PUSH DX + + MOV DX,WORD PTR CS:[VECTOR_TECLADO] + MOV AX,WORD PTR CS:[VECTOR_TECLADO+2] + MOV DS,AX + MOV AL,09h + MOV AH,25h + INT 21h ;Repone el vector del teclado. + + POP DX + POP DS + POP AX + POP BP + RET +_UNSET_VECTORES ENDP + + PUBLIC TECLADO + +TECLADO PROC FAR + PUSH AX + PUSH BX + PUSH DS + PUSH SI + LDS SI,CS:[DIR_MEM_TECLA] + IN AL,60h + MOV AH,AL + IN AL,61h + OR AL,10000000b + OUT 61h,AL + AND AL,01111111b + OUT 61h,AL + MOV AL,AH + MOV BL,AL + MOV BH,00h + AND BX,007Fh + CMP AL,00h + JE TECLEADO + CMP AL,0E0h + JE TECLEADO + CMP AL,0F0h + JE TECLEADO + CMP BYTE PTR [SI],0E0h ;ltima tecla + JNE NO_DOBLE + ADD BX,128 +NO_DOBLE: TEST AL,80h + JZ NO_SOLT + MOV BYTE PTR [BX+SI],0 + JMP TECLEADO +NO_SOLT: MOV BYTE PTR [BX+SI],1 +TECLEADO: MOV [SI],AL ;ltima tecla + LDS SI,CS:[DIR_MEM_TECLA] + MOV BYTE PTR [SI+84],0 + MOV BYTE PTR [SI+85],0 + MOV AL,[SI+42] + OR AL,[SI+54] + CMP AL,1 + JNE NO_IMPR_PANT + CMP BYTE PTR [SI+55],1 + JNE NO_IMPR_PANT + MOV BYTE PTR [SI+84],1 +NO_IMPR_PANT: MOV AL,[SI+29] + OR AL,[SI+157] + CMP AL,1 + JNE NO_PAUSA + CMP BYTE PTR [SI+69],1 + JNE NO_PAUSA + MOV BYTE PTR [SI+85],1 +NO_PAUSA: MOV AL,20h + OUT 20h,AL + POP SI + POP DS + POP BX + POP AX + IRET +TECLADO ENDP + +_TEXT ends + + end \ No newline at end of file diff --git a/INT_KEY/INT_KEY.H b/INT_KEY/INT_KEY.H new file mode 100644 index 0000000..464b46f --- /dev/null +++ b/INT_KEY/INT_KEY.H @@ -0,0 +1,107 @@ +#define t_esc 1 +#define t_1 2 +#define t_2 3 +#define t_3 4 +#define t_4 5 +#define t_5 6 +#define t_6 7 +#define t_7 8 +#define t_8 9 +#define t_9 10 +#define t_0 11 +#define t_? 12 +#define t_back 14 +#define t_tab 15 +#define t_q 16 +#define t_w 17 +#define t_e 18 +#define t_r 19 +#define t_t 20 +#define t_y 21 +#define t_u 22 +#define t_i 23 +#define t_o 24 +#define t_p 25 +// [ 26 +#define t_mas 27 +#define t_enter 28 +#define t_ctrl_izq 29 +#define t_a 30 +#define t_s 31 +#define t_d 32 +#define t_f 33 +#define t_g 34 +#define t_h 35 +#define t_j 36 +#define t_k 37 +#define t_l 38 +//#define t_ 39 +// acent_o +// +#define t_shift_izq 42 +// +#define t_z 44 +#define t_x 45 +#define t_c 46 +#define t_v 47 +#define t_b 48 +#define t_n 49 +#define t_m 50 +#define t_coma 51 +#define t_pto 52 +#define t_menos 53 +#define t_shift_der 54 +#define t_por_num 55 +#define t_alt_izq 56 +#define t_space 57 +#define t_bmay 58 +#define t_f1 59 +#define t_f2 60 +#define t_f3 61 +#define t_f4 62 +#define t_f5 63 +#define t_f6 64 +#define t_f7 65 +#define t_f8 66 +#define t_f9 67 +#define t_f10 68 +#define t_bnum 69 +#define t_bdesp 70 +#define t_7n 71 +#define t_8n 72 +#define t_9n 73 +#define t_menos_num 74 +#define t_4n 75 +#define t_5n 76 +#define t_6n 77 +#define t_mas_num 78 +#define t_1n 79 +#define t_2n 80 +#define t_3n 81 +#define t_0n 82 +#define t_pto_num 83 +#define t_impr_pant 84 +#define t_pausa 85 +// <> +#define t_f11 87 +#define t_f12 88 +// Saltamos hasta 156 +#define t_intro_num 156 +#define t_ctrl_der 157 +// Saltamos hasta 180 +#define t_dividir 180 +#define t_alt_der 183 +// Saltamos a 197 +#define t_inicio 197 +#define t_arriba 198 +#define t_repag 199 +#define t_izquierda 201 +#define t_derecha 203 +#define t_fin 205 +#define t_abajo 206 +#define t_avpag 207 +#define t_ins 208 +#define t_sup 209 + +//unsigned char tecla[512]; // t_abla de det_ecciones del teclado + diff --git a/MAKE_BOT/MAKE_BO2.CPP b/MAKE_BOT/MAKE_BO2.CPP new file mode 100644 index 0000000..5d34579 --- /dev/null +++ b/MAKE_BOT/MAKE_BO2.CPP @@ -0,0 +1,1546 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "c:\things\borlandc\jd_lib\f_lib\make_bot.h" + +#define MB_TeclaPulsada() ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ) + +/**/ +/* MAKE BOTON */ +/**/ + + void ErrorOccurred(int errorcode); + + struct Make_Boton { + /* unsigned */ int Up, Left, Down, Right; + unsigned char Cdf, Cb1, Cb2; + unsigned char Ab, Pb; + unsigned char Isc, Sc; + }; + + int P_Sec(int numero); + int lee_objeto(FILE *); + void Deprime_Image(struct Make_Boton Bot_Imp); + void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp); + + char True_Push = OFF, // Parametros para el TRUE_PUSH + Push = OFF; // PRESION REAL !!! + void far *arrow; // YA !!! + + int Secuencias, *n_Botones_Secuencia; + char memoria_asignada = 0;//, vez = 0; + + struct Make_Boton far *Botones; // Puntero a estructura + + +/**/ +/* Control del Raton */ +/**/ + + void Carga_Puntero(void); + int Carga_Puntero_Animado(void); + + void *Pantalla; + unsigned char *P_Raton1, *P_Raton2, *P_Raton3, *P_Raton4; + char raton=0, // Indica si hay un Raton = 1 + PunteroRaton=0; // Se modifica el puntero ? + + int x_raton=50, y_raton=50, // Tras Espera_Tecla_o_Raton(); devuelve + dir_raton [32+32]; // las coordenadas y botones pulsados... + + + unsigned char BLANCO = 255, GRIS_CLARO = 253, NEGRO = 240, UNKNOW = 249, AZUL = 250; + +////////////////////////////////////////////////////////////////////////////// +/////////////////////////>>>> Inicio del codigo <<<<<='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + Secuencias = numero; + if (( n_Botones_Secuencia = (int *) malloc( sizeof(int)*Secuencias ) ) == NULL) { + printf("\nNo Hay suficiente Memoria, ni para un Boton\n\n"); + return SIN_MEMORIA; + } + } + + if (ch=='!') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + temp_num = numero; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + n_Botones_Secuencia[temp_num - 1] = numero; + + SiZe_BoToN += ( sizeof( struct Make_Boton ) * numero); + + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = temp_num; + return SIN_MEMORIA; + } + memoria_asignada = 1; + } + if (ch=='$') { //Clculos del boton + inc_Botones++; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Left = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Up = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Right =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + if(ch == '-' || ch == '-') signo = 1; + ch=fgetc(fichero); + } + if ( signo == 1 ) + Botones [inc_Botones]. Down =numero * -1; + else + Botones [inc_Botones]. Down =numero; + signo = 0; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cdf =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cb1 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cb2 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Ab =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Pb =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Isc =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Sc =numero; + + } + + if (ch!=EOF) ch=fgetc(fichero); + } + + return OK; +} + + +void despliega_datos(void){ + int SeCa; + + clrscr(); + for(int SeC=0; SeC 0) + { + puntos[1] = 120; + puntos[2] = 300; + } else { + puntos[1] = 60; + puntos[2] = 240; + } + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[1]+puntos[0], puntos[2]+puntos[0], Bot_Imp.Right - puntos[0]); + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[2]+puntos[0], puntos[1]+puntos[0], Bot_Imp.Right - puntos[0]); + + if(D_Bord) { + setcolor(Bot_Imp.Cdf); + setfillstyle(SOLID_FILL, Bot_Imp.Cdf); + pieslice( Bot_Imp.Left, Bot_Imp.Up, 0, 360, Bot_Imp.Right - Ab); + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + circle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right); + } + + } else { + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right; puntos[5] = Bot_Imp.Down; + puntos[6] = (Bot_Imp.Right-Ab); puntos[7] = (Bot_Imp.Down-Ab); + puntos[8] = (Bot_Imp.Right-Ab); puntos[9] = (Bot_Imp.Up+Ab); + puntos[10] = (Bot_Imp.Left+Ab); puntos[11] = (Bot_Imp.Up+Ab); + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } else { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right - Ab; puntos[5] = Bot_Imp.Up + Ab; + puntos[6] = Bot_Imp.Left + Ab; puntos[7] = Bot_Imp.Up + Ab; + puntos[8] = Bot_Imp.Left + Ab; puntos[9] = Bot_Imp.Down - Ab; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Down; + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left+Ab; puntos[1] = Bot_Imp.Up+Ab; + puntos[2] = Bot_Imp.Left+Ab; puntos[3] = Bot_Imp.Down-Ab; + puntos[4] = Bot_Imp.Right-Ab; puntos[5] = Bot_Imp.Down-Ab; + puntos[6] = Bot_Imp.Right; puntos[7] = Bot_Imp.Down; + puntos[8] = Bot_Imp.Left; puntos[9] = Bot_Imp.Down; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Up; + puntos[12] = Bot_Imp.Left+Ab; puntos[13] = Bot_Imp.Up+Ab; + } else { + puntos[0] = Bot_Imp.Right; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Down; + puntos[4] = Bot_Imp.Left; puntos[5] = Bot_Imp.Down; + puntos[6] = Bot_Imp.Left+Ab; puntos[7] = Bot_Imp.Down-Ab; + puntos[8] = Bot_Imp.Right-Ab; puntos[9] = Bot_Imp.Down-Ab; + puntos[10] = Bot_Imp.Right-Ab; puntos[11] = Bot_Imp.Up+Ab; + puntos[12] = Bot_Imp.Right; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if(D_Bord) { + setcolor(Bot_Imp.Cdf); + setfillstyle(SOLID_FILL, Bot_Imp.Cdf); + bar(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1); + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + rectangle(Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right, Bot_Imp.Down); + } +} + +} + +void Imprime_Boton_i(struct Make_Boton Bot_Imp){ + + int puntos[14]; + unsigned char Ab = Bot_Imp.Ab; + unsigned long size; + +if ( Bot_Imp.Down < 0 ) + { + if(Bot_Imp.Pb > 0) + { + puntos[1] = 120; + puntos[2] = 300; + } else { + puntos[1] = 60; + puntos[2] = 240; + } + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[1]+puntos[0], puntos[2]+puntos[0], Bot_Imp.Right - puntos[0]); + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[2]+puntos[0], puntos[1]+puntos[0], Bot_Imp.Right - puntos[0]); + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + circle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right); + } + + } else { + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right; puntos[5] = Bot_Imp.Down; + puntos[6] = (Bot_Imp.Right-Ab); puntos[7] = (Bot_Imp.Down-Ab); + puntos[8] = (Bot_Imp.Right-Ab); puntos[9] = (Bot_Imp.Up+Ab); + puntos[10] = (Bot_Imp.Left+Ab); puntos[11] = (Bot_Imp.Up+Ab); + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } else { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right - Ab; puntos[5] = Bot_Imp.Up + Ab; + puntos[6] = Bot_Imp.Left + Ab; puntos[7] = Bot_Imp.Up + Ab; + puntos[8] = Bot_Imp.Left + Ab; puntos[9] = Bot_Imp.Down - Ab; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Down; + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + /* calculate the size of the image */ + size = JD_imagesize(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1); + + /* allocate memory to hold the image */ + if (True_Push == ON) + if ( (arrow = farmalloc(size)) == NULL ) Push = OFF; else { + /* grab the image */ + getimage(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1, arrow); + } + + if(Push == ON && True_Push == ON ) { + if(Bot_Imp.Pb == 2) { + putimage(Bot_Imp.Left+1, Bot_Imp.Up+(Ab*2), arrow, COPY_PUT); + } else { + putimage(Bot_Imp.Left+(Ab*2), Bot_Imp.Up+(Ab*2), arrow, COPY_PUT); + } + } else { + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left+Ab; puntos[1] = Bot_Imp.Up+Ab; + puntos[2] = Bot_Imp.Left+Ab; puntos[3] = Bot_Imp.Down-Ab; + puntos[4] = Bot_Imp.Right-Ab; puntos[5] = Bot_Imp.Down-Ab; + puntos[6] = Bot_Imp.Right; puntos[7] = Bot_Imp.Down; + puntos[8] = Bot_Imp.Left; puntos[9] = Bot_Imp.Down; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Up; + puntos[12] = Bot_Imp.Left+Ab; puntos[13] = Bot_Imp.Up+Ab; + } else { + puntos[0] = Bot_Imp.Right; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Down; + puntos[4] = Bot_Imp.Left; puntos[5] = Bot_Imp.Down; + puntos[6] = Bot_Imp.Left+Ab; puntos[7] = Bot_Imp.Down-Ab; + puntos[8] = Bot_Imp.Right-Ab; puntos[9] = Bot_Imp.Down-Ab; + puntos[10] = Bot_Imp.Right-Ab; puntos[11] = Bot_Imp.Up+Ab; + puntos[12] = Bot_Imp.Right; puntos[13] = Bot_Imp.Up; + } + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + rectangle(Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right, Bot_Imp.Down); + } +} + +} + +// +// + +void Deprime_Image(struct Make_Boton Bot_Imp){ + putimage(Bot_Imp.Left+Bot_Imp.Ab+1, Bot_Imp.Up+Bot_Imp.Ab+1, arrow, COPY_PUT); + farfree(arrow); +} + +// +// + +int Imprime_Estaticos(int Sec_st, char *file){ + + char ch, Relleno = 1, buffer[160]; + unsigned char fuente, size, orientacion, color, + signo=0; + unsigned int /*numero, */ temp_num, temp_b; + int numero; + + int secuencia_activa=-1, x, y; + + struct Make_Boton Bot_Static; + + FILE* fichero; // Fichero con datos del obj. + + if ( (fichero=fopen(file,"r"))==NULL ) return ERROR_ABRIENDO; + + ch=fgetc(fichero); //Lee el primer caracter + while (ch!=EOF) { //Lee hasta fin de fichero + + if (ch=='*') //Linea con comentario + while (ch!=EOL && ch!=EOF) ch=fgetc(fichero); + + if (ch=='') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + secuencia_activa = numero; + } + + if (ch=='&' && secuencia_activa == Sec_st) { //Clculos del boton estatico + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Left = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Up = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Right =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + if(ch == '-' || ch == '-') signo = 1; + ch=fgetc(fichero); + } + if ( signo==1 ) + Bot_Static.Down =numero * -1; + else + Bot_Static.Down =numero; + signo = 0; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cdf =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cb1 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cb2 =numero; + + numero=0; Relleno = 1; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; else + if(ch == '-' || ch == '-') Relleno = 0; + ch=fgetc(fichero); + } + Bot_Static.Ab =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Pb =numero; + Imprime_Boton(Relleno, Bot_Static); + } + if (ch=='|' && secuencia_activa == Sec_st) { //Clculos del texto + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + x = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + y = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fuente = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + size = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + orientacion = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + color = numero; + + buffer[0] = '\0'; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',' && numero<150 ) { + ch=fgetc(fichero); + if(ch!=',') { buffer[numero] = ch; numero++; } + } + + buffer[numero] = '\0'; + setcolor(color); + /* select the registered font */ + settextstyle( fuente, orientacion, size); + outtextxy(x, y, buffer); + + + } + + + if (ch!=EOF) ch=fgetc(fichero); + } + + if( fclose(fichero) != 0 ) return ERROR_CERRANDO; + return OK; +} + +void Imprime_Secuencia(int Sec_num){ + int psec = P_Sec(Sec_num-1); + for(int i=0; in_Botones_Secuencia[Sec_num-1] ) return; + + Boton--; + + if( Color < 0 ) + { + Imprime_Boton( 0, Botones[psec+Boton] ); + return; + } + +if ( Botones[psec+Boton].Down < 0 ) + { + + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + for ( puntos[0] = 0; puntos[0] < Botones[psec+Boton].Ab; puntos[0]++ ) + circle( Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right - puntos[0]); + + if( Botones[psec+Boton].Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Botones[psec+Boton].Cdf); + circle( Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right); + } + + } else { + + puntos[0] = Botones[psec+Boton].Left; puntos[1] = Botones[psec+Boton].Up; + puntos[2] = Botones[psec+Boton].Right; puntos[3] = Botones[psec+Boton].Up; + puntos[4] = Botones[psec+Boton].Right; puntos[5] = Botones[psec+Boton].Down; + puntos[6] = (Botones[psec+Boton].Right-Botones[psec+Boton].Ab); puntos[7] = (Botones[psec+Boton].Down-Botones[psec+Boton].Ab); + puntos[8] = (Botones[psec+Boton].Right-Botones[psec+Boton].Ab); puntos[9] = (Botones[psec+Boton].Up+Botones[psec+Boton].Ab); + puntos[10] = (Botones[psec+Boton].Left+Botones[psec+Boton].Ab); puntos[11] = (Botones[psec+Boton].Up+Botones[psec+Boton].Ab); + puntos[12] = Botones[psec+Boton].Left; puntos[13] = Botones[psec+Boton].Up; + + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + puntos[0] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[1] = Botones[psec+Boton].Up+Botones[psec+Boton].Ab; + puntos[2] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[3] = Botones[psec+Boton].Down-Botones[psec+Boton].Ab; + puntos[4] = Botones[psec+Boton].Right-Botones[psec+Boton].Ab; puntos[5] = Botones[psec+Boton].Down-Botones[psec+Boton].Ab; + puntos[6] = Botones[psec+Boton].Right; puntos[7] = Botones[psec+Boton].Down; + puntos[8] = Botones[psec+Boton].Left; puntos[9] = Botones[psec+Boton].Down; + puntos[10] = Botones[psec+Boton].Left; puntos[11] = Botones[psec+Boton].Up; + puntos[12] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[13] = Botones[psec+Boton].Up+Botones[psec+Boton].Ab; + + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if( Botones[psec+Boton].Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Botones[psec+Boton].Cdf); + rectangle(Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right, Botones[psec+Boton].Down); + } +} + +} + + +int Comprueba_Secuencia(int Sec_num){ + + char key, key2=0; + int i, Pulso = 0; + int psec = P_Sec(Sec_num-1); + + + + if ( Espera_Tecla_o_Raton() == 0 ) { + + if ( (key = getch())==0) key2 = getch(); + for(i=0; i= Botones[psec+i].Left - Botones[psec+i].Right) && (x_raton <= Botones[psec+i].Left + Botones[psec+i].Right) && + (y_raton >= Botones[psec+i].Up - Botones[psec+i].Right) && (y_raton <= Botones[psec+i].Up + Botones[psec+i].Right) ) { + + Pulso = i + 1; + Push = ON; + Imprime_Boton_i(Botones[psec+Pulso-1]); + Anclar_Raton(); + if( Push == ON && True_Push == ON ) Deprime_Image(Botones[psec+Pulso-1]); + Push = OFF; + Imprime_Boton(0, Botones[psec+Pulso-1]); + return Pulso; + } + else + if( (x_raton >= Botones[psec+i].Left) && (x_raton <= Botones[psec+i].Right) && + (y_raton >= Botones[psec+i].Up) && (y_raton <= Botones[psec+i].Down) ) { + + Pulso = i + 1; + Push = ON; + Imprime_Boton_i(Botones[psec+Pulso-1]); + Anclar_Raton(); + if( Push == ON && True_Push == ON ) Deprime_Image(Botones[psec+Pulso-1]); + Push = OFF; + Imprime_Boton(0, Botones[psec+Pulso-1]); + return Pulso; + } + + return (0); +} + + +void Anclar_Raton(void){ + + union REGS io; + io.x.ax = 3; + do { + int86(0x33, &io, &io); + } while( (io.x.bx & 1)==1 || ((io.x.bx >> 1) & 1)==1); +} + + +int Espera_TeclaRaton(void){ + +// inicializa_raton_grafico(0, 0, 624, 464); +// char boton_izq, boton_der; + char Que; + activa_raton(); + + union REGS io; + io.x.ax = 3; + + do{ + int86(0x33, &io, &io); // lee posicin y estados del botn +// boton_izq = io.x.bx & 1; +// boton_der = (io.x.bx >> 1) & 1; + x_raton = io.x.cx; + y_raton = io.x.dx; + + }while( (io.x.bx & 1) == 0 && ((io.x.bx >> 1) & 1) == 0 && !MB_TeclaPulsada() ); + + + + + ///////////////////////////////////////// + // RETURN Derecho Izquierdo // + // // + // 0 0 0 // + // 1 1 0 // + // 2 0 1 // + // 3 1 1 // + // // + ///////////////////////////////////////// + + + if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==0 ) Que = 0; + if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==0 ) Que = 1; + if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==1 ) Que = 2; + if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==1 ) Que = 3; + + desactiva_raton(); + return Que; +} + + + + +void inicializa_raton_grafico(int x1, int y1, int x2, int y2) +{ + +int px = x_raton, py = y_raton; + + struct SREGS seg; + union REGS ent, sal; + long dir; + + ent.x.ax = 0; + int86(0x33, &ent, &sal); /* averigua si hay ratn conectado */ + + raton = sal.x.ax; /* indica a la variable global el estado + del raton */ + + if(raton!=0) { + + + ent.x.ax = 15; + ent.x.cx = 5; + ent.x.dx = 11; + int86(0x33, &ent, &sal); /* fija la razn mickey/pixel */ + + ent.x.ax = 7; + ent.x.cx = x1; + ent.x.dx = x2; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. horizontal */ + + ent.x.ax = 8; + ent.x.cx = y1; + ent.x.dx = y2; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. vertical */ + + if ( PunteroRaton == 100 ) { + if ( Carga_Puntero_Animado() ) { PunteroRaton = 1; Carga_Puntero(); } +} else Carga_Puntero(); + + if( PunteroRaton != 100 && PunteroRaton != 0) { + dir = (long)dir_raton; + ent.x.ax = 9; + ent.x.bx = 0; + ent.x.cx = 0; + ent.x.dx = (int) dir; + seg.es = (int) (dir >> 16); + int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */ + } + + ent.x.ax = 4; + ent.x.cx = px; + x_raton=ent.x.cx >> 1; + ent.x.dx = py; + y_raton=ent.x.dx; + int86(0x33, &ent, &sal); /* fija la posicin del ratn */ + + ent.x.ax = 1; + +if( PunteroRaton != 100 ) + int86(0x33, &ent, &sal); /* muestra el puntero del ratn */ + + desactiva_raton(); + + } +} + +void activa_raton(void) +{ + union REGS ent; + + ent.x.ax = 1; + int86(0x33, &ent, &ent); +} + +void desactiva_raton(void) +{ + union REGS ent; + + ent.x.ax = 2; + int86(0x33, &ent, &ent); +} + + + + + +void Initialize(int GraphDriver, int GraphMode) +{ + int errorcode; + +/* + if( (errorcode = registerbgifont(SMALL_FONT)) < 0 ) + ErrorOccurred(errorcode); +*/ + + /* report any registration errors */ +/* if ( (errorcode = registerbgidriver(EGAVGA_driver) ) < 0) + ErrorOccurred(errorcode); +*/ + /* initialize graphics and local variables */ + initgraph( &GraphDriver, &GraphMode, "" ); + + /* read result of initialization */ + errorcode = graphresult(); + if (errorcode != grOk) /* an error occurred */ + ErrorOccurred(errorcode); + + +} + +void ErrorOccurred(int errorcode) { + printf("Graphics error: %s\n", grapherrormsg(errorcode)); + printf("Press any key to halt:"); + getch(); + exit(1); /* terminate with an error code */ +} + +void Libera_Memoria(void){ + if ( memoria_asignada == 1 ) { // Libera antiguos datos + free(n_Botones_Secuencia); + farfree(Botones); + memoria_asignada = 0; + } +} + + +int Espera_Tecla_o_Raton(void){ + +// inicializa_raton_grafico(0, 0, 624, 464); +char Vez_Raton; int x, y; +char boton_izq=0, boton_der=0; +char Que; +// static char vez = 0; + +Vez_Raton = 0; + +union REGS io; + +if ( PunteroRaton!=100 ){ return Espera_TeclaRaton(); } + +if(raton!=0) { + desactiva_raton(); + io.x.ax = 3; +} + + do{ + if(raton!=0) { + int86(0x33, &io, &io); // lee posicin y estados del botn + boton_izq = io.x.bx & 1; + boton_der = (io.x.bx >> 1) & 1; + if ( x_raton != io.x.cx || y_raton != io.x.dx ) { + if(Vez_Raton==0) Vez_Raton = 1; else + putimage(x_raton, y_raton, Pantalla, COPY_PUT); + x_raton = io.x.cx; + y_raton = io.x.dx; + getimage(x_raton, y_raton, x_raton+21, y_raton+21, Pantalla); + + if( Vez_Raton ==14 ) { Vez_Raton = 1; } + if( Vez_Raton ==13 ) { Vez_Raton =14; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton ==12 ) { Vez_Raton =13; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton ==11 ) { Vez_Raton =12; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton ==10 ) { Vez_Raton =11; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 9 ) { Vez_Raton =10; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 8 ) { Vez_Raton = 9; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 7 ) { Vez_Raton = 8; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 6 ) { Vez_Raton = 7; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 5 ) { Vez_Raton = 6; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 4 ) { Vez_Raton = 5; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton == 3 ) { Vez_Raton = 4; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton == 2 ) { Vez_Raton = 3; // putimage(x_raton, y_raton, P_Raton1, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton1[x+y*20] != 253) putpixel(x_raton + x, y_raton + y, P_Raton1[x+y*20]); + + } + if( Vez_Raton == 1 ) { Vez_Raton = 2; // putimage(x_raton, y_raton, P_Raton1, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton1[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton1[x+y*20]); + + } + +/* + if( Vez_Raton == 1 ) { Vez_Raton = 1; + + for(y=0; y<=20; y++) + for(x=0; x<=20; x++) + if( P_Raton1[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton1[4+x+y*20]); + putimage(x_raton, y_raton, P_Raton1, 0); + + } +*/ + } + } + }while( boton_izq == 0 && boton_der == 0 && !MB_TeclaPulsada() ); + +if( raton!=0 ) + putimage(x_raton, y_raton, Pantalla, COPY_PUT); + + + + ///////////////////////////////////////// + // RETURN Derecho Izquierdo // + // // + // 0 0 0 // + // 1 1 0 // + // 2 0 1 // + // 3 1 1 // + // // + ///////////////////////////////////////// + + + if ( boton_der==0 && boton_izq==0 ) Que = 0; + if ( boton_der==1 && boton_izq==0 ) Que = 1; + if ( boton_der==0 && boton_izq==1 ) Que = 2; + if ( boton_der==1 && boton_izq==1 ) Que = 3; +/* +if(raton!=0) + activa_raton(); +*/ + return Que; +} + + +unsigned long JD_imagesize(int left, int top, int right, int bottom) { + + unsigned long X_width, Y_width; + + X_width= ( (left > right) ? (left - right + 1) : ( right - left + 1) ); + Y_width= ( ( top > bottom) ? ( top - bottom + 1) : (bottom - top + 1) ); + + return (X_width * Y_width + 4); + +}; + + +void Libera_Raton_Animado(void){ + + +if ( PunteroRaton == 100 ) { + free(P_Raton1); + free(P_Raton2); + free(P_Raton3); + free(P_Raton4); + free(Pantalla); +} + +} + +void Carga_Puntero(void){ + + switch( PunteroRaton ) { + + case 0: + break; + case 1: + dir_raton [ 0] = 0x007F; /* 1 1 1 1 1 1 1*/ + dir_raton [ 1] = 0x00FF; /* 1 1 1 1 1 1 1 1*/ + dir_raton [ 2] = 0x01FF; /* 1 1 1 1 1 1 1 1 1*/ + dir_raton [ 3] = 0x01FF; /* 1 1 1 1 1 1 1 1 1*/ + dir_raton [ 4] = 0x00FF; /* 1 1 1 1 1 1 1 1*/ + dir_raton [ 5] = 0x007F; /* 1 1 1 1 1 1 1*/ + dir_raton [ 6] = 0x18FF; /* 1 1 1 1 1 1 1 1 1 1*/ + + dir_raton [ 7] = 0x800F; /*1 1 1 1 1*/ + dir_raton [ 8] = 0x8083; /*1 1 1*/ + dir_raton [ 9] = 0x8001; /*1 1*/ + dir_raton [10] = 0xF810; /*1 1 1 1 1 1 1*/ + dir_raton [11] = 0x8810; /*1 1 1 1*/ + dir_raton [12] = 0x8811; /*1 1 1 1*/ + dir_raton [13] = 0x8003; /*1 1 1*/ + dir_raton [14] = 0x8007; /*1 1 1 1*/ + dir_raton [15] = 0x800F; /*1 1 1 1 1*/ + + dir_raton [16] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [17] = 0x7E00; /*0 0 0 0 0 0 0 0 0 0*/ + dir_raton [18] = 0x7C00; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [19] = 0x7C00; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [20] = 0x7E00; /*0 0 0 0 0 0 0 0 0 0*/ + dir_raton [21] = 0x6700; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [22] = 0x0200; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + + dir_raton [23] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [24] = 0x3E70; /*0 0 0 0 0 0 0 0*/ + dir_raton [25] = 0x0248; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [26] = 0x0244; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [27] = 0x0242; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [28] = 0x2244; /*0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [29] = 0x2248; /*0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [30] = 0x3E70; /*0 0 0 0 0 0 0 0*/ + dir_raton [31] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + }; + + +}; + +int Carga_Puntero_Animado(void) { + + +// char *P_Raton; +if( ((P_Raton1 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton2 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton3 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton4 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) ) { + return 1; + } + +if ( (Pantalla = malloc( JD_imagesize(0, 0, 22, 22) )) == NULL ) + return 1; +/* +P_Raton = P_Raton1; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton2; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton3; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton4; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*/ +return 0; +} + + +/// int MB_TeclaPulsada(void) +/* Esta funcin mira si se ha pulsado una tecla pero SIN llamadas a la BIOS, + de forma que no se inhabilitan las interrupciones en cada llamada, cosa + que bajara mucho la calidad de reproduccin con el altavoz interno. */ +/// { +/// return ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ); +/// } + + +aton == 8 ) { Vez_Raton = 9; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 7 ) { Vez_Raton = 8; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; \ No newline at end of file diff --git a/MAKE_BOT/MAKE_BOT.CPP b/MAKE_BOT/MAKE_BOT.CPP new file mode 100644 index 0000000..3f3031e --- /dev/null +++ b/MAKE_BOT/MAKE_BOT.CPP @@ -0,0 +1,1523 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "d:\program\src_dos\libs\make_bot\make_bot.h" + +#define MB_TeclaPulsada() ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ) + +/**/ +/* MAKE BOTON */ +/**/ + + void ErrorOccurred(int errorcode); + + struct Make_Boton { + /* unsigned */ int Up, Left, Down, Right; + unsigned char Cdf, Cb1, Cb2; + unsigned char Ab, Pb; + unsigned char Isc, Sc; + }; + + int P_Sec(int numero); + int lee_objeto(FILE *); + void Deprime_Image(struct Make_Boton Bot_Imp); + void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp); + + char True_Push = OFF, // Parametros para el TRUE_PUSH + Push = OFF; // PRESION REAL !!! + void far *arrow; // YA !!! + + int Secuencias, *n_Botones_Secuencia; + char memoria_asignada = 0;//, vez = 0; + + struct Make_Boton far *Botones; // Puntero a estructura + + +/**/ +/* Control del Raton */ +/**/ + + void Carga_Puntero(void); + int Carga_Puntero_Animado(void); + + void *Pantalla; + unsigned char *P_Raton1, *P_Raton2, *P_Raton3, *P_Raton4; + char raton=0, // Indica si hay un Raton = 1 + PunteroRaton=0; // Se modifica el puntero ? + + int x_raton=50, y_raton=50, // Tras Espera_Tecla_o_Raton(); devuelve + dir_raton [32+32]; // las coordenadas y botones pulsados... + + + unsigned char BLANCO = 255, GRIS_CLARO = 253, NEGRO = 240, UNKNOW = 249, AZUL = 250; + +////////////////////////////////////////////////////////////////////////////// +/////////////////////////>>>> Inicio del codigo <<<<<='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + Secuencias = numero; + if (( n_Botones_Secuencia = (int *) malloc( sizeof(int)*Secuencias ) ) == NULL) { + printf("\nNo Hay suficiente Memoria, ni para un Boton\n\n"); + return SIN_MEMORIA; + } + } + + if (ch=='!') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + temp_num = numero; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + n_Botones_Secuencia[temp_num - 1] = numero; + + SiZe_BoToN += ( sizeof( struct Make_Boton ) * numero); + + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = temp_num; + return SIN_MEMORIA; + } + memoria_asignada = 1; + } + if (ch=='$') { //Clculos del boton + inc_Botones++; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Left = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Up = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Right =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + if(ch == '-' || ch == '-') signo = 1; + ch=fgetc(fichero); + } + if ( signo == 1 ) + Botones [inc_Botones]. Down =numero * -1; + else + Botones [inc_Botones]. Down =numero; + signo = 0; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cdf =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cb1 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Cb2 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Ab =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Pb =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Isc =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Botones [inc_Botones]. Sc =numero; + + } + + if (ch!=EOF) ch=fgetc(fichero); + } + + return OK; +} + + +void despliega_datos(void){ + int SeCa; + + clrscr(); + for(int SeC=0; SeC<=Secuencias; SeC++){ + SeCa = P_Sec(SeC); + for(int Sec_S=0; Sec_S 0) + { + puntos[1] = 120; + puntos[2] = 300; + } else { + puntos[1] = 60; + puntos[2] = 240; + } + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[1]+puntos[0], puntos[2]+puntos[0], Bot_Imp.Right - puntos[0]); + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[2]+puntos[0], puntos[1]+puntos[0], Bot_Imp.Right - puntos[0]); + + if(D_Bord) { + setcolor(Bot_Imp.Cdf); + setfillstyle(SOLID_FILL, Bot_Imp.Cdf); + pieslice( Bot_Imp.Left, Bot_Imp.Up, 0, 360, Bot_Imp.Right - Ab); + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + circle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right); + } + + } else { + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right; puntos[5] = Bot_Imp.Down; + puntos[6] = (Bot_Imp.Right-Ab); puntos[7] = (Bot_Imp.Down-Ab); + puntos[8] = (Bot_Imp.Right-Ab); puntos[9] = (Bot_Imp.Up+Ab); + puntos[10] = (Bot_Imp.Left+Ab); puntos[11] = (Bot_Imp.Up+Ab); + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } else { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right - Ab; puntos[5] = Bot_Imp.Up + Ab; + puntos[6] = Bot_Imp.Left + Ab; puntos[7] = Bot_Imp.Up + Ab; + puntos[8] = Bot_Imp.Left + Ab; puntos[9] = Bot_Imp.Down - Ab; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Down; + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left+Ab; puntos[1] = Bot_Imp.Up+Ab; + puntos[2] = Bot_Imp.Left+Ab; puntos[3] = Bot_Imp.Down-Ab; + puntos[4] = Bot_Imp.Right-Ab; puntos[5] = Bot_Imp.Down-Ab; + puntos[6] = Bot_Imp.Right; puntos[7] = Bot_Imp.Down; + puntos[8] = Bot_Imp.Left; puntos[9] = Bot_Imp.Down; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Up; + puntos[12] = Bot_Imp.Left+Ab; puntos[13] = Bot_Imp.Up+Ab; + } else { + puntos[0] = Bot_Imp.Right; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Down; + puntos[4] = Bot_Imp.Left; puntos[5] = Bot_Imp.Down; + puntos[6] = Bot_Imp.Left+Ab; puntos[7] = Bot_Imp.Down-Ab; + puntos[8] = Bot_Imp.Right-Ab; puntos[9] = Bot_Imp.Down-Ab; + puntos[10] = Bot_Imp.Right-Ab; puntos[11] = Bot_Imp.Up+Ab; + puntos[12] = Bot_Imp.Right; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if(D_Bord) { + setcolor(Bot_Imp.Cdf); + setfillstyle(SOLID_FILL, Bot_Imp.Cdf); + bar(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1); + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + rectangle(Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right, Bot_Imp.Down); + } +} + +} + +void Imprime_Boton_i(struct Make_Boton Bot_Imp){ + + int puntos[14]; + unsigned char Ab = Bot_Imp.Ab; + unsigned long size; + +if ( Bot_Imp.Down < 0 ) + { + if(Bot_Imp.Pb > 0) + { + puntos[1] = 120; + puntos[2] = 300; + } else { + puntos[1] = 60; + puntos[2] = 240; + } + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[1]+puntos[0], puntos[2]+puntos[0], Bot_Imp.Right - puntos[0]); + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + for ( puntos[0] = 0; puntos[0] < Ab; puntos[0]++ ) + arc( Bot_Imp.Left, Bot_Imp.Up, puntos[2]+puntos[0], puntos[1]+puntos[0], Bot_Imp.Right - puntos[0]); + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + circle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right); + } + + } else { + + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right; puntos[5] = Bot_Imp.Down; + puntos[6] = (Bot_Imp.Right-Ab); puntos[7] = (Bot_Imp.Down-Ab); + puntos[8] = (Bot_Imp.Right-Ab); puntos[9] = (Bot_Imp.Up+Ab); + puntos[10] = (Bot_Imp.Left+Ab); puntos[11] = (Bot_Imp.Up+Ab); + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } else { + puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up; + puntos[4] = Bot_Imp.Right - Ab; puntos[5] = Bot_Imp.Up + Ab; + puntos[6] = Bot_Imp.Left + Ab; puntos[7] = Bot_Imp.Up + Ab; + puntos[8] = Bot_Imp.Left + Ab; puntos[9] = Bot_Imp.Down - Ab; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Down; + puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up; + } + + setcolor(Bot_Imp.Cb2); + setfillstyle(SOLID_FILL, Bot_Imp.Cb2); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + /* calculate the size of the image */ + size = JD_imagesize(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1); + + /* allocate memory to hold the image */ + if (True_Push == ON) + if ( (arrow = farmalloc(size)) == NULL ) Push = OFF; else { + /* grab the image */ + getimage(Bot_Imp.Left+Ab+1, Bot_Imp.Up+Ab+1, Bot_Imp.Right-Ab-1, Bot_Imp.Down-Ab-1, arrow); + } + + if(Push == ON && True_Push == ON ) { + if(Bot_Imp.Pb == 2) { + putimage(Bot_Imp.Left+1, Bot_Imp.Up+(Ab*2), arrow, COPY_PUT); + } else { + putimage(Bot_Imp.Left+(Ab*2), Bot_Imp.Up+(Ab*2), arrow, COPY_PUT); + } + } else { + if(Bot_Imp.Pb == 2) { + puntos[0] = Bot_Imp.Left+Ab; puntos[1] = Bot_Imp.Up+Ab; + puntos[2] = Bot_Imp.Left+Ab; puntos[3] = Bot_Imp.Down-Ab; + puntos[4] = Bot_Imp.Right-Ab; puntos[5] = Bot_Imp.Down-Ab; + puntos[6] = Bot_Imp.Right; puntos[7] = Bot_Imp.Down; + puntos[8] = Bot_Imp.Left; puntos[9] = Bot_Imp.Down; + puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Up; + puntos[12] = Bot_Imp.Left+Ab; puntos[13] = Bot_Imp.Up+Ab; + } else { + puntos[0] = Bot_Imp.Right; puntos[1] = Bot_Imp.Up; + puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Down; + puntos[4] = Bot_Imp.Left; puntos[5] = Bot_Imp.Down; + puntos[6] = Bot_Imp.Left+Ab; puntos[7] = Bot_Imp.Down-Ab; + puntos[8] = Bot_Imp.Right-Ab; puntos[9] = Bot_Imp.Down-Ab; + puntos[10] = Bot_Imp.Right-Ab; puntos[11] = Bot_Imp.Up+Ab; + puntos[12] = Bot_Imp.Right; puntos[13] = Bot_Imp.Up; + } + setcolor(Bot_Imp.Cb1); + setfillstyle(SOLID_FILL, Bot_Imp.Cb1); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + } + + if( Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Bot_Imp.Cdf); + rectangle(Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right, Bot_Imp.Down); + } +} + +} + +// +// + +void Deprime_Image(struct Make_Boton Bot_Imp){ + putimage(Bot_Imp.Left+Bot_Imp.Ab+1, Bot_Imp.Up+Bot_Imp.Ab+1, arrow, COPY_PUT); + farfree(arrow); +} + +// +// + +int Imprime_Estaticos(int Sec_st, char *file){ + + char ch, Relleno = 1, buffer[160]; + unsigned char fuente, size, orientacion, color, + signo=0; + unsigned int /*numero, */ temp_num, temp_b; + int numero; + + int secuencia_activa=-1, x, y; + + struct Make_Boton Bot_Static; + + FILE* fichero; // Fichero con datos del obj. + + if ( (fichero=fopen(file,"r"))==NULL ) return ERROR_ABRIENDO; + + ch=fgetc(fichero); //Lee el primer caracter + while (ch!=EOF) { //Lee hasta fin de fichero + + if (ch=='*') //Linea con comentario + while (ch!=EOL && ch!=EOF) ch=fgetc(fichero); + + if (ch=='') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + secuencia_activa = numero; + } + + if (ch=='&' && secuencia_activa == Sec_st) { //Clculos del boton estatico + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Left = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Up = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Right =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + if(ch == '-' || ch == '-') signo = 1; + ch=fgetc(fichero); + } + if ( signo==1 ) + Bot_Static.Down =numero * -1; + else + Bot_Static.Down =numero; + signo = 0; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cdf =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cb1 =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Cb2 =numero; + + numero=0; Relleno = 1; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; else + if(ch == '-' || ch == '-') Relleno = 0; + ch=fgetc(fichero); + } + Bot_Static.Ab =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + Bot_Static.Pb =numero; + Imprime_Boton(Relleno, Bot_Static); + } + if (ch=='|' && secuencia_activa == Sec_st) { //Clculos del texto + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + x = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + y = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fuente = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + size = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + orientacion = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + color = numero; + + buffer[0] = '\0'; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',' && numero<150 ) { + ch=fgetc(fichero); + if(ch!=',') { buffer[numero] = ch; numero++; } + } + + buffer[numero] = '\0'; + setcolor(color); + /* select the registered font */ + settextstyle( fuente, orientacion, size); + outtextxy(x, y, buffer); + + + } + + + if (ch!=EOF) ch=fgetc(fichero); + } + + if( fclose(fichero) != 0 ) return ERROR_CERRANDO; + return OK; +} + +void Imprime_Secuencia(int Sec_num){ + int psec = P_Sec(Sec_num-1); + for(int i=0; in_Botones_Secuencia[Sec_num-1] ) return; + + Boton--; + + if( Color < 0 ) + { + Imprime_Boton( 0, Botones[psec+Boton] ); + return; + } + +if ( Botones[psec+Boton].Down < 0 ) + { + + setlinestyle(0, 1, NORM_WIDTH); + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + for ( puntos[0] = 0; puntos[0] < Botones[psec+Boton].Ab; puntos[0]++ ) + circle( Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right - puntos[0]); + + if( Botones[psec+Boton].Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Botones[psec+Boton].Cdf); + circle( Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right); + } + + } else { + + puntos[0] = Botones[psec+Boton].Left; puntos[1] = Botones[psec+Boton].Up; + puntos[2] = Botones[psec+Boton].Right; puntos[3] = Botones[psec+Boton].Up; + puntos[4] = Botones[psec+Boton].Right; puntos[5] = Botones[psec+Boton].Down; + puntos[6] = (Botones[psec+Boton].Right-Botones[psec+Boton].Ab); puntos[7] = (Botones[psec+Boton].Down-Botones[psec+Boton].Ab); + puntos[8] = (Botones[psec+Boton].Right-Botones[psec+Boton].Ab); puntos[9] = (Botones[psec+Boton].Up+Botones[psec+Boton].Ab); + puntos[10] = (Botones[psec+Boton].Left+Botones[psec+Boton].Ab); puntos[11] = (Botones[psec+Boton].Up+Botones[psec+Boton].Ab); + puntos[12] = Botones[psec+Boton].Left; puntos[13] = Botones[psec+Boton].Up; + + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + puntos[0] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[1] = Botones[psec+Boton].Up+Botones[psec+Boton].Ab; + puntos[2] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[3] = Botones[psec+Boton].Down-Botones[psec+Boton].Ab; + puntos[4] = Botones[psec+Boton].Right-Botones[psec+Boton].Ab; puntos[5] = Botones[psec+Boton].Down-Botones[psec+Boton].Ab; + puntos[6] = Botones[psec+Boton].Right; puntos[7] = Botones[psec+Boton].Down; + puntos[8] = Botones[psec+Boton].Left; puntos[9] = Botones[psec+Boton].Down; + puntos[10] = Botones[psec+Boton].Left; puntos[11] = Botones[psec+Boton].Up; + puntos[12] = Botones[psec+Boton].Left+Botones[psec+Boton].Ab; puntos[13] = Botones[psec+Boton].Up+Botones[psec+Boton].Ab; + + setcolor(Color); + setfillstyle(SOLID_FILL, Color); + setlinestyle(0, 1, NORM_WIDTH); + fillpoly(7, puntos); + + if( Botones[psec+Boton].Ab >= 2 ) { + setcolor( NEGRO ); + setfillstyle(EMPTY_FILL, Botones[psec+Boton].Cdf); + rectangle(Botones[psec+Boton].Left, Botones[psec+Boton].Up, Botones[psec+Boton].Right, Botones[psec+Boton].Down); + } +} + +} + + +int Comprueba_Secuencia(int Sec_num){ + + char key, key2=0; + int i, Pulso = 0; + int psec = P_Sec(Sec_num-1); + + + + if ( Espera_Tecla_o_Raton() == 0 ) { + + if ( (key = getch())==0) key2 = getch(); + for(i=0; i= Botones[psec+i].Left) && (x_raton <= Botones[psec+i].Right) && + (y_raton >= Botones[psec+i].Up) && (y_raton <= Botones[psec+i].Down) ) { + + Pulso = i + 1; + Push = ON; + Imprime_Boton_i(Botones[psec+Pulso-1]); + Anclar_Raton(); + if( Push == ON && True_Push == ON ) Deprime_Image(Botones[psec+Pulso-1]); + Push = OFF; + Imprime_Boton(0, Botones[psec+Pulso-1]); + return Pulso; + } + + return (0); +} + + +void Anclar_Raton(void){ + + union REGS io; + io.x.ax = 3; + do { + int86(0x33, &io, &io); + } while( (io.x.bx & 1)==1 || ((io.x.bx >> 1) & 1)==1); +} + + +int Espera_TeclaRaton(void){ + +// inicializa_raton_grafico(0, 0, 624, 464); +// char boton_izq, boton_der; + char Que; + activa_raton(); + + union REGS io; + io.x.ax = 3; + + do{ + int86(0x33, &io, &io); // lee posicin y estados del botn +// boton_izq = io.x.bx & 1; +// boton_der = (io.x.bx >> 1) & 1; + x_raton = io.x.cx; + y_raton = io.x.dx; + + }while( (io.x.bx & 1) == 0 && ((io.x.bx >> 1) & 1) == 0 && !MB_TeclaPulsada() ); + + + + + ///////////////////////////////////////// + // RETURN Derecho Izquierdo // + // // + // 0 0 0 // + // 1 1 0 // + // 2 0 1 // + // 3 1 1 // + // // + ///////////////////////////////////////// + + + if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==0 ) Que = 0; + if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==0 ) Que = 1; + if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==1 ) Que = 2; + if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==1 ) Que = 3; + + desactiva_raton(); + return Que; +} + + + + +void inicializa_raton_grafico(int x1, int y1, int x2, int y2) +{ + +int px = x_raton, py = y_raton; + + struct SREGS seg; + union REGS ent, sal; + long dir; + + ent.x.ax = 0; + int86(0x33, &ent, &sal); /* averigua si hay ratn conectado */ + + raton = sal.x.ax; /* indica a la variable global el estado + del raton */ + + if(raton!=0) { + + + ent.x.ax = 15; + ent.x.cx = 5; + ent.x.dx = 11; + int86(0x33, &ent, &sal); /* fija la razn mickey/pixel */ + + ent.x.ax = 7; + ent.x.cx = x1; + ent.x.dx = x2; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. horizontal */ + + ent.x.ax = 8; + ent.x.cx = y1; + ent.x.dx = y2; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. vertical */ + + if ( PunteroRaton == 100 ) { + if ( Carga_Puntero_Animado() ) { PunteroRaton = 1; Carga_Puntero(); } +} else Carga_Puntero(); + + if( PunteroRaton != 100 && PunteroRaton != 0) { + dir = (long)dir_raton; + ent.x.ax = 9; + ent.x.bx = 0; + ent.x.cx = 0; + ent.x.dx = (int) dir; + seg.es = (int) (dir >> 16); + int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */ + } + + ent.x.ax = 4; + ent.x.cx = px; + x_raton=ent.x.cx >> 1; + ent.x.dx = py; + y_raton=ent.x.dx; + int86(0x33, &ent, &sal); /* fija la posicin del ratn */ + + ent.x.ax = 1; + +if( PunteroRaton != 100 ) + int86(0x33, &ent, &sal); /* muestra el puntero del ratn */ + + desactiva_raton(); + + } +} + +void activa_raton(void) +{ + union REGS ent; + + ent.x.ax = 1; + int86(0x33, &ent, &ent); +} + +void desactiva_raton(void) +{ + union REGS ent; + + ent.x.ax = 2; + int86(0x33, &ent, &ent); +} + + + + + +void Initialize(int GraphDriver, int GraphMode) +{ + int errorcode; + +/* + if( (errorcode = registerbgifont(SMALL_FONT)) < 0 ) + ErrorOccurred(errorcode); +*/ + + /* report any registration errors */ +/* if ( (errorcode = registerbgidriver(EGAVGA_driver) ) < 0) + ErrorOccurred(errorcode); +*/ + /* initialize graphics and local variables */ + initgraph( &GraphDriver, &GraphMode, "" ); + + /* read result of initialization */ + errorcode = graphresult(); + if (errorcode != grOk) /* an error occurred */ + ErrorOccurred(errorcode); + + +} + +void ErrorOccurred(int errorcode) { + printf("Graphics error: %s\n", grapherrormsg(errorcode)); + printf("Press any key to halt:"); + getch(); + exit(1); /* terminate with an error code */ +} + +void Libera_Memoria(void){ + if ( memoria_asignada == 1 ) { // Libera antiguos datos + free(n_Botones_Secuencia); + farfree(Botones); + memoria_asignada = 0; + } +} + + +int Espera_Tecla_o_Raton(void){ + +// inicializa_raton_grafico(0, 0, 624, 464); +char Vez_Raton; int x, y; +char boton_izq=0, boton_der=0; +char Que; +// static char vez = 0; + +Vez_Raton = 0; + +union REGS io; + +if ( PunteroRaton!=100 ){ return Espera_TeclaRaton(); } + +if(raton!=0) { + desactiva_raton(); + io.x.ax = 3; +} + + do{ + if(raton!=0) { + int86(0x33, &io, &io); // lee posicin y estados del botn + boton_izq = io.x.bx & 1; + boton_der = (io.x.bx >> 1) & 1; + if ( x_raton != io.x.cx || y_raton != io.x.dx ) { + if(Vez_Raton==0) Vez_Raton = 1; else + putimage(x_raton, y_raton, Pantalla, COPY_PUT); + x_raton = io.x.cx; + y_raton = io.x.dx; + getimage(x_raton, y_raton, x_raton+21, y_raton+21, Pantalla); + + if( Vez_Raton ==14 ) { Vez_Raton = 1; } + if( Vez_Raton ==13 ) { Vez_Raton =14; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton ==12 ) { Vez_Raton =13; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton ==11 ) { Vez_Raton =12; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton ==10 ) { Vez_Raton =11; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 9 ) { Vez_Raton =10; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 8 ) { Vez_Raton = 9; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 7 ) { Vez_Raton = 8; // putimage(x_raton, y_raton, P_Raton4, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton4[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton4[x+y*20]); + } else + if( Vez_Raton == 6 ) { Vez_Raton = 7; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 5 ) { Vez_Raton = 6; // putimage(x_raton, y_raton, P_Raton3, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton3[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton3[x+y*20]); + } else + if( Vez_Raton == 4 ) { Vez_Raton = 5; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton == 3 ) { Vez_Raton = 4; // putimage(x_raton, y_raton, P_Raton2, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton2[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton2[x+y*20]); + } else + if( Vez_Raton == 2 ) { Vez_Raton = 3; // putimage(x_raton, y_raton, P_Raton1, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton1[x+y*20] != 253) putpixel(x_raton + x, y_raton + y, P_Raton1[x+y*20]); + + } + if( Vez_Raton == 1 ) { Vez_Raton = 2; // putimage(x_raton, y_raton, P_Raton1, 0); + for(y=0; y<20; y++) + for(x=0; x<20; x++) + if( P_Raton1[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton1[x+y*20]); + + } + +/* + if( Vez_Raton == 1 ) { Vez_Raton = 1; + + for(y=0; y<=20; y++) + for(x=0; x<=20; x++) + if( P_Raton1[x+y*20] != 253 ) putpixel(x_raton + x, y_raton + y, P_Raton1[4+x+y*20]); + putimage(x_raton, y_raton, P_Raton1, 0); + + } +*/ + } + } + }while( boton_izq == 0 && boton_der == 0 && !MB_TeclaPulsada() ); + +if( raton!=0 ) + putimage(x_raton, y_raton, Pantalla, COPY_PUT); + + + + ///////////////////////////////////////// + // RETURN Derecho Izquierdo // + // // + // 0 0 0 // + // 1 1 0 // + // 2 0 1 // + // 3 1 1 // + // // + ///////////////////////////////////////// + + + if ( boton_der==0 && boton_izq==0 ) Que = 0; + if ( boton_der==1 && boton_izq==0 ) Que = 1; + if ( boton_der==0 && boton_izq==1 ) Que = 2; + if ( boton_der==1 && boton_izq==1 ) Que = 3; +/* +if(raton!=0) + activa_raton(); +*/ + return Que; +} + + +unsigned long JD_imagesize(int left, int top, int right, int bottom) { + + unsigned long X_width, Y_width; + + X_width= ( (left > right) ? (left - right + 1) : ( right - left + 1) ); + Y_width= ( ( top > bottom) ? ( top - bottom + 1) : (bottom - top + 1) ); + + return (X_width * Y_width + 4); + +}; + + +void Libera_Raton_Animado(void){ + + +if ( PunteroRaton == 100 ) { + free(P_Raton1); + free(P_Raton2); + free(P_Raton3); + free(P_Raton4); + free(Pantalla); +} + +} + +void Carga_Puntero(void){ + + switch( PunteroRaton ) { + + case 0: + break; + case 1: + dir_raton [ 0] = 0x007F; /* 1 1 1 1 1 1 1*/ + dir_raton [ 1] = 0x00FF; /* 1 1 1 1 1 1 1 1*/ + dir_raton [ 2] = 0x01FF; /* 1 1 1 1 1 1 1 1 1*/ + dir_raton [ 3] = 0x01FF; /* 1 1 1 1 1 1 1 1 1*/ + dir_raton [ 4] = 0x00FF; /* 1 1 1 1 1 1 1 1*/ + dir_raton [ 5] = 0x007F; /* 1 1 1 1 1 1 1*/ + dir_raton [ 6] = 0x18FF; /* 1 1 1 1 1 1 1 1 1 1*/ + + dir_raton [ 7] = 0x800F; /*1 1 1 1 1*/ + dir_raton [ 8] = 0x8083; /*1 1 1*/ + dir_raton [ 9] = 0x8001; /*1 1*/ + dir_raton [10] = 0xF810; /*1 1 1 1 1 1 1*/ + dir_raton [11] = 0x8810; /*1 1 1 1*/ + dir_raton [12] = 0x8811; /*1 1 1 1*/ + dir_raton [13] = 0x8003; /*1 1 1*/ + dir_raton [14] = 0x8007; /*1 1 1 1*/ + dir_raton [15] = 0x800F; /*1 1 1 1 1*/ + + dir_raton [16] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [17] = 0x7E00; /*0 0 0 0 0 0 0 0 0 0*/ + dir_raton [18] = 0x7C00; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [19] = 0x7C00; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [20] = 0x7E00; /*0 0 0 0 0 0 0 0 0 0*/ + dir_raton [21] = 0x6700; /*0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [22] = 0x0200; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + + dir_raton [23] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [24] = 0x3E70; /*0 0 0 0 0 0 0 0*/ + dir_raton [25] = 0x0248; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [26] = 0x0244; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [27] = 0x0242; /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [28] = 0x2244; /*0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [29] = 0x2248; /*0 0 0 0 0 0 0 0 0 0 0 0*/ + dir_raton [30] = 0x3E70; /*0 0 0 0 0 0 0 0*/ + dir_raton [31] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + }; + + +}; + +int Carga_Puntero_Animado(void) { + + +// char *P_Raton; +if( ((P_Raton1 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton2 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton3 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) || + ((P_Raton4 = (unsigned char *)malloc( ( 22 * 22 ) ))==NULL) ) { + return 1; + } + +if ( (Pantalla = malloc( JD_imagesize(0, 0, 22, 22) )) == NULL ) + return 1; +/* +P_Raton = P_Raton1; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton2; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton3; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; +*P_Raton++ = BLANCO ; *P_Raton++ = NEGRO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; + +P_Raton = P_Raton4; +*P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = BLANCO ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = AZUL ; *P_Raton++ = AZUL ; +*P_Raton++ = AZUL ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; *P_Raton++ = GRIS_CLARO; +*P_Raton++ = GRIS_CLARO; *P_Raton++ = UNKNOW ; *P_Raton++ = UNKNOW ; *P_Raton++ = GRIS_CLARO; +*/ +return 0; +} + + +/// int MB_TeclaPulsada(void) +/* Esta funcin mira si se ha pulsado una tecla pero SIN llamadas a la BIOS, + de forma que no se inhabilitan las interrupciones en cada llamada, cosa + que bajara mucho la calidad de reproduccin con el altavoz interno. */ +/// { +/// return ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ); +/// } \ No newline at end of file diff --git a/MAKE_BOT/MAKE_BOT.H b/MAKE_BOT/MAKE_BOT.H new file mode 100644 index 0000000..f1d7d19 --- /dev/null +++ b/MAKE_BOT/MAKE_BOT.H @@ -0,0 +1,163 @@ +// +// Errores devueltos por las Funciones +// + +#define OK 1 +#define SIN_MEMORIA 5 +#define ERROR_ABRIENDO 6 +#define ERROR_CERRANDO 7 + +#define ON 1 +#define OFF 0 + +#define EOL 10 // Fin de linea + +#define MB_TeclaPulsada() ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ) +// +// Funciones propias de MAKE_BOTON +// + + // + // Carga los botones del fichero *f_datos, devolviendo los + // errores indicados en #define xxxxx X + // + int carga_botones(char *f_datos); + + // + // Despliega los datos que fueron cargados. + // + // + void despliega_datos(void); + + // + // Imprime los botones estaticos de la secuencia Sec_st, en el + // fichero file. + // + int Imprime_Estaticos(int Sec_st, char *file); + + // + // Imprime los botones dinmicos de la secuencia Sec_num. + // + // + void Imprime_Secuencia(int Sec_num); + + // + // + // Imprime un borde completo de color Color sobre el boton Boton, + // de la secuencia nmero Sec_num. + // + // NOTA: + // Si color es negativo se imprimiran los bordes normales. + // + // + void Imprime_Bordes(int Sec_num, int Boton, int Color); + + // + // Comprueba la pulsacin de los botones de la secuencia Sec_num + // + // Devuelve el nmero de boton pulsado, 0 si no se pulso ninguno + // y deja en el buffer las teclas pulsadas si no corresponden con + // con las teclas asignadas a los botones. + // + int Comprueba_Secuencia(int Sec_num); + + // + // Libera la memoria que ha sido asignada por Make_Boton. + // + // NOTA: + // DESPUES DE LIBERAR TODA LA MEMORIA DE M_B, NO SE DEBE + // UTILIZAR NINGUNA FUNCION SIN RECARGAR PRIMERO LOS BOTONES DE + // DE UN ARCHIVO CON ESTOS... + // + // FUNCION EXTRAIDA PARA USO COMUN, ESPECIALMENTE POR CD_out + // + void Libera_Memoria(void); + + // + // + // Si True_Push se pone a ON, cuando se pulse un boton se hundira + // realmente, pero solo si hay suficiente memoria. + // + // + extern char True_Push; + +// +// Funciones para el control de la Pantalla +// + // + // + // Sirve para averiguar el tamao necesitado por GetImage para + // obtener una imagen 256c, para los BGI no compatibles KERNEL. + // + // + unsigned long JD_imagesize(int left, int top, int right, int bottom); + + // + // + // Igual a InitGraph, pero realiza un mayor numero de comproba_ + // ciones, saliendo si ocurre algun error y mostrandolo... + // + // + void Initialize(int GraphDriver, int GraphMode); // Inicializa el Modo Grfico + +// +// Funciones para el control del Raton +// + + // + // + // Muestra el cursor del Raton. - No sirve con el raton animado + // + // + void activa_raton(void); + + // + // + // Desactiva el cursor del Raton. No sirve con el raton animado + // + // + void desactiva_raton(void); + + // + // + // Regresa con una pulsacin de tecla o la posicin en la cual + // se pulso el raton. + // + // + int Espera_Tecla_o_Raton(void); // <-> + + // + // + // Sostiene el raton hasta que se suelte el boton presionado... + // + // + void Anclar_Raton(void); + + // + // + // Libera la memoria asignada al Raton Animado. + // + // + void Libera_Raton_Animado(void); + + // + // + // Inicializa el Raton en el modo Grfico... + // + // x1, y1, x2, y2. Son los topes del RATON + // + // + // + // + void inicializa_raton_grafico(int x1, int y1, // Inicializa el Raton + int x2, int y2); // devolviendo raton = 1 + + + + extern char Push; + extern char raton; // Indica si hay un Raton = 1 + extern char PunteroRaton; // Se modifica el puntero ? + extern int x_raton, y_raton; // Tras Espera_Tecla_o_Raton(); devuelve +// extern int boton_izq, boton_der; // las coordenadas y botones pulsados... + + extern unsigned char BLANCO, GRIS_CLARO, NEGRO, UNKNOW, AZUL; diff --git a/MAKE_BOT/MB_2_C.CPP b/MAKE_BOT/MB_2_C.CPP new file mode 100644 index 0000000..ff52265 --- /dev/null +++ b/MAKE_BOT/MB_2_C.CPP @@ -0,0 +1,493 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define OK 1 +#define SIN_MEMORIA 5 +#define ERROR_ABRIENDO 6 +#define ERROR_CERRANDO 7 + +#define EOL 10 // Fin de linea + +int Secuencias; +int *n_Botones_Secuencia; +int memoria_asignada = 0, vez = 0; + +struct Make_Boton { + int Left, Up, Right, Down; + int Cdf, Cb1, Cb2; + int Ab, Pb; + int Isc, Sc; +}; + +struct Make_Boton far *Botones; // Puntero a estructura +struct Make_Boton Bot_Static; + +int Analiza_Fichero_Dinamicos(char *f_datos); +int Analiza_Fichero_Estaticos(char *f_datos); + +void ErrorOccurred(int errorcode); + +int lee_objeto(FILE *); // Lee el objeto del disco + +FILE *MB_out; + +void main(int argc, char *argv[] ) { + + char Buffer[80]; int len; + char *ptr = argv[2]; + + if ( argc != 3 ) { + + printf("\n"); + printf("FALTAN PARAMETROS\n"); + printf("\n"); + printf(" MB2SRC [Fichero_Fuente] [Destino_CPP.CPP]\n"); + printf("\n"); + + return; + } + + /* open a file for update */ + if( (MB_out = fopen(argv[2], "w")) == NULL ) { + printf("\nError Abriendo Archivo destino"); + return; + } + fprintf( MB_out, "/***************************************************************/\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/* Conversin de fuentes de MAKE BOTON en ASCII a fuentes */\n"); + fprintf( MB_out, "/* para CPP, que pueden ser compilados junto al programa. */\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/***************************************************************/\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/* MAKE BOTON es un programa realizado por Jos David Guilln */\n"); + fprintf( MB_out, "/* MB a CPP es una utilidad complementaria a Make Boton por */\n"); + fprintf( MB_out, "/* Jos David Guilln... */\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/***************************************************************/\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/* GRACIAS POR UTILIZAR MI SOFTWARE... */\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/* JOS DAVID GUILLN (c) 1995 */\n"); + fprintf( MB_out, "/* */\n"); + fprintf( MB_out, "/***************************************************************/\n"); + fprintf( MB_out, "\n\n\n"); + fprintf( MB_out, "// Debe indicar el directorio exacto de la Cabecera de MAKE BOTON\n"); + fprintf( MB_out, "#include \"Make_bot.h\"\n"); + fprintf( MB_out, "#include \"stdlib.h\"\n"); + fprintf( MB_out, "#include \"alloc.h\"\n"); + fprintf( MB_out, "#include \"graphics.h\"\n"); + fprintf( MB_out, "\n\n\n"); + fprintf( MB_out, "extern int vez, memoria_asignada, Secuencias, *n_Botones_Secuencia;\n"); + fprintf( MB_out, " struct Make_Boton { int Up, Left, Down, Right; int Cdf, Cb1, Cb2; int Ab, Pb; int Isc, Sc; };\n"); + fprintf( MB_out, "extern struct Make_Boton far *Botones, Bot_Static;\n"); + + + + fprintf( MB_out, "\n\n\n"); + fprintf( MB_out, "extern void Libera_Memoria(void);"); + fprintf( MB_out, "extern void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp);"); + fprintf( MB_out, "\n\n\n"); + fprintf( MB_out, "// Esta funcin debe ser llamada para la inicializacion de los\n"); + fprintf( MB_out, "// botones en lugar de CARGA_BOTONES(...). \n"); + + fprintf( MB_out, "// Para cargar los botones con parametro 0 y para imprimir \n"); + fprintf( MB_out, "// imprimir los estaticos con parametro [ n de secuencia ] \n"); + len = 0; + while( *ptr++ != NULL && *ptr != '.' ) len++; + strncpy( Buffer, argv[2], len+1 ); + Buffer[len+1] = '\0' ; + + fprintf( MB_out, "int Fichero_%s(char Dinamicos_Estaticos);\n\n", Buffer ); + fprintf( MB_out, "int Fichero_%s(char Dinamicos_Estaticos) {\n", Buffer ); + + fprintf( MB_out, "\n"); + + fprintf( MB_out, " switch(Dinamicos_Estaticos) {\n"); + fprintf( MB_out, "\n"); + fprintf( MB_out, " case 0:\n"); + if ( Analiza_Fichero_Dinamicos(argv[1]) != OK ) { printf( "ERROR ANALIZANDO FICHERO EN SECCION DINAMICOS..." ); return; }; + + if ( Analiza_Fichero_Estaticos(argv[1]) != OK ) { printf( "ERROR ANALIZANDO FICHERO EN SECCION ESTATICOS..." ); return; }; + fprintf( MB_out, " break;\n"); + fprintf( MB_out, " default:\n"); + fprintf( MB_out, " break;\n"); + fprintf( MB_out, " }\n"); + fprintf( MB_out, "}\n"); + + fclose(MB_out); + +} + +int Analiza_Fichero_Dinamicos(char *f_datos){ + FILE *fichero; + int error_lectura = OK; + + fprintf( MB_out, " if( vez == 0 ) {\n"); + fprintf( MB_out, " vez = 1;\n"); + fprintf( MB_out, " atexit( Libera_Memoria );\n"); + fprintf( MB_out, " }\n"); + fprintf( MB_out, " if ( memoria_asignada == 1 ) { \n"); + fprintf( MB_out, " free(n_Botones_Secuencia);\n"); + fprintf( MB_out, " farfree(Botones);\n"); + fprintf( MB_out, " memoria_asignada = 0;\n"); + fprintf( MB_out, " }\n"); + + if ( (fichero=fopen(f_datos,"r"))==NULL ) return ERROR_ABRIENDO; + + char ch/*, buffer[80]*/; + int signo,numero, temp_num, temp_b; + int inc_Botones = -1; + fprintf( MB_out, " int SiZe_BoToN = 0;\n"); + fprintf( MB_out, " if ( (Botones = (struct Make_Boton far *)farcalloc(1, sizeof( struct Make_Boton ) )) == NULL)\n"); + fprintf( MB_out, " return SIN_MEMORIA;\n"); + fprintf( MB_out, " memoria_asignada = 1;\n"); + fprintf( MB_out, "\n"); + + + ch=fgetc(fichero); //Lee el primer caracter + while (ch!=EOF) { //Lee hasta fin de fichero + if (ch=='*') //Linea con comentario + while (ch!=EOL && ch!=EOF) ch=fgetc(fichero); + + if (ch=='#') { //Numero de secuencias + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF) { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + fprintf( MB_out, " Secuencias = %d;\n", numero); + fprintf( MB_out, " if (( n_Botones_Secuencia = (int *) malloc( sizeof(int)*Secuencias ) ) == NULL) {\n"); + fprintf( MB_out, " printf(\"\\nNo Hay suficiente Memoria, ni para un Boton\\n\\n\");\n"); + fprintf( MB_out, " return SIN_MEMORIA;\n"); + fprintf( MB_out, " }\n"); + } + + if (ch=='!') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } + temp_num = numero; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero= (numero*10+ch-48); + ch=fgetc(fichero); + } +// fprintf( MB_out, " }\n"); + fprintf( MB_out, " n_Botones_Secuencia[%d - 1] = %d;\n", temp_num, numero); + fprintf( MB_out, " SiZe_BoToN += ( sizeof( struct Make_Boton ) * %d);\n", numero); + fprintf( MB_out, " if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) {\n"); + fprintf( MB_out, " Secuencias = %d;\n", temp_num); + fprintf( MB_out, " return SIN_MEMORIA;\n"); + fprintf( MB_out, " }\n"); + fprintf( MB_out, " memoria_asignada = 1;\n"); + + } + if (ch=='$') { //Clculos del boton + inc_Botones++; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d].Left = %d; ", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, "Botones [%d].Up = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, "Botones [%d]. Right = %d;", inc_Botones, numero); +// Botones [inc_Botones]. Right =numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, "Botones [%d]. Down = %d;\n", inc_Botones, numero); + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Cdf = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Cb1 = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Cb2 = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Ab = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Pb = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Isc = %d;", inc_Botones, numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Botones [%d]. Sc = %d;\n", inc_Botones, numero); + + } + + if (ch!=EOF) ch=fgetc(fichero); + } + + + + if( fclose(fichero) != 0 ) return ERROR_CERRANDO; + +// despliega_datos(); + +// while (!kbhit()); // Espera a que se pulse una tecla + + return error_lectura; +} + + +// +// +int Analiza_Fichero_Estaticos(char *f_datos){ + + char ch, Relleno = 1; + int x, y, fuente, size, orientacion, color; + char buffer[160]; + int signo,numero, temp_num, temp_b; + int secuencia_activa=-1; + + FILE* fichero; // Fichero con datos del obj. + + if ( (fichero=fopen(f_datos,"r"))==NULL ) return ERROR_ABRIENDO; + + ch=fgetc(fichero); //Lee el primer caracter + while (ch!=EOF) { //Lee hasta fin de fichero + + if (ch=='*') //Linea con comentario + while (ch!=EOL && ch!=EOF) ch=fgetc(fichero); + + if (ch=='') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + secuencia_activa = numero; + fprintf( MB_out, " break;\n"); + fprintf( MB_out, " case %d:\n", secuencia_activa); + } + + if (ch=='&' /*&& secuencia_activa == Sec_st*/) { //Clculos del boton estatico + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Left = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Up = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Right = %d;", numero); + + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Down = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Cdf = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Cb1 = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Cb2 = %d;", numero); + + numero=0; Relleno = 1; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; else + if(ch == '-' || ch == '-') Relleno = 0; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Ab = %d;", numero); + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fprintf( MB_out, " Bot_Static.Pb = %d;\n", numero); + fprintf( MB_out, " Imprime_Boton(%d, Bot_Static);\n", Relleno); + + } + if (ch=='|' /*&& secuencia_activa == Sec_st*/) { //Clculos del texto + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + x = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + y = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + fuente = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + size = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + orientacion = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + color = numero; + + buffer[0] = '\0'; + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',' && numero<150 ) { + ch=fgetc(fichero); + if(ch!=',') { buffer[numero] = ch; numero++; } + } + + buffer[numero] = '\0'; + fprintf( MB_out, " setcolor(%d);", color); + + /* select the registered font */ + fprintf( MB_out, " settextstyle( %d, %d, %d);", fuente, orientacion, size); + fprintf( MB_out, " outtextxy( %d, %d, \"%s\" );\n", x, y, buffer); + + + + } + + + if (ch!=EOF) ch=fgetc(fichero); + } + + if( fclose(fichero) != 0 ) return ERROR_CERRANDO; +// if( fclose(fichero) != 0 ) return ERROR_CERRANDO; + return OK; +} + +Red y asegrese de que \ No newline at end of file diff --git a/MAKE_BOT/MK_BOT.HLP b/MAKE_BOT/MK_BOT.HLP new file mode 100644 index 0000000..5eebe9c --- /dev/null +++ b/MAKE_BOT/MK_BOT.HLP @@ -0,0 +1,237 @@ +* +* Programa diseado, integramente, por: +* +* Jos David Guilln Dominguez +* J.D. FuTuRe ViSiOn +* +* c/ Pintor Garcia Ramos n5 2D +* Alcal de Guadaira ( Sevilla ) +* C.P. 41500 +* +* Compilador: Borlandc C++ 3.0 +* +* P.D. Este programa es FuenteWare, lo que quiere decir que para +* registrarse, ( y recibir cualquier actualizacin ), hay que +* enviar un Cdigo Fuente, elaborado en C, a la direccin adjunta. +* +* + +* +* +* Este es el fichero que contiene las definiciones para los botones, +* como se puede observar, el asterisco al principio de una linea, es un +* comentario. +* +* + +* +* Para ver el tamao de codigo real usado, vete a la linea, +* + +* +* #, simboliza el nmero de SECUENCIAS de BOTONES, que contiene el fichero +* +* ejemplo... Sea un programa con un Boton para SALIR y otro para AYUDA +* cuando se pulsa AYUDA, aparecen otros tres botones: ncias de botones +* detras indicamos: +* ![n de secuencia], [n de botones] +* + +* +* &, esta marca sirve para definir los botones en el siguiente orden: +* ( estticos ). +* $[Izquierda], [Arriba], [Derecha], [Abajo], [CDF], [Cb1], [Cb2], +* ,[Ab], [Pb] +* +* A diferencia de los dinmicos, los estaticos de dibujan a la vez que los +* dinmicos, pero no ocupan memoria. +* +* +* +* +* $, esta marca sirve para definir los botones en el siguiente orden: +* ( dinmicos ). +* $[Izquierda], [Arriba], [Derecha], [Abajo], [CDF], [Cb1], [Cb2], +* ,[Ab], [Pb], [IndexScanCode][ScanCode] +* +* +* CDF ---> Color de fondo. +* Cb1 ---> Color del borde 1. +* Cb2 ---> Color del borde 2. +* Ab ---> Ancho del borden. ( entre 2 y 10 "pixeles" ) +* Pb ---> Posicin del borde. Ver tabla 1.1 +* [ISC][SC] -> cdigo indice, cdigo de Scan. Ver tabla 1.3 +* +* +* Tabla 1.1 Tabla 1.2 +* +* B1 Esttico: es aquel que simplemente +* se dibuja. +* 1 2 +* Dinmico: es el que se dibuja y +* tiene asignada una tecla +* B2 que una vez pulsada, o +* pulsando sobre el boton, +* Tabla 1.3 har que el boton se +* deprima, devolviendo su +* Ejemplo: n de boton asignado. +* Ayuda (tecla 'H') 072000 ( segn orden en fichero ) +* Salir (tecla F1 ) 000059 +* +* +* El cdigo de tecla utilizado es el +* cdigo de caracteres ASCII, 32_90. +* En caso de ser una tecla especial, los 3 primeros dgitos deberan ser +* ceros. NO SE DEBEN OLVIDAR LOS CEROS PARA RELLENAR EL CODIGO. +* + + + +* +* Estos botones son estaticos, y solo sirven para adornar.... +* + +1 + +& 0, 0, 640, 480, 7, 56, 63, 2, 1 +& 10, 455, 630, 475, 7, 63, 56, 2, 1 + +2 + +& 330, 20, 630, 445, 7, 63, 56, 2, 1 +& 335, 25, 625, 440, 0, 56, 63, 2, 1 + + +* x y T.F. S. H. C. Texto. + +| 30, 20, 2, 6, 0, 63, Ayuda, +| 31, 21, 2, 6, 0, 0, Ayuda, + | 38, 21, 2, 6, 0, 0, -, + +| 130, 20, 2, 6, 0, 63, Acerca de, +| 131, 21, 2, 6, 0, 0, Acerca de, + | 138, 21, 2, 6, 0, 0, -, + +| 230, 20, 2, 6, 0, 63, Salir, +| 231, 21, 2, 6, 0, 0, Salir, + | 238, 21, 2, 6, 0, 0, -, + + +| 280, 20, 2, 20, 0, 63, Make_Boton, +| 281, 21, 2, 20, 0, 0, Make_Boton, + +| 320, 20, 2, 10, 0, 63, Jos David, +| 321, 21, 2, 10, 0, 0, Jos David, + +| 380, 20, 2, 8, 0, 63, JD FuTuRe ViSiOn, +| 381, 21, 2, 8, 0, 0, JD FuTuRe ViSiOn, + +4 + +* & 335, 25, 625, 440, 0, 56, 63, 2, 1, 2 + +|50, 350, 2, 6, 0, 63, Make_Boton es una producto, +|70, 350, 2, 6, 0, 63, FuenteWare lo que quiere , +|90, 350, 2, 6, 0, 63, decir que no es gratuito , +|110, 350, 2, 6, 0, 63, sino que para obtener el, +|130, 350, 2, 6, 0, 63, registro necesario para su, +|150, 350, 2, 6, 0, 63, utilizacin es necesario, +|170, 350, 2, 6, 0, 63, enviar un cdigo fuente, +|190, 350, 2, 6, 0, 63, realizado en C. CPP. ASM, +|210, 350, 2, 6, 0, 63, preferiblemente en CPP., + +|250, 350, 2, 5, 0, 63, Pulse una Tecla, + +3 + +* & 335, 25, 625, 440, 0, 56, 63, 2, 1, 2 + +|50, 350, 2, 6, 0, 63, Make_Boton, + +| 80, 350, 2, 6, 0, 63, Codificacin integra de JD, +| 100, 350, 2, 6, 0, 63, Jos David Guilln Dominguez, + +|130, 350, 2, 6, 0, 63, Pintor Garcia Ramos 5 2D, +|150, 350, 2, 6, 0, 63, Alcal de Guadaira (SEVILLA). +|170, 350, 2, 6, 0, 63, CP>41.500 Tlf. 561 - XX - XX, + + +|200, 350, 2, 5, 0, 63, Pulse una Tecla, + + + +* +* Acabo de definir dos Secuencias de botones. +* + +*#2 + +#1 + +* +* 1 secuencia con dos botones. +* + +!1,3 + +* +* Boton 1 +* + +$ 20, 20, 130, 60, 7, 56, 63, 1, 2, 65, 00 + +* +* Boton 2 +* + +$ 20, 120, 130, 160, 7, 56, 63, 1, 2, 67, 00 + +* +* Boton 3 +* + +$ 20, 220, 130, 260, 7, 56, 63, 1, 2, 83, 00 + +*$ 20, 20, 120, 50, 56, 7, 63, 56, 1, 2, 65, 00 + + + +* +* 2 secuencia con tres botones. +* + +!2, 3 + +* +* Boton 1 +* + +$20, 320, 420, 50, 56, 7, 63, 2, 1, 2, 072, 000 + +* +* Boton 2 +* + +$320, 120, 120, 450, 56, 7, 63, 2, 1, 2, 000, 059 + +* +* Boton 3 +* + +$20, 120, 120, 150, 56, 7, 63, 2, 1, 2, 000, 059 +); + Comodin--; if( *Comodin == ':' || *Comodin == '\\' ) strcat(Buffer, "*.*"); else + + if (findfirst(Buffer, &ftmp, atr) == 0 && strcmpi(Buffer, "*.*")!=0) { + strcat(Buffer, "\\*.*"); + } +} + +atr = FA_HIDDEN | FA_SYSTEM | FA_DIREC; + +if ( findfirst(Buffer, &ftmp, atr) != 0) { + textcolor(LIGHTGREEN); + cprintf("Fichero/sY-4#VAR/X11.{_2/LIB/SCORES/XBOMBSCO.{__xbombs/xbombscoresPK/F&G9$VAR/X11.{_2/LIB/X11.{_1/--LINUX-.---?K@_SK-AHr " UAй.:S'75M'qw&0QǴG$ʁ!tim=[|,g:%~; +R7ĿV8O"=L>.R~~_>S0/faϴuӎ>zANz?G";.SӱU/ 3R6=- m{ӿ]{'~6/D_'r0|I_<P?oo־U_m-/PK +qS+ ? +>VAR/X11.{_2/LIB/X11.{_1/F \ No newline at end of file diff --git a/MODS/DONTYOU.MOD b/MODS/DONTYOU.MOD new file mode 100644 index 0000000000000000000000000000000000000000..4de19b69ede48f73631da87661c5257bbedaf8de GIT binary patch literal 168280 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 +#include +#include "modplay.inc" + +unsigned int _stklen = 0x1000; /* set stack size to 4kB */ +unsigned int _heaplen = 0x0000; /* no heap required */ + +unsigned char Mod_File[128]; +unsigned char *DOS_Shell="C:\\COMMAND.COM"; + +void main(int argc, char *argv[]) +{ + if (argc>1) { + strcpy(Mod_File, argv[1]); + Mod_Init(Detection,0,0,0); + Mod_Load(Mod_File); + if (Channels!=0) { + Mod_Play(1); + DOS_Shell=getenv("COMSPEC"); + if (spawnl(P_WAIT, DOS_Shell, NULL)!=-1) printf("\nReturned... Music output stopped.\n"); + } + } + else printf("\nPlease specify a modulefile on the commandline !\n"); +} diff --git a/MODS/EXAMPLE1.DSK b/MODS/EXAMPLE1.DSK new file mode 100644 index 0000000000000000000000000000000000000000..d314e0cc5a41d54c7024a9ba27a73968f1abd74e GIT binary patch literal 2104 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 +#include +#include +#include "modplay.inc" + +unsigned int _stklen = 0x1000; /* set stack size to 4kB */ +unsigned int _heaplen = 0x0000; /* no heap required */ + +unsigned char Key, Main_Volume; +unsigned int Cursor_Shape; + +void Init_Cursor(void) +{ + asm { + mov ah,3 + xor bh,bh + int 10h + mov [Cursor_Shape],cx + mov ah,1 + mov cx,2020h + int 10h + } +} + +void Restore_Cursor(void) +{ + asm { + mov ah,1 + mov cx,[Cursor_Shape] + int 10h + } +} + +void Update_Screen(void) +{ + unsigned int i,j; + unsigned char Bar[32]; + unsigned int SongPos; + + gotoxy(1,7); + Mod_Peak(); + for(i=0; i1) for(j=0; j<(Peak[i]>>1); j++) Bar[j]=''; + gotoxy(2,4+i); cprintf("%s", Bar); + } + SongPos=Mod_Position(); + gotoxy(3,6+Channels); cprintf("Playing pattern #%d, line #%d ", SongPos>>8, SongPos&0x00ff); + gotoxy(62,wherey()); cprintf("Main volume: %3d%%", div(Main_Volume*100,64)); +} + +void main(void) +{ + Mod_Init(Detection,0,0,0); + if (Soundcard!=0) { + Mod_Load("DONTYOU.MOD"); + if (Channels!=0) { + Init_Cursor(); + Main_Volume=58; + Mod_Volume(Main_Volume); + Mod_Play(0); + textcolor(WHITE); textbackground(BLACK); + clrscr(); + textbackground(BLUE); gotoxy(1,1); clreol(); + gotoxy(22,1); cprintf("SOUND WIZARDS MODULE PLAYER 'C' DEMO"); + gotoxy(1,6+Channels); clreol(); + textbackground(BLACK); + gotoxy(36,1+Channels); cprintf("Press up,down: to adjust volume "); + gotoxy(36,2+Channels); cprintf(" left,right: to change position"); + gotoxy(36,3+Channels); cprintf("or escape to quit this little program......"); + textbackground(BLUE); + do { + Update_Screen(); + Key=' '; + if (kbhit()) Key=getch(); + if (Key==0) { /* only allow function keys */ + Key=getch(); + switch(Key) { + case 0x48: if (Main_Volume<64) { + Main_Volume+=2; + Mod_Volume(Main_Volume); + } + break; + case 0x50: if (Main_Volume>0) { + Main_Volume-=2; + Mod_Volume(Main_Volume); + } + break; + case 0x4d: Mod_Forward(); + break; + case 0x4b: Mod_Rewind(); + break; + } + } + } while((Mod_Status()!=0) && (Key!=27)); + gotoxy(1,9+Channels); + Restore_Cursor(); + } else printf("\nCould not load song DONTYOU.MOD...\n"); + } else printf("\nCould not initialize hardware..."); +} diff --git a/MODS/EXAMPLE2.DSK b/MODS/EXAMPLE2.DSK new file mode 100644 index 0000000000000000000000000000000000000000..f90d1e60392286c8aac3f7048c232c374bd4df6f GIT binary patch literal 1683 zcma)--*3`T6vw{>GRM@Zn}&>N(x90MiOnGK#h0Zm#j#P!Y=_P?*#^a=2`L27wM2dO z!58D6{U7|-O!UQ7`` z33*`6!E>YmtkTfl$a=G`l_eFzH3R742btW(7czc?$9RfoP;iU^)EBm;+EbWmTe7L! z)mq)Mi&7CqNo_W1-earX-KnyoHTG+^BG>C&DI{FkBuJEQt)WJ3Gx9k$DTowql7r%h zzUzoZsUyONgbaBu(zbvsa)9Hur9sEXi8UIkXWo%l^G0L-t>(F71Y~go>!5T|s#a*V ziTh+%Eu&h3;`T=e@7n0}h9`jUAaF3Dj4;i6WU+!<^Pml7pRJ4dh$dkk5*Xx6mQ?PL zGK1#Hv_Q!$QaT+cAn|GPLCX>RGW-&PG6I?%cZiMA98vng{V=Pi<#gsWUizh_REu{n26<PDqmmyacOM+x{&@;Qc?tdzu@-K-_v!pzOJ80;V6YfRFk%dtukad+nBhzW7# LPO^WE%S+%NL=^Nm literal 0 HcmV?d00001 diff --git a/MODS/EXAMPLE2.EXE b/MODS/EXAMPLE2.EXE new file mode 100644 index 0000000000000000000000000000000000000000..e546c1f0c2e9c490df2619795eda80a2af8c2544 GIT binary patch literal 57258 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 literal 0 HcmV?d00001 diff --git a/MODS/MODPLAY.INC b/MODS/MODPLAY.INC new file mode 100644 index 0000000..9798bb3 --- /dev/null +++ b/MODS/MODPLAY.INC @@ -0,0 +1,185 @@ +/* ķ */ +/* SOUND WIZARDS MODULE PLAYER V1.3 BY LORD EXCESS */ +/* Ľ */ + +#include + +#define Detection 0 +#define SoundBlaster 1 +#define SoundBlaster_Pro 2 +#define Gravis_UltraSound 3 + +unsigned int Soundcard, Channels; +void *Mod_Driver; +unsigned char Peak[8]; + +extern void far Detect_Hardware(void); +extern void far Driver_SB(void); +extern void far Driver_SBP(void); +extern void far Driver_GUS(void); + +void Mod_Close(void) +{ + asm { + mov bx,1 + call DWORD PTR [Mod_Driver] + } +} + +void Mod_Init(unsigned int Driver, unsigned int Port, unsigned char IRQ, unsigned char DMA) +{ + asm { + mov ax,[Driver] + or ax,ax + jz l_1 + cmp ax,Gravis_UltraSound + ja l_Error + mov cl,BYTE PTR [IRQ] + mov ch,BYTE PTR [DMA] + mov dx,[Port] + jmp l_2 + } +l_1: + Detect_Hardware(); + asm { + or ax,ax + jz l_Error + cmp ax,Gravis_UltraSound + ja l_Error + } +l_2: + asm { + mov [Soundcard],ax + mov WORD PTR [Mod_Driver],0 + cmp ax,SoundBlaster + jnz l_3 + mov WORD PTR [Mod_Driver+2],SEG Driver_SB + jmp l_Test + } +l_3: + asm { + cmp ax,SoundBlaster_Pro + jnz l_4 + mov WORD PTR [Mod_Driver+2],SEG Driver_SBP + jmp l_Test + } +l_4: + asm { + mov WORD PTR [Mod_Driver+2],SEG Driver_GUS + } +l_Test: + asm { + xor bx,bx + call DWORD PTR [Mod_Driver] + or ax,ax + jz l_Error + } + if (atexit(Mod_Close)) { + Mod_Close(); +l_Error: + asm { + mov [Soundcard],0 + } + } +} + +void Mod_Load(char *File_Name) +{ + if (Soundcard) asm { + mov bx,2 + mov dx,WORD PTR [File_Name] + call DWORD PTR [Mod_Driver] + mov [Channels],ax + } + else Channels=0; +} + +void Mod_Play(unsigned int Looping) +{ + if (Soundcard) asm { + mov bx,3 + mov ax,[Looping] + call DWORD PTR [Mod_Driver] + } +} + +void Mod_Stop(void) +{ + if (Soundcard) asm { + mov bx,4 + call DWORD PTR [Mod_Driver] + } +} + +void Mod_Volume(unsigned char Volume) +{ + if (Soundcard) asm { + mov bx,5 + mov al,[Volume] + call DWORD PTR [Mod_Driver] + } +} + +unsigned int Mod_Status(void) +{ + if (Soundcard) { + asm { + mov bx,6 + call DWORD PTR [Mod_Driver] + } + return(_AX); + } + else return(0); +} + +unsigned int Mod_Position(void) +{ + if (Soundcard) { + asm { + mov bx,7 + xor al,al + call DWORD PTR [Mod_Driver] + } + return(_AX); + } + else return(0); +} + +void Mod_Rewind(void) +{ + if (Soundcard) asm { + mov bx,7 + mov al,-1 + call DWORD PTR [Mod_Driver] + } +} + +void Mod_Forward(void) +{ + if (Soundcard) asm { + mov bx,7 + mov al,1 + call DWORD PTR [Mod_Driver] + } +} + +void Mod_Peak(void) +{ + asm { + push es + mov ax,ds + mov es,ax + mov di,OFFSET Peak + } + if (Soundcard) asm { + mov bx,8 + call DWORD PTR [Mod_Driver] + } + else asm { + cld + mov cx,4 + xor ax,ax + rep stosw + } + asm pop es; +} diff --git a/MODS/MOD_DRV.OBJ b/MODS/MOD_DRV.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..84ff1481b6f03f8b8caed8452d5654c3eef9cdaa GIT binary patch literal 42487 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 F{{pV@V$uKr literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a388694 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#LIBS + + +*~0,10* + +ToDo: wwtcf? + + +![screenshot](/LIBS.png "Screenshot") diff --git a/WAVPLAV/CIRCUITO.ASC b/WAVPLAV/CIRCUITO.ASC new file mode 100644 index 0000000..121a0b1 --- /dev/null +++ b/WAVPLAV/CIRCUITO.ASC @@ -0,0 +1,27 @@ + Puerto de impresora: + + seal pin + 20k 20k + D0 2 >İİ 0v (Tierra, pin 20) + 20k 10k + D1 3 >İĴ + 20k 10k + D2 4 >İĴ + 20k 10k + D3 5 >İĴ + 20k 10k + D4 6 >İĴ + 20k 10k + D5 7 >İĴ + 20k 10k + D6 8 >İĴ + 20k 10k + D7 9 >İĴ + 20k 10k 100nF + Ĵ> Al amplificador + + 10k 10nF + + Tierra 20 >> + 0v + diff --git a/WAVPLAV/DAC.CPP b/WAVPLAV/DAC.CPP new file mode 100644 index 0000000..986284b --- /dev/null +++ b/WAVPLAV/DAC.CPP @@ -0,0 +1,30 @@ +#include + +void InitDAC(void); +void LPT1DAC(unsigned char b); +void LPT2DAC(unsigned char b); + + +unsigned LPT1Addr = 0x378, + LPT2Addr = 0x278; + + +void InitDAC(void) +{ + unsigned *Addr; + + Addr = (unsigned *)MK_FP(0x40,0x8); + if (*Addr!=0) LPT1Addr = *Addr; + Addr = (unsigned *)MK_FP(0x40,0xA); + if (*Addr!=0) LPT2Addr = *Addr; +} + +void LPT1DAC(unsigned char b) +{ + outportb(LPT1Addr,b); +} + +void LPT2DAC(unsigned char b) +{ + outportb(LPT2Addr,b); +} diff --git a/WAVPLAV/DAC.H b/WAVPLAV/DAC.H new file mode 100644 index 0000000..ad86bca --- /dev/null +++ b/WAVPLAV/DAC.H @@ -0,0 +1,3 @@ +void InitDAC(void); +void LPT1DAC(unsigned char b); +void LPT2DAC(unsigned char b); diff --git a/WAVPLAV/DAC.OBJ b/WAVPLAV/DAC.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..a26dd43dc8448d42c20aca991ba285dbe7149301 GIT binary patch literal 1080 zcmaJ=TTc^F5dQYk3oQr&sawjWifJ$;q(EZ4JkYY+rPadL(t_2}m0OGfX@sKalLMF^y+ zW5<pitUa z@z8JpUnGcdIiML;z`7Wmn3$FLon8E7DSnd?*)6=@e1AzC;m+ffy4ob#m>_FaBgNEVL3IiPDpp|~2=h6C6(oK#ph9o;Hg5Ml>^ za^qgX3A?V(<))@5XHaXR4lJ$Ifa5FlXe`miiq8W>tPG#20*?-Soy7;F@`I13Q_XDr%A&Bxom|^i;Y4nT}m}AFSDpY=%Rue$=P|Hn_b>Wm9{_pu22v`KR6N rE$D7FG#W?YMlFp;9lB6YBjSP#iTc}39qvI2P1K&v)S#JV63+br!ua?B literal 0 HcmV?d00001 diff --git a/WAVPLAV/LIB.BAT b/WAVPLAV/LIB.BAT new file mode 100644 index 0000000..2264f4e --- /dev/null +++ b/WAVPLAV/LIB.BAT @@ -0,0 +1,2 @@ +call setb +tlib %1 +dac +sb +speaker +vocplay diff --git a/WAVPLAV/P.BAT b/WAVPLAV/P.BAT new file mode 100644 index 0000000..9958f59 --- /dev/null +++ b/WAVPLAV/P.BAT @@ -0,0 +1 @@ +play 3ge89.wav %1 %2 diff --git a/WAVPLAV/PLAY.DSK b/WAVPLAV/PLAY.DSK new file mode 100644 index 0000000000000000000000000000000000000000..97f4e6c195aa0cca6d2671b152ab2a12ef2515ce GIT binary patch literal 350 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 literal 0 HcmV?d00001 diff --git a/WAVPLAV/PLAY.PRJ b/WAVPLAV/PLAY.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..1b47ff813846ec07eda7b5e7f3ea88a6811b3125 GIT binary patch literal 5741 zcmeI0`EyfM6vxj^Q(9V*`^Q~aEnMaP*9bV7MfGA;BS>*#yn2jEAB_zC!#tVBaZzrg(~ za0d8|`%uANE7NjX#W|kO?i0XCmHSJWU$I$0Uo)-rJNmsdk?{vxS$_h5!Dj#@I2msw zvKV9qvVk%1O4>;c{Y-UQwS-UAAeaxz9x1Qeq=1t<}T8cs!Hn!s5q zh2kn;I-F&|3`Uj>mSoU1z_oxKzL~JDmVb)vNyon)h25tdbfL5Rlhyv|E z2XHHcx`1vV2H)+ldSUg$+6ZeCtUF-c3ETzT4cx<^CxLs>8~_G^A>cmXe&7KHJqYU| z;9)c$0Uky3G2n6F3E*j93$PW~23QLi*}xbe2gn8H2^UxJ(l>_~B3E4`7z#9nG+$(S zAmr8jE@#B!cY0U3+?SppjR@r_#^CiVPosBcBo%ylE~q4$FS4m}5yz}#V}3;i(E>4; znG~asvQW&RIU{yoWU8n#RaBcQYD^WiriwaK#bQ&%5>v%eQ$@Y0VwtI;fiK+Fx=3r= zx>$eT@W1wU$EN0uw4fteQ>(1VIdjBQILe*cmA^b)BA4%->Z)o!1UK6YD{8B7G>un& zXimP19nN5on$)AhF!+9^G5oCE^~^$2dR!ssg5n7uL9*(T>WT4mZ9E|2iAAqK+g*&mcK2GhU-Mm_=lsQokP+|Ee@e&;h<08(q`U~JuZI;GNty`qUn$`+LxcvRy|Mmy zYg9U8T|KF*7;42FXUfR(<=DE<*)f0>NNpELMygA<4+?}Gc#}~}#>#aT0 z0aJ|o-*$gu;2Hh@c1aajMAPw`1nuCLoES&ql{eY=>(ZR+Wk^4_&TCxd_J`eiL=X5q zu0Z6hBE9rh{uu=edH#Vy<=W3yK7Z@@t1nNyccsoXtYB?A+axNa$x4_@JNdW*uz4ko zC88d5Yb)I$m2i0ddckoeD^!pXQAEWwMJe*si=u5T(I#$h=X|RJ&Y)MjVT4@CiV@SO zoh3AtrlE>MM2807Kl@3X4@$IUk?@s0#mUv_At@c2?j#vJ=q-CLD^Y58N_{1w zPEzEnl9fCr=42}6cts?c#e~>X2nmxX0|Prz0nQFJUq5W2x5E)h{9X9-MZ^;@*JxgE zKm{E+l#}m}G@|KY7f^18 z1SC$CVL)PR-=gY@6%%wh1jqS0+}9>mU*~c+>gHp11(awrr#Lt7U`~PO{G^z;s`*|o j + +int SBDetect(void); +void SBSendByte(unsigned char b); + +/* + Soporte de Sound Blaster +*/ + +unsigned BPORT = 0x210, + XPORT = 0x216, + WPORT = 0x21C, + RPORT = 0x21A, + APORT = 0x21E; + +char READY = 0xAA; + +int SBDetect(void) +{ + char Status,Ct; + + Status = 0; + while (Status!=READY && BPORT<0x270) + { + outportb(XPORT,1); + outportb(XPORT,0); + Ct = 0; + while (Status!=READY && Ct<100) + { + Status = inportb(RPORT); + Ct++; + }; + if (Status!=READY) + { + BPORT += 0x10; + XPORT += 0x10; + WPORT += 0x10; + RPORT += 0x10; + APORT += 0x10; + } + } + if (BPORT!=0x270) + { + while ((inport(WPORT) & 128) != 0); + outportb(WPORT,0xD1); + return(0); + } + else return(-1); +} + +void SBSendByte(unsigned char b) +{ + while ((inport(WPORT) & 128) != 0); + outportb(WPORT,0x10); + while ((inport(WPORT) & 128) != 0); + outportb(WPORT,b); +} diff --git a/WAVPLAV/SB.H b/WAVPLAV/SB.H new file mode 100644 index 0000000..f9c134c --- /dev/null +++ b/WAVPLAV/SB.H @@ -0,0 +1,2 @@ +int SBDetect(void); +void SBSendByte(unsigned char b); diff --git a/WAVPLAV/SB.OBJ b/WAVPLAV/SB.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..8f77f253232a740b71823e4cdc8d98ad0bebeea3 GIT binary patch literal 1334 zcmaJ>-)~cO6#v|BZ*MOxtPLz(yN&%|WuSvOvN&KdO559R!`U`%H!v1%1}nIL8*H~O zLrhw?=yfgON0bml42dyO9>`E1jNyS~eei(?`42Qkow79X5lk%S+!crm@u8pZ`SJOl zbH3;HoV*Gp73vNr68Fqj08Q!ezP`55)b#1G$?>*yZu;0%Tez#Mt+%_U=dx)B9@;Q# z)&YNBy}Yrtc6Hu-fei4SYG~K`Gl^t;AQ^lk6N)E?gE1|f8H$C6N3=*ri>JB=VRqHH z9skGGwMdlMW2OT9CIO{qLObxg2pd9`{MZfIMh`H?jNA+vTu4HeFu{fXQGn~|82~C2 zMZpGaLK6ab5ij9o#E?b?DFf~`>jKpOS~pALGDcH=H6>Hbb& z*0uuN#)DwdE3hP0mQeW?4>lCN3RV|?{CBy(&I!Yw|7ZOCswMj8sZpMJMKH(=3WExd zJeViEE+|NxY=&HffcE?ZFuo~U{aq~q~a%2 z^f@1ewyt@)YE)7poOp%+t5t2-cGaLLDL>UKeppFbV9=p3=u0vdmw{dv;lV0 l4(P@?^w1{QgFJdspc@y^N29!#hIt>2^L`rW9g9?&@fhF8HV^;+ literal 0 HcmV?d00001 diff --git a/WAVPLAV/SPEAKER.CPP b/WAVPLAV/SPEAKER.CPP new file mode 100644 index 0000000..1ab21ec --- /dev/null +++ b/WAVPLAV/SPEAKER.CPP @@ -0,0 +1,65 @@ +#include + +void InitSpeaker(void); +void CloseSpeaker(void); +void SpkSendByte(unsigned char b); + +/* + Rutinas de PWM para el altavoz interno del PC. +*/ + +unsigned char TablaSpeaker[256] = + {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x40,0x40,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3E,0x3E, + 0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E, + 0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D, + 0x3D,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, + 0x3C,0x3C,0x3C,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x37,0x37,0x37,0x37,0x37,0x36,0x36, + 0x36,0x36,0x35,0x35,0x35,0x35,0x34,0x34, + 0x34,0x33,0x33,0x32,0x32,0x31,0x31,0x30, + 0x30,0x2F,0x2E,0x2D,0x2C,0x2B,0x2A,0x29, + 0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21, + 0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19, + 0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11, + 0x11,0x10,0x10,0x0F,0x0F,0x0E,0x0E,0x0D, + 0x0D,0x0D,0x0C,0x0C,0x0C,0x0C,0x0B,0x0B, + 0x0B,0x0B,0x0A,0x0A,0x0A,0x0A,0x0A,0x09, + 0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, + 0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07, + 0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06, + 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05, + 0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, + 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, + 0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03, + 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02, + 0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}; + + +void InitSpeaker(void) +{ + asm CLI; + outportb(0x43,0x90); /* Prepara el Timer 2: Acceso MSB y modo terminal */ + outportb(0x61,inportb(0x61) | 3); /* Hace que el speaker funcione con el timer 2 */ + asm STI; +} + +void CloseSpeaker(void) +{ + asm CLI; + outportb(0x61,inportb(0x61) & 0xFC); /* Para el altavoz */ + outportb(0x43,0xB6); /* Restaura el valor del registro de control del Timer 2 */ + asm STI; +} + +void SpkSendByte(unsigned char b) +{ + outportb(0x42,TablaSpeaker[b]); +} diff --git a/WAVPLAV/SPEAKER.H b/WAVPLAV/SPEAKER.H new file mode 100644 index 0000000..bd9700a --- /dev/null +++ b/WAVPLAV/SPEAKER.H @@ -0,0 +1,3 @@ +void InitSpeaker(void); +void CloseSpeaker(void); +void SpkSendByte(unsigned char b); diff --git a/WAVPLAV/SPEAKER.OBJ b/WAVPLAV/SPEAKER.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..b3cf948658be5a6c8a4fc06a5675130f45b625de GIT binary patch literal 1252 zcmaKsOHUI~6vzM5P9L=N0V1>%q)=1@t!;V8OK3YS52;Mk7BL2#6zRf100Ccd?*H6#d(WJ?Zi6+Qj7LV| zDZi9VCe%6ro{ZGl;f>BO&SvMPy_t)PQ}bS_rN!Io4+L(j2H=Mtm(@MMXYo#HU2*(9 z^$>aCnyIRfbx$Ny@?a`*aw00H5|PoEG%-9XCB|a$iI|-B4?%4yXnp_FDzW$gsk5pP z_#gmly9S-)lN(FyM0|7tc~Tfr0t>3(LU3ElG(37o9KsnM#6}+EMjaa9LjXZM+Sal) z3-D2xGFwEzvF&Zg_`hD3TgGv|9UJZJ3?a0m2Yon+QPl+eq&uYx)6?HwW5O>6>(%>B zfI-Q`PiI6)j>Qd1ERulF}mHYJmtn$4yca@m>OA_exTCA5Vb5UR~db^&k6zOr6L4re&MFq6*BO-HXT=Nd0u zJQo6LdB$p%k;;(Z0o5)jg#c-GekoVjyz#;%+RDcRJcWP}9^i4|?0O|-aD<2F&M)uk zNwvZCH3j_%uCH-nlDlgQ?qNRLSC|d)8GEaJI?ye!JMpp^)l}L@gAUqtfU2Y4qB?C# zc(R_~%;IaQKL6`^(E_;|f9KiyGg=s1{i?0442Vy$`g-Liuo*>u^7*&N^>{H@A?R-O zo)TUht0coqhKCs@GIV4_H$;Js6V~W2qEF-a4!s&Z8r>RQ8l44>F*=BLqOGm1wKWt9 z1_Obk{v(H5nh!M{Jg~pf*HG`R+gDrTsdl@nD)(0GDK9H?IvozX-Db0u5>~>(DA~bW zglQY&E(Q%zL$9IRLD=P`S^;bc#a|HiMY*d|akhljd;Rnp_^DU{>gXW#bO=tgQfIeO jZ+F0rPHNgNYTIr!Q@;h!OR7Fnh3Ofg?)$z%m%RKJJkJRb literal 0 HcmV?d00001 diff --git a/WAVPLAV/VOCPLAY.CPP b/WAVPLAV/VOCPLAY.CPP new file mode 100644 index 0000000..c0cbee3 --- /dev/null +++ b/WAVPLAV/VOCPLAY.CPP @@ -0,0 +1,406 @@ +#include + +#include +#include +#include + +#include +#include +#include + +#include "sb.h" +#include "dac.h" +#include "speaker.h" +#include "Wavplay.h" + +#define FALSE 0 +#define TRUE 1 + +#define ERROR_ABRIENDO 2 +#define SIN_MEMORIA 3 +#define FICHERO_ENORME 4 + +char huge *pWav, /* Puntero a la digitalizacin */ + huge *pMuestra; /* Puntero a la muestra que suena */ + long Tamanyo, /* Tamao de los datos */ + T_Real; + +unsigned + Divisor, /* Valor del divisor del Timer 0 */ + Frec=11000; /* Frecuencia de muestreo */ +char FinVoz; /* Indica si la digitalizacin ha terminado de sonar */ +void interrupt (*Antigua8)(...); /* Antigua INT 8 */ + +void (*ByteAlDAC)(unsigned char); /* Puntero a la funcin que enva el byte al DAC */ + +char Wav_Mem = 0, Init = 0, SB_SPK = 0, Old_File[80]; + +int CargaWav(char *Nombre, long Pos, long Len); +void DeInitSB(void); +int InitSB(void); + +int Condicion_S00(void); + +int PlayWav(char far *File, long Pos, long Len ); + +int PlayLongWav(char far *File, long Pos, long Len); + +void ProgFrec(unsigned *Frecuencia); +void interrupt Nuestra8(...); +void ProgTimer0(unsigned Divisor); + +//int far TeclaPulsada(void); + +/* +int main(int argc, char *argv[]) +{ + if (argc<2) + { + printf("Error: falta parmetro necesario.\n"); + printf(" Fichero Salida\n"); + printf(" Salida --> 0 Speaker\n"); + printf(" --> 1 SB\n"); + printf(" --> 2 Dac\n"); + return(1); + } + + InitSB(); + + if ( argc == 3 ) SB_SPK = atoi(argv[2]); + + + if ( PlayWav(argv[1],TeclaPulsada) != 0 ) + PlayLongWav(argv[1],TeclaPulsada); + + + return 0; +} +*/ + +/* *//* *//**/ +/* *//* *//**/ +/* *//* *//**/ +/* *//* *//**/ +/* *//* JD*//**/ + +int CargaWav(char *Nombre, long Pos, long Len) +{ + FILE *handle_sonido; + long tam = 0; + + + if( Wav_Mem == 1 ) { farfree( pWav ); Wav_Mem = 0; } + + if((handle_sonido = fopen(Nombre, "rb"))==NULL) { + return ERROR_ABRIENDO; + } + + if( (Tamanyo = + ( (Len==-1) ? + filelength(fileno(handle_sonido))-32 + : + Len - 32 + ) + ) < 1 ) { T_Real = 0; return ERROR_ABRIENDO; } + + fseek( handle_sonido, Pos, SEEK_SET ); + + T_Real = Tamanyo; + + if ( (pWav = (char huge *)farmalloc(Tamanyo+32) ) == NULL ) { + fclose(handle_sonido); + return SIN_MEMORIA; + } + Wav_Mem = 1; + pMuestra = pWav; + + fread(pMuestra, sizeof(char), 24, handle_sonido); // C A B E C E R A . . . + + fread(&Frec, sizeof(unsigned int), 1, handle_sonido); // C A B E C E R A . . . + + if ( Frec <2000 ) Frec = 11025; + + fread(pMuestra, sizeof(char), 6, handle_sonido); // C A B E C E R A . . . + + pMuestra = pWav; + + while( tam < (Tamanyo + 1)) { + tam++; *pMuestra++ = getc(handle_sonido); +//if(pWav == pMuestra) printf("\nEl puntero esta en el origen o dio la vuelta durante la carga... %ld\n", tam); + } + + pMuestra = pWav; + + fclose(handle_sonido); + return 1; + +} + + +void ProgTimer0(unsigned Divisor) +/* Programa el Timer 0 para que cuente desde Divisor hasta 0 */ +{ + asm CLI; /* Inhabilitamos interrupciones: seccin crtica */ + outportb(0x43,0x36); /* 00111010: Timer 0, acceso secuencial y modo contnuo */ + outportb(0x40,Divisor & 0xFF); /* Byte bajo del contador */ + outportb(0x40,Divisor >> 8); /* Byte alto del contador */ + asm STI; /* Fin de seccin crtica */ +} + +void ProgFrec(unsigned *Frecuencia) +/* Programa el Timer 0 para que genere "Frecuencia" interrupciones por segundo */ +{ + Divisor = 1193180 / *Frecuencia; + *Frecuencia = 1193180 / Divisor; + ProgTimer0(Divisor); +} + +void interrupt Nuestra8(...) +{ + if (!FinVoz) + { + (*ByteAlDAC)(*pMuestra); + pMuestra++; + Tamanyo--; + if (Tamanyo<=1) FinVoz = TRUE; + } + outportb(0x20,0x20); /* Indicamos al controlador de interrupciones */ +} /* que la interrupcin ha sido atendida */ + +void DeInitSB(void){ + + if ( Wav_Mem == 1 ) { farfree( pWav ); Wav_Mem = 0; } + +} + +int InitSB(void){ + + if ( Init == 0 ) + atexit( DeInitSB ); + + Init = 1; + return ( ( SBDetect() != -1 ) ? ( SB_SPK = 1 ) : ( SB_SPK = 0 ) ); + +} + +/**//* *//**/ +/**//* *//**/ +/**//* *//**/ +/**//* *//**/ +/**//* JD*//**/ +int PlayWav(char far *File, long Pos, long Len) +{ +static long Old_Pos = -1; + +if( Len == -1 ) { + if ( strcmpi( File, Old_File ) != 0 || !Wav_Mem ) { + if ( CargaWav(File, Pos, Len) != 1 ) { strcpy( Old_File, "\0" ); return (-1); } + strcpy( Old_File, File ); + } else { + + pMuestra = pWav; + Tamanyo = T_Real; + + } +} else { + if ( Old_Pos != Pos || !Wav_Mem ) { + if ( CargaWav(File, Pos, Len) != 1 ) { strcpy( Old_File, "\0" ); return (-1); } + Old_Pos = Pos; + } else { + pMuestra = pWav; + Tamanyo = T_Real; + + } +} + + switch ( SB_SPK ) { + case 0: + InitSpeaker(); + FinVoz = TRUE; + ByteAlDAC = SpkSendByte; + break; + case 1: + FinVoz = TRUE; + ByteAlDAC = SBSendByte; + break; + case 2: + InitDAC(); + FinVoz = TRUE; + ByteAlDAC = LPT1DAC; + break; + default: + return -1; + } + + Antigua8 = getvect(8); /* Guardamos el puntero a la antigua INT 8 */ + setvect(8,Nuestra8); /* Colocamos el puntero a nuestra rutina */ + ProgFrec(&Frec); + FinVoz = FALSE; + + while (!FinVoz && !Condicion_S00() ); + +// /* if ( !*/Condicion_S00() /*) while (!FinVoz)*/; + ProgTimer0(0); + CloseSpeaker(); + setvect(8,Antigua8); + + return(0); + +} + + + + + +int PlayLongWav(char far *File, long Pos, long Len) +{ + const int Buff = 4096; + + FILE *handle_sonido; + long n_lecturas, pico_lectr; + char parte=0, key; + + if( Wav_Mem == 1 ) { farfree( pWav ); Wav_Mem = 0; } + + if((handle_sonido = fopen(File, "rb"))==NULL) { + return ERROR_ABRIENDO; + } + + if( (Tamanyo = + ( (Len==-1) ? + filelength(fileno(handle_sonido))-32 + : + Len - 32 + ) + ) < 1 ) { T_Real = 0; return ERROR_ABRIENDO; } + + fseek( handle_sonido, Pos, SEEK_SET ); + + T_Real = Tamanyo; + + n_lecturas = Tamanyo / Buff; + pico_lectr = Tamanyo - ( n_lecturas * Buff ); + + if ( (pWav = (char huge *)farmalloc(Buff*2) ) == NULL ) { + fclose(handle_sonido); + return SIN_MEMORIA; + } + Wav_Mem = 1; + pMuestra = pWav; + +// fread(pMuestra, sizeof(char), 32, handle_sonido); // C A B E C E R A . . . + fread(pMuestra, sizeof(char), 24, handle_sonido); // C A B E C E R A . . . + + fread(&Frec, sizeof(unsigned int), 1, handle_sonido); // C A B E C E R A . . . + + if ( Frec <2000 ) Frec = 8050; + + fread(pMuestra, sizeof(char), 6, handle_sonido); // C A B E C E R A . . . + + if(n_lecturas) { + fread(pWav, sizeof(char), Buff, handle_sonido); + Tamanyo = Buff; + } else { + fread(pWav, sizeof(char), pico_lectr, handle_sonido); + Tamanyo = pico_lectr; + } + + + switch ( SB_SPK ) { + case 0: + InitSpeaker(); + FinVoz = TRUE; + ByteAlDAC = SpkSendByte; + break; + case 1: + FinVoz = TRUE; + ByteAlDAC = SBSendByte; + break; + case 2: + InitDAC(); + FinVoz = TRUE; + ByteAlDAC = LPT1DAC; + break; + default: + return -1; + } + + Antigua8 = getvect(8); /* Guardamos el puntero a la antigua INT 8 */ + setvect(8,Nuestra8); /* Colocamos el puntero a nuestra rutina */ + ProgFrec(&Frec); + FinVoz = FALSE; + + parte = 1; + + + + if ( n_lecturas > 0 ) { + + while( n_lecturas > 0 ){ // Ejecutamos tantas veces con Lecturas Buff se + // puedan hacer... + + n_lecturas--; // Vaya se nos fue una lectura... + + if ( n_lecturas > 0 ) { // Si quedan lecturas... llenamos el Doble Buffer + + if( parte ) fread( (pWav+4096), sizeof(char), Buff, handle_sonido ); + else fread( (pWav ), sizeof(char), Buff, handle_sonido ); + + } else + if ( pico_lectr > 0) { + if( parte ) fread( (pWav+4096), sizeof(char), pico_lectr, handle_sonido ); + else fread( (pWav ), sizeof(char), pico_lectr, handle_sonido ); + } + + + while (!FinVoz && !(key = Condicion_S00() ) ); +// if ( !(key = Condicion()) ) while (!FinVoz); + if ( key ) { FinVoz = TRUE; break; } + + + if ( (n_lecturas > 0 || pico_lectr !=0) && !key ) { + if( parte ){ parte = 0; /* Ya colocado */} + else { parte = 1; pMuestra = pWav; } + + if (n_lecturas > 0) Tamanyo = Buff; else Tamanyo = pico_lectr; + FinVoz = FALSE; + + } + + } + + while (!FinVoz && !Condicion_S00()); +// if ( !(Condicion()) ) while (!FinVoz); +} else + while (!FinVoz && !Condicion_S00()); +// if ( !(Condicion()) ) while (!FinVoz); + + ProgTimer0(0); + CloseSpeaker(); + setvect(8,Antigua8); + + fclose(handle_sonido); + DeInitSB(); + return(0); + +} + + +// int far TeclaPulsada(void) +/* Esta funcin mira si se ha pulsado una tecla pero SIN llamadas a la BIOS, + de forma que no se inhabilitan las interrupciones en cada llamada, cosa + que bajara mucho la calidad de reproduccin con el altavoz interno. */ +// { +// return ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ); +// } + +int Condicion_S00(void) +{ + + union REGS RaT; + RaT.x.ax = 3; + int86(0x33, &RaT, &RaT); + + return (( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) ) || (RaT.x.bx & 1)); + +} \ No newline at end of file diff --git a/WAVPLAV/VOCPLAY.OBJ b/WAVPLAV/VOCPLAY.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..f52e12ceedf2bc76b47280b7ce5be8a17d808827 GIT binary patch literal 8573 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 literal 0 HcmV?d00001 diff --git a/WAVPLAV/WAVPLAY.H b/WAVPLAV/WAVPLAY.H new file mode 100644 index 0000000..2a3e000 --- /dev/null +++ b/WAVPLAV/WAVPLAY.H @@ -0,0 +1,75 @@ + + + +//******************************************/ +//**/ /**/ +//**/ Funcion encargada de inicializar /**/ +//**/ la Sb, Speaker, o DAC... /**/ +//******************************************/ +extern int InitSB(void); + +//******************************************/ +//**/ /**/ +//**/ Funcion encargada de desconectar /**/ +//**/ la Sb, Speaker, o DAC... /**/ +//******************************************/ +extern void DeInitSB(void); + + + //****************************************** ;El fichero Wav debe estar grabado +///**/ Carga y Toca un fichero WAV o Wav' /** ;a 8050 Hz. +///**/ Se le pasan el Nombre del Fichero /** +///**/ y un puntero a la funcion que /** ;Devuelve un 0 si todo ha ido +///**/ determinara cuando se interrumpira /** ;bien... +///**/ el sonido antes del final del mismo/** +///****************************************** +/////////////////////////////////////////// +extern int PlayWav(char *File, long Pos, long Len); + + /******************************************/ + //**/ Igual que PlayWav... /**/ +///**/ /**/ +///**/ Solo que sirve para reproducir /**/ +///**/ ficheros WAV de 300.000 Mb de /**/ +///**/ Tamanyo utilizando solo un doble /**/ +///**/ buffer de 8K /**/ +///**/ /**/ +///******************************************/ +/////////////////////////////////////////// +extern int PlayLongWav(char *File, long Pos, long Len); + + /******************************************/ + //**/ Mira si se ha pulsado una tecla /**/ +///**/ pero sin utilizar la BIOS ni /**/ +///**/ interruppir las interrupciones /**/ +///******************************************/ +/////////////////////////////////////////// +extern int far TeclaPulsada(void); + +/// SB_SPK :: Aunque esta variable se carga sola cuando se inicializa +/// la SB, se puede forzar a cargarla manualmente... +/// +/// V A L O R Salida del sonido digitalizado +/// +/// 0 Speaker +/// 1 Sound Blaster +/// 2 Dac Casero... +extern char SB_SPK; + +/// WARNING !!!!! +/// +/// Las variables a continuacin enseladas no deben se modificadas y si +/// estan hay es solo para que puedas, si lo deseas, realizar un seguimiento +/// de los datos que estan sonando... + +extern char huge *pMuestra; /* Puntero a la muestra que suena */ +extern long Tamanyo, /* Tamao de los datos que estan sonando */ + T_Real; /* Tamao real de los datos */ + +// Nota: + +// Con PlayLongWav como es natural no se puede cargar un WAV de 300.000 Mb +// en memoria por lo que Tamanyo != T_Real e indica el tamao de la muestra +// que queda por reproducir, en bytes. +// + diff --git a/WAVPLAV/WAVPLAYC.LIB b/WAVPLAV/WAVPLAYC.LIB new file mode 100644 index 0000000000000000000000000000000000000000..0b9ee384b520e17c510f04f34781357888ca2303 GIT binary patch literal 13312 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 literal 0 HcmV?d00001