|
|
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: 6832 (0x1ab0)
Types: TextFile
Names: »text.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libis/text.c«
/*
* $Source: /u1/X/libis/RCS/text.c,v $
* $Header: text.c,v 1.1 86/11/17 14:34:33 swick Rel $
*/
#ifndef lint
static char *rcsid_text_c = "$Header: text.c,v 1.1 86/11/17 14:34:33 swick Rel $";
#endif lint
#include "is-copyright.h"
/* text.c
*
* PrintText Prints text with source font
* PrintTextMask Prints text with mask font
* 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
*
* Copyright (c) 1986, Integrated Solutions, Inc.
*/
#include "Xis.h"
extern PIXMAP *MakePixmap();
extern PIXMAP *MakeFontPixmap();
/*
* PrintText Prints text with source font
*/
PrintText(string, strlen, font, fore, back, charpad, spacepad, dstx, dsty, clips, clipcount, func, zmask)
char *string; /* string to print */
int strlen; /* length of string */
register FONT *font; /* source font */
int fore; /* foreground source pixel */
int back; /* background source pixel */
register int charpad; /* inter-character pad */
int spacepad; /* space-character pad */
int dstx, dsty; /* destination */
register CLIP *clips; /* clipping rectangles */
register int clipcount; /* count of clipping rectangles */
int func; /* GX display function */
int zmask; /* plane mask */
{
register FontPriv *fdata = FDATA(font);
PIXMAP *font_pixmap;
CLIP bounds, i;
bounds.top = dsty;
bounds.height = font->height;
#ifdef DEBUG
if (debug & D_Text)
printf("PrintText(\"%.*s\")\n", strlen, string);
#endif DEBUG
font_pixmap = MakeFontPixmap(font, fore, back);
for ( ; clipcount > 0; clipcount--, ++clips) {
register int len = strlen;
register char *p = string;
register int x = dstx;
while (len--) {
register int char_x;
/* complete clip rectangle for character */
bounds.left = x;
if (font->fixed) {
char_x = font->avg_width * (*p - font->first);
bounds.width = font->avg_width;
} else {
char_x = fdata->xpos[*p - font->first];
bounds.width = fdata->widths[*p - font->first];
}
/* advance x position for next character */
x += bounds.width + charpad;
if (*p == font->space) {
x+= spacepad;
}
/* If clip rectangle and destination bounds overlap, display
* character in the area the two intersect */
if (Overlap(clips[0], bounds)) {
i = Intersection(clips[0], bounds);
CheckCursor(i);
GIP_RasterOp((unsigned char)func,
font_pixmap, char_x + (i.left - bounds.left),
i.top-bounds.top,
&ScreenPixmap, i.left, i.top,
(BITMAP *)NULL, 0, 0,
i.width, i.height,
zmask);
}
++p;
}
}
RestoreCursor();
}
/*
* PrintTextMask
*/
PrintTextMask(string, strlen, font, srcpix, charpad, spacepad, dstx, dsty, clips, clipcount, func, zmask)
char *string; /* string to print */
int strlen; /* length of string */
register FONT *font; /* source font */
int srcpix; /* source pixel */
register int charpad; /* inter-character pad */
int spacepad; /* space-character pad */
int dstx, dsty; /* destination */
register CLIP *clips; /* clipping rectangles */
register int clipcount; /* count of clipping rectangles */
int func; /* GX display function */
int zmask; /* plane mask */
{
register FontPriv *fdata = FDATA(font);
CLIP bounds, i;
PIXMAP *textpix;
#ifdef DEBUG
if (debug & D_Text)
printf("PrintTextMask(string=\"%.*s\", srcpix=0x%x, func=%d, zmask=0x%04x)\n",
strlen, string, srcpix, func, zmask);
#endif DEBUG
textpix = (PIXMAP *) MakePixmap((BITMAP *)NULL, srcpix, 0);
bounds.top = dsty;
bounds.height = font->height;
for ( ; clipcount > 0; clipcount--, ++clips) {
register int len = strlen;
register char *p = string;
register int x = dstx;
while (len--) {
register int char_x;
/* complete clip rectangle for character */
bounds.left = x;
if (font->fixed) {
char_x = font->avg_width * (*p - font->first);
bounds.width = font->avg_width;
} else {
char_x = fdata->xpos[*p - font->first];
bounds.width = fdata->widths[*p - font->first];
}
/* advance x position for next character */
x += bounds.width + charpad;
if (*p == font->space) {
x+= spacepad;
}
/* If clip rectangle and destination bounds overlap, display
* character in the area the two intersect */
if (Overlap(clips[0], bounds)) {
i = Intersection(clips[0], bounds);
CheckCursor(i);
GIP_RasterOp((unsigned char)func,
textpix, 0, 0,
&ScreenPixmap, i.left, i.top,
fdata->mask, char_x + (i.left - bounds.left),
i.top-bounds.top,
i.width, i.height,
zmask);
}
++p;
}
}
RestoreCursor();
if (!--textpix->refcnt)
FreePixmap(textpix);
}
/*
* CopyText
*/
CopyText(string, strlen, font, dst)
register char *string; /* string to copy */
register int strlen; /* length of string */
register FONT *font; /* source font */
BITMAP *dst; /* destination bitmap */
{
register FontPriv *fdata = FDATA(font);
PIXMAP *font_pixmap, *dst_pixmap;
register int height = font->height;
register x = 0;
#ifdef DEBUG
if (debug & D_Text)
printf("CopyText(string=\"%.*s\")\n", strlen, string);
#endif DEBUG
font_pixmap = MakePixmap(fdata->mask, 1, 0);
dst_pixmap = MakePixmap(dst, 1, 0);
while (strlen--) {
register int width;
/* get width of this character */
if (font->fixed) {
width = font->avg_width;
} else {
width = fdata->widths[*string - font->first];
}
GIP_RasterOp(GXcopy,
font_pixmap, fdata->xpos[*string - font->first], 0,
dst_pixmap, x, 0,
(BITMAP *)NULL, 0, 0,
width, height,
1);
/* advance x position for next character */
x += width;
++string;
}
FreePixmap(font_pixmap);
FreePixmap(dst_pixmap);
}
/*
* TextWidth Returns the width of a string in a font
*/
int
TextWidth(string, strlen, spacepad, font)
char *string;
register int strlen;
register int spacepad;
register FONT *font;
{
register u_char *strptr = (u_char *) string;
register short c;
register short *widths;
register int width = 0;
if (font->fixed) {
width = strlen * font->avg_width;
if (spacepad) {
while (strlen--) {
if (*strptr++ == font->space)
width += spacepad;
}
}
} else {
widths = FDATA(font)->widths;
while (strlen--) {
c = *strptr++;
if (c >= font->first && c <= font->last) {
if (c == font->space)
width += spacepad;
width += widths[c - font->first];
}
}
}
return (width);
}
/*
* CharWidth Returns width of a character in a font.
*/
int
CharWidth(c, font)
unsigned int c;
register FONT *font;
{
if (c < font->first || c > font->last)
return (0);
else if (font->fixed)
return (font->avg_width);
else
return (FDATA(font)->widths[c - font->first]);
}