<> <> <> <<>> DIRECTORY Atom USING [DottedPairNode, PropList], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Parse], FS USING [Error], Imager, ImagerInterpress USING [Close, Create, DoPage, Ref], ImagerTypefaceExtras USING [GenericCreatorProc, GenericCreatorRep, RegisterGenericCreator], ProcessProps USING [AddPropList, GetProp], Real USING [RoundC], Rope USING [Cat, Equal, Find, ROPE], Vector2 USING [VEC], ViewerClasses USING [Viewer, ViewerRec], ViewerOps USING [EnumerateViewers, EnumProc], ViewerSpecs USING [windowBorderSize], ViewersToIP; ViewersToIPImpl: CEDAR PROGRAM IMPORTS Commander, CommandTool, FS, Imager, ImagerInterpress, ImagerTypefaceExtras, ProcessProps, Real, Rope, ViewerOps, ViewerSpecs EXPORTS ViewersToIP ~ BEGIN Context: TYPE ~ Imager.Context; ROPE: TYPE ~ Rope.ROPE; VEC: TYPE ~ Vector2.VEC; Viewer: TYPE ~ ViewerClasses.Viewer; windowBorderSize: INTEGER ~ ViewerSpecs.windowBorderSize; viewerToIPDoc: ROPE ~ "\nCreate interpress master from viewer. (ViewerToIP output _ viewer [version])"; pressProp: Atom.PropList ~ LIST[NEW[Atom.DottedPairNode _ [key: $ViewersToIPFontSubstitution, val: $PressFonts]]]; ViewerToIPCmd: Commander.CommandProc ~ { ENABLE FS.Error => IF error.group=user THEN { result _ $Failure; msg _ error.explanation; GOTO Fail; }; args: CommandTool.ArgumentVector ~ CommandTool.Parse[cmd]; viewer: Viewer; version: ROPE _ NIL; IF ~args.argc IN [4..5] OR ~Rope.Equal[args[2], "_"] THEN RETURN [result: $Failure, msg: viewerToIPDoc]; IF args.argc=5 THEN version _ args[4]; --Optional version number viewer _ FindViewer[args[3]]; IF viewer=NIL THEN RETURN [result: $Failure, msg: "Can't find that viewer."]; { inner: PROC ~ { ViewerToIP[viewer, args[1], version]; }; ProcessProps.AddPropList[propList: pressProp, inner: inner] } EXITS Fail => NULL }; ViewerToIP: PUBLIC PROC [v: Viewer, file: ROPE, version: ROPE _ NIL, pixelsPerInch: REAL _ 72.0, pageSize: VEC _ [8.5, 11], clipChildren: BOOLEAN _ FALSE] ~ { PaintPage: PROC [context: Context] ~ { fakeViewer: ViewerClasses.Viewer _ NEW[ViewerClasses.ViewerRec _ v^]; <<[] _ v.class.paint[self: v, context: context, whatChanged: NIL, clear: TRUE];>> fakeViewer.wx _ fakeViewer.wy _ 0; fakeViewer.cx _ fakeViewer.cy _ 1; fakeViewer.ww _ Real.RoundC[pageSize.x*pixelsPerInch]; fakeViewer.cw _ fakeViewer.ww-2; fakeViewer.wh _ Real.RoundC[pageSize.y*pixelsPerInch]; fakeViewer.ch _ fakeViewer.wh-2; fakeViewer.iconic _ FALSE; IF v.class.topDownCoordSys THEN Imager.TranslateT[context, [0, MAX[fakeViewer.wh-v.wh,0]]]; RecursivelyPaintViewers[fakeViewer, context, clipChildren]; }; ip: ImagerInterpress.Ref ~ ImagerInterpress.Create[file, IF version=NIL THEN NIL ELSE Rope.Cat["Interpress/Xerox/", version, " "]]; ImagerInterpress.DoPage[self: ip, action: PaintPage, scale: Imager.metersPerInch/pixelsPerInch]; ImagerInterpress.Close[ip]; }; RecursivelyPaintViewers: PROC [viewer: Viewer, context: Context, clipChildren: BOOLEAN _ FALSE] = { PaintViewer: PROC ~ { IF viewer.class.paint#NIL THEN { quit _ viewer.class.paint[viewer, context, NIL, TRUE]; }; }; quit: BOOL _ FALSE; <> IF viewer.parent#NIL THEN { w: INTEGER ~ viewer.ww; h: INTEGER ~ viewer.wh; IF viewer.border THEN { Imager.SetColor[context, Imager.black]; Imager.MaskRectangleI[context, 0, 0, windowBorderSize, h]; Imager.MaskRectangleI[context, w, 0, -windowBorderSize, h]; Imager.MaskRectangleI[context, 0, 0, w, windowBorderSize]; Imager.MaskRectangleI[context, 0, h, w, -windowBorderSize]; }; }; Imager.DoSaveAll[context, PaintViewer]; <> IF quit THEN RETURN; <> FOR v: Viewer _ viewer.child, v.sibling UNTIL v=NIL DO action: PROC ~ { <> Imager.TranslateT[context, [v.wx, IF v.parent.class.topDownCoordSys THEN v.parent.wh-v.wy-v.wh ELSE v.wy]]; IF clipChildren THEN Imager.ClipRectangleI[context, 0, 0, viewer.ww, viewer.wh]; RecursivelyPaintViewers[v, context]; }; Imager.DoSaveAll[context, action]; ENDLOOP; }; <> SubstitutePressFonts: ImagerTypefaceExtras.GenericCreatorProc ~ { IF ProcessProps.GetProp[$ViewersToIPFontSubstitution]=$PressFonts THEN { ERROR } ELSE RETURN [NIL] }; <> FindViewer: PROC [name: Rope.ROPE] RETURNS [viewer: Viewer _ NIL] = { MatchName: ViewerOps.EnumProc = { IF Rope.Find[s1: v.name, s2: name, case: FALSE] >= 0 THEN { viewer _ v; RETURN [FALSE] } ELSE RETURN[TRUE]; }; ViewerOps.EnumerateViewers[MatchName]; }; Commander.Register[key: "ViewerToIP", proc: ViewerToIPCmd, doc: viewerToIPDoc]; ImagerTypefaceExtras.RegisterGenericCreator[genericCreator: NEW[ImagerTypefaceExtras.GenericCreatorRep _ [data: NIL, proc: SubstitutePressFonts, priority: 1]]]; END.