diff options
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 196 |
1 files changed, 196 insertions, 0 deletions
@@ -0,0 +1,196 @@ +/* + * Compface - 48x48x1 image compression and decompression + * + * Copyright (c) James Ashton - Sydney University - June 1990. + * + * Written 11th November 1989. + * + * Permission is given to distribute these sources, as long as the + * copyright messages are not removed, and no monies are exchanged. + * + * No responsibility is taken for any errors on inaccuracies inherent + * either to the comments or the code of this program, but if reported + * to me, then an attempt will be made to fix them. + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "compface.h" + +int compface_xbitmap=0; + +void +BigRead(fbuf) +register char *fbuf; +{ + register int c; + + while (*fbuf != '\0') + { + c = *(fbuf++); + if ((c < FIRSTPRINT) || (c > LASTPRINT)) + continue; + BigMul(NUMPRINTS); + BigAdd((WORD)(c - FIRSTPRINT)); + } +} + +void +BigWrite(fbuf) +register char *fbuf; +{ + static WORD tmp; + static char buf[DIGITS]; + register char *s; + register int i; + + s = buf; + while (B.b_words > 0) + { + BigDiv(NUMPRINTS, &tmp); + *(s++) = tmp + FIRSTPRINT; + } + i = 7; /* leave room for the field name on the first line */ + *(fbuf++) = ' '; + while (s-- > buf) + { + if (i == 0) + *(fbuf++) = ' '; + *(fbuf++) = *s; + if (++i >= MAXLINELEN) + { + *(fbuf++) = '\n'; + i = 0; + } + } + if (i > 0) + *(fbuf++) = '\n'; + *(fbuf++) = '\0'; +} + +void +ReadFace(fbuf) +char *fbuf; +{ + register int c, i; + register char *s, *t; + + t = s = fbuf; + for(i = strlen(s); i > 0; i--) + { + c = (int)*(s++); + if ((c >= '0') && (c <= '9')) + { + if (t >= fbuf + DIGITS) + { + status = ERR_EXCESS; + break; + } + *(t++) = c - '0'; + } + else if ((c >= 'A') && (c <= 'F')) + { + if (t >= fbuf + DIGITS) + { + status = ERR_EXCESS; + break; + } + *(t++) = c - 'A' + 10; + } + else if ((c >= 'a') && (c <= 'f')) + { + if (t >= fbuf + DIGITS) + { + status = ERR_EXCESS; + break; + } + *(t++) = c - 'a' + 10; + } + else if (((c == 'x') || (c == 'X')) && (t > fbuf) && (*(t-1) == 0)) + t--; + } + if (t < fbuf + DIGITS) + longjmp(comp_env, ERR_INSUFF); + s = fbuf; + t = F; + c = 1 << (BITSPERDIG - 1); + while (t < F + PIXELS) + { + *(t++) = (*s & c) ? 1 : 0; + if ((c >>= 1) == 0) + { + s++; + c = 1 << (BITSPERDIG - 1); + } + } +} + +void +WriteFace(fbuf) +char *fbuf; +{ + register char *s, *t; + register int i, bits, digits, words; + int digsperword = DIGSPERWORD; + int wordsperline = WORDSPERLINE; + + s = F; + t = fbuf; + bits = digits = words = i = 0; + if (compface_xbitmap) { + sprintf(t,"#define noname_width 48\n#define noname_height 48\nstatic char noname_bits[] = {\n "); + while (*t) t++; + digsperword = 2; + wordsperline = 15; + } + while (s < F + PIXELS) + { + if ((bits == 0) && (digits == 0)) + { + *(t++) = '0'; + *(t++) = 'x'; + } + if (compface_xbitmap) { + if (*(s++)) + i = (i >> 1) | 0x8; + else + i >>= 1; + } + else { + if (*(s++)) + i = i * 2 + 1; + else + i *= 2; + } + if (++bits == BITSPERDIG) + { + if (compface_xbitmap) { + t++; + t[-(digits & 1) * 2] = *(i + HexDigits); + } + else *(t++) = *(i + HexDigits); + bits = i = 0; + if (++digits == digsperword) + { + if (compface_xbitmap && (s >= F + PIXELS)) + break; + *(t++) = ','; + digits = 0; + if (++words == wordsperline) + { + *(t++) = '\n'; + if (compface_xbitmap) *(t++) = ' '; + words = 0; + } + } + } + } + if (compface_xbitmap) { + sprintf(t, "};\n"); + while (*t) t++; + } + *(t++) = '\0'; +} |