<> <> <> <> DIRECTORY Idle, ImagerPixelMaps, ImagerFrameBuffer, LFBoundingBox, Buttons; SleepPeekImpl: CEDAR PROGRAM IMPORTS Idle, ImagerPixelMaps, ImagerFrameBuffer, LFBoundingBox, Buttons = BEGIN sMin, fMin: INTEGER; sSize, fSize: NAT; screen: ImagerPixelMaps.PixelMap; shadow: ImagerPixelMaps.PixelMap; bitmapRef: Idle.BitmapRef; Bits: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF WORD]; Image: Idle.ImageProc ~ { shadow _ shadow.refRep.Reshape[0, [sMin, fMin, MIN[sSize, h], MIN[fSize, w]]]; shadow.Transfer[screen]; RETURN [bitmapRef]; }; SleepProc: Buttons.ButtonProc ~ BEGIN IF mouseButton = red OR sSize = 0 OR fSize = 0 OR shadow.refRep = NIL THEN { <> sMin _ -1; [y: sMin, x: fMin, h: sSize, w: fSize] _ LFBoundingBox.GetArea[!LFBoundingBox.AbortAdjust => CONTINUE]; IF sMin < 0 THEN shadow.refRep _ NIL ELSE { TRUSTED {screen _ ImagerFrameBuffer.LFDisplay[]}; sMin _ screen.sSize - sMin - sSize; shadow _ ImagerPixelMaps.Create[0, [sMin, fMin, sSize, fSize]]; WHILE shadow.refRep.words > 64000 DO sSize _ sSize * 7 / 8; fSize _ fSize * 7 / 8; shadow _ ImagerPixelMaps.Create[0, [sMin, fMin, sSize, fSize]]; ENDLOOP; shadow.refRep.pointer _ NIL; shadow.refRep.ref _ NEW[Bits[shadow.refRep.words]]; TRUSTED {shadow.refRep.pointer _ LOOPHOLE[shadow.refRep.ref]}; bitmapRef _ NEW[Idle.BitmapRep _ [base: shadow.refRep.ref, raster: shadow.refRep.rast, width: shadow.fSize, height: shadow.sSize]]; }; }; IF shadow.refRep # NIL THEN Idle.Sleep[Image]; END; [] _ Buttons.Create[[name: "Sleep"], SleepProc]; END.