xref: /original-bsd/old/vpr/vtools/rotate.c (revision 0a83ae40)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)rotate.c	5.1 (Berkeley) 05/15/85";
9 #endif not lint
10 
11 /*
12  * Rotate a Varian/Versatec font.
13  */
14 
15 #include <stdio.h>
16 #include <vfont.h>
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 
20 char	*chp;
21 char	*sbrk();
22 
23 main(argc,argv)
24 char **argv;
25 {
26 	struct header h;
27 	struct dispatch d[256], nd;
28 	struct stat stb;
29 	off_t tell();
30 	int i,size;
31 	int beg;
32 	char scr[2048];
33 
34 	argc--, argv++;
35 	if (argc > 0) {
36 		close(0);
37 		if (open(argv[0], 0) < 0)
38 			perror(argv[0]), exit(1);
39 	}
40 	if (read(0, &h, sizeof(h)) != sizeof(h)) {
41 		fprintf(stderr, "header read error\n");
42 		exit(1);
43 	}
44 	if (h.magic != 0436) {
45 		fprintf(stderr, "bad magic number\n");
46 		exit(1);
47 	}
48 	if (read(0, d, sizeof(d)) != sizeof(d)) {
49 		fprintf(stderr, "dispatch read error\n");
50 		exit(1);
51 	}
52 	fstat(0, &stb);
53 	size = stb.st_size - tell(0);
54 	fprintf(stderr, "%d bytes of characters\n", size);
55 	chp = sbrk(size + 1024);
56 	read(0, chp, size);
57 	write(1, &h, sizeof (h));
58 	write(1, d, sizeof (d));
59 	beg = tell(1);
60 	for (i = 0; i < 256; i++)
61 		if (d[i].nbytes) {
62 			if (d[i].addr + d[i].nbytes > size) {
63 				fprintf(stderr, "char %d out of range\n", i);
64 				continue;
65 			}
66 			cvt(&d[i], chp+d[i].addr, &nd, scr);
67 			d[i] = nd;
68 			d[i].addr = tell(1) - beg;
69 			write(1, scr, d[i].nbytes);
70 		}
71 	fprintf(stderr, "done, new size %d\n", tell(1) - beg);
72 	h.size = tell(1) - beg;
73 	lseek(1, 0, 0);
74 	write(1, &h, sizeof (h));
75 	write(1, d, sizeof (d));
76 }
77 
78 cvt(odp, ocp, dp, cp)
79 	struct dispatch *odp, *dp;
80 	register char *ocp, *cp;
81 {
82 	int max;
83 	int bpl;
84 	int row,byte,bit;
85 	register char *ep;
86 	register int bitoff;
87 	register int bits;
88 	int extra;
89 
90 	max = (odp->up+odp->down+7)/8;
91 	extra = max*8 - (odp->down+odp->up);
92 	dp->down = odp->down;
93 	dp->up = odp->up;
94 	dp->left = odp->left;
95 	dp->right = odp->right;
96 	dp->nbytes = max*(dp->right+dp->left);
97 	ep = cp;
98 	for (byte = 0; byte < dp->nbytes; byte++)
99 		*ep++ = 0;
100 	bpl = (dp->right+dp->left+7)/8;
101 	for (row = 0; row < odp->up+odp->down; row++) {
102 		for (byte = 0; byte < bpl; byte++) {
103 			bits = *ocp++;
104 			for (bit = 0; bit < 8; bit++) {
105 				if (bits & 0x80) {
106 					ep = cp + max*(byte*8+bit);
107 					bitoff = max*8 - row - 1 - extra;
108 					ep += (bitoff/8);
109 					*ep |= 0x80 >> (bitoff%8);
110 				}
111 				bits <<= 1;
112 			}
113 		}
114 	}
115 }
116