|
|
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: 7899 (0x1edb)
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/libvs100/text.c«
/* $Header: text.c,v 10.3 86/02/01 15:47:40 tony Rel $ */
/* text.c Prints a line of text
*
* 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) 1983, 1984 by *
* DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
* All rights reserved. *
* *
* This software is furnished on an as-is basis and may be used and copied *
* only with inclusion of the above copyright notice. This software or any *
* other copies thereof may be provided or otherwise made available to *
* others only for non-commercial purposes. No title to or ownership of *
* the software is hereby transferred. *
* *
* The information in this software is subject to change without notice *
* and should not be construed as a commitment by DIGITAL EQUIPMENT *
* CORPORATION. *
* *
* DIGITAL assumes no responsibility for the use or reliability of its *
* software on equipment which is not supplied by DIGITAL. *
* *
* *
****************************************************************************/
#include "vs100.h"
extern BitMap screen;
extern int VSReloc;
extern char FBMap[];
extern char SSMap[];
char *AllocateCopy(), *AllocateSpace();
PrintText (string, strlen, font, fore, back, charpad, spacepad, dstx, dsty,
clips, clipcount, func, zmask)
char *string;
FONT *font;
int strlen, fore, back, charpad, spacepad, dstx, dsty;
CLIP *clips;
int clipcount, zmask;
register int func;
{
register PrintTextPacket *ptp;
#define h ((PacketHeader *) ptp->ptp_head)
#define dest ((BitMap *) ptp->ptp_destImage)
#define destOff ((Point *) ptp->ptp_initialOffset.literal)
#define txt ((TextString *) ptp->ptp_text)
#define control ((ControlString *) ptp->ptp_control)
#define clip ((RectangleList *) ptp->ptp_clipping.rectList)
if (!(zmask & 1)) {
DeallocateSpace ();
return;
}
if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
(ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
return;
if (fore & 1)
func += 0x20;
if (back & 1)
func += 0x10;
func = FBMap[func];
h->ph_textMod.m_source = 1; /* Source font */
h->ph_textMod.m_mask = 0; /* No mask font */
h->ph_textMod.m_dest = 0; /* Dest off. literal */
h->ph_textMod.m_map = MAPTYPE(func);
h->ph_textMod.m_textSize = 0; /* 8 bit characters */
h->ph_textMod.m_control = 0; /* No control string */
h->ph_opcode = PRINT_TEXT;
*(long *) h->ph_next = NULL;
*(caddr_t *) ptp->ptp_source.font = FDATA(font)->remote->vsPtr;
*dest = screen;
destOff->p_x = dstx;
destOff->p_y = dsty;
*(short *) ptp->ptp_map.literal = MAPLIT(func);
if (clipcount == 1) {
h->ph_textMod.m_clipping = 1;
*(CLIP *) ptp->ptp_clipping.litRect = *clips;
} else {
h->ph_textMod.m_clipping = 2;
*(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
clip->r_count = clipcount;
}
*(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
txt->t_count = strlen;
*(short **) control->c_first = NULL;
control->c_count = 0;
ptp->ptp_charPad = charpad;
ptp->ptp_spacePad = spacepad;
WritePacket ((caddr_t) ptp);
#undef h
#undef dest
#undef destOff
#undef txt
#undef control
#undef clip
}
PrintTextMask (string, strlen, font, srcpix, charpad, spacepad, dstx, dsty,
clips, clipcount, func, zmask)
char *string;
FONT *font;
int strlen, srcpix, charpad, spacepad, dstx, dsty;
CLIP *clips;
int clipcount, zmask;
register int func;
{
register PrintTextPacket *ptp;
#define h ((PacketHeader *) ptp->ptp_head)
#define dest ((BitMap *) ptp->ptp_destImage)
#define destOff ((Point *) ptp->ptp_initialOffset.literal)
#define txt ((TextString *) ptp->ptp_text)
#define control ((ControlString *) ptp->ptp_control)
#define clip ((RectangleList *) ptp->ptp_clipping.rectList)
if (!(zmask & 1)) {
DeallocateSpace ();
return;
}
if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
(ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
return;
func = SSMap[func];
h->ph_textMod.m_source = 0; /* Constant */
h->ph_textMod.m_mask = 1; /* Mask font */
h->ph_textMod.m_dest = 0; /* Dest off. literal */
h->ph_textMod.m_map = MAPTYPE(func);
h->ph_textMod.m_textSize = 0; /* 8 bit characters */
h->ph_textMod.m_control = 0; /* No control string */
h->ph_opcode = PRINT_TEXT;
*(long *) h->ph_next = NULL;
ptp->ptp_source.const = srcpix & 1;
*(caddr_t *) ptp->ptp_mask = FDATA(font)->remote->vsPtr;
*dest = screen;
destOff->p_x = dstx;
destOff->p_y = dsty;
*(short *) ptp->ptp_map.literal = MAPLIT(func);
if (clipcount == 1) {
h->ph_textMod.m_clipping = 1;
*(CLIP *) ptp->ptp_clipping.litRect = *clips;
} else {
h->ph_textMod.m_clipping = 2;
*(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
clip->r_count = clipcount;
}
*(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
txt->t_count = strlen;
*(short **) control->c_first = NULL;
control->c_count = 0;
ptp->ptp_charPad = charpad;
ptp->ptp_spacePad = spacepad;
WritePacket ((caddr_t) ptp);
#undef h
#undef dest
#undef destOff
#undef txt
#undef control
#undef clip
}
CopyText (string, strlen, font, bm)
char *string;
int strlen;
FONT *font;
BITMAP *bm;
{
register PrintTextPacket *ptp;
#define h ((PacketHeader *) ptp->ptp_head)
#define dst ((SubBitmap *) ptp->ptp_destImage)
#define txt ((TextString *) ptp->ptp_text)
#define control ((ControlString *) ptp->ptp_control)
if ((string = (caddr_t) AllocateCopy(string, strlen)) == NULL ||
(ptp = (PrintTextPacket *) AllocateSpace (sizeof (PrintTextPacket))) == NULL)
return;
h->ph_textMod.m_source = 1; /* Source font */
h->ph_textMod.m_mask = 0; /* No mask font */
h->ph_textMod.m_dest = 0; /* Dest off. literal */
h->ph_textMod.m_map = 0;
h->ph_textMod.m_textSize = 0; /* 8 bit characters */
h->ph_textMod.m_control = 0; /* No control string */
h->ph_opcode = PRINT_TEXT;
*(long *) h->ph_next = NULL;
*(caddr_t *) ptp->ptp_source.font = FDATA(font)->remote->vsPtr;
*(caddr_t *)dst->sb_address = BDATA(bm)->vsPtr;
dst->sb_height = bm->height;
dst->sb_width = bm->width;
dst->sb_bitsPerPixel = 1;
dst->sb_x = dst->sb_y = 0;
*(short *) ptp->ptp_map.literal = 0;
h->ph_textMod.m_clipping = 0;
*(caddr_t *) txt->t_first = (caddr_t) string + VSReloc;
txt->t_count = strlen;
*(short **) control->c_first = NULL;
control->c_count = 0;
ptp->ptp_charPad = 0;
ptp->ptp_spacePad = 0;
WritePacket ((caddr_t) ptp);
#undef h
#undef dst
#undef txt
#undef control
}
/* Returns the width of a string in a font */
int TextWidth (string, strlen, spacepad, font)
char *string;
register int strlen;
int spacepad;
register FONT *font;
{
register u_char *strptr = (u_char *) string;
short c;
register short *widths;
int width = 0;
if (font->fixed) {
width = strlen * font->avg_width;
if (spacepad) {
while (--strlen >= 0)
if (*strptr++ == font->space)
width += spacepad;
}
} else {
widths = FDATA(font)->widths;
while (--strlen >= 0) {
c = *strptr++;
if (c >= font->first && c <= font->last) {
if (c == font->space)
width += spacepad;
width += widths[c - font->first];
}
}
}
return (width);
}
/* Returns width of a character in a font. */
int CharWidth(c, font)
register 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]);
}