<> <> <> <> DIRECTORY Graphics USING [Context, NewContext], Interminal USING [terminal, TurnOnColorCursor, TurnOffColorCursor], ColorDevice USING [New], ColorPackagePrivate USING [DeviceProc], ColorMap USING [StandardMap, SetGamma], ColorWorld USING [], Terminal USING [CantDoIt, ColorMode, GetColorMode, LegalColorMode, SetColorBitmapState, TurnOnColorDisplay, Virtual], TerminalExtras USING [AttachColorDisplay]; ColorWorldImpl: CEDAR PROGRAM IMPORTS ColorDevice, ColorMap, Graphics, Interminal, Terminal, TerminalExtras EXPORTS ColorWorld, ColorPackagePrivate = { colorOn: BOOLEAN _ FALSE; terminal: PUBLIC Terminal.Virtual _ NIL; <> <> <> <> <> HasMode: PUBLIC PROCEDURE[bpp: INT] RETURNS[BOOLEAN] = TRUSTED { RETURN[(SELECT bpp FROM 1 => terminal.LegalColorMode[ [full: FALSE, bitsPerPixelChannelA: 1, bitsPerPixelChannelB: 0]], 2 => terminal.LegalColorMode[ [full: FALSE, bitsPerPixelChannelA: 2, bitsPerPixelChannelB: 0]], 4 => terminal.LegalColorMode[ [full: FALSE, bitsPerPixelChannelA: 4, bitsPerPixelChannelB: 0]], 8 => terminal.LegalColorMode[ [full: FALSE, bitsPerPixelChannelA: 8, bitsPerPixelChannelB: 0]], 24 => terminal.LegalColorMode[ [full: TRUE, bitsPerPixelChannelA: 0, bitsPerPixelChannelB: 0]], ENDCASE => FALSE)]; }; TurnOnColor: PUBLIC PROC[bpp: INT, onLeft: BOOLEAN _ TRUE] RETURNS[BOOLEAN] = { mode: Terminal.ColorMode _ (IF bpp=24 THEN [TRUE,0,0] ELSE[FALSE,bpp,0]); ok: BOOL _ terminal.LegalColorMode[mode]; IF ok THEN { [] _ terminal.SetColorBitmapState[newState: allocated, newMode: mode, newVisibility: all ! Terminal.CantDoIt => GOTO Fail]; ColorMap.SetGamma[2.2]; IF bpp # 24 THEN ColorMap.StandardMap[]; terminal.TurnOnColorDisplay[]; TRUSTED {Interminal.TurnOnColorCursor[bpp,onLeft]}; colorOn _ TRUE; EXITS Fail => ok _ FALSE; }; RETURN[ok]; }; <> <> TurnOffColor: PUBLIC PROC = { TRUSTED {Interminal.TurnOffColorCursor[]}; [] _ terminal.SetColorBitmapState[newState: none, newMode: terminal.GetColorMode, newVisibility: all]; colorOn _ FALSE; }; NewProc: ColorPackagePrivate.DeviceProc _ ColorDevice.New; SetNewContextProc: PUBLIC PROC[new: ColorPackagePrivate.DeviceProc] = {NewProc _ new}; NewContext: PUBLIC PROC RETURNS[Graphics.Context] = { IF ~colorOn THEN RETURN[NIL] ELSE RETURN[Graphics.NewContext[NewProc[]]]; }; Initialize: PROC = { terminal _ Interminal.terminal; TerminalExtras.AttachColorDisplay[terminal]; }; Initialize[]; }.