DIRECTORY PDInterpOutput, AIS USING [Buffer, CloseFile, CreateFile, FRef, OpenWindow, RasterPart, UnsafeWriteLine, WRef, WriteComment], Basics USING [BITSHIFT], FS USING [ExpandName, ComponentPositions], ImagerPixelMap USING [Clear, Clip, Create, PixelMap, Reshape, Transfer], IO USING [PutFR1, rope], PDFileFormat USING [Herald, StartImage, Toner], PDInterpBitmap USING [BitmapDesc], PDQueue USING [LogMessage, Request], Rope USING [Concat, ROPE, Substr], ViewerClasses USING [Viewer]; PDInterpOutputAISImpl: PROGRAM IMPORTS AIS, Basics, ImagerPixelMap, IO, FS, PDQueue, Rope EXPORTS PDInterpOutput = BEGIN viewer: ViewerClasses.Viewer _ NIL; ROPE: TYPE ~ Rope.ROPE; Toner: TYPE ~ PDFileFormat.Toner; pageMap: PUBLIC ImagerPixelMap.PixelMap _ [0, 0, 0, 0, 0, 0, NIL]; currentStartImage: PDFileFormat.StartImage; currentHerald: PDFileFormat.Herald; bandNumber: NAT _ 0; currentToner: PUBLIC Toner _ cyan; print: BOOL _ TRUE; feed, strip: BOOL _ FALSE; StartImage: PUBLIC PROC [herald: PDFileFormat.Herald, startImage: PDFileFormat.StartImage, request: PDQueue.Request] RETURNS [PDInterpBitmap.BitmapDesc] = { bandMap: ImagerPixelMap.PixelMap; feed _ startImage.feed; strip _ startImage.strip; currentToner _ startImage.toner; PDQueue.LogMessage[message: IO.PutFR1["Getting storage for %g", IO.rope[(SELECT startImage.toner FROM black => "black", cyan => "cyan", magenta => "magenta", yellow => "yellow", ENDCASE => ERROR)]], userName: request.requestor]; IF (pageMap.sSize # herald.imageSSize) OR (pageMap.fSize # herald.imageFSize) THEN pageMap _ ImagerPixelMap.Reshape[pageMap.refRep, 0, [0, 0, herald.imageSSize, herald.imageFSize]]; ImagerPixelMap.Clear[pageMap]; PDQueue.LogMessage[message: "Making bitmap ... ", userName: request.requestor]; currentStartImage _ startImage; currentHerald _ herald; bandNumber _ 0; bandMap _ ImagerPixelMap.Clip[pageMap, [startImage.passBands*herald.bandSSize, startImage.fMinPage, herald.bandSSize, startImage.fSizePage]]; RETURN [[ sOrigin: bandMap.sOrigin, fOrigin: bandMap.fOrigin, sMin: bandMap.sMin, fMin: bandMap.fMin, sSize: bandMap.sSize, fSize: bandMap.fSize, pointer: bandMap.refRep.pointer, rast: bandMap.refRep.rast, lines: bandMap.refRep.lines ]] }; EndBand: PUBLIC PROC RETURNS [PDInterpBitmap.BitmapDesc] = { bandMap: ImagerPixelMap.PixelMap; bandNumber _ bandNumber + 1; bandMap _ ImagerPixelMap.Clip[pageMap, [(currentStartImage.passBands+bandNumber)*currentHerald.bandSSize, currentStartImage.fMinPage, currentHerald.bandSSize, currentStartImage.fSizePage]]; RETURN [[ sOrigin: bandMap.sOrigin, fOrigin: bandMap.fOrigin, sMin: bandMap.sMin, fMin: bandMap.fMin, sSize: bandMap.sSize, fSize: bandMap.fSize, pointer: bandMap.refRep.pointer, rast: bandMap.refRep.rast, lines: bandMap.refRep.lines ]] }; EndImage: PUBLIC PROC [request: PDQueue.Request] = { sepName: ROPE _ MakeName[request.fileName, currentToner]; PDQueue.LogMessage[message: IO.PutFR1["Writing %g", IO.rope[sepName]], userName: request.requestor]; StorePixelMap[sepName, pageMap]; PDQueue.LogMessage[message: "Done", userName: request.requestor]; }; MakeName: PROC [file: ROPE, toner: Toner] RETURNS [r: ROPE] = BEGIN cp: FS.ComponentPositions; [cp: cp, fullFName: r] _ FS.ExpandName[file]; r _ Rope.Substr[r, 0, cp.ext.start-1]; r _ Rope.Concat[r, (SELECT toner FROM black => "-k.ais", cyan => "-c.ais", magenta => "-m.ais", yellow => "-y.ais", ENDCASE => ERROR)]; END; ReprintLastPage: PUBLIC PROC [copies: CARDINAL] = {}; StorePixelMap: PROC [aisFileName: ROPE, source: ImagerPixelMap.PixelMap, bitmap: BOOLEAN _ TRUE, comment: ROPE _ NIL] ~ TRUSTED { output: AIS.FRef _ AIS.CreateFile[name: aisFileName, raster: NEW[AIS.RasterPart _ [ scanCount: source.sSize, scanLength: source.fSize, scanMode: IF source.sSize > source.fSize THEN rd ELSE ur, bitsPerPixel: IF source.refRep.lgBitsPerPixel = 0 AND bitmap THEN 1 ELSE Basics.BITSHIFT[1, source.refRep.lgBitsPerPixel], linesPerBlock: -1, paddingPerBlock: 65535 ]]]; outputWindow: AIS.WRef _ AIS.OpenWindow[output]; lineMap: ImagerPixelMap.PixelMap _ ImagerPixelMap.Create[source.refRep.lgBitsPerPixel, [source.sOrigin+source.sMin, source.fOrigin+source.fMin, 1, source.fSize]]; lineBufferDesc: AIS.Buffer _ [length: lineMap.refRep.words, addr: lineMap.refRep.pointer]; AIS.WriteComment[output, comment]; FOR i: NAT IN [0..source.sSize) DO lineMap.Clear; lineMap.Transfer[source]; lineMap.sOrigin _ lineMap.sOrigin + 1; AIS.UnsafeWriteLine[outputWindow, lineBufferDesc, i]; ENDLOOP; AIS.CloseFile[output]; }; currentHerald.password _ 0; END. VPDInterpOutputAISImpl.mesa Copyright (C) 1984, 1985, Xerox Corporation. All rights reserved. Implements a Cedar PD output device that makes ais files. Michael Plass, July 3, 1985 11:12:19 am PDT Tim Diebert: September 18, 1985 10:01:28 am PDT Dave Rumph, September 27, 1985 2:55:00 pm PDT Eric Nickell, August 21, 1986 3:42:19 pm PDT ΚΚ˜codešœ™K™BK™9K™+K™/K™-K™,K™—šΟk ˜ Kšœ˜Kšœœd˜mKšœœœ˜Kšœœ"˜*Kšœœ4˜HKšœœ˜Kšœ œ˜/Kšœœ˜"Kšœœ˜$Kšœœ œ ˜"Kšœœ ˜K˜—šΟnœ˜Kšœœœœ˜:Kšœ˜Kšœ˜K˜Kšœœ˜#šœœœ˜K˜—Kšœœ˜!Kšœ œ.œ˜BKšœ+˜+Kšœ#˜#Kšœ œ˜Kšœœ˜"Kšœœœ˜Kšœ œœ˜˜K˜—K˜šž œœœ]˜tKšœ ˜'Kšœ!˜!K˜Kšœ˜Kšœ˜Kšœ ˜ šœœ!˜?šœœ˜%KšœLœœ"˜~——Kšœ%œ%œc˜΅Kšœ˜KšœO˜OKšœ˜Kšœ˜K˜Kšœ˜šœ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜—Kšœ˜—K˜šžœœœœ ˜