-- 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]];
}.