// M A K E W I D T H S (PREPRESS) // //Last modified April 21, 1980 9:35 PM by Lyle Ramshaw, PARC: // adjusted call on EncodeFace to allow for new, funny faces. get "ix.dfs" get "scan.dfs" // outgoing procedures external [ MakeWidths ] // incoming procedures external [ //WINDOW WindowWriteBlock WindowClose WindowWrite WindowGetPosition WindowSetPosition //PREPRESS PrePressWindowInit WriteIXTempFile GetPosRelative Scream IllCommand //SCAN ScanInit ScanClose ScanSet Scan ScanFor ScanGiveID ReadNumber PrintFloat StrEq StrCop ReadCom //FLOAT FTR; FML; FLDI; FLD; FAD; FDV //FONTWIDTHS EncodeFace //UTIL MulDiv //OS SetBlock Zero ] external @ScanSavedLetter //from Scan manifest [ mwXL=0 mwYB=1 mwXW=2 mwYH=3 mwNAME=4 mwSIZE=5 mwFACE=6 mwWIDTHS=7 mwSCALE=8 ] structure STRING [ length byte; char ↑1,255 byte ] let MakeWidths(inFileName,outFileName;numargs n) be [ let str=vec 20 if n eq 0 then [ if ReadCom(str) eq 0 then IllCommand() inFileName=str outFileName="WDtemp" ] let b=vec SCANIlen ScanInit(b, inFileName) ScanSet(b) let wt=vec 256 SetBlock(wt, #100000, 256) let fn=vec IXLName let ix=vec IXLWidths let wtb=vec size WTB/16 Zero(fn, IXLName) Zero(ix, IXLWidths) Zero(wtb, size WTB/16) FLDI(5, 1) //Scale factor FLDI(6, 1); FLDI(7, 2); FDV(6, 7) // 1/2 for rounding [MWloop let c=Scan() if c eq ID then c=mwID(ScanGiveID()) switchon c into [ case mwXL: case mwYB: case mwXW: case mwYH: [ compileif mwXL ne offset WTB.XL/16 then [ foo=nil ] compileif mwYB ne offset WTB.YB/16 then [ foo=nil ] compileif mwXW ne offset WTB.XW/16 then [ foo=nil ] compileif mwYH ne offset WTB.YH/16 then [ foo=nil ] ScanFor(NUMBER) wtb!c=FTR(1) endcase ] case mwNAME: [ ScanFor(ID) StrCop(ScanGiveID(), lv fn>>IXN.Name) endcase ] case mwSIZE: [ ScanFor(NUMBER) let m=FTR(1) ix>>IX.siz=MulDiv(m, 635, 18) endcase ] case mwFACE: [ let faceByte=nil switchon Scan() into [ case NUMBER: [ // We want to call EncodeFace, but it // expects its argument in string form, so: let str=vec 10 PrintFloat(str, 1) faceByte=EncodeFace(str) endcase ] case ID: [ let s=ScanGiveID() faceByte=EncodeFace(s) endcase ] default: Scream("Illegal face code") ] if faceByte eq -1 then Scream("Illegal face code") ix>>IX.face=faceByte endcase ] case mwSCALE: [ ScanFor(NUMBER) FLD(5, 1) endcase ] case mwWIDTHS: [ let letid=vec 20 let letnum=nil [ letnum=-1 c=Scan() let s=ScanGiveID() test c eq NUMBER then [ let l=s>>STRING.length test l ne 1 then [ l=l+1 s>>STRING.char↑l=$Q s>>STRING.length=l letnum=ReadNumber(s) ] or letnum=FTR(1)+$0 ] or [ test StrEq(s, "STOP") then break or test StrEq(s, "ALL") then letnum=-2 or letnum=ScanSavedLetter //w/o upper case ] c=Scan() if c ne NUMBER then mwScream() FML(1, 5); FAD(1, 6) //Scale it. let val=FTR(1) test letnum eq -2 then for i=0 to 255 do wt!i=val or wt!letnum=val ] repeat break //All done ] default: mwScream() ] ]MWloop repeat ScanClose() //Now actually write the output file: let w=PrePressWindowInit(outFileName, true) let bc,ec=257,-1 for i=0 to 255 do if wt!i ne #100000 then [ if i ls bc then bc=i if i gr ec then ec=i ] ix>>IX.bc=bc; ix>>IX.ec=ec ix>>IX.Type=IXTypeWidths ix>>IX.Length=IXLWidths WriteIXTempFile(w, fn, ix) let xfixed=true for i=bc to ec do if wt!i ne wt!bc then xfixed=false //Now write the WTB header if xfixed then wtb>>WTB.XWidthFixed=true wtb>>WTB.YWidthFixed=true WindowWriteBlock(w, wtb, size WTB/16) test xfixed then WindowWrite(w, wt!bc) or for i=bc to ec do WindowWrite(w, wt!i) WindowWrite(w, 0) //Fix up lengths let cp=vec 1 WindowGetPosition(w, cp) GetPosRelative(w, lv ix>>IX.sa, lv ix>>IX.len) WindowSetPosition(w, table [ 0;0 ] ) WriteIXTempFile(w, fn, ix) WindowSetPosition(w, cp) WindowClose(w) ] and mwID(s)= valof [ if StrEq(s, "XL") then resultis mwXL if StrEq(s, "YB") then resultis mwYB if StrEq(s, "XW") then resultis mwXW if StrEq(s, "YH") then resultis mwYH if StrEq(s, "NAME") then resultis mwNAME if StrEq(s, "SIZE") then resultis mwSIZE if StrEq(s, "FACE") then resultis mwFACE if StrEq(s, "WIDTHS") then resultis mwWIDTHS if StrEq(s, "SCALE") then resultis mwSCALE mwScream() ] and mwScream() be Scream("Illegal widths file.")