// C O N V E R T C O M (PREPRESS)
// catalog number ???
//
//Convert(thicken)
// Processes the convert command
//
get "ix.dfs"
// outgoing procedures
external
[
Convert
]
// outgoing statics
//external
// [
// ]
//static
// [
// ]
// incoming procedures
external
[
//PREPRESS
PrePressWindowInit
CheckParams
ReadIXTempFile
WriteIXTempFile
SetPosRelative
GetPosRelative
TypeChar
IllCommand
//UTIL
CheckAC
Zero
MoveBlock
FSGetX
FSPut
//WINDOW
WindowReadBlock
WindowGetPosition
WindowSetPosition
WindowWriteBlock
WindowClose
//CONVERT
SetSCVTransform
ConvertAWidth
ConvertAChar
//SCAN
TypeForm
]
// incoming statics
external
[
@siz //Point size of font
@rotation //Rotation of font
@incline //Incline of font
@resolutionx //Resolutions
@resolutiony
@convertThicken
@convertOrbitized
]
// internal statics
//static
// [
// ]
// File-wide structure and manifest declarations.
manifest [ ACtemp=-1;SDtemp=-2
]
// Procedures
//CONVERT command processor. Included here so that the file
// CONVERT.C can be used by the fonts pass without requiring all
// this stuff.
let Convert(thicken,inFile,outFile;numargs na) be [
convertThicken=thicken
unless CheckParams(gotsize+gotresolution) then IllCommand()
if na ls 3 then [ inFile=SDtemp;outFile=ACtemp]
let ws=PrePressWindowInit(inFile,false) //SDtemp
let wc=PrePressWindowInit(outFile) //ACtemp
let fn=vec IXLName
let ixo=vec IXLMax
ReadIXTempFile(ws,fn,ixo)
let ix=vec IXLMax
MoveBlock(ix,ixo,IXLMax) //IX is the new one, ixo the old
ix>>IX.Type=convertOrbitized?IXTypeOrbitChars,IXTypeChars
ix>>IX.siz=siz
ix>>IX.rotation=rotation
ix>>IX.resolutionx=resolutionx
ix>>IX.resolutiony=resolutiony //Remember for matches.
let bc=ix>>IX.bc
let ec=ix>>IX.ec
let nc=ec-bc+1
let WT=FSGetX(nc*SplineWidthsize)
WindowReadBlock(ws,WT,nc*SplineWidthsize)
let offo=vec 1
WindowGetPosition(ws,offo) //AC offset
let AC=FSGetX(nc*2)
WindowReadBlock(ws,AC,nc*2)
let CWT=FSGetX(nc*CharWidthsize)
Zero(CWT, nc*CharWidthsize) //All widths 0, even of undef chars
//Write new file.
WriteIXTempFile(wc,fn,ix) //Write directories.
WindowGetPosition(wc,lv ix>>IX.sa) //Remember base address
WindowWriteBlock(wc,CWT,nc*CharWidthsize)
let offn=vec 1
WindowGetPosition(wc,offn) //AC offset for new ones
WindowWriteBlock(wc,AC,nc*2)
SetSCVTransform(siz,rotation,incline,resolutionx,resolutiony)
let bbgood=((rotation rem (60*90)) eq 0) & (incline eq 0)
let p=vec size Convert/16 //Prepare parameters
p>>Convert.SplineOk=false //Characters only!
p>>Convert.PressFontPart=false
p>>Convert.BBGood=bbgood
p>>Convert.Monotone=bbgood //If no rotation, splines monotone
let ps=WT; let pc=CWT
for c=1 to nc do
[
ConvertAWidth(ps,pc,p)
ps=ps+SplineWidthsize
pc=pc+CharWidthsize
]
pc=CWT
for c=0 to nc-1 do
[
if AC!(c*2) ne -1 then
[ //Convert character.
SetPosRelative(ws,offo,AC+c*2)
GetPosRelative(wc,offn,AC+c*2) //Save new position.
TypeChar(c+bc) //Signal we are converting
let pnc=vec CharWidthsize
let res=ConvertAChar(ws,wc,pnc,p,FSGetX,FSPut) //Do the work.
if res ne 0 then TypeForm("Error, ConvertAChar returns ",10,res,0)
//If bbgood, check to see if bounding box was computed correctly.
// (see comments in ConvertAWidth)
if bbgood then
if pc>>CharWidth.XL ne pnc>>CharWidth.XL %
pc>>CharWidth.YB ne pnc>>CharWidth.YB %
pc>>CharWidth.W ne pnc>>CharWidth.W %
pc>>CharWidth.H ne pnc>>CharWidth.H then
TypeForm(" [Bounding box incorrect.]")
//Store bounding box information into WT table.
pc>>CharWidth.XL=pnc>>CharWidth.XL
pc>>CharWidth.YB=pnc>>CharWidth.YB
pc>>CharWidth.W=pnc>>CharWidth.W
pc>>CharWidth.H=pnc>>CharWidth.H
CheckAC(pc)
TypeForm(0)
]
pc=pc+CharWidthsize
] //Convert loop
let tl=vec 1; WindowGetPosition(wc,tl)
GetPosRelative(wc,lv ix>>IX.sa,lv ix>>IX.len) //Save length
WindowSetPosition(wc,table [ 0;0 ]) //At beginning
WriteIXTempFile(wc,fn,ix) //ReWrite directory
WindowWriteBlock(wc,CWT,nc*CharWidthsize) // Write WT
WindowWriteBlock(wc,AC,nc*2) // and AC
WindowClose(ws)
WindowClose(wc,tl) //Close & truncate
FSPut(AC); FSPut(WT); FSPut(CWT)
]