// initfont.sr Fonts get "ALTOFILESYS.D" get "BRAVO1.DF" get "CHAR.DF" get "font.DF" get "st.DF" get "dir.DF" get "VM.DF" // Incoming Procedures external [ errhlta FillInFont LruInc lockbp unlockbp errhlt gets stcompare ratio mult umax flushvm; ] // Incoming Statics external [ mpfunfd // vfdd0 vfddfirst fddlrutimer mpfnof getvp vbp fontvis ] // Outgoing procedures external [ fillinfdd initfontwidth markrgcc markcc fillinfonth InitFdh; ] // F I L L I N F D D // let fillinfdd(fdd) be [ let fddInitial = fdd // if fdd>>FDD.fddindirect then // fdd = fdd>>FDD.fddindirect let fptr = lv (fdd>>FDD.aFptr) if fdd>>FDD.lfile eq 0 then [ let tfddDft = (mpfunfd ! 0)>>FD.fddLarge; if fdd eq tfddDft then errhlta(16) for tfun = 0 to maxfun-1 do [ let fd = mpfunfd ! tfun if fd eq fdnil then loop // if tfddDft>>FDD.lfile eq 0 then errhlt("dft"); if fd>>FD.fddSmall eq fdd then fd>>FD.fddSmall = tfddDft if fd>>FD.fddLarge eq fdd then fd>>FD.fddLarge = tfddDft ] test fdd eq vfddfirst ifso vfddfirst = fdd >> FDD.fddnext ifnot [ let tfdd1 = vfddfirst; until tfdd1 >> FDD.fddnext eq fdd do tfdd1 = tfdd1 >> FDD.fddnext tfdd1 >> FDD.fddnext = fdd >>FDD.fddnext ] // fddInitial>>FDD.fddindirect = vfdd0 fdd = tfddDft // let ifdd = valof // [ let tifdd = 0; let tfdd = vfddfirst // until tfdd eq fdd do // [ tfdd = tfdd >> FDD.fddnext // tifdd = tifdd+1 // if tfdd eq 0 then errhlt("nif") // ] // ] // fdd = vfdd0 // let trid = 0 // trid<<RID.fun = ifdd // trid<<RID.al = true //x.al font // trid<<RID.nrl = nrlmax // SetVab(abmsg,mtyAnc,231,trid) // let tsb = vec 15 // let tsb1 = vec 10 // tsb ! 0 = 0 // tsb1 ! 0 = 0 // stnum(tsb1, fdd>>FDD.height, 10, 0) // stcopy(tsb, lv(fdd>>FDD.rvsbname)) // stappend(tsb, tsb1) // stappend(tsb, ".AL") // augmentomseq("J") // fn = fnalloc() // fdd>>FDD.fn = fn // let nmd = vec lnmdMax; InitNmd(nmd, lnmdMax, tsb, vcNewest) // FindFptr(cfaSysDirEnd, lv nmd, 0, -1) // test nmd>>NMD.cver eq 0 ifso // [ // if fdd eq vfdd0 then errhlta(16) // fddInitial>>FDD.fddindirect = vfdd0 // fdd = vfdd0 // fn = fdd>>FDD.fn // stcopy(sbpast, "Could not open ") // stappend(sbpast, tsb) // vmessage = true // ] // ifnot [ // move(lv nmd>>NMD.afptr, lv fdd>>FDD.aFptr, lFP) // let dblL = vec 2 // FindCfc(fptr, dblL) // fdd>>FDD.lfile = (dblL ! 1) rshift 1 // ] // deactivateomseq("J") ] if fdd>>FDD.font eq 0 then FillInFont(fdd) fdd>>FDD.lru = LruInc(lv fddlrutimer) // unfaultfdd(fdd) if fdd>>FDD.rgcc eq 0 then [ let vpa = nil vpa<<VPA.fn = fnscrfs vpa<<VPA.fp = ((mpfnof ! fnscrfs)>>OF.macpos) rshift 9 (mpfnof ! fnscrfs)>>OF.macpos = (mpfnof ! fnscrfs)>>OF.macpos + #1000 let trgcc = getvp(vpa) let tbp = vbp lockbp(tbp) FillInFont(fdd) initfontwidth(fdd>>FDD.font, trgcc) markrgcc(trgcc) unlockbp(tbp, true) fdd>>FDD.rgcc = vpa flushvm(); ] ] // I N I T F O N T W I D T H // catalogue no. = and initfontwidth(font, rgcc) be [ if font eq 0 then errhlt("f0") let char1 = nil let xw = nil let width = nil let twidth0 = ((fontvis+chwidth0+fontvis ! chwidth0)>>ALCD.xw) rshift 1 font = font+2 for char = 0 to #377 do [ char1 = char width = 0 [ xw = (font+char1+font ! char1)>>ALCD.xw if xw<<odd then [ width = width+(xw rshift 1) break ] width = width+16 char1 = xw rshift 1 ] repeat rgcc ! char = ((xw eq xwnil) ? twidth0, width) lshift 5 ] rgcc ! chcr = 8*32 rgcc ! chtab = 8*32 rgcc ! chlf = 0 ] // M A R K R G C C // and markrgcc(rgcc) be [ markcc(rgcc, #47, #47, 0) markcc(rgcc, #60, #71, 0) markcc(rgcc, #141, #172, 0) markcc(rgcc, #101, #132, 0) markcc(rgcc, #177, #377, 1) markcc(rgcc, 0, #40, 1) markcc(rgcc, chsp, chsp, 2) markcc(rgcc, chcr, chcr, 2) markcc(rgcc, chtab, chtab, 2) markcc(rgcc, $-, $-, 2) ] // M A R K C C // catalogue no. and markcc(rgcc, chfirst, chlast, mark) be for cc = chfirst to chlast do rgcc ! cc = (rgcc ! cc) % (#100000 rshift mark) // F I L L I N F O N T H // and fillinfonth(fun, fa) = valof [ if mpfnof ! fnfontw eq -1 then errhlta(17) let fd = mpfunfd ! fun let fdh = lv fd>>FD.fdh let tsb = lv(fdh>>FDH.rvsbname) let mpfafunfadef = lv(fdh>>FDH.rvmpfafunfadef) let ix = vec offasbIxn + 10 (mpfnof ! fnfontw)>>OF.pos = 0 let fam = nil [ rv ix = gets(fnfontw) if ix>>IX.cw gr offasbIxn+10 then errhlta(18) for i = 1 to ix>>IX.cw-1 do ix ! i = gets(fnfontw) if ix>>IX.ty eq tyNil then [ (mpfafunfadef ! fa)<<FUNFA.fun = 0 (mpfafunfadef ! fa)<<FUNFA.fa = 0 resultis false ] if ix>>IX.ty eq tyixn then [ if stcompare(lv ix>>IXN.asb, tsb) eq 0 then [ fam = ix>>IXN.fam break ] ] ] repeat let famfa = (fam lshift 8)+fa let hMicas = ratio(fdh>>FDH.height, 635, 18) [ rv ix = gets(fnfontw) if ix>>IX.cw gr offasbIxn+10 then errhlta(18) for i = 1 to ix>>IX.cw-1 do ix ! i = gets(fnfontw) if ix>>IX.ty eq tyNil then [ (mpfafunfadef ! fa)<<FUNFA.fun = 0 (mpfafunfadef ! fa)<<FUNFA.fa = 0 resultis false ] if ix>>IX.ty eq tyixw then [ if ix>>IXW.famfa eq famfa & (ix>>IXW.hMicas eq hMicas % ix>>IXW.hMicas eq 0) then break ] ] repeat let chFirst = ix>>IXW.chFirst let chLast = ix>>IXW.chLast (mpfnof ! fnfontw)>>OF.pos = (lv ix>>IXW.apos) ! 1 lshift 1 let tmult = (ix>>IXW.hMicas ? 1, mult(127, fdh>>FDH.height)) let tdiv = (ix>>IXW.hMicas ? 1, 3600); let tvpa = nil tvpa<<VPA.fn = fnscrfs tvpa<<VPA.fp = ((mpfnof ! fnscrfs)>>OF.macpos) rshift 9 (mpfnof ! fnscrfs)>>OF.macpos = (mpfnof ! fnscrfs)>>OF.macpos+#1000 let trgcc = getvp(tvpa) let tbp = vbp lockbp(tbp) (lv (fdh>>FDH.rvmpfargcc)) ! fa = tvpa let wtb = ix for i = 0 to lnwtb-1 do wtb ! i = gets(fnfontw) let xwFixed = gets(fnfontw) let xwmax = 0 for ch = 0 to chFirst-1 do trgcc ! ch = 0 trgcc ! chFirst = ratio(xwFixed, tmult, tdiv) for ch = chFirst+1 to chLast do [ let txw = (wtb>>WTB.fXwfixed ? xwFixed, gets(fnfontw)) trgcc ! ch = ratio((txw eq #100000 ? 0, txw), tmult, tdiv) xwmax = umax(xwmax, trgcc ! ch) ] for ch = chLast+1 to 255 do trgcc ! ch = 0 fdh>>FDH.xwmax = xwmax markrgcc(trgcc) unlockbp(tbp, true) flushvm(); resultis true ] // I N I T F D H // and InitFdh() be [ for fun = 0 to maxfun-1 do [ let fd = mpfunfd ! fun; if fd eq fdnil then loop for fa = 0 to 3 do fillinfonth(fun,fa) ] ]