|
|
1.1 root 1: /* Copyright 1985, Massachusetts Institute of Technology */
2:
3: /* textutil.c text related utility routines.
4: *
5: * CopyText Copy text to bitmap
6: * TextWidth Returns width of a piece of text in a font
7: * CharWidth Returns width of a character in a font
8: *
9: */
10:
11: #include "ddxqvss.h"
12: #include "vstagbl.h"
13:
14: CopyText (string, strlen, font, bm)
15: register char *string;
16: register int strlen;
17: FONT *font;
18: register BITMAP *bm;
19: {
20:
21: int dstx,srcx,w,h;
22: FontPriv *pfont;
23: BITMAP *fbm;
24:
25: pfont = FDATA(font);
26: fbm = pfont->strike;
27:
28: dstx = 0;
29: h = font->height;
30:
31: while (strlen--)
32: {
33:
34: /* SET THE WIDTH OF THE CHARACTER */
35:
36: w = pfont->widths[*string];
37: srcx = pfont->leftarray[*string++];
38:
39: /* CALL THE COPY BITMAP PROCEDURE TO COPY THE CHARACTER
40: FROM THE FONT BITMAP TO THE DESTINATION BITMAP */
41:
42: copyrmsk(VSTA$K_SRC_BITMAP, (short *)fbm->data, fbm->width,
43: fbm->height, srcx, 0, w, h,
44: (short *)bm->data, bm->width, bm->height, dstx, 0,
45: VSTA$K_MAP_SRC, 0, 0);
46:
47: /* ADD THE WIDTH OF THE CHARACTER TO THE DST OFFSET */
48:
49: dstx += w;
50:
51: };
52: }
53:
54: /* Returns the width of a string in a font */
55:
56: int TextWidth (string, strlen, spacepad, font)
57: register char *string;
58: register int strlen;
59: int spacepad;
60: register FONT *font;
61: {
62: register unsigned int c;
63: register short *widths;
64: int width = 0;
65:
66: if (font->fixed) {
67: width = strlen * font->avg_width;
68: if (spacepad) {
69: while (--strlen >= 0)
70: if (*string++ == font->space)
71: width += spacepad;
72: }
73: } else {
74: widths = FDATA(font)->widths;
75: while (--strlen >= 0) {
76: c = *string++;
77: if (c >= font->first && c <= font->last) {
78: if (c == font->space)
79: width += spacepad;
80: width += widths[c - font->first];
81: }
82: }
83: }
84:
85: return (width);
86: }
87:
88: /* Returns width of a character in a font. */
89:
90: int CharWidth(c, font)
91: register unsigned int c;
92: register FONT *font;
93: {
94:
95: if (c < font->first || c > font->last)
96: return (0);
97: else if (font->fixed)
98: return (font->avg_width);
99: else
100: return (FDATA(font)->widths[c - font->first]);
101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.