-- WriteStringImpl.mesa -- last modified by Dillon, April 11, 1984 4:39 PM -- written by Hilton, August 4, 1982 1:42 PM DIRECTORY ChipUserInt, ppdddefs, ppddefs, ppdefs, String, WriteStringDefs; WriteStringImpl: PROGRAM IMPORTS ChipUserInt, ppdddefs, ppddefs, ppdefs, String EXPORTS WriteStringDefs SHARES WriteStringDefs = BEGIN OPEN ppdddefs, ppddefs, ppdefs, String, WriteStringDefs; NoFont: PUBLIC SIGNAL = CODE; font: PUBLIC LONG POINTER TO cList _ NIL; CellPtr: TYPE = LONG POINTER TO cell object _ NIL; StringToRectangles: PUBLIC PROCEDURE [s: STRING _ NIL, proc: PROCEDURE [r: Rect]] = BEGIN fileOpened: BOOLEAN _ TRUE; mustRestore: BOOLEAN _ FALSE; xOffset, yOffset, charWidth, totWidth: CARDINAL _ 0; cp: CellPtr _ NIL; lp: listPtr _ NIL; IF s = NIL OR s.length=0 THEN RETURN; FOR i: CARDINAL IN [0..s.length) DO charWidth _ xOffset _ yOffset _ 0; cp _ GetChar[s[i]]; -- returns object ptr -- yOffset _ cp.size[1]; -- default xOffset _ 0; charWidth _ cp.size[0] + 12; FOR lp _ cp.ptr, lp.nxt WHILE lp # NIL DO -- find poly baseline record -- IF lp.ob # NIL AND lp.ob.l = pol THEN BEGIN yOffset _ lp.ly; xOffset _ lp.lx; charWidth _ lp.ob.size[Rot90[lp]]; EXIT; END; ENDLOOP; FOR lp _ cp.ptr, lp.nxt WHILE lp # NIL DO -- enumerate the metal rectangles forming the character IF lp.ob.l=met THEN proc[[x1: lp.lx-xOffset+totWidth, y1: lp.ly-yOffset, x2: lp.lx-xOffset+totWidth+lp.ob.size[Rot90[lp]], y2: lp.ly-yOffset+lp.ob.size[1-Rot90[lp]]]]; ENDLOOP; -- one character -- totWidth _ totWidth + charWidth; ENDLOOP; END; -- of StringToRectangles -- GetChar: PROCEDURE [char: CHARACTER] RETURNS [cell: CellPtr]= BEGIN name: STRING _ [20]; name.length _ 0; SELECT char FROM IN ['0 .. '9] => {name[0] _ 'N; name[1] _ char; name.length _ 2}; IN ['a .. 'z] => {name[0] _ 'L; name[1] _ char-'a+'A; name.length _ 2}; IN ['A .. 'Z] => {name[0] _ 'U; name[1] _ char; name.length _ 2}; ' => AppendString[to: name, from: "SPACE"L]; '. => AppendString[to: name, from: "PERIOD"L]; ', => AppendString[to: name, from: "COMMA"L]; '( => AppendString[to: name, from: "LEFTPAREN"L]; ') => AppendString[to: name, from: "RIGHTPAREN"L]; '/ => AppendString[to: name, from: "SLASH"L]; '@ => AppendString[to: name, from: "COPYRIGHT"L]; ENDCASE => AppendString[to: name, from: "PERIOD"L]; cell _ NIL; WHILE font=NIL DO ReadFont[] ENDLOOP; FOR cp: LONG POINTER TO cList _ font, cp.nxt WHILE cp # NIL DO IF EqualString[cp.name, name] THEN BEGIN WITH dob: cp.ob SELECT FROM cell => {cell _ @dob; EXIT}; ENDCASE => NULL; END; ENDLOOP; END; -- of GetChar -- Rot90: PROCEDURE[lp: listPtr] RETURNS[[0..1]] = {RETURN[IF (lp.idx MOD 8)<4 THEN 0 ELSE 1]}; ReadFont: PUBLIC PROCEDURE = BEGIN IF font=NIL THEN BEGIN oldCellList: LONG POINTER TO cList _ cellList; cellList _ NIL; FreeString[ChipUserInt.RequestString["Do a ctl-tab-i now for the file", "you want to get the fonts from (try Font.chip).", "Then confirm this prompt with CR."]]; font _ cellList; cellList _ oldCellList; END; END; -- of ReadFont -- ReleaseFont: PUBLIC PROCEDURE = BEGIN WHILE font#NIL DO cp: LONG POINTER TO cList _ font; font _ font.nxt; IF cp.ob#NIL THEN BEGIN cp.ob.returnable _ TRUE; cp.ob.p.release[cp.ob]; -- release cell -- END; FreeString[cp.name]; FreeSpace[cp]; ENDLOOP; END; -- of ReleaseFont -- MakeCell: PUBLIC PROCEDURE[lpp: listPtr] RETURNS[ob: CellPtr, min: Point] = BEGIN lp: listPtr; max: Point _ [FIRST[locNum], FIRST[locNum]]; min _ [LAST[locNum], LAST[locNum]]; FOR lp _ lpp, lp.nxt WHILE lp # NIL DO min _ [MIN[min.x, lp.lx], MIN[min.y, lp.ly]]; max _ [ MAX[max.x, lp.lx + lp.ob.size[Rot90[lp]]], MAX[max.y, lp.ly + lp.ob.size[1 - Rot90[lp]]]]; ENDLOOP; FOR lp _ lpp, lp.nxt WHILE lp # NIL DO lp.lx _ lp.lx - min.x; lp.ly _ lp.ly - min.y; lp.selected _ FALSE; ENDLOOP; ob _ makeCell[sx: max.x - min.x, sy: max.y - min.y, cnt: 0, ptr: lpp]; END; -- of MakeCell -- DrawOb: PUBLIC PROCEDURE[ob: obPtr, min: Point] = BEGIN lp: listPtr _ makeList[ob, min.x, min.y, 0, 0]; masterList _ insertList[masterList, lp]; selNewThing[masterList, lp, TRUE]; putMark[min.x, min.y]; reDrawRect[r: getRect[lp], whenErase: 0, bw: TRUE, col: TRUE, all: FALSE]; anyChanges _ sinceIOchanges _ TRUE; END; -- of DrawOb -- END. -- of StringToRectImpl -- (635)\f7