<> <> <<>> DIRECTORY Inline USING [BITAND, BITSHIFT], Rope USING [ROPE]; <<>> Map: DEFINITIONS IMPORTS Inline = BEGIN ColorMapSize: TYPE = [0..256); ColorRange: TYPE = REAL; ColorList: TYPE = LIST OF Triplet; Triplet: TYPE = REF TripletRec; TripletRec: TYPE = RECORD [r, g, b: ColorRange]; PalTable: TYPE = REF PalTableRec; PalTableRec: TYPE = RECORD [ size:CARDINAL, data:SEQUENCE ix:CARDINAL OF TripletRec]; ColorTable: TYPE = REF ColorTableRec; ColorTableRec: TYPE = RECORD [ size:CARDINAL, data:SEQUENCE ix:CARDINAL OF ColorMapSize]; <<>> <> ErrorFunc: TYPE = PROCEDURE [r1,g1,b1,r2,g2,b2: ColorRange] RETURNS [error:REAL] ; <> <<>> GetIndex: PUBLIC PROC [r, g, b:INTEGER, table:ColorTable] RETURNS [palix:CARDINAL] = INLINE { <> r _ MAX[0, MIN[r+7,255]]; g _ MAX[0, MIN[g+7,255]]; b _ MAX[0, MIN[b+7,255]]; palix _ table[Inline.BITSHIFT[Inline.BITAND[r, 360B], 4] + Inline.BITSHIFT[Inline.BITAND[g, 360B],0] + Inline.BITSHIFT[Inline.BITAND[b, 360B],-4]]; }; <<>> InsertColor: PUBLIC PROCEDURE [r,g,b: ColorRange, list: ColorList _ NIL] RETURNS [ColorList] = INLINE {RETURN [CONS[NEW[TripletRec _ [r, g, b]], list]]}; <> <<>> NullList: SIGNAL []; <> <<>> ListToTable: PUBLIC PROCEDURE [list: ColorList, error: ErrorFunc _ Vector3D] RETURNS [colorTable: ColorTable, pal:PalTable] ; <> <<>> MakeStandardList: PUBLIC PROCEDURE [redMax, greenMax, blueMax, grayMax:CARDINAL] RETURNS [l:ColorList] ; <> <> <> <<>> Restore: PUBLIC PROCEDURE [fileName:Rope.ROPE] RETURNS [table:ColorTable, pal:PalTable] ; <> <<>> Save: PUBLIC PROCEDURE [fileName:Rope.ROPE, table:ColorTable_NIL, pal:PalTable] ; <> <<>> Vector3D: PUBLIC ErrorFunc; <> END.