// O R B I T F O R M A T (PREPRESS) // catalog number ??? // // Puts CDtemp file into Orbit font format, and types out size of // character encodings. get "ix.dfs" // outgoing procedures external [ OrbitFormat ] // outgoing statics //external // [ // ] //static // [ // ] // incoming procedures external [ //WINDOW WindowRead WindowReadBlock WindowWrite WindowWriteBlock //MAPCDTEMP MapCDtemp //PREPRESSUTIL FSGetX FSPut Scream TypeForm //OS Noop DoubleAdd Zero SetBlock MoveBlock ] // incoming statics //external // [ // ] // internal statics static [ pack=true ] // File-wide structure and manifest declarations. let OrbitFormat() be [ let v=vec 1 v!0=0 MapCDtemp(Noop, OrbitOne, v) TypeForm(10, v!0, " words of font storage.") ] and OrbitOne(p, si, so, arg) be [ let masks=vec 16 for i=0 to 15 do masks!i=(-1) rshift i //Find out dimensions of char let a=WindowRead(si) let hw= a<<FHEAD.hw let ns=a<<FHEAD.ns let hb=p>>CharWidth.H // Place here "hb=16*hw" if you want unpacked fonts. unless pack then [ hb=16*hw; p>>CharWidth.H=hb ] // let hhw=(hb+15)/16 if hhw ne hw then Scream("Character height inconsistency") // sizeNeeded ← (hb*ns+15)/16 let mul=vec 1 DoubleMul(mul, hb, ns) DoubleAdd(mul, table [ 0;15 ] ) let sizeNeeded=(mul!0 lshift 12)+(mul!1 rshift 4) if sizeNeeded then [ sizeNeeded=(sizeNeeded+3)&(-2) //Account for header; even num let pbits=FSGetX(sizeNeeded+1) //1 extra because of p!1 below pbits!0=-hb //Height pbits!1=ns-1 //Width let p=pbits+2 let ob=0 for i=1 to ns do [ for j=1 to hw do [ let w=WindowRead(si) p!0=(p!0&(not masks!ob))+(w rshift ob) p!1=(p!1&(masks!ob))+(w lshift (16-ob)) p=p+1 ] ob=ob+hb p=p-hw+ob/16 ob=ob ] WindowWriteBlock(so, pbits, sizeNeeded) arg!0=arg!0+sizeNeeded FSPut(pbits) ] ] and DoubleMul(res, a, b) be [ let ad=vec 1 ad!0=0; ad!1=a res!0=0; res!1=0 for i=1 to b do DoubleAdd(res, ad) ]