|
|
1.1 root 1:
2: /*
3: *
4: * Things needed to rotate glyphs. Includes setting new reference point,
5: * bitmap dimensions, and filling in the new bitmap.
6: *
7: */
8:
9:
10: #include <stdio.h>
11:
12: #include "gen.h" /* a few general definitions */
13: #include "rast.h" /* for definition of Glyph */
14: #include "rotate.h" /* rotation macros */
15:
16:
17: /*
18: *
19: * These guys are used in the translation and rotation macros defined
20: * in rotate.h.
21: *
22: */
23:
24:
25: int cosine[ROT_COUNT] = {1, 0, -1, 0};
26: int sine[ROT_COUNT] = {0, 1, 0, -1};
27: int delta[ROT_COUNT] = {1, 0, 0, 0};
28:
29:
30: char *bptr = NULL; /* last rotated bitmap */
31:
32:
33: /*****************************************************************************/
34:
35:
36: rotate(glyph, angle)
37:
38:
39: Glyph *glyph; /* rotate this glyph */
40: int angle; /* to this orientation */
41:
42:
43: {
44:
45:
46: Glyph oglyph; /* old glyph data */
47: int orwid; /* rows in the old bitmap */
48: int nrwid; /* same but for the new bitmap */
49: int mapsize; /* byte size of the new map */
50: int i, j; /* coordinates in the old bitmap */
51: int x, y; /* same but in the new bitmap */
52:
53:
54: /*
55: *
56: * Called when we want to rotate glyph to an orientation of angle, where
57: * angle should be 0, 1, 2, or 3. I decided against using a complete set
58: * of raster files that had already been rotated in favor of doing the work
59: * at run time. Really don't expect this stuff to be used that much and
60: * we've already got too many raster files around.
61: *
62: */
63:
64:
65: if ( angle == 0 ) return; /* everything's already done */
66:
67: oglyph = *glyph; /* we'll need most of the old values */
68:
69: glyph->xref = NEWX(oglyph.xref, oglyph.yref, oglyph.height, oglyph.width, angle);
70: glyph->yref = NEWY(oglyph.xref, oglyph.yref, oglyph.height, oglyph.width, angle);
71: glyph->width = (angle % 2) ? oglyph.height : oglyph.width;
72: glyph->height = (angle % 2) ? oglyph.width : oglyph.height;
73:
74: if ( bptr != NULL )
75: free(bptr);
76:
77: mapsize = ((glyph->width + BYTE - 1) / BYTE) * glyph->height;
78: if ( (bptr = (char *) calloc(mapsize, sizeof(char))) == NULL )
79: error(FATAL, "can't get memory for bitmap");
80:
81: orwid = (oglyph.width + BYTE - 1) / BYTE;
82: nrwid = (glyph->width + BYTE - 1) / BYTE;
83:
84: for ( j = 0; j < oglyph.height; j++ )
85: for ( i = 0; i < oglyph.width; i++ )
86: if ( checkbit(oglyph.bptr, orwid * j * BYTE + i) ) {
87: x = NEWX(i, j, oglyph.height, oglyph.width, angle);
88: y = NEWY(i, j, oglyph.height, oglyph.width, angle);
89: setbit(bptr, nrwid * y * BYTE + x);
90: } /* End if */
91:
92: glyph->bptr = bptr;
93:
94: } /* End of rotate */
95:
96:
97: /*****************************************************************************/
98:
99:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.