-- TATypeSetterFaceImpl.mesa
-- Michael Plass, July 20, 1982 10:52 am
-- Rick Beach, July 5, 1982 2:38 pm
-- Maureen Stone December 8, 1982 5:18 pm

DIRECTORY
 Graphics USING [Box, Context, NewContext],
 GraphicsBasic USING[DeviceRef],
 GraphicsToPressPrivate USING[NewContextFromSirPressHandle],
 JaMOps USING [defaultFrame],
 NodeStyle USING [Create, Ref],
 Real,
 TAGraphicsHacks USING [NewBoxerDevice, EndBox],
 TAPrivate USING [InitJaMGraphics, NoJaMGraphicsViewer, PopDC, PushDC, PushReal, Translate],
 TARender USING [RenderBranch],
 TextNode USING [Ref],
 TJaMGraphicsPrivate USING [EstablishNonViewerContext, ForgetNonViewerContext],
 TSArtwork,
 TSGlue,
 TSGraphic,
 TSOutput USING [Handle],
 TSOutputPress USING [PressState],
 TSTypes USING [RealDimn, pt],
 TATypeSetter;

TATypeSetterFaceImpl: PROGRAM
 IMPORTS Graphics, JaMOps, NodeStyle, TAGraphicsHacks, TAPrivate, TARender, TJaMGraphicsPrivate, TSArtwork, TSTypes, GraphicsToPressPrivate
 EXPORTS TATypeSetter =
BEGIN OPEN TSTypes;

CreateArtworkObject: TSArtwork.ObjectFromBranchProc = CHECKED {
 -- supply Typesetter with Paint and Layout procedures
 object ← NEW[TSGraphic.ObjectRec];
 object.paintProc ← ArtworkObjectPaint;
 object.layoutProc ← ArtworkObjectLayout;
 object.data ← NEW[ArtworkObjectRec ← [node: node]];
 };

ArtworkObjectRec: TYPE = RECORD [
 node: TextNode.Ref,
 bbox: Graphics.Box ← [Real.LargestNumber, Real.LargestNumber, -Real.LargestNumber, -Real.LargestNumber]
 ];

ArtworkObjectLayout: TSGraphic.LayoutProc = TRUSTED {
 -- determine the size of the artwork in the current style state
 data: REF ArtworkObjectRec ← NARROW[self.data];
 nodeStyle: NodeStyle.Ref ← NodeStyle.Create[];
 dc: Graphics.Context ← Graphics.NewContext[TAGraphicsHacks.NewBoxerDevice[]];
 TAPrivate.InitJaMGraphics[ ! TAPrivate.NoJaMGraphicsViewer => ERROR];
 TJaMGraphicsPrivate.EstablishNonViewerContext[JaMOps.defaultFrame, dc];
 { ENABLE UNWIND => TJaMGraphicsPrivate.ForgetNonViewerContext[JaMOps.defaultFrame];
  TARender.RenderBranch[handle: NIL,
   node: data.node,
   nodeStyle: nodeStyle,
   kind: print,
   paint: FALSE];
  data.bbox ← TAGraphicsHacks.EndBox[dc];
  TJaMGraphicsPrivate.ForgetNonViewerContext[JaMOps.defaultFrame];
  };
 extent[right] ← RealDimn[data.bbox.xmax, pt];
 extent[left] ← RealDimn[data.bbox.xmin, pt];
 extent[up] ← RealDimn[data.bbox.ymax, pt];
 extent[down] ← RealDimn[data.bbox.ymin, pt];
 };

ArtworkObjectPaint: TSGraphic.PaintProc = TRUSTED {
 -- paint the artwork object given the position by the Typesetter
 data: REF ArtworkObjectRec ← NARROW[self.data];
 nodeStyle: NodeStyle.Ref ← NodeStyle.Create[];
 outputHandle: TSOutput.Handle ← NARROW[context];
 IF useJaMGraphics OR outputHandle.outputState = NIL THEN {
  -- display in JaMGraphics viewer
  TAPrivate.PushDC[];
  TAPrivate.PushReal[originX.texPts];
  TAPrivate.PushReal[originY.texPts-data.bbox.ymin];
  TAPrivate.Translate[];
  TARender.RenderBranch[handle: outputHandle,
   node: data.node,
   nodeStyle: nodeStyle,
   kind: print,
   paint: TRUE];
  TAPrivate.PopDC[];
  }
 ELSE IF ISTYPE[outputHandle.outputState, TSOutputPress.PressState] THEN {
  pressState: TSOutputPress.PressState ← NARROW[outputHandle.outputState];
  dc: Graphics.Context ← pressState.graphicsContext;
  IF dc=NIL THEN
   dc ← GraphicsToPressPrivate.NewContextFromSirPressHandle[pressState.pressHandle];
  TJaMGraphicsPrivate.EstablishNonViewerContext[JaMOps.defaultFrame, dc];
  { ENABLE UNWIND => TJaMGraphicsPrivate.ForgetNonViewerContext[JaMOps.defaultFrame];
   TAPrivate.PushDC[];
   TAPrivate.PushReal[originX.texPts];
   TAPrivate.PushReal[originY.texPts-data.bbox.ymin];
   TAPrivate.Translate[];
   TARender.RenderBranch[handle: outputHandle,
    node: data.node,
    nodeStyle: nodeStyle,
    kind: print,
    paint: TRUE];
   TAPrivate.PopDC[];
   TJaMGraphicsPrivate.ForgetNonViewerContext[JaMOps.defaultFrame];
   };
  outputHandle.colorProc[outputHandle, 0, 0, 0];
  }
 ELSE ERROR; 
 };

useJaMGraphics: BOOLEAN ← FALSE;

RegisterProcs: PUBLIC PROC = {
 TSArtwork.Register["ArtworkNode", CreateArtworkObject];
 TSArtwork.Register["ArtworkFileName", CreateArtworkObject];
 TSArtwork.Register["ArtworkImage", CreateArtworkObject];
 };

END.

Split from TSArtworkImpl.mesa. Micahel Plass, July 19, 1982 10:22 am