//
// initialization for redraw
// Copyright 1980 Bruce D. Lucas
//
get "Redraw.d"
get "Streams.d"
let UserCmGet() be [
BrushTable = GetFixed((size FONTS)/16)
TextTable = GetFixed((size FONTS)/16)
if (BrushTable eq 0) % (TextTable eq 0) do Abort("can't allocate")
ParseFontFileName("Helvetica12",TextTable,0)
ParseFontFileName("Helvetica12b",TextTable,1)
ParseFontFileName("Helvetica8",TextTable,2)
ParseFontFileName("Arrows10",TextTable,3)
// this is a crock
ParseFontFileName("NEWVEC4",BrushTable,0)
ParseFontFileName("SNEWVEC8",BrushTable,1)
ParseFontFileName("HNEWVEC16",BrushTable,2)
ParseFontFileName("VNEWVEC32",BrushTable,3)
let UserCmStream = OpenFile("User.Cm",ksTypeReadOnly,charItem)
if UserCmStream eq 0 do return
let section = vec 128
let label = vec 128
let line = vec 128
let fontno = nil
let psize = nil
let type = ReadUserCmItem(UserCmStream,section)
while type ne $E do [
test (type eq $N)
& (StringEqual(section,"REDRAW",false) % StringEqual(section,"DRAW",false)) ifso [
[ type=ReadUserCmItem(UserCmStream,label); if type ne $L break
if ReadUserCmItem(UserCmStream,line) ne $P do
Abort("Bad User.Cm item. Garbled line")
test StringEqual(label,"FONT",false) ifso [
fontno = StripNum(line)
if (fontno ls 0) % (fontno gr 3) do Abort("Bad User.Cm item. Line width num out of range")
ParseFontFileName(line,TextTable,fontno)
] ifnot test StringEqual(label,"LINEWIDTH",false) ifso [
fontno = StripNum(line)
if (fontno ls 0) % (fontno gr 3) do Abort("Bad User.Cm item. Font num out of range")
psize = StripNum(line)/4
BrushTable>>FONTS↑fontno.Size = psize
] ifnot test StringEqual(label,"DASHON",false) ifso [
DashOn = StripNum(line)
] ifnot test StringEqual(label,"DASHOFF",false) ifso [
DashOff = StripNum(line)
] ifnot [
Abort("Bad DRAW or REDRAW User.cm entry")
]
] repeat
CopyString(label,section)
] ifnot [
type = ReadUserCmItem(UserCmStream,section)
]
]
Closes(UserCmStream)
]
and let StripNum(string) = valof [
let result = 0
let length = string>>STRING↑0
let posn = 1
let char = nil
while (posn le length) & (string>>STRING↑posn eq $*s) do posn = posn + 1
while (posn le length) & (string>>STRING↑posn ge $0) & (string>>STRING↑posn le $9) do [
result = result*10 + string>>STRING↑posn - $0
posn = posn + 1
]
while (posn le length) & (string>>STRING↑posn eq $*s) do posn = posn + 1
let newlength = 0
while posn le length do [
newlength = newlength + 1
string>>STRING↑newlength = string>>STRING↑posn
posn = posn + 1
]
string>>STRING↑0 = newlength
resultis result
]
and let ParseFontFileName(FileName,FontTable,fontno) be [
let part = 0 // Helvetica12b: 0="Helvetica", 1="10", 2="b"
let BoldFace = 0; let ItalicFace = 0
let IsNum = nil; let char = nil
FontTable>>FONTS↑fontno.Size = 0
FontTable>>FONTS↑fontno.Family↑0 = 0
FontTable>>FONTS↑fontno.ALFileName↑0 = 0
FontTable>>FONTS↑fontno.Baseline = -1
for i=1 to FileName>>STRING↑0 do [
char = FileName>>STRING↑i
if char eq $. do break
FontTable>>FONTS↑fontno.ALFileName↑i = char
FontTable>>FONTS↑fontno.ALFileName↑0 = FontTable>>FONTS↑fontno.ALFileName↑0 +1
test (char ge $0) & (char le $9) ifso IsNum = true; ifnot IsNum = false
if (part eq 0) & IsNum do part = 1
if (part eq 1) & not IsNum do part = 2
switchon part into [
case 0:
FontTable>>FONTS↑fontno.Family↑i = char
FontTable>>FONTS↑fontno.Family↑0 = FontTable>>FONTS↑fontno.Family↑0 +1
endcase
case 1:
FontTable>>FONTS↑fontno.Size = FontTable>>FONTS↑fontno.Size*10 + char - $0
endcase
case 2:
switchon char into [
case $b: case $B: BoldFace = 2; endcase // bold adds 2 to face
case $i: case $I: ItalicFace = 1; endcase // italic adds 1
default: Abort("unrecognized face modifier in font file name")
]
endcase
default: Abort("internal error")
]
]
// add .AL extension
AppendString(".AL",lv(FontTable>>FONTS↑fontno.ALFileName))
FontTable>>FONTS↑fontno.Face = BoldFace + ItalicFace
]
and let InitFloat() be [
LoadRam(MicroFloatRamImage)
PSzone = sysZone
let FloatAcs = GetFixed((4*NumAcs)+1); FloatAcs!0 = NumAcs
if FloatAcs eq 0 do Abort("can't allocate FloatAcs")
FPSetup(FloatAcs)
FLDI(KOne,1) // 1 into KOne
FLDI(KTwo,2) // 2 into KTwo
FLDI(KSix,6) // 6 into KSix
FLDI(KHalf,1) // 0.5 into KHalf
FDV(KHalf,KTwo)
FLDI(KAltoDover,MICASperALTO)// (32 micas/altodot)*(384 doverscans/in)
FLDI(TEMP,SCANSperIN) // --------------------------------------
FMP(KAltoDover,TEMP) // (2540 micas/in)
FLDI(TEMP,MICASperIN) //
FDV(KAltoDover,TEMP) // = KAtloDover doverscans/altodot
FLDI(KEpsilon,1) // epsilon to replace x' or y' if 0
FLDI(TEMP,30000)
FDV(KEpsilon,TEMP)
]
and let Abort(msg) be [
PutTemplate(dsp,"$S",msg)
OsFinish(1)
]
and let WaitForKey() be [
let c=vec 1
Gets(keys,c)
]