DIRECTORY Args, CtBasic, CtDispatch, CtTransform, ImagerSample, Real, Rope, SF; CtTransformCommandsImpl: CEDAR PROGRAM IMPORTS Args, CtBasic, CtDispatch, CtTransform, ImagerSample, Real ~ BEGIN PixelArray: TYPE ~ CtBasic.PixelArray; SampleMaps: TYPE ~ CtBasic.SampleMaps; CtProc: TYPE ~ CtDispatch.CtProc; SampleBuffer: TYPE ~ ImagerSample.SampleBuffer; ROPE: TYPE ~ Rope.ROPE; DoIt: PROC [ maps: SampleMaps, bwOp: CtBasic.ValueProc, rgbOp: CtBasic.RGBProc, clientData: REF ANY ¬ NIL] RETURNS [SF.Box] ~ { IF maps.bpp = 24 THEN CtBasic.PutRGBFrame[maps, rgbOp, clientData] ELSE CtBasic.PutBWFrame[maps[0].map, bwOp, clientData]; RETURN[maps.box]; }; EscherCmd: CtProc ~ { exp: Args.Arg; [exp] ¬ Args.ArgsGet[cmd, "%r" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.EscherData ¬ CtTransform.EscherSetup[exp.real, maps]; affect ¬ DoIt[maps, CtTransform.EscherValue, CtTransform.EscherRGB, d]; }; }; BugeyeCmd: CtProc ~ { xSize, ySize: Args.Arg; [xSize, ySize] ¬ Args.ArgsGet[cmd, "%ii" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.BugeyeData ¬ CtTransform.BugeyeSetup[xSize.int, ySize.int, maps]; affect ¬ DoIt[maps, CtTransform.BugeyeValue, CtTransform.BugeyeRGB, d]; }; }; ShuffleCmd: CtProc ~ { xSize, ySize: Args.Arg; [xSize, ySize] ¬ Args.ArgsGet[cmd, "%ii" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.ShuffleData ¬ CtTransform.ShuffleSetup[xSize.int, ySize.int, maps]; affect ¬ DoIt[maps, CtTransform.ShuffleValue, CtTransform.ShuffleRGB, d]; }; }; STLaplaceCmd: CtProc ~ { threshold, dif: Args.Arg; [threshold, dif] ¬ Args.ArgsGet[cmd, "%ii" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.STLaplaceData ¬ CtTransform.STLaplaceSetup[threshold.int, dif.int, maps]; affect ¬ DoIt[maps, CtTransform.STLaplaceValue, CtTransform.STLaplaceRGB, d]; }; }; PopularityCmd: CtProc ~ { diameter: Args.Arg; [diameter] ¬ Args.ArgsGet[cmd, "%i" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.PopularityData ¬ CtTransform.PopularitySetup[diameter.int, maps]; affect ¬ DoIt[maps, CtTransform.PopularityValue, CtTransform.PopularityRGB, d]; }; }; EdgesCmd: CtProc ~ { xSize, ySize: Args.Arg; [xSize, ySize] ¬ Args.ArgsGet[cmd, "%ii" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.EdgesData ¬ CtTransform.EdgesSetup[xSize.int, ySize.int, maps]; affect ¬ DoIt[maps, CtTransform.EdgesValue, CtTransform.EdgesRGB, d]; }; }; WoodcutCmd: CtProc ~ { height, blend, thresh, clamp: Args.Arg; [height, blend, thresh, clamp] ¬ Args.ArgsGet[cmd, "%iiri" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.WoodcutData ¬ CtTransform.WoodcutSetup[height.int, blend.int, thresh.real, clamp.int # 0, maps]; affect ¬ DoIt[maps, CtTransform.WoodcutValue, CtTransform.WoodcutRGB, d]; }; }; SpinCmd: CtProc ~ { cycles: Args.Arg; [cycles] ¬ Args.ArgsGet[cmd, "%r" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.SpinData ¬ CtTransform.SpinSetup[cycles.real, maps]; affect ¬ DoIt[maps, CtTransform.SpinValue, CtTransform.SpinRGB, d]; }; }; BlockCmd: CtProc ~ { xSize, ySize: Args.Arg; [xSize, ySize] ¬ Args.ArgsGet[cmd, "%ii" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { d: REF CtTransform.BlockData ¬ CtTransform.BlockSetup[xSize.int, ySize.int, maps]; affect ¬ DoIt[maps, CtTransform.BlockValue, CtTransform.BlockRGB, d]; }; }; HighlightCmd: CtProc ~ { Wyvillize: PROC [x: REAL] RETURNS [REAL] ~ { SELECT x FROM < 0.0 => RETURN[1.0]; > 1.0 => RETURN[0.0]; ENDCASE => { t1: REAL ~ x*x; x4: REAL ~ t1*t1; RETURN[(-4.0/9.0)*t1*x4+(17.0/9.0)*x4+(-22.0/9.0)*t1+1.0]; }; }; value, width: Args.Arg; [value, width] ¬ Args.ArgsGet[cmd, "%ir" ! Args.Error => {error ¬ reason; CONTINUE}]; IF error # NIL THEN RETURN ELSE { w: REAL ¬ MAX[0.01, width.real]; IF maps.bpp # 8 THEN RETURN[error: "implemented for 8 bpp only"] ELSE { pa: PixelArray ¬ CtBasic.PixelArrayFromSampleMap[maps[0].map]; FOR y: NAT IN [pa.y..pa.y+pa.h) DO samples: SampleBuffer ¬ pa[y]; FOR x: NAT IN [pa.x..pa.x+pa.w) DO samples[x] ¬ Real.Fix[255.0*Wyvillize[ABS[samples[x]-value.int]/w]]; ENDLOOP; ImagerSample.PutSamples[maps[0].map, [y, maps.x],, samples, 0, maps.w]; ENDLOOP; }; }; }; escherUsage: ROPE ~ "Ct Escher warp: REAL [-wi] [-w] \tpush or pull image with respect to center (try warp=2.0)"; bugeyeUsage: ROPE ~ "Ct Bugeye xSize, ySize: INT [-wi] [-w] \tbug's-eye view (try 40 40)"; shuffleUsage: ROPE ~ "Ct Shuffle xSize, ySize: INT [-wi] [-w] \tshuffle the image rows and columns (try 1 1)"; sTLaplaceUsage: ROPE ~ "Ct STLaplace threshold dif: INT [-wi] [-w] \tsigned, thresholded laplacian (try 128 5)"; popularityUsage: ROPE ~ "Ct Popularity diameter: INT [-wi] [-w] \tfind local popularity regions (try 10, but it's slow)"; edgesUsage: ROPE ~ "Ct Edges xSize ySize: INT [-wi] [-w] \thigh-pass edge filter (try 2 2)"; woodcutUsage: ROPE ~ "Ct Woodcut height blend: INT threshold: REAL clamp: INT [-wi] [-w] woodcut simulator. Height is the vertical size of each cut, blend is horizontal 'spread' of the cuts, threshold is the intensity separating white from black (when clamped). If clamp is non-zero, then you'll get a binary image, otherwise each pixel is the average value in the column for that cut. Try 10 2 1.0 0 and 10 2 1.0 1"; spinUsage: ROPE ~ "Ct Spin cycles: INT [-wp] [-w] spin the picture about the center. Outermost pixels will undergo cycles revolutions (try 0.25)"; blockUsage: ROPE ~ "Ct Block xSize ySize: INT [-wp] [-w] low-resolution average of the image. (try 20 20)"; highlightUsage: ROPE ~ "Ct Highlight value: INT [0..255] width: REAL (default 1) [-wp] [-w] Hightlight a given pixel value by its deviation from value"; CtDispatch.RegisterCtOp["Transformers:", NIL, NIL]; CtDispatch.RegisterCtOp["Escher", EscherCmd, escherUsage]; CtDispatch.RegisterCtOp["Bugeye", BugeyeCmd, bugeyeUsage]; CtDispatch.RegisterCtOp["Shuffle", ShuffleCmd, shuffleUsage]; CtDispatch.RegisterCtOp["STLaplace", STLaplaceCmd, sTLaplaceUsage]; CtDispatch.RegisterCtOp["Popularity", PopularityCmd, popularityUsage]; CtDispatch.RegisterCtOp["Edges", EdgesCmd, edgesUsage]; CtDispatch.RegisterCtOp["WoodCut", WoodcutCmd, woodcutUsage]; CtDispatch.RegisterCtOp["Spin", SpinCmd, spinUsage]; CtDispatch.RegisterCtOp["Block", BlockCmd, blockUsage]; CtDispatch.RegisterCtOp["Highlight", HighlightCmd, highlightUsage]; END. β CtTransformCommandsImpl.mesa Copyright Σ 1988, 1992 by Xerox Corporation. All rights reserved. Glassner, May 18, 1989 2:26:20 pm PDT Bloomenthal, July 5, 1992 9:02 pm PDT Types Image Transformation Commands Start Code ΚΉ•NewlineDelimiter –"cedarcode" style™šœ™Jšœ Οeœ6™BJ™%J™%—J˜JšΟk œF˜OJ˜šΠblœžœž˜&Jšžœ;˜B—J˜Jšœž˜headšΟl™Jšœžœ˜(Jšœžœ˜(Jšœ žœ˜$Jšœžœ˜0Jšžœžœžœ˜—š ™šΟnœžœ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ žœžœžœ˜Jšžœžœ˜Jšœ˜šžœ˜Jšžœ-˜1Jšžœ3˜7—Jšžœ ˜J˜J˜—š‘ œ ˜J˜Jšœ@žœ˜Kšžœ ž˜Jšžœž˜ šžœ˜JšœžœB˜HJ˜GJ˜——J˜J˜—š‘ œ ˜J˜JšœJžœ˜Ušžœ ž˜Jšžœž˜ šžœ˜JšœžœN˜TJ˜GJ˜——J˜J˜—š‘ œ ˜J˜JšœJžœ˜Ušžœ ž˜Jšžœž˜ šžœ˜JšœžœP˜VJ˜IJ˜——J˜J˜—š‘ œ ˜J˜JšœLžœ˜Wšžœ ž˜Jšžœž˜ šžœ˜šœžœ˜"Jšœ9˜9—J˜MJ˜——J˜J˜—š‘ œ ˜Jšœ˜JšœEžœ˜Pšžœ ž˜Jšžœž˜ šžœ˜JšœžœN˜TJ˜OJ˜——J˜J˜—š‘œ ˜J˜JšœJžœ˜Ušžœ ž˜Jšžœž˜ šžœ˜JšœžœL˜RJ˜EJ˜——J˜J˜—š‘ œ ˜J˜'˜ Jšœ;žœ˜F—šžœ ž˜Jšžœž˜ šžœ˜šœžœ˜ JšœR˜R—J˜IJ˜——J˜J˜—š‘œ ˜J˜JšœCžœ˜Nšžœ ž˜Jšžœž˜ šžœ˜JšœžœA˜GJ˜CJ˜——J˜J˜—š‘œ ˜J˜JšœJžœ˜Ušžœ ž˜Jšžœž˜ šžœ˜JšœžœL˜RJ˜EJ˜——J˜J˜—š‘ œ ˜š ‘ œžœžœžœžœ˜,šžœž˜ Jšœ žœ˜Jšœ žœ˜šžœ˜ Jšœžœ˜Jšœžœ ˜Jšžœ4˜:J˜——J˜—J˜JšœJžœ˜Ušžœ ž˜Jšžœž˜ šžœ˜Jšœžœžœ˜ šžœ ˜Jšžœžœ%˜0šžœ˜J˜>šžœžœžœž˜"J˜šžœžœžœž˜"Jšœ&žœ˜DJšžœ˜—J˜GJšžœ˜—J˜——J˜——J˜——š  ™ šœ žœ˜Jšœc˜cJ˜—šœ žœ˜JšœL˜LJ˜—šœžœ˜Jšœ_˜_J˜—šœžœ˜Jšœ_˜_J˜—šœžœ˜Jšœg˜gJ˜—šœ žœ˜JšœO˜OJ˜—šœžœ˜Jšœ”˜”J˜—šœ žœ˜Jšœ†˜†J˜—šœ žœ˜Jšœ_˜_J˜—šœžœ˜Jšœ‡˜‡——˜Jšœ*žœžœ˜8Jšœ?˜?Jšœ>˜>JšœA˜AJšœF˜FJšœI˜IJšœ<˜