|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 4646 (0x1226)
Types: TextFile
Names: »textutil.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libsun/textutil.c«
/*
* textutil.c
*
* Copyright (c) 1985 Massachusetts Institue of Technology
* Copyright (c) 1986 Sun Microsystems, Inc.
* Copyright (c) 1986 David C. Martin, UC Berkeley
*
* David C. Martin
* ARPA: dcmartin@ingres.Berkeley.EDU
* UUCP: ..!ucbvax!dcmartin
*
* $Log: textutil.c,v $
* Revision 10.3 86/11/29 13:49:03 jg
* fixes from Berkeley
*
* Revision 1.7 86/07/27 13:47:46 dcmartin
* modifications to TextWidth() and CharWidth() to check for invalid characters
* when determining width.
*
* Revision 1.6 86/07/20 13:28:45 dcmartin
* *** empty log message ***
*
* Revision 1.5 86/07/17 10:38:19 dcmartin
* release version w/ fix for correctly determining character widths in
* variable width fonts
*
* Revision 1.4 86/07/17 10:32:28 dcmartin
*
*/
#ifndef lint
static char rcs_id[] = "$Header: textutil.c,v 10.3 86/11/29 13:49:03 jg Rel $";
#endif lint
#include <X/mit-copyright.h>
/*
* The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
* for unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify these drivers without charge, but are not authorized
* to license or distribute them to anyone else except as part of a product or
* program developed by the user.
*
* THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
* INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
* PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
* PRACTICE.
*
* The Sun X Drivers are provided with no support and without any obligation
* on the part of Sun Microsystems, Inc. to assist in their use, correction,
* modification or enhancement.
*
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
* DRIVERS OR ANY PART THEREOF.
*
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
*
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
#ifdef sun
/* textutil.c text related utility routines.
*
* CopyText Copy text to bitmap
* TextWidth Returns width of a piece of text in a font
* CharWidth Returns width of a character in a font
*
*/
/*
* ToDo:
* Use static pixrects
*/
#include "Xsun.h"
#define CHUNK 80
extern int
CopyText (string, strlen, font, bm)
char *string;
int strlen;
FONT *font;
BITMAP *bm;
{
int i;
struct pixrect *region;
register struct pixfont *pf = (struct pixfont *) font->data;
char *buf = (char *) Xalloc(strlen + 1);
/* XXX - to guarantee zero-termination (BARF!) */
strncpy(buf, string, strlen);
/* XXX - slow!! */
region = mem_point(bm->width, bm->height, 1, (short *) bm->data);
for (i = 0; i < strlen; i += CHUNK) {
register int j;
struct pr_prpos bat[CHUNK];
for (j = 0; j < CHUNK && i + j < strlen; j++) {
int c = string[i + j];
register struct pixchar *pc = &(pf->pf_char[c]);
bat[j].pr = pc->pc_pr;
bat[j].pos = pc->pc_adv;
}
pr_batchrop(region, 0 - bat[0].pos.x, 0 - bat[0].pos.y,
PIX_SRC, bat, j);
}
/* XXX - slow */
pr_destroy(region);
free((caddr_t) buf);
} /* end CopyText() */
#undef CHUNK
/*
* Returns the width of a string in a font
*/
extern int
TextWidth (string, strlen, spacepad, font)
register char *string;
register int strlen;
int spacepad;
register FONT *font;
{
register unsigned int c;
register int width = 0;
if (font->fixed) {
width = strlen * font->avg_width;
if (spacepad) {
while (--strlen >= 0) {
if (*string++ == font->space)
width += spacepad;
}
}
} else {
register struct pixfont *pf;
pf = (struct pixfont *) font->data;
while (--strlen >= 0) {
c = *string++;
if (c < font->first || c > font->last)
continue;
if (c == font->space)
width += spacepad;
if (pf->pf_char[c].pc_pr != (struct pixrect *) NULL)
width += pf->pf_char[c].pc_adv.x;
}
}
return (width);
} /* end TextWidth() */
/*
* Returns width of a character in a font.
*/
extern int
CharWidth(c, font)
register unsigned int c;
register FONT *font;
{
register struct pixfont *pfp = (struct pixfont *) font->data;
if (c < font->first || c > font->last)
return (0);
else if (font->fixed)
return (font->avg_width);
if (pfp->pf_char[c].pc_pr != (struct pixrect *) NULL)
return(pfp->pf_char[c].pc_adv.x);
else
return(0);
} /* end CharWidth() */
#endif sun