// S C A N
// errors 800
//
// ScanPressPage(pDoc, page, part)
// ScanBreakPage(pDoc, page, pass)
//
get "Spruce.d"
get "sprucefiles.d"
get "PressFile.d"
// outgoing procedures
external
[
ScanPressPage
ScanBreakPage
]
// incoming procedures
external
[
//SHOW
ShowCharacters
ShowCharactersImmediate
ShowRectangle
ShowX
ShowY
ShowXY
ShowCharSet
ShowCharFont
ShowCharSetSpace
ShowOnCopy
ShowDots
FSGetRelease
//WINDOW
WindowRead
WindowReadBlock
WindowReadByte
WindowSetPosition
//PARTS
SetPartBounds
SetPositioninPart
SetBytePositioninPart
GetPositioninPart
SkipinPart
//SPRUCE
SpruceError
SpruceCondition
DblShift
FSGetX
FSGet
FSPut
DisableComments
//SPRUCEML
DoubleAdd; DoubleSub; DoubleCop
TGr
//Time stuff
CONVUDT
//OS
MoveBlock
SetBlock; Zero
]
// incoming statics
external
[
printerName
printerDevice
breakPage
Version; MinorVersion; SpruceVersion; SpruceMinorVersion
Capabilities
comments
commentFree
LogoText
numComments
]
// internal statics
static
[
Entity
]
// File-wide structure and manifest declarations.
structure EHC : //EH + some stuff
[
@EH
next word //Pointer to next entity
ELCPos word 2 //Part pos of entity commands
]
// Procedures
let ScanPressPage(pDoc, page, part) be
[
let EL=pDoc>>DocG.EL
let DL=pDoc>>DocG.DL
]
// Break-page maker
// For three color and four color printers, create three (or four) color separated images.
// On three-color printers, black is the sum of all three toners; on the four-color puffin there
// is a black developer housing. On black printers, this routine returns unless it is the first pass.
and ScanBreakPage(pDoc, page, pass) be
[
manifest [
textLeft=30; textFirst=70; textSpace=4
commentLeft = 15; commentFirst = textFirst - 8*textSpace; commentSpace = 2
logoLeft = 15; logoRight = 60; logoTop = 95; logoBottom = 10
]
let blackPass, magentaPass, yellowPass, cyanPass = true, true, true, true
test breakPage eq 1 ifso
[
if pass ne 1 return
]
ifnot
[
magentaPass = pass eq 1
yellowPass = pass eq 2
cyanPass = pass eq 3
if breakPage eq 4 do blackPass = pass eq 4 // for threecolor all passes are black
]
let f = commentFree // Temporarily disable comment entries
DisableComments()
ShowCharSetSpace(0)
ShowCharSet(64) // Font set reserved for break page
ShowCharFont(0) // Normal printing
if blackPass do
[
BreakString("Printer ", textLeft, textFirst)
BreakString(printerName)
BreakString("Spruce version ", textLeft, textFirst-textSpace)
BreakNumber(Version)
BreakString(".")
BreakNumber(MinorVersion)
BreakString(" -- spooler version ")
BreakNumber(SpruceVersion)
BreakString(".")
BreakNumber(SpruceMinorVersion)
]
if blackPass % cyanPass do BreakString("File: ", textLeft, textFirst-3*textSpace)
if cyanPass do BreakString(lv pDoc>>DocG.FileStr)
if blackPass do
[
BreakString("Creation date: ", textLeft, textFirst-4*textSpace)
BreakString(lv pDoc>>DocG.DateStr)
BreakString("Printing date: ", textLeft, textFirst-5*textSpace)
let s=vec 100
CONVUDT(s,0,true)
BreakString(s)
]
if blackPass % magentaPass % yellowPass do BreakString("For: ", textLeft, textFirst-6*textSpace)
if magentaPass % yellowPass do BreakString(lv pDoc>>DocG.CreatStr)
if blackPass do
[
if (lv pDoc>>DocG.ByStr)>>STR.length ne 0 do
[
BreakString(" By: ")
BreakString(lv pDoc>>DocG.ByStr)
]
BreakString("", textLeft, textFirst-7*textSpace)
let p=(pDoc>>DocG.nPages-breakPage)/breakPage
let c=pDoc>>DocG.nCopies
let s = p
if pDoc>>DocG.duplex then s= (p + 1)/2
BreakNumber(s*c+1)
BreakString(" total sheets = ")
BreakNumber(p)
BreakString((p eq s? ( p eq 1? " page, ", " pages, "), (p eq 1? " side, ", " sides, ")))
BreakNumber(c)
BreakString((c eq 1? " copy.", " copies."))
if numComments then for i = 0 to numComments do
[
let comment = comments!i
unless comment loop
BreakString(comments+comment, commentLeft, commentFirst-i*commentSpace)
]
//Now sprinkle top of break page with first letter of "For" name
let p=(lv pDoc>>DocG.CreatStr
let s=vec 2
s>>STR.length=2
s>>STR.char↑1=(c ge $a)? c-$a+$A,c
s>>STR.char↑2=$*s
BreakString(s,12,100
for i=0 to 5 do BreakString(s)
BreakString(p,42,100)
]
if (Capabilities & mMailbox) do
[
ShowOnCopy(1001)
BreakString("MORE IN OVERFLOW BIN", textLeft, commentFirst-(numComments + 1)*commentSpace)
ShowOnCopy(1002)
BreakString("MORE IN MAILBOX", textLeft, commentFirst-(numComments + 1)*commentSpace)
ShowOnCopy(0)
]
if (Capabilities & mDuplex) do
[
ShowOnCopy(1003)
BreakString("Probable two-sided print problem", textLeft, commentFirst-(numComments + 1)*commentSpace)
ShowOnCopy(0)
]
// Now pepper the logo around...
ShowCharFont(1)
if cyanPass do for x=0 to 1 do for y=0 to 1 do
BreakString(LogoText, logoLeft+x*(logoRight-logoLeft),
logoBottom+y*(logoTop-logoBottom))
// And print some strong vertical lines for easy identification:
let x=5
// Red
if magentaPass % yellowPass do for i=0 to 1 do
[
for j=0 to 5 do
[
ShowXY((x+j)*254, 10*254) // x=.5",.6",,7" ; y=1.0"
// 10.0 " takes too much time on Alto II XM at 384 7-31-78
ShowRectangle(254/2, 90*254) // .05" by 9.0" -- penguin 1/29/79
]
x=75
]
commentFree = f // reenable comments if were enabled before
]
and BreakString(str, x, y; numargs n) be
[
if n ne 1 then ShowXY(x*254, y*254) // x,y in tenths of inches
// any errors rendering these strings will be ignored
let len = str>>STR.length
ShowCharactersImmediate(str, 1, len+1)
]
and BreakNumber(n) be
[
let nn=n/10
if nn then BreakNumber(nn)
nn=(n rem 10)+$0+400b
BreakString(lv nn)
]
// DCS, ,July 27, 1977 10:42 PM minor mods (WindowRead2Bytes -> WindowRead (!))
// September 30, 1977 12:32 AM, implement ShowDots (not opaque tho)
// October 3, 1977 6:46 AM, handle three-color break page
// October 10, 1977 2:52 PM, add "Version", externally settable
// December 16, 1977 11:23 AM, narrower spacing between comments
// January 20, 1978 4:43 PM, remove PimlicoAlt
// January 20, 1978 5:34 PM, disable Durango
// May 15, 1978 10:08 PM, be less paternalistic about errors in BreakString
// June 7, 1978 9:40 PM, add skipcontrolbytesimmediate, alternative features
// June 14, 1978 8:43 PM, repair DL skip in alternative
// July 31, 1978 11:38 PM, make break page verticals .1" shorter to avoid breakup
// September 14, 1978 5:25 PM, add printer name, new version stuff
// October 3, 1978 5:20 PM, new calling sequence to ShowCharacters . . . for fast (mu) inner loop
// October 16, 1978 1:18 PM, puffin turned on - BWB
// December 6, 1978 11:46 AM add Penguin, use Capabilities to select nBreaks
// March 7, 1979 1:56 PM make four color break pages
// May 22, 1979 12:18 PM fix break page maker
// August 1, 1979 3:18 PM, mBlack became mBlackHousing ??!!
// August 5, 1979 7:44 AM, add "By" to break page and correct sheet count for twosided print
// August 7, 1979 2:49 PM, fix same
// August 24, 1979 1:53 PM, add ShowOnCopy stuff for Penguin print-time break page messages
// September 24, 1979 10:21 AM, remove log and proprietary stuff from breakpage
// November 18, 1979 9:49 PM, add logo text from user.cm
// January 18, 1980 12:11 PM, decide number of sheets from DocG.duplex
// May 9, 1980, 4:15 PM, check size of entity list in ShowEntity. error 803
//July 16, 1980,4:21 PM use breakPage for count of images on break page
// January 28, 1981, 12:30 PM, added Sproull-style "Printing date" and user first letters
//to the break page
//