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.