DIRECTORY CD, CDBasics, CDCommandOps, CDDefaultProcs, CDExtras, CDIO, CDViewer, CDPolygons, CDMenus, CDOps, CDOrient, CDProperties, CDSequencer, CDValue, GraphicsBasic, CGArea, CGClipper, CGReducer, Commander, CornerStitching, Imager, IO, PDFileFormat, PDFileWriter, Process, Real, Rope, TerminalIO, ViewerClasses, ViewerSpecs; CDColorPDPlot: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCommandOps, CDDefaultProcs, CDExtras, CDIO, CDMenus, CDValue, CDViewer, CDOps, CDOrient, CDPolygons, CDProperties, CDSequencer, CGArea, CGClipper, CGReducer, Commander, CornerStitching, Imager, IO, PDFileWriter, Process, Real, TerminalIO = BEGIN plottingInProgress: BOOL _ FALSE; Toner: TYPE = PDFileFormat.Toner; -- {black, cyan, magenta, yellow, .. 15}; TonerKeys: TYPE = ARRAY Toner OF REF; LoadArray: TYPE = ARRAY Toner OF PDFileWriter.LoadReference; ColorDescription: TYPE = ARRAY CD.Layer OF REF LoadArray _ ALL[NIL]; whiteLoadRef: PDFileWriter.LoadReference = LAST[PDFileWriter.LoadReference]; tonerToKeyKeys: REF TonerKeys = NEW[TonerKeys _ ALL[NIL]]; deviceCode: PDFileFormat.DeviceCode _ last; sRes: CARDINAL _ 200; -- resolution (slow directition), pixels / inch fRes: CARDINAL _ 200; -- resolution (fast direction), pixels / inch scanLineWidth: CARDINAL _ 8000; --for the wide-bed Versatec, length in the "fast" direction; toners: PDFileWriter.TonerSet _ ALL[FALSE]; leftOverMode: BOOL _ FALSE; bandSSize: CARDINAL _ 64; -- number chosen because of buffer-size of versatec overLap: CARDINAL _ 300; -- number of pixels by which to overlap strips maxPixPerLambda: NAT _ 20; -- maximum # of pixels to make lambda paged: BOOL _ FALSE; slowLimited: BOOL _ FALSE; --only interesting if ~paged pageSlowSize: CARDINAL _ 0; --only interesting if paged or slowLimited stippleKey: ATOM _ $CDxVersatec; tonerToKey: REF TonerKeys _ NIL; ColorVersatec: PROC [] = BEGIN deviceCode _ last; --does not yet has an assigned value, use "last" sRes _ 200; -- resolution (slow directition), pixels / inch fRes _ 200; -- resolution (fast direction), pixels / inch scanLineWidth _ 8000; --for the wide-bed Versatec, length in the "fast" direction; toners _ ALL[FALSE]; toners[black] _ TRUE; toners[cyan] _ TRUE; toners[magenta] _ TRUE; toners[yellow] _ TRUE; bandSSize _ 64; -- number chosen because of buffer-size of versatec overLap _ 300; -- number of pixels by which to overlap strips maxPixPerLambda _ 20; -- maximum # of pixels to make lambda paged _ slowLimited _ FALSE; leftOverMode _ FALSE; stippleKey _ $CDxVersatec; TerminalIO.WriteRope["color versatec"]; END; InkJetC150: PROC [] = BEGIN deviceCode _ VAL[10]; sRes _ 120; -- resolution (slow directition), pixels / inch fRes _ 120; -- resolution (fast direction), pixels / inch scanLineWidth _ 1020; toners _ ALL[FALSE]; toners[black] _ TRUE; toners[cyan] _ TRUE; toners[magenta] _ TRUE; toners[yellow] _ TRUE; bandSSize _ 48; -- overLap _ 30; -- number of pixels by which to overlap strips maxPixPerLambda _ 20; -- maximum # of pixels to make lambda paged _ FALSE; slowLimited _ TRUE; pageSlowSize _ 1020; leftOverMode _ FALSE; stippleKey _ $CDxVersatec; TerminalIO.WriteRope["ink jet"]; END; Color400: PROC [] = BEGIN deviceCode _ VAL[9]; sRes _ 400; -- resolution (slow directition), pixels / inch fRes _ 400; -- resolution (fast direction), pixels / inch scanLineWidth _ 4096; toners _ ALL[FALSE]; toners[black] _ TRUE; toners[cyan] _ TRUE; toners[magenta] _ TRUE; toners[yellow] _ TRUE; bandSSize _ 50; -- overLap _ 30; -- number of pixels by which to overlap strips maxPixPerLambda _ 240; -- maximum # of pixels to make lambda paged _ TRUE; pageSlowSize _ 5500; leftOverMode _ FALSE; stippleKey _ $CDxC400; TerminalIO.WriteRope["Color400"]; END; Puffin: PROC [] = BEGIN deviceCode _ PDFileFormat.DeviceCode[puffin]; sRes _ 384; -- resolution (slow directition), pixels / inch fRes _ 384; -- resolution (fast direction), pixels / inch scanLineWidth _ fRes * 17 / 2; toners _ ALL[FALSE]; toners[black] _ FALSE; toners[cyan] _ TRUE; toners[magenta] _ TRUE; toners[yellow] _ TRUE; bandSSize _ 16; -- overLap _ 30; -- number of pixels by which to overlap strips maxPixPerLambda _ 20; -- maximum # of pixels to make lambda paged _ TRUE; pageSlowSize _ sRes*11; leftOverMode _ TRUE; stippleKey _ $CDxPuffin; TerminalIO.WriteRope["Puffin"]; END; PlateMaker: PROC [] = BEGIN deviceCode _ PDFileFormat.DeviceCode[last]; sRes _ 1200; -- resolution (slow directition), pixels / inch fRes _ 1200; -- resolution (fast direction), pixels / inch scanLineWidth _ fRes * 17 / 2; toners _ ALL[FALSE]; toners[black] _ TRUE; toners[cyan] _ FALSE; toners[magenta] _ FALSE; toners[yellow] _ FALSE; bandSSize _ 16; -- overLap _ 30; -- number of pixels by which to overlap strips maxPixPerLambda _ 20; -- maximum # of pixels to make lambda paged _ TRUE; pageSlowSize _ sRes*11; leftOverMode _ TRUE; stippleKey _ $CDxRaven; TerminalIO.WriteRope["Raven or platemaker"]; END; technologyPropertyKey: REF _ $CDxLastTechnology; --a property of the stippleKey abortPlot: REF BOOL _ NEW[BOOL _ FALSE]; PlotStateRef: TYPE = REF PlotState; PlotState: TYPE = RECORD [ tes: ARRAY CD.Layer OF REF CornerStitching.Tesselation _ ALL[NIL], scale: REAL _ 1.0, -- pixels per CD.Number totalPlotClip, bandClip: CD.Rect _ [0, 0, 0, 0], pdState: PDFileWriter.PDState, colorLoads: REF ColorDescription, anouncedLayer: INT _ -1 ]; pdy: CARDINAL _ 0; -- top of band in pixel coords stripClip: CD.Rect; -- clip for a page; not reduced to real design clip plotScale: REAL; imageSSize: CARDINAL; imageFSize: CARDINAL; ps: PlotStateRef; PrepareContextFilter: PROC [] = BEGIN contextFilter^ _ ALL[NIL]; FOR l: CD.Layer IN CD.Layer DO FOR toner: Toner IN Toner DO IF tonerToKey[toner]#NIL AND CDProperties.GetPropFromLayer[from: l, prop: tonerToKey[toner]]#NIL THEN { contextFilter^[l] _ Imager.black; EXIT }; ENDLOOP; ENDLOOP; END; CheckStipples: PROC [technology: CD.Technology] = BEGIN x: REF _ CDValue.Fetch[technology, stippleKey]; WITH x SELECT FROM r: Rope.ROPE => TerminalIO.WriteRopes["color stipples used: [", r, "]\n"]; ENDCASE => { TerminalIO.WriteRope["**color stipples are not defined\n"]; ERROR ABORTED }; IF technology.key#CDProperties.GetPropFromAtom[stippleKey, technologyPropertyKey] THEN TerminalIO.WriteRope["**Warning: another technology registered in the meantime; the technology independent stipples are redefined\n"]; tonerToKey _ NEW[TonerKeys _ ALL[NIL]]; FOR t: PDFileWriter.Toner IN PDFileWriter.Toner DO tonerToKey^[t] _ CDProperties.GetPropFromAtom[stippleKey, tonerToKeyKeys[t]]; IF ~toners[t] OR tonerToKey^[t]=NIL THEN { toners[t] _ FALSE; tonerToKey^[t] _ NEW[INT]; } ENDLOOP; PrepareContextFilter[]; END; ClipArea: PROC [comm: CDSequencer.Command] RETURNS [plotClip: CD.Rect] = BEGIN SELECT TerminalIO.RequestSelection["Plot", LIST["complete design", "rectangle"]] FROM 2 => { plotClip _ CDBasics.ToRect[comm.pos, comm.sPos]; TerminalIO.WriteRope["plot rectangle\n"]; }; ENDCASE => { plotClip _ CDExtras.BoundingBox[comm.design]; TerminalIO.WriteRope["plot all\n"]; }; IF plotClip.x1>=plotClip.x2 OR plotClip.y1>=plotClip.y2 THEN { TerminalIO.WriteRope["**cannot plot empty area\n"]; ERROR ABORTED }; END; ProtectedPlotDesign: PROC [comm: CDSequencer.Command] = BEGIN design: CD.Design = comm.design; plotClip: CD.Rect; plotSize: CD.Position; s: IO.STREAM _ NIL; strips: INT; plottingInProgress _ TRUE; TerminalIO.WriteRope["Starting Color plot for "]; SELECT comm.a FROM $VersatecColorPlot => ColorVersatec[]; $C150ColorPlot => InkJetC150[]; $PuffinColorPlot => Puffin[]; $PlatemakerColorPlot => PlateMaker[]; $Color400Plot => Color400[]; ENDCASE => ERROR; TerminalIO.WriteLn[]; CheckStipples[design.technology]; plotClip _ ClipArea[comm]; plotSize _ CDBasics.SizeOfRect[plotClip]; TRUSTED {Process.SetPriority[Process.priorityBackground]}; strips _ 1; IF ~paged AND ~slowLimited THEN { IF TerminalIO.Confirm[label: "plot multiple vertical strips", choice: "yes"] THEN strips _ TerminalIO.RequestInt["How many vertical strips? [1..10] "]; }; strips _ MAX[1, MIN[10, strips]]; BEGIN ENABLE { -- for ERRORs UNWIND => { s _ AbortFile[s]; CDViewer.RemoveArrow[design]; TerminalIO.WriteRope[" ** plot aborted ** "] }; }; dr: CD.DrawRef = CD.CreateDrawRef[design]; scale: REAL _ MIN[ REAL[maxPixPerLambda] / design.technology.lambda, REAL[(scanLineWidth-overLap)*strips+overLap] / plotSize.x ]; pageStep: CD.Position; pageWidth: CD.Position; imageFSize _ scanLineWidth; imageSSize _ Real.FixC[plotSize.y*scale]+1; IF paged THEN { imageSSize _ MIN[imageSSize, pageSlowSize]; scale _ MIN[scale, REAL[pageSlowSize]/(plotSize.y+1)]; }; ps _ NEW[PlotState _ [ scale: scale, totalPlotClip: plotClip, colorLoads: NEW[ColorDescription _ ALL[NIL]] ]]; pageStep _ [plotSize.x/strips, plotSize.y]; pageWidth _ [Real.Round[scanLineWidth/scale], plotSize.y]; plotScale _ scale; dr.minimalSize _ 0; dr.stopFlag _ abortPlot; dr.drawRect _ NoteRectangle; dr.drawContext _ DrawContext; dr.contextFilter _ contextFilter; dr.devicePrivate _ ps; FOR strip: INT IN [0..strips) DO localFileName: Rope.ROPE = CDIO.MakeName[wDir: "///temp/", base: "plot", modifier: IO.PutFR["%d", IO.int[strip+1]], ext: "pd"]; TerminalIO.WriteRopes["Recording strip on file ", localFileName, "\n"]; stripClip _ [ --but not yet intersected with complete design clip x1: plotClip.x1+strip*pageStep.x, y1: plotClip.y1, x2: plotClip.x1+strip*pageStep.x+pageWidth.x, y2: plotClip.y2 ]; ps.pdState _ PDFileWriter.Create[ fileName: localFileName, deviceCode: deviceCode, sResolution: sRes, fResolution: fRes, imageSSize: imageSSize, imageFSize: imageFSize, bandSSize: bandSSize, leftOverMode: leftOverMode ]; ps.colorLoads^ _ ALL[NIL]; PDFileWriter.StartImage[pdState: ps.pdState, toners: toners]; FOR bandYtop: INT _ 0, bandYtop+bandSSize WHILE bandYtop { s _ AbortFile[s]; CDViewer.RemoveArrow[design]; TerminalIO.WriteRope[" ** plot aborted ** "]; }; END; -- enable END; -- PlotDesign NoteRectangle: PROC [r: CD.Rect, l: CD.Layer, pr: CD.DrawRef] = BEGIN ps: PlotStateRef = NARROW[pr.devicePrivate]; IF CDBasics.NonEmpty[r] THEN { IF ps.tes[l]=NIL THEN ps.tes[l] _ CornerStitching.NewTesselation[]; ps.tes[l].ChangeRect[rect: r, newValue: $covered]; }; END; SetColor: PROC [ps: PlotStateRef, lev: CD.Layer] = BEGIN Stipple16: TYPE = ARRAY[0..16) OF CARDINAL; Stipple8: TYPE = ARRAY[0..8) OF [0..256); Stipple4: TYPE = ARRAY[0..4) OF [0..16); ToTexture: PROC [pattern: REF ANY] RETURNS [texture: Stipple16] = BEGIN IF pattern=NIL THEN RETURN[Stipple16[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]; -- should not occur WITH pattern SELECT FROM s16: REF Stipple16 => texture _ s16^; s8: REF Stipple8 => FOR i: [0..8) IN [0..8) DO texture[i] _ texture[i+8] _ (256+1)*s8[i]; ENDLOOP; s4: REF Stipple4 => FOR i: [0..4) IN [0..4) DO texture[i] _ texture[i+4] _ texture[i+8] _ texture[i+12] _ s4[i]*1111H; ENDLOOP; ENDCASE => RETURN[Stipple16[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0FFFFH]]; -- error texture RETURN [texture] END; -- ToTexture MakeLoadref: PROC [pattern: REF ANY] RETURNS [loadRef: PDFileWriter.LoadReference] = TRUSTED BEGIN texture: Stipple16 _ ToTexture[pattern]; loadRef _ PDFileWriter.LoadContiguousColorTile[pdState: ps.pdState, phase: 0, sMin: 0, fMin: 0, sSize: 16, fSize: 16, bitsPtr: @texture]; END; -- MakeLoadref MakeLoad: PROC [ps: PlotStateRef, lev: CD.Layer] = BEGIN IF ps.colorLoads^[lev]=NIL THEN { ps.colorLoads^[lev] _ NEW[LoadArray]; FOR toner: Toner IN Toner DO tex: REF _ CDProperties.GetPropFromLayer[from: lev, prop: tonerToKey[toner]]; IF tex=NIL THEN ps.colorLoads^[lev][toner] _ whiteLoadRef ELSE ps.colorLoads^[lev][toner] _ MakeLoadref[tex] ENDLOOP; }; END; --MakeLoad IF ps.anouncedLayer=lev THEN RETURN; IF ps.colorLoads^[lev]=NIL THEN MakeLoad[ps, lev]; FOR toner: Toner IN Toner DO IF ps.colorLoads^[lev][toner] = whiteLoadRef THEN PDFileWriter.SetColorOff[ps.pdState, toner] ELSE PDFileWriter.SetColorTile[ps.pdState, toner, ps.colorLoads^[lev][toner], transparent]; ENDLOOP; ps.anouncedLayer _ lev END; contextFilter: REF CD.ContextFilter = NEW[CD.ContextFilter_ALL[Imager.black]]; PlotPolygon: PROC [ob: CD.Object, pos: CD.Position, orient: CD.Orientation] = BEGIN OutputTrapezoid: PROCEDURE [xbotL: REAL, xbotR: REAL, ybot: REAL, xtopL: REAL, xtopR: REAL, ytop: REAL] = BEGIN PDFileWriter.MaskTrapezoid[ pdState: ps.pdState, sMin: Real.RoundC[ybot], sSize: Real.RoundC[ytop-ybot], fMin: Real.RoundC[xbotL], fSize: Real.RoundC[xbotR-xbotL], fMinLast: Real.RoundC[xtopL], fSizeLast: Real.RoundC[xtopR-xtopL] ]; END; --OutputTrapezoid pp: CDPolygons.PolygonPtr = NARROW[ob.specificRef]; polygon: CGReducer.Ref = CGReducer.New[size: 8]; tiling: CGArea.Ref = CGArea.New[size: 4]; clipRef: CGClipper.Ref = CGClipper.New[size: 4]; clip: GraphicsBasic.Box _ [ xmin: 0, ymin: pdy, xmax: MIN[(ps.bandClip.x2-stripClip.x1)*plotScale, imageFSize], ymax: MIN[pdy+bandSSize, imageSSize] ]; CGClipper.SetBox[self: clipRef, box: clip]; CGClipper.Load[self: clipRef, reducer: polygon]; FOR p: LIST OF CD.Position _ pp.points, p.rest WHILE p#NIL DO at: CD.Position = CDOrient.MapPoint[ pointInCell: p.first, cellSize: ob.size, cellInstOrient: orient, cellInstPos: pos ]; CGReducer.Vertex[self: polygon, v: [ x: (at.x-stripClip.x1)*plotScale, y: (stripClip.y2-at.y)*plotScale ]] ENDLOOP; CGReducer.Close[polygon]; CGReducer.Generate[self: polygon, area: tiling]; UNTIL CGArea.Empty[tiling] DO t: GraphicsBasic.Trap = CGArea.Remove[tiling]; OutputTrapezoid[t.xbotL, t.xbotR, t.ybot, t.xtopL, t.xtopR, t.ytop]; ENDLOOP; END; --PlotPolygon DrawContext: PROC [pr: CD.DrawRef, proc: CD.DrawContextLayerProc, ob: CD.Object, pos: CD.Position, orient: CD.Orientation, layer: CD.Layer] = BEGIN IF CDPolygons.IsPolygon[ob] THEN { SetColor[ps, layer]; PlotPolygon[ob, pos, orient]; } ELSE CDDefaultProcs.DrawContext[pr, proc, ob, pos, orient, layer] END; AnalyzeTesselations: PROC [ps: PlotStateRef] = BEGIN FOR lev: CD.Layer IN CD.Layer DO IF ps.tes[lev]#NIL THEN { SetColor[ps, lev]; CornerStitching.EnumerateArea[plane: ps.tes[lev], rect: ps.bandClip, perTile: ProcessTile, data: ps]; }; ENDLOOP; END; ProcessTile: PROCEDURE [tile: REF CornerStitching.Tile, data: REF ANY] = BEGIN IF tile.Value = $covered THEN { rightBound, xStart, xStop, yStart, yStop: INT; cxStart, cxStop, cyStop, cyStart: CARDINAL; sSize, fSize: CARDINAL; ps: PlotStateRef = NARROW[data]; r: CD.Rect = tile.Area; xStart _ Real.Round[(r.x1-stripClip.x1)*plotScale]; yStop _ Real.Round[(stripClip.y2-r.y1)*plotScale]; xStop _ Real.Round[(r.x2-stripClip.x1)*plotScale]; yStart _ Real.Round[(stripClip.y2-r.y2)*plotScale]; rightBound _ Real.Round[(ps.bandClip.x2-stripClip.x1)*plotScale]; IF xStart>rightBound OR xStop<0 THEN RETURN; IF yStopMIN[imageSSize, pdy+bandSSize] THEN RETURN; cxStart _ MAX[xStart, 0]; cxStop _ MIN[xStop, rightBound, imageFSize]; cyStart _ MAX[yStart, pdy]; cyStop _ MIN[yStop, pdy+bandSSize, imageSSize]; fSize _ cxStop - cxStart; sSize _ cyStop - cyStart; IF sSize>0 AND fSize>0 THEN PDFileWriter.MaskRectangle[pdState: ps.pdState, sMin: cyStart, fMin: cxStart, sSize: sSize, fSize: fSize]; }; END; AbortFile: PROC [s: IO.STREAM] RETURNS [IO.STREAM] = { IF s#NIL THEN s.Close[abort: TRUE]; RETURN[NIL] }; PDColorPlotComm: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Color plot\n"]; [] _ CDCommandOps.CallWithResource[ProtectedPlotDesign, comm, $ColorPlot, abortPlot]; END; WaitPlotFinishedCommand: Commander.CommandProc = BEGIN prio: Process.Priority = Process.GetPriority[]; IF ~plottingInProgress THEN { IO.PutRope[cmd.out, " waiting for plot to start"]; WHILE ~plottingInProgress DO Process.Pause[Process.SecondsToTicks[1]]; ENDLOOP; IO.PutRope[cmd.out, ". plot started...\n"] }; Process.SetPriority[Process.priorityBackground]; WHILE plottingInProgress DO Process.Pause[Process.SecondsToTicks[2]]; ENDLOOP; Process.SetPriority[prio]; IO.PutRope[cmd.out, " finished\n"] END; Init: PROC [] = BEGIN tonerToKeyKeys[black] _ $CDxColorPDPlotBlack; tonerToKeyKeys[cyan] _ $CDxColorPDPlotCyan; tonerToKeyKeys[magenta] _ $CDxColorPDPlotMagenta; tonerToKeyKeys[yellow] _ $CDxColorPDPlotYellow; CDSequencer.ImplementCommand[a: $VersatecColorPlot, p: PDColorPlotComm, queue: doQueue]; CDSequencer.ImplementCommand[a: $C150ColorPlot, p: PDColorPlotComm, queue: doQueue]; CDSequencer.ImplementCommand[a: $Color400Plot, p: PDColorPlotComm, queue: doQueue]; CDSequencer.ImplementCommand[a: $PuffinColorPlot, p: PDColorPlotComm, queue: doQueue]; CDSequencer.ImplementCommand[a: $PlatemakerColorPlot, p: PDColorPlotComm, queue: doQueue]; CDMenus.CreateEntry[$HardCopyMenu, "PD Color Versatec", $VersatecColorPlot]; CDMenus.CreateEntry[$HardCopyMenu, "PD C150", $C150ColorPlot]; CDMenus.CreateEntry[$HardCopyMenu, "PD Puffin, (1 page)", $PuffinColorPlot]; CDMenus.CreateEntry[$HardCopyMenu, "PD Platemaker", $PlatemakerColorPlot]; CDMenus.CreateEntry[$HardCopyMenu, "PD Color400", $Color400Plot]; Commander.Register[ key: "CDWaitPlotFinished", proc: WaitPlotFinishedCommand, doc: "waits until ChipNDale pd plotting is finished" ]; TerminalIO.WriteRope["ChipNDale color plot program loaded\n"]; END; Init[]; END. ώCDColorPDPlot.mesa Jacobi, February 28, 1986 5:18:25 pm PST Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. written by E. McCreight, August 1, 1983 2:00 PM Last Edited by: McCreight, November 23, 1983 4:58 pm Last Edited by: Jacobi, October 27, 1983 12:36 pm Last Edited by: Jacobi, April 11, 1985 3:21:48 pm PST Last Edited by: Kimr, October 29, 1984 9:49:48 am PST --handling colors -- used to identify tiles without toner so that you can avoid recording them --gives a key to get the keys to get the color stipple as property of the layers --device description --gives a key to get the color stipple as property of the layers --state of the plot --rectangles in design space touching all geometry in the plot, or this band xoffset: INT _ -stripClip.x1*scale; yoffset: INT _ stripClip.y2*scale; --ENABLE UNWIND => plottingInProgress _ FALSE; --dont, we better wait longer... --Center the x range of the selected area of the design on the plotter bed, with at most maxPixPerLambda pixels per lambda. If multiple strips are called for, overlap adjacent ones by "overLap" pixels. -- total number of pixels across plot = REAL[scanLineWidth]+REAL[scanLineWidth-overLap]*(strips-1)) -- For each band in the strip -- Determine coordinate transformations --Display current band under consideration to pacify user -- clear previous tessalations --tries to convert pattern to a texture stipple --makes the load if it does not already exist --SetColor --lower left x, lower right x, lower y, upper left x, upper right x, upper y --global variables ps, stripClip, plotScale, imageFSize, imageSSize, pdy --x-Fast --y-Slow --PlotPolygon --CornerStitching.PerTileProc -- calculate device coords of rectangle -- clip device rectangle -- print device rectangle Κ˜codešœ™K™(K™Kšœ Οmœ7™BKšœ1™1Kšœ5™5K™2K™6K™6—K˜šΟk ˜ Kšžœ˜Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ šœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ —Kšœ ˜ Kšœ˜Kšœ˜Kšžœ˜K˜ K˜ Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ —K˜šΠbl œžœž˜KšžœžœAΟcœŒžœ+˜‡—Kšž˜K˜Kšœžœžœ˜!K˜KšΟb™K˜Kšœžœ )˜LKš œ žœžœžœžœ˜%Kšœ žœžœžœ˜Kšœ %˜;Kšœžœ˜Kšœžœ˜Kšœ˜Kšœ'˜'Kšžœ˜—K˜š’ œžœ˜Kšž˜Kšœ žœ˜Kšœ  /˜˜Jšžœ˜ Kšœ;˜;Kšžœž˜ K˜——šžœPž˜VKšœ†˜†—Kšœ žœ žœžœ˜'šžœžœž˜2KšœM˜Mšžœ žœžœžœ˜*Kšœ žœ˜Kšœžœžœ˜K˜—Kšžœ˜—Kšœ˜Kšžœ˜—K˜š’œžœžœ žœ˜HKšž˜šžœ%žœ"ž˜U˜Kšœ0˜0Kšœ)˜)K˜—šžœ˜ Kšœ-˜-Kšœ#˜#K˜——šžœžœžœ˜>Kšœ3˜3Jšžœž˜ K˜—Kšžœ˜—K˜š’œžœ˜7šž˜Kšœ/™/Kšœ ™ —Kšœžœ˜ Kšœ žœ˜Kšœ žœ ˜Kšœžœžœžœ˜Kšœžœ˜ Kšœžœ˜Kšœ1˜1šžœž˜Kšœ&˜&Kšœ˜Kšœ˜Kšœ%˜%Kšœ˜Kšžœžœ˜—Kšœ˜Kšœ!˜!Kšœ˜Kšœ)˜)Kšžœ3˜:Kšœ ˜ šžœžœžœ˜!šžœKž˜QKšœE˜E—K˜—Kšœ žœžœ˜!šžœ˜šžœ  ˜šžœ˜ Kšœ˜Kšœ˜Kšœ,˜,Kšœ˜—Kšœ˜—Kšœžœ žœ˜+šœžœžœ˜Kšžœ-˜1Kšžœ5˜9Kšœ˜KšœΙ™ΙKšœ(žœžœ#™c—K˜K˜K˜Kšœ˜Kšœ+˜+šžœžœ˜Kšœ žœ˜+Kšœžœžœ˜6Kšœ˜—K˜šœžœ˜Kšœ ˜ Kšœ˜Kšœ žœžœžœ˜,Kšœ˜—Kšœ+˜+Kšœ:˜:Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ!˜!K˜šžœžœžœ ž˜ Kš œžœžœ4žœ žœ˜K˜Gšœ 3˜AKšœ"˜"Kšœ˜Kšœ.˜.Kšœ˜Kšœ˜—šœ!˜!Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜—Kšœžœžœ˜Kšœ=˜=K™šžœ žœžœž˜FKšœžœ >˜KKšžœ žœžœ ˜"K™'K˜šœ˜Kšœ˜Kšœ9˜9Kšœ2˜2Kšœ+˜+Kšœ˜—KšœD˜DK™9šœ)˜)Kšœ.˜.Kšœ-˜-Kšœ˜—Kšœ™Kšœ˜š žœžœžœžœž˜šžœ žœž˜KšœPžœ˜U—Kšžœ˜—Kšœ 6˜TKšœ ˜-Kšœ˜Kšžœ ˜'—K˜!K˜Kšœ˜Kšžœ ˜—Kšœ,˜,Kšœ%˜%Kšœžœ˜šž˜šœ˜Kšœ˜Kšœ˜Kšœ.˜.Kšœ˜——Kšžœ  ˜—Kšžœ  ˜K˜—š ’ œžœžœ žœ žœ ˜?Kšž˜Kšœžœ˜,šžœžœ˜Kšžœ žœžœ.˜CKšœ2˜2Kšœ˜—Kšžœ˜—K˜š’œžœžœ ˜2Kšž˜Kš œ žœžœžœžœ˜+Kšœ žœžœžœ ˜)Kšœ žœžœžœ ˜(K˜š ’ œžœ žœžœžœ˜AKšœ/™/Kšž˜Kš žœ žœžœžœ. ˜[šžœ žœž˜Kšœžœ˜%šœžœ ˜šžœ žœž˜Kšœ*˜*Kšžœ˜——šœžœ ˜šžœ žœž˜KšœG˜GKšžœ˜——Kšžœžœ4 ˜U—Kšžœ ˜Kšžœ  ˜—K˜š ’ œžœ žœžœžœ(˜TKšžœž˜ Kšœ(˜(Kšœ‰˜‰Kšžœ ˜—K˜š’œžœžœ ˜2Kšœ-™-Kšž˜šžœžœžœ˜!Kšœžœ ˜%šžœžœž˜KšœžœE˜MKšžœžœžœ*˜9Kšžœ.˜2Kšžœ˜—K˜—Kšžœ  ˜—K˜Kšœ ™ Kšžœžœžœ˜$Kšžœžœžœ˜2šžœžœž˜šžœ+žœ˜2Kšœ+˜+—šž˜KšœV˜V—Kšžœ˜—Kšœ˜Kšžœ˜—K˜Kš œžœžœžœžœžœ˜NK˜š ’ œžœžœžœžœ˜MKšž˜K˜š’œž œ žœ žœžœ žœ žœžœ˜iKšœL™LKšž˜KšœH™HKšœ™Kšœ™šœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ!˜!Kšœ˜Kšœ#˜#K˜—Kšžœ ˜K˜—Kšœ ™ Kšœžœ˜3Kšœ0˜0Kšœ)˜)Kšœ0˜0šœ˜Kšœ ˜ Kšœ ˜ Kšœžœ7˜@Kšœžœ˜$Kšœ˜—Kšœ+˜+Kšœ0˜0š žœžœžœžœžœžœž˜=šœžœ˜$Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜—šœ$˜$Kšœ"˜"Kšœ ˜ Kšœ˜—Kšžœ˜—Kšœ˜Kšœ0˜0šžœž˜Kšœ.˜.KšœD˜DKšžœ˜—Kšžœ  ˜—K˜š’ œžœžœžœžœžœžœžœ ˜Kšž˜šžœžœ˜"Kšœ˜Kšœ˜K˜—Kšžœ=˜AKšžœ˜—K˜š’œžœ˜.Kšž˜š žœžœžœžœž˜ šžœ žœžœ˜Kšœ˜Kšœe˜eKšœ˜—Kšžœ˜—Kšžœ˜K˜—š ’ œž œžœžœžœ˜HKšœ™Kšžœ˜šžœžœ˜Kšœ*žœ˜.Kšœ"žœ˜+Kšœžœ˜Kšœžœ˜ Kšœžœ˜Kšœ'™'Kšœ3˜3Kšœ3˜3Kšœ2˜2Kšœ5˜5Kšœ™KšœA˜AKšžœžœ žœžœ˜,Kš žœ žœžœžœžœ˜BKšœ™Kšœ žœ ˜Kšœ žœ ˜,Kšœ žœ˜Kšœ žœ#˜/K˜Kšœ˜Kšžœ žœ žœk˜†Kšœ˜—Kšžœ˜K˜—š’ œžœžœžœžœžœžœ˜6Kš žœžœžœžœž˜%Kšžœžœ˜ Kšœ˜—K™š’œžœ˜3Kšžœ˜Kšœ&˜&KšœU˜UKšžœ˜K˜—š‘œ˜1Kšž˜Kšœ/˜/šžœžœ˜Kšžœ1˜3šžœž˜Kšœ)˜)Kšž˜—Kšžœ(˜*K˜—Kšœ0˜0šžœž˜Kšœ)˜)Kšžœ˜—Kšœ˜Kšžœ!˜#Kšžœ˜—K˜š’œžœ˜Kšž˜Kšœ-˜-Kšœ+˜+Kšœ1˜1Kšœ/˜/KšœX˜XKšœT˜TKšœS˜SKšœV˜VKšœZ˜ZKšœL˜LKšœ>˜>KšœL˜LKšœJ˜JKšœA˜Ašœ˜Kšœ˜Kšœ˜Kšœ4˜4Kšœ˜—Kšœ>˜>Kšžœ˜K˜—Kšœ˜Kšžœ˜K˜K˜—…—G˜e°