-- CGBrickBLTImpl.mesa
-- Last changed by Ken Pier, 30-Mar-82 14:46:36
DIRECTORY
CGBrickBLT,
CGBandFormat,
BitBlt;
CGBrickBLTImpl: PROGRAM
IMPORTS BitBlt
EXPORTS CGBrickBLT = {
OPEN BB: BitBlt, BFormat: CGBandFormat, CGBrickBLT;
--InitializeBrickBLT is called with a client BBTableSpace.
--Procedure makes bbtable and fills in constant values for blitting
--scanline buffer into band buffer. Clients will pass this bbtable
--to other routines for filling and blitting.
bitsPerWord: CARDINAL = 16;
InitializeBrickBLT: PUBLIC PROC [ptr: POINTER TO BB.BBTableSpace] RETURNS [bbptr: BB.BBptr] = {
bbf: BB.BitBltFlags = [
direction: forward,
disjoint: TRUE,
disjointItems: FALSE,
gray: FALSE,
srcFunc: null,
dstFunc: null,
reserved: 0];
nullBitAddress: BB.BitAddress ← [word: NIL, reserved: 0, bit: 0];
bbptr ← BB.AlignedBBTable[ptr];
bbptr↑ ← [
dst: nullBitAddress,
dstBpl: 0,
src: nullBitAddress,
srcDesc: [srcBpl[0]],
width: 0,
height: 1,
flags: bbf,
reserved: 0];
};--InitializeBrickBLT
BrickBLT:PUBLIC PROC [bbptr: BB.BBptr, tBrick: BFormat.TBrickRef,
destLine: LONG POINTER, hx, hy: CARDINAL,
xmin,xmax: CARDINAL,
lineBuffer: LONG POINTER] = {
w, wmax: CARDINAL;
L: CARDINAL ← tBrick.L;
brickIndex: CARDINAL ← L*hy;
--put a line from the tBrick into the line buffer
bbptr↑ ← [
dst: [word: lineBuffer, reserved: , bit: 0],
dstBpl: 0,
src: [word: @tBrick.brick+(brickIndex/bitsPerWord)+1, reserved: , bit: brickIndex MOD bitsPerWord],
srcDesc: [srcBpl[0]],
width: L,
height: 1];
BB.BITBLT[bbptr];
--now replicate the brick line of length L to form a scan line,
--doubling the replication length each time thru the loop
bbptr.src ← [word: lineBuffer, bit: 0];
wmax ← hx+xmax-xmin; --max number of bits needed
w ← L; --start with L bits in lineBuffer
UNTIL w >= wmax/2 DO
bbptr.dst ← [word: lineBuffer+(w/bitsPerWord), reserved: , bit: w MOD bitsPerWord];
bbptr.width ← w;
BB.BITBLT[bbptr];
w ← w+w;
ENDLOOP;
bbptr.dst ← [word: lineBuffer+(w/bitsPerWord), reserved: , bit: w MOD bitsPerWord];
bbptr.width ← wmax-w;
BB.BITBLT[bbptr];
--now BLT the lineBuffer into the bitmap
bbptr.dst.word ← destLine+xmin/16;
bbptr.dst.bit ← xmin MOD 16;
bbptr.src.word ← lineBuffer+hx/bitsPerWord;
bbptr.src.bit ← hx MOD bitsPerWord;
bbptr.width ← xmax-xmin;
BB.BITBLT[bbptr];
};--BrickBLT
}.--CGBrickBLTImpl
LOG
--created 2/3/82 by Pier
--changed BrickBLT to use BITBLT to build scanlines