-- ImageNut.mesa April 1, 1982 1:28 pm -- Implemented by Gifford and Cattell, March 1982 -- Last edited by: -- Willie-Sue on: June 28, 1982 4:14 pm -- Cattell on: May 25, 1983 5:23 pm DIRECTORY CIFS USING [GetFC, Open, read], Containers USING [ChildXBound, ChildYBound], DB: TYPE USING [NameOf], File USING [Capability], Graphics: TYPE USING [ImageRef, DrawImage, Box, GetBounds, SetCP, Scale], GraphicsOps: TYPE USING [NewAisImageFromCapability, ImageBox], GraphicsBasic, Menus: TYPE USING [Menu, CreateMenu, AppendMenuEntry], Nut: TYPE USING [Register, DisplayProc], NutViewer: TYPE USING [CreateMenuEntry, DefaultFreezeProc], Rope: TYPE USING [ROPE], ViewerClasses: TYPE USING [ViewerClass, ViewerClassRec, Viewer, ViewerRec, PaintProc], ViewerOps: TYPE USING [RegisterViewerClass, CreateViewer, SetMenu]; ImageNut: CEDAR PROGRAM IMPORTS CIFS, Containers, DB, Graphics, GraphicsOps, Menus, Nut, NutViewer, ViewerOps = { displayerMenu: Menus.Menu _ Menus.CreateMenu[]; DisplayImage: Nut.DisplayProc = { -- display an image child: ViewerClasses.Viewer; fileName: Rope.ROPE _ DB.NameOf[e]; cap: File.Capability_ CIFS.GetFC[CIFS.Open[fileName, CIFS.read]]; image: Graphics.ImageRef _ GraphicsOps.NewAisImageFromCapability[cap]; -- create a child viewer info: ViewerClasses.ViewerRec_ [parent: newV, wx: 0, wy: 0, ww: newV.cw, wh: newV.ch, data: image, border: FALSE]; child _ ViewerOps.CreateViewer[flavor: $Image, info: info]; Containers.ChildYBound[newV, child]; Containers.ChildXBound[newV, child]; ViewerOps.SetMenu[newV, displayerMenu]; }; PaintImage: ViewerClasses.PaintProc = TRUSTED { -- paint an image viewer box: Graphics.Box; xmin, ymin, xmax, ymax, scale: REAL; image: GraphicsBasic.ImageRef _ LOOPHOLE[self.data]; -- scale image to fit in the available space [xmin, ymin, xmax, ymax] _ GraphicsOps.ImageBox[image]; box _ Graphics.GetBounds[context]; scale _ MIN[(box.xmax - box.xmin)/(xmax - xmin), (box.ymax - box.ymin)/(ymax - ymin)]; -- Put orign of picture in lower left corner Graphics.SetCP[self: context, x: box.xmin - xmin, y: box.ymin - ymin]; Graphics.Scale[self: context, sx: scale, sy: scale]; -- now paint image Graphics.DrawImage[context, image]; }; Init: PROC = { -- set up the world -- create a new type of viewer for images vc: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec]; vc.paint _ PaintImage; ViewerOps.RegisterViewerClass[flavor: $Image, class: vc]; -- register us as a nut! Nut.Register[domain: "Picture", segment: $Squirrel, display: DisplayImage]; Nut.Register[domain: "Map", segment: $Squirrel, display: DisplayImage]; }; -- start trap does it all. Init[]; Menus.AppendMenuEntry[displayerMenu, NutViewer.CreateMenuEntry[NIL, "Freeze", NutViewer.DefaultFreezeProc]]; }.