-- file DisplayDefs
-- last edited by Brotz, November 19, 1981 11:56 AM
-- last edited by Taft, May 10, 1983 6:08 PM

DIRECTORY
Ascii USING [CR],
Mopcodes USING [zBITBLT, zJRAM, zLI0, zLIW],
ovD: FROM "OverviewDefs" USING [LineBreakValue];

dsD: DEFINITIONS =

BEGIN

-- Purpose: contains those procedures that directly use bitmaps, fonts, and the cursor.


-- "Public" Variables (for initialization)

bbtPtr, charBbtPtr, pictureBbtPtr: BbtPtr;

machineFlavor: MachineFlavor;


-- Public Types

ScreenXCoord: TYPE = CARDINAL;
ScreenYCoord: TYPE = CARDINAL;

FaceType: TYPE = {plainFace, boldFace, italicFace};

CursorShape: TYPE = {lineArrow, charArrow, thumbMarker, scroll, scrollUp, scrollDown,
bullsEye, hourGlass, boundaryPad, invisibleCursor, questionMark, invertQuestionMark};

PictureClass: TYPE = {triangle, caret, leftEdgeCaret, boundaryPad, selectionThumbMark,
resetMenuIcon};

BitBltFunction: TYPE = CARDINAL;

GrayBitPattern: TYPE = ARRAY [0 .. 3] OF UNSPECIFIED;

GrayShade: TYPE = {white, black, lightGray, darkGray, dottedLine};

Font: TYPE = POINTER; -- address of a font base

MachineFlavor: TYPE = {alto, xmesa5, dmachine};


-- Private Types

DCBptr: TYPE = POINTER TO DCB;

DCB: TYPE = MACHINE DEPENDENT RECORD
[next: DCBptr,
resolution: restype,
background: backgtype,
indenting: [0..77B], -- in units of 16 bits
width: [0..377B], -- in units of 16 bits and must be even
bitmap: POINTER,
-- must be even
tag: {short, long} ← short,
-- choose between bitmap (short) or longBitmap (long).
height: [0 .. 77777B], -- in units of double scan lines
longBitmap: LONG POINTER]; -- long pointer to bitmap (D-machines only)

restype: TYPE = {high, low};

backgtype: TYPE = {white, black};

longDcbSeal: POINTER = LOOPHOLE[177423B];

-- Global constants --

bmWidth: CARDINAL = 30;

xOrigin: ScreenXCoord = 64;
yOrigin: ScreenYCoord = 40;

lineHeight: CARDINAL = 12;

DCBorg: POINTER TO DCBptr = LOOPHOLE[420B];

DCBnil: DCBptr = LOOPHOLE[0]; -- indicates end of DCB chain

cursorX: POINTER TO CARDINAL = LOOPHOLE[426B];

cursorY: POINTER TO CARDINAL = LOOPHOLE[427B];

Bbt: TYPE = MACHINE DEPENDENT RECORD
[ptrs: {short, long} ← short,
pad: [0 .. 777B] ← 0,
sourcealt, destalt: BOOLEAN ← FALSE, -- TRUE to use alternate memory bank
func: [0 .. 17B],
unused: CARDINAL ← 0,
-- BitBlt function codes:
-- replace:
(0) d ← s’
-- paint:
(1) d ← s’ ior d
-- invert:
(2) d ← s’ xor d
-- erase:
(3) d ← ~s’ and d
--
-- source:
(0) s’ = s
-- complementOfSource:
(4) s’ = ~s
-- sourceAndGray:
(8) s’ = s and g
-- gray:
(12) s’ = g
dbca: POINTER,
-- destination bitmap’s base core address
dbmr: CARDINAL ← dsD.bmWidth,
-- destination bitmap’s width in words
dlx,
-- destination left x relative to bitmap
dty,
-- destination top y relative to bitmap
dw,
-- width of rectangle in bits
dh: CARDINAL,
-- height of rectangle in bits
sbca: POINTER,
-- source bitmap base core address
sbmr,
-- source bitmap’s width in words
slx,
-- source left x relative to bitmap
sty: CARDINAL,
-- source top y relative to bitmap
gray: GrayBitPattern ← NULL,
-- four words of gray pattern
slbca: LONG POINTER ← NULL,
-- source bitmap long core address
dlbca: LONG POINTER ← NULL];
-- destination bitmap long core address

BbtPtr: TYPE = POINTER TO Bbt;

replace: BitBltFunction = 0;
paint: BitBltFunction = 1;
invert: BitBltFunction = 2;
erase: BitBltFunction = 3;
source: BitBltFunction = 0;
complementOfSource: BitBltFunction = 4;
sourceAndGray: BitBltFunction = 8;
gray: BitBltFunction = 12;

XWord: TYPE = MACHINE DEPENDENT RECORD
[widthOrExtension: [0 .. 77777B], -- either a width field or an extension
hasNoExtension: [0 .. 1]]; -- determines the interpretation of above field
XwPtr: TYPE = POINTER TO XWord;

CharFont: TYPE = MACHINE DEPENDENT RECORD
[width: [0 .. 77777B], -- either a width field or an extension
hasNoExtension: [0 .. 1], -- determines the interpretation of above field
ySkip: [0 .. 377B), -- scan lines to skip before inserting char in bitmap
height: [0 .. 377B)]; -- height of char bitmap
CharFontPtr: TYPE = POINTER TO CharFont;

LegalCharacters: TYPE = CHARACTER[0C .. Ascii.CR + (ovD.LineBreakValue - 0C)];

CharPropertyTable: TYPE = PACKED ARRAY LegalCharacters OF CharProperty;

CharProperty: TYPE = MACHINE DEPENDENT
{white, alpha, digit, alphaNumeric, punctuation, illegal, (15)};

cursorBM: POINTER TO CursorBitMap = LOOPHOLE[431B];

CursorBitMap: TYPE = ARRAY [0 .. 16) OF UNSPECIFIED;

PictureBitMap: TYPE = ARRAY [0 .. 12) OF UNSPECIFIED;

HotSpot: TYPE = RECORD [x, y: INTEGER];

CursorObject: TYPE = RECORD
[hotSpot: HotSpot,
bitMap: CursorBitMap];

CursorTable: TYPE = ARRAY CursorShape OF CursorObject;

Dimensions: TYPE = RECORD [width, height: [0 .. 377B]];

PictureObject: TYPE = RECORD
[dimensions: Dimensions,
bitmap: PictureBitMap];

PictureTable: TYPE = ARRAY PictureClass OF PictureObject;


ClearDCBs: PROCEDURE = INLINE {DCBorg↑ ← DCBnil};

Display: PROGRAM;


-- Character-Oriented Procedures


PutCharInBitMap: PROCEDURE [char: CHARACTER, x: ScreenXCoord, y: ScreenYCoord,
face: FaceType] RETURNS [ScreenXCoord];
-- Places char in standard bitmap at screen position x,y in the specified face. Uses the
-- standard Laurel display font. Assuming that the caller knows what he is doing,
-- PutCharInBitmap makes no check of whether the point x,y is covered by bitmap; if
-- given out of range arguments, PutCharInBitmap will overwrite memory. Returns first
-- free ScreenXCoord.


PutStringInBitMap: PROCEDURE [x: ScreenXCoord, y: ScreenYCoord, s: STRING,
face: FaceType] RETURNS [newRightX: ScreenXCoord];
-- Puts all characters of s into the bitmap starting at x in face.


Underline: PROCEDURE [leftx, rightx: ScreenXCoord, y: ScreenYCoord];
-- Underlines [leftx, rightx) in a line of characters at position y in the standard font.


RemoveUnderline: PROCEDURE [leftx, rightx: ScreenXCoord, y: ScreenYCoord];
-- Remove possible underline [leftx, rightx) in a line of characters at position y in the
-- standard font.


GetCharRightX: PROC [char: CHARACTER, leftX: ScreenXCoord]
RETURNS [rightX: ScreenXCoord];
-- Given a char positioned at leftX, returns its rightX. Char is
-- always masked to 7 bits. Tab widths may vary depending on
-- leftX are handled.


GetStaticCharWidth: PROCEDURE [char: CHARACTER] RETURNS [CARDINAL];
-- Returns the width of char in bit positions, ignoring screen position. Char is always
-- masked to 7 bits.


GetVisibleCharWidth: PROCEDURE [char: CHARACTER] RETURNS [CARDINAL];
-- Returns the width of char in bit positions, ignoring screen position. Widths of visible tab and CR are considered.


GetStringWidth: PROCEDURE [s: STRING, face: FaceType] RETURNS [width: CARDINAL];
-- Adds character widths for an entire string; returns the sum.


GetCharProperty: PROCEDURE [char: CHARACTER, property: CharProperty]
RETURNS [BOOLEAN];
-- Returns TRUE iff char has property.


GetCharBreakProp: PROCEDURE [char: CHARACTER] RETURNS [property: CharProperty];
-- Returns break property {white, alphaNumeric, punctuation} for char.


-- Region-Oriented Procedures


InvertRectangle: PROCEDURE [left, right: ScreenXCoord, top, bottom: ScreenYCoord,
grayShade: GrayShade ← black];
-- Inverts (XORs) grayShade into the specified half-open rectangle.


ReplaceRectangle: PROCEDURE [left, right: ScreenXCoord, top, bottom: ScreenYCoord,
grayShade: GrayShade];
-- Sets all bits in the specified half-open rectangle using grayShade.


ClearRectangle: PROCEDURE [left, right: ScreenXCoord, top, bottom: ScreenYCoord] =
INLINE {ReplaceRectangle[left, right, top, bottom, white]};


BlackenRectangle: PROCEDURE [left, right: ScreenXCoord, top, bottom: ScreenYCoord] =
INLINE {ReplaceRectangle[left, right, top, bottom, black]};


SlideRectangleHorizontally: PROCEDURE [left, right: ScreenXCoord,
top, bottom: ScreenYCoord, deltaX: INTEGER];
-- Slides rectangle horizontally deltaX raster points. Clears vacated area.


ItalicizeRectangle: PROCEDURE [left, right: ScreenXCoord, top: ScreenYCoord,
lineHeight: CARDINAL];
-- Slants bitmap from [left, right - lineHeight/2 +1, top, top + lineHeight]
-- to [left, right, top, top + lineHeight];


SlideFullWidthRectangleVertically: PROCEDURE [top, bottom: ScreenYCoord,
newTop: ScreenYCoord];
-- The display in the rectangle [top .. bottom) is moved so that its new top is at newTop.
-- The prior contents of the target region is overwritten. All intervening and vacated
-- areas are cleared.


MoveFullWidthRectangleVertically: PROCEDURE [top, bottom: ScreenYCoord,
newTop: ScreenYCoord];
-- The display in the rectangle [top .. bottom) is moved so that its new top is at newTop.
-- The prior contents of the target region is overwritten. All intervening and vacated
-- areas are not cleared.


BitBlt: PRIVATE PROCEDURE [ptr: BbtPtr] = INLINE
-- See hardware manual.
{IF machineFlavor = xmesa5 THEN XMesa5BitBlt[ptr] ELSE Mesa6BitBlt[ptr]};


XMesa5BitBlt: PRIVATE PROCEDURE [ptr: BbtPtr] = MACHINE CODE
-- See hardware manual.
{Mopcodes.zLI0; Mopcodes.zLIW, 411B/256, 411B MOD 256; Mopcodes.zJRAM};


Mesa6BitBlt: PRIVATE PROCEDURE [ptr: BbtPtr] = MACHINE CODE
-- See hardware manual.
{Mopcodes.zLI0; Mopcodes.zBITBLT};


-- Picture Oriented Procedures


SetCursor: PROCEDURE [shape: CursorShape];
-- Sets the cursor to the specified shape. The hardware cursor point is maintained at the
-- current position.


ChangeCursor: PROCEDURE [shape: CursorShape];
-- Changes the cursor to the specified shape. The sensitive point is maintained at the
-- current position.


GetCursor: PROCEDURE RETURNS [shape: CursorShape, sensitiveX, sensitiveY: INTEGER];
-- Returns the current cursor shape and sensitive point offsets.


GetPictureParameters: PROCEDURE [picture: PictureClass]
RETURNS [width, height: CARDINAL];
-- Returns width and height in bits of picture.


PaintPicture: PROCEDURE [x: ScreenXCoord, y: ScreenYCoord, picture: PictureClass,
function: BitBltFunction];
-- BitBlt’s picture onto the display at x,y according to the function specified. Each
-- function corresponds to the bitblt function code + source.


END. -- of DisplayDefs --