DIRECTORY Args, Buttons, ChoiceButtons, Convert, CtBasic, CtDispatch, CtMisc, CtViewer, Imager, ImagerColor, MessageWindow, Process, Rope, ViewerClasses, ViewerOps, ViewerTools; CtTextCommandImpl: CEDAR PROGRAM IMPORTS Args, Buttons, ChoiceButtons, Convert, CtBasic, CtDispatch, CtMisc, CtViewer, Imager, ImagerColor, MessageWindow, Process, Rope, ViewerOps, ViewerTools ~ BEGIN ButtonProc: TYPE ~ Buttons.ButtonProc; Color: TYPE ~ Imager.Color; Context: TYPE ~ Imager.Context; ROPE: TYPE ~ Rope.ROPE; Viewer: TYPE ~ ViewerClasses.Viewer; ViewerClassRec: TYPE ~ ViewerClasses.ViewerClassRec; Data: TYPE ~ REF DataRep; DataRep: TYPE ~ RECORD [ image: Viewer ฌ NIL, parent: Viewer ฌ NIL, x, y, a, b, c: Viewer ฌ NIL, trackButton: Viewer ฌ NIL, styleButton: Viewer ฌ NIL, printButton: Viewer ฌ NIL, modeButton: Viewer ฌ NIL ]; ctTextUsage: ROPE ~ "Ct Text [-color []] [-font ] [-size ] If arguments given, print text starting at pixel location (x, y), with given color [1, 1, 1], font [helvetica-mrr] and size (pixel height) [14]. Fonts come from project/pcedar2.0/imagerfonts/xerox/pressfonts/. If no arguments, create a viewer to print selected text."; CtText: CtDispatch.CtProc ~ { err: ROPE; affect ฌ [[0, 0], [0, 0]]; IF Args.NArgs[cmd] > 0 THEN { ENABLE Args.Error => {error ฌ reason; GOTO Bad}; xA, yA, textA, rA, gA, bA, fontA, sizeA: Args.Arg; [xA, yA, textA, rA, gA, bA, fontA, sizeA] ฌ Args.ArgsGet[cmd, "%rrs-color%r[rr-font%s-size%r"]; { r: REAL ฌ IF rA.ok THEN rA.real ELSE 1.0; g: REAL ฌ IF gA.ok THEN gA.real ELSE r; b: REAL ฌ IF bA.ok THEN bA.real ELSE g; font: ROPE ฌ IF fontA.ok THEN fontA.rope ELSE NIL; size: REAL ฌ IF sizeA.ok THEN sizeA.real ELSE 14.; color: Color ฌ ImagerColor.ColorFromRGB[[r, g, b]]; context: Context ฌ CtBasic.ContextFromSampleMaps[maps]; CtMisc.PrintRope[textA.rope, [xA.real, yA.real], color, font, size, context ! Imager.Warning => {err ฌ Rope.Concat["no such font: ", font]; GOTO Bad}]; }; EXITS Bad => error ฌ err; } ELSE { v: Viewer ฌ ViewerOps.FindViewer["Ct Text"]; t: Data ฌ IF v = NIL THEN NEW[DataRep] ELSE NARROW[v.data]; IF v = NIL THEN TRUSTED {Process.Detach[FORK MakeViewer[t]]}; t.image ฌ viewer; t.parent ฌ v; CtViewer.RegisterMouse[viewer, MouseProc, t, lowerLeft]; }; }; MakeViewer: PROC [t: Data] ~ { TextButton: PROC [x, y, w: NAT, name, text: ROPE] RETURNS [v: Viewer] ~ { v ฌ ChoiceButtons.BuildTextPrompt[t.parent, x, y, name, text,, w, t].textViewer; }; ProcButton: PROC [x, y: INT, name: ROPE, proc: ButtonProc] RETURNS [Viewer] ~ { RETURN[Buttons.Create[ info: [parent: t.parent, name: name, wx: x, wy: y], proc: proc, clientData: t, paint: TRUE]]; }; ViewerOps.OpenIcon[t.parent ฌ ViewerOps.CreateViewer[ flavor: $CtText, info: [openHeight: 51, name: "Ct Text", data: t, column: right, iconic: TRUE]]]; t.x ฌ TextButton[0, 3, 30, "x:", "0"]; t.y ฌ TextButton[75, 3, 30, "y:", "0"]; t.a ฌ TextButton[150, 3, 30, "h/r:", "0"]; t.b ฌ TextButton[225, 3, 30, "s/g:", "0"]; t.c ฌ TextButton[300, 3, 30, "v/b:", "0"]; t.trackButton ฌ ProcButton[3, 18, "Track-Off", ToggleTrack]; t.styleButton ฌ ProcButton[70, 18, "PrintStyle ", ToggleStyle]; t.modeButton ฌ ProcButton[146, 18, "RGB", ToggleMode]; t.printButton ฌ ProcButton[180, 18, "PRINT", Print]; }; Destroy: ViewerClasses.DestroyProc ~ { CtViewer.UnregisterMouse[NARROW[self.data, Data].image, MouseProc]; }; MouseProc: CtViewer.MouseProc ~ { IF mouse.state # up AND mouse.button = left THEN { t: Data ฌ NARROW[clientData]; Buttons.ReLabel[t.x, Convert.RopeFromInt[mouse.pos.x]]; Buttons.ReLabel[t.y, Convert.RopeFromInt[mouse.pos.y]]; }; }; ToggleTrack: ButtonProc ~ { t: Data ~ NARROW[clientData]; IF Rope.Equal[parent.name, "Track-Off"] THEN { Buttons.ReLabel[parent, "Track-On"]; CtViewer.RegisterMouse[t.parent, MouseProc, clientData, lowerLeft]; } ELSE { Buttons.ReLabel[parent, "Track-Off"]; CtViewer.UnregisterMouse[t.parent, MouseProc]; }; }; ToggleMode: ButtonProc ~ { Buttons.ReLabel[parent, IF Rope.Equal[parent.name, "RGB"] THEN "HSV" ELSE "RGB"]; }; ToggleStyle: ButtonProc ~ { IF Rope.Equal[parent.name, "ScreenStyle"] THEN Buttons.ReLabel[parent, "PrintStyle "] ELSE Buttons.ReLabel[parent, "ScreenStyle"]; }; Blink: PROC [rope: ROPE] ~ { MessageWindow.Append[Rope.Concat["\t\t", rope], TRUE]; MessageWindow.Blink[]; }; Action: CtViewer.ViewerProc ~ { Arg: ERROR = CODE; { ENABLE Arg, Convert.Error => GOTO Bad; GetInt: PROC [v: Viewer] RETURNS [num: INT] ~ { IF (num ฌ Convert.IntFromRope[ViewerTools.GetContents[v]]) < 0 THEN ERROR Arg; }; GetReal: PROC [v: Viewer] RETURNS [num: REAL] ~ { IF (num ฌ Convert.RealFromRope[ViewerTools.GetContents[v]]) < 0 THEN ERROR Arg; }; error: ROPE; t: Data ฌ NARROW[clientData]; x: NAT ฌ GetInt[t.x]; y: NAT ฌ GetInt[t.y]; a: REAL ฌ GetReal[t.a]; b: REAL ฌ GetReal[t.b]; c: REAL ฌ GetReal[t.c]; color: Color ฌ IF Rope.Equal[t.modeButton.name, "HSV"] THEN ImagerColor.ColorFromHSV[a, b, c] ELSE ImagerColor.ColorFromRGB[[a, b, c]]; screenStyle: BOOL ~ Rope.Equal[t.styleButton.name, "ScreenStyle"]; context: Context ฌ CtBasic.ContextFromSampleMaps[maps]; IF (error ฌ CtMisc.PrintTiogaSelection[[x, y], color, context, screenStyle]) # NIL THEN Blink[error]; EXITS Bad => Blink["Bad coordinate(s)"]; }; }; Print: ButtonProc ~ { t: Data ฌ NARROW[clientData]; CtViewer.DoWithViewer[t.image, Action, t]; }; ViewerOps.RegisterViewerClass[$CtText, NEW[ViewerClassRec ฌ [destroy: Destroy]]]; CtDispatch.RegisterCtOp["Text and Painting:", NIL, NIL]; CtDispatch.RegisterCtOp["Text", CtText, ctTextUsage]; END. ฬ CtTextCommandImpl.mesa Copyright ำ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, September 6, 1992 4:48 pm PDT Heckbert, June 23, 1988 8:42:17 pm PDT Text Command Start Code ส–"cedarcode" style•NewlineDelimiter ™™Jšœ ฯeœ6™BJ™*J™&—J˜Jšฯk œจ˜ฑJ˜šะblœžœž˜ Jšžœ˜˜Ÿ—J˜Jšœž˜headšฯl ™ Jšœ žœ˜'Jšœ žœ˜Jšœ žœ˜!Jšžœžœžœ˜Jšœ žœ˜&šœžœ ˜4J˜—Jšœžœžœ ˜šœ žœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœž˜J˜J˜—šœ žœ˜Jšœเ˜เJ˜—šฯnœ˜Jšœžœ˜ J˜šžœ˜šžœ˜Jšžœ žœ˜0Jšœ2˜2˜+Jšœ3˜3—šœ˜Jš œžœžœžœ žœ˜)Jš œžœžœžœ žœ˜'Jš œžœžœžœ žœ˜'Jš œžœžœ žœ žœžœ˜2Jš œžœžœ žœ žœ˜2J˜3J˜7˜KJšœ@žœ˜K—J˜—Jšžœ˜J˜—šžœ˜J˜,Jš œ žœžœžœžœ žœžœ ˜;Jšžœžœžœ˜=J˜J˜ Jšœ8˜8J˜——J˜J˜—šก œžœ˜š ก œžœ žœžœžœ˜IJ˜PJ˜—šก œฯsžขœขœขžœขœขžœขœขœ ะksžขœขœขœ˜Ošžœ˜J˜4J˜ J˜Jšœžœ˜—J˜—˜5J˜JšœHžœ˜P—J˜&J˜'J˜*J˜*J˜*J˜žœžœ˜OJ˜—Jšœžœ˜ Jšœ žœ ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜šœžœ%˜6Jšžœ"˜&Jšžœ%˜)—Jšœ žœ1˜BJ˜7šžœMž˜RJšžœ˜—Jšžœ#˜(J˜—J˜J˜—šกœ˜Jšœ žœ ˜J˜*J˜——š  ™ šœ'žœ'˜QJ˜—Jšœ-žœžœ˜:J˜:J˜—Jšž˜J™J˜J˜—…—าฏ