|
|
researchv10 Norman
#include <jstructs.h>
#define SHORTSIZE 16
#define inpoint(pp) (inword(&(pp)->x) < 0 ? -1 : inword(&(pp)->y))
#define inrect(rp) (inpoint(&(rp)->origin) < 0 ? -1 : inpoint(&(rp)->corner))
static int (*inch)();
Bitmap *
inbitmap(incharg)
int (*incharg)();
{
Bitmap *bp;
register y, i, rastwid, deltarow;
register short *p;
int dummy;
Rectangle r;
inch = incharg;
if (inword(&dummy) < 0 || inrect(&r) < 0)
return 0;
i = r.origin.x % WORDSIZE;
r.corner.x -= i; r.origin.x -= i;
if ((bp = balloc(r)) == 0)
return 0;
rastwid = (r.corner.x - r.origin.x + SHORTSIZE - 1)/SHORTSIZE;
deltarow = bp->width*(sizeof(Word)/sizeof(short));
p = (short *)bp->base;
for (y = r.origin.y; y < r.corner.y; y++) {
if (getrast(p, rastwid) < 0) {
bfree(bp);
return 0;
}
if (y > r.origin.y)
for (i=0; i < rastwid; i++)
p[i] ^= p[i-deltarow];
p += deltarow;
}
return bp;
}
static
getrast(p, nwords) /* receive single compressed raster */
register short *p; int nwords;
{
int count, same;
while (nwords > 0) {
if ((count = (*inch)()) <= 0)
return -1;
same = count&128; count &= 127;
nwords -= count;
if (same) {
if (innchars(sizeof(short), (char *)p) < 0)
return -1;
for (count--; count>0; count--) {
*(p+1) = *p; p++;
}
p++;
} else {
if (innchars(sizeof(short)*count, (char *)p) < 0)
return -1;
p += count;
}
}
return (nwords == 0 ? 0 : -1);
}
static
inword(wp)
short *wp;
{
register lo, hi;
if ((lo = (*inch)()) < 0 || (hi = (*inch)()) < 0)
return -1;
*wp = (hi << 8) | lo;
return 0;
}
static
innchars(n, p)
register n; register char *p;
{
register c;
while (--n >= 0)
if ((c = (*inch)()) < 0)
return -1;
else
*p++ = c;
return 0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.