-- MesaBrickBLTImpl.mesa
-- Last changed by Ken Pier,          March 12, 1982  4:05 PM

DIRECTORY
  MesaBrickBLT,
  MesaBandFormat,
  Inline USING [HighHalf, LowHalf],
  BitBltDefs;

MesaBrickBLTImpl: PROGRAM
IMPORTS  Inline, BitBltDefs
EXPORTS MesaBrickBLT = {
OPEN BB: BitBltDefs, BFormat: MesaBandFormat, MesaBrickBLT;

bitsPerWord: CARDINAL = 16;

--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.

InitializeBrickBLT: PUBLIC PROC [ptr: POINTER TO BB.BBTableSpace] RETURNS [bbptr: BB.BBptr] = {

  bbptr ← BB.AlignedBBTable[ptr];
  bbptr↑ ← [
    ptrs: short,
    pad: 0,
    sourcealt: FALSE, 
    destalt:  FALSE, 
    sourcetype:  block,
    function:  replace,
    unused: 0, --REALLY HOLDS HIGH HALF OF ALTERNATE BANK POINTER!!
    dbca: NIL,
    dbmr:  0, -- destination raster width(in words)
    dlx:  0, -- destination left x
    dty:  0, -- destination top y
    dw:   0, -- block width in bits
    dh:   0, -- block height in scanlines
    sbca: NIL,
    sbmr:   0, -- source raster width(in words)
    slx:    0, -- source left x
    sty:    0, -- source top y
    gray0:  0, -- four words of "gray"
    gray1:  0,
    gray2:  0,
    gray3:  0, 
    slbca:  NIL, -- IGNORED ON ALTO!!
    dlbca:  NIL]; -- IGNORED ON ALTO!!
  
  };--InitializeBrickBLT

BrickBLT:PUBLIC PROC [bbptr: BB.BBptr, tBrick: BFormat.TBrickRef,
		destLine: LONG POINTER, hx, hy: CARDINAL,
	        xmin,xmax: CARDINAL,
		lineBuffer: POINTER] = {
  L: CARDINAL ← tBrick.L;
  brickIndex: CARDINAL ← L*hy; --start of line in brick to replicate
  w, wmax: CARDINAL;
--move one line from the tBrick into the line buffer
  bbptr↑ ← [
    ptrs: short,
    pad: 0,
    sourcealt: FALSE, 
    destalt:  FALSE, 
    sourcetype:  block,
    function:  replace,
    unused: 0, --REALLY HOLDS HIGH HALF OF ALTERNATE BANK POINTER!!
    dbca: lineBuffer,
    dbmr:  0, -- destination raster width(in words)
    dlx:  0, -- destination left x
    dty:  0, -- destination top y
    dw:   L, -- block width in bits
    dh:   1, -- block height in scanlines
    sbca: @tBrick.brick+(brickIndex/bitsPerWord)+1,
    sbmr:   0, -- source raster width(in words)
    slx:    brickIndex MOD bitsPerWord, -- source left x
    sty:    0 -- source top y
    ];
  BB.BITBLT[bbptr]; --blit the correct brick line into the line buffer
--now replicate the brick line of length L to form a scan line, doubling
--the replication each time
  bbptr↑ ← [
    dbca: lineBuffer,
    dbmr:  0, -- destination raster width(in words)
    dty:  0, -- destination top y
    dh:   1, -- block height in scanlines
    sbca: lineBuffer,
    sbmr:   0, -- source raster width(in words)
    slx:    0, -- source left x
    sty:    0 -- source top y
    ];--all constants for this part
  wmax ← hx+xmax-xmin; --max of bits needed
  w ← L; --bits started with
  UNTIL w >= wmax/2 DO
    bbptr.dlx ← bbptr.dw ← w;
    BB.BITBLT[bbptr]; --double the contents
    w ← w+w;
    ENDLOOP;
  --last part
  bbptr.dlx ← w;
  bbptr.dw ← wmax-w;
  BB.BITBLT[bbptr];
--BLT just enough to fill scanline
-- now BLT the buffer into the bitmap
  bbptr↑ ← [
    ptrs: short,
    pad: 0,
    sourcealt: FALSE,
    destalt:  TRUE,
    sourcetype:  block,
    function:  replace,
    unused: Inline.HighHalf[destLine], --NOT REALLY UNUSED
    dbca: Inline.LowHalf[destLine],
    dbmr:  0, -- destination raster width unused for height=1
    dlx:  xmin, -- destination left x
    dty:  0, -- destination top y
    dw:   xmax-xmin, -- block width in bits
    dh:   1, -- block height in scanlines
    sbca: lineBuffer+hx/bitsPerWord,
    sbmr:   0, -- source raster width unused for height=1
    slx:    hx MOD bitsPerWord, -- source left x
    sty:    0 -- source top y
    ];
  BB.BITBLT[bbptr];

  };--BrickBLT

}.

LOG

March 11, 1982, changed linebuffers to SHORT POINTERS