-- CGScreenImpl.mesa -- Last changed by Doug Wyatt, August 23, 1982 4:15 pm DIRECTORY CGScreen USING [], BitBlt USING [BBTableSpace, BBptr, AlignedBBTable, BITBLT], UserTerminal USING [GetBitBltTable, GetState, SetState, screenHeight, State]; CGScreenImpl: CEDAR PROGRAM IMPORTS BitBlt, UserTerminal EXPORTS CGScreen = { screenbase: LONG POINTER _ NIL; screenraster,screenheight: CARDINAL _ 0; screenx,screeny: CARDINAL = 0; -- In Pilot, we own the whole screen Bits: PUBLIC PROC RETURNS[base: LONG POINTER, raster,height: CARDINAL] = { RETURN[screenbase,screenraster,screenheight]; }; Origin: PUBLIC PROC RETURNS[x,y: CARDINAL] = { RETURN[x: screenx, y: screeny] }; MouseToWorld: PUBLIC PROC[mx,my: INTEGER] RETURNS[wx,wy: INTEGER] = { RETURN[wx: mx-screenx, wy: (screenheight+screeny)-my]; }; InitScreen: PROC = TRUSTED { bbs: BitBlt.BBTableSpace; bb: BitBlt.BBptr _ BitBlt.AlignedBBTable[@bbs]; bpl,lines: CARDINAL; h: CARDINAL = 4; gray: ARRAY[0..h) OF CARDINAL _ [42104B,42104B,10421B,10421B]; oldState: UserTerminal.State _ UserTerminal.GetState[]; IF oldState=disconnected THEN [] _ UserTerminal.SetState[off]; -- allocate bitmap if necessary bb^ _ UserTerminal.GetBitBltTable[]; bpl _ bb.dstBpl; lines _ UserTerminal.screenHeight; IF (bpl MOD 16)#0 THEN ERROR; IF bb.dst.bit#0 THEN ERROR; screenbase _ bb.dst.word; screenraster _ bpl/16; screenheight _ lines; IF oldState#on THEN { bb.src _ [word: @gray, bit: 0]; bb.srcDesc.gray _ [yOffset: 0, widthMinusOne: 0, heightMinusOne: h-1]; bb.width _ bpl; bb.height _ lines; bb.flags _ [disjoint: TRUE, gray: TRUE]; BitBlt.BITBLT[bb]; -- make the screen gray [] _ UserTerminal.SetState[on]; -- display it }; }; InitScreen[]; }.