-- GraphicsToPressJaM.mese
-- Last edit by Michael Plass on April 11, 1983 11:33 am
-- Last edit by Maureen Stone on April 11, 1983 1:17 pm
DIRECTORY
GraphicsToPress,
Graphics,
JaMBasic,
JaMInternal,
JaMOps,
Rope,
TJaMGraphicsContexts,
GraphicsToPressPrivate,
SirPress,
Real,
GraphicsColor,
CGCubic USING [Bezier, Coeffs, BezierToCoeffs],
CGPath,
GraphicsBasic USING [Vec];
GraphicsToPressJaM: CEDAR PROGRAM
IMPORTS GraphicsToPress, JaMOps, Rope, TJaMGraphicsContexts, GraphicsToPressPrivate, SirPress, Graphics, Real, GraphicsColor, CGCubic, CGPath
= BEGIN
ROPE: TYPE = Rope.ROPE;
Frame: TYPE = JaMInternal.Frame;
pressContext: Graphics.Context;
pressHandle: SirPress.PressHandle;
resolution: REAL ← 144;
PopRope: PROCEDURE [f: Frame] RETURNS [rope: ROPE] = TRUSTED {
s: string JaMBasic.Object ← JaMOps.PopString[f.opstk];
C: PROC[c: CHAR] RETURNS [BOOLEAN] =
TRUSTED {t[t.length]𡤌 t.length ← t.length+1; RETURN[FALSE]};
t: REF TEXTNEW[TEXT[s.length]];
t.length ← 0;
JaMOps.StringForAll[s, C];
rope ← Rope.FromRefText[t];
};
GetContext: PROCEDURE [] RETURNS [Graphics.Context] = {
RETURN[pressContext];
};
Open: PROCEDURE [f: Frame] = TRUSTED {
fileName: ROPE ← PopRope[f];
pressContext ← GraphicsToPress.NewContext[fileName, resolution];
pressHandle ← GraphicsToPressPrivate.SirPressHandle[pressContext];
TJaMGraphicsContexts.AddContext[frame: f,init: GetContext, name: $Press, enabled: TRUE, initOnErase: FALSE];
};
Close: PROCEDURE [f: Frame] = TRUSTED {
savedProcRec ← NIL;
[] ← TJaMGraphicsContexts.RemoveContext[f, $Press];
GraphicsToPress.Close[pressContext];
pressContext ← NIL;
};
SetResolution: PROCEDURE [f: Frame] = TRUSTED {
resolution ← JaMOps.PopReal[f.opstk];
};
SetFont: PROCEDURE [f: Frame] = TRUSTED {
face: INT ← JaMOps.PopInteger[f.opstk];
size: INT ← JaMOps.PopInteger[f.opstk];
family: ROPE ← PopRope[f];
SirPress.SetFont[pressHandle,family,size,face];
};
PutText: PROCEDURE [f: Frame] = {
rope: ROPE ← PopRope[f];
x,y: REAL;
color: Graphics.Color ← Graphics.GetColor[pressContext];
h,s,v: REAL;
[h,s,v] ← GraphicsColor.ColorToHSV[color];
SirPress.SetColor[pressHandle,Real.RoundI[h*240],Real.RoundI[s*255],Real.RoundI[v*255]];
[x,y] ← Graphics.GetCP[pressContext];
[x,y] ← Graphics.UserToWorld[pressContext,x,y];
SirPress.PutText[pressHandle,rope,Real.RoundI[x],Real.RoundI[y],SirPress.pt];
};
GetPoint: PROCEDURE [f: Frame] RETURNS [x,y: REAL] = TRUSTED {
y ← JaMOps.PopReal[f.opstk];
x ← JaMOps.PopReal[f.opstk];
[x,y] ← Graphics.UserToWorld[pressContext,x,y];
};
savedProcRec: REF Graphics.GraphicsProcs;
UsePressOutline: PROCEDURE [f: Frame] = {
newProcRec: REF Graphics.GraphicsProcs ← NEW[Graphics.GraphicsProcs];
IF savedProcRec # NIL THEN ERROR;
savedProcRec ← pressContext.procs;
newProcRec^ ← savedProcRec^;
newProcRec.DrawArea ← PressDrawArea;
pressContext.procs ← newProcRec;
};
UseGraphicsOutline: PROCEDURE [f: Frame] = {
IF savedProcRec = NIL THEN ERROR;
pressContext.procs ← savedProcRec;
savedProcRec ← NIL;
};
micasPerPoint: REAL = 2540.0/72.0;
PressDrawArea: PROC[self: Graphics.Context, path: Graphics.Path, parityFill: BOOLEAN] = {
color: Graphics.Color ← Graphics.GetColor[pressContext];
h,s,v: REAL;
bezier: CGCubic.Bezier;
Map: PROC [v: GraphicsBasic.Vec] RETURNS [t: GraphicsBasic.Vec] = {
[t.x, t.y] ← Graphics.UserToWorld[pressContext, v.x, v.y];
t.x ← t.x * micasPerPoint;
t.y ← t.y * micasPerPoint;
};
Move: PROCEDURE [v: GraphicsBasic.Vec] = {
bezier.b0 ← v;
SirPress.PutMoveTo[pressHandle, Real.RoundI[v.x], Real.RoundI[v.y]];
};
Line: PROCEDURE [v: GraphicsBasic.Vec] = {
bezier.b0 ← v;
SirPress.PutDrawTo[pressHandle, Real.RoundI[v.x], Real.RoundI[v.y]];
};
Curve: PROCEDURE [v1, v2, v3: GraphicsBasic.Vec] = {
c: CGCubic.Coeffs;
bezier.b1 ← v1;
bezier.b2 ← v2;
bezier.b3← v3;
c ← CGCubic.BezierToCoeffs[bezier];
Press bug...argggh!
IF ABS[c.c1.x] < 0.1 THEN c.c1.x ← 0; IF ABS[c.c1.y] < 0.1 THEN c.c1.y ← 0;
IF ABS[c.c2.x] < 0.1 THEN c.c2.x ← 0; IF ABS[c.c2.y] < 0.1 THEN c.c2.y ← 0;
IF ABS[c.c3.x] < 0.1 THEN c.c3.x ← 0; IF ABS[c.c3.y] < 0.1 THEN c.c3.y ← 0;
SirPress.PutCubic[pressHandle, c.c1.x, c.c1.y, c.c2.x, c.c2.y, c.c3.x, c.c3.y];
bezier.b0 ← bezier.b3;
bezier.b1 ← bezier.b2 �zier.b3 ← [0,0];
};
Close: PROCEDURE = {
};
IF NOT parityFill THEN ERROR;
[h,s,v] ← GraphicsColor.ColorToHSV[color];
SirPress.SetColor[pressHandle,Real.RoundI[h*240],Real.RoundI[s*255],Real.RoundI[v*255]];
SirPress.StartOutline[pressHandle];
CGPath.MapAndFilter[path, Map, Move, Line, Curve, Close];
SirPress.EndOutline[pressHandle];
};
TRUSTED {
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.Open", Open];
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.Close", Close];
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.Resolution", SetResolution];
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.SetFont", SetFont];
these routines are for accessing the SirPress handle directly
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.PutText", PutText];
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.UsePressOutline", UsePressOutline];
JaMOps.RegisterExplicit[JaMOps.defaultFrame, "Press.UseGraphicsOutline", UseGraphicsOutline];
};
END.