DIRECTORY Atom, Font, Imager, ImagerBasic, Real; ImagerImpl: CEDAR PROGRAM IMPORTS Atom, Real EXPORTS Imager = BEGIN OPEN Imager; UnimplementedDevice: PUBLIC ERROR = CODE; IncompatibleContexts: PUBLIC ERROR = CODE; Card: PROC [real: REAL] RETURNS [card: CARDINAL] = { int: INT _ Real.RoundLI[real*LAST[CARDINAL]]; card _ MAX[MIN[int, LAST[CARDINAL]], 0]; }; black: PUBLIC Color _ NEW[ImagerBasic.CIEColorRep _ [x: Card[0.3101], y: Card[0.3163], Y: Card[0]]]; white: PUBLIC Color _ NEW[ImagerBasic.CIEColorRep _ [x: Card[0.3101], y: Card[0.3163], Y: Card[1]]]; RegisterDevice: PUBLIC PROC [class: REF Imager.ClassRep] = { Atom.PutProp[class.deviceType, imagerRegistrationKey, class]; }; imagerRegistrationKey: REF TEXT _ "Imager Device Class "; Create: PUBLIC PROC [deviceType: ATOM, name: ROPE] RETURNS [context: Context] = { WITH Atom.GetProp[deviceType, imagerRegistrationKey] SELECT FROM class: REF Imager.ClassRep => { context _ NEW[Imager.ContextRep _ [class: class, data: NIL]]; class.Init[context, name, Imager.nullBounds]; }; ENDCASE => ERROR UnimplementedDevice; }; CreateBuffer: PUBLIC PROC[deviceType: ATOM, box: IntRectangle] RETURNS[context: Context] = { WITH Atom.GetProp[deviceType, imagerRegistrationKey] SELECT FROM class: REF Imager.ClassRep => { context _ NEW[Imager.ContextRep _ [class: class, data: NIL]]; class.Init[context, NIL, box]; }; ENDCASE => ERROR UnimplementedDevice; }; MoveTo: PUBLIC PROC[path: Path, p: Pair] RETURNS[Path] = { RETURN[NEW[PathRep[move] _ [prev: path, lp: p, variant: move[]]]]; }; LineTo: PUBLIC PROC[path: Path, p: Pair] RETURNS[Path] = { RETURN[NEW[PathRep[line] _ [prev: path, lp: p, variant: line[]]]]; }; CurveTo: PUBLIC PROC[path: Path, p1, p2, p3: Pair] RETURNS[Path] = { RETURN[NEW[PathRep[curve] _ [prev: path, lp: p3, variant: curve[p1, p2]]]]; }; ConicTo: PUBLIC PROC[path: Path, p1, p2: Pair, r: REAL] RETURNS[Path] = { RETURN[NEW[PathRep[conic] _ [prev: path, lp: p2, variant: conic[p1, r]]]]; }; MapPath: PathMapType = { path: Path = NARROW[data]; move[path.lp]; FOR x: Path _ path, x.prev UNTIL x.prev=NIL DO p0: Pair = x.prev.lp; WITH x SELECT FROM x: REF PathRep[move] => move[p0]; x: REF PathRep[line] => line[p0]; x: REF PathRep[curve] => curve[x.p2, x.p1, p0]; x: REF PathRep[conic] => conic[x.p1, p0, x.e]; ENDCASE => ERROR; ENDLOOP; }; MapPolygon: PathMapType = { p: Polygon = NARROW[data]; IF p.length>0 THEN { move[p[0]]; FOR i: NAT IN[1..MIN[p.length, p.max]) DO line[p[i]] ENDLOOP; }; }; MaskFill: PUBLIC PROC[context: Context, path: Path] = { context.class.MaskFill[context, [MapPath, path]]; }; PolygonFill: PROC[context: Context, polygon: Polygon] = { context.class.MaskFill[context, [MapPolygon, polygon]]; }; RectangleFill: PROC[context: Context, r: Rectangle] = { MapRectangle: PathMapType = { move[[r.x, r.y]]; line[[r.x+r.w, r.y]]; line[[r.x+r.w, r.y+r.h]]; line[[r.x, r.y+r.h]]; }; context.class.MaskFill[context, [MapRectangle, NIL]]; }; MaskVector: PROC[context: Context, p1, p2: Pair, ...] = { MapVector: PathMapType = { move[[p1.x, p1.y]]; line[[p2.x, p2.y]]; }; context.class.MaskStroke[context, MapVector, NIL, ...]; }; END. vImagerImpl.mesa Last edited by: Michael Plass, August 1, 1983 4:25 pm Doug Wyatt, September 2, 1983 12:40 pm ÊO˜J™J™™J™%J™&J™—šÏk ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜—J˜Jšœ œ˜Jšœ ˜Jšœ˜Jšœœœ˜J˜Jšœœœœ˜)Jšœœœœ˜*J˜š Ïnœœœœœ˜4Jšœœœœ˜-Jš œœœœœ˜(Jšœ˜—Jšœœ œK˜dJšœœ œK˜dJ˜šžœœœ œ˜