Copyright (C) 1994, Digital Equipment Corp.
by Steve Glassman, Mark Manasse and Greg Nelson
<*PRAGMA LL*>
MODULE ScrnPaintOp;
IMPORT TrestleComm, Word;
REVEAL T = Public BRANDED OBJECT END; Private = BRANDED OBJECT END;
PROCEDURE ConstructPlanewiseOp(
pwo: PlaneWiseOracle;
READONLY bitOps: ARRAY OF BitOp): T
RAISES {Failure, TrestleComm.Failure} =
VAR
res := pwo.transparent(); temp: T;
mask := ARRAY [0..31] OF BOOLEAN {FALSE, ..};
allones := Word.Minus(Word.Shift(1, NUMBER(bitOps)), 1);
zero := pwo.opaque(0);
one := pwo.opaque(allones);
trans := res;
swap := pwo.swap(0,allones);
BEGIN
FOR i := 0 TO LAST(bitOps) DO
CASE bitOps[i] OF
BitOp.Zero => temp := zero
| BitOp.And => temp := pwo.bgfg(zero, trans)
| BitOp.NotAnd => temp := pwo.bgfg(zero,swap)
| BitOp.Src => temp := pwo.bgfg(zero,one)
| BitOp.AndNot => temp := pwo.bgfg(trans, zero)
| BitOp.Dest => temp := trans
| BitOp.Xor => temp := pwo.bgfg(trans, swap)
| BitOp.Or => temp := pwo.bgfg(trans,one)
| BitOp.Nor => temp := pwo.bgfg(swap, zero)
| BitOp.Equal => temp := pwo.bgfg(swap, trans)
| BitOp.Invert => temp := swap
| BitOp.NotOr => temp := pwo.bgfg(swap,one)
| BitOp.NotSrc => temp := pwo.bgfg(one,zero)
| BitOp.OrNot => temp := pwo.bgfg(one,trans)
| BitOp.Nand => temp := pwo.bgfg(one,swap)
| BitOp.One => temp := one
END;
IF res = trans THEN
res := temp
ELSIF temp # trans THEN
res := pwo.planewise(SUBARRAY(mask, 0, NUMBER(bitOps)), res, temp)
END;
mask[i] := TRUE
END;
RETURN res
END ConstructPlanewiseOp;
BEGIN END ScrnPaintOp.