home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / psroff3.0 / patch11 < prev    next >
Text File  |  1993-05-02  |  82KB  |  3,103 lines

  1. Newsgroups: comp.sources.unix
  2. From: clewis@ferret.ocunix.on.ca (Chris Lewis)
  3. Subject: v26i202: psroff 3.0, Patch11
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: clewis@ferret.ocunix.on.ca (Chris Lewis)
  8. Posting-Number: Volume 26, Issue 202
  9. Archive-Name: psroff3.0/patch11
  10.  
  11. Return-Path: @mail.uunet.ca:clewis@ecicrl
  12. Received: by cognition.pa.dec.com; id AA13413; Sat, 23 May 92 23:36:10 -0700
  13. Received: by inet-gw-2.pa.dec.com; id AA10808; Sat, 23 May 92 23:35:56 -0700
  14. Received: from relay1.UU.NET by rodan.UU.NET with SMTP (5.61/UUNET-mail-drop) id AA06901; Sun, 24 May 92 02:35:50 -0400
  15. Received: from mail.uunet.ca (via uunet.ca) by relay1.UU.NET with SMTP (5.61/UUNET-internet-primary) id AA19773; Sun, 24 May 92 02:35:21 -0400
  16. Received: from ecicrl by mail.uunet.ca with UUCP id <10267>; Sun, 24 May 1992 02:35:14 -0400
  17. Received: by ferret.ocunix.on.ca (smail2.5)id AA23512; 24 May 92 01:48:39 EDT (Sun)
  18. Message-Id: <9205240148.AA23512@ferret.ocunix.on.ca>
  19. Date: Sun, 24 May 1992 01:48:39 -0400
  20. From: clewis@ferret.ocunix.on.ca (Chris Lewis)
  21. To: comp-sources-unix@uunet.UU.NET
  22.  
  23. Archive-name: psroff3.0/patch.11
  24. Submitted-by: clewis@ferret.ocunix.on.ca (Chris Lewis)
  25.  
  26.     This is official patch 11 for Psroff 3.0.
  27.     Please apply it by:
  28.     cd <psroff source directory>
  29.     touch checker.S pkscale.c (some v's of patch need this)
  30.     patch -N -p < <this file>
  31.     
  32.     The base release of psroff3.0 patches 1-4 were in
  33.     comp.sources.unix volume 24, 5-7 in volume 25 and 8-10
  34.     in volume26.
  35.  
  36. Highlights:
  37.     - Many optimization improvements of PostScript output:
  38.         - shortened font change sequences.
  39.         - can optimize horizontal line drawing (LJ3 too)
  40.         - line optimization (as opposed to "word")
  41.         - parameterize "." widths.
  42.         - parameterizable in psrofflib.S
  43.       For some metrics: perl man page: 1.5Mb unoptimized;
  44.       550K optimized; 270K with line optimization (better than
  45.       groff!!! ;-).  Shortened font change stuff saves ~5%.
  46.       Period width saves ~5%.  See troff2ps manual page "-g"
  47.       option for more detail.  Default: same as before - set
  48.       in psrofflib.S file.
  49.     - brand new configuration checker.  Try "make check".
  50.       Much simpler and more accurate.  "audit" is now obsolete.
  51.     - pk2sfp can now scale Laserjet fonts.  Not real well,
  52.       but usable, particularly when you're creating small
  53.       point sizes from big ones.  See manual page.  Eventually,
  54.       pkscale may be automatic in troff2ps, but for now, strictly
  55.       an auxiliary program.
  56.     - PostScript now supports European character set, compatible
  57.       with LJIII and "standard" troff naming conventions.
  58.       This is only available from CAT troff now.  The width
  59.       tables will be fixed for ditroff in next patch.  Note
  60.       "RE" function in ps.lib, and "_" prefixes in ps.fonts.
  61.     - line widths in LJ3 fixed to be consistant with box
  62.       characters and groff.
  63.     - installdit can now handle other ASCII-width-table-needing
  64.       ditroffs (eg: DWB 3.x), and installs groff tables properly.
  65.     - install permission fixing.
  66.     - Can handle font numbers > 9 (nonstandard ditroffs,
  67.       groff and DWB 3)
  68.  
  69. Files affected in this patch:
  70.  
  71.     ./man/pk2sfp.1.S
  72.     ./man/troff2ps.1.S
  73.     ./lib/lj3.fonts
  74.     ./lib/lj3.lib
  75.     ./lib/ps.fonts
  76.     ./lib/ps.lib
  77.     ./lib/psrofflib.S
  78.     ./lib/lj3u.fonts
  79.     ./widths/installdit.S
  80.     ./utils/Makefile
  81.     ./utils/pk2ps.c
  82.     ./utils/pk2sfp.c
  83.     ./utils/psxlate.c
  84.     ./utils/showfont.S
  85.     ./adapters/Makefile
  86.     ./checker.S
  87.     ./utils.c
  88.     ./ps.c
  89.     ./dit.c
  90.     ./README
  91.     ./troff2.c
  92.     ./defs.h
  93.     ./INSTALL
  94.     ./Makefile
  95.     ./opt.c
  96.     ./pkscale.c
  97.     ./pk.c
  98.  
  99. Patchwrapped: 920523223715
  100.  
  101. Index: ./man/pk2sfp.1.S
  102. *** /tmp/PATCHold/./man/pk2sfp.1.S    Sat May 23 22:29:26 1992
  103. --- ./man/pk2sfp.1.S    Sat May 23 22:29:32 1992
  104. ***************
  105. *** 1,4 ****
  106. ! .\"Copyright 1988 by Chris Lewis 91/03/20
  107.   .TH PK2SFP %%MANEXT%% "Psroff %%T2VERSION%%"
  108.   .SH NAME
  109.   pk2sfp,pk2ditwid,pktype,pk2ps \- PK/SFP format font file handling utilities
  110. --- 1,4 ----
  111. ! .\"Copyright 1988 by Chris Lewis 92/05/19
  112.   .TH PK2SFP %%MANEXT%% "Psroff %%T2VERSION%%"
  113.   .SH NAME
  114.   pk2sfp,pk2ditwid,pktype,pk2ps \- PK/SFP format font file handling utilities
  115. ***************
  116. *** 108,113 ****
  117. --- 108,119 ----
  118.   .SH "Additional options for pk2sfp"
  119.   .PP
  120.   The
  121. + .BI "\-o" size
  122. + option will scale the input fonts to the point size specified
  123. + by
  124. + .BR size .
  125. + .PP
  126. + The
  127.   .BI "\-s" na
  128.   option will set the symbol set.
  129.   Eg:
  130. ***************
  131. *** 529,534 ****
  132. --- 535,543 ----
  133.   .B pk2sfp "'s"
  134.   partial downloading feature (by including characters that you don't
  135.   really need - which is harmless).
  136. + .PP
  137. + The \-o option only really works well when you're going *down*
  138. + in size.
  139.   .SH "SEE ALSO"
  140.   troff2ps(%%MANEXT%%), \fIlj.fonts\fP,
  141.   Hewlett Packard's HP Laserjet Reference Manuals.
  142. Index: ./man/troff2ps.1.S
  143. *** /tmp/PATCHold/./man/troff2ps.1.S    Sat May 23 22:29:54 1992
  144. --- ./man/troff2ps.1.S    Sat May 23 22:29:56 1992
  145. ***************
  146. *** 1,4 ****
  147. ! .\"Copyright 1988 by Chris Lewis 2.14 91/11/13
  148.   .TH TROFF2PS %%MANEXT%% "Psroff %%T2VERSION%%"
  149.   .SH NAME
  150.   troff2ps, troff2lj, troff2xx \- convert troff output to Postscript, HP etc.
  151. --- 1,4 ----
  152. ! .\"Copyright 1988 by Chris Lewis 2.16 92/05/23
  153.   .TH TROFF2PS %%MANEXT%% "Psroff %%T2VERSION%%"
  154.   .SH NAME
  155.   troff2ps, troff2lj, troff2xx \- convert troff output to Postscript, HP etc.
  156. ***************
  157. *** 20,25 ****
  158. --- 20,26 ----
  159.   .B "[\-M]"
  160.   .B "[\-S]"
  161.   .BI "[\-G" ss "]"
  162. + .BI "[\-g" opt "]"
  163.   .SH DESCRIPTION
  164.   .I Troff2ps
  165.   takes
  166. ***************
  167. *** 166,172 ****
  168.   else, or the final directory name is different from the
  169.   .B \-T
  170.   value (ie: with ditroff).
  171. - See psrofflib entry "ops" for an example.
  172.   The
  173.   .B \-W
  174.   option is ignored unless
  175. --- 167,172 ----
  176. ***************
  177. *** 173,178 ****
  178. --- 173,219 ----
  179.   .B \-Z
  180.   is specified.
  181.   .PP
  182. + The
  183. + .B \-g
  184. + option is an extended version of
  185. + .BR \-Z .
  186. + .B \-g
  187. + consists of a string containing one or more of the following:
  188. + a period (``.''), or an l (lower case L) or a decimal number.
  189. + The decimal number must be last.
  190. + The period indicates that the width table entries for a period
  191. + are correct.
  192. + Many PostScript printers have slightly different metrics for
  193. + periods.
  194. + To test, run ``showfont | <your printer>'' and examine the
  195. + box containing the period.
  196. + The number second from the bottom on the left side should be 25.
  197. + If it is, you can supply the ``.'' option.
  198. + If not, you will have to regenerate all of your width tables
  199. + using psdtwid before you can safely specify ``.''.
  200. + Turning ``.'' on typically saves about 10-15% in PostScript
  201. + file size.
  202. + .PP
  203. + The ``l'' suboption enables line optimization.
  204. + This causes
  205. + .B troff2ps
  206. + to assemble whole lines worth of
  207. + text into single string emissions rather than breaking on
  208. + inter-word spaces.
  209. + This can save as much as 50% of the file size and transmission
  210. + time, as well as significantly speeding up your printer.
  211. + .PP
  212. + The decimal number tells the optimizer how big a string to
  213. + coalesce.
  214. + The default is 15.
  215. + Setting ``l'' implies 150.
  216. + .PP
  217. + .B \-Z
  218. + is equivalent to
  219. + .BR \-g15 .
  220. + .B \-g.l
  221. + is the highest possible optimization level.
  222. + .PP
  223.   Ditroff output is a special case with respect to optimization.
  224.   The optimal form for emitting characters in ditroff is something
  225.   like ``\f3c\f2CnnCnnCnnC\f3w\f1'',
  226. ***************
  227. *** 187,192 ****
  228. --- 228,235 ----
  229.   .PP
  230.   If
  231.   .B \-Z
  232. + or
  233. + .B \-g
  234.   is specified,
  235.   but
  236.   .B \-n
  237. ***************
  238. *** 195,200 ****
  239. --- 238,245 ----
  240.   with any ditroff backend.
  241.   If both
  242.   .B \-Z
  243. + or
  244. + .B \-g
  245.   and
  246.   .B \-n
  247.   are specified, ``words'' are emitted as ``\f3t\f2CCCCC\f1'', which
  248. Index: ./lib/lj3.fonts
  249. *** /tmp/PATCHold/./lib/lj3.fonts    Sat May 23 22:30:11 1992
  250. --- ./lib/lj3.fonts    Sat May 23 22:30:12 1992
  251. ***************
  252. *** 1,4 ****
  253. ! #@(#)lj3.fonts 2.13 92/03/03
  254.   #    Laserjet III fonts file.
  255.   #    See lj.fonts for more explanation.
  256.   #    The first ten fonts are the built-in scaleable typefaces.
  257. --- 1,4 ----
  258. ! #@(#)lj3.fonts 2.14 92/04/12
  259.   #    Laserjet III fonts file.
  260.   #    See lj.fonts for more explanation.
  261.   #    The first ten fonts are the built-in scaleable typefaces.
  262. ***************
  263. *** 53,59 ****
  264.   co N \033(7J\245\033(8U
  265.   sq N \033(7J\273\033(8U
  266.   symbol
  267. ! br N | -92 0
  268.   eq S =
  269.   ts S \133
  270.   mi S -
  271. --- 53,59 ----
  272.   co N \033(7J\245\033(8U
  273.   sq N \033(7J\273\033(8U
  274.   symbol
  275. ! br N | -80 0
  276.   eq S =
  277.   ts S \133
  278.   mi S -
  279. Index: ./lib/lj3.lib
  280. *** /tmp/PATCHold/./lib/lj3.lib    Sat May 23 22:30:20 1992
  281. --- ./lib/lj3.lib    Sat May 23 22:30:21 1992
  282. ***************
  283. *** 29,41 ****
  284.   %            \xAABB \022 A %hello
  285.   %            Passes the following bytes: 0xAA, 0xBB, 022, and "A"
  286.   %            through to the laserjet.
  287. ! %ident  @(#)lj3.lib: 2.3 Copyright 92/02/10 16:48:46 Chris Lewis"
  288.   \033E\033&k2G            %reset printer, set CR=CR,LF=CRLF,FF=CRFF 
  289.   \033&l6d66p0o0e66f0L        %letter size, portrait, no perf skip
  290.   \0339                %reset side margins
  291.   \033&a0h0V            %move cursor to 0,0
  292.   \033*c6120x7920y0T\033\045 1B    %set HP-GL/2 picture frame, go to HP-GL/2
  293. ! IN;WU0;PW0.36;SP1;        %initialize, pen widths in MM, 0.36MM for pen 1
  294.   LA1,4,2,4;            %set round line caps & joins
  295.   TR0;                %set transparency mode off
  296.   IP0,11176,8636,0;        %set orientation to match PCL
  297. --- 29,41 ----
  298.   %            \xAABB \022 A %hello
  299.   %            Passes the following bytes: 0xAA, 0xBB, 022, and "A"
  300.   %            through to the laserjet.
  301. ! %ident  @(#)lj3.lib: 2.4 Copyright 92/04/12 22:01:19 Chris Lewis"
  302.   \033E\033&k2G            %reset printer, set CR=CR,LF=CRLF,FF=CRFF 
  303.   \033&l6d66p0o0e66f0L        %letter size, portrait, no perf skip
  304.   \0339                %reset side margins
  305.   \033&a0h0V            %move cursor to 0,0
  306.   \033*c6120x7920y0T\033\045 1B    %set HP-GL/2 picture frame, go to HP-GL/2
  307. ! IN;WU0;PW0.2;SP1;        %initialize, pen widths in MM, 0.36MM for pen 1
  308.   LA1,4,2,4;            %set round line caps & joins
  309.   TR0;                %set transparency mode off
  310.   IP0,11176,8636,0;        %set orientation to match PCL
  311. Index: ./lib/ps.fonts
  312. *** /tmp/PATCHold/./lib/ps.fonts    Sat May 23 22:30:29 1992
  313. --- ./lib/ps.fonts    Sat May 23 22:30:30 1992
  314. ***************
  315. *** 1,4 ****
  316. ! #@(#)ps.fonts 2.5 91/08/29
  317.   #    DO NOT CHANGE THE ORDER OF THE FIRST FOUR LINES - THESE ARE
  318.   #    THE DEFAULT TROFF FONTS IN POSITIONS 1-5.  IN PARTICULAR, IF
  319.   #    SYMBOL ISN'T THE FOURTH ENTRY AND BRACKETFONT ISN'T THE FIFTH,
  320. --- 1,4 ----
  321. ! #@(#)ps.fonts 2.6 92/05/21 01:56:49
  322.   #    DO NOT CHANGE THE ORDER OF THE FIRST FOUR LINES - THESE ARE
  323.   #    THE DEFAULT TROFF FONTS IN POSITIONS 1-5.  IN PARTICULAR, IF
  324.   #    SYMBOL ISN'T THE FOURTH ENTRY AND BRACKETFONT ISN'T THE FIFTH,
  325. ***************
  326. *** 7,15 ****
  327.   #    The first token is the CAT name, the second is the postscript
  328.   #    name, and the third (if present) is a file to punt to the
  329.   #    printer when the font is first referenced.
  330. ! R    Times-Roman
  331. ! I    Times-Italic
  332. ! B    Times-Bold
  333.   S    Symbol
  334.   S2    BracketFont
  335.   AB    AvantGarde-Demi
  336. --- 7,17 ----
  337.   #    The first token is the CAT name, the second is the postscript
  338.   #    name, and the third (if present) is a file to punt to the
  339.   #    printer when the font is first referenced.
  340. ! #    If the font name starts with an underscore, the font
  341. ! #    is reencoded to permit access to the European character set.
  342. ! R    _Times-Roman
  343. ! I    _Times-Italic
  344. ! B    _Times-Bold
  345.   S    Symbol
  346.   S2    BracketFont
  347.   AB    AvantGarde-Demi
  348. ***************
  349. *** 47,137 ****
  350.   HW    HaeberliWriting    /usr/lib/troff2/lib/lj/hwfont
  351.   TE    Tymes-Elfin /usr/lib/troff2/lib/lj/tefont
  352.   extensions
  353. ! a^    N    \136
  354. ! a~    N    \176
  355. ! I!    N    \241
  356. ! po    N    \243
  357. ! $J    N    \245
  358. ! lq    N    \252
  359. ! d<    N    \253
  360. ! l<    N    \254
  361. ! r>    N    \255
  362. ! pp    N    \266
  363. ! bq    N    \271
  364. ! rq    N    \272
  365. ! d>    N    \273
  366. ! pm    N    \275
  367. ! I?    N    \277
  368. ! ma    N    \305
  369. ! be    N    \306
  370. ! dt    N    \307
  371. ! ..    N    \310
  372. ! ri    N    \312
  373. ! cd    N    \313
  374. ! ''    N    \315
  375. ! og    N    \316
  376. ! hc    N    \317
  377. ! a:    N    \321
  378. ! o:    N    \322
  379. ! u:    N    \323
  380. ! A:    N    \324
  381. ! O:    N    \325
  382. ! U:    N    \326
  383. ! AE    N    \341
  384. ! PL    N    \350
  385. ! O/    N    \351
  386.   OE    N    \352
  387. - ae    N    \361
  388. - ui    N    \365
  389. - Pl    N    \370
  390. - o/    N    \371
  391.   oe    N    \372
  392. ! ss    N    \373
  393. ! fa    S    \042
  394. ! te    S    \044
  395. ! cm    S    \047
  396. ! =~    S    \100
  397. ! *A    S    \101
  398. ! *B    S    \102
  399. ! *X    S    \103
  400. ! *E    S    \105
  401. ! *Y    S    \110
  402. ! *I    S    \111
  403. ! *K    S    \113
  404. ! *M    S    \115
  405. ! *N    S    \116
  406. ! *O    S    \117
  407. ! *R    S    \122
  408. ! *T    S    \124
  409. ! *Z    S    \132
  410. ! tf    S    \134
  411. ! bt    S    \136
  412. ! mt    S    \242
  413. ! Cc    S    \247
  414. ! Cd    S    \250
  415. ! Ch    S    \251
  416. ! Cs    S    \252
  417. ! <>    S    \253
  418. ! sd    S    \262
  419. ! cr    S    \277
  420. ! al    S    \300
  421. ! ax    S    \304
  422. ! a+    S    \305
  423. ! !s    S    \313
  424. ! !m    S    \317
  425. ! ag    S    \320
  426. ! m.    S    \327
  427. ! an    S    \331
  428. ! lo    S    \332
  429. ! io    S    \333
  430. ! <:    S    \334
  431. ! u=    S    \335
  432. ! :>    S    \336
  433. ! d=    S    \337
  434. ! dm    S    \340
  435. ! L<    S    \341
  436. ! tm    S    \344
  437. ! AL    S    \360
  438. ! R>    S    \361
  439. ! r1    4    \121
  440. ! r2    4    \122
  441. --- 49,118 ----
  442.   HW    HaeberliWriting    /usr/lib/troff2/lib/lj/hwfont
  443.   TE    Tymes-Elfin /usr/lib/troff2/lib/lj/tefont
  444.   extensions
  445. ! r!    N    \241
  446. ! r?    N    \277
  447. ! 'A    N    \001
  448. ! 'a    N    \002
  449. ! ^A    N    \003
  450. ! ^a    N    \004
  451. ! :A    N    \005
  452. ! :a    N    \006
  453. ! `A    N    \007
  454. ! `a    N    \010
  455. ! oA    N    \011
  456. ! oa    N    \012
  457. ! ~A    N    \013
  458. ! ~a    N    \014
  459. ! ,C    N    \015
  460. ! ,c    N    \016
  461. ! 'E    N    \017
  462. ! 'e    N    \020
  463. ! ^E    N    \021
  464. ! ^e    N    \022
  465. ! :E    N    \023
  466. ! :e    N    \024
  467. ! `E    N    \025
  468. ! `e    N    \026
  469. ! 'I    N    \027
  470. ! 'i    N    \030
  471. ! ^I    N    \031
  472. ! ^i    N    \032
  473. ! :I    N    \033
  474. ! :i    N    \034
  475. ! `I    N    \035
  476. ! `i    N    \036
  477. ! ~N    N    \037
  478. ! ~n    N    \200
  479. ! 'O    N    \201
  480. ! 'o    N    \202
  481. ! ^O    N    \203
  482. ! ^o    N    \204
  483. ! :O    N    \205
  484. ! :o    N    \206
  485. ! `O    N    \207
  486. ! `o    N    \210
  487. ! ~O    N    \211
  488. ! ~o    N    \212
  489. ! vS    N    \213
  490. ! vs    N    \214
  491. ! 'U    N    \215
  492. ! 'u    N    \216
  493. ! ^U    N    \217
  494. ! ^u    N    \220
  495. ! :U    N    \221
  496. ! :u    N    \222
  497. ! `U    N    \223
  498. ! `u    N    \224
  499. ! :Y    N    \225
  500. ! :y    N    \226
  501. ! vZ    N    \227
  502. ! vz    N    \230
  503. ! /O    N    \351
  504. ! /o    N    \371
  505.   OE    N    \352
  506.   oe    N    \372
  507. ! ae    N    \361
  508. ! AE    N    \341
  509. ! Ye    N    \245
  510. ! ..    N    \310
  511. Index: ./lib/ps.lib
  512. *** /tmp/PATCHold/./lib/ps.lib    Sat May 23 22:30:38 1992
  513. --- ./lib/ps.lib    Sat May 23 22:30:40 1992
  514. ***************
  515. *** 9,18 ****
  516.   %    Module:        ps.lib
  517.   %    Author:     Chris Lewis
  518.   %    Specs:        Predefinitions for PostScript
  519. ! %ident  @(#)ps.lib: 2.12 Copyright 92/02/13 01:44:51 Chris Lewis"
  520.   
  521.   /Y { 3 1 roll dup /CurY exch def moveto show } bind def
  522.   /X { exch CurY moveto show } bind def
  523.   /hits 0 def
  524.   /misses 0 def
  525.   /pagecount 0 def
  526. --- 9,27 ----
  527.   %    Module:        ps.lib
  528.   %    Author:     Chris Lewis
  529.   %    Specs:        Predefinitions for PostScript
  530. ! %ident  @(#)ps.lib: 92/05/21 Copyright 92/05/21 01:56:54 Chris Lewis"
  531.   
  532.   /Y { 3 1 roll dup /CurY exch def moveto show } bind def
  533.   /X { exch CurY moveto show } bind def
  534. + % s cx x y W -
  535. + /W {
  536. +     dup        % s cx x y y
  537. +     /CurY exch def    % s cx x y
  538. +     moveto    % s cx
  539. +     0 8#040    % s cx 0 8#040
  540. +     4 -1 roll    % cx 0 8#040 s
  541. +     widthshow    % -
  542. + } bind def
  543.   /hits 0 def
  544.   /misses 0 def
  545.   /pagecount 0 def
  546. ***************
  547. *** 76,82 ****
  548.   %    pages.
  549.   %
  550.   %    Trial font cache - I can't think in Polish... ;-)
  551. ! /SetFont {
  552.       /curPoints exch def
  553.       /curFont exch def
  554.       %    Concatenate the curFont string with the curPoints to create
  555. --- 85,91 ----
  556.   %    pages.
  557.   %
  558.   %    Trial font cache - I can't think in Polish... ;-)
  559. ! /S {
  560.       /curPoints exch def
  561.       /curFont exch def
  562.       %    Concatenate the curFont string with the curPoints to create
  563. ***************
  564. *** 110,116 ****
  565.   
  566.   /metrics {
  567.       /psize 16 def
  568. !     /Times-Roman psize SetFont
  569.       /charcount exch def
  570.       /curpos 720 def
  571.       /xpos 72 def
  572. --- 119,125 ----
  573.   
  574.   /metrics {
  575.       /psize 16 def
  576. !     /Times-Roman psize S
  577.       /charcount exch def
  578.       /curpos 720 def
  579.       /xpos 72 def
  580. ***************
  581. *** 405,411 ****
  582.     40 C.setl  0 -250 moveto  0 1000 rlineto  stroke
  583.   } def
  584.   /Cru {
  585. ! 0 0 -50 -250 1000 0 setcachedevice
  586.     40 C.setl  0 -250 moveto 500 0 rlineto stroke
  587.   } def
  588.   /Crn {
  589. --- 414,420 ----
  590.     40 C.setl  0 -250 moveto  0 1000 rlineto  stroke
  591.   } def
  592.   /Cru {
  593. ! 500 0 -50 -250 1000 0 setcachedevice
  594.     40 C.setl  0 -250 moveto 500 0 rlineto stroke
  595.   } def
  596.   /Crn {
  597. ***************
  598. *** 445,450 ****
  599. --- 454,461 ----
  600.   } def end
  601.   /BracketFont BracketFontDict definefont pop
  602.   
  603. + %Drawing support
  604.   /Ellipse {
  605.       /Yaxis exch 2 div def
  606.       /Xaxis exch 2 div def
  607. ***************
  608. *** 487,492 ****
  609. --- 498,547 ----
  610.   /dost{
  611.       currentlinewidth exch 6 div setlinewidth stroke setlinewidth
  612.   } bind def
  613. + %    Font reencoding support function for European characters.
  614. + %    Requires a leading _ on the ps.fonts files.
  615. + %    Green book, pg 115-117
  616. + %    encmap f1 f2 RE
  617. + %    reencodes f2 to create f1, using map in encmap.
  618. + /RE {
  619. +     findfont begin
  620. +     currentdict dup length dict begin
  621. +     { %forall
  622. +         1 index /FID ne {def} {pop pop} ifelse
  623. +     } forall
  624. +     /FontName exch def dup length 0 ne { %if
  625. +         /Encoding Encoding 256 array copy def
  626. +         0 exch { %forall
  627. +         dup type /nametype eq { %ifelse
  628. +             Encoding 2 index 2 index put
  629. +             pop 1 add
  630. +         }{ %else
  631. +             exch pop
  632. +         } ifelse
  633. +         } forall
  634. +     } if pop
  635. +     currentdict dup end end
  636. +     /FontName get exch definefont pop
  637. + } bind def
  638. + %    Standard encoding for psroff.
  639. + %    places 32 characters starting at 0, then the rest at 128.
  640. + /stdencoding [ 1
  641. + /Aacute /aacute /Acircumflex /acircumflex /Adieresis /adieresis /Agrave /agrave
  642. + /Aring /aring /Atilde /atilde
  643. + /Ccedilla /ccedilla
  644. + /Eacute /eacute /Ecircumflex /ecircumflex /Edieresis /edieresis /Egrave /egrave
  645. + /Iacute /iacute /Icircumflex /icircumflex /Idieresis /idieresis /Igrave /igrave
  646. + /Ntilde
  647. + 128
  648. + /ntilde
  649. + /Oacute /oacute /Ocircumflex /ocircumflex /Odieresis /odieresis /Ograve /ograve
  650. + /Otilde /otilde
  651. + /Scaron /scaron /Uacute /uacute /Ucircumflex /ucircumflex /Udieresis /udieresis
  652. + /Ugrave /ugrave /Ydieresis /ydieresis /Zcaron /zcaron
  653. + ] def
  654.   
  655.   %    This macro is invoked by ShowPage to display the current form.
  656.   %    Usually redefined to point at a form loaded by an include
  657. Index: ./lib/psrofflib.S
  658. *** /tmp/PATCHold/./lib/psrofflib.S    Sat May 23 22:30:54 1992
  659. --- ./lib/psrofflib.S    Sat May 23 22:30:55 1992
  660. ***************
  661. *** 1,4 ****
  662. ! #    2.25 92/02/10
  663.   #    This file controls psroff, you can insert additional printer
  664.   #    types here.  These are eval'd *late* in processing, so that
  665.   #    you can insert $copies etc.
  666. --- 1,4 ----
  667. ! #    2.27 92/05/23
  668.   #    This file controls psroff, you can insert additional printer
  669.   #    types here.  These are eval'd *late* in processing, so that
  670.   #    you can insert $copies etc.
  671. ***************
  672. *** 60,70 ****
  673.   #        -G<sizescale>    If you're driving with groff, and the sizescale
  674.   #                parameter is specified in the DESC file, you
  675.   #                have to supply the sizescale parameter here.
  676. ! #        -Z        optimizer
  677. ! #        -S        Use "stop" to terminate Postscript instead
  678. ! #                of control-D
  679.   #        -W<directory>    location of CAT width tables.  Defaults
  680.   #                to FONTDIR/<type>/ft*
  681.   #
  682.   #    lparg: how to get output to printer.  Note the "-n$copies" and
  683.   #        -d$ptr.  The $ptr is the psroff selected physical printer
  684. --- 60,73 ----
  685.   #        -G<sizescale>    If you're driving with groff, and the sizescale
  686.   #                parameter is specified in the DESC file, you
  687.   #                have to supply the sizescale parameter here.
  688. ! #        -Z        optimizer.  If you are using a version of
  689. ! #                DWB that needs ASCII width tables, set -G1.
  690. ! #        -g[.][l]nnn    Optimizer control.  Leave out initially.
  691. ! #                Consult troff2ps man page for more details.
  692.   #        -W<directory>    location of CAT width tables.  Defaults
  693.   #                to FONTDIR/<type>/ft*
  694. + #        -S        Use "stop" to terminate Postscript instead
  695. + #                of control-D
  696.   #
  697.   #    lparg: how to get output to printer.  Note the "-n$copies" and
  698.   #        -d$ptr.  The $ptr is the psroff selected physical printer
  699. Index: ./lib/lj3u.fonts
  700. *** /tmp/PATCHold/./lib/lj3u.fonts    Sat May 23 22:31:09 1992
  701. --- ./lib/lj3u.fonts    Sat May 23 22:31:10 1992
  702. ***************
  703. *** 1,4 ****
  704. ! #@(#)lj3u.fonts 2.7 92/03/03
  705.   #    Laserjet III fonts file.  Shuffled for Universal as primary typeface.
  706.   #    See lj.fonts for more explanation.
  707.   #    The first ten fonts are the built-in scaleable typefaces.
  708. --- 1,4 ----
  709. ! #@(#)lj3u.fonts 2.8 92/04/12
  710.   #    Laserjet III fonts file.  Shuffled for Universal as primary typeface.
  711.   #    See lj.fonts for more explanation.
  712.   #    The first ten fonts are the built-in scaleable typefaces.
  713. ***************
  714. *** 53,59 ****
  715.   co N \033(7J\245\033(8U
  716.   sq N \033(7J\273\033(8U
  717.   symbol
  718. ! br N | -92 0
  719.   eq S =
  720.   ts S \133
  721.   mi S -
  722. --- 53,59 ----
  723.   co N \033(7J\245\033(8U
  724.   sq N \033(7J\273\033(8U
  725.   symbol
  726. ! br N | -80 0
  727.   eq S =
  728.   ts S \133
  729.   mi S -
  730. Index: ./widths/installdit.S
  731. *** /tmp/PATCHold/./widths/installdit.S    Sat May 23 22:31:21 1992
  732. --- ./widths/installdit.S    Sat May 23 22:31:22 1992
  733. ***************
  734. *** 5,11 ****
  735.   #    See the LICENSE file for a full description of the restrictions
  736.   #    under which this software is provided.
  737.   #
  738. ! #1.7 92/02/21
  739.   MAKEDEV=%%MAKEDEV%%
  740.   if [ ! -f "$MAKEDEV" ]
  741.   then
  742. --- 5,11 ----
  743.   #    See the LICENSE file for a full description of the restrictions
  744.   #    under which this software is provided.
  745.   #
  746. ! #1.8 92/04/12
  747.   MAKEDEV=%%MAKEDEV%%
  748.   if [ ! -f "$MAKEDEV" ]
  749.   then
  750. ***************
  751. *** 96,102 ****
  752.           continue
  753.       fi
  754.       cd $dir
  755. !     list="`find . -name '[A-Z]*' -a ! -name '*.out' -print`"
  756.       if [ -n "$list" ]
  757.       then
  758.           echo "INSTALLING ditroff widths from $dir into $destdir"
  759. --- 96,108 ----
  760.           continue
  761.       fi
  762.       cd $dir
  763. !     if [ -z "$Garg" ]
  764. !     then
  765. !         list="`find . -name '*.out' -print`"
  766. !     else
  767. !         list="`find . -name '[A-Z]*' -a ! -name '*.out' -print`"
  768. !     fi
  769.       if [ -n "$list" ]
  770.       then
  771.           echo "INSTALLING ditroff widths from $dir into $destdir"
  772. Index: ./utils/Makefile
  773. *** /tmp/PATCHold/./utils/Makefile    Sat May 23 22:31:31 1992
  774. --- ./utils/Makefile    Sat May 23 22:31:32 1992
  775. ***************
  776. *** 4,10 ****
  777.   #    See the LICENSE file for a full description of the restrictions
  778.   #    under which this software is provided.
  779.   #
  780. ! #2.9 91/10/17
  781.   SCRIPTS    = psdtwd showfont mkenctab calcfonts catconv dodps
  782.   PROGRAMS = hpinterp psxlate pk2sfp pk2ditwid pktype dumpft pk2ps lj2ps \
  783.       asc2ps
  784. --- 4,10 ----
  785.   #    See the LICENSE file for a full description of the restrictions
  786.   #    under which this software is provided.
  787.   #
  788. ! #2.11 92/05/19
  789.   SCRIPTS    = psdtwd showfont mkenctab calcfonts catconv dodps
  790.   PROGRAMS = hpinterp psxlate pk2sfp pk2ditwid pktype dumpft pk2ps lj2ps \
  791.       asc2ps
  792. ***************
  793. *** 69,76 ****
  794.       $(CC) $(CFLAGS) -o pk2ditwid pk2ditwid.o ../debug.o ../pk.o ljtab.o \
  795.           $(LIBFLAGS)
  796.   
  797. ! pk2sfp:    ../pk.o ../debug.o pk2sfp.o ljtab.o
  798. !     $(CC) $(CFLAGS) -o pk2sfp pk2sfp.o ../debug.o ../pk.o ljtab.o \
  799.           $(LIBFLAGS)
  800.   
  801.   dumpft:    dumpft.o ../cattab.o
  802. --- 69,76 ----
  803.       $(CC) $(CFLAGS) -o pk2ditwid pk2ditwid.o ../debug.o ../pk.o ljtab.o \
  804.           $(LIBFLAGS)
  805.   
  806. ! pk2sfp:    ../pk.o ../debug.o pk2sfp.o ljtab.o ../pkscale.o
  807. !     $(CC) $(CFLAGS) -o pk2sfp pk2sfp.o ../debug.o ../pk.o ljtab.o ../pkscale.o \
  808.           $(LIBFLAGS)
  809.   
  810.   dumpft:    dumpft.o ../cattab.o
  811. ***************
  812. *** 84,91 ****
  813.   
  814.   install:
  815.       cd $(LIBDIR) ; rm -f $(SCRIPTS)
  816. !     $(IGNORESH) cp $(SCRIPTS) $(LIBDIR)
  817. !     for i in $(PROGRAMS) ; \
  818.       do \
  819.           if [ -f $(LIBDIR)/$$i ] ; \
  820.           then \
  821. --- 84,92 ----
  822.   
  823.   install:
  824.       cd $(LIBDIR) ; rm -f $(SCRIPTS)
  825. !     cp $(SCRIPTS) $(LIBDIR)
  826. !     cd $(LIBDIR) ; chmod 555 $(SCRIPTS)
  827. !     $(IGNORSH) for i in $(PROGRAMS) ; \
  828.       do \
  829.           if [ -f $(LIBDIR)/$$i ] ; \
  830.           then \
  831. ***************
  832. *** 93,98 ****
  833. --- 94,100 ----
  834.           cp $(LIBDIR)/$$i $(LIBDIR)/$$i.old 2> /dev/null ; \
  835.           fi ; \
  836.           cp $$i $(LIBDIR)/$$i ; \
  837. +         chmod 555 $(LIBDIR)/$$i ; \
  838.       done
  839.   
  840.   #    Try to convert a vendor supplied ft into dit2catwid input
  841. Index: ./utils/pk2ps.c
  842. *** /tmp/PATCHold/./utils/pk2ps.c    Sat May 23 22:31:41 1992
  843. --- ./utils/pk2ps.c    Sat May 23 22:31:42 1992
  844. ***************
  845. *** 14,20 ****
  846.   
  847.   #ifndef    lint
  848.   static char SCCSID[] =
  849. !     "@(#)pk2ps.c 2.3 Copyright 91/10/22 03:03:11 Chris Lewis";
  850.   #endif
  851.   #include "defs.h"
  852.   #include "pk.h"
  853. --- 14,20 ----
  854.   
  855.   #ifndef    lint
  856.   static char SCCSID[] =
  857. !     "@(#)pk2ps.c 2.4 Copyright 92/03/12 01:11:48 Chris Lewis";
  858.   #endif
  859.   #include "defs.h"
  860.   #include "pk.h"
  861. ***************
  862. *** 26,31 ****
  863. --- 26,53 ----
  864.   long highest = 0;
  865.   int fontonly = 0;
  866.   
  867. + /* character names in standard Adobe encoding */
  868. + char *adobecharnames[95] =
  869. +     {    "space", "exclam", "quotedbl", "numbersign",
  870. +     "dollar", "percent", "ampersand", "quoteright",
  871. +     "parenleft", "parenright", "asterisk", "plus",
  872. +     "comma", "hyphen", "period", "slash",
  873. +     "zero", "one", "two", "three", "four", "five",
  874. +     "six", "seven", "eight", "nine", "colon", "semicolon",
  875. +     "less", "equal", "greater", "question",
  876. +     "at", "A", "B", "C", "D", "E", "F", "G",
  877. +     "H", "I", "J", "K", "L", "M", "N", "O",
  878. +     "P", "Q", "R", "S", "T", "U", "V", "W",
  879. +     "X", "Y", "Z", "bracketleft",
  880. +     "backslash", "bracketright", "asciicircum", "underscore",
  881. +     "quoteleft", "a", "b", "c", "d", "e", "f", "g",
  882. +     "h", "i", "j", "k", "l", "m", "n", "o",
  883. +     "p", "q", "r", "s", "t", "u", "v", "w",
  884. +     "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde"
  885. +     };
  886. + extern long sfp_hmi;    /* pitch (default HMI) -- width of space */
  887.   /*    Dummied out for pk.c */
  888.   needchar(a, b)
  889.   int a, b; {
  890. ***************
  891. *** 44,52 ****
  892.       struct pkp *pk_read();
  893.       register int i, len;
  894.       int chcount;
  895.   
  896.       progname = argv[0];
  897. !     while((c = getopt(argc, argv, "fD:v")) != EOF)
  898.       switch(c) {
  899.           case 'D':
  900.   #ifdef    DEBUG
  901. --- 66,78 ----
  902.       struct pkp *pk_read();
  903.       register int i, len;
  904.       int chcount;
  905. +     int saw_space;
  906. +     int lx, ly, ux, uy;        /* character bounding box */
  907. +     int flx, fly, fux, fuy;    /* font bounding box */
  908. +     char *fontname = NULL;
  909.   
  910.       progname = argv[0];
  911. !     while((c = getopt(argc, argv, "fD:n:v")) != EOF)
  912.       switch(c) {
  913.           case 'D':
  914.   #ifdef    DEBUG
  915. ***************
  916. *** 57,62 ****
  917. --- 83,91 ----
  918.               progname);
  919.           exit(1);
  920.   #endif
  921. +         case 'n':
  922. +         fontname = optarg;
  923. +         break;
  924.           case 'v':
  925.           verbose = 1;
  926.           break;
  927. ***************
  928. *** 71,80 ****
  929.       char *filebuf = mustmalloc(strlen(argv[optind]) + 10);
  930.       register char *cp;
  931.   
  932. -     printf("%%FILE: %s\n", argv[optind]);
  933.       highest = 0;
  934.   
  935.       cp = strrchr(argv[optind], '/');
  936.   
  937.       if (cp)
  938. --- 100,109 ----
  939.       char *filebuf = mustmalloc(strlen(argv[optind]) + 10);
  940.       register char *cp;
  941.   
  942.       highest = 0;
  943.   
  944. +     saw_space = 0;
  945.       cp = strrchr(argv[optind], '/');
  946.   
  947.       if (cp)
  948. ***************
  949. *** 85,116 ****
  950.       if (cp)
  951.           *cp = '\0';
  952.   
  953.       if (!fontonly) {
  954.           printf("/saveobj save def\n");
  955.       }
  956.   
  957.       printf("10 dict dup begin\n");
  958.       printf("/FontType 3 def\n");
  959. !     printf("/FontMatrix [1 0 0 1 0 0] def\n");
  960. !     printf("/FontBBox [1.28 1.2 -0.16 -.024] def\n");
  961.       printf("/FontInfo 5 dict def\n");
  962.       printf("FontInfo begin\n");
  963.       printf("    /isFixedPitch false def\n");
  964.       printf("end\n");
  965.       printf("/Encoding 256 array def\n");
  966.       printf("0 1 255 {Encoding exch /.notdef put} for\n");
  967. !     printf("Encoding\n");
  968. !     p = pk_read(argv[optind]);
  969.       chcount = 0;
  970.       for (pc = p->pkp_chars; pc; pc = pc->pkc_next) {
  971. !         if (pc->pkc_next)
  972.           printf("dup ");
  973. !         printf("%ld /ch%ld put\n", pc->pkc_char, pc->pkc_char);
  974. !         highest = max(highest, pc->pkc_char);
  975.           chcount++;
  976.       }
  977.   
  978.       if (verbose) {
  979.           fprintf(stderr, "Emitting %s, %d codes\n", filebuf, chcount);
  980. --- 114,162 ----
  981.       if (cp)
  982.           *cp = '\0';
  983.   
  984. +     if (fontname != NULL) filebuf = fontname;
  985. +     printf("%%%%BeginFont: %s\n", filebuf);
  986.       if (!fontonly) {
  987.           printf("/saveobj save def\n");
  988.       }
  989.   
  990. +     p = pk_read(argv[optind]);
  991. +         /* allocate a new dictionary for the font description */
  992.       printf("10 dict dup begin\n");
  993. +         /* this is a Type 3 font */
  994.       printf("/FontType 3 def\n");
  995. !         /* font translation matrix */
  996. !     printf("/FontMatrix [.001 0 0 .001 0 0] def\n");
  997. ! #ifdef NEVER
  998.       printf("/FontInfo 5 dict def\n");
  999.       printf("FontInfo begin\n");
  1000.       printf("    /isFixedPitch false def\n");
  1001.       printf("end\n");
  1002. + #endif
  1003. +         /* set up the encoding array */
  1004.       printf("/Encoding 256 array def\n");
  1005.       printf("0 1 255 {Encoding exch /.notdef put} for\n");
  1006. !     printf("Encoding");
  1007.       chcount = 0;
  1008.       for (pc = p->pkp_chars; pc; pc = pc->pkc_next) {
  1009. !         c = pc->pkc_char;
  1010. !         if (c == 32) saw_space++;
  1011. !         printf ((chcount % 3) ? " " : "\n    ");
  1012. !         if (pc->pkc_next || !saw_space)
  1013.           printf("dup ");
  1014. !         if (c >= 32 && c <= 126)
  1015. !          printf("%d /%s put", c, adobecharnames[c-32]);
  1016. !         else printf("%d /ch%d put", c, c);
  1017. !         highest = max(highest, c);
  1018.           chcount++;
  1019.       }
  1020. +     if (!saw_space) {
  1021. +         printf ((chcount % 3) ? " " : "\n    ");
  1022. +         printf ("32 /space put\n");
  1023. +     } else putchar ('\n');
  1024.   
  1025.       if (verbose) {
  1026.           fprintf(stderr, "Emitting %s, %d codes\n", filebuf, chcount);
  1027. ***************
  1028. *** 121,176 ****
  1029.       else
  1030.           highest = 256;
  1031.   
  1032.       printf("/BuildChar\n");
  1033. !     printf("    { 0 begin\n");
  1034.       printf("    /char exch def\n");
  1035.       printf("    /fontdict exch def\n");
  1036.       printf("    /charname fontdict /Encoding get char get def\n");
  1037. !     printf("    /charinfo fontdict /CharData get charname\n");
  1038. !     printf("        get def\n");
  1039.       printf("    /wx charinfo 0 get def\n");
  1040.       printf("    /charbbox charinfo 1 4 getinterval def\n");
  1041.       printf("    wx 0 charbbox aload pop setcachedevice\n");
  1042.       printf("    charinfo 5 get charinfo 6 get true\n");
  1043.       printf("    fontdict /imagemaskmatrix get\n");
  1044.       printf("        dup 4 charinfo 7 get put\n");
  1045.       printf("        dup 5 charinfo 8 get put\n");
  1046.       printf("    charinfo 9 1 getinterval cvx\n");
  1047.       printf("    imagemask\n");
  1048.       printf("    end\n");
  1049. !     printf("} def\n");
  1050.       printf("\n");
  1051.       printf("/BuildChar load 0 6 dict put\n");
  1052.   
  1053. ! #define    DOTS2UNITS(x)    ((x) / ((p->pkp_npts / POINT) * 300))
  1054.   
  1055. !     printf("/imagemaskmatrix [%.2f 0 0 -%.2f 0 0] def\n",
  1056. !         1 / DOTS2UNITS((double) 1),
  1057. !         1 / DOTS2UNITS((double) 1)
  1058.           );
  1059.       printf("/CharData %d dict def\n", chcount+1);
  1060.       printf("CharData begin\n");
  1061.       for (pc = p->pkp_chars; pc; pc = pc->pkc_next) {
  1062.           register struct ras *r;
  1063.           r = pkrast(pc);
  1064.           if (!r) {
  1065.           fprintf(stderr, "%0: no raster image for %02x\n",
  1066. !             progname, pc->pkc_char);
  1067.           continue;
  1068.           }
  1069. !         printf(
  1070. !         "    /ch%ld [ %.2f %.2f %.2f %.2f %.2f %ld %ld %.2f %.2f\n\t<",
  1071. !         pc->pkc_char,
  1072. !         DOTS2UNITS((double) pc->pkc_dx / pow2(16)),    /* width */
  1073. !         DOTS2UNITS((double) -pc->pkc_x_off),        /* bblx */
  1074. !         DOTS2UNITS((double) pc->pkc_y_off -
  1075. !             pc->pkc_height + 1),            /* bbly */
  1076. !         DOTS2UNITS((double) -pc->pkc_x_off + pc->pkc_width),/* bbux */
  1077. !         DOTS2UNITS((double) pc->pkc_height + pc->pkc_y_off),/* bbuy */
  1078.           r->ras_width,
  1079.           r->ras_height,
  1080.           (double) pc->pkc_x_off - .5,            /* shift x */
  1081. --- 167,245 ----
  1082.       else
  1083.           highest = 256;
  1084.   
  1085. +         /* define the "BuildChar" routine to generate a character */
  1086.       printf("/BuildChar\n");
  1087. !         /* the "0" will be filled in with a new dictionary below */
  1088. !     printf("{ 0 begin\n");
  1089. !         /* get the "font dictionary" parameter */
  1090.       printf("    /char exch def\n");
  1091. +         /* get the "character number" parameter */
  1092.       printf("    /fontdict exch def\n");
  1093. +         /* translate character number into character name from encoding */
  1094.       printf("    /charname fontdict /Encoding get char get def\n");
  1095. !         /* get character info array */
  1096. !     printf("    /charinfo fontdict /CharData get charname get def\n");
  1097. !         /* get character width from character info array */
  1098.       printf("    /wx charinfo 0 get def\n");
  1099. +         /* get character bounding box from character info array */
  1100.       printf("    /charbbox charinfo 1 4 getinterval def\n");
  1101. +         /* arrange to save the character in the font cache */
  1102.       printf("    wx 0 charbbox aload pop setcachedevice\n");
  1103. +         /* get bit array dimensions for "imagemask".
  1104. +          * "true" means to paint where the 1-bits are */
  1105.       printf("    charinfo 5 get charinfo 6 get true\n");
  1106. +         /* get image mask matrix */
  1107.       printf("    fontdict /imagemaskmatrix get\n");
  1108. +         /* insert character translation info into image mask matrix */
  1109.       printf("        dup 4 charinfo 7 get put\n");
  1110.       printf("        dup 5 charinfo 8 get put\n");
  1111. +         /* get bitmap data for the character */
  1112.       printf("    charinfo 9 1 getinterval cvx\n");
  1113. +         /* generate the character */
  1114.       printf("    imagemask\n");
  1115.       printf("    end\n");
  1116. !     printf("} def %% BuildChar\n");
  1117.       printf("\n");
  1118. +         /* replace the first element (#0) of "BuildChar"
  1119. +          * with a reference to a brand-new, empty dictionary */
  1120.       printf("/BuildChar load 0 6 dict put\n");
  1121.   
  1122. ! #define    KDOTS2UNITS(x)    (double) ((1000*(x)) / ((p->pkp_ds / (pow2(20) * POINT)) * 300))
  1123.   
  1124. !         /* define the image mask matrix */
  1125. !     printf("/imagemaskmatrix [%.4f 0 0 -%.4f 0 0] def\n",
  1126. !         1.0 / KDOTS2UNITS((double) 1),
  1127. !         1.0 / KDOTS2UNITS((double) 1)
  1128.           );
  1129. +         /* define the character data (bitmaps) */
  1130. +     if (!saw_space) chcount++;
  1131.       printf("/CharData %d dict def\n", chcount+1);
  1132.       printf("CharData begin\n");
  1133. !     flx = fly = fux = fuy = 0;
  1134.       for (pc = p->pkp_chars; pc; pc = pc->pkc_next) {
  1135.           register struct ras *r;
  1136. +         c = pc->pkc_char;
  1137.           r = pkrast(pc);
  1138.           if (!r) {
  1139.           fprintf(stderr, "%0: no raster image for %02x\n",
  1140. !             progname, c);
  1141.           continue;
  1142.           }
  1143. !         lx = KDOTS2UNITS((double) -pc->pkc_x_off) + 0.5;
  1144. !         ly = KDOTS2UNITS((double) pc->pkc_y_off - pc->pkc_height + 1) + 0.5;
  1145. !         ux = KDOTS2UNITS((double) -pc->pkc_x_off + pc->pkc_width) + 0.5;
  1146. !         uy = KDOTS2UNITS((double) pc->pkc_y_off + 1) + 0.5;
  1147. !         if (lx < flx) flx = lx;
  1148. !         if (ly < fly) fly = ly;
  1149. !         if (ux > fux) fux = ux;
  1150. !         if (uy > fuy) fuy = uy;
  1151. !         if (c >= 32 && c <= 126)
  1152. !          printf ("    /%s ", adobecharnames[c-32]);
  1153. !         else printf ("    /ch%d ", c);
  1154. !         printf("[ %d %d %d %d %d %ld %ld %.1f %.1f\n\t<",
  1155. !         (int) (KDOTS2UNITS((double) pc->pkc_dx / pow2(16)) + 0.5),
  1156. !         lx, ly, ux, uy,
  1157.           r->ras_width,
  1158.           r->ras_height,
  1159.           (double) pc->pkc_x_off - .5,            /* shift x */
  1160. ***************
  1161. *** 179,198 ****
  1162.           len = r->ras_height * r->ras_bline;
  1163.           for (i = 0; i < len; i++) {
  1164.           printf("%02x", r->ras_raster[i]);
  1165. !         if (i % 30 == 29)
  1166. !             putchar('\n');
  1167.           }
  1168.           printf(">]\n    def\n");
  1169.           free(r->ras_raster);
  1170.           free(r);
  1171.       }
  1172. !     printf("    /.notdef [ .24 0 0 0 0 1 0 0 0 <>] def\n");
  1173.   
  1174. !     printf("    end\n");
  1175. !     /*    Should be unique enough between Postscript runs    */
  1176. !     printf("    /UniqueID %ld def\n", (long) getpid() + (optind << 16));
  1177.       printf("end\n");
  1178.       printf("/%s exch definefont pop\n", filebuf);
  1179.   
  1180.       /* end of font definition */
  1181.       if (!fontonly) {
  1182. --- 248,279 ----
  1183.           len = r->ras_height * r->ras_bline;
  1184.           for (i = 0; i < len; i++) {
  1185.           printf("%02x", r->ras_raster[i]);
  1186. !         if (i % 30 == 29 && i < len) printf ("\n\t ");
  1187.           }
  1188.           printf(">]\n    def\n");
  1189.           free(r->ras_raster);
  1190.           free(r);
  1191.       }
  1192. !     if (!saw_space)
  1193. !         printf("    /space [ %d 0 0 0 0 1 1 0 0 <>] def\n",
  1194. !            (int) (KDOTS2UNITS((double) sfp_hmi) + 0.5));
  1195. !     printf("    /.notdef [ 0 0 0 0 0 1 0 0 0 <>] def\n");
  1196. !     printf("end %% CharData\n");
  1197. !         /* now that we've seen the whole font,
  1198. !          * we know the font bounding box values */
  1199. !     printf("/FontBBox [%d %d %d %d] def\n", flx, fly, fux, fuy);
  1200. !         /* set the "unique ID" to a random value.
  1201. !          * Adobe guarantees values from 4,000,000 to 4,999,999
  1202. !          * will never be assigned to a commercial font. */
  1203. !     printf("/UniqueID %ld def\n",
  1204. !         4000000 + ((long) getpid() + (optind << 16)) % 1000000);
  1205.   
  1206. !         /* give the font its name */
  1207.       printf("end\n");
  1208.       printf("/%s exch definefont pop\n", filebuf);
  1209. +     printf("%%%%EndFont: %s\n", filebuf);
  1210.   
  1211.       /* end of font definition */
  1212.       if (!fontonly) {
  1213. Index: ./utils/pk2sfp.c
  1214. *** /tmp/PATCHold/./utils/pk2sfp.c    Sat May 23 22:32:04 1992
  1215. --- ./utils/pk2sfp.c    Sat May 23 22:32:08 1992
  1216. ***************
  1217. *** 10,16 ****
  1218.   
  1219.   #ifndef    lint
  1220.   static char SCCSID[] =
  1221. !     "@(#)pk2sfp.c 2.4 Copyright 91/02/20 09:09:52 Chris Lewis";
  1222.   #endif
  1223.   
  1224.   #include "defs.h"
  1225. --- 10,16 ----
  1226.   
  1227.   #ifndef    lint
  1228.   static char SCCSID[] =
  1229. !     "@(#)pk2sfp.c 2.6 Copyright 92/05/19 23:14:44 Chris Lewis";
  1230.   #endif
  1231.   
  1232.   #include "defs.h"
  1233. ***************
  1234. *** 73,78 ****
  1235. --- 73,80 ----
  1236.   }
  1237.   #endif
  1238.   
  1239. + int outscale = 0;
  1240.   main(argc, argv)
  1241.   int argc;
  1242.   char **argv; {
  1243. ***************
  1244. *** 87,94 ****
  1245.   
  1246.       progname = argv[0];
  1247.   
  1248. !     while((c = getopt(argc, argv, "D:s:t:w:f:i:vmSpP")) != EOF) {
  1249.       switch(c) {
  1250.           case 'D':
  1251.   #ifdef    DEBUG
  1252.           setdebug(optarg, "diagnostics");
  1253. --- 89,104 ----
  1254.   
  1255.       progname = argv[0];
  1256.   
  1257. !     while((c = getopt(argc, argv, "o:D:s:t:w:f:i:vmSpP")) != EOF) {
  1258.       switch(c) {
  1259. +         case 'o':
  1260. +         outscale = atoi(optarg);
  1261. +         if (outscale <= 0) {
  1262. +             fprintf(stderr, "%s: invalid -o value: %s\n",
  1263. +             progname, optarg);
  1264. +             exit(1);
  1265. +         }
  1266. +         break;
  1267.           case 'D':
  1268.   #ifdef    DEBUG
  1269.           setdebug(optarg, "diagnostics");
  1270. ***************
  1271. *** 164,169 ****
  1272. --- 174,185 ----
  1273.   
  1274.       /* Read the PK file in-core */
  1275.       pk = pk_read(buf);
  1276. +     if (outscale) {
  1277. +         struct pkp *opkp;
  1278. +         opkp = pk;
  1279. +         pk = pkscale(opkp, outscale);
  1280. +         pk_destroy(opkp);
  1281. +     }
  1282.   
  1283.       /* Overrides */
  1284.       if (symset != NOTSET)
  1285. ***************
  1286. *** 267,273 ****
  1287.   
  1288.   /*    similar to strtol */
  1289.   short
  1290. ! cvt(p)
  1291.   register char *p; {
  1292.       register short ret = 0;
  1293.       int base = 10;
  1294. --- 283,289 ----
  1295.   
  1296.   /*    similar to strtol */
  1297.   short
  1298. ! strtl(p)
  1299.   register char *p; {
  1300.       register short ret = 0;
  1301.       int base = 10;
  1302. ***************
  1303. *** 282,292 ****
  1304.       } else
  1305.           base = 8;
  1306.       while(*p)
  1307. !     ret = ret * base + ccvt(*p++);
  1308.       return(ret);
  1309.   }
  1310.   
  1311. ! ccvt(c)
  1312.   int c; {
  1313.       if (isdigit(c))
  1314.       return(c - '0');
  1315. --- 298,308 ----
  1316.       } else
  1317.           base = 8;
  1318.       while(*p)
  1319. !     ret = ret * base + cstrtl(*p++);
  1320.       return(ret);
  1321.   }
  1322.   
  1323. ! cstrtl(c)
  1324.   int c; {
  1325.       if (isdigit(c))
  1326.       return(c - '0');
  1327. ***************
  1328. *** 350,357 ****
  1329.           exit(1);
  1330.       }
  1331.   
  1332. !     flast->from = cvt(from);
  1333. !     flast->to = cvt(to);
  1334.       flast++;
  1335.       } while (fgets(buffer, sizeof(buffer), f));
  1336.       fclose(f);
  1337. --- 366,373 ----
  1338.           exit(1);
  1339.       }
  1340.   
  1341. !     flast->from = strtl(from);
  1342. !     flast->to = strtl(to);
  1343.       flast++;
  1344.       } while (fgets(buffer, sizeof(buffer), f));
  1345.       fclose(f);
  1346. Index: ./utils/psxlate.c
  1347. *** /tmp/PATCHold/./utils/psxlate.c    Sat May 23 22:32:29 1992
  1348. --- ./utils/psxlate.c    Sat May 23 22:32:36 1992
  1349. ***************
  1350. *** 23,29 ****
  1351.    */
  1352.   #ifndef    lint
  1353.   static char SCCSid[] =
  1354. !     "@(#)psxlate.c: 2.19 Copyright 92/01/23 14:22:16 Chris Lewis";
  1355.   #endif
  1356.   
  1357.   #ifdef    ALONE
  1358. --- 23,29 ----
  1359.    */
  1360.   #ifndef    lint
  1361.   static char SCCSid[] =
  1362. !     "@(#)psxlate.c: 2.20 Copyright 92/03/12 01:11:56 Chris Lewis";
  1363.   #endif
  1364.   
  1365.   #ifdef    ALONE
  1366. ***************
  1367. *** 496,502 ****
  1368.       p[i+mid] = pageidx[i * 2 + 1];
  1369.       }
  1370.   
  1371. !     memcpy((char *) pageidx, p, sizeof(struct pagedesc) * pagecnt);
  1372.       free(p);
  1373.   }
  1374.   
  1375. --- 496,502 ----
  1376.       p[i+mid] = pageidx[i * 2 + 1];
  1377.       }
  1378.   
  1379. !     memcpy((char *) pageidx, (char *) p, sizeof(struct pagedesc) * pagecnt);
  1380.       free(p);
  1381.   }
  1382.   
  1383. ***************
  1384. *** 554,560 ****
  1385.       p[i] = pageidx[i - mid + 1];
  1386.       p[i+1] = pageidx[end-1];
  1387.       }
  1388. !     memcpy((char *) pageidx, p, sizeof(struct pagedesc) * pagecnt);
  1389.       free(p);
  1390.   
  1391.   }
  1392. --- 554,560 ----
  1393.       p[i] = pageidx[i - mid + 1];
  1394.       p[i+1] = pageidx[end-1];
  1395.       }
  1396. !     memcpy((char *) pageidx, (char *) p, sizeof(struct pagedesc) * pagecnt);
  1397.       free(p);
  1398.   
  1399.   }
  1400. Index: ./utils/showfont.S
  1401. *** /tmp/PATCHold/./utils/showfont.S    Sat May 23 22:33:02 1992
  1402. --- ./utils/showfont.S    Sat May 23 22:33:04 1992
  1403. ***************
  1404. *** 5,11 ****
  1405.   #    See the LICENSE file for a full description of the restrictions
  1406.   #    under which this software is provided.
  1407.   #
  1408. ! #@(#)showfont 2.2 91/02/20
  1409.   # Shell script to dump postscript fonts with widths into a pretty table
  1410.   # usage: showfont <fontname>
  1411.   # emits postscript to display the font called <fontname> along with
  1412. --- 5,11 ----
  1413.   #    See the LICENSE file for a full description of the restrictions
  1414.   #    under which this software is provided.
  1415.   #
  1416. ! #@(#)showfont 2.3 92/05/21
  1417.   # Shell script to dump postscript fonts with widths into a pretty table
  1418.   # usage: showfont <fontname>
  1419.   # emits postscript to display the font called <fontname> along with
  1420. ***************
  1421. *** 24,34 ****
  1422.   # the Character is displayed at 18 point.
  1423.   
  1424.   copies=1
  1425. - if [ $# = 0 ]
  1426. - then
  1427. -     echo "usage: showfont <fontname>" >&2
  1428. -     exit 1
  1429. - fi
  1430.   (
  1431.   cat << !END!
  1432.   %! PS-Adobe 1.0
  1433. --- 24,29 ----
  1434. ***************
  1435. *** 49,54 ****
  1436. --- 44,52 ----
  1437.   case $font in
  1438.       /*)
  1439.       font=`echo $font | sed -e 's/^.//'`
  1440. +     ;;
  1441. +     '')
  1442. +     font='Times-Roman'
  1443.       ;;
  1444.   esac
  1445.   cat << !ENDTHING!
  1446. Index: ./adapters/Makefile
  1447. *** /tmp/PATCHold/./adapters/Makefile    Sat May 23 22:33:14 1992
  1448. --- ./adapters/Makefile    Sat May 23 22:33:14 1992
  1449. ***************
  1450. *** 1,4 ****
  1451. ! # 2.5 91/03/19
  1452.   ADAPTERS    = cmn.post cmn.pre tmac.an tmac.m tmac.s tmac.e cmn.dit
  1453.   MACROS        = tmac.t2
  1454.   
  1455. --- 1,4 ----
  1456. ! # 2.7 92/04/26
  1457.   ADAPTERS    = cmn.post cmn.pre tmac.an tmac.m tmac.s tmac.e cmn.dit
  1458.   MACROS        = tmac.t2
  1459.   
  1460. ***************
  1461. *** 16,20 ****
  1462. --- 16,22 ----
  1463.   install:
  1464.       cd $(LIBDIR)/adapters ; rm -f $(ADAPTERS)
  1465.       cp $(ADAPTERS) $(LIBDIR)/adapters
  1466. +     cd $(LIBDIR)/adapters ; chmod 444 $(ADAPTERS)
  1467.       cd $(RTMACDIR) ; rm -f $(MACROS)
  1468.       cp $(MACROS) $(T2DIR)
  1469. +     cd $(T2DIR) ; chmod 444 $(MACROS)
  1470. Index: ./checker.S
  1471. *** /tmp/PATCHold/./checker.S    Sat May 23 22:33:21 1992
  1472. --- ./checker.S    Sat May 23 22:33:23 1992
  1473. ***************
  1474. *** 0 ****
  1475. --- 1,238 ----
  1476. + trap "rm -f /tmp/$$.? ; exit 1" 0 1 2 3 15
  1477. + echo "Automatic Psroff configuration tester.  V1.2 92/04/12"
  1478. + type=
  1479. + header=
  1480. + troffnames="gtroff troff otroff cattroff catroff ditroff"
  1481. + AS=undef
  1482. + make=make
  1483. + perl=
  1484. + shell=/bin/sh
  1485. + if [ -f /usr/apollo/bin/coffdump ]
  1486. + then
  1487. +     echo "You're an Apollo!"
  1488. +     type=apollo
  1489. +     shell=/bin/ksh
  1490. + fi
  1491. + if [ -f /ultrixboot ]
  1492. + then
  1493. +     case "`uname -a`" in
  1494. +     *RISC*)
  1495. +         type=rult
  1496. +         echo "You're a RISC/Ultrix machine!"
  1497. +         ;;
  1498. +     esac
  1499. +     shell=/usr/bin/sh5
  1500. +     make=s5make
  1501. + fi
  1502. + if [ -r /usr/lib/font/ftR ]
  1503. + then
  1504. +     header=/usr/lib/font/ftR
  1505. + else
  1506. +     echo "No /usr/lib/font/ftR file:  Can't check it for CAT troff HEADERSIZE."
  1507. +     either=' either'
  1508. + fi
  1509. + cat > /tmp/$$.c <<\!
  1510. + #include <stdio.h>
  1511. + #include <a.out.h>
  1512. + main() {
  1513. +     printf("%d\n", sizeof(struct exec));
  1514. +     exit(0);
  1515. + }
  1516. + !
  1517. + cc -o /tmp/$$.a /tmp/$$.c > /dev/null 2>&1
  1518. + if [ $? = 0 -a -f /tmp/$$.a ]
  1519. + then
  1520. +     t=`/tmp/$$.a`
  1521. +     if [ $? = 0 ]
  1522. +     then
  1523. +     aoutheader=$t
  1524. +     fi
  1525. + fi
  1526. + if [ -z "$aoutheader" ]
  1527. + then
  1528. +     echo "Can't compile a.out.h test: Can't check it for CAT troff HEADERSIZE$either."
  1529. +     echo "(This test only works on V7 or BSDish machines (Ultrix, Sun etc.) anyways.)"
  1530. + fi
  1531. + if [ -n "$header" ]
  1532. + then
  1533. +     case "$type" in
  1534. +     apollo)
  1535. +         set A `/usr/apollo/bin/coffdump -h $header | grep '\.data'`
  1536. +         HS=`echo "16 i $5 p q" | sed -e 's/0x0*//' | dc`
  1537. +         note=' /* Apollo cannot read own width tables - calc from coffdump */'
  1538. +         ;;
  1539. +     rult)
  1540. +         AS=define
  1541. +         HS=0
  1542. +         note=' /* ignored on Risc/Ultrix */'
  1543. +         ;;
  1544. +     *)
  1545. +         set A `ls -l $header`
  1546. +         case $5 in
  1547. +         [0-9]*)
  1548. +             v=$5
  1549. +             ;;
  1550. +         *)
  1551. +             v=$6
  1552. +             ;;
  1553. +         esac
  1554. +         HS=`expr $v - 224`
  1555. +         ;;
  1556. +     esac
  1557. + fi
  1558. + case $aoutheader.$HS in
  1559. +     [0-9]*.[0-9]*)
  1560. +     if [ $aoutheader -lt $HS ]
  1561. +     then
  1562. +         note=" /* though, might be $HS */"
  1563. +         HS=$aoutheader
  1564. +     elif [ $HS -lt $aoutheader ]
  1565. +     then
  1566. +         note=" /* remotely $aoutheader */"
  1567. +     else
  1568. +         note=" /* a.out.h and .../ftR agree */"
  1569. +     fi
  1570. +     ;;
  1571. +     .)
  1572. +     note=" Nope, can't figure out HEADERSIZE"
  1573. +     ;;
  1574. + esac
  1575. + paths=`echo $PATH | sed -e 's/:/ /g'`
  1576. + for i in $paths
  1577. + do
  1578. +     for j in $troffnames
  1579. +     do
  1580. +     if [ -f $i/$j ]
  1581. +     then
  1582. +         troffs="$troffs $i/$j"
  1583. +     fi
  1584. +     done
  1585. +     if [ -f $i/lpr ]
  1586. +     then
  1587. +     lpr=1
  1588. +     fi
  1589. +     if [ -f $i/lp ]
  1590. +     then
  1591. +     lp=1
  1592. +     fi
  1593. +     if [ -f $i/hostname -a -z "$uuname" ]
  1594. +     then
  1595. +     uuname=hostname
  1596. +     fi
  1597. +     if [ -f $i/uuname -a -z "$uuname" ]
  1598. +     then
  1599. +     uuname='uuname -l'
  1600. +     fi
  1601. +     if [ -f $i/uname -a -z "$uuname" ]
  1602. +     then
  1603. +     uuname='uname -n'
  1604. +     fi
  1605. +     if [ -f $i/perl -a -z "$perl" ]
  1606. +     then
  1607. +     perl=$i/perl
  1608. +     fi
  1609. + done
  1610. + if [ -z "$perl" ]
  1611. + then
  1612. +     perl="Not found: Won't be able to use catconv or buildljfonts"
  1613. + fi
  1614. + if [ -z "$uuname" ]
  1615. + then
  1616. +     uuname='echo <your node name>'
  1617. + fi
  1618. + echo "***  Recommended defs.h settings: ***"
  1619. + echo
  1620. + echo "#define HEADERSIZE $HS$note"
  1621. + echo "#$AS ASCIIWIDTHS"
  1622. + echo '#define NODECMD    "'"$uuname"'"'
  1623. + echo
  1624. + echo "*** Recommended Makefile settings: ***"
  1625. + echo
  1626. + echo "MAKE = $make"
  1627. + echo "SHELL = $shell"
  1628. + echo "PERL = $perl"
  1629. + echo
  1630. + echo "*** psrofflib-related stuff: ***"
  1631. + echo
  1632. + if [ -n "$troffs" ]
  1633. + then
  1634. +     for i in $troffs
  1635. +     do
  1636. +     echo "In order to use $i as your troff, you need to set:"
  1637. +     echo hello | $i > /dev/null 2>&1
  1638. +     ditroffokay=$?
  1639. +     echo hello | $i -t > /dev/null 2>&1
  1640. +     cattroffokay=$?
  1641. +     if [ $ditroffokay = 0 -a $cattroffokay != 0 ]
  1642. +     then
  1643. +         echo "    troff=$i # ditroff: use -N option in t2arg"
  1644. +         ditroff=1
  1645. +         continue
  1646. +     fi
  1647. +     if [ $ditroffokay != 0 -a $cattroffokay = 0 ]
  1648. +     then
  1649. +         echo "    troff=$i # is CAT troff"
  1650. +         cattroff=1
  1651. +         if echo hello | $i -F/usr/lib/font/ftXX -t > /dev/null 2>&1
  1652. +         then
  1653. +         echo "    trofftype='-F%%FONTDIR%%/\$width/ftXX'"
  1654. +         elif echo hello | $i -T. -t > /dev/null 2>&1
  1655. +         then
  1656. +         echo "    trofftype='-T\$width'"
  1657. +         echo "    [ps: FONTDIR MUST be /usr/lib/font]"
  1658. +         else
  1659. +         echo "    trofftype= # Neither -F nor -T seem to work"
  1660. +         fi
  1661. +         continue
  1662. +     fi 
  1663. +     echo "Can't tell what kind of troff $i is"
  1664. +     done
  1665. + else
  1666. +     echo "Couldn't seem to find any versions of troff out there in your PATH"
  1667. +     echo "   (And I looked for $troffnames)"
  1668. +     notroff=1
  1669. + fi
  1670. + echo
  1671. + if [ -n "$lpr" ]
  1672. + then
  1673. +     echo "You have Berkeley style 'lpr'.  The lparg entry will typically"
  1674. +     echo "be something like lparg=| [F |] lpr -P\$ptr -#\$copies'"
  1675. + fi
  1676. + if [ -n "$lp" ]
  1677. + then
  1678. +     echo "You have System V style 'lp'.  The lparg entry will typically"
  1679. +     echo "be something like lparg=| [F |] lp -n\$copies -d\$ptr'"
  1680. + fi
  1681. + if [ -n "$lp" -o -n "$lpr" ]
  1682. + then
  1683. +     echo "Where 'F' is an additional filter, such as psxlate for PostScript"
  1684. + fi
  1685. + if [ -z "$lp" -a -z "$lpr" ]
  1686. + then
  1687. +     echo "Can't find lp or lpr, so I can't make any suggestions on the lparg"
  1688. +     echo "entry."
  1689. + fi
  1690. + echo
  1691. + echo "*** Overall automatic configurator error report) ***"
  1692. + if [ -z "$cattroff" -a -z "$ditroff" ]
  1693. + then
  1694. +     echo "- You con't have any kind of troff in your search path."
  1695. +     echo "  Unless you can find one, you can't use psroff."
  1696. + fi
  1697. + if [ -n "$cattroff" -a -z "$HS" ]
  1698. + then
  1699. +     echo "- You have CAT troff, but I couldn't figure out your HEADERSIZE."
  1700. +     echo "  You should probably ask for help."
  1701. + fi
  1702. + if [ -z "$perl" ]
  1703. + then
  1704. +     echo "- Couldn't find perl - just means you can't emulate ditroff in CAT troff"
  1705. + fi
  1706. + trap '' 0
  1707. + exit 0
  1708. Index: ./utils.c
  1709. *** /tmp/PATCHold/./utils.c    Sat May 23 22:33:32 1992
  1710. --- ./utils.c    Sat May 23 22:33:34 1992
  1711. ***************
  1712. *** 12,18 ****
  1713.   
  1714.   #ifndef    lint
  1715.   static char SCCSid[] =
  1716. !     "@(#)utils.c: 2.23 Copyright 92/01/12 03:55:40 Chris Lewis";
  1717.   #endif
  1718.   
  1719.   #ifndef    HEADERSIZE
  1720. --- 12,18 ----
  1721.   
  1722.   #ifndef    lint
  1723.   static char SCCSid[] =
  1724. !     "@(#)utils.c: 2.24 Copyright 92/05/21 02:58:25 Chris Lewis";
  1725.   #endif
  1726.   
  1727.   #ifndef    HEADERSIZE
  1728. ***************
  1729. *** 410,431 ****
  1730.   }
  1731.   
  1732.   FontSel(from, to)
  1733. ! char from, *to; {
  1734.   #ifdef    DEBUG
  1735.       register int i;
  1736.   #endif
  1737.       register struct fonttable *p;
  1738.       int intfont;
  1739. !     DBP((D_SPEC, "FontSel: %c -> %s\n", from, to));
  1740. ! #ifdef    DIT
  1741. !     if (from < (ditroff? '0' : '1') || from > '9') {
  1742. ! #else
  1743. !     if (from < '1' || from > '9') {
  1744. ! #endif
  1745. !     fprintf(stderr, "Bad arguments to FontSel: %c %s\n", from, to);
  1746.       return;
  1747.       }
  1748. !     intfont = from - '1';
  1749.       if (intfont < 0)
  1750.       intfont = INTFONTS - 1;
  1751.       if (strcmp(to, "S") == 0) {
  1752. --- 410,432 ----
  1753.   }
  1754.   
  1755.   FontSel(from, to)
  1756. ! char *from, *to; {
  1757.   #ifdef    DEBUG
  1758.       register int i;
  1759.   #endif
  1760.       register struct fonttable *p;
  1761.       int intfont;
  1762. !     DBP((D_SPEC, "FontSel: %s -> %s\n", from, to));
  1763. !     intfont = atoi(from);
  1764. !     if (intfont < (ditroff? 0 : 1) || intfont >= INTFONTS) {
  1765. !     fprintf(stderr, "Bad arguments to FontSel: %s %s\n", intfont, to);
  1766.       return;
  1767.       }
  1768. !     intfont -= 1;
  1769.       if (intfont < 0)
  1770.       intfont = INTFONTS - 1;
  1771.       if (strcmp(to, "S") == 0) {
  1772. ***************
  1773. *** 443,449 ****
  1774.           break;
  1775.       }
  1776.       if (!p->troffName) {
  1777. !     fprintf(stderr, "Could not translate font %c (%s)\n", from, to);
  1778.       }
  1779.   #ifdef    OPT
  1780.       if (p->troffName && !p->widthtable)
  1781. --- 444,450 ----
  1782.           break;
  1783.       }
  1784.       if (!p->troffName) {
  1785. !     fprintf(stderr, "Could not translate font %s (%s)\n", from, to);
  1786.       }
  1787.   #ifdef    OPT
  1788.       if (p->troffName && !p->widthtable)
  1789. Index: ./ps.c
  1790. *** /tmp/PATCHold/./ps.c    Sat May 23 22:33:46 1992
  1791. --- ./ps.c    Sat May 23 22:33:48 1992
  1792. ***************
  1793. *** 15,21 ****
  1794.   
  1795.   #ifndef    lint
  1796.   static char SCCSid[] =
  1797. !     "@(#)ps.c: 2.18 Copyright 92/01/12 03:55:46 Chris Lewis";
  1798.   #endif
  1799.   
  1800.   /*    ps.c will generate some additional "print" commands to cause
  1801. --- 15,21 ----
  1802.   
  1803.   #ifndef    lint
  1804.   static char SCCSid[] =
  1805. !     "@(#)ps.c: 2.19 Copyright 92/05/19 23:11:03 Chris Lewis";
  1806.   #endif
  1807.   
  1808.   /*    ps.c will generate some additional "print" commands to cause
  1809. ***************
  1810. *** 341,358 ****
  1811.       }
  1812.   
  1813.       fp->flags |= USED;
  1814.   #ifdef    FONTMACRO
  1815. !     printf("/%s %d SetFont\n", fp->fontName, points);
  1816.   #else
  1817.       printf("/%s dup /curFont exch def findfont\n",
  1818.           fp->fontName);
  1819.       printf("%d dup /curPoints exch def scalefont setfont\n", points);
  1820.   #endif
  1821.       lastPoints = points;
  1822.       lastFont = font;
  1823.       }
  1824.   }
  1825.   
  1826.   psChar(x, y, font, points, troffChar, sequence)
  1827.   int x, y;
  1828.   int font, points, troffChar;
  1829. --- 341,378 ----
  1830.       }
  1831.   
  1832.       fp->flags |= USED;
  1833. + #define NEW
  1834. + #ifdef NEW
  1835. +     printf("%d F%d\n", points, fp - fonttable);
  1836. + #else
  1837.   #ifdef    FONTMACRO
  1838. !     printf("/%s %d S\n", fp->fontName, points);
  1839.   #else
  1840.       printf("/%s dup /curFont exch def findfont\n",
  1841.           fp->fontName);
  1842.       printf("%d dup /curPoints exch def scalefont setfont\n", points);
  1843.   #endif
  1844. + #endif
  1845.       lastPoints = points;
  1846.       lastFont = font;
  1847.       }
  1848.   }
  1849.   
  1850. + putseq(sequence)
  1851. + register char *sequence; {
  1852. +     putchar('(');
  1853. +     while(*sequence) {
  1854. +     if ((*sequence)&0x80)
  1855. +         printf("\\%03o", (*sequence++)&0xff);
  1856. +     else if (*sequence == '(' || *sequence == ')' ||
  1857. +         *sequence == '\\')
  1858. +         printf("\\%c", *sequence++);
  1859. +     else
  1860. +         putchar(*sequence++);
  1861. +     }
  1862. +     putchar(')');
  1863. + }
  1864.   psChar(x, y, font, points, troffChar, sequence)
  1865.   int x, y;
  1866.   int font, points, troffChar;
  1867. ***************
  1868. *** 423,428 ****
  1869. --- 443,462 ----
  1870.   
  1871.       DBP((D_BEND,"AFTER (sequence,x,y,font,points) = (%s,%d,%d,%d,%d)\n",
  1872.       sequence, nx, ny, font, points));
  1873. +     
  1874. + #ifdef SPACEOPT
  1875. +     { extern int spcwidth, spccount, spcnom;
  1876. +     if (spcwidth && spcwidth != spcnom) {
  1877. +         putseq(sequence);
  1878. +         lastYPos = ny;
  1879. +         emitnums(TROFF2PSX(spcwidth) - TROFF2PSX(spcnom)); /* accurate enough? */
  1880. +         emitnums(nx);
  1881. +         emitnums(ny);
  1882. +         putnl("W");
  1883. +         return;
  1884. +     }
  1885. +     }
  1886. + #endif
  1887.   
  1888.       if (rp->t2b_font == D) {
  1889.       emitnums(nx);
  1890. ***************
  1891. *** 434,450 ****
  1892.           putchar(' ');
  1893.           emitnum(ny);
  1894.       }
  1895. !     putchar('(');
  1896. !     while(*sequence) {
  1897. !         if ((*sequence)&0x80)
  1898. !         printf("\\%03o", (*sequence++)&0xff);
  1899. !         else if (*sequence == '(' || *sequence == ')' ||
  1900. !         *sequence == '\\')
  1901. !         printf("\\%c", *sequence++);
  1902. !         else
  1903. !         putchar(*sequence++);
  1904. !     }
  1905. !     putchar(')');
  1906.       if (lastYPos != ny) {
  1907.           lastYPos = ny;
  1908.           putchar('Y');
  1909. --- 468,474 ----
  1910.           putchar(' ');
  1911.           emitnum(ny);
  1912.       }
  1913. !     putseq(sequence);
  1914.       if (lastYPos != ny) {
  1915.           lastYPos = ny;
  1916.           putchar('Y');
  1917. ***************
  1918. *** 499,504 ****
  1919. --- 523,529 ----
  1920.       char buffer[30];
  1921.       FILE *library;
  1922.       long curtime;
  1923. +     register struct fonttable *p;
  1924.   
  1925.       currentPage = 0;
  1926.       pagePending = 1;
  1927. ***************
  1928. *** 537,542 ****
  1929. --- 562,575 ----
  1930.   #endif
  1931.       printf("usertime /btime exch def\n");
  1932.       psXlate(library, "lib.ps");
  1933. +     for (p = fonttable; p->troffName; p++) {
  1934. +     if (p->fontName[0] == '_')
  1935. +         printf("stdencoding /%s /%s RE\n",
  1936. +         p->fontName, p->fontName+1);
  1937. +     printf("/F%d { /%s exch S } bind def\n",
  1938. +         p - fonttable, p->fontName);
  1939. +     }
  1940.       doprologs();
  1941.       printf("%%%%EndProlog\n");
  1942.       fclose(library);
  1943. Index: ./dit.c
  1944. *** /tmp/PATCHold/./dit.c    Sat May 23 22:34:04 1992
  1945. --- ./dit.c    Sat May 23 22:34:06 1992
  1946. ***************
  1947. *** 12,18 ****
  1948.   
  1949.   #ifndef    lint
  1950.   static char SCCSid[] =
  1951. !     "@(#)dit.c: Copyright 92/03/03 02:25:40 Chris Lewis";
  1952.   #endif
  1953.   
  1954.   extern struct cattab tabN[], tabS[], *extidx;
  1955. --- 12,18 ----
  1956.   
  1957.   #ifndef    lint
  1958.   static char SCCSid[] =
  1959. !     "@(#)dit.c: Copyright 92/05/21 02:58:07 Chris Lewis";
  1960.   #endif
  1961.   
  1962.   extern struct cattab tabN[], tabS[], *extidx;
  1963. ***************
  1964. *** 151,158 ****
  1965.       char special[512];
  1966.       fixtab();
  1967.       DBP((D_CAT, "Finished fixtab\n"));
  1968.       while(1) {
  1969. !     switch(cmd = skipwhite()) {
  1970.           case EOF:
  1971.           goto finish;
  1972.           case 's':
  1973. --- 151,170 ----
  1974.       char special[512];
  1975.       fixtab();
  1976.       DBP((D_CAT, "Finished fixtab\n"));
  1977. +     cmd = skipwhite();
  1978. +     if (cmd == 0x40) {
  1979. +     fprintf(stderr, "%s: illegal starting sequence for ditroff.\n",
  1980. +         progname);
  1981. +     fprintf(stderr, "I think this is really CAT troff output.\n");
  1982. +     fprintf(stderr, "Please double check your troff & -N settings.\n");
  1983. +     exit(1);
  1984. +     }
  1985.       while(1) {
  1986. !     switch(cmd) {
  1987. !         default:
  1988. !         fprintf(stderr, "%s: illegal command 0x%02x.\n", progname, cmd);
  1989. !         break;
  1990. !         /*NOTREACHED*/
  1991.           case EOF:
  1992.           goto finish;
  1993.           case 's':
  1994. ***************
  1995. *** 278,284 ****
  1996.               canonflush();
  1997.   #endif
  1998.               /* synchronize special X & Y to current position
  1999. !                (ie: so psfig will work */
  2000.               specXPos = DIT2CAT(xpos);
  2001.               specYPos = DIT2CAT(ypos);
  2002.   
  2003. --- 290,296 ----
  2004.               canonflush();
  2005.   #endif
  2006.               /* synchronize special X & Y to current position
  2007. !                (ie: so psfig will work) */
  2008.               specXPos = DIT2CAT(xpos);
  2009.               specYPos = DIT2CAT(ypos);
  2010.   
  2011. ***************
  2012. *** 307,313 ****
  2013.                   }
  2014.                   sprintf(special, "F%s%s", a1, a2);
  2015.                   DBP((D_CAT, "FONT %s %s\n", a1, a2));
  2016. !                 dospecial(special);
  2017.                   break;
  2018.               case 'r':    /* specify resolution */
  2019.                   if (i != 4) {
  2020. --- 319,328 ----
  2021.                   }
  2022.                   sprintf(special, "F%s%s", a1, a2);
  2023.                   DBP((D_CAT, "FONT %s %s\n", a1, a2));
  2024. !                 if (be->befontsel)
  2025. !                 (*be->befontsel)(a1,a2);
  2026.                   break;
  2027.               case 'r':    /* specify resolution */
  2028.                   if (i != 4) {
  2029. ***************
  2030. *** 469,474 ****
  2031. --- 484,490 ----
  2032.           }
  2033.           break;
  2034.       }
  2035. +     cmd = skipwhite();
  2036.       }
  2037.       finish: ;
  2038.   }
  2039. Index: ./README
  2040. *** /tmp/PATCHold/./README    Sat May 23 22:34:19 1992
  2041. --- ./README    Sat May 23 22:34:24 1992
  2042. ***************
  2043. *** 1,4 ****
  2044. !         PSROFF RELEASE 3.0 README 2.23 92/01/28
  2045.   
  2046.               Feb 19, 1991
  2047.               Chris Lewis
  2048. --- 1,4 ----
  2049. !         PSROFF RELEASE 3.0 README 2.24 92/05/23
  2050.   
  2051.               Feb 19, 1991
  2052.               Chris Lewis
  2053. ***************
  2054. *** 397,417 ****
  2055.   special commands (eg: the .fp fakeouts) will be converted over to the FSA
  2056.   mechanism.
  2057.   
  2058. - You may have noticed a compile flag called "OPT" which is defined in
  2059. - the distributed version of defs.h.  If enabled (via -Z/W), this enables the
  2060. - optimizer.  It works well with Postscript output, but not with laserjet
  2061. - unless the fonts you use are VERY good.  It's enabled by default for ps.
  2062. - The optimizer does two things: it emits as many characters as it can as one
  2063. - print directive, rather than one CAT code per print.  On postscript and
  2064. - HPLJ's this is a BIG win (printer execution speeds 3 or more times faster),
  2065. - and is essential with ditroff output to psdit and xtroff.  The optimizer
  2066. - requires access to the CAT troff width tables (even when used with ditroff),
  2067. - and if troff2ps can't find them, it will abort.
  2068.   Hpinterp was borrowed and converted into a general HP LJ to PBM
  2069.   converter.  This permits the output of psroff to be printed on
  2070.   just about ANY printer.  The new version of hpinterp (now called
  2071. ! hp2pbm) will eventually be reintegrated back into psroff.
  2072.   
  2073.   Psroff limitations:
  2074.       - With the use of catconv and CAT troff, psroff supports:
  2075. --- 397,407 ----
  2076.   special commands (eg: the .fp fakeouts) will be converted over to the FSA
  2077.   mechanism.
  2078.   
  2079.   Hpinterp was borrowed and converted into a general HP LJ to PBM
  2080.   converter.  This permits the output of psroff to be printed on
  2081.   just about ANY printer.  The new version of hpinterp (now called
  2082. ! hp2pbm) will eventually be reintegrated back into psroff.  Hp2pbm is
  2083. ! currently available from comp.sources.misc archives.
  2084.   
  2085.   Psroff limitations:
  2086.       - With the use of catconv and CAT troff, psroff supports:
  2087. ***************
  2088. *** 432,440 ****
  2089.       - Psroff only supports CAT troff sizes in HPPCL (some mechanism to relax
  2090.         this for HPLJIII's is easy to implement).  All sizes are available in
  2091.         Postscript and ditroff.
  2092. -     - psroff doesn't implement "w" (word breaks in ditroff output).
  2093. -     - psroff doesn't support "stipple" (I have NO idea what this is -
  2094. -       apparently a Berkeleyism.)
  2095.   
  2096.   CONTACT INFO (note that I've moved):
  2097.   
  2098. --- 422,427 ----
  2099. Index: ./troff2.c
  2100. *** /tmp/PATCHold/./troff2.c    Sat May 23 22:34:41 1992
  2101. --- ./troff2.c    Sat May 23 22:34:43 1992
  2102. ***************
  2103. *** 12,18 ****
  2104.   
  2105.   #ifndef    lint
  2106.   static char SCCSid[] =
  2107. !     "@(#)troff2.c: 2.22 Copyright 91/10/17 11:58:25 Chris Lewis";
  2108.   #endif
  2109.   
  2110.   #define    ESC    0x80
  2111. --- 12,18 ----
  2112.   
  2113.   #ifndef    lint
  2114.   static char SCCSid[] =
  2115. !     "@(#)troff2.c: 2.25 Copyright 92/05/21 02:58:15 Chris Lewis";
  2116.   #endif
  2117.   
  2118.   #define    ESC    0x80
  2119. ***************
  2120. *** 92,98 ****
  2121.   
  2122.   extern char *realloc();
  2123.   
  2124. ! #define    OPTLIST    "d:O:Y:T:VD:l:MR:P::zp:W:ZNnSG:"
  2125.   
  2126.   /*    On 386/ix 1.0.6 profiling has a bug in it that leaves
  2127.       two extra longs on the stack between the stack frame and
  2128. --- 92,98 ----
  2129.   
  2130.   extern char *realloc();
  2131.   
  2132. ! #define    OPTLIST    "d:O:Y:T:VD:l:MR:P::zp:W:ZNnSG:g:"
  2133.   
  2134.   /*    On 386/ix 1.0.6 profiling has a bug in it that leaves
  2135.       two extra longs on the stack between the stack frame and
  2136. ***************
  2137. *** 114,119 ****
  2138. --- 114,120 ----
  2139.       register int nc, c;
  2140.       register int units;
  2141.       register int rail, mag, tilt, half, escape, lead;
  2142. +     char *p;
  2143.   
  2144.       extern int getopt();
  2145.       extern char *optarg;
  2146. ***************
  2147. *** 158,163 ****
  2148. --- 159,181 ----
  2149.           case 'Z':
  2150.               optimize = 1;
  2151.               break;
  2152. +         case 'g':
  2153. +             optimize = 1;
  2154. +             for (p = optarg; *p; p++) {
  2155. +             if (*p == '.')
  2156. +                 fixedperiodwidth = 1;
  2157. +             else if (*p == 'l') {
  2158. +                 spaceopt = 1;
  2159. +                 optrun = OPTSIZ - 5;
  2160. +             } else {
  2161. +                 optrun = atoi(p);
  2162. +                 if (optrun > OPTSIZ - 5)
  2163. +                 optrun = OPTSIZ - 5;
  2164. +                 break;
  2165. +             }
  2166. +             }
  2167. +             break;
  2168. +             
  2169.           case 'W':
  2170.               widthtables = mustmalloc(strlen(optarg) + 10, "widthname");
  2171.               strcpy(widthtables, optarg);
  2172. ***************
  2173. *** 321,326 ****
  2174. --- 339,353 ----
  2175.       }
  2176.   #endif
  2177.   
  2178. +     c = getc(stdin);
  2179. +     if (c != 0x40) {
  2180. +         fprintf(stderr, "%s: first character 0x%02x - not CAT troff output.\n",
  2181. +         progname, c);
  2182. +         fprintf(stderr,
  2183. +         "Probably ditroff.  Did you forget -N in command line or psrofflib?\n");
  2184. +         exit(1);
  2185. +     }
  2186.       if (be->beprolog)
  2187.           (*be->beprolog)();
  2188.   
  2189. ***************
  2190. *** 338,344 ****
  2191.       tilt = DOWN;
  2192.       calcfont;
  2193.   
  2194. !     while ((c = getc(stdin)) != EOF) {
  2195.           switch(c) {
  2196.           case 0x00:
  2197.               DBP((D_CAT,"NOP\n"));
  2198. --- 365,372 ----
  2199.       tilt = DOWN;
  2200.       calcfont;
  2201.   
  2202. !     while (c != EOF) {
  2203.           switch(c) {
  2204.           case 0x00:
  2205.               DBP((D_CAT,"NOP\n"));
  2206. ***************
  2207. *** 610,615 ****
  2208. --- 638,644 ----
  2209.               DBP((D_CAT,"Illegal: %02x\n", c));
  2210.               break;
  2211.           }
  2212. +         c = getc(stdin);
  2213.       }
  2214.   #ifdef    OPT
  2215.       canonflush();
  2216. ***************
  2217. *** 802,809 ****
  2218.           }
  2219.   
  2220.           case 'F':
  2221. !         if (be->befontsel)
  2222. !             (*be->befontsel)(*(string+1), string+2);
  2223.           *string ='\0';
  2224.           return;
  2225.   #ifdef    FORM
  2226. --- 831,842 ----
  2227.           }
  2228.   
  2229.           case 'F':
  2230. !         if (be->befontsel) {
  2231. !             char tmp[2];
  2232. !             tmp[0] = string[1];
  2233. !             tmp[1] = 0;
  2234. !             (*be->befontsel)(tmp, string+2);
  2235. !         }
  2236.           *string ='\0';
  2237.           return;
  2238.   #ifdef    FORM
  2239. Index: ./defs.h
  2240. *** /tmp/PATCHold/./defs.h    Sat May 23 22:34:57 1992
  2241. --- ./defs.h    Sat May 23 22:34:59 1992
  2242. ***************
  2243. *** 9,15 ****
  2244.    */
  2245.   
  2246.   /*    Official Release and Patch level:    */
  2247. ! #define    T2VERSION    "@(#)PSROFF Copyright 92/02/10 Chris Lewis - R3 PL10"
  2248.   
  2249.   /*    Configuration parameters:
  2250.    */
  2251. --- 9,15 ----
  2252.    */
  2253.   
  2254.   /*    Official Release and Patch level:    */
  2255. ! #define    T2VERSION    "@(#)PSROFF Copyright 92/05/21 Chris Lewis - R3 PL11"
  2256.   
  2257.   /*    Configuration parameters:
  2258.    */
  2259. ***************
  2260. *** 121,131 ****
  2261.    */
  2262.   
  2263.   /*    Basic drivers: */
  2264.   #define    PS    /* Postscript */
  2265.   #define    LJ    /* Laserjet - utils programs will not build with this undef'd */
  2266.   #define    LJ3    /* Laserjet 3 - does LJ + HP-GL/2 for PIC */
  2267.   #define    DT    /* ditroff */
  2268. - #define    DIT    /* ditroff *front-end* */
  2269.   
  2270.   /*    Laserjet driver config: */
  2271.   #define    PK    /* enable PK font downloading (needs LJ) */
  2272. --- 121,132 ----
  2273.    */
  2274.   
  2275.   /*    Basic drivers: */
  2276. + #define    DIT    /* ditroff *front-end* */
  2277.   #define    PS    /* Postscript */
  2278. + #ifndef PSONLY
  2279.   #define    LJ    /* Laserjet - utils programs will not build with this undef'd */
  2280.   #define    LJ3    /* Laserjet 3 - does LJ + HP-GL/2 for PIC */
  2281.   #define    DT    /* ditroff */
  2282.   
  2283.   /*    Laserjet driver config: */
  2284.   #define    PK    /* enable PK font downloading (needs LJ) */
  2285. ***************
  2286. *** 137,142 ****
  2287. --- 138,144 ----
  2288.   #define    PARTIAL    /* partial (not incremental) font downloading */
  2289.   
  2290.   #define    INCR    /* enable incremental font downloading (needs PARTIAL) */
  2291. + #endif
  2292.   
  2293.   #define    MDLF    16    /* Max # downloaded fonts permitted by your laserjet
  2294.                  per *page*.  16 is correct for HPLJ+ and most II's.
  2295. ***************
  2296. *** 155,160 ****
  2297. --- 157,164 ----
  2298.                  to have this turned on */
  2299.   
  2300.   #define    OPT        /* CAT code reorder and optimizer */
  2301. + #define SPACEOPT    /* hyperoptimization */
  2302. + #define OPTSIZ 200    /* size of optimizer buffer */
  2303.   
  2304.   #define    DEFPL  11    /* Default page length (11 inches).
  2305.                  DO NOT change unless you absolutely HAVE to.
  2306. ***************
  2307. *** 225,231 ****
  2308.   #include    "Can't define SFP without PK"
  2309.   #endif
  2310.   
  2311. ! #if    !defined(LJ) || !defined(PK)
  2312.   #include    "Sorry, can't compile without LJ and PK (for now)"
  2313.   #endif
  2314.   
  2315. --- 229,235 ----
  2316.   #include    "Can't define SFP without PK"
  2317.   #endif
  2318.   
  2319. ! #if    !defined(PSONLY) && (!defined(LJ) || !defined(PK))
  2320.   #include    "Sorry, can't compile without LJ and PK (for now)"
  2321.   #endif
  2322.   
  2323. ***************
  2324. *** 430,435 ****
  2325. --- 434,441 ----
  2326.   extern char *mustmalloc();
  2327.   
  2328.   extern char *version, *shortversion;
  2329. + extern int optrun, fixedperiodwidth, spaceopt;
  2330.   
  2331.   #define    MAXPAGE    2000
  2332.   #ifdef    ALONE
  2333. Index: ./INSTALL
  2334. *** /tmp/PATCHold/./INSTALL    Sat May 23 22:35:21 1992
  2335. --- ./INSTALL    Sat May 23 22:35:25 1992
  2336. ***************
  2337. *** 1,5 ****
  2338.           Psroff 3.0 Installation Instructions
  2339. !             2.17 92/01/12
  2340.   
  2341.   Please see the TROUBLE file if you have difficulties.
  2342.   The README file does provide a bit more background on some
  2343. --- 1,5 ----
  2344.           Psroff 3.0 Installation Instructions
  2345. !             2.18 92/05/23
  2346.   
  2347.   Please see the TROUBLE file if you have difficulties.
  2348.   The README file does provide a bit more background on some
  2349. ***************
  2350. *** 89,98 ****
  2351.         see if we can get DEC to put it in as a update]
  2352.   
  2353.         Apollos need the -F trofftype variant.  Their HEADERSIZE
  2354. !       calculation is strange.  If you are SR10.3, set HEADERSIZE
  2355. !       to 304.  On SR10.2 and earlier, set HEADERSIZE to 336.
  2356. !       If this doesn't work out, consult the TROUBLE file
  2357. !       on "HEADERSIZE calculations".
  2358.   
  2359.       - NOTE: during installs as root, the makefiles attempt to be
  2360.         careful about the modes of the files it creates.  HOWEVER,
  2361. --- 89,97 ----
  2362.         see if we can get DEC to put it in as a update]
  2363.   
  2364.         Apollos need the -F trofftype variant.  Their HEADERSIZE
  2365. !       calculation is strange.  It appears that HEADERSIZE should
  2366. !       always be set to 304.  "make check" should give the right
  2367. !       result.
  2368.   
  2369.       - NOTE: during installs as root, the makefiles attempt to be
  2370.         careful about the modes of the files it creates.  HOWEVER,
  2371. ***************
  2372. *** 121,138 ****
  2373.         lib/*.lib) are field-configurable, and it is possible I
  2374.         will patch a few of them later (particularly lj.fonts).
  2375.   
  2376. !     - If you are using the supplied width tables (widths/widthps),
  2377. !       all is fine.  But, if you're going to be driving another
  2378. !       package (eg: jetroff, tpscript, psdit etc.) I suggest
  2379. !       you find the ditroff-format ASCII width tables (DESC, R, I,
  2380. !       S etc.), copy them to the appropriate widths/width<xx> area,
  2381. !       modify psrofflib.S to know how to use these width tables,
  2382. !       and possibly create *.fonts and *.lib files.  psrofflib.S
  2383. !       has copious comments on how to configure psroff.
  2384.   
  2385. !       xtroff is supposedly already set - it should work
  2386. !       "out-of-the-box".  Patch level 10 for xtroff is preferred.
  2387. !       [Contact moraes@cs.toronto.edu for more details]
  2388.   
  2389.         psdit, tpscript, xtroff, Pageview, Display Postscript and
  2390.         xproof work reasonably well using the Postscript widths in
  2391. --- 120,134 ----
  2392.         lib/*.lib) are field-configurable, and it is possible I
  2393.         will patch a few of them later (particularly lj.fonts).
  2394.   
  2395. !     - Any of the configurations mentioned in psrofflib.S should
  2396. !       work fine, given that you make the proper configuration
  2397. !       changes for your system.  In some cases, particularly
  2398. !       when you want to use a different ditroff-2-something converter
  2399. !       from CAT troff, you will have to copy the width tables into
  2400. !       widths/widthxx, and make up your own psrofflib.S entries.
  2401.   
  2402. !       Patch level 10 for xtroff is preferred.  [Contact
  2403. !       moraes@cs.toronto.edu for more details]
  2404.   
  2405.         psdit, tpscript, xtroff, Pageview, Display Postscript and
  2406.         xproof work reasonably well using the Postscript widths in
  2407. Index: ./Makefile
  2408. *** /tmp/PATCHold/./Makefile    Sat May 23 22:35:59 1992
  2409. --- ./Makefile    Sat May 23 22:36:06 1992
  2410. ***************
  2411. *** 7,13 ****
  2412.   #    Function: Upper level makefile; configuration options.
  2413.   #
  2414.   #
  2415. ! #ident  "@(#)Makefile: 2.31 Copyright 92/02/21 09:31:19 Chris Lewis"
  2416.   
  2417.   #    If you're not sure whether you have a System V make, leave
  2418.   #    this alone, and run the make anyways.  If it dies horribly
  2419. --- 7,13 ----
  2420.   #    Function: Upper level makefile; configuration options.
  2421.   #
  2422.   #
  2423. ! #ident  "@(#)Makefile: 2.33 Copyright 92/05/21 02:21:05 Chris Lewis"
  2424.   
  2425.   #    If you're not sure whether you have a System V make, leave
  2426.   #    this alone, and run the make anyways.  If it dies horribly
  2427. ***************
  2428. *** 212,218 ****
  2429.   CFLAGS    = $(DEFINES)
  2430.   
  2431.   all:    troff2ps myuid subst.done makeincl psroff README TROUBLE LASERFONTS \
  2432. !     MISC DITROFF INSTALL LICENSE LJIII zap submakes
  2433.   
  2434.   subst.done:    sedscript
  2435.       rm -f psroff makeincl
  2436. --- 212,218 ----
  2437.   CFLAGS    = $(DEFINES)
  2438.   
  2439.   all:    troff2ps myuid subst.done makeincl psroff README TROUBLE LASERFONTS \
  2440. !     MISC DITROFF INSTALL LICENSE LJIII zap pkscale.o submakes
  2441.   
  2442.   subst.done:    sedscript
  2443.       rm -f psroff makeincl
  2444. ***************
  2445. *** 284,289 ****
  2446. --- 284,290 ----
  2447.       test -d $(LIBDIR) || mkdir $(LIBDIR)
  2448.       test -d $(LIBDIR)/lib || mkdir $(LIBDIR)/lib
  2449.       test -d $(LIBDIR)/lib/lj || mkdir $(LIBDIR)/lib/lj
  2450. +     chmod 755 $(LIBDIR) $(LIBDIR)/lib $(LIBDIR)/lib/lj
  2451.       $(IGNORESH) files=`echo fonts.lj/*.pk` ; \
  2452.       if [ "$$files" != 'fonts.lj/*.pk' ] ; \
  2453.       then \
  2454. ***************
  2455. *** 312,325 ****
  2456.   install:    makeincl myuid
  2457.       test "`./myuid`" = 0 || \
  2458.           ( echo "ERROR: You must be root to install" ; exit 1 )
  2459. !     test -d $(BINDIR) || mkdir $(BINDIR)
  2460.       test -d $(MANDIR) || \
  2461.           echo "No MANDIR directory.  Have you got MANDIR right?"
  2462.       test -d $(LIBDIR) || mkdir $(LIBDIR)
  2463.       test -d $(LIBDIR)/adapters || mkdir $(LIBDIR)/adapters
  2464.       test -d $(LIBDIR)/lib || mkdir $(LIBDIR)/lib
  2465. !     test -d $(RTMACDIR) || mkdir $(RTMACDIR)
  2466. !     test -d $(FONTDIR) || mkdir $(FONTDIR)
  2467.       rm -f $(BINDIR)/psroff.old
  2468.       -cp $(BINDIR)/psroff $(BINDIR)/psroff.old 2> /dev/null
  2469.       cp psroff $(BINDIR)/psroff
  2470. --- 313,327 ----
  2471.   install:    makeincl myuid
  2472.       test "`./myuid`" = 0 || \
  2473.           ( echo "ERROR: You must be root to install" ; exit 1 )
  2474. !     test -d $(BINDIR) || (mkdir $(BINDIR) ; chmod 755 $(BINDIR) )
  2475.       test -d $(MANDIR) || \
  2476.           echo "No MANDIR directory.  Have you got MANDIR right?"
  2477.       test -d $(LIBDIR) || mkdir $(LIBDIR)
  2478.       test -d $(LIBDIR)/adapters || mkdir $(LIBDIR)/adapters
  2479.       test -d $(LIBDIR)/lib || mkdir $(LIBDIR)/lib
  2480. !     test -d $(RTMACDIR) || (mkdir $(RTMACDIR) ; chmod 755 $(RTMACDIR) )
  2481. !     test -d $(FONTDIR) || (mkdir $(FONTDIR) ; chmod 755 $(FONTDIR) )
  2482. !     chmod 755 $(LIBDIR) $(LIBDIR)/adapters $(LIBDIR)/lib
  2483.       rm -f $(BINDIR)/psroff.old
  2484.       -cp $(BINDIR)/psroff $(BINDIR)/psroff.old 2> /dev/null
  2485.       cp psroff $(BINDIR)/psroff
  2486. ***************
  2487. *** 440,452 ****
  2488.   dittest:    DITTEST
  2489.       eqn DITTEST | tbl | PATH=:.:$(LIBDIR):$$PATH psroff -T$(TTYPE) $(TFLAGS)
  2490.   
  2491. ! check:    audit sedscript makeincl
  2492. !     cd lib ; $(MAKE)
  2493. !     ./audit
  2494.   
  2495. ! checkinstall:    audit sedscript makeincl
  2496. !     cd lib ; $(MAKE)
  2497. !     ./audit install
  2498.   
  2499.   #    This is how I build a release - don't even try running this...!
  2500.   buildrelease:    clean unpackljfonts
  2501. --- 442,452 ----
  2502.   dittest:    DITTEST
  2503.       eqn DITTEST | tbl | PATH=:.:$(LIBDIR):$$PATH psroff -T$(TTYPE) $(TFLAGS)
  2504.   
  2505. ! check:    checker.S
  2506. !     sh ./checker.S
  2507.   
  2508. ! checkinstall:
  2509. !     @echo "No longer supported"
  2510.   
  2511.   #    This is how I build a release - don't even try running this...!
  2512.   buildrelease:    clean unpackljfonts
  2513. ***************
  2514. *** 480,482 ****
  2515. --- 480,486 ----
  2516.           ( echo "ERROR: You must be root to fixperms" ; exit 1 )
  2517.       find $(LIBDIR) -type f -exec chmod +r '{}' ';'
  2518.       find $(LIBDIR) $(FONTDIR) -type d -exec chmod +rx '{}' ';'
  2519. + #    Leaves manual pages and width tables installed.  Oh well.
  2520. + deinstall:
  2521. +     rm  -fr $(LIBDIR) $(RTMACDIR)/tmac.t2 $(BINDIR)/psroff
  2522. Index: ./opt.c
  2523. *** /tmp/PATCHold/./opt.c    Sat May 23 22:36:24 1992
  2524. --- ./opt.c    Sat May 23 22:36:29 1992
  2525. ***************
  2526. *** 10,22 ****
  2527.   
  2528.   #include "defs.h"
  2529.   
  2530.   int specXPos, specYPos;
  2531.   extern struct cattab tabN[], tabS[];
  2532.   
  2533.   #ifdef    OPT
  2534.   #ifndef    lint
  2535.   static char SCCSid[] =
  2536. !     "@(#)opt.c: 2.8 Copyright 92/01/23 14:23:52 Chris Lewis";
  2537.   #endif
  2538.   
  2539.   struct insbuf {
  2540. --- 10,29 ----
  2541.   
  2542.   #include "defs.h"
  2543.   
  2544. + int optrun = 15;
  2545. + int fixedperiodwidth = 0;
  2546. + int spaceopt = 0;
  2547.   int specXPos, specYPos;
  2548.   extern struct cattab tabN[], tabS[];
  2549. + #ifdef SPACEOPT
  2550. + int spcwidth, spccount, spcnom;
  2551. + #endif
  2552.   
  2553.   #ifdef    OPT
  2554.   #ifndef    lint
  2555.   static char SCCSid[] =
  2556. !     "@(#)opt.c: 2.11 Copyright 92/05/21 02:21:16 Chris Lewis";
  2557.   #endif
  2558.   
  2559.   struct insbuf {
  2560. ***************
  2561. *** 25,31 ****
  2562.   };
  2563.   
  2564.   #define    INSBUFSIZ    200
  2565. - #define    OPTSIZ    100
  2566.   struct insbuf insbuf[INSBUFSIZ];
  2567.   static struct insbuf *insptr = insbuf;
  2568.   static int insypos = -1;
  2569. --- 32,37 ----
  2570. ***************
  2571. *** 181,187 ****
  2572.   }
  2573.   
  2574.   int optxpos, optypos;
  2575. ! int optfont, optpoints, optnc, origxpos;
  2576.   char optbuffer[OPTSIZ];
  2577.   short optloc[OPTSIZ];
  2578.   short *optloci;
  2579. --- 187,193 ----
  2580.   }
  2581.   
  2582.   int optxpos, optypos;
  2583. ! int optfont, optpoints, optnc, origxpos, optsymset, optcnt=0;
  2584.   char optbuffer[OPTSIZ];
  2585.   short optloc[OPTSIZ];
  2586.   short *optloci;
  2587. ***************
  2588. *** 191,196 ****
  2589. --- 197,208 ----
  2590.   
  2591.       if (!optimize)
  2592.       return;
  2593. + #if defined(DEBUG) && defined(SPACEOPT)
  2594. +     if ((debug&D_CHAR) && spcwidth) {
  2595. +     DBP((D_CHAR, "LOPT: x,y,sw,sc,nl,s: %d,%d,%d,%d,%d\n",
  2596. +         origxpos, optypos, spcwidth, spccount, spcnom, optbuffer));
  2597. +     }
  2598. + #endif
  2599.   
  2600.       if (optbuffer[0] && be->beputchar)
  2601.       (*be->beputchar)(origxpos, optypos, optfont, optpoints, optnc,
  2602. ***************
  2603. *** 198,203 ****
  2604. --- 210,219 ----
  2605.       optbuffer[0] = '\0';
  2606.       optp = optbuffer;
  2607.       optloci = optloc;
  2608. +     optcnt = 0;
  2609. + #ifdef SPACEOPT
  2610. +     spccount = spcwidth = 0;
  2611. + #endif
  2612.   }
  2613.   
  2614.   optinsert(xpos, ypos, font, points, nc)
  2615. ***************
  2616. *** 209,215 ****
  2617.       struct cattab *ct;
  2618.       register char *from;
  2619.       int cantcache;
  2620. !     static int ditind = 0;
  2621.   
  2622.       if (!optimize) {
  2623.       if (be->beputchar)
  2624. --- 225,231 ----
  2625.       struct cattab *ct;
  2626.       register char *from;
  2627.       int cantcache;
  2628. !     static int ditind = 0, psind = 0;
  2629.   
  2630.       if (!optimize) {
  2631.       if (be->beputchar)
  2632. ***************
  2633. *** 232,238 ****
  2634.          long multiple-character sequences */
  2635.   
  2636.       if (ypos != optypos || optfont != font || optpoints != points ||
  2637. !     wp != xlatetable[font]->widthtable ||
  2638.       optp > optbuffer + OPTSIZ - 10)
  2639.       optflush();
  2640.   
  2641. --- 248,254 ----
  2642.          long multiple-character sequences */
  2643.   
  2644.       if (ypos != optypos || optfont != font || optpoints != points ||
  2645. !     wp != xlatetable[font]->widthtable || optcnt >= optrun ||
  2646.       optp > optbuffer + OPTSIZ - 10)
  2647.       optflush();
  2648.   
  2649. ***************
  2650. *** 246,266 ****
  2651.       ct = &tabN[nc];
  2652.       }
  2653.   
  2654. !     cantcache = !wp || (int) wp == 1 || (font == symidx ? bp->t2b_font != S:
  2655. !                  bp->t2b_font != N)
  2656. ! #ifndef    FIXEDPERIODWIDTH
  2657. !                  /* period widths are screwed in Postscript */
  2658. !                  || (font != symidx && nc == 35)
  2659. ! #endif
  2660.               ;
  2661.   
  2662. !     if (cantcache || bp->t2b_xc || bp->t2b_yc || bp->t2b_scale)
  2663.       optflush();
  2664.   
  2665.       DBP((D_CAT, "opt: font: %d/%d xpos: %d/%d\n",
  2666.       optfont, font, optxpos, xpos));
  2667.   
  2668. !     if (optxpos != xpos)    /* handle spaces one day... */
  2669.       optflush();
  2670.   
  2671.       if (!optbuffer[0]) {
  2672. --- 262,321 ----
  2673.       ct = &tabN[nc];
  2674.       }
  2675.   
  2676. !     cantcache = !wp || (int) wp == 1 
  2677. !                  || bp->t2b_xc || bp->t2b_yc || bp->t2b_scale
  2678. !                  || bp->t2b_font == D
  2679. !                  /* period widths are screwed in some Postscript
  2680. !                 interpreters */
  2681. !                  || (!fixedperiodwidth && (font != symidx && nc == 35))
  2682.               ;
  2683.   
  2684. !     if (cantcache || 
  2685. !     (optbuffer[0] ? (bp->t2b_font != optsymset) :
  2686. !         (font == symidx ? bp->t2b_font != S : bp->t2b_font != N)))
  2687.       optflush();
  2688.   
  2689.       DBP((D_CAT, "opt: font: %d/%d xpos: %d/%d\n",
  2690.       optfont, font, optxpos, xpos));
  2691.   
  2692. ! #ifdef SPACEOPT
  2693. !     if (!psind)
  2694. !     if (strcmp(be->bename, "ps") == 0)
  2695. !         psind = 1;
  2696. !     else
  2697. !         psind = -1;
  2698. !     if (spaceopt && psind == 1 && optbuffer[0] && optxpos != xpos &&
  2699. !     optcnt < optrun - 5 && bp->t2b_font == N) {
  2700. !     /* possible blank/space optimization */
  2701. !     if (!spcwidth) {    /* first space we've seen this line */
  2702. !         spcnom = (wp[0] * points + 3) / 6;    /* *nominal* space width.  CAT
  2703. !                            doesn't read it - hardcoded.
  2704. !                            GRRRR. */
  2705. !         spcwidth = xpos - optxpos;
  2706. !         spccount = 1;
  2707. !         *optloci = optxpos;
  2708. !         optxpos = xpos;
  2709. !         *optp++ = ' ';
  2710. !         *optp = '\0';
  2711. !     } else if ((xpos - optxpos) % spcwidth == 0) {
  2712. !         int sw;
  2713. !         sw = (xpos - optxpos) / spcwidth;
  2714. !         if (sw + optcnt < optrun - 5) {
  2715. !         while(sw--) {
  2716. !             optcnt++;
  2717. !             spccount++;
  2718. !             *optloci++ = optxpos;
  2719. !             *optp++ = ' ';
  2720. !         }
  2721. !         *optp = '\0';
  2722. !         optxpos = xpos;
  2723. !         }
  2724. !     }
  2725. !     }
  2726. ! #endif
  2727. !     if (optxpos != xpos)
  2728.       optflush();
  2729.   
  2730.       if (!optbuffer[0]) {
  2731. ***************
  2732. *** 268,273 ****
  2733. --- 323,329 ----
  2734.       optxpos = xpos;
  2735.       origxpos = xpos;
  2736.       optfont = font;
  2737. +     optsymset = bp->t2b_font;
  2738.       optnc = nc;
  2739.       optpoints = points;
  2740.       }
  2741. ***************
  2742. *** 284,301 ****
  2743.   
  2744.       from = bp->t2b_charseq;
  2745.       if (ditind == 1) {
  2746. !     if (*from == '\\')
  2747.           *optp++ = '\\';
  2748. !     else if (*(from+1)) {
  2749.           *optp++ = '\\';
  2750.           *optp++ = '(';
  2751.           *optp++ = *from++;
  2752.       }
  2753.       *optp++ = *from++;
  2754.           
  2755.       } else
  2756. !     for (; *from;)
  2757.           *optp++ = *from++;
  2758.       *optp = '\0';
  2759.   }
  2760.   #endif
  2761. --- 340,362 ----
  2762.   
  2763.       from = bp->t2b_charseq;
  2764.       if (ditind == 1) {
  2765. !     if (*from == '\\') {
  2766.           *optp++ = '\\';
  2767. !         optcnt++;
  2768. !     } else if (*(from+1)) {
  2769.           *optp++ = '\\';
  2770.           *optp++ = '(';
  2771.           *optp++ = *from++;
  2772. +         optcnt += 3;
  2773.       }
  2774.       *optp++ = *from++;
  2775. +     optcnt++;
  2776.           
  2777.       } else
  2778. !     for (; *from;) {
  2779. !         optcnt++;
  2780.           *optp++ = *from++;
  2781. +     }
  2782.       *optp = '\0';
  2783.   }
  2784.   #endif
  2785. Index: ./pkscale.c
  2786. *** /tmp/PATCHold/./pkscale.c    Sat May 23 22:36:40 1992
  2787. --- ./pkscale.c    Sat May 23 22:36:42 1992
  2788. ***************
  2789. *** 0 ****
  2790. --- 1,202 ----
  2791. + /*    Copyright 1992 Chris Lewis
  2792. +         All Rights Reserved
  2793. +     See the LICENSE file for a full description of restrictions under which
  2794. +     this software is provided.
  2795. +     Function: PK/SFP font scaling.  Much hackery.  Results so-so.
  2796. +  */
  2797. + #include "defs.h"
  2798. + #ifdef    PK
  2799. + #ifndef lint
  2800. + static char SCCSid[] = "@(#)pkscale.c 1.2 Copyright 92/05/19 23:10:53 Chris Lewis";
  2801. + #endif
  2802. + #include "pk.h"
  2803. + long
  2804. + scalenum(sf, num)
  2805. + double sf;
  2806. + long num; {
  2807. +     if (num < 0)
  2808. +     return((long) (sf * num - .5));
  2809. +     else
  2810. +     return((long) (sf * num + .5));
  2811. + }
  2812. + static short *sl = (short *) NULL;
  2813. + static sln = 0;
  2814. + struct pkp *
  2815. + pkscale(pkp, target)
  2816. + struct pkp *pkp;
  2817. + int target; {
  2818. +     struct pkp *npkp;
  2819. +     register int i,j;
  2820. +     register struct pkc *pc, *npc;
  2821. +     extern struct ras *pkrast();
  2822. +     double sf;
  2823. +     if (!target || target == pkp->pkp_npts)
  2824. +     return(pkp);
  2825. +     if (sl) {
  2826. +     free(sl);
  2827. +     sl = (short *) NULL;
  2828. +     sln = 0;
  2829. +     }
  2830. +     
  2831. +     sf = (double) target / pkp->pkp_npts;
  2832. +     npkp = (struct pkp *) mustmalloc(sizeof(struct pkp),
  2833. +     "New PK header for scale");
  2834. +     *npkp = *pkp;
  2835. +     npkp->pkp_list = (struct pkc **)
  2836. +     mustmalloc(sizeof(struct pkc *) * pkp->pkp_num,
  2837. +     "New PK sort list for scale");
  2838. +     npkp->pkp_chars = (struct pkc *) NULL;
  2839. +     npkp->pkp_last = (struct pkc *) NULL;
  2840. +     npkp->pkp_ds = scalenum(sf, npkp->pkp_ds);
  2841. +     npkp->pkp_npts = scalenum(sf, npkp->pkp_npts);
  2842. +     npkp->pkp_bmax = scalenum(sf, npkp->pkp_bmax);
  2843. +     npkp->pkp_dmax = scalenum(sf, npkp->pkp_dmax);
  2844. +     npkp->pkp_wmax = scalenum(sf, npkp->pkp_wmax);
  2845. +     npkp->pkp_xomax = scalenum(sf, npkp->pkp_xomax);
  2846. +     npkp->pkp_kh = scalenum(sf, npkp->pkp_kh);
  2847. +     npkp->pkp_kl = scalenum(sf, npkp->pkp_kl);
  2848. +     for (i = 0; i < pkp->pkp_num; i++) {
  2849. +     register struct ras *r;
  2850. +     pc = pkp->pkp_list[i];
  2851. +     /* create new char descriptor, initialized to old */
  2852. +     npc = (struct pkc *) mustmalloc(sizeof(struct pkc),
  2853. +         "New PK character descriptor");
  2854. +     *npc = *pc;
  2855. +     if (!npkp->pkp_chars)
  2856. +         npkp->pkp_chars = npc;
  2857. +     npkp->pkp_last = npc;
  2858. +     npkp->pkp_list[i] = npc;
  2859. +     /* get a raster to play with */
  2860. +     pc->pkc_sfpr = pkrast(pc);
  2861. +     if (pc->pkc_pkr)
  2862. +         free((char *) pc->pkc_pkr);
  2863. +     pc->pkc_pkr = (int8 *) NULL;
  2864. +     npc->pkc_sfpr = r = (struct ras *) mustmalloc(sizeof(struct ras),
  2865. +         "SFP raster header for scale");
  2866. +     
  2867. +     npc->pkc_height = scalenum(sf, npc->pkc_height)+1;
  2868. +     npc->pkc_width = scalenum(sf, npc->pkc_width)+1;
  2869. +     npc->pkc_dx = scalenum(sf, npc->pkc_dx);
  2870. +     npc->pkc_dy = scalenum(sf, npc->pkc_dy);
  2871. +     npc->pkc_x_off = scalenum(sf, npc->pkc_x_off);
  2872. +     npc->pkc_y_off = scalenum(sf, npc->pkc_y_off);
  2873. +     r->ras_height = npc->pkc_height;
  2874. +     r->ras_width = npc->pkc_width;
  2875. +     r->ras_bline = (npc->pkc_width + 7) / 8;
  2876. +     r->ras_bytes = r->ras_height * r->ras_bline;
  2877. +     r->ras_raster = (int8 *) mustmalloc((int) r->ras_bytes,
  2878. +         "SFP raster for scale");
  2879. +     
  2880. +     rastscale(r, pc->pkc_sfpr, sf);
  2881. +     }
  2882. +     pk_destroy(pkp);
  2883. +     return(npkp);
  2884. + }
  2885. + #define seton(x,y,r) r->ras_raster[y * r->ras_bline + (x >> 3)] |= (0x80 >> (x&7))
  2886. + #define biton(x,y,r) r->ras_raster[y * r->ras_bline + (x >> 3)] & (0x80 >> (x&7))
  2887. + #define BLOT
  2888. + #ifdef BLOT
  2889. + short blot1[] = {-1, 0,
  2890. +          0, 1,
  2891. +          1, 0,
  2892. +          0, -1,
  2893. +          0, 0};
  2894. + short blot2[] = {-2,0,
  2895. +         -1,0,
  2896. +         -1,1,
  2897. +         0,1,
  2898. +         0,2,
  2899. +         1,1,
  2900. +         1,0,
  2901. +         2,0,
  2902. +         1,-1,
  2903. +         0,-1,
  2904. +         0,-2,
  2905. +         -1,-1,
  2906. +         0,0};
  2907. + short *blotlist[] = {blot1, blot2, blot2, blot2, blot2, blot2};
  2908. + #endif
  2909. + rastscale(to, from, scale)
  2910. + register struct ras *to, *from;
  2911. + double scale; {
  2912. +     register int x, y;
  2913. +     register int ct = scale;
  2914. +     register struct ras *nr;
  2915. +     /* optimization to avoid floating point */
  2916. +     x = max(from->ras_height, from->ras_width) + 10;
  2917. +     if (x > sln) {
  2918. +     register short *p;
  2919. +     if (sl)
  2920. +         free(sl);
  2921. +     p = sl = (short *)mustmalloc(sizeof(short) * x,
  2922. +         "SFP raster scale array");
  2923. +     sln = x;
  2924. +     for (x = 0, p = sl; x < sln; x++)
  2925. +         *p++ = scale * x + .5;
  2926. +     }
  2927. +     clrarray(to->ras_raster, to->ras_bytes);
  2928. +     /* dumb scaling algorithm. */
  2929. +     for (y = 0; y < from->ras_height; y++)
  2930. +     for (x = 0; x < from->ras_width; x++) {
  2931. +         if (biton(x, y, from)) {
  2932. +         register int sy = sl[y], sx = sl[x];
  2933. +         seton(sx, sy, to);
  2934. +         /* if scale > 1, we centre a ct*ct box on it */
  2935. + #ifdef BLOT
  2936. +         if (ct) {
  2937. +             register int tsx, tsy;
  2938. +             register short *p = blotlist[ct-1];
  2939. +             while(*p || *(p+1)) {
  2940. +             tsx = sx + *p++;
  2941. +             tsy = sy + *p++;
  2942. +             if (tsx < 0 || tsx >= to->ras_width ||
  2943. +                 tsy < 0 || tsy >= to->ras_height)
  2944. +                 continue;
  2945. +             seton(tsx, tsy, to);
  2946. +             }
  2947. +         }
  2948. + #else
  2949. +         if (ct) {
  2950. +             register int tsy, tsx, limx, limy;
  2951. +             limy = min(sy + ct + 1, to->ras_height);
  2952. +             for (tsy = max(sy-ct,0) ; tsy < limy; tsy++) {
  2953. +             limx = min(sx + ct + 1, to->ras_width);
  2954. +             for (tsx = max(sx-ct, 0); tsx < limx; tsx++) {
  2955. +             }
  2956. +             }
  2957. +         }
  2958. + #endif
  2959. +         }
  2960. +     }
  2961. + }
  2962. + #endif
  2963. Index: ./pk.c
  2964. *** /tmp/PATCHold/./pk.c    Sat May 23 22:36:55 1992
  2965. --- ./pk.c    Sat May 23 22:36:57 1992
  2966. ***************
  2967. *** 13,19 ****
  2968.   #ifdef    PK
  2969.   
  2970.   #ifndef lint
  2971. ! static char SCCSid[] = "@(#)pk.c 2.3 Copyright 91/02/20 09:02:17 Chris Lewis";
  2972.   #endif
  2973.   
  2974.   #define    DRAW
  2975. --- 13,19 ----
  2976.   #ifdef    PK
  2977.   
  2978.   #ifndef lint
  2979. ! static char SCCSid[] = "@(#)pk.c 2.4 Copyright 92/03/12 01:11:09 Chris Lewis";
  2980.   #endif
  2981.   
  2982.   #define    DRAW
  2983. ***************
  2984. *** 28,33 ****
  2985. --- 28,35 ----
  2986.   
  2987.   extern char *progname;
  2988.   
  2989. + long sfp_hmi;        /* pitch (default HMI) from SFP font header */
  2990.   static FILE *fin;
  2991.   static char *filename;    /* name of *current* font being read */
  2992.   extern char *malloc();
  2993. ***************
  2994. *** 668,676 ****
  2995.   
  2996.       p->pkp_symset = get2int();
  2997.   
  2998. !     get2int();        /* pitch - we calculate this from height */
  2999.       c = get2int();    /* retrieved *height* */
  3000. !     p->pkp_npts = c * POINT / (OUTRES*4) + .5;
  3001.   
  3002.       get2int();    /* dummy */
  3003.       get1int();    /* dummy */
  3004. --- 670,681 ----
  3005.   
  3006.       p->pkp_symset = get2int();
  3007.   
  3008. !     c = get2int();    /* pitch (default HMI) */
  3009. !     sfp_hmi = (double) c / 4 + .5;
  3010.       c = get2int();    /* retrieved *height* */
  3011. !     p->pkp_ds = (c * POINT * pow2(20)) / (OUTRES*4);
  3012. !     p->pkp_npts = (p->pkp_ds / pow2(20)) + 0.5;
  3013.   
  3014.       get2int();    /* dummy */
  3015.       get1int();    /* dummy */
  3016. ***************
  3017. *** 682,688 ****
  3018.       p->pkp_xomax = 0;
  3019.   
  3020.       /* These are simulated so that the PK handlers can figure the font out */
  3021. -     p->pkp_ds = p->pkp_npts * pow2(20);
  3022.       p->pkp_cs = 0;
  3023.       p->pkp_hppp = OUTRES * pow2(16) / POINT;
  3024.       p->pkp_vppp = OUTRES * pow2(16) / POINT;
  3025. --- 687,692 ----
  3026.