DIRECTORY CGM, Commander, FileNames, FS, Imager, ImagerFont, ImagerInterpress, ImagerPixelArray, IO, Rope, -- MacPaint, MacPICT,-- InterpressFabricators; InterpressFabricatorsCommand: CEDAR PROGRAM IMPORTS CGM, Commander, FileNames, FS, Imager, ImagerFont, ImagerInterpress, IO, Rope -- , MacPaint, MacPICT EXPORTS InterpressFabricators ~ BEGIN OPEN InterpressFabricators; ROPE: TYPE ~ Rope.ROPE; inch: REAL = 0.0254; -- inches->meters conversion factor defaultMacPixelsPerInch: REAL = 72.0; -- for Macintosh files macCaptionFont: ROPE ¬ "xerox/pressfonts/helvetica-mir"; -- to put caption in Macintosh files headerSampled: ROPE ¬ "Interpress/Xerox/3.0 "; -- IP header for sampled images macCaptionLoc: Imager.VEC ¬ [72, 72]; -- where the caption should be in Macintosh files defaultPageWidth: REAL ¬ 0.210; -- for normal A4 sized paper defaultPageHeight: REAL ¬ 0.297; -- for normal A4 sized paper macMarginW: REAL ¬ 0.020; -- offset of Mac images on regular-sized paper macMarginH: REAL ¬ 0.040; -- offset of Mac images on regular-sized paper CGMToInterpress: PUBLIC PROC [inputName: Rope.ROPE, interpress: ImagerInterpress.Ref, beginPage, endPage: ProgressProc, msg: IO.STREAM ¬ NIL, pageWidth, pageHeight: REAL, caption: ROPE] RETURNS [failed: BOOL ¬ FALSE] ~ { resolvedName: Rope.ROPE ¬ FileNames.ResolveRelativePath[inputName]; Paint: PROC [context: Imager.Context] ~ { Caption: PROC ~ { Imager.ScaleT[context, inch/72]; Imager.SetFont[context, ImagerFont.Scale[ImagerFont.Find[macCaptionFont], 9]]; Imager.SetXY[context, macCaptionLoc]; Imager.ShowRope[context, caption]; }; Imager.SetPriorityImportant[context, TRUE]; Imager.DoSave[context, Caption]; CGM.ToInterpress[context: context, fileName: resolvedName, pageWidth: pageWidth, pageHeight: pageHeight]; }; IF beginPage[1, 1] THEN GOTO tooBad; ImagerInterpress.DoPage[self: interpress, action: Paint, scale: 1.0]; IF endPage[1, 1] THEN GOTO tooBad; EXITS tooBad => failed ¬ TRUE; }; CGMToInterpressAction: PUBLIC ActionProc ~ { BeginPage: ProgressProc ~ { IF cmd.commandLine # NIL THEN cmd.out.PutF1["[%g", IO.int[pageNumber]]}; EndPage: ProgressProc ~ {IF cmd.commandLine # NIL THEN cmd.out.PutRope["] "]}; output: ImagerInterpress.Ref ¬ ImagerInterpress.Create[outputName, headerSampled]; [] ¬ CGMToInterpress[inputName, output, BeginPage, EndPage, cmd.out, defaultPageWidth, defaultPageHeight, cmd.commandLine]; ImagerInterpress.Close[output]; }; FindFullName: PROC [inputName: ROPE] RETURNS [ROPE] ~ { fullFName: ROPE ¬ NIL; fullFName ¬ FS.FileInfo[inputName].fullFName; RETURN [fullFName] }; GetFileNameToken: PROC [stream: IO.STREAM] RETURNS [rope: ROPE ¬ NIL] = { FileNameTokenBreak: PROC [char: CHAR] RETURNS [IO.CharClass] = { IF char = '_ THEN RETURN [break]; IF char = ' OR char = '\t OR char = ', OR char = '; OR char = '\n THEN RETURN [sepr]; RETURN [other]; }; rope ¬ stream.GetTokenRope[FileNameTokenBreak ! IO.EndOfStream => CONTINUE].token; }; Complain: PUBLIC ERROR [complaint: ROPE] ~ CODE; MakeOutputName: PROC [inputName: ROPE, doc: ROPE] RETURNS [ROPE] ~ { start: INT ¬ Rope.Index[s1: doc, s2: " to "]+4; end: INT ¬ Rope.SkipTo[s: doc, pos: start, skip: " \n\t"]; cp: FS.ComponentPositions; isMPNT: BOOL ¬ Rope.Equal[Rope.Substr[doc, start, end-start], "MPNT", FALSE]; [inputName, cp] ¬ FS.ExpandName[inputName]; RETURN [Rope.Cat[ Rope.Substr[inputName, cp.base.start, cp.base.length], IF isMPNT THEN NIL ELSE ".", IF isMPNT THEN NIL ELSE Rope.Substr[doc, start, end-start] ]] }; Command: PUBLIC Commander.CommandProc ~ { refAction: REF ActionProc ~ NARROW[cmd.procData.clientData]; stream: IO.STREAM ¬ IO.RIS[cmd.commandLine]; firstToken: ROPE ¬ GetFileNameToken[stream]; quiet: BOOL ¬ Rope.Equal[firstToken, "-q", FALSE]; outputName: ROPE ¬ FileNames.ResolveRelativePath[IF quiet THEN GetFileNameToken[stream] ELSE firstToken]; secondTokenIndex: INT ¬ IO.GetIndex[stream]; gets: ROPE ¬ GetFileNameToken[stream]; inputName: ROPE ¬ NIL; IF NOT gets.Equal["_"] THEN { inputName ¬ outputName; outputName ¬ NIL; stream.SetIndex[secondTokenIndex]; } ELSE {inputName ¬ FileNames.ResolveRelativePath[GetFileNameToken[stream]]}; IF inputName = NIL THEN RETURN[result: $Failure, msg: cmd.procData.doc]; inputName ¬ FindFullName[inputName ! FS.Error => { IF error.group = user THEN {result ¬ $Failure; msg ¬ error.explanation; GOTO Quit} }]; IF outputName = NIL THEN { outputName ¬ MakeOutputName[inputName, cmd.procData.doc]; }; cmd.out.PutRope["Reading "]; cmd.out.PutRope[inputName]; cmd.out.PutRope[" . . . "]; IF quiet THEN cmd.commandLine ¬ NIL; refAction­[inputName, outputName, cmd, stream ! Complain => {result ¬ $Failure; msg ¬ complaint; GOTO Quit}; FS.Error => { IF error.group = user THEN {result ¬ $Failure; msg ¬ error.explanation; GOTO Quit} } ]; outputName ¬ FindFullName[outputName ! FS.Error => { outputName ¬ "Output file(s)"; CONTINUE}; ]; cmd.out.PutRope[outputName]; cmd.out.PutRope[" written.\n"]; EXITS Quit => NULL }; Commander.Register["CGMToInterpress", Command, "\nConvert CGM to Interpress\nUsage:\tCGMToInterpress [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ CGMToInterpressAction]]; Commander.Register["CGMToIP", Command, "\nConvert CGM to Interpress\nUsage:\tCGMToIP [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ CGMToInterpressAction]]; END. Δ InterpressFabricatorsCommand.mesa Copyright Σ 1989, 1992 by Xerox Corporation. All rights reserved. Fumihiko Shibata, July 7, 1989 11:36:03 am JST Michael Plass, September 12, 1990 12:05 pm PDT Willie-s, April 3, 1992 4:49 pm PST macPaintPageWidth : REAL _ 576*inch/defaultMacPixelsPerInch; -- for MacPaint file macPaintPageHeight: REAL _ 720*inch/defaultMacPixelsPerInch; -- for MacPaint file rgbLinear: Imager.ColorOperator ~ ImagerColor.NewColorOperatorRGB[maxIn: 255]; MacPaintToInterpress: PUBLIC PROC [inputName: Rope.ROPE, interpress: ImagerInterpress.Ref, beginPage, endPage: ProgressProc, msg: IO.STREAM ¬ NIL, pageWidth, pageHeight: REAL, caption: ROPE] RETURNS [failed: BOOL ¬ FALSE] ~ { Convert MacPaint file to IP master. resolvedName: Rope.ROPE ¬ FileNames.ResolveRelativePath[inputName]; pa: Imager.PixelArray ¬ MacPaint.ToPixelArray[resolvedName]; rect: Imager.Rectangle ¬ ImagerTransformation.TransformRectangle[pa.m, [0, 0, pa.sSize, pa.fSize]]; Paint: PROC [context: Imager.Context] ~ { Caption: PROC ~ { Imager.ScaleT[context, inch/72]; Imager.SetFont[context, ImagerFont.Scale[ImagerFont.Find[macCaptionFont], 9]]; Imager.SetXY[context, macCaptionLoc]; Imager.ShowRope[context, caption]; }; Imager.SetPriorityImportant[context, TRUE]; Imager.DoSave[context, Caption]; Imager.TranslateT[context, [pageWidth*0.5, pageHeight*0.5]]; Imager.ScaleT[context, inch/defaultMacPixelsPerInch]; -- 72-per-inch points; Imager.TranslateT[context, [-(rect.x+rect.w*0.5), -(rect.y+rect.h*0.5)]]; Imager.SetColor[context, Imager.black]; Imager.MaskPixel[context, pa]; }; IF beginPage[1, 1] THEN GOTO tooBad; ImagerInterpress.DeclarePixelArray[interpress, pa]; ImagerInterpress.DoPage[self: interpress, action: Paint, scale: 1.0]; IF endPage[1, 1] THEN GOTO tooBad; EXITS tooBad => failed ¬ TRUE; }; PICTToInterpress: PUBLIC PROC [inputName: Rope.ROPE, interpress: ImagerInterpress.Ref, beginPage, endPage: ProgressProc, msg: IO.STREAM ¬ NIL, pageWidth, pageHeight: REAL, caption: ROPE] RETURNS [failed: BOOL ¬ FALSE] ~ { Convert Macintosh PICT file to IP master. rotate: BOOL ¬ FALSE; scale: REAL; resolvedName: Rope.ROPE ¬ FileNames.ResolveRelativePath[inputName]; pa: Imager.PixelArray ¬ MacPICT.ToPixelArray[resolvedName]; rect: Imager.Rectangle ¬ ImagerTransformation.TransformRectangle[pa.m, [0, 0, pa.sSize, pa.fSize]]; Paint: PROC [context: Imager.Context] ~ { Caption: PROC ~ { Imager.ScaleT[context, inch/72]; Imager.SetFont[context, ImagerFont.Scale[ImagerFont.Find[macCaptionFont], 9]]; Imager.SetXY[context, macCaptionLoc]; Imager.ShowRope[context, caption]; }; Imager.SetPriorityImportant[context, TRUE]; Imager.DoSave[context, Caption]; IF rect.w > rect.h THEN { rotate ¬ TRUE; scale ¬ MIN[(pageHeight-2*macMarginH)/rect.w, (pageWidth-2*macMarginW)/rect.h]; } ELSE { rotate ¬ FALSE; scale ¬ MIN[(pageWidth-2*macMarginW)/rect.w, (pageHeight-2*macMarginH)/rect.h]; }; Imager.TranslateT[context, [defaultPageWidth*0.5, defaultPageHeight*0.5]]; IF rotate THEN Imager.RotateT[context, 90.0]; Imager.ScaleT[context, scale]; Imager.TranslateT[context, [-(rect.x+rect.w*0.5), -(rect.y+rect.h*0.5)]]; Imager.SetSampledColor[context: context, pa: pa, m: NIL, colorOperator: rgbLinear]; Imager.MaskRectangle[context, rect]; }; IF beginPage[1, 1] THEN GOTO tooBad; ImagerInterpress.DeclarePixelArray[interpress, pa]; ImagerInterpress.DoPage[self: interpress, action: Paint, scale: 1.0]; IF endPage[1, 1] THEN GOTO tooBad; EXITS tooBad => failed ¬ TRUE; }; Convert CGM to IP master. MacPaintToInterpressAction: PUBLIC ActionProc ~ { BeginPage: ProgressProc ~ { IF cmd.commandLine # NIL THEN cmd.out.PutF["[%g", IO.int[pageNumber]]}; EndPage: ProgressProc ~ {IF cmd.commandLine # NIL THEN cmd.out.PutRope["] "]}; output: ImagerInterpress.Ref ¬ ImagerInterpress.Create[outputName, headerSampled]; [] ¬ MacPaintToInterpress[inputName, output, BeginPage, EndPage, cmd.out, defaultPageWidth, defaultPageHeight, cmd.commandLine]; ImagerInterpress.Close[output]; }; PICTToInterpressAction: PUBLIC ActionProc ~ { BeginPage: ProgressProc ~ { IF cmd.commandLine # NIL THEN cmd.out.PutF["[%g", IO.int[pageNumber]]}; EndPage: ProgressProc ~ {IF cmd.commandLine # NIL THEN cmd.out.PutRope["] "]}; output: ImagerInterpress.Ref ¬ ImagerInterpress.Create[outputName, headerSampled]; [] ¬ PICTToInterpress[inputName, output, BeginPage, EndPage, cmd.out, defaultPageWidth, defaultPageHeight, cmd.commandLine]; ImagerInterpress.Close[output]; }; GetCmdToken: PROC [stream: IO.STREAM] RETURNS [rope: ROPE _ NIL] = { CmdTokenBreak: PROC [char: CHAR] RETURNS [IO.CharClass] = { IF char = '_ OR char = '[ OR char = '] THEN RETURN [break]; IF char = ' OR char = '\t OR char = ', OR char = '; OR char = '\n THEN RETURN [sepr]; RETURN [other]; }; rope _ stream.GetTokenRope[CmdTokenBreak ! IO.EndOfStream => CONTINUE].token; }; Relying on doc, and having the install files register commands seems unsafe. Jules Commander.Register["MacPaintToInterpress", Command, "\nConvert MacPaint file to Interpress\nUsage:\tMacPaintToInterpress [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ MacPaintToInterpressAction]]; Commander.Register["MacPaintToIP", Command, "\nConvert MacPaint file to Interpress\nUsage:\tMacPaintToIP [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ MacPaintToInterpressAction]]; Commander.Register["PICTToInterpress", Command, "\nConvert Macintosh PICT file to Interpress\nUsage:\tPICTToInterpress [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ PICTToInterpressAction]]; Commander.Register["PICTToIP", Command, "\nConvert Macintosh PICT file to Interpress\nUsage:\tPICTToIP [-q] [ _] \n\t\t\t-q to suppress caption and page number", NEW[ActionProc ¬ PICTToInterpressAction]]; Κ ώ–(cedarcode) style•NewlineDelimiter ™šœ,Οeœf™“J™.J™#Icode™—Kš Οk œžœžœ:žœΟcœ˜šK˜šΠblœž ˜+Kš žœœžœžœ(žœŸ˜mKšžœ˜Kšœž œž˜#K˜Kšžœžœžœ˜K˜Kšœžœ Ÿ#˜8Kšœžœ Ÿ˜