-- 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