DIRECTORY Graphics, GraphicsBasic, Imager; ImagerGraphicsImpl: CEDAR PROGRAM IMPORTS Imager EXPORTS Graphics, GraphicsBasic ~ BEGIN OPEN Graphics; Warning: PUBLIC SIGNAL[type: WarningType] ~ CODE; Error: PUBLIC ERROR[type: ErrorType] ~ CODE; imagerProcs: REF GraphicsProcs ~ NEW[GraphicsProcs _ [ GetCP: ImagerGetCP, SetCP: ImagerSetCP, DrawTo: ImagerDrawTo, DrawStroke: ImagerDrawStroke, DrawArea: ImagerDrawArea, DrawBox: ImagerDrawBox, DrawImage: ImagerDrawImage, Translate: ImagerTranslate, Concat: ImagerConcat, WorldToUser: ImagerWorldToUser, UserToWorld: ImagerUserToWorld, SetColor: ImagerSetColor, GetColor: ImagerGetColor, SetPaintMode: ImagerSetPaintMode, SetFat: ImagerSetFat, GetDefaultFont: ImagerGetDefaultFont, SetDefaultFont: ImagerSetDefaultFont, DrawChars: ImagerDrawChars, ClipArea: ImagerClipArea, ClipBox: ImagerClipBox, IsPointVisible: ImagerIsPointVisible, IsRectangular: ImagerIsRectangular, GetBounds: ImagerGetBounds, Visible: ImagerVisible, Save: ImagerSave, Restore: ImagerRestore, DrawBits: ImagerDrawBits, UserToDevice: ImagerUserToDevice, DeviceToUser: ImagerDeviceToUser, GetYMode: ImagerGetYMode, SetYMode: ImagerSetYMode, DrawTexturedBox: ImagerDrawTexturedBox, Disable: ImagerDisable, MoveDeviceRectangle: ImagerMoveDeviceRectangle ]]; NewContext: PUBLIC PROC[device: DeviceRef _ NIL] RETURNS[Context] ~ { IF device=NIL THEN { imager: Imager.Context ~ Imager.Create[$LFDisplay]; context: Context ~ NEW[ContextRep _ [imagerProcs, imager]]; RETURN[context]; } ELSE ERROR Warning[notImplemented]; }; Path: TYPE ~ REF PathRep; PathRep: PUBLIC TYPE ~ RECORD[list: LIST OF Imager.Trajectory]; NewPath: PUBLIC PROC[size: INT _ 0] RETURNS[Path] = { RETURN[NEW[PathRep _ [list: NIL]]]; }; LastPoint: PUBLIC PROC[self: Path] RETURNS[x, y: REAL] = { p: Imager.Pair _ [0, 0]; IF self.list#NIL THEN p _ Imager.LastPoint[self.list.first]; RETURN[p.x, p.y]; }; FlushPath: PUBLIC PROC[self: Path] = { self.list _ NIL; }; MoveTo: PUBLIC PROC[self: Path, x, y: REAL, flush: BOOLEAN _ TRUE] = { IF flush THEN self.list _ NIL; self.list _ CONS[Imager.MoveTo[x, y], self.list]; }; LineTo: PUBLIC PROC[self: Path, x, y: REAL] = { IF self.list=NIL THEN MoveTo[self, 0, 0]; self.list.first _ self.list.first.LineTo[x, y]; }; CurveTo: PUBLIC PROC[self: Path, x1, y1, x2, y2, x3, y3: REAL] = { IF self.list=NIL THEN MoveTo[self, 0, 0]; self.list.first _ self.list.first.CurveTo[x1, y1, x2, y2, x3, y3]; }; Rectangle: PUBLIC PROC[self: Path, x0, y0, x1, y1: REAL] = { t: Imager.Trajectory ~ Imager.MoveTo[x0, y0].LineToX[x1].LineToY[y1].LineToX[x0]; self.list _ CONS[t, self.list]; }; ImagerGetCP: PROC[self: Context, rounded: BOOLEAN] RETURNS[x,y: REAL] ~ { ERROR Warning[notImplemented]; }; ImagerSetCP: PROC[self: Context, x,y: REAL, rel: BOOLEAN] ~ { WITH self.data SELECT FROM context: Imager.Context => { IF rel THEN context.SetXYRel[x, y] ELSE context.SetXY[x, y]; }; ENDCASE => ERROR Error[bug]; }; ImagerDrawTo: PROC[self: Context, x,y: REAL, rel: BOOLEAN] ~ { SIGNAL Warning[notImplemented]; }; ImagerDrawStroke: PROC[self: Context, path: Path, width: REAL, closed: BOOLEAN, ends: StrokeEnds] ~ { WITH self.data SELECT FROM context: Imager.Context => { context.SetStrokeWidth[width]; context.SetStrokeEnd[SELECT ends FROM butt => butt, square => square, round => round, ENDCASE => ERROR]; FOR list: LIST OF Imager.Trajectory _ path.list, list.rest UNTIL list=NIL DO IF closed THEN context.MaskStrokeClosed[list.first] ELSE context.MaskStroke[list.first]; ENDLOOP; }; ENDCASE => ERROR Error[bug]; }; ImagerDrawArea: PROC[self: Context, path: Path, parityFill: BOOLEAN] ~ { WITH self.data SELECT FROM context: Imager.Context => { IF parityFill THEN SIGNAL Warning[notImplemented]; IF path.list#NIL THEN context.MaskFill[path.list]; }; ENDCASE => ERROR Error[bug]; }; ImagerDrawBox: PROC[self: Context, box: Box] ~ { WITH self.data SELECT FROM context: Imager.Context => { context.MaskRectangle[ x: box.xmin, y: box.ymin, w: box.xmax-box.xmin, h: box.ymax-box.ymin]; }; ENDCASE => ERROR Error[bug]; }; ImagerDrawImage: PROC[self: Context, image: ImageRef, raw: BOOLEAN] ~ { SIGNAL Warning[notImplemented]; }; ImagerTranslate: PROC[self: Context, tx,ty: REAL, round: BOOLEAN] ~ { WITH self.data SELECT FROM context: Imager.Context => { IF round THEN SIGNAL Warning[notImplemented]; context.TranslateT[tx, ty]; }; ENDCASE => ERROR Error[bug]; }; ImagerConcat: PROC[self: Context, m11,m12,m21,m22: REAL] ~ { WITH self.data SELECT FROM context: Imager.Context => { m: Imager.Transformation ~ Imager.MakeT[[m11, m21, 0, m12, m22, 0]]; context.ConcatT[m]; }; ENDCASE => ERROR Error[bug]; }; ImagerWorldToUser: PROC[self: Context, wx,wy: REAL] RETURNS[x,y: REAL] ~ { SIGNAL Warning[notImplemented]; }; ImagerUserToWorld: PROC[self: Context, x,y: REAL] RETURNS[wx,wy: REAL] ~ { SIGNAL Warning[notImplemented]; }; ImagerSetColor: PROC[self: Context, color: Color] ~ { SIGNAL Warning[notImplemented]; }; ImagerGetColor: PROC[self: Context] RETURNS[Color] ~ { ERROR Warning[notImplemented]; }; ImagerSetPaintMode: PROC[self: Context, mode: PaintMode] RETURNS[PaintMode] ~ { ERROR Warning[notImplemented]; }; ImagerSetFat: PROC[self: Context, fat: BOOLEAN] RETURNS[BOOLEAN] ~ { ERROR Warning[notImplemented]; }; ImagerGetDefaultFont: PROC[self: Context] RETURNS[FontRef] ~ { ERROR Warning[notImplemented]; }; ImagerSetDefaultFont: PROC[self: Context, font: FontRef] ~ { SIGNAL Warning[notImplemented]; }; ImagerDrawChars: PROC[self: Context, font: FontRef, map: PROC[PROC[CHAR] RETURNS[BOOL]]] ~ { SIGNAL Warning[notImplemented]; }; ImagerClipArea: PROC[self: Context, path: Path, parityFill: BOOLEAN, exclude: BOOLEAN] ~ { WITH self.data SELECT FROM context: Imager.Context => { IF parityFill THEN SIGNAL Warning[notImplemented]; IF path.list=NIL THEN RETURN; IF exclude THEN context.ExcludeOutline[path.list] ELSE context.ClipOutline[path.list]; }; ENDCASE => ERROR Error[bug]; }; ImagerClipBox: PROC[self: Context, box: Box, exclude: BOOLEAN] ~ { WITH self.data SELECT FROM context: Imager.Context => { IF exclude THEN context.ExcludeRectangle[ x: box.xmin, y: box.ymin, w: box.xmax-box.xmin, h: box.ymax-box.ymin] ELSE context.ClipRectangle[ x: box.xmin, y: box.ymin, w: box.xmax-box.xmin, h: box.ymax-box.ymin]; }; ENDCASE => ERROR Error[bug]; }; ImagerIsPointVisible: PROC[self: Context, x,y: REAL] RETURNS[BOOLEAN] ~ { ERROR Warning[notImplemented]; }; ImagerIsRectangular: PROC[self: Context] RETURNS[BOOLEAN] ~ { ERROR Warning[notImplemented]; }; ImagerGetBounds: PROC[self: Context] RETURNS[Box] ~ { ERROR Warning[notImplemented]; }; ImagerVisible: PROC[self: Context] RETURNS[BOOLEAN] ~ { ERROR Warning[notImplemented]; }; ImagerSave: PROC[self: Context] RETURNS[Mark] ~ { ERROR Warning[notImplemented]; }; ImagerRestore: PROC[self: Context, mark: Mark] ~ { ERROR Warning[notImplemented]; }; ImagerDrawBits: UNSAFE PROC[self: Context, base: LONG POINTER, raster: CARDINAL, bitsPerPixel: [0..16), x, y, w, h: CARDINAL, xorigin, yorigin: INTEGER] ~ { SIGNAL Warning[notImplemented]; }; ImagerUserToDevice: PROC[self: Context, x, y: REAL, rel: BOOLEAN] RETURNS[tx, ty: REAL] ~ { ERROR Warning[notImplemented]; }; ImagerDeviceToUser: PROC[self: Context, tx, ty: REAL, rel: BOOLEAN] RETURNS[x, y: REAL] ~ { ERROR Warning[notImplemented]; }; ImagerGetYMode: PROC[self: Context] RETURNS[GraphicsBasic.YMode] ~ { ERROR Warning[notImplemented]; }; ImagerSetYMode: PROC[self: Context, mode: GraphicsBasic.YMode] ~ { ERROR Warning[notImplemented]; }; ImagerDrawTexturedBox: PROC[self: Context, box: Box, texture: GraphicsBasic.Texture] ~ { ERROR Warning[notImplemented]; }; ImagerDisable: PROC[self: Context] ~ { ERROR Warning[notImplemented]; }; ImagerMoveDeviceRectangle: PROC[self: Context, width, height, fromX, fromY, toX, toY: NAT] ~ { ERROR Warning[notImplemented]; }; END. jImagerGraphicsImpl.mesa Doug Wyatt, June 27, 1984 11:12:13 am PDT Path Stuff Context procedures Ê Ÿ˜šœ™J™)J™—šÏk ˜ J˜ J˜J˜J˜—Jšœœ˜!Jšœ˜Jšœ˜Jšœœœ ˜J˜Jšœ œœœ˜1Jšœœœœ˜,J˜šœ œœ˜6Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ!˜!Jšœ˜Jšœ%˜%Jšœ%˜%Jšœ˜Jšœ˜Jšœ˜Jšœ%˜%Jšœ#˜#Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ!˜!Jšœ!˜!Jšœ˜Jšœ˜Jšœ'˜'Jšœ˜Jšœ.˜.Jšœ˜J˜—š Ïn œœœœœ ˜Ešœœœ˜J˜3Jšœœ%˜;Jšœ ˜J˜—Jšœœ˜#J˜J˜—™ J™Jšœœœ ˜Jš œ œœœœœ˜?J˜š žœœœœœ ˜5Jšœœœ˜#J˜J˜—š ž œœœ œœ˜:J˜Jšœ œœ'˜Jšœ˜J˜J˜—šžœœ˜1Jšœœ œ˜3šœ œ˜šœ˜J˜šœœ˜%Jšœ0œœ˜B—š œœœ*œœ˜LJšœœ%˜3Jšœ ˜$Jšœ˜—J˜—Jšœœ ˜—J˜J˜—šžœœ(œ˜Hšœ œ˜šœ˜Jšœ œœ˜2Jšœ œœ˜2J˜—Jšœœ ˜—J˜J˜—šž œœ˜0šœ œ˜šœ˜šœ˜JšœF˜F—J˜—Jšœœ ˜—J˜J˜—šžœœ&œ˜GJšœ˜J˜J˜—šžœœœ œ˜Ešœ œ˜šœ˜Jšœœœ˜-J˜J˜—Jšœœ ˜—J˜J˜—šž œœ!œ˜<šœ œ˜šœ˜J˜DJšœ˜J˜—Jšœœ ˜—J˜J˜—š žœœœœœ˜JJšœ˜J˜J˜—š žœœœœœ˜JJšœ˜J˜J˜—šžœœ!˜5Jšœ˜J˜J˜—šžœœœ ˜6Jšœ˜J˜J˜—šžœœ!œ˜OJšœ˜J˜J˜—š ž œœœœœ˜DJšœ˜J˜J˜—šžœœœ ˜>Jšœ˜J˜J˜—šžœœ"˜