home *** CD-ROM | disk | FTP | other *** search
- /* CMD: Compose Text
- * By Stuart Ferguson
- * Layout text line -- Modeler ARexx program
- */
-
- /* trace results */
-
- address "LWModelerARexx.port"
- libadd = addlib("LWModelerARexx.port",0)
-
- check = addlib("rexxmathlib.library",0,-30,0)
-
-
- sysnam = "Compose Text"
-
- call req_begin sysnam
-
- id_fdir = req_addcontrol(" Font Directory", 's')
- id_fam = req_addcontrol(" Font Family", 's')
- id_txt = req_addcontrol("String to Compose", 's')
-
- call req_setval id_fdir, "Objects/Fonts/"
- call req_setval id_fam, "Common"
-
- if (~req_post()) then exit
-
- fontdir = req_getval(id_fdir)
- family = req_getval(id_fam)
- txt = req_getval(id_txt)
-
- call req_end
-
- basefont = fontdir || family || "/" || family || "."
- fin = curlayer()
- empty = emptylayers()
- scr = word(empty, 1)
- if (scr = fin) then scr = word(empty, 2)
-
- if (scr == "") then do
- call notify 1, '@'sysnam, "!Need an empty layer for scratch work."
- exit 10
- end
-
- badchar = ""
-
- /* Compute spacing based on width of "M" character.
- */
- setlayer scr
- mfil = charfile("M")
- if (mfil = "") then do
- call notify 1, '@'sysnam, "!Problem with font:" basefont
- exit 10
- end
- load mfil
- parse value boundingbox() with num x0 x1 y0 y1 z0 z1 .
- gap = (x1 - x0) / 10
- space = (x1 - x0) / 2
- dy = (y1 - y0) / 5
- blot = "makebox l[" || -gap/2 "," y0+dy "," z0 "] h[" gap/2 "," y1-dy "," z1 "]"
- delete
-
- /* Load first character into final layer and set start and insertion
- * points.
- */
- setlayer fin
- delete
- parse value loadfont(substr(txt,1,1)) with x0 x1
-
- /* Load remaining letters.
- */
- do i=2 to length(txt)
- chr = substr(txt,i,1)
- if (chr = ' ') then do
- /* Process spaces by just adding to insertion point.
- */
- x1 = x1 + space
- end; else do
- /* Load any real characters into the scratch buffer and shift to
- * final position. Move them to final buffer and advance
- * insertion point.
- */
- setlayer scr
- parse value loadfont(chr) with p0 p1
- move '[' (x1 + gap - p0) ',,]'
- cut
- setlayer fin
- paste
- x1 = x1 + (p1 - p0) + gap
- end
- end i
-
- /* Center text in final layer.
- */
- move '[' (x0 + x1) / -2 ',,]'
-
- /* Inform user about bad characters in string, if any.
- */
- if (badchar ~= "") then call notify 1, '@'sysnam, '!Characters not
- found in font: "' || badchar || '"'
-
- if (libadd) then call remlib("LWModelerARexx.port")
- exit
-
-
- /* Load a character and return X-extent.
- */
- loadfont: procedure expose basefont blot badchar
- parse arg chr
- fil = charfile(chr)
- if (fil = "") then do
- blot
- badchar = badchar || chr
- end; else load fil
- parse value boundingbox() with num x0 x1 .
- return x0 x1
-
-
- /* Get the filename for a character from the base font name. Checks for
- * file existence. Name is returned in double quotes for Modeler command
- * formatting.
- */
- charfile: procedure expose basefont
- parse arg ch
- let = ch
- if (ch >= 'A' & ch <= 'Z') then let = "Cap." || ch
- else if (ch = ':' | ch = '/') then let = "Junk"
- else do
- p = pos(ch, '.?()&$,!#%')
- if (p ~= 0) then let = word('Period Question LeftParen RightParen ',
- || 'Ampersand DollarSign Comma Exclamation ',
- || 'NumberSign PercentSign', p)
- end
- nam = basefont || let
- if (~exists(nam)) then return ""
- return ('"' || nam || '"')
-