|
|
1.1 root 1: /*
2: * textutil.c
3: *
4: * Copyright (c) 1985 Massachusetts Institue of Technology
5: * Copyright (c) 1986 Sun Microsystems, Inc.
6: * Copyright (c) 1986 David C. Martin, UC Berkeley
7: *
8: * David C. Martin
9: * ARPA: [email protected]
10: * UUCP: ..!ucbvax!dcmartin
11: *
12: * $Log: textutil.c,v $
13: * Revision 10.3 86/11/29 13:49:03 jg
14: * fixes from Berkeley
15: *
16: * Revision 1.7 86/07/27 13:47:46 dcmartin
17: * modifications to TextWidth() and CharWidth() to check for invalid characters
18: * when determining width.
19: *
20: * Revision 1.6 86/07/20 13:28:45 dcmartin
21: * *** empty log message ***
22: *
23: * Revision 1.5 86/07/17 10:38:19 dcmartin
24: * release version w/ fix for correctly determining character widths in
25: * variable width fonts
26: *
27: * Revision 1.4 86/07/17 10:32:28 dcmartin
28: *
29: */
30:
31: #ifndef lint
32: static char rcs_id[] = "$Header: textutil.c,v 10.3 86/11/29 13:49:03 jg Rel $";
33: #endif lint
34:
35: #include <X/mit-copyright.h>
36:
37: /*
38: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
39: * for unrestricted use provided that this legend is included on all tape
40: * media and as a part of the software program in whole or part. Users
41: * may copy or modify these drivers without charge, but are not authorized
42: * to license or distribute them to anyone else except as part of a product or
43: * program developed by the user.
44: *
45: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
46: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
47: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
48: * PRACTICE.
49: *
50: * The Sun X Drivers are provided with no support and without any obligation
51: * on the part of Sun Microsystems, Inc. to assist in their use, correction,
52: * modification or enhancement.
53: *
54: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
55: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
56: * DRIVERS OR ANY PART THEREOF.
57: *
58: * In no event will Sun Microsystems, Inc. be liable for any lost revenue
59: * or profits or other special, indirect and consequential damages, even if
60: * Sun has been advised of the possibility of such damages.
61: *
62: * Sun Microsystems, Inc.
63: * 2550 Garcia Avenue
64: * Mountain View, California 94043
65: */
66:
67: #ifdef sun
68:
69: /* textutil.c text related utility routines.
70: *
71: * CopyText Copy text to bitmap
72: * TextWidth Returns width of a piece of text in a font
73: * CharWidth Returns width of a character in a font
74: *
75: */
76:
77: /*
78: * ToDo:
79: * Use static pixrects
80: */
81:
82: #include "Xsun.h"
83:
84: #define CHUNK 80
85:
86: extern int
87: CopyText (string, strlen, font, bm)
88: char *string;
89: int strlen;
90: FONT *font;
91: BITMAP *bm;
92: {
93: int i;
94: struct pixrect *region;
95: register struct pixfont *pf = (struct pixfont *) font->data;
96: char *buf = (char *) Xalloc(strlen + 1);
97:
98: /* XXX - to guarantee zero-termination (BARF!) */
99: strncpy(buf, string, strlen);
100: /* XXX - slow!! */
101: region = mem_point(bm->width, bm->height, 1, (short *) bm->data);
102: for (i = 0; i < strlen; i += CHUNK) {
103: register int j;
104: struct pr_prpos bat[CHUNK];
105:
106: for (j = 0; j < CHUNK && i + j < strlen; j++) {
107: int c = string[i + j];
108: register struct pixchar *pc = &(pf->pf_char[c]);
109:
110: bat[j].pr = pc->pc_pr;
111: bat[j].pos = pc->pc_adv;
112: }
113: pr_batchrop(region, 0 - bat[0].pos.x, 0 - bat[0].pos.y,
114: PIX_SRC, bat, j);
115: }
116: /* XXX - slow */
117: pr_destroy(region);
118: free((caddr_t) buf);
119: } /* end CopyText() */
120:
121: #undef CHUNK
122:
123: /*
124: * Returns the width of a string in a font
125: */
126: extern int
127: TextWidth (string, strlen, spacepad, font)
128: register char *string;
129: register int strlen;
130: int spacepad;
131: register FONT *font;
132: {
133: register unsigned int c;
134: register int width = 0;
135:
136: if (font->fixed) {
137: width = strlen * font->avg_width;
138: if (spacepad) {
139: while (--strlen >= 0) {
140: if (*string++ == font->space)
141: width += spacepad;
142: }
143: }
144: } else {
145: register struct pixfont *pf;
146:
147: pf = (struct pixfont *) font->data;
148: while (--strlen >= 0) {
149: c = *string++;
150: if (c < font->first || c > font->last)
151: continue;
152: if (c == font->space)
153: width += spacepad;
154: if (pf->pf_char[c].pc_pr != (struct pixrect *) NULL)
155: width += pf->pf_char[c].pc_adv.x;
156: }
157: }
158: return (width);
159: } /* end TextWidth() */
160:
161: /*
162: * Returns width of a character in a font.
163: */
164: extern int
165: CharWidth(c, font)
166: register unsigned int c;
167: register FONT *font;
168: {
169: register struct pixfont *pfp = (struct pixfont *) font->data;
170:
171: if (c < font->first || c > font->last)
172: return (0);
173: else if (font->fixed)
174: return (font->avg_width);
175: if (pfp->pf_char[c].pc_pr != (struct pixrect *) NULL)
176: return(pfp->pf_char[c].pc_adv.x);
177: else
178: return(0);
179: } /* end CharWidth() */
180:
181: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.