|
|
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: 5297 (0x14b1)
Types: TextFile
Names: »tile.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/tile.c«
#ifndef lint
static char *rcsid_tile_c = "$Header: tile.c,v 10.1 86/11/19 10:44:34 jg Exp $";
#endif lint
/* Copyright 1985 Massachusetts Institute of Technology */
/* tile.c - Perform a raster operation involving a pattern
*
* TileFill Patterns a portion of the screen
* DrawFilled Draw a filled generalized line/polygon/combination
* AlignTile Aligns tile to a given coordinates
*
* Changes and modifications by:
*
* 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"
/*
* Tile area of screen using a mask
*/
/*ARGSUSED*/
TileFill (tile, xoff, yoff, xymask, dstx, dsty, width, height,
clips, clipcount, func, zmask)
register PIXMAP *tile;
register BITMAP *xymask;
register width, height;
int xoff, yoff, dstx, dsty, zmask;
register func;
CLIP *clips;
{
u_short *clipmask = NILMASK;
register BITMAP *bm = (BITMAP *) tile->data;
register u_short *tilepattern;
u_short newtilepattern[TILE_SIZE];
#ifdef TRACE_X
fprintf(stderr, "In TileFill\n");
fflush(stderr);
#endif TRACE_X
/*
* There better be at least one plane
*/
if ((zmask & 1) == 0)
return;
/*
* If pixmap needs to be inverted before being displayed
* remap funtion to reflect this change.
*/
func = SSMap[func | (tile->kind & InvertFlag)];
/*
* Get tile. If pixmap has no associated bitmap then pixmap
* struct contains pointer to constant tile. Otherwise, it
* contains pointer to bitmap which points to the tile.
*/
if (PTYPE(tile) == ConstantPixmap) {
tilepattern = (u_short *) tile->data;
} else {
tilepattern = (u_short *) bm->data;
/*
* Align tile to offset supplied
*/
if ((xoff | yoff) & 0x0F) {
AlignTile(tilepattern, newtilepattern, xoff, yoff);
tilepattern = newtilepattern;
}
}
/*
* Clip xymask and destnation rectangle to minimum size
*/
if(xymask) {
width = MIN (xymask->width, width);
height = MIN (xymask->height, height);
clipmask = (u_short *) xymask->data;
}
/*
* Fill in destination rectangle
*/
FillInRect(dstx, dsty, width, height, &DstRect);
/*
* Tile area of screen using a mask
*/
CopyBits (tilepattern, NIL, NIL, NILRECT,
(u_short *) pbm.data, pbm.width, pbm.height, &DstRect,
clipmask, width, height, MAKE_TILE_RULE(func),
clipcount, clips);
}
/*
* Draw a filled generalized line/polygon/combination
*/
/*ARGSUSED*/
DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff,
clips, clipcount, func, zmask)
Vertex *verts;
register PIXMAP *tile;
int vertcount, xbase, ybase, srcpix, xoff, yoff, clipcount, zmask;
int func;
CLIP *clips;
{
BITMAP *xymask;
Vertex *newverts;
int newvertcount;
#ifdef TRACE_X
fprintf(stderr, "In DrawFilled\n");
fflush(stderr);
#endif TRACE_X
/*
* Limit draw operation to one plane
*/
if ((zmask & 1) == 0 || vertcount < 2)
return;
/*
* Convert path list to absolute line segments
*/
if(PathListConverter(verts, vertcount, xbase, ybase, &newverts,
&newvertcount, FILL_PATH_LIST) == NULL) {
DeviceError("DrawCurve failure in PathListConverter()\n");
return;
}
/*
* Make mask for polygon fill
*/
if((xymask = MakeMask(newverts, newvertcount)) == NULL) {
DeviceError("DrawFilled failure in MakeMask()\n");
return;
}
/*
* Fill the polygon
*/
if(tile) {
/*
* Tile fill the polygon using the mask
*/
TileFill(tile, xoff, yoff, xymask, 0, 0, xymask->width,
xymask->height, clips, clipcount, func, zmask);
} else {
/*
* Pix fill the polygon using the mask
*/
PixFill(srcpix, xymask, 0, 0, xymask->width, xymask->height,
clips, clipcount, func, zmask);
}
/*
* Free mask BITMAP and space used by converted vertex list
*/
FreeBitmap(xymask);
free((caddr_t)newverts);
}
/*
* Align tile to offset provided.
* Note: tile is in IBM bit order not VAX
*/
static
AlignTile(src, dst, xoff, yoff)
register u_short *src, *dst;
register int xoff, yoff;
{
register int i;
register int shift;
u_short mask;
#ifdef TRACE_X
fprintf(stderr, "In Align_Tile\n");
fflush(stderr);
#endif TRACE_X
xoff &= 0x0F;
yoff = (TILE_HEIGHT - (yoff & 0x0F)) & 0x0F;
shift = (TILE_WIDTH - xoff) & 0x0F;
mask = (1 << xoff) - 1;
for (i = 0; i < TILE_HEIGHT; i++) {
dst[i] = (src[yoff] >> xoff) | ((src[yoff] & mask) << shift);
yoff++;
yoff &= 0x0F;
}
}