-- CGArea.mesa -- Last edit by Doug Wyatt, August 23, 1982 3:27 pm DIRECTORY GraphicsBasic USING [Box, Trap, Vec]; CGArea: CEDAR DEFINITIONS = { OPEN GraphicsBasic; -- An Area consists of a set of disjoint trapezoids sorted by lowest y. -- Types Ref: TYPE = REF Rep; Rep: TYPE = RECORD [size: NAT, box: REF Box, data: Data]; Item: TYPE = REF Trap; Data: TYPE = REF DataRep; DataRep: TYPE = RECORD [data: SEQUENCE space: NAT OF Item]; Error: ERROR[type: ErrorType]; ErrorType: TYPE = {emptyQueue, bug}; -- Operations New: PROC [size: NAT _ 0] RETURNS [Ref]; -- create a new area with given initial size Size: PROC [self: Ref] RETURNS [NAT] = INLINE { RETURN[self.size] }; -- return number of items in queue Reset: PROC [self: Ref] = INLINE { self.size _ 0 }; -- empty the queue Empty: PROC [self: Ref] RETURNS [BOOLEAN] = INLINE { RETURN[self.size = 0] }; -- return true if queue is empty, false if not empty Insert: PROC [self: Ref, trap: Trap]; -- insert a new trapezoid into the queue InsertBox: PROC [self: Ref, box: Box] = INLINE { Insert[self,[ ybot: box.ymin, xbotL: box.xmin, xbotR: box.xmax, ytop: box.ymax, xtopL: box.xmin, xtopR: box.xmax, rectangle: TRUE]] }; -- insert a new rectangle into the queue InsertLine: PROC [self: Ref, p,q: Vec]; -- insert a new line into the queue Bounds: PROC [self: Ref] RETURNS [Box] = INLINE { RETURN[self.box^] }; -- return bounding box for all items inserted since last Reset NextY: PROC [self: Ref] RETURNS[REAL]; -- return lowest y of next trapezoid in queue -- Errors: emptyQueue Remove: PROC [self: Ref] RETURNS[Trap]; -- remove next trapezoid from queue -- Errors: emptyQueue }.