// I M P O S E W I D T H S (PREPRESS) // catalog number ??? // // Read the WDtemp file for a list of widths, and "impose" them // on the SDtemp or CDtemp file, selon the argument to ImposeWidths // Used for making fonts that "match" photo typesetter fonts. get "ix.dfs" // outgoing procedures external [ ImposeWidths ] // outgoing statics //external // [ // ] //static // [ // ] // incoming procedures external [ //WINDOW WindowRead WindowReadBlock WindowWriteBlock WindowGetPosition WindowSetPosition WindowClose //PREPRESS ReadIXTempFile PrePressWindowInit //UTIL Scream IllCommand FSGetX FSPut //OS SetBlock //FLOAT FLDI; FDV; FML; FTR; FST; FSTDP; FLD ] // incoming statics //external // [ // ] // internal statics //static // [ // ] // File-wide structure and manifest declarations. // Procedures let ImposeWidths(fType) be [ //Get widths file: let sw=PrePressWindowInit(-3) //WDtemp let fnw=vec IXLName let ixw=vec IXLMax ReadIXTempFile(sw, fnw, ixw) let ncw=ixw>>IX.ec-ixw>>IX.bc+1 let bbw=vec size WTB/16 WindowReadBlock(sw, bbw, size WTB/16) let xWidthVec=vec 256 let yWidthVec=vec 256 for i=0 to 1 do [ let p=(i eq 0)? xWidthVec,yWidthVec test ((i eq 0)? bbw>>WTB.XWidthFixed, bbw>>WTB.YWidthFixed) ifso SetBlock(p, WindowRead(sw), ncw) ifnot WindowReadBlock(sw, p, ncw) ] WindowClose(sw) //Get CDtemp or SDtemp let si=PrePressWindowInit(-fType) let fn=vec IXLName let ix=vec IXLMax ReadIXTempFile(si, fn, ix) //Now compute scale factors: x in 3, y in 4 test fType eq 2 then //Imposing on spline widths [ FLDI(3, 1); FLDI(4, 1000); FDV(3, 4); FLD(4, 3) // 1/1000 if ixw>>IX.siz ne 0 then Scream("Cannot impose absolute widths on splines") ] or test fType eq 1 then [ FLDI(3, 1); FLDI(4, 1) if ixw>>IX.siz eq 0 then [ FLDI(1, ix>>IX.siz) //Micas FLDI(2, 1000) FDV(1, 2) // Size/1000 FLDI(2, 25400) // 2540*10 (because resolution is x 10) FDV(1, 2) FLDI(3, ix>>IX.resolutionx); FML(3, 1) FLDI(4, ix>>IX.resolutiony); FML(4, 1) ] ] or IllCommand() let fp=vec 1 WindowGetPosition(si, fp) //Remember for re-writing let nc=ix>>IX.ec-ix>>IX.bc+1 let wSiz=((fType eq 1)? CharWidthsize, SplineWidthsize) let tl=nc*wSiz let WD=FSGetX(tl) WindowReadBlock(si, WD, tl) for c=ix>>IX.bc to ix>>IX.ec do [ let p=(c-ix>>IX.bc)*wSiz+WD let charAbsent=nil test fType eq 1 then charAbsent=(p>>CharWidth.H eq HNonExCode) or charAbsent=(p!0 eq 0)&(p!1 eq -1) unless charAbsent then [ let xWidth=#100000 let yWidth=#100000 let relC=c-ixw>>IX.bc if relC ge 0 & relC ls ncw then xWidth,yWidth=xWidthVec!relC, yWidthVec!relC if xWidth ne #100000 & yWidth ne #100000 then [ FLDI(1, xWidth); FML(1, 3) FLDI(2, yWidth); FML(2, 4) test fType eq 1 ifso [ FSTDP(1, lv p>>CharWidth.WX) FSTDP(2, lv p>>CharWidth.WY) ] ifnot [ FST(1, lv p>>SplineWidth.WX) FST(2, lv p>>SplineWidth.WY) ] ] ] ] //Now put the updated widths back out on the file. WindowSetPosition(si, fp) WindowWriteBlock(si, WD, tl) WindowClose(si) FSPut(WD) ]