DIRECTORY AISTRCViewers, Imager, --USING Lots of stuff! ImagerPath USING [LineTo, MoveTo], ViewerClasses, ViewerOps USING [CreateViewer, RegisterViewerClass]; AISTRCViewersImpl: CEDAR PROGRAM IMPORTS Imager, ImagerPath, ViewerOps EXPORTS AISTRCViewers ~ { OPEN AISTRCViewers, I: Imager, IP: ImagerPath, V: ViewerClasses; AISTRCData: TYPE ~ REF AISTRCDataRec; AISTRCDataRec: TYPE ~ RECORD [ trc: REF TRC _ NIL, --TRC to display marks: LIST OF Mark _ NIL, --x's on the field clientData: REF ANY --Client's own data ]; Create: PUBLIC PROC [info: V.ViewerRec _ [], paint: BOOL _ TRUE, clientData: REF ANY _ NIL] RETURNS [aisTRCViewer: AISTRCViewer] ~ { aisTRCData: AISTRCData _ NEW[AISTRCDataRec _ [ clientData: clientData ]]; info.data _ aisTRCData; RETURN[ViewerOps.CreateViewer[$AISTRC, info, paint]]; }; IllegalOp: PUBLIC ERROR ~ CODE; Set: V.SetProc ~ { aisTRCData: AISTRCData _ NARROW[self.data]; IF aisTRCData = NIL THEN RETURN; SELECT op FROM $TRC => aisTRCData.trc _ NARROW[data]; $Marks => aisTRCData.marks _ NARROW[data]; ENDCASE => ERROR IllegalOp[]; }; Get: V.GetProc ~ { aisTRCData: AISTRCData _ NARROW[data]; IF aisTRCData = NIL THEN RETURN[NIL]; SELECT op FROM $TRC => RETURN[aisTRCData.trc]; $Marks => RETURN[aisTRCData.marks]; ENDCASE => ERROR IllegalOp[]; }; black: I.ConstantColor ~ I.MakeGray[1]; grey: I.ConstantColor ~ I.MakeGray[0.5]; white: I.ConstantColor ~ I.MakeGray[0]; length: CARDINAL ~ 256; offset: CARDINAL _ 1; AISTRCPaint: PRIVATE V.PaintProc ~ { data: AISTRCData _ NARROW[self.data]; traj: I.Trajectory; trc: REF TRC; IF data=NIL OR data.trc=NIL THEN RETURN; trc _ data.trc; --For efficiency only I.Scale2T[context, [REAL[self.cw]/length, REAL[self.ch]/256.0]]; traj _ IP.MoveTo[[0, trc[0]]]; --Move to first point FOR index: NAT _ offset, index+offset WHILE index