aboutsummaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'file.c')
-rw-r--r--file.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/file.c b/file.c
new file mode 100644
index 0000000..3a3809e
--- /dev/null
+++ b/file.c
@@ -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';
+}