ImagerImpl.mesa
Last edited by:
Michael Plass, August 1, 1983 4:25 pm
Doug Wyatt, September 2, 1983 12:40 pm
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.