|
|
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.