-- ColorDisplayFace.mesa -- Last edit by Doug Wyatt, 9-Jul-81 15:21:55 DIRECTORY Environment USING [Base, PageCount, PageNumber]; ColorDisplayFace: DEFINITIONS = { -- Processor-independent interface to color display. -- Types Mode: TYPE = RECORD[full, useA, useB: BOOLEAN, lgBitsPerPixelA,lgBitsPerPixelB: [0..3]]; -- Encodes the color display modes that may be available on a given processor. -- full=TRUE specifies 24 bit per pixel mode; the other fields are ignored. -- full=FALSE specifies a mode with one or two bitmaps addressing a color map: -- if useA=TRUE, lgBitsPerPixelA specifies 1,2,4 or 8 bits per pixel for bitmap "A" -- if useB=TRUE, lgBitsPerPixelB specifies 1,2,4 or 8 bits per pixel for bitmap "B" Color: TYPE = [0..256); -- an 8 bit color value (red, green, or blue) -- Interface variables globalStateSize: READONLY CARDINAL; -- number of words required by Initialize displayType: READONLY CARDINAL; -- display type; 0 means display is not available pixelsPerInch: READONLY CARDINAL; -- size of a pixel mixedRG: READONLY BOOLEAN; -- red and green mixed in bitmap A -- Applies only to 24 bit per pixel mode: if mixedRG is TRUE, then the A bitmap -- contains alternating red and green values, and the B bitmap contains blue values; -- otherwise, bitmaps A, B, and C contain red, green, and blue respectively. -- The following variables are established by Connect (see below). -- They remain unchanged between a call to Connect and a call to Disconnect. width,height: READONLY CARDINAL; -- raster dimensions in pixels (0,0 if disconnected) baseA,baseB,baseC: READONLY LONG POINTER; -- bitmap addresses (NIL if bitmap not in use) bplA,bplB,bplC: READONLY CARDINAL; -- bitmap bits per line (0 if bitmap not in use) -- Procedures Initialize: PROCEDURE [globalState: Environment.Base RELATIVE POINTER]; -- Initializes the implementation; the client must supply a block of -- globalStateSize words, permanently allocated in first 64K of address space. InitializeCleanup: PROCEDURE; -- Initializes the cleanup coroutine for world swaps. HasMode: PROCEDURE[mode: Mode] RETURNS[BOOLEAN]; -- Returns TRUE if the specified mode is available. PagesForMode: PROCEDURE[mode: Mode] RETURNS[Environment.PageCount]; -- Returns the number of pages required to Connect the specified mode, -- with a raster the size of the full screen. Connect: PROCEDURE[mode: Mode, firstPage: Environment.PageNumber, nPages: Environment.PageCount]; -- Establishes the specified mode; allocates bitmap(s) and colormap(s) -- from a client-supplied block of nPages pages of mapped virtual memory. -- If mode.full=TRUE, nPages may be less than PagesForMode[mode]; -- in this case, the raster size will be reduced to fit. -- Subsequent changes to the bitmap or color map will affect the color image, -- but the image will not appear on the screen until TurnOn is called. Disconnect: PROCEDURE; -- Disconnects the display; releases all references to the pages passed to Connect. TurnOn: PROCEDURE; -- Turns display on, causing an image to appear on the screen. -- Caution: the connected pages must be made resident before TurnOn is called! TurnOff: PROCEDURE; -- Turns display off, causing the screen to be dark. -- The bitmap(s) and colormap are retained; the image will reappear if TurnOn is called. -- The connected pages may be made swappable after TurnOff is called. Show: PROCEDURE[a,b,c: BOOLEAN ← TRUE]; -- Makes each bitmap visible (TRUE) or invisible (FALSE). -- Procedures for mapped modes (mode.full=FALSE) GetColor: PROCEDURE[pixelA,pixelB: CARDINAL ← 0] RETURNS[r,g,b: Color]; -- Returns the current color map entry for the given combination of pixel values -- from bitmaps A and B. (For a bitmap not in use, the pixel value is always 0.) SetColor: PROCEDURE[pixelA,pixelB: CARDINAL ← 0, r,g,b: Color]; -- Sets the color map entry for the given combination of pixel values. -- If the display is 'on', the screen will show the change by the next frame time. -- Procedures for 24 bit per pixel mode (mode.full=TRUE) GetRedMap,GetGreenMap,GetBlueMap: PROCEDURE[in: Color] RETURNS[out: Color]; -- Returns the current entry from the red, green, or blue map. SetRedMap,SetGreenMap,SetBlueMap: PROCEDURE[in,out: Color]; -- Sets an entry in the red, green, or blue map. -- If the display is 'on', the screen will show the change by the next frame time. }.