You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

393 lines
18 KiB

1 month ago
  1. % Copyright (C) 2001-2023 Artifex Software, Inc.
  2. % All Rights Reserved.
  3. %
  4. % This software is provided AS-IS with no warranty, either express or
  5. % implied.
  6. %
  7. % This software is distributed under license and may not be copied,
  8. % modified or distributed except as expressly authorized under the terms
  9. % of the license contained in the file LICENSE in this distribution.
  10. %
  11. % Refer to licensing information at http://www.artifex.com or contact
  12. % Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
  13. % CA 94129, USA, for further information.
  14. %
  15. % This file provides statusdict, serverdict, and assorted LaserWriter
  16. % operators, mostly for the benefit of poorly designed PostScript programs
  17. % that 'know' they are running on a LaserWriter.
  18. systemdict begin
  19. % We make statusdict a little larger for Level 2 stuff.
  20. % Note that it must be allocated in local VM.
  21. .currentglobal //false .setglobal
  22. currentdict /statusdict 91 dict .forceput % statusdict is local, sys'dict global
  23. % To support the Level 2 job control features,
  24. % serverdict must also be in local VM.
  25. currentdict /serverdict 10 dict .forceput % serverdict is local, sys'dict global
  26. .setglobal
  27. end
  28. statusdict begin
  29. /.setpagesize
  30. { 2 copy 2 array astore /PageSize exch mark 3 1 roll .dicttomark
  31. { setpagedevice } stopped {
  32. pop % the setpagedevice dict
  33. /setpagesize $error /errorname get signalerror
  34. } {
  35. pop pop % success -- pop the arguments
  36. } ifelse
  37. } .internalbind def
  38. % Keep the table of named paper sizes as procedures. Reuse them later
  39. % as compatibility operators.
  40. /.pagetypeprocs 81 dict begin
  41. % Define various paper formats. The Adobe documentation defines only these:
  42. % 11x17, a3, a4, a4small, b5, ledger, legal, letter, lettersmall, note.
  43. % These procedures are also accessed as data structures during initialization,
  44. % so the page dimensions must be the first two elements of the procedure.
  45. % Page sizes defined by Adobe documentation
  46. % Note: these executable arrays should all begin with two
  47. % integers which are the width and height (see gs_setpd.ps).
  48. /11x17 {792 1224 //.setpagesize stopped { pop pop /11x17 $error /errorname get signalerror } if } bind def % 11x17 portrait
  49. /a3 {842 1191 //.setpagesize stopped { pop pop /a3 $error /errorname get signalerror } if } bind def
  50. /a4 {595 842 //.setpagesize stopped { pop pop /a4 $error /errorname get signalerror } if } bind def
  51. % a4small should be a4 with an ImagingBBox of [25 25 570 817].
  52. /a4small /a4 load def
  53. % b5 see below.
  54. /ledger {1224 792 //.setpagesize stopped { pop pop /ledger $error /errorname get signalerror } if } bind def % 11x17 landscape
  55. /legal {612 1008 //.setpagesize stopped { pop pop /legal $error /errorname get signalerror } if } bind def
  56. /letter {612 792 //.setpagesize stopped { pop pop /letter $error /errorname get signalerror } if } bind def
  57. % lettersmall should be letter with an ImagingBBox of [25 25 587 767].
  58. /lettersmall /letter load def
  59. % note should be letter (or some other size) with the ImagingBBox
  60. % shrunk by 25 units on all 4 sides.
  61. /note /letter load def
  62. % End of Adobe-defined page sizes
  63. % Other page sizes
  64. % ISO standard paper sizes
  65. /a0 {2384 3370 //.setpagesize stopped { pop pop /a0 $error /errorname get signalerror } if } bind def
  66. /a1 {1684 2384 //.setpagesize stopped { pop pop /a1 $error /errorname get signalerror } if } bind def
  67. /a2 {1191 1684 //.setpagesize stopped { pop pop /a2 $error /errorname get signalerror } if } bind def
  68. % /a3 {842 1191 //.setpagesize stopped { pop pop /a3 $error /errorname get signalerror } if } bind def % defined by Adobe
  69. % /a4 {595 842 //.setpagesize stopped { pop pop /a4 $error /errorname get signalerror } if } bind def % defined by Adobe
  70. /a5 {420 595 //.setpagesize stopped { pop pop /a5 $error /errorname get signalerror } if } bind def
  71. /a6 {297 420 //.setpagesize stopped { pop pop /a6 $error /errorname get signalerror } if } bind def
  72. /a7 {210 297 //.setpagesize stopped { pop pop /a7 $error /errorname get signalerror } if } bind def
  73. /a8 {148 210 //.setpagesize stopped { pop pop /a8 $error /errorname get signalerror } if } bind def
  74. /a9 {105 148 //.setpagesize stopped { pop pop /a9 $error /errorname get signalerror } if } bind def
  75. /a10 {73 105 //.setpagesize stopped { pop pop /a10 $error /errorname get signalerror } if } bind def
  76. % ISO and JIS B sizes are different....
  77. /isob0 {2835 4008 //.setpagesize stopped { pop pop /isob0 $error /errorname get signalerror } if } bind def
  78. /b0 /isob0 load def
  79. /isob1 {2004 2835 //.setpagesize stopped { pop pop /isob1 $error /errorname get signalerror } if } bind def
  80. /b1 /isob1 load def
  81. /isob2 {1417 2004 //.setpagesize stopped { pop pop /isob2 $error /errorname get signalerror } if } bind def
  82. /b2 /isob2 load def
  83. /isob3 {1001 1417 //.setpagesize stopped { pop pop /isob3 $error /errorname get signalerror } if } bind def
  84. /b3 /isob3 load def
  85. /isob4 {709 1001 //.setpagesize stopped { pop pop /isob4 $error /errorname get signalerror } if } bind def
  86. /b4 /isob4 load def
  87. /isob5 {499 709 //.setpagesize stopped { pop pop /isob5 $error /errorname get signalerror } if } bind def
  88. /b5 /isob5 load def
  89. /isob6 {354 499 //.setpagesize stopped { pop pop /isob6 $error /errorname get signalerror } if } bind def
  90. /b6 /isob6 load def
  91. /jisb0 {2920 4127 //.setpagesize stopped { pop pop /jisb0 $error /errorname get signalerror } if } bind def
  92. /jisb1 {2064 2920 //.setpagesize stopped { pop pop /jisb1 $error /errorname get signalerror } if } bind def
  93. /jisb2 {1460 2064 //.setpagesize stopped { pop pop /jisb2 $error /errorname get signalerror } if } bind def
  94. /jisb3 {1032 1460 //.setpagesize stopped { pop pop /jisb3 $error /errorname get signalerror } if } bind def
  95. /jisb4 {729 1032 //.setpagesize stopped { pop pop /jisb4 $error /errorname get signalerror } if } bind def
  96. /jisb5 {516 729 //.setpagesize stopped { pop pop /jisb5 $error /errorname get signalerror } if } bind def
  97. /jisb6 {363 516 //.setpagesize stopped { pop pop /jisb6 $error /errorname get signalerror } if } bind def
  98. /c0 {2599 3677 //.setpagesize stopped { pop pop /c0 $error /errorname get signalerror } if } bind def
  99. /c1 {1837 2599 //.setpagesize stopped { pop pop /c1 $error /errorname get signalerror } if } bind def
  100. /c2 {1298 1837 //.setpagesize stopped { pop pop /c2 $error /errorname get signalerror } if } bind def
  101. /c3 {918 1298 //.setpagesize stopped { pop pop /c3 $error /errorname get signalerror } if } bind def
  102. /c4 {649 918 //.setpagesize stopped { pop pop /c4 $error /errorname get signalerror } if } bind def
  103. /c5 {459 649 //.setpagesize stopped { pop pop /c5 $error /errorname get signalerror } if } bind def
  104. /c6 {323 459 //.setpagesize stopped { pop pop /c6 $error /errorname get signalerror } if } bind def
  105. % U.S. CAD standard paper sizes
  106. /archE {2592 3456 //.setpagesize stopped { pop pop /archE $error /errorname get signalerror } if } bind def
  107. /archD {1728 2592 //.setpagesize stopped { pop pop /archD $error /errorname get signalerror } if } bind def
  108. /archC {1296 1728 //.setpagesize stopped { pop pop /archC $error /errorname get signalerror } if } bind def
  109. /archB {864 1296 //.setpagesize stopped { pop pop /archB $error /errorname get signalerror } if } bind def
  110. /archA {648 864 //.setpagesize stopped { pop pop /archA $error /errorname get signalerror } if } bind def
  111. /archa /archA load def
  112. /archb /archB load def
  113. /archc /archC load def
  114. /archd /archD load def
  115. /arche /archE load def
  116. % Other paper sizes
  117. /flsa {612 936 //.setpagesize stopped { pop pop /flsa $error /errorname get signalerror } if } bind def % U.S. foolscap
  118. /flse {612 936 //.setpagesize stopped { pop pop /flse $error /errorname get signalerror } if } bind def % European foolscap
  119. /halfletter {396 612 //.setpagesize stopped { pop pop /halfletter $error /errorname get signalerror } if } bind def
  120. % minimum of a4 and letter (a4 width, letter length)
  121. /pa4 {595 792 //.setpagesize stopped { pop pop /pa4 $error /errorname get signalerror } if } bind def
  122. % Japanese postcard size, 100mm x 148mm
  123. /hagaki {283 420 //.setpagesize stopped { pop pop /hagaki $error /errorname get signalerror } if } bind def
  124. % U.S. ANSI/ASME Y14.1 paper sizes
  125. /ANSI_A //letter def
  126. /ANSI_B //11x17 def
  127. /tabloid //11x17 def
  128. /ANSI_C {1224 1585 //.setpagesize stopped { pop pop /ANSI_C $error /errorname get signalerror } if } bind def
  129. /ANSI_D {1585 2448 //.setpagesize stopped { pop pop /ANSI_D $error /errorname get signalerror } if } bind def
  130. /ANSI_E {2448 3168 //.setpagesize stopped { pop pop /ANSI_E $error /errorname get signalerror } if } bind def
  131. /ANSI_F {2016 2880 //.setpagesize stopped { pop pop /ANSI_F $error /errorname get signalerror } if } bind def
  132. /ansi_a /ANSI_A load def
  133. /ansi_b /ANSI_B load def
  134. /ansi_c /ANSI_C load def
  135. /ansi_d /ANSI_D load def
  136. /ansi_e /ANSI_E load def
  137. /ansi_f /ANSI_F load def
  138. %END SIZES
  139. currentdict end
  140. userdict begin dup { def } forall end % reuse!
  141. readonly def
  142. % Define the pagetype values for the known page formats.
  143. % This array is now used for deterministic enumeration of .pagetypeprocs
  144. /.pagetypenames [ .pagetypeprocs { pop } .internalbind forall ]
  145. { .namestring exch .namestring gt } .internalbind .sort
  146. readonly def
  147. %%%%%% The following items were suggested by a user as useful.
  148. % Permanent definitions
  149. /ramsize 4194304 def
  150. /hardwareiomode 0 def
  151. /sethardwareiomode {pop} .internalbind def
  152. /softwareiomode 0 def
  153. /setsoftwareiomode {pop} .internalbind def
  154. /dosysstart //false def
  155. /setdosysstart {pop} .internalbind def
  156. /allowjobreset //true def
  157. /setallowjobreset {pop} .internalbind def
  158. /defaultpaperfamily 0 def
  159. /setdefaultpaperfamily {pop} .internalbind def
  160. /defaultpapertray 0 def
  161. /setdefaultpapertray {pop} .internalbind def
  162. /defaulttrayswitch //false def
  163. /setdefaulttrayswitch {pop} .internalbind def
  164. % Tray and format selection
  165. /11x17tray {/11x17 .uservar stopped { pop pop /11x17tray $error /errorname get signalerror } if } .internalbind def
  166. /a3tray {/a3 .uservar stopped { pop pop /a3tray $error /errorname get signalerror } if } .internalbind def
  167. /a4tray {/a4 .uservar stopped { pop pop /a4tray $error /errorname get signalerror } if } .internalbind def
  168. /a5tray {/a5 .uservar stopped { pop pop /a5tray $error /errorname get signalerror } if } .internalbind def
  169. /a6tray {/a6 .uservar stopped { pop pop /a6tray $error /errorname get signalerror } if } .internalbind def
  170. /b4tray {/b4 .uservar stopped { pop pop /b4tray $error /errorname get signalerror } if } .internalbind def
  171. /b5tray {/b5 .uservar stopped { pop pop /b5tray $error /errorname get signalerror } if } .internalbind def
  172. /flsatray {/flsa .uservar stopped { pop pop /flsatray $error /errorname get signalerror } if } .internalbind def
  173. /flsetray {/flse .uservar stopped { pop pop /flsetray $error /errorname get signalerror } if } .internalbind def
  174. /halflettertray {/halfletter .uservar stopped { pop pop /halflettertray $error /errorname get signalerror } if } .internalbind def
  175. /ledgertray {/ledger .uservar stopped { pop pop /ledgertray $error /errorname get signalerror } if } .internalbind def
  176. /legaltray {/legal .uservar stopped { pop pop /legaltray $error /errorname get signalerror } if } .internalbind def
  177. /lettertray {/letter .uservar stopped { pop pop /lettertray $error /errorname get signalerror } if } .internalbind def
  178. % Per-job parameters
  179. /paperfamily 0 def % 0 is US, 1 is European
  180. /papertray 1 def
  181. /setpapertray {statusdict exch /papertray exch put} .internalbind def
  182. /trayswitch //false def % paperout feeds from another tray
  183. % We don't implement the (undocumented by Adobe) papersize 'operator',
  184. % because it's very awkward to make it interact properly with all the
  185. % different ways of setting the paper size.
  186. %/papersize {/letter //true} bind def % <name of paper size>, <short-edge-first-p>
  187. /appletalktype (LaserWriter) def
  188. %%%%%% The following items are defined in the PostScript Language
  189. %%%%%% Reference Manual, First Edition, and subsequent 'compatibility'
  190. %%%%%% documentation from Adobe.
  191. /checkpassword {statusdict begin .password eq end} .internalbind def
  192. /defaulttimeouts {statusdict begin .timeouts aload pop end} .internalbind def
  193. /diskonline {
  194. //false (%disk*%) { pop not exit } 8192 string /IODevice resourceforall
  195. } .internalbind def
  196. /diskstatus {10240 2097152 } .internalbind odef % - diskstatus <free> <total> (in 1024 byte pages)
  197. %/dostartpage
  198. /eescratch {pop 0} .internalbind def
  199. /idlefonts {statusdict begin mark .idlefonts aload pop end} .internalbind def
  200. /jobname () def
  201. %/jobtimeout
  202. /manualfeed //false def
  203. /manualfeedtimeout 60 def
  204. /margins {statusdict begin .topmargin .leftmargin end} .internalbind def
  205. /pagecount {4711} .internalbind def
  206. /pagestackorder {//false} .internalbind def
  207. /pagetype 0 def
  208. /prefeed //false def
  209. /printererror {pop pop} .internalbind def
  210. /printername {statusdict /.printername get exch copy} .internalbind def
  211. /processcolors /processcolors load def % defined in systemdict
  212. /product product def % product is defined in systemdict
  213. /revision revision def % revision is defined in systemdict
  214. /sccbatch {pop 9600 0} .internalbind def
  215. /sccinteractive {pop 9600 0} .internalbind def
  216. /setdefaulttimeouts {statusdict begin .timeouts astore pop end} .internalbind def
  217. /setdostartpage {statusdict exch /dostartpage exch put} .internalbind def
  218. /setduplexmode {mark /Duplex 3 -1 roll currentdevice putdeviceprops} .internalbind def
  219. /seteescratch {pop pop} .internalbind def
  220. /setidlefonts {] statusdict exch /.idlefonts exch put} .internalbind def
  221. /setjobtimeout {statusdict exch /jobtimeout exch put} .internalbind def
  222. /setmargins
  223. { statusdict begin
  224. /.leftmargin exch def /.topmargin exch def
  225. end
  226. } .internalbind def
  227. % The following compatibility operators are only documented by Adobe in a
  228. % supplement to the Red Book.
  229. %
  230. % - pagemargin <offset>
  231. % - pageparams <width> <height> <offset> <orientation>
  232. % <width> <height> <orientation> setpage -
  233. % <offset> setpagemargin -
  234. % <width> <height> <offset> <orientation> setpageparams -
  235. %
  236. % width and height are in default units (and if orientation is odd, are
  237. % exchanged!). offset is the x margin, also in default units.
  238. % Unfortunately, because orientation is relative to the device paper feed,
  239. % it does not have a consistent meaning in terms of image orientation.
  240. % We follow the convention that ORIENT1 determines the orientation value
  241. % that means portait: false means 0, true means 1.
  242. /pagemargin { 0 } .internalbind def
  243. /pageparams
  244. { currentdevice 1 dict dup /.MediaSize dup put .getdeviceparams
  245. exch pop exch pop aload pop 0 ORIENT1 { 1 } { 0 } ifelse
  246. } .internalbind def
  247. /setpage
  248. { ORIENT1 { 1 } { 0 } ifelse ne {exch} if
  249. //.setpagesize exec
  250. } .internalbind def
  251. /setpagemargin {pop} .internalbind def % can't do better without setpagedevice
  252. /setpageparams
  253. { exch pop ORIENT1 { 1 } { 0 } ifelse ne {exch} if
  254. //.setpagesize exec
  255. } .internalbind def
  256. /setpagetype
  257. { statusdict begin
  258. % The Adobe documentation only defines setpagetype
  259. % (a Level 1 operator) as accepting the values 0 and 1,
  260. % so we do too.
  261. dup type /integertype ne {
  262. /setpage cvx /typecheck signalerror
  263. } {
  264. dup 0 ne 1 index 1 ne or {
  265. /setpage cvx /rangecheck signalerror
  266. } {
  267. {/letter /note} 1 index get
  268. //systemdict /userdict get exch get cvx exec
  269. } ifelse
  270. /pagetype exch def
  271. } ifelse
  272. end
  273. } .internalbind def
  274. /setpassword
  275. {exch checkpassword
  276. {statusdict exch /.password exch put //true}
  277. {pop //false}
  278. ifelse} .internalbind def
  279. /setprintername
  280. {dup length string copy statusdict exch /.printername exch put} .internalbind def
  281. % setresolution is not documented by Adobe, but some applications
  282. % use it anyway, without testing whether or not it is present.
  283. %
  284. % <pixels_per_inch> setresolution -
  285. %
  286. % sets the resolution of the device.
  287. /setresolution
  288. { mark /HWResolution [ 4 -1 roll dup ] currentdevice putdeviceprops pop
  289. initmatrix erasepage
  290. } .internalbind def
  291. /setsccbatch {pop pop pop} .internalbind def
  292. /setsccinteractive {pop pop pop} .internalbind def
  293. /settumble {pop} .internalbind def
  294. /waittimeout 300 def
  295. %%%%%% End of documented items.
  296. /.password 0 def
  297. /.timeouts [0 60 30] def
  298. //true setdostartpage
  299. mark setidlefonts
  300. 0 setjobtimeout
  301. 0 0 setmargins
  302. product setprintername
  303. currentdict /.setpagesize .undef
  304. end % statusdict
  305. %%%%%% The following documented compatibility "operators" are in systemdict,
  306. %%%%%% not in statusdict.
  307. systemdict begin
  308. .currentglobal //true .setglobal
  309. /devformat //true def
  310. /devforall { % <pattern> <proc> <scratch> devforall -
  311. exch {
  312. 1 index currentdevparams
  313. /Type .knownget { /FileSystem eq } { //false } ifelse
  314. { exec } { pop pop } ifelse
  315. } /exec load 3 packedarray cvx exch
  316. (*) 3 1 roll /IODevice resourceforall
  317. } odef
  318. /devstatus { % <(%disk*%)> devstatus <searchable> <writable>
  319. % <hasNames> <mounted> <removable> <searchOrder>
  320. % <freePages> <size> //true
  321. % <string> devstatus //false
  322. dup length 5 ge {
  323. dup 0 5 getinterval (%disk) eq {
  324. dup /IODevice resourcestatus {
  325. pop pop dup currentdevparams
  326. dup /Searchable get
  327. exch dup /Writeable get
  328. exch dup /HasNames get
  329. exch dup /Mounted get
  330. exch dup /Removable get
  331. exch dup /SearchOrder get
  332. exch dup /Free get
  333. exch /LogicalSize get
  334. 9 -1 roll pop //true
  335. } {
  336. pop //false
  337. } ifelse
  338. } {
  339. pop //false
  340. } ifelse
  341. } {
  342. pop //false
  343. } ifelse
  344. } odef
  345. .setglobal end % systemdict
  346. % The following contents of serverdict are a complete guess,
  347. % based on some observed LaserWriter boilerplate.
  348. serverdict begin
  349. /execjob { } .internalbind def
  350. % The Red Book implies that something like the following is
  351. % an appropriate definition of exitserver.
  352. /exitserver { clear stop } .internalbind def
  353. % However, this interacts badly with our standard error handler,
  354. % so we override it with the following less appropriate definition.
  355. /exitserver { 0 ne { clear cleardictstack } if } .internalbind def
  356. /setrealdevice { } .internalbind def
  357. end % serverdict