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