<> <> <> <> <<>> DIRECTORY CDColors, CDPrivate, CD; <<-- chipndale interface defining low layer color handling. >> <<-- (semi-public) >> CDColorsImpl: CEDAR PROGRAM EXPORTS CDColors = BEGIN DisplayType: TYPE = CDColors.DisplayType; <<-- {bw, bit4, bit8}; >> DisplayMode: TYPE = CDColors.DisplayMode; <<-- {normal, back, grey}; >> Brick: TYPE = CDColors.Brick; -- ARRAY [0..4) OF CARDINAL; ColorTable: TYPE = CDColors.ColorTable; <<-- ARRAY CD.Layer OF REF Brick; >> ColorTableSet: TYPE = CDColors.ColorTableSet; <<-- ARRAY DisplayMode OF REF ColorTable;>> ColorDefinition: TYPE = CDColors.ColorDefinition; <<-- ARRAY DisplayType OF REF ColorTableSet;>> globalColors: PUBLIC REF ColorDefinition _ NEW[ColorDefinition_ALL[NIL]]; emptyBrick: REF Brick = NEW[Brick_ALL[0]]; fullBrick: REF Brick = NEW[Brick_ALL[LAST[CARDINAL]]]; DefineColor: PUBLIC PROC[ lev: CD.Layer, brick: REF Brick _ NIL, -- do no more change the values display: DisplayType _ bw, mode: DisplayMode _ normal, table: REF ColorDefinition _ NIL --NIL uses the global table ] = <<--Defining a brick with mode normal also clears the back and the grey brick.>> <<--A NIL brick makes a reasonable default.>> <<--The procedure may exchange bricks if they have the same values.>> BEGIN dTable: REF ColorTableSet; IF table=NIL THEN table _ globalColors; IF brick=NIL THEN brick _ fullBrick ELSE IF brick^=fullBrick^ THEN brick _ fullBrick -- reuse fullbrick; reduce swapping ELSE IF brick^=emptyBrick^ THEN brick _ emptyBrick; IF table[display]=NIL THEN { table[display] _ NEW[ColorTableSet_ALL[NIL]]; table[display][normal] _ NEW[ColorTable_ALL[fullBrick]]; table[display][back] _ NEW[ColorTable_ALL[fullBrick]]; table[display][grey] _ NEW[ColorTable_ALL[emptyBrick]]; }; dTable _ table[display]; dTable[mode][lev] _ brick; IF mode=normal THEN { dTable[back][lev] _ brick; dTable[grey][lev] _ emptyBrick; } END; DefineColor[lev: 0, display: bw]; DefineColor[lev: 0, display: bit4]; DefineColor[lev: 0, display: bit8]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[257,0,0,0]], display: bw]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[257,0,0,0]], display: bw, mode: back]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[0,10,0,11*256]], display: bit4]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[0,10,0,11*256]], display: bit4, mode: back]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[0,1,256,0]], display: bit8]; DefineColor[lev: CD.backGround, brick: NEW[Brick_[0,1,256,0]], display: bit8, mode: back]; END.