-- CGFullSampleImpl.mesa -- Last edited by Ken Pier, July 13, 1982 3:41 pm -- Last edited by Doug Wyatt, May 28, 1982 10:16 am DIRECTORY CGFullSample USING [MapArray, Pointer], Inline USING [BITAND, BITOR, BITXOR, LongMult, LongNumber]; CGFullSampleImpl: PROGRAM IMPORTS Inline EXPORTS CGFullSample = { Line1: TYPE = RECORD[PACKED SEQUENCE COMPUTED NAT OF [0..1]]; Line2: TYPE = RECORD[PACKED SEQUENCE COMPUTED NAT OF [0..3]]; Line4: TYPE = RECORD[PACKED SEQUENCE COMPUTED NAT OF [0..17B]]; Line8: TYPE = RECORD[PACKED SEQUENCE COMPUTED NAT OF [0..377B]]; bit1: ARRAY [0..16) OF WORD _ [ 100000B, 040000B, 020000B, 010000B, 004000B, 002000B, 001000B, 000400B, 000200B, 000100B, 000040B, 000020B, 000010B, 000004B, 000002B, 000001B]; bit0: ARRAY [0..16) OF WORD _ [ 077777B, 137777B, 157777B, 167777B, 173777B, 175777B, 176777B, 177377B, 177577B, 177677B, 177737B, 177757B, 177767B, 177773B, 177775B, 177776B]; SAMPLE: PUBLIC PROC[p: CGFullSample.Pointer] = { mFetch, bFetch, sFetch: BOOLEAN _ FALSE; dWord, mWord: LONG POINTER TO WORD; di, mi: [0..16); bLine, sBase, sLine: LONG POINTER; map: LONG POINTER TO CGFullSample.MapArray; bValue, sValue: CARDINAL; size, count, bi, bw, sw, sh, sox, soy, sly, sRast: CARDINAL; sx, sy, sdx, sdy: Inline.LongNumber; fn0, fn1: [0..4); count _ p.count; IF count=0 THEN RETURN; fn0 _ p.function/4; fn1 _ p.function MOD 4; size _ p.size; dWord _ p.dLine + p.di/16; di _ p.di MOD 16; -- Set up for mask IF p.mConst THEN NULL ELSE { mWord _ p.mLine + p.mi/16; mi _ p.mi MOD 16; mFetch _ TRUE }; -- Set up for brick IF p.bConst THEN bValue _ p.bValue ELSE { bi _ p.bi; bw _ p.bw; bLine _ p.bLine; bFetch _ TRUE }; -- Set up for map IF p.useMap THEN map _ p.map ELSE map _ NIL; -- Set up for source IF p.sConst THEN { sValue _ p.sValue; IF map#NIL THEN sValue _ map[sValue] } ELSE { sBase _ p.sBase; sRast _ p.sRast; sw _ p.sw; sh _ p.sh; sox _ p.sox; soy _ p.soy; sx.li _ p.sx; sy.li _ p.sy; sdx.li _ p.sdx; sdy.li _ p.sdy; sly _ LAST[CARDINAL]; sFetch _ TRUE }; -- maybe should test for sdx.high IN(-sw..sw), etc. -- The sampling loop DO -- Test mask value IF mFetch=FALSE OR Inline.BITAND[mWord^,bit1[mi]]#0 THEN { -- Fetch source value IF sFetch THEN { IF sy.high#sly THEN { sly _ sy.high; sLine _ sBase + Inline.LongMult[sly+soy, sRast] }; SELECT size FROM 8 => sValue _ LOOPHOLE[sLine,LONG POINTER TO Line8][sx.high+sox]; 1 => sValue _ LOOPHOLE[sLine,LONG POINTER TO Line1][sx.high+sox]; ENDCASE => ERROR; -- other sizes not implemented yet IF map#NIL THEN sValue _ map[sValue]; }; -- Fetch brick value IF bFetch THEN { SELECT size FROM 8 => bValue _ LOOPHOLE[bLine,LONG POINTER TO Line8][bi]; 1 => bValue _ LOOPHOLE[bLine,LONG POINTER TO Line1][bi]; ENDCASE => ERROR; }; -- Compare SELECT (IF sValue>bValue THEN fn1 ELSE fn0) FROM 0 => dWord^ _ Inline.BITAND[dWord^, bit0[di]]; --write zero bit 1 => NULL; 2 => dWord^ _ Inline.BITXOR[dWord^, bit1[di]]; --complement bit 3 => dWord^ _ Inline.BITOR[dWord^, bit1[di]]; --write one bit ENDCASE => ERROR; }; -- Terminate loop? IF (count _ count - 1)=0 THEN EXIT; -- Bump destination position di _ (di+1) MOD 16; IF di=0 THEN dWord _ dWord+1; -- Bump mask position IF mFetch THEN { mi _ (mi+1) MOD 16; IF mi=0 THEN mWord _ mWord+1 }; -- Bump brick position IF bFetch THEN { bi _ bi+1; IF bi=bw THEN bi _ 0 }; -- Bump source position IF sFetch THEN { sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sx.high>=sw THEN sx.high _ sx.high - sw ELSE IF sx.high<0 THEN sx.high _ sx.high + sw; IF sy.high>=sh THEN sy.high _ sy.high - sh ELSE IF sy.high<0 THEN sy.high _ sy.high + sh; }; ENDLOOP; }; }. Êÿ– "Mesa" style˜IprocšâÏc5œ5œÏk œžœžœžœžœžœ,žœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœžœÑknpœžœžœ8žœžœžœžœžœžœ,žœžœ žœžœžœ*žœ7žœQžœ žœžœ)žœ:žœœžœ žœžœžœ(žœžœœžœ žœžœ3žœœžœ žœ žœžœœžœ žœžœžœžœžœ£žœžœ žœ4œœžœœžœžœžœžœžœ œžœžœ žœ žœMžœžœžœžœžœžœ.žœžœžœžœ žœžœ#œžœžœžœ(œžœžœ žœžœžœžœžœžœ%žœžœžœžœžœžœ œžœžœžœžœžœžœ3žœžœCžœ.žœžœœžœžœžœœžœžœžœœžœžœžœžœžœœžœžœžœžœœžœžœ?žœ žœžœžœ žœžœ žœžœžœ žœ&žœ ˜ú—…—|