|
|
1.1 root 1: /*
2: * $Source: /u1/X/libis/RCS/text.c,v $
3: * $Header: text.c,v 1.1 86/11/17 14:34:33 swick Rel $
4: */
5:
6: #ifndef lint
7: static char *rcsid_text_c = "$Header: text.c,v 1.1 86/11/17 14:34:33 swick Rel $";
8: #endif lint
9:
10: #include "is-copyright.h"
11:
12: /* text.c
13: *
14: * PrintText Prints text with source font
15: * PrintTextMask Prints text with mask font
16: * CopyText Copy text to bitmap
17: * TextWidth Returns width of a piece of text in a font
18: * CharWidth Returns width of a character in a font
19: *
20: * Copyright (c) 1986, Integrated Solutions, Inc.
21: */
22:
23: #include "Xis.h"
24:
25: extern PIXMAP *MakePixmap();
26: extern PIXMAP *MakeFontPixmap();
27:
28: /*
29: * PrintText Prints text with source font
30: */
31: PrintText(string, strlen, font, fore, back, charpad, spacepad, dstx, dsty, clips, clipcount, func, zmask)
32: char *string; /* string to print */
33: int strlen; /* length of string */
34: register FONT *font; /* source font */
35: int fore; /* foreground source pixel */
36: int back; /* background source pixel */
37: register int charpad; /* inter-character pad */
38: int spacepad; /* space-character pad */
39: int dstx, dsty; /* destination */
40: register CLIP *clips; /* clipping rectangles */
41: register int clipcount; /* count of clipping rectangles */
42: int func; /* GX display function */
43: int zmask; /* plane mask */
44: {
45: register FontPriv *fdata = FDATA(font);
46: PIXMAP *font_pixmap;
47:
48: CLIP bounds, i;
49:
50: bounds.top = dsty;
51: bounds.height = font->height;
52:
53: #ifdef DEBUG
54: if (debug & D_Text)
55: printf("PrintText(\"%.*s\")\n", strlen, string);
56: #endif DEBUG
57:
58: font_pixmap = MakeFontPixmap(font, fore, back);
59:
60: for ( ; clipcount > 0; clipcount--, ++clips) {
61: register int len = strlen;
62: register char *p = string;
63: register int x = dstx;
64:
65: while (len--) {
66: register int char_x;
67:
68: /* complete clip rectangle for character */
69: bounds.left = x;
70: if (font->fixed) {
71: char_x = font->avg_width * (*p - font->first);
72: bounds.width = font->avg_width;
73: } else {
74: char_x = fdata->xpos[*p - font->first];
75: bounds.width = fdata->widths[*p - font->first];
76: }
77:
78: /* advance x position for next character */
79: x += bounds.width + charpad;
80: if (*p == font->space) {
81: x+= spacepad;
82: }
83:
84: /* If clip rectangle and destination bounds overlap, display
85: * character in the area the two intersect */
86: if (Overlap(clips[0], bounds)) {
87: i = Intersection(clips[0], bounds);
88: CheckCursor(i);
89: GIP_RasterOp((unsigned char)func,
90: font_pixmap, char_x + (i.left - bounds.left),
91: i.top-bounds.top,
92: &ScreenPixmap, i.left, i.top,
93: (BITMAP *)NULL, 0, 0,
94: i.width, i.height,
95: zmask);
96: }
97: ++p;
98: }
99: }
100: RestoreCursor();
101: }
102:
103: /*
104: * PrintTextMask
105: */
106:
107: PrintTextMask(string, strlen, font, srcpix, charpad, spacepad, dstx, dsty, clips, clipcount, func, zmask)
108: char *string; /* string to print */
109: int strlen; /* length of string */
110: register FONT *font; /* source font */
111: int srcpix; /* source pixel */
112: register int charpad; /* inter-character pad */
113: int spacepad; /* space-character pad */
114: int dstx, dsty; /* destination */
115: register CLIP *clips; /* clipping rectangles */
116: register int clipcount; /* count of clipping rectangles */
117: int func; /* GX display function */
118: int zmask; /* plane mask */
119: {
120: register FontPriv *fdata = FDATA(font);
121: CLIP bounds, i;
122: PIXMAP *textpix;
123:
124: #ifdef DEBUG
125: if (debug & D_Text)
126: printf("PrintTextMask(string=\"%.*s\", srcpix=0x%x, func=%d, zmask=0x%04x)\n",
127: strlen, string, srcpix, func, zmask);
128: #endif DEBUG
129:
130: textpix = (PIXMAP *) MakePixmap((BITMAP *)NULL, srcpix, 0);
131:
132: bounds.top = dsty;
133: bounds.height = font->height;
134:
135: for ( ; clipcount > 0; clipcount--, ++clips) {
136: register int len = strlen;
137: register char *p = string;
138: register int x = dstx;
139:
140: while (len--) {
141: register int char_x;
142:
143: /* complete clip rectangle for character */
144: bounds.left = x;
145: if (font->fixed) {
146: char_x = font->avg_width * (*p - font->first);
147: bounds.width = font->avg_width;
148: } else {
149: char_x = fdata->xpos[*p - font->first];
150: bounds.width = fdata->widths[*p - font->first];
151: }
152:
153: /* advance x position for next character */
154: x += bounds.width + charpad;
155: if (*p == font->space) {
156: x+= spacepad;
157: }
158:
159: /* If clip rectangle and destination bounds overlap, display
160: * character in the area the two intersect */
161: if (Overlap(clips[0], bounds)) {
162: i = Intersection(clips[0], bounds);
163: CheckCursor(i);
164: GIP_RasterOp((unsigned char)func,
165: textpix, 0, 0,
166: &ScreenPixmap, i.left, i.top,
167: fdata->mask, char_x + (i.left - bounds.left),
168: i.top-bounds.top,
169: i.width, i.height,
170: zmask);
171: }
172: ++p;
173: }
174: }
175: RestoreCursor();
176: if (!--textpix->refcnt)
177: FreePixmap(textpix);
178: }
179:
180: /*
181: * CopyText
182: */
183: CopyText(string, strlen, font, dst)
184: register char *string; /* string to copy */
185: register int strlen; /* length of string */
186: register FONT *font; /* source font */
187: BITMAP *dst; /* destination bitmap */
188: {
189: register FontPriv *fdata = FDATA(font);
190: PIXMAP *font_pixmap, *dst_pixmap;
191: register int height = font->height;
192: register x = 0;
193:
194: #ifdef DEBUG
195: if (debug & D_Text)
196: printf("CopyText(string=\"%.*s\")\n", strlen, string);
197: #endif DEBUG
198:
199: font_pixmap = MakePixmap(fdata->mask, 1, 0);
200: dst_pixmap = MakePixmap(dst, 1, 0);
201:
202: while (strlen--) {
203: register int width;
204:
205: /* get width of this character */
206: if (font->fixed) {
207: width = font->avg_width;
208: } else {
209: width = fdata->widths[*string - font->first];
210: }
211:
212: GIP_RasterOp(GXcopy,
213: font_pixmap, fdata->xpos[*string - font->first], 0,
214: dst_pixmap, x, 0,
215: (BITMAP *)NULL, 0, 0,
216: width, height,
217: 1);
218:
219: /* advance x position for next character */
220: x += width;
221:
222: ++string;
223: }
224:
225: FreePixmap(font_pixmap);
226: FreePixmap(dst_pixmap);
227: }
228:
229: /*
230: * TextWidth Returns the width of a string in a font
231: */
232: int
233: TextWidth(string, strlen, spacepad, font)
234: char *string;
235: register int strlen;
236: register int spacepad;
237: register FONT *font;
238: {
239: register u_char *strptr = (u_char *) string;
240: register short c;
241: register short *widths;
242: register int width = 0;
243:
244: if (font->fixed) {
245: width = strlen * font->avg_width;
246: if (spacepad) {
247: while (strlen--) {
248: if (*strptr++ == font->space)
249: width += spacepad;
250: }
251: }
252:
253: } else {
254: widths = FDATA(font)->widths;
255: while (strlen--) {
256: c = *strptr++;
257: if (c >= font->first && c <= font->last) {
258: if (c == font->space)
259: width += spacepad;
260: width += widths[c - font->first];
261: }
262: }
263: }
264:
265: return (width);
266: }
267:
268: /*
269: * CharWidth Returns width of a character in a font.
270: */
271: int
272: CharWidth(c, font)
273: unsigned int c;
274: register FONT *font;
275: {
276:
277: if (c < font->first || c > font->last)
278: return (0);
279: else if (font->fixed)
280: return (font->avg_width);
281: else
282: return (FDATA(font)->widths[c - font->first]);
283: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.