-- LedgerFonts.mesa
--   Edited by Sweet, 14-Jan-81 16:44:25

DIRECTORY
  LedgerDefs,
  Press,
  PressDefs,
  PressUtilities,
  Storage;

LedgerFonts: PROGRAM
  IMPORTS LedgerDefs, PressDefs, PressUtilities, Storage
  EXPORTS LedgerDefs =
  BEGIN OPEN LedgerDefs;

  currentWidths: POINTER TO ARRAY CHARACTER OF Mica;

  knownWidths: ARRAY FontIndex OF ARRAY FontWeight OF ARRAY FontSlope OF POINTER TO ARRAY CHARACTER OF Mica ← ALL[ALL[ALL[NIL]]];

  currentRotation: CARDINAL ← 5400;

  SetFontRotation: PUBLIC PROC [rot: CARDINAL] =
    BEGIN
    currentRotation ← rot;
    END;
    
  SetCurrentFont: PUBLIC PROC [fi: FontIndex, weight: FontWeight, slope: FontSlope] =
    BEGIN
    PointSize: ARRAY FontIndex OF CARDINAL = [Hv6: 6, Hv8: 8, Hv10: 10];
    PressDefs.SetFont[
      p: pfd,
      Name: "Helvetica"L,
      PointSize: PointSize[fi],
      Face: ComputeFontFace[weight, slope],
      Rotation: currentRotation];
    currentWidths ← knownWidths[fi][weight][slope];
    IF currentWidths = NIL THEN {
      currentWidths ← Storage.Node[256];
      [] ← PressUtilities.FindFontWidths[
        family: "Helvetica"L,
        points: PointSize[fi],
        weight: weight,
        slope: regular,
        widths: LOOPHOLE[currentWidths]];
      knownWidths[fi][weight][slope] ← currentWidths};
    END;

  ComputeFontFace: PROCEDURE [w: FontWeight, s: FontSlope]
    RETURNS [ff: CARDINAL] =
    BEGIN  --copied from PressFontWidths
    ff ← 0;
    SELECT w FROM
      medium => ff ← ff + 0;
      bold => ff ← ff + 2;
      --light => ff ← ff+4;
      
      ENDCASE => ERROR;
    SELECT s FROM
      regular => ff ← ff + 0;
      italic => ff ← ff + 1;
      ENDCASE => ERROR;
    --SELECT expansion FROM
    --  regular => ff ← ff+0;
    --  condensed => ff ← ff+6;
    --  expanded => ff ← ff+12;
    --  ENDCASE => ERROR Press.BadParameters;
    
    END;
  
  GetWidthOfString: PUBLIC PROC [s: STRING] RETURNS [w: Mica] = 
    BEGIN
    w ← 0;
    IF s # NIL THEN FOR i: CARDINAL IN [0..s.length) DO
      w ← w + currentWidths[s[i]];
      ENDLOOP;
    END;

  GetWidthOfCharacter: PUBLIC PROC [c: CHARACTER] RETURNS [Mica] =
    BEGIN
    RETURN [currentWidths[c]];
    END;

  END.