BSD 4_3_Tahoe development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 19 Nov 1986 00:40:56 +0000 (16:40 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 19 Nov 1986 00:40:56 +0000 (16:40 -0800)
Work on file usr/src/new/X/libibm/libsrc/copybits.c

Synthesized-from: CSRG/cd2/4.3tahoe

usr/src/new/X/libibm/libsrc/copybits.c [new file with mode: 0644]

diff --git a/usr/src/new/X/libibm/libsrc/copybits.c b/usr/src/new/X/libibm/libsrc/copybits.c
new file mode 100644 (file)
index 0000000..dc6f48c
--- /dev/null
@@ -0,0 +1,208 @@
+#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++;
+       }
+}