1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/* Copyright (c) 1992 AT&T - All rights reserved. */
#include <libc.h>
#include <libg.h>
#include "libgint.h"
void
_ldconvert(char *in, int inld, char *out, int outld, int w, int h)
{
int a, b, i, j, i1, j1, j2, mask;
int ind, inl, outd, outl;
int hh, ww;
char *p, *q;
i1 = 8 >> inld;
j1 = 8 >> outld;
ind = 1 << inld;
outd = 1 << outld;
inl = ((w << inld) + 7)/8;
outl = ((w << outld) + 7)/8;
b = 0;
if (ind > outd) {
mask = 256 - (256 >> outd);
for (hh = 0; hh < h; hh++, in += inl, out += outl)
for (p = in, q = out, ww = 0; ww < w; ww++) {
for (j = j1; j > 0; ) {
a = *p++;
for (i = i1; i > 0; i--, j--) {
b |= a & mask;
a <<= ind;
b <<= outd;
}
}
*q++ = (b >> 8);
}
} else {
j2 = 1 << (outld - inld);
mask = 256 - (256 >> ind);
for (hh = 0; hh < h; hh++, in += inl, out += outl)
for (p = in, q = out, ww = 0; ww < w; ww++) {
a = *p++;
for (i = i1; i > 0; ) {
for (j = j1; j > 0; j--, i--) {
b |= a & mask;
a <<= ind;
b <<= outd;
}
for (j = j2; j > 0; j--)
b |= (b << ind);
*q++ = (b >> 8);
}
}
}
}
|