-- Copyright (C) 1982, 1984 by Xerox Corporation. All rights reserved. -- File: WindowOps.mesa - last edit by -- Daniels, 7-Jun-84 14:36:12 -- Bruce, 20-Dec-82 12:09:58 DIRECTORY BitBlt: TYPE USING [BBptr, GrayParm, SrcDesc], Inline: TYPE USING [LongMult], SpecialDisplay: TYPE USING [defaultContext, Special], Window: TYPE USING [Box, BoxHandle, Error, ErrorCode, Place]; WindowOps: DEFINITIONS IMPORTS Inline, SpecialDisplay, Window = BEGIN Handle: TYPE = LONG POINTER TO Object; Object: TYPE = RECORD [ beingDisplayed, useBadPhosphor: BOOLEAN, cookieCutterVariant, cookie: BOOLEAN, underVariant, underNow: BOOLEAN, clearingRequired: BOOLEAN, inTree: BOOLEAN, parent, sibling, child: Handle, box: Window.Box, place: Window.Place, display: PROCEDURE [Handle] ← TRASH, -- keep Ed happy invalid, badPhosphor: RecList]; ScanLine: TYPE = LONG ORDERED POINTER TO PACKED ARRAY [0..0) OF BOOLEAN; ScreenBox: TYPE = RECORD [ -- (0, 0) is upper left left, top, right, bottom: INTEGER]; -- (right, bottom) is not in the box RecList: TYPE = LONG POINTER TO Rectangle; Rectangle: TYPE = RECORD [ box: ScreenBox, link: RecList, src, dst: Handle ← NIL]; nullGray: BitBlt.SrcDesc = [gray[BitBlt.GrayParm[0,0,0,0]]]; -- exported variables rootWindow: Handle; -- same as Window but this is not ReadOnly lock: MONITORLOCK; bbPtr: BitBlt.BBptr; bitmapAddress: LONG ORDERED POINTER; bitmapHeight: CARDINAL; -- internal utilities AssertUnobscured: PROC [w: Handle, code: Window.ErrorCode]; InvalidateTree: --INTERNAL-- PROC [ window, dirtyChild: Handle, invalid: RecList, butNot: Handle ← NIL]; WhitenRecList: --INTERNAL-- PROC [boxes: RecList]; -- these procedures are for use ONLY by the routines implementing Display AbsoluteBox: PROC [w: Handle, box: Window.Box] RETURNS [sb: ScreenBox] = INLINE { sb.left ← w.place.x + box.place.x; sb.right ← sb.left + box.dims.w; sb.top ← w.place.y + box.place.y; sb.bottom ← sb.top + box.dims.h}; AbsoluteBoxHandle: PROC [w: Handle, box: Window.BoxHandle] RETURNS [sb: ScreenBox] = INLINE { sb.left ← w.place.x + box.place.x; sb.right ← sb.left + box.dims.w; sb.top ← w.place.y + box.place.y; sb.bottom ← sb.top + box.dims.h}; Bounds: PROC [w: Handle] RETURNS [sb: ScreenBox] = INLINE { sb.left ← w.place.x; sb.right ← sb.left + w.box.dims.w; sb.top ← w.place.y; sb.bottom ← sb.top + w.box.dims.h}; DisplayList: --INTERNAL-- PROC [w: Handle] RETURNS [RecList] = INLINE { RETURN[ IF w.beingDisplayed AND w.useBadPhosphor AND w.badPhosphor # NIL THEN w.badPhosphor ELSE GetRecList[w]]}; GetRecList: PRIVATE --INTERNAL-- PROC [window: Handle] RETURNS [RecList]; GetContext: --INTERNAL-- PROC [r: RecList, default: SpecialDisplay.Special] RETURNS [SpecialDisplay.Special] = INLINE { IF r.src # NIL THEN ERROR Window.Error[illegalBitmap]; RETURN[IF r.dst = NIL THEN default ELSE MakeContext[r]]}; GetBpl: --INTERNAL-- PROC [w: Handle] RETURNS [CARDINAL] = INLINE { RETURN[(CARDINAL[w.box.dims.w] + 31)/16 * 16]}; MakeContext: PRIVATE PROC [RecList] RETURNS [SpecialDisplay.Special]; DIVMOD16: PROC [d: CARDINAL] RETURNS [--q, r:-- CARDINAL, CARDINAL] = INLINE { RETURN[d/16, d MOD 16]}; -- ↑ 1 more code byte than Inline.DIVMOD, but significantly faster. -- Offset: PROC [x: INTEGER] RETURNS [word: INTEGER, bit: CARDINAL] = INLINE { IF x < 0 THEN { x ← -x; [word, bit] ← DIVMOD16[CARDINAL[x]]; IF bit # 0 THEN {word ← word + 1; bit ← 16 - bit}; RETURN[-word, bit]} ELSE RETURN[CARDINAL[x]/16, CARDINAL[x] MOD 16]}; SpecialTimesWpl: PROC [ w: INTEGER, s: SpecialDisplay.Special ← SpecialDisplay.defaultContext] RETURNS [LONG INTEGER] = INLINE { IF w >= 0 THEN RETURN[Inline.LongMult[w, s.wpl]] ELSE RETURN[-Inline.LongMult[-w, s.wpl]]}; END.