-- color screen drawing initialization module of silicon (pretty picture) program
-- last modified by E. McCreight, December 17, 1982 12:20 PM
DIRECTORY
StreamDefs,
InlineDefs,
IODefs,
AltoDefs,
DirectoryDefs,
AltoFileDefs,
StringDefs,
multiGraphicsDefs,
ProcessDefs,
ppdddefs,ppddefs,
ppdefs;
ppdrawCommon: PROGRAM
IMPORTS
ppdefs, ppddefs, StreamDefs, InlineDefs, multiGraphicsDefs, ProcessDefs,
DirectoryDefs, ppdddefs,StringDefs
EXPORTS ppdefs, ppddefs =
BEGIN
OPEN ppdefs, ppddefs, ppdddefs,StreamDefs, StringDefs, InlineDefs, multiGraphicsDefs,
DirectoryDefs, IODefs;
fp: AltoFileDefs.FP;
fHandle: DiskHandle;
i: INTEGER;
CTName: STRING ← [50];
colorsttt: ARRAY [0..48) OF CARDINAL;
colorHandle: POINTER;
markPnt, markDPnt, selMarkPnt: PUBLIC Point ← [0, 0];
cursorBox: PUBLIC Bitmap;
insideCBox: PUBLIC Bitmap;
cursorSize: INTEGER = 16;
cursNwds: CARDINAL = (cursorSize + 3)/4;
curAr: ARRAY [0..cursorSize*cursNwds) OF CARDINAL ← ALL[0];
curArF: ARRAY [0..cursorSize*cursNwds) OF CARDINAL ← ALL[0];
curArI: ARRAY [0..cursorSize*cursNwds) OF CARDINAL ← ALL[0];
initAll: PUBLIC PROCEDURE =
BEGIN
i, j, k: CARDINAL;
q: INTEGER;
lv:level;
fHandle ← NewByteStream["chipColors.name", Read];
CTName.length ← 0;
k ← fHandle.get[fHandle];
UNTIL k = 15B DO
AppendChar[CTName, LOOPHOLE[k]]; k ← fHandle.get[fHandle]; ENDLOOP;
fHandle.destroy[fHandle];
fHandle ← NewWordStream[CTName, Read];
cTabCnt ← fHandle.get[fHandle];
FOR k IN [0..cTabCnt) DO
FOR i IN [0..49) DO colorTabs[k][i] ← fHandle.get[fHandle]; ENDLOOP;
ENDLOOP;
fHandle.destroy[fHandle];
currentCTab ← 0;
IF DirectoryLookup[@fp, "chipPatterns.color", FALSE] THEN
BEGIN
fHandle ← NewWordStream["chipPatterns.color", Read];
k←fHandle.get[fHandle]; -- get table count
FOR i IN [0..MIN[k,colPatNum]) DO
colPatternBits[i]←fHandle.get[fHandle];
FOR lv IN level DO
colPatternTabs[i][lv]←fHandle.get[fHandle];
ENDLOOP;
ENDLOOP;
fHandle.destroy[fHandle];
IF colPatternBits[0]#0 THEN orLtab←colPatternTabs[0];
END
ELSE {colPatternBits[0]←1;colPatternTabs[0]←orLtab;};
[colorHandle] ← TurnOnColor[bitsPerPixel: 4, portraitMode: csHor,
initColor: 0];
[] ← TurnOnGraphics[];
restoreColors[];
cursorBox ← [
bank: 0, nWords: cursNwds, nBits: cursorSize, nLines: cursorSize,
nBitsPerPixel: 4, portraitMode: csHor, scaleFactor: 1,
bits: LOOPHOLE[@curAr]];
insideCBox ← [
bank: 0, nWords: cursNwds, nBits: cursorSize, nLines: cursorSize,
nBitsPerPixel: 4, portraitMode: csHor, scaleFactor: 1,
bits: LOOPHOLE[@curArI]];
SetGrayMap[1, 42104B, 10421B, 42104B, 10421B]; -- set green bit pattern
SetGrayMap[2, 104210B, 21042B, 0, 0]; -- set blue bit pattern
SetGrayMap[4, 104210B, 42104B, 21042B, 10421B]; -- set red bit pattern
SetGrayMap[10, 177777B, 177777B, 177777B, 177777B]; --set black bit pattern
SetGrayMap[14, 21042B, 0B, 21042B, 0B]; --set yellow bit pattern
SetGrayMap[8, 42104B, 167356B, 42104B, 0B]; --set ovg bit pattern
SetGrayMap[11, 104210B, 104210B, 21042B, 21042B]; -- set metal2 pattern
SetGrayMap[13, 42104B, 0B, 0B, 0B]; --set nwell bit pattern
j ← 177600B;
k ← 100000B;
FOR i IN [0..15] DO
curse: POINTER TO ARRAY [0..15] OF CARDINAL = LOOPHOLE[431B];
-- make the B/W cursor all white for now
curse↑[i] ← 0;
ENDLOOP;
FOR q IN [0..cursorSize) DO
setColorCursorBits[y: q, w1: bwCurs[q], w2: 0, bm: @cursorBox, color: 15];
setColorCursorBits[y: q, w1: bwCursI[q], w2: 0, bm: @insideCBox, color: 15];
ENDLOOP;
CursorTrack[FALSE];
initkbd[@bwCurs, @cursorBox];
initColors[];
cellList ← NIL;
cellStack ← NIL;
unDelPnt ← NIL;
unDelGrpCnt ← unDelItemCnt ← 0;
initRects[];
ProcessDefs.Detach[FORK updateColor[]];
setCscale[10];
ProcessDefs.Detach[FORK updateBW[]];
setBWscale[8];
doParmInit[];
END;
setColorCursorBits: PROCEDURE [
y: CARDINAL, w1, w2: CARDINAL, bm: POINTER TO Bitmap,
color: Color] =
BEGIN
i: CARDINAL;
FOR i IN [0..cursorSize) DO
IF BITAND[w1, 100000B] # 0 THEN PutColorPoint[i, y, color, bm];
IF i = 16 THEN w1 ← w2 ELSE w1 ← BITSHIFT[w1, 1];
ENDLOOP;
END;
writeCTab: PUBLIC PROCEDURE =
BEGIN
bb: BOOLEAN ← FALSE;
i, j: CARDINAL;
lv:level;
IF NOT anyCTChanges THEN RETURN;
anyCTChanges ← FALSE;
WHILE NOT bb DO strInc[CTName]; bb ← gentlyOpenFile[CTName]; ENDLOOP;
fHandle.put[fHandle, cTabCnt];
FOR i IN [0..cTabCnt) DO
FOR j IN [0..49) DO fHandle.put[fHandle, colorTabs[i][j]]; ENDLOOP; ENDLOOP;
fHandle.destroy[fHandle];
fHandle ← NewByteStream["chipColors.name", Write + Append];
FOR i IN [0..CTName.length) DO fHandle.put[fHandle, CTName[i]]; ENDLOOP;
fHandle.put[fHandle, 15B];
fHandle.destroy[fHandle];
fHandle ← NewWordStream["chipPatterns.color", Write + Append];
fHandle.put[fHandle, colPatNum];
FOR i IN [0..colPatNum) DO
fHandle.put[fHandle, colPatternBits[i]];
FOR lv IN level DO
fHandle.put[fHandle, colPatternTabs[i][lv]];
ENDLOOP;
ENDLOOP;
fHandle.destroy[fHandle];
END;
strInc: PROCEDURE [s: STRING] =
BEGIN
i: CARDINAL ← 0;
IF s.length = 0 THEN RETURN;
WHILE i < s.length AND s[i] # '. DO i ← i + 1; ENDLOOP;
i ← i - 1;
cInc[s, i];
END;
cInc: PROCEDURE [s: STRING, i: CARDINAL] =
BEGIN
IF s[i] IN ['0..'8] THEN s[i] ← s[i] + 1
ELSE
IF s[i] = '9 THEN BEGIN s[i] ← '0; cInc[s, i - 1]; END
ELSE
BEGIN
s.length ← s.length + 1;
FOR j: CARDINAL DECREASING IN [i + 2..s.length) DO
s[j] ← s[j - 1]; ENDLOOP;
s[i + 1] ← '1;
END;
END;
gentlyOpenFile: PROCEDURE [fname: STRING] RETURNS [BOOLEAN] =
BEGIN
IF DirectoryLookup[@fp, fname, FALSE] THEN RETURN[FALSE];
fHandle ← NewWordStream[fname, Write + Append];
RETURN[TRUE];
END;
setGlev: PUBLIC PROCEDURE [c, cc, v: INTEGER] =
BEGIN colorTabs[currentCTab][c*3 + cc + 1] ← v; restoreColors[]; END;
invertColors: PUBLIC PROCEDURE =
BEGIN
FOR i IN [0..48) DO
colorsttt[i] ← 255 - colorTabs[currentCTab][i + 1]; ENDLOOP;
SetColorTable[LOOPHOLE[@colorsttt]];
END;
restoreColors: PUBLIC PROCEDURE =
BEGIN
FOR i IN [0..48) DO colorsttt[i] ← colorTabs[currentCTab][i + 1]; ENDLOOP;
SetColorTable[LOOPHOLE[@colorsttt]];
END;
setColorTable: PUBLIC PROCEDURE [a: CARDINAL] =
BEGIN currentCTab ← a; restoreColors[]; END;
getCurrenColor: PUBLIC PROCEDURE [c, cc: INTEGER] RETURNS [INTEGER] =
BEGIN RETURN[colorTabs[currentCTab][c*3 + cc + 1]]; END;
deScaledCursor: PUBLIC PROCEDURE [x, y: INTEGER]
RETURNS [BOOLEAN, INTEGER, INTEGER] =
BEGIN
IF x > xColorMax THEN
BEGIN
IF y <= bwFeedTop THEN
RETURN[
TRUE, ((x - xColorMax)*bwScaleD)/bwScaleN - bwxoff,
(y*bwScaleD)/bwScaleN - bwyoff]
ELSE RETURN[FALSE, x - xColorMax, y - bwFeedTop];
END
ELSE
BEGIN
RETURN[TRUE, (x*cScaleD)/cScaleN - cxoff, (y*cScaleD)/cScaleN - cyoff];
END;
END;
END.