-- Scale.mesa -- a program to run within Chipmonk -- written by E. McCreight, February 8, 1983 12:20 PM DIRECTORY ChipUserInt, InlineDefs, ppddefs, ppdefs; Scale: PROGRAM IMPORTS ChipUserInt, InlineDefs, ppddefs, ppdefs = BEGIN OPEN ChipUserInt, ppddefs, ppdefs; scaleN, scaleD: INTEGER; UnmarkList: PROCEDURE[head: listPtr, selectedOnly: BOOLEAN _ FALSE] = BEGIN FOR lp: listPtr _ head, lp.nxt WHILE lp#NIL DO UnmarkObject[lp.ob]; ENDLOOP; END; UnmarkObject: PROCEDURE[ob: obPtr] = BEGIN ob.marked _ FALSE; WITH dob: ob SELECT FROM cell => UnmarkList[dob.ptr]; ENDCASE => NULL; END; RescaleList: PROCEDURE[head: listPtr, selectedOnly: BOOLEAN _ FALSE] = BEGIN FOR lp: listPtr _ head, lp.nxt WHILE lp#NIL DO lp.lx _ Rescale[lp.lx]; lp.ly _ Rescale[lp.ly]; IF NOT selectedOnly OR lp.selected THEN BEGIN RescaleObject[lp.ob]; END; ENDLOOP; END; RescaleObject: PROCEDURE[ob: obPtr] = BEGIN IF NOT ob.marked THEN BEGIN ob.marked _ TRUE; ob.size[0] _ ob.size[2] _ Rescale[ob.size[0]]; ob.size[1] _ Rescale[ob.size[1]]; ob.surround _ Rescale[ob.surround]; WITH dob: ob SELECT FROM xstr => BEGIN dob.width _ Rescale[dob.width]; dob.length _ Rescale[dob.length]; dob.wExt _ Rescale[dob.wExt]; dob.lExt _ Rescale[dob.lExt]; END; cell => RescaleList[dob.ptr]; cont => BEGIN dob.magicN _ Rescale[dob.magicN]; dob.m2Ext _ Rescale[dob.m2Ext]; dob.c2Ext _ Rescale[dob.c2Ext]; dob.lExt _ Rescale[dob.lExt]; dob.wExt _ Rescale[dob.wExt]; END; bus => BEGIN dob.wspace _ Rescale[dob.wspace]; dob.firstLength _ Rescale[dob.firstLength]; dob.topIncr _ Rescale[dob.topIncr]; dob.lenIncr _ Rescale[dob.lenIncr]; dob.offsetFirst _ Rescale[dob.offsetFirst]; dob.wwidth _ Rescale[dob.wwidth]; END; ENDCASE => NULL; END; END; Rescale: PROC [x: locNum] RETURNS [locNum] = {RETURN[NarrowToInteger[(LONG[x]*scaleN)/scaleD]]}; NarrowToInteger: PROC [x: LONG INTEGER] RETURNS [INTEGER] = BEGIN IF x IN [FIRST[INTEGER]..LAST[INTEGER]] THEN RETURN[InlineDefs.LowHalf[x]] ELSE ERROR; END; -- M a i n P r o g r a m BEGIN ENABLE Punt => GOTO Exit; -- for exits scaleN _ RequestInteger["Scale factor numerator"]; scaleD _ RequestInteger["Scale factor denominator"]; UnmarkList[masterList]; FOR cl: cListPtr _ cellList, cl.nxt WHILE cl#NIL DO UnmarkObject[cl.ob]; ENDLOOP; RescaleList[masterList]; FOR cl: cListPtr _ cellList, cl.nxt WHILE cl#NIL DO RescaleObject[cl.ob]; ENDLOOP; EXITS Exit => NULL; END; dChange _ TRUE; END. -- of Scale