GetSketch:
PUBLIC
PROC [control: Control]
RETURNS [PosSequences] ~ {
chain: Chain ← NARROW[control.sketchRef];
chainPoss: PosSequence ← chain.pairs;
start: Run ← chain.firstRun;
sketch: PosSequences ← NEW[PosSequencesRep];
FOR run: Run ← start, run.next
WHILE run #
NIL
DO
n: INTEGER ← 0;
sketchPoss: PosSequence ← NEW[PosSequenceRep[run.stop-run.start+1]];
sketch[sketch.length] ← sketchPoss;
sketch.length ← sketch.length+1;
FOR r:
NAT
IN [run.start..run.stop]
DO
sketchPoss[n] ← chainPoss[r];
n ← n+1;
ENDLOOP;
ENDLOOP;
RETURN[sketch];
};
SetSketch:
PUBLIC
PROC [control: Control, sketch: PosSequences, repaint:
BOOL ←
TRUE] ~ {
run: Run ← NIL;
iPos, nPoss: INT ← 0;
chain: Chain ← NARROW[control.sketchRef];
FOR n: INT IN [0..sketch.length) DO nPoss ← nPoss+sketch[n].length; ENDLOOP;
IF nPoss > chain.pairs.maxLength THEN chain.pairs ← NEW[PosSequenceRep[nPoss]];
FOR n:
INT
IN [0..sketch.length)
DO
pairs: PosSequence ← sketch[n];
FOR i: INT IN [0..pairs.length) DO chain.pairs[i+iPos] ← pairs[i]; ENDLOOP;
IF run #
NIL
THEN {run.next ← NEW[RunRep]; run ← run.next}
ELSE chain.firstRun ← run ← NEW[RunRep];
run.start ← iPos;
iPos ← iPos+pairs.length;
run.stop ← iPos-1;
ENDLOOP;
IF repaint THEN ViewerOps.PaintViewer[control.viewer, client, FALSE, NIL];
};