-- CGSampleImpl.mesa -- Last edited by Ken Pier, May 12, 1982 6:41 pm -- Last edited by Doug Wyatt, June 29, 1982 5:35 pm DIRECTORY CGSample USING [Mode, Pointer, Words], Inline USING [BITAND, BITOR, BITXOR, LongMult, LongNumber]; CGSampleImpl: PROGRAM IMPORTS Inline EXPORTS CGSample = { OPEN CGSample; Bytes: TYPE = RECORD[PACKED SEQUENCE COMPUTED CARDINAL OF [0..377B]]; Masks: TYPE = ARRAY [0..16) OF WORD; mask1array: Masks _ [ 100000B, 040000B, 020000B, 010000B, 004000B, 002000B, 001000B, 000400B, 000200B, 000100B, 000040B, 000020B, 000010B, 000004B, 000002B, 000001B]; mask0array: Masks _ [ 077777B, 137777B, 157777B, 167777B, 173777B, 175777B, 176777B, 177377B, 177577B, 177677B, 177737B, 177757B, 177767B, 177773B, 177775B, 177776B]; mask1: POINTER TO Masks _ @mask1array; mask0: POINTER TO Masks _ @mask0array; Sample8: PUBLIC PROC[p: Pointer, mode: Mode] = { dAddr, sBase: LONG POINTER; sLine: LONG POINTER TO Bytes; map, bLine: LONG POINTER TO Words; dWord, count, di, bi, bw, sly, sRast: CARDINAL; sx, sy, sdx, sdy: Inline.LongNumber; count _ p.count; IF count=0 THEN RETURN; di _ p.di; dAddr _ p.dLine + di/16; dWord _ dAddr^; di _ di MOD 16; -- Set up for source sBase _ p.sBase; sRast _ p.sRast; sx.li _ p.sx; sy.li _ p.sy; sdx.li _ p.sdx; sdy.li _ p.sdy; sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; -- Set up for brick and map bi _ p.bi; bw _ p.bw; bLine _ p.bLine; map _ p.map; SELECT mode FROM opaque => DO -- Fetch source and brick values, and compare IF map[sLine[sx.high]]<=bLine[bi] THEN dWord _ Inline.BITOR[dWord, mask1[di]] ELSE dWord _ Inline.BITAND[dWord, mask0[di]]; -- Terminate loop? IF (count _ count-1)=0 THEN EXIT; -- Bump destination position IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; -- Bump brick position IF (bi _ bi+1)=bw THEN bi _ 0; -- Bump source position sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; transparent => DO IF map[sLine[sx.high]]<=bLine[bi] THEN dWord _ Inline.BITOR[dWord, mask1[di]]; IF (count _ count-1)=0 THEN EXIT; IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; IF (bi _ bi+1)=bw THEN bi _ 0; sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; invert => DO IF map[sLine[sx.high]]<=bLine[bi] THEN dWord _ Inline.BITXOR[dWord, mask1[di]]; IF (count _ count-1)=0 THEN EXIT; IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; IF (bi _ bi+1)=bw THEN bi _ 0; sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; ENDCASE; dAddr^ _ dWord; }; Sample0: PUBLIC PROC[p: Pointer, mode: Mode] = { dAddr, sBase, sLine: LONG POINTER; dWord, count, di, sly, sRast: CARDINAL; sx, sy, sdx, sdy: Inline.LongNumber; count _ p.count; IF count=0 THEN RETURN; di _ p.di; dAddr _ p.dLine + di/16; dWord _ dAddr^; di _ di MOD 16; -- Set up for source sBase _ p.sBase; sRast _ p.sRast; sx.li _ p.sx; sy.li _ p.sy; sdx.li _ p.sdx; sdy.li _ p.sdy; sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; SELECT mode FROM opaque => DO IF Inline.BITAND[(sLine+sx.high/16)^,mask1[sx.high MOD 16]]#0 THEN dWord _ Inline.BITOR[dWord, mask1[di]] ELSE dWord _ Inline.BITAND[dWord, mask0[di]]; -- Terminate loop? IF (count _ count-1)=0 THEN EXIT; -- Bump destination position IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; -- Bump source position sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; transparent => DO IF Inline.BITAND[(sLine+sx.high/16)^,mask1[sx.high MOD 16]]#0 THEN dWord _ Inline.BITOR[dWord, mask1[di]]; IF (count _ count-1)=0 THEN EXIT; IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; invert => DO IF Inline.BITAND[(sLine+sx.high/16)^,mask1[sx.high MOD 16]]#0 THEN dWord _ Inline.BITXOR[dWord, mask1[di]]; IF (count _ count-1)=0 THEN EXIT; IF (di _ di+1)=16 THEN { dAddr^ _ dWord; dWord _ (dAddr _ dAddr+1)^; di _ 0 }; sx.li _ sx.li + sdx.li; sy.li _ sy.li + sdy.li; IF sy.high#sly THEN sLine _ sBase + Inline.LongMult[(sly _ sy.high), sRast]; ENDLOOP; ENDCASE; dAddr^ _ dWord; }; }. Κ²– "Mesa" style˜IprocšΌΟczœΟk œ žœ"žœžœžœžœ(žœžœžœžœžœžœžœžœžœžœžœžœžœ žœžœηžœžœžœžœΟnœžœžœ-žœžœ žœžœžœžœžœžœ0žœ=žœ žœžœ@žœœŸœ8žœžœ žœ.œžœ žœžœžœžœœžœžœžœœžœžœ=œžœžœ œ8žœ žœ>žœžœžœ žœžœžœžœžœžœžœ=žœžœAžœ žœ>žœžœžœ žœžœžœžœžœžœžœ=žœžœAžœ žœ>žœžœŸœžœžœ4žœžœ"žœ=žœ žœžœ@žœœœžœžœ žœžœžœ#žœžœžœžœžœœžœžœžœœžœžœ=œ8žœ žœ>žœžœžœžœ#žœžœžœžœžœžœžœžœqžœ žœ>žœžœžœžœ#žœžœžœžœžœžœžœžœqžœ žœ>žœžœ˜Ή%—…—Όt