% paint.jam % last changed by Bill Paxton, March 12, 1982 8:31 am (paint) 256 .dict .def paint .begin (x) 0 .def (y) 0 .def (RHWidth) 0 .def (RHHeight) 0 .def (RedDown) { (Track) (TrackRed) .load .def Track } .cvx .def (TrackRed) { % paint rectangular box .translate RHWidth .neg RHHeight .neg RHWidth RHHeight .drawbox } .cvx .def (RedUp) { (Track) TwoPop Track } .cvx .def (CtrlRedDown) { (CtrlTrack) (CtrlTrackRed) .load .def CtrlTrack } .cvx .def (CtrlTrackRed) { % erase rectangular box .pushdc .true .setopaque 0 .setcolor TrackRed .popdc } .cvx .def (CtrlRedUp) { (CtrlTrack) TwoPop CtrlTrack } .cvx .def (ShiftRedDown) { (ShiftTrack) TwoPop % discard intermediate positions (y) .exch .def (x) .exch .def % save start position } .cvx .def (ShiftRedUp) { (:y) .exch .lv (:x) .exch .lv % save end position (RHWidth) :x x .sub .abs 2 .div .def % half width of rectangle (RHHeight) :y y .sub .abs 2 .div .def % half height of rectangle } .cvx .def (CtrlShiftRedDown) { (CtrlShiftTrack) (CtrlShiftTrackRed) .load .def CtrlShiftTrack } .cvx .def (CtrlShiftTrackRed) { % invert rectangular box .pushdc .setinvert TrackRed .popdc } .cvx .def (CtrlShiftRedUp) { (CtrlShiftTrack) TwoPop Track } .cvx .def (.abs) { .dup 0 .lt { .neg } .cvx .if } .cvx .def (YHWidth) 0 .def (YHHeight) 0 .def (YellowDown) { (Track) (TrackYellow) .load .def Track } .cvx .def (TrackYellow) { % paint oval .translate YHWidth .neg 0 .knot 0 YHHeight .neg .knot YHWidth 0 .knot 0 YHHeight .knot .cspline .drawarea } .cvx .def (YellowUp) { (Track) TwoPop Track } .cvx .def (CtrlYellowDown) { (CtrlTrack) (CtrlTrackYellow) .load .def CtrlTrack } .cvx .def (CtrlTrackYellow) { % erase oval .pushdc .true .setopaque 0 .setcolor TrackYellow .popdc } .cvx .def (CtrlYellowUp) { (CtrlTrack) TwoPop CtrlTrack } .cvx .def (ShiftYellowDown) { (ShiftTrack) TwoPop % discard intermediate positions (y) .exch .def (x) .exch .def % save start position } .cvx .def (ShiftYellowUp) { (:y) .exch .lv (:x) .exch .lv % save end position (YHWidth) :x x .sub .abs 2 .div .def % half width (YHHeight) :y y .sub .abs 2 .div .def % half height } .cvx .def (CtrlShiftYellowDown) { (CtrlShiftTrack) (CtrlShiftTrackYellow) .load .def CtrlShiftTrack } .cvx .def (CtrlShiftTrackYellow) { % erase oval .pushdc .setinvert TrackYellow .popdc } .cvx .def (CtrlShiftYellowUp) { (CtrlShiftTrack) TwoPop CtrlTrack } .cvx .def (BMx1) 0 .def (BMx2) 0 .def (BMy1) 0 .def (BMy2) 0 .def (BHWidth) 0 .def (BHHeight) 0 .def (BlueDown) { (Track) (TrackBlue) .load .def Track } .cvx .def (TrackBlue) { % copy bitmap .translate 0 0 .moveto BMx1 BMy1 BMx2 BMy2 .copyscreen } .cvx .def (BlueUp) { (Track) TwoPop Track } .cvx .def (CtrlBlueDown) { (CtrlTrack) (CtrlTrackBlue) .load .def CtrlTrack } .cvx .def (CtrlTrackBlue) { % erase bimap sized rectangle .pushdc .true .setopaque 0 .setcolor TrackBlue .popdc } .cvx .def (CtrlBlueUp) { (CtrlTrack) TwoPop CtrlTrack } .cvx .def (ShiftBlueDown) { (ShiftTrack) TwoPop % discard intermediate positions .screencoords (BMy1) .exch .neg 808 .add .def (BMx1) .exch .def % save first corner of bitmap } .cvx .def (ShiftBlueUp) { .screencoords (BMy2) .exch .neg 808 .add .def (BMx2) .exch .def % save second corner of bitmap (BHWidth) BMx1 BMx2 .sub .abs 2 .div .def % half width (BHHeight) BMy1 BMy2 .sub .abs 2 .div .def % half height } .cvx .def (CtrlShiftBlueDown) { (CtrlShiftTrack) (CtrlShiftTrackBlue) .load .def CtrlShiftTrack } .cvx .def (CtrlShiftTrackBlue) { % invert .pushdc .setinvert TrackBlue .popdc } .cvx .def (CtrlShiftBlueUp) { (CtrlShiftTrack) TwoPop CtrlTrack } .cvx .def