|
|
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 p
Length: 6459 (0x193b)
Types: TextFile
Names: »put.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libvs100/put.c«
/* $Header: put.c,v 10.3 86/02/01 15:47:24 tony Rel $ */
/* put.c Perform a raster operation with a source bitmap
*
* PixmapPut Puts a pixmap up on the screen
* PixmapBitsPut Puts a pixmap up on the screen
* BitmapBitsPut Puts a pixmap up on the screen
*
*/
/****************************************************************************
* *
* 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 *AllocateSpace(), *AllocateCopy(), *Xalloc();
PixmapPut (src, srcx, srcy, width, height, dstx, dsty, clips, clipcount,
func, zmask)
PIXMAP *src;
int srcx, srcy, width, height, dstx, dsty, clipcount, zmask;
register int func;
CLIP *clips;
{
register CopyAreaPacket *cap;
#define h ((PacketHeader *) cap->cap_head)
#define img ((SubBitmap *) cap->cap_source.image)
#define pat ((Halftone *) cap->cap_source.pattern)
#define size ((Extent *) cap->cap_maskSize)
#define destOff ((Point *) cap->cap_destOffset)
#define clip ((RectangleList *) cap->cap_clipping.rectList)
if (!(zmask & 1)) {
DeallocateSpace ();
return;
}
cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket));
if (cap == NULL) return;
func = SSMap[func | (src->kind & 0x10)];
h->ph_copyMod.m_mask = 0;
h->ph_copyMod.m_map = MAPTYPE(func);
h->ph_opcode = COPY_AREA;
*(long *) h->ph_next = NULL;
if (src->kind == 0) {
h->ph_copyMod.m_source = 0;
cap->cap_source.const = (int) src->data;
} else {
h->ph_copyMod.m_source = 1;
#ifdef HTCROCK
if (src->kind & 2)
*(caddr_t *) img->sb_address = BDATA(TDATA(src)->bitmap)->vsPtr;
else
#endif
*(caddr_t *) img->sb_address = BDATA(PDATA(src))->vsPtr;
img->sb_height = src->height;
img->sb_width = src->width;
img->sb_bitsPerPixel = 1;
img->sb_x = srcx;
img->sb_y = srcy;
}
size->e_height = height;
size->e_width = width;
*(BitMap *) cap->cap_destImage = screen;
destOff->p_x = dstx;
destOff->p_y = dsty;
*(long *) cap->cap_map.literal = MAPLIT(func);
if (clipcount == 1) {
h->ph_copyMod.m_clipping = 1;
*(CLIP *) cap->cap_clipping.litRect = *clips;
} else {
h->ph_copyMod.m_clipping = 2;
*(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
clip->r_count = clipcount;
}
WritePacket ((caddr_t) cap);
#undef h
#undef img
#undef pat
#undef size
#undef destOff
#undef clip
}
/*ARGSUSED*/
PixmapBitsPut (width, height, format, data, xymask, dstx, dsty,
clips, clipcount, func, zmask)
char *data;
int width, height, format, dstx, dsty, clipcount, zmask;
BITMAP *xymask;
CLIP *clips;
int func;
{
BitmapBitsPut (width, height, data, 1, 0, xymask, dstx, dsty,
clips, clipcount, func, zmask);
}
BitmapBitsPut (width, height, data, fore, back, xymask, dstx, dsty,
clips, clipcount, func, zmask)
char *data;
int width, height, fore, back, dstx, dsty, clipcount, zmask;
register BITMAP *xymask;
CLIP *clips;
register int func;
{
register CopyAreaPacket *cap;
#define h ((PacketHeader *) cap->cap_head)
#define src ((SubBitmap *) cap->cap_source.image)
#define pat ((Halftone *) cap->cap_source.pattern)
#define size ((Extent *) cap->cap_maskSize)
#define mask ((SubBitmap *) cap->cap_sourceMask)
#define destOff ((Point *) cap->cap_destOffset)
#define clip ((RectangleList *) cap->cap_clipping.rectList)
caddr_t bits;
char *boxes = NULL;
CLIP clip1;
int width1, num, boxbytes, bytes;
if (!(zmask & 1)) {
DeallocateSpace ();
return;
}
if (fore & 1)
func += 0x20;
if (back & 1)
func += 0x10;
func = FBMap[func];
width1 = BitmapSize(width, 1);
num = VBUFSIZE / width1;
if (height > num) {
if (clipcount == 1) {
clip1 = *clips;
clips = &clip1;
} else {
boxbytes = sizeof (CLIP) * clipcount;
boxes = Xalloc (boxbytes);
bcopy ((caddr_t) clips, boxes, boxbytes);
DeallocateSpace ();
}
}
while (height) {
if (height < num)
num = height;
bytes = num * width1;
if ((bits = (caddr_t) AllocateCopy (data, bytes)) == NULL ||
(boxes && (clips = (CLIP *) AllocateCopy (boxes, boxbytes)) == NULL) ||
(cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket))) == NULL)
break;
h->ph_copyMod.m_source = 1;
h->ph_copyMod.m_mask = xymask ? 1 : 0;
h->ph_copyMod.m_map = MAPTYPE(func);
h->ph_opcode = COPY_AREA;
*(long *) h->ph_next = NULL;
*(caddr_t *) src->sb_address = bits + VSReloc;
src->sb_height = num;
src->sb_width = width;
src->sb_bitsPerPixel = 1;
src->sb_x = src->sb_y = 0;
if (xymask) {
*(caddr_t *) mask->sb_address = BDATA(xymask)->vsPtr;
mask->sb_height = xymask->height;
mask->sb_width = xymask->width;
mask->sb_bitsPerPixel = 1;
mask->sb_x = mask->sb_y = 0;
}
size->e_height = num;
size->e_width = width;
*(BitMap *) cap->cap_destImage = screen;
destOff->p_x = dstx;
destOff->p_y = dsty;
*(long *) cap->cap_map.literal = MAPLIT(func);
if (clipcount == 1) {
h->ph_copyMod.m_clipping = 1;
*(CLIP *) cap->cap_clipping.litRect = *clips;
} else {
h->ph_copyMod.m_clipping = 2;
*(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc;
clip->r_count = clipcount;
}
WritePacket ((caddr_t) cap);
height -= num;
dsty += num;
data += bytes;
}
if (boxes)
free (boxes);
#undef h
#undef src
#undef pat
#undef size
#undef mask
#undef destOff
#undef clip
}