|
|
1.1 root 1: /* $Header: text.c,v 10.3 86/02/01 15:47:40 tony Rel $ */
2: /* text.c Prints a line of text
3: *
4: * PrintText Prints text with source font
5: * PrintTextMask Prints text with mask font
6: * CopyText Copy text to bitmap
7: * TextWidth Returns width of a piece of text in a font
8: * CharWidth Returns width of a character in a font
9: *
10: */
11:
12: /****************************************************************************
13: * *
14: * Copyright (c) 1983, 1984 by *
15: * DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
16: * All rights reserved. *
17: * *
18: * This software is furnished on an as-is basis and may be used and copied *
19: * only with inclusion of the above copyright notice. This software or any *
20: * other copies thereof may be provided or otherwise made available to *
21: * others only for non-commercial purposes. No title to or ownership of *
22: * the software is hereby transferred. *
23: * *
24: * The information in this software is subject to change without notice *
25: * and should not be construed as a commitment by DIGITAL EQUIPMENT *
26: * CORPORATION. *
27: * *
28: * DIGITAL assumes no responsibility for the use or reliability of its *
29: * software on equipment which is not supplied by DIGITAL. *
30: * *
31: * *
32: ****************************************************************************/
33:
34: #include "vs100.h"
35:
36: extern BitMap screen;
37: extern int VSReloc;
38: extern char FBMap[];
39: extern char SSMap[];
40:
41: char *AllocateCopy(), *AllocateSpace();
42:
43: PrintText (string, strlen, font, fore, back, charpad, spacepad, dstx, dsty,
44: clips, clipcount, func, zmask)
45: char *string;
46: FONT *font;
47: int strlen, fore, back, charpad, spacepad, dstx, dsty;
48: CLIP *clips;
49: int clipcount, zmask;
50: register int func;
51: {
52: register PrintTextPacket *ptp;
53: #define h ((PacketHeader *) ptp->ptp_head)
54: #define dest ((BitMap *) ptp->ptp_destImage)
55: #define destOff ((Point *) ptp->ptp_initialOffset.literal)
56: #define txt ((TextString *) ptp->ptp_text)
57: #define control ((ControlString *) ptp->ptp_control)
58: #define clip ((RectangleList *) ptp->ptp_clipping.rectList)
59:
60: if (!(zmask & 1)) {
61: DeallocateSpace ();
62: return;
63: }
64: if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
65: (ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
66: return;
67:
68: if (fore & 1)
69: func += 0x20;
70: if (back & 1)
71: func += 0x10;
72: func = FBMap[func];
73: h->ph_textMod.m_source = 1; /* Source font */
74: h->ph_textMod.m_mask = 0; /* No mask font */
75: h->ph_textMod.m_dest = 0; /* Dest off. literal */
76: h->ph_textMod.m_map = MAPTYPE(func);
77: h->ph_textMod.m_textSize = 0; /* 8 bit characters */
78: h->ph_textMod.m_control = 0; /* No control string */
79: h->ph_opcode = PRINT_TEXT;
80: *(long *) h->ph_next = NULL;
81: *(caddr_t *) ptp->ptp_source.font = FDATA(font)->remote->vsPtr;
82:
83: *dest = screen;
84: destOff->p_x = dstx;
85: destOff->p_y = dsty;
86:
87: *(short *) ptp->ptp_map.literal = MAPLIT(func);
88:
89: if (clipcount == 1) {
90: h->ph_textMod.m_clipping = 1;
91: *(CLIP *) ptp->ptp_clipping.litRect = *clips;
92: } else {
93: h->ph_textMod.m_clipping = 2;
94: *(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
95: clip->r_count = clipcount;
96: }
97:
98: *(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
99: txt->t_count = strlen;
100:
101: *(short **) control->c_first = NULL;
102: control->c_count = 0;
103: ptp->ptp_charPad = charpad;
104: ptp->ptp_spacePad = spacepad;
105:
106: WritePacket ((caddr_t) ptp);
107: #undef h
108: #undef dest
109: #undef destOff
110: #undef txt
111: #undef control
112: #undef clip
113: }
114:
115: PrintTextMask (string, strlen, font, srcpix, charpad, spacepad, dstx, dsty,
116: clips, clipcount, func, zmask)
117: char *string;
118: FONT *font;
119: int strlen, srcpix, charpad, spacepad, dstx, dsty;
120: CLIP *clips;
121: int clipcount, zmask;
122: register int func;
123: {
124: register PrintTextPacket *ptp;
125: #define h ((PacketHeader *) ptp->ptp_head)
126: #define dest ((BitMap *) ptp->ptp_destImage)
127: #define destOff ((Point *) ptp->ptp_initialOffset.literal)
128: #define txt ((TextString *) ptp->ptp_text)
129: #define control ((ControlString *) ptp->ptp_control)
130: #define clip ((RectangleList *) ptp->ptp_clipping.rectList)
131:
132: if (!(zmask & 1)) {
133: DeallocateSpace ();
134: return;
135: }
136: if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
137: (ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
138: return;
139:
140: func = SSMap[func];
141: h->ph_textMod.m_source = 0; /* Constant */
142: h->ph_textMod.m_mask = 1; /* Mask font */
143: h->ph_textMod.m_dest = 0; /* Dest off. literal */
144: h->ph_textMod.m_map = MAPTYPE(func);
145: h->ph_textMod.m_textSize = 0; /* 8 bit characters */
146: h->ph_textMod.m_control = 0; /* No control string */
147: h->ph_opcode = PRINT_TEXT;
148: *(long *) h->ph_next = NULL;
149: ptp->ptp_source.const = srcpix & 1;
150:
151: *(caddr_t *) ptp->ptp_mask = FDATA(font)->remote->vsPtr;
152:
153: *dest = screen;
154: destOff->p_x = dstx;
155: destOff->p_y = dsty;
156:
157: *(short *) ptp->ptp_map.literal = MAPLIT(func);
158:
159: if (clipcount == 1) {
160: h->ph_textMod.m_clipping = 1;
161: *(CLIP *) ptp->ptp_clipping.litRect = *clips;
162: } else {
163: h->ph_textMod.m_clipping = 2;
164: *(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
165: clip->r_count = clipcount;
166: }
167:
168: *(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
169: txt->t_count = strlen;
170:
171: *(short **) control->c_first = NULL;
172: control->c_count = 0;
173: ptp->ptp_charPad = charpad;
174: ptp->ptp_spacePad = spacepad;
175:
176: WritePacket ((caddr_t) ptp);
177: #undef h
178: #undef dest
179: #undef destOff
180: #undef txt
181: #undef control
182: #undef clip
183: }
184:
185: CopyText (string, strlen, font, bm)
186: char *string;
187: int strlen;
188: FONT *font;
189: BITMAP *bm;
190: {
191: register PrintTextPacket *ptp;
192: #define h ((PacketHeader *) ptp->ptp_head)
193: #define dst ((SubBitmap *) ptp->ptp_destImage)
194: #define txt ((TextString *) ptp->ptp_text)
195: #define control ((ControlString *) ptp->ptp_control)
196:
197: if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
198: (ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
199: return;
200:
201: h->ph_textMod.m_source = 1; /* Source font */
202: h->ph_textMod.m_mask = 0; /* No mask font */
203: h->ph_textMod.m_dest = 0; /* Dest off. literal */
204: h->ph_textMod.m_map = 0;
205: h->ph_textMod.m_textSize = 0; /* 8 bit characters */
206: h->ph_textMod.m_control = 0; /* No control string */
207: h->ph_opcode = PRINT_TEXT;
208: *(long *) h->ph_next = NULL;
209: *(caddr_t *) ptp->ptp_source.font = FDATA(font)->remote->vsPtr;
210:
211: *(caddr_t *)dst->sb_address = BDATA(bm)->vsPtr;
212: dst->sb_height = bm->height;
213: dst->sb_width = bm->width;
214: dst->sb_bitsPerPixel = 1;
215: dst->sb_x = dst->sb_y = 0;
216:
217: *(short *) ptp->ptp_map.literal = 0;
218:
219: h->ph_textMod.m_clipping = 0;
220:
221: *(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
222: txt->t_count = strlen;
223:
224: *(short **) control->c_first = NULL;
225: control->c_count = 0;
226: ptp->ptp_charPad = 0;
227: ptp->ptp_spacePad = 0;
228:
229: WritePacket ((caddr_t) ptp);
230: #undef h
231: #undef dst
232: #undef txt
233: #undef control
234: }
235:
236: /* Returns the width of a string in a font */
237:
238: int TextWidth (string, strlen, spacepad, font)
239: char *string;
240: register int strlen;
241: int spacepad;
242: register FONT *font;
243: {
244: register u_char *strptr = (u_char *) string;
245: short c;
246: register short *widths;
247: int width = 0;
248:
249: if (font->fixed) {
250: width = strlen * font->avg_width;
251: if (spacepad) {
252: while (--strlen >= 0)
253: if (*strptr++ == font->space)
254: width += spacepad;
255: }
256: } else {
257: widths = FDATA(font)->widths;
258: while (--strlen >= 0) {
259: c = *strptr++;
260: if (c >= font->first && c <= font->last) {
261: if (c == font->space)
262: width += spacepad;
263: width += widths[c - font->first];
264: }
265: }
266: }
267:
268: return (width);
269: }
270:
271: /* Returns width of a character in a font. */
272:
273: int CharWidth(c, font)
274: register unsigned int c;
275: register FONT *font;
276: {
277:
278: if (c < font->first || c > font->last)
279: return (0);
280: else if (font->fixed)
281: return (font->avg_width);
282: else
283: return (FDATA(font)->widths[c - font->first]);
284: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.