-- BltImpl.mesa -- Last changed by Doug Wyatt, September 30, 1980 3:22 PM DIRECTORY Blt, Memory USING [mds, long], BitBltDefs USING [BBptr, BBTableSpace, AlignedBBTable, BITBLT], InlineDefs USING [HighHalf, LowHalf]; BltImpl: PROGRAM IMPORTS Memory,BitBltDefs,InlineDefs EXPORTS Blt SHARES Blt = { OPEN Blt; mds: MDSZone = Memory.mds; New: PUBLIC PROCEDURE[base: LONG POINTER, raster: CARDINAL] RETURNS[Handle] = { d: Handle=mds.NEW[Data _ [ bbt: NIL, grays: ALL[0], sdx: 0, sdy: 0, space: ALL[0] ]]; bbt: BBptr=(d.bbt_BitBltDefs.AlignedBBTable[@d.space]); bbt^ _ [ ptrs: IF Memory.long THEN long ELSE short, pad: 0, destalt: FALSE, sourcealt: FALSE, unused: 0, sourcetype: gray, function: replace, dw: 0, dh: 0, dlx: 0, dty: 0, slx: 0, sty: 0, dbca: NIL, sbca: NIL, dbmr: 0, sbmr: 0, gray0: 0, gray1: 0, gray2: 0, gray3: 0, dlbca: NIL, slbca: NIL ]; IF Memory.long THEN bbt.dlbca_base ELSE { bh: CARDINAL=InlineDefs.HighHalf[base]; bl: POINTER=InlineDefs.LowHalf[base]; bbt.dbca_bl; IF bh#0 THEN { bbt.destalt_TRUE; bbt.unused_bh }; }; bbt.dbmr_raster; RETURN[d]; }; Source: PUBLIC PROC[d: Handle, base: LONG POINTER, raster: CARDINAL] = { bbt: BBptr=d.bbt; IF Memory.long THEN bbt.slbca_base ELSE { bh: CARDINAL=InlineDefs.HighHalf[base]; bl: POINTER=InlineDefs.LowHalf[base]; bbt.sbca_bl; IF bh#0 THEN { bbt.sourcealt_TRUE; IF bbt.unused=0 THEN bbt.unused_bh ELSE IF bbt.unused#bh THEN ERROR; }; }; bbt.sbmr_raster; }; Rect: PUBLIC PROCEDURE[d: Handle] = { bbt: BBptr=d.bbt; IF bbt.dw>0 AND bbt.dh>0 THEN { y: CARDINAL=bbt.dty; IF bbt.sourcetype#gray THEN { bbt.slx_bbt.dlx-d.sdx; bbt.sty_y-d.sdy }; bbt.gray0_d.grays[y MOD 4]; IF bbt.dh>1 THEN { bbt.gray1_d.grays[(y+1) MOD 4]; bbt.gray2_d.grays[(y+2) MOD 4]; bbt.gray3_d.grays[(y+3) MOD 4]; }; BitBltDefs.BITBLT[bbt]; }; }; CFree: PUBLIC PROCEDURE[d: Handle] = { mds.FREE[@d]; }; }.(670)