Annotation of 43BSD/contrib/X/libvs100/text.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.