DIRECTORY Basics USING [BITAND, BITOR, BITXOR, LongMult, LongNumber], CGSample USING [Mode, Pointer, Words]; CGSampleImpl: PROGRAM IMPORTS Basics 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: Basics.LongNumber; count _ p.count; IF count=0 THEN RETURN; di _ p.di; dAddr _ p.dLine + di/16; dWord _ dAddr^; di _ di MOD 16; sBase _ p.sBase; sRast _ p.sRast; sx.li _ p.sx; sy.li _ p.sy; sdx.li _ p.sdx; sdy.li _ p.sdy; sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; bi _ p.bi; bw _ p.bw; bLine _ p.bLine; map _ p.map; SELECT mode FROM opaque => DO IF map[sLine[sx.highbits]]<=bLine[bi] THEN dWord _ Basics.BITOR[dWord, mask1[di]] ELSE dWord _ Basics.BITAND[dWord, mask0[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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP; transparent => DO IF map[sLine[sx.highbits]]<=bLine[bi] THEN dWord _ Basics.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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP; invert => DO IF map[sLine[sx.highbits]]<=bLine[bi] THEN dWord _ Basics.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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), 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: Basics.LongNumber; count _ p.count; IF count=0 THEN RETURN; di _ p.di; dAddr _ p.dLine + di/16; dWord _ dAddr^; di _ di MOD 16; sBase _ p.sBase; sRast _ p.sRast; sx.li _ p.sx; sy.li _ p.sy; sdx.li _ p.sdx; sdy.li _ p.sdy; sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; SELECT mode FROM opaque => IF p.flags.function=0 THEN DO IF Basics.BITAND[(sLine+sx.highbits/16)^,mask1[sx.highbits MOD 16]]#0 THEN dWord _ Basics.BITOR[dWord, mask1[di]] ELSE dWord _ Basics.BITAND[dWord, mask0[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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP ELSE DO IF Basics.BITAND[(sLine+sx.highbits/16)^,mask1[sx.highbits MOD 16]]#0 THEN dWord _ Basics.BITAND[dWord, mask0[di]] ELSE dWord _ Basics.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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP; transparent => IF p.flags.function=0 THEN DO IF Basics.BITAND[(sLine+sx.highbits/16)^,mask1[sx.highbits MOD 16]]#0 THEN dWord _ Basics.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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP ELSE DO IF Basics.BITAND[(sLine+sx.highbits/16)^,mask1[sx.highbits MOD 16]]#0 THEN dWord _ Basics.BITAND[dWord, mask0[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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP; invert => DO IF Basics.BITAND[(sLine+sx.highbits/16)^,mask1[sx.highbits MOD 16]]#0 THEN dWord _ Basics.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.highbits#sly THEN sLine _ sBase + Basics.LongMult[(sly _ sy.highbits), sRast]; ENDLOOP; ENDCASE; dAddr^ _ dWord; }; }. æCGSampleImpl.mesa Last edited by Ken Pier, May 12, 1982 6:41 pm Last edited by Paul Rovner, June 8, 1983 11:12 pm Last edited by Doug Wyatt, January 13, 1984 4:44 pm Set up for source Set up for brick and map Fetch source and brick values, and compare Terminate loop? Bump destination position Bump brick position Bump source position Set up for source Terminate loop? Bump destination position Bump source position Terminate loop? Bump destination position Bump source position ÊÒ˜šœ™Jšœ-™-Jšœ1™1Jšœ3™3—J˜šÏk ˜ Jš œœœœœ˜;Jšœ œ˜&J˜—Jšœ˜Jšœ˜Jšœœ ˜#J˜Jšœœœœœœœœ ˜EJ˜Jš œœœ œœ˜$˜J˜GJ˜H—˜J˜GJ˜H—Jšœœœ˜&Jšœœœ˜&J˜šÏnœœœ˜0Jšœœœ˜Jšœœœœ˜Jšœ œœœ˜"Jšœ&œ˜/J˜$J˜Jšœœ œœ˜(Jšœ<œ˜CJ˜Jšœ™J˜!J˜;J˜