(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* by Steve Glassman, Mark Manasse and Greg Nelson *) (* Last modified on Mon Feb 24 13:58:08 PST 1992 by muller *) (* modified on Wed Sep 11 15:24:17 PDT 1991 by msm *) <*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.