|
|
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 c
Length: 4197 (0x1065)
Types: TextFile
Names: »copybits.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libibm/libsrc/copybits.c«
#ifndef lint
static char *rcsid_copybits_c = "$Header: copybits.c,v 10.1 86/11/19 10:40:50 jg Exp $";
#endif lint
/* copybits.c - Interface routine to bitblt()
*
* CopyBits Places "X" supplied data into blt structure before
* calling bitblt() ounce for each clipping rectangle
* in the cliplist.
*
* Author:
* Scott Bates
* Brown University
* IRIS, Box 1946
* Providence, RI 02912
*
*
* Copyright (c) 1986 Brown University
*
* Permission to use, copy, modify and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies, and that both
* that copyright notice and this permission notice appear in supporting
* documentation, and that the name of Brown University not be used in
* advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. Brown University makes no
* representations about the suitability of this software for any purpose.
* It is provided "as-is" without express or implied warranty.
*/
#include "private.h"
#include "bitblt.h"
/*
* General interface routine to bitblt()
*/
CopyBits (srcbits, srcwidth, srcheight, srcrect, dstbits, dstwidth,
dstheight, dstrect, maskbits, maskwidth, maskheight, rule,
clipcount, cliplist)
u_short *srcbits, *dstbits, *maskbits;
register Blt_Rectangle *srcrect, *dstrect;
int srcwidth, srcheight, dstwidth;
int maskwidth, maskheight;
int dstheight, rule;
register clipcount;
register CLIP *cliplist;
{
register Blt *blt = &bltdata;
register Blt_Bitmap *dstbitmap = &blt->dst_bitmap;
register Blt_Rectangle *cliprect = &blt->clp_rect;
#ifdef FULL_TRACE_X
fprintf(stderr, "In CopyBits\n");
fflush(stderr);
#endif FULL_TRACE_X
/*
* Clear blt structure
*/
bzero((char *) blt, sizeof(Blt));
#ifdef AED
/*
* If this is the AED make sure this blt
* gets echoed
*/
blt->blt_flags |= BLT_ECHO;
#endif AED
/*
* Set up source bitmap or tile
*/
if(IS_RULE_TILE(rule)) {
/*
* Srcbits is a tile
*/
blt->tile_ptr = (Blt_Tile *)srcbits;
} else {
register Blt_Bitmap *srcbitmap = &blt->src_bitmap;
/*
* Srcbits is a bitimage. Convert bitimage to bitmap
*/
BitimageToBitmap(srcbits, 0, 0, srcwidth, srcheight, srcbitmap);
/*
* Copy source rectangle to blt structure
*/
blt->src_rect = *srcrect;
}
/*
* Convert destination bitimage to a bitmap
*/
BitimageToBitmap(dstbits, 0, 0, dstwidth, dstheight, dstbitmap);
/*
* Copy destination rectangle to blt structure
*/
blt->dst_rect = *dstrect;
/*
* Set combination rule in blt structure
*/
blt->comb_rule = rule;
/*
* Is there a clipping mask ?
*/
if(maskbits) {
register Blt_Bitmap *mskbitmap = &blt->msk_bitmap;
/*
* Indicate that there is a mask
*/
blt->blt_flags |= BLT_MASKON;
/*
* Convert mask bitimage to bitmap
*
* NOTE: The clipping mask has the same origin
* as the destination rectangle but can
* be larger in width and height.
*/
BitimageToBitmap(maskbits, dstrect->origin_x, dstrect->origin_y, maskwidth, maskheight, mskbitmap);
}
/*
* No X clips specified ?
*/
if(clipcount == 0) {
/*
* Turn clipping off during this blt
*/
blt->blt_flags &= ~BLT_CLIPON;
/*
* No X clips so blt and run
*/
bitblt(blt);
return;
}
/*
* Perform same blt for each X clip
*/
for (;;) {
/*
* Convert X clip to clipping rectangle
*/
ClipToRect(cliplist, cliprect);
/*
* If destination lies inside of clipping rectangle
* turn off clipping flag during this blt otherwise
* turn it on.
*/
if(InsideBounds(dstrect, cliprect)) {
blt->blt_flags &= ~BLT_CLIPON;
} else {
blt->blt_flags |= BLT_CLIPON;
}
/*
* Lets go do the blt
*/
bitblt(blt);
/*
* Need to blt again ?
*/
if (--clipcount <= 0) {
/*
* No more clips so lets leave
*/
break;
}
/*
* point to next X clip
*/
cliplist++;
}
}