DIRECTORY ConstantColors USING[IntensityToColor, NameToColor], FilteredTransforms USING [Transform, xyRectangle], Filters USING [SetFilter], Imager USING [Context, Create, MaskRectangle, MaskVector, MoveTo, Trajectory, MaskStroke, ConicTo, Pair, SetColor], ImagerBasic USING [IntRectangle], ImagerColorAIS USING [GetAISFile, PutAISFile, PutFastAISFile], ImagerColorTestMain USING [GetDisplayContext, GetDisplayData, LineTest, LoadGrey8BitMap, SetDevice], ImagerDisplay USING [DisplayData], ImagerPixelMaps USING [Clear, PixelMap, Rotate], Matrix3d, Rope USING [ROPE]; TransformTest: CEDAR PROGRAM IMPORTS ConstantColors, FilteredTransforms, Filters, Imager, ImagerColorAIS, ImagerPixelMaps, ImagerColorTestMain, Matrix3d = BEGIN CurrentMatrix: Matrix3d.Matrix4by4; contexts: ARRAY [0..10) OF Imager.Context _ ALL[NIL]; contextCount: NAT _ 0; PI: REAL = 3.14159265; CreateContext: PUBLIC PROC[ deviceType: ATOM, box: ImagerBasic.IntRectangle] RETURNS[ NAT] ~ { context: Imager.Context; data: ImagerDisplay.DisplayData; refBox: REF ImagerBasic.IntRectangle _ NEW[ImagerBasic.IntRectangle]; refPinned: REF BOOLEAN _ NEW[BOOLEAN _ FALSE]; -- don't pin this pixelmap creationList: LIST OF REF ANY _ LIST[refBox, refPinned]; refBox.x _ box.x; refBox.y _ box.y; refBox.w _ box.w; refBox.h _ box.h; context _ Imager.Create[deviceType, creationList]; contexts[contextCount] _ context; contextCount _ contextCount + 1; NameColor[ "Black"]; Imager.MaskRectangle[context, 0, 0, .26, .2]; -- initialize compositeClipper data _ NARROW[context.data, ImagerDisplay.DisplayData]; ImagerPixelMaps.Clear[ data[0]]; -- clear image (it would be nice if this could be done with MaskRectangle, but I don't want to have to figure out how to convert pixels to meters, or whatever the !@#$@#$~%~* thing is. RETURN[ contextCount - 1]; -- tell 'em where you put it }; NameColor: PROC [color: Rope.ROPE, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; Imager.SetColor[context, ConstantColors.NameToColor[color]]}; NameIntensity: PROC [ intensity: REAL, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; Imager.SetColor[context, ConstantColors.IntensityToColor[intensity]]}; LoadGrey8BitMap: PROC [] ~ { ImagerColorTestMain.LoadGrey8BitMap[]}; FillRectangle: PROC [ x, y, w, h: REAL, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; Imager.MaskRectangle[context, x, y, w, h]}; DrawLine: PROC [ pt1, pt2: Imager.Pair, width: REAL, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; Imager.MaskVector[context, pt1, pt2, width]}; LineTest: PROC[ color: CARDINAL, length, times: NAT] ~ { ImagerColorTestMain.LineTest[ color, length, times]}; SetDevice: PROC[ deviceType: ATOM, box: ImagerBasic.IntRectangle] ~ { ImagerColorTestMain.SetDevice[ deviceType, box]}; GetAISFile: PUBLIC PROC[ fileName: Rope.ROPE, context: Imager.Context _ NIL, xOffSet, yOffSet: INTEGER _ 0] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; ImagerColorAIS.GetAISFile[context, fileName, xOffSet, yOffSet]}; PutAISFile: PUBLIC PROC[ fileName: Rope.ROPE, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; ImagerColorAIS.PutAISFile[ context, fileName]}; PutFastAISFile: PUBLIC PROC[ fileName: Rope.ROPE, context: Imager.Context _ NIL] ~ { IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; ImagerColorAIS.PutFastAISFile[ context, fileName]}; SetWindow: PUBLIC PROC[ w: FilteredTransforms.xyRectangle, image: Imager.Context _ NIL] ~ { data: ImagerDisplay.DisplayData; IF image = NIL THEN data _ ImagerColorTestMain.GetDisplayData[] ELSE data _ NARROW[image.data, ImagerDisplay.DisplayData]; data.compositeClipper.first.sMin _ data[0].sMin _ w.yMin; data.compositeClipper.first.fMin _ data[0].fMin _ w.xMin; data.compositeClipper.first.sSize _ data[0].sSize _ w.ySize; data.compositeClipper.first.fSize _ data[0].fSize _ w.xSize; }; ScaleImage: PUBLIC PROC[ scaleX, scaleY: REAL, moveX, moveY: REAL _ 0.0, image, newImage: Imager.Context _ NIL] ~ TRUSTED { data, newData: ImagerDisplay.DisplayData; screen, newScreen: ImagerPixelMaps.PixelMap; CurrentMatrix _ Matrix3d.Identity[]; CurrentMatrix _ Matrix3d.Scale[ CurrentMatrix, scaleX, scaleY, 1]; IF image = NIL THEN { data _ ImagerColorTestMain.GetDisplayData[]; screen _ data[0]} ELSE { data _ NARROW[image.data, ImagerDisplay.DisplayData]; screen _ data[0]}; IF newImage = NIL THEN { newData _ ImagerColorTestMain.GetDisplayData[]; newScreen _ newData[0]} ELSE { newData _ NARROW[newImage.data, ImagerDisplay.DisplayData]; newScreen _ newData[0]}; FilteredTransforms.Transform[ screen, newScreen, CurrentMatrix, moveX, moveY, 1]; }; RotateImage: PUBLIC PROC[ angle: REAL, moveX, moveY: REAL _ 0.0, image, newImage: Imager.Context _ NIL] ~ TRUSTED { data, newData: ImagerDisplay.DisplayData; screen, newScreen: ImagerPixelMaps.PixelMap; CurrentMatrix _ Matrix3d.Identity[]; CurrentMatrix _ Matrix3d.LocalRotateAboutZAxis[ CurrentMatrix, angle]; IF image = NIL THEN { data _ ImagerColorTestMain.GetDisplayData[]; screen _ data[0]} ELSE { data _ NARROW[image.data, ImagerDisplay.DisplayData]; screen _ data[0]}; IF newImage = NIL THEN { newData _ ImagerColorTestMain.GetDisplayData[]; newScreen _ newData[0]} ELSE { newData _ NARROW[newImage.data, ImagerDisplay.DisplayData]; newScreen _ newData[0]}; FilteredTransforms.Transform[ screen, newScreen, CurrentMatrix, moveX, moveY, 1]; }; TransformImage: PUBLIC PROC[ moveX, moveY: REAL _ 0.0, focalLength: REAL _ 0.0, m: Matrix3d.Matrix4by4, image, newImage: Imager.Context _ NIL] ~ { data, newData: ImagerDisplay.DisplayData; screen, newScreen: ImagerPixelMaps.PixelMap; IF image = NIL THEN { data _ ImagerColorTestMain.GetDisplayData[]; screen _ data[0]} ELSE { data _ NARROW[image.data, ImagerDisplay.DisplayData]; screen _ data[0]}; IF newImage = NIL THEN { newData _ ImagerColorTestMain.GetDisplayData[]; newScreen _ newData[0]} ELSE { newData _ NARROW[newImage.data, ImagerDisplay.DisplayData]; newScreen _ newData[0]}; IF focalLength = 0.0 THEN focalLength _ MAX[ screen.sSize - screen.sMin, screen.fSize - screen.fMin]; FilteredTransforms.Transform[ screen, newScreen, m, moveX, moveY, focalLength]; }; SetFilter: PUBLIC PROC[ i: [0..2)] ~ { Filters.SetFilter[i]}; Rotate90: PUBLIC PROC[ filename: Rope.ROPE, context: Imager.Context _ NIL] ~ { data: ImagerDisplay.DisplayData; screen: ImagerPixelMaps.PixelMap; IF context = NIL THEN context _ ImagerColorTestMain.GetDisplayContext[]; data _ NARROW[context.data, ImagerDisplay.DisplayData]; screen _ data[0]; data[0] _ ImagerPixelMaps.Rotate[ screen]; PutAISFile[ filename]; data[0] _ screen; }; CurveTest: PUBLIC PROC[ scale: REAL _ 1] ~ { displayData: ImagerDisplay.DisplayData _ ImagerColorTestMain.GetDisplayData[]; map: ImagerPixelMaps.PixelMap _ displayData[0]; pos: REAL _ 0.; FOR i: INTEGER IN [0..60) DO pos: REAL _ pos + scale*(0.004 - 0.00005 * i); t: Imager.Trajectory _ Imager.MoveTo[[pos, 0.005*scale]]; Imager.MaskStroke[ ImagerColorTestMain.GetDisplayContext[], Imager.ConicTo[t, [0.15*scale + pos, 0.095*scale], [pos, 0.185*scale], .5], scale*(.001 - 0.00001 * i)]; ENDLOOP }; END. TransformTest.mesa Last Edited by: Hiller, September 7, 1984 0:46:07 am PDT Copyright (C) 1984 by Xerox Corporation. All rights reserved. ImagerAISUtil USING[ AISToColor], ImagerPixelMapsExtras USING [SetPixel], Real USING [RoundI], RealFns USING [SinDeg], -- ImagerPixelMapsExtras, Real, RealFns, ImagerAISUtil box has its fields in the same order as xyRectangle: xMin, yMin, xSize, ySize. Create a new context; does not attach it to the screen. This returns a number; from this time forward this context will be referred to as contexts[n]. In all procedures that take a context as argument, the default context is the one that is attached to the screen (produced by SetDevice). SetupStandard: PROC = { SetDevice[$Gray8bpp,[0,0,0,0]]; ImagerColorTestMain.GetDisplayContext[].state.T _ Imager.Rotate[0]; }; AISStandard: PROC [file: Rope.ROPE, scale: REAL _ 1.0] ~ { color: ImagerBasic.SampledColor _ ImagerAISUtil.AISToColor[file]; context: Imager.Context _ ImagerColorTestMain.GetDisplayContext[]; color.m _ Imager.Scale[scale]; Imager.SetColor[context, color]; Imager.MaskRectangle[context, 0,0, 1000, 1000]; }; scaling of an image within the plane of the screen rotation of an image in the plane of the screen any transform you can depict using a 4x4 matrix (focal length defaults to the length of the longest side of the input image) Filter 0 is sinc x, cut off at the first zero crossing. Filter 1 is sinc x * sinc x/2, cut off at the second zero crossing. Filter 0 is about twice as fast; filter 1 produces a better image. The initial default filter is filter 0. ShowFilter: PUBLIC PROC[ i: [0..7)] ~ { data: ImagerDisplay.DisplayData; screen: ImagerPixelMaps.PixelMap; data _ ImagerColorTestMain.GetDisplayData[]; screen _ data[0]; Filters.ShowFilter[ i, screen]; }; ShowSinc: PUBLIC PROC[ w, h: REAL, color: [0..256)] ~ { displayData: ImagerDisplay.DisplayData _ ImagerColorTestMain.GetDisplayData[]; screen: ImagerPixelMaps.PixelMap _ displayData[0]; center: INTEGER _ (screen.fSize - screen.fMin)/2 + screen.fMin; FOR i: INTEGER IN [screen.fMin..center) DO x: REAL _ (i-center) / (center * 1.0); ImagerPixelMapsExtras.SetPixel[ screen, (screen.sSize - 1) - 50, i, 150]; ImagerPixelMapsExtras.SetPixel[ screen, -- axis (screen.sSize - 1) - (50 + Real.RoundI[ h*RealFns.SinDeg[ w * 360 * x] / (w * 2*PI * x)]), i, color]; ENDLOOP; ImagerPixelMapsExtras.SetPixel[ screen, (screen.sSize - 1) - 50, center, 150]; ImagerPixelMapsExtras.SetPixel[ screen, -- axis (screen.sSize - 1) - (50 + Real.RoundI[ h]), center, color]; FOR i: INTEGER IN (center..screen.fSize) DO x: REAL _ (i-center) / (center * 1.0); ImagerPixelMapsExtras.SetPixel[ screen, (screen.sSize - 1) - 50, i, 150]; ImagerPixelMapsExtras.SetPixel[ screen, -- axis (screen.sSize - 1) - (50 + Real.RoundI[ h*RealFns.SinDeg[ w * 360 * x] / (w * 2*PI * x)]), i, color]; ENDLOOP; }; DiagLineTest: PUBLIC PROC[ f: REAL _ .15] ~ { displayData: ImagerDisplay.DisplayData _ ImagerColorTestMain.GetDisplayData[]; map: ImagerPixelMaps.PixelMap _ displayData[0]; FOR i: INTEGER IN [-25..25] DO DrawLine[ [0.004, 0.004 * i], [ .15, f + 0.004 * i], .001]; ENDLOOP }; Grid: PUBLIC PROC[ scale: REAL _ 1.0] ~ { displayData: ImagerDisplay.DisplayData _ ImagerColorTestMain.GetDisplayData[]; map: ImagerPixelMaps.PixelMap _ displayData[0]; pos: REAL _ 0.; FOR i: INTEGER IN [0..11] DO DrawLine[[i*scale*.02+.005, .005], [i*scale*.02+.005, 8*scale*.02+.005], 0]; ENDLOOP; FOR i: INTEGER IN [0..8] DO DrawLine[[.005, i*scale*.02+.005], [11*scale*.02+.005, i*scale*.02+.005], 0]; ENDLOOP; }; Ê D˜šœ™J™8Jšœ>™>—J™šÏk œ˜Jšœœ ˜5Jšœœ˜2Jšœ œ ˜Jšœ œg˜vJšœœ™"Jšœœ˜#Jšœœ*˜?JšœœK˜dJšœœ˜#Jšœœ˜1Jšœœ ™'Jšœ ˜ Jšœ œ ™Jšœ œ ™Jšœ œœ˜J˜—šœœ˜Jšœu˜|Jšœ6™6J˜—Jšœ˜J˜Iašœ#˜#Jš œ œ œœœ˜5Jšœœ˜Kšœœ˜J˜Kšœò™òK˜šÏn œœœœ ˜LKšœœœ˜Kšœ˜Kšœ ˜ K˜Kšœœœ˜EKš œ œœœœœÏc˜JKš œœœœœœ˜8KšœT˜TKšœ2˜2K˜Kšœ%˜%Kšœ ˜ K˜Kšœ˜Kšœ/Ÿ˜MKšœœ*˜7Jšœ%Ÿ¸˜ÝK˜KšœŸ˜8K˜—K˜šž œœ™K™Kšœ.œ™CK™—K™šž œœ œ œ ™;KšœA™AKšœB™BKšœ™K™ K™/K™—J˜šž œœœœ˜Fšœ œ˜Jšœ2˜2—Kšœ=˜=—K˜šž œœœœ˜Išœ œ˜Jšœ2˜2—KšœF˜F—K˜šžœœ˜Kšœ'˜'—K˜šž œœœœ˜Kšœ œ˜Jšœ2˜2—Kšœ+˜+—K˜šžœœ!œœ˜Xšœ œ˜Jšœ2˜2—Kšœ-˜-—K˜šžœœ œœ˜9Kšœ5˜5—J˜šž œœœ$˜EKšœ1˜1—K˜š ž œœœœœœ ˜ošœ œ˜Jšœ2˜2—Jšœ@˜@—J˜š ž œœœœœ˜Qšœ œ˜Jšœ2˜2—Jšœ/˜/—J˜š žœœœœœ˜Ušœ œ˜Jšœ2˜2—Jšœ3˜3—J˜šž œœœ=œ˜[Kšœ ˜ šœ œœ˜Kšœ+˜+—šœ˜Kšœœ(˜5K˜—Kšœ9˜9Kšœ9˜9Kšœ<˜