(**********************************************************************

    :Program.    Borders.mod
    :Contents.   support of "3D-design" rectangle borders
    :Author.     Nicolas Benezan [bne]
    :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
    :Phone.      711/333679
    :Author.     Kai Bolay [kai]
    :Copyright.  (c) 1990 by Nicolas Benezan. All rights reserved.
    :Language.   Oberon
    :Translator. Amiga Oberon Compiler V1.16 [fbs]
    :History.    V1.0 [bne] 03.Oct.1990
    :History.    v1.1 [kai] 15-Nov-90 (bugs fixed)

**********************************************************************)

MODULE Borders;

IMPORT e: Exec, i: Intuition, g: Graphics, s: SYSTEM;

TYPE
  Angle = ARRAY 10 OF INTEGER;
  Rect  = ARRAY 16 OF INTEGER;

  Border3D* = STRUCT
    left* : i.Border;
    right*: i.Border;
    inner*: i.Border;
    lAngle: Angle;
    rAngle: Angle;
    rect: Rect;
  END;
  Border3DPtr* = POINTER TO Border3D;

CONST
  ThickX* = 4;
  ThickY* = 2;

  LeftAngle  = Angle ( 0,  0,  0, -1,  1, -2,  1,  0, -2,  0);
  RightAngle = Angle ( 1, -1, -2, -1, -2,  1, -1,  0, -1, -1);
  Rectangle  = Rect  ( 2,  1,  2, -2, -3, -2, -3,  1,  3,  1,
                       3, -2, -4, -2, -4,  2);

PROCEDURE ResizeBorder* (VAR Border: Border3D;
                             Width, Height: INTEGER);
  BEGIN
    Border.lAngle:= LeftAngle;
    Border.rAngle:= RightAngle;
    Border.rect  := Rectangle;
    INC (Border.lAngle[8], Width);
    INC (Border.lAngle[3], Height);
    INC (Border.lAngle[5], Height);
    INC (Border.rAngle[2], Width);
    INC (Border.rAngle[4], Width);
    INC (Border.rAngle[6], Width);
    INC (Border.rAngle[8], Width);
    INC (Border.rAngle[1], Height);
    INC (Border.rAngle[3], Height);
    INC (Border.rAngle[9], Height);
    INC (Border.rect[4] , Width);
    INC (Border.rect[6] , Width);
    INC (Border.rect[12], Width);
    INC (Border.rect[14], Width);
    INC (Border.rect[3] , Height);
    INC (Border.rect[5] , Height);
    INC (Border.rect[11], Height);
    INC (Border.rect[13], Height);
  END ResizeBorder;

PROCEDURE MoveBorder* (VAR Border: Border3D;
                           OffsetX, OffsetY: INTEGER);
  BEGIN
    Border.left.leftEdge := OffsetX;
    Border.left.topEdge  := OffsetY;
    Border.right.leftEdge:= OffsetX;
    Border.right.topEdge := OffsetY;
    Border.inner.leftEdge:= OffsetX;
    Border.inner.topEdge := OffsetY;
  END MoveBorder;

PROCEDURE InitBorder* (VAR Border: Border3D;
                           LTPen, RBPen, BackFill: SHORTINT;
                           Width, Height: INTEGER): i.BorderPtr;
  BEGIN
    Border.left. leftEdge := 0;
    Border.right.leftEdge:= 0;
    Border.inner.leftEdge:= 0;
    Border.left. topEdge := 0;
    Border.right.topEdge:= 0;
    Border.inner.topEdge:= 0;
    Border.left. drawMode := g.jam1;
    Border.right.drawMode:= g.jam1;
    Border.inner.drawMode:= g.jam1;
    Border.left. frontPen := LTPen;
    Border.right.frontPen:= RBPen;
    Border.inner.frontPen:= BackFill;
    Border.left.backPen := 0;
    Border.right.backPen:= 0;
    Border.inner.backPen:= 0;
    Border.left.count    := 5;
    Border.right.count   := 5;
    Border.inner.count   := 8;
    Border.left.xy       := s.ADR (Border.lAngle);
    Border.right.xy      := s.ADR (Border.rAngle);
    Border.inner.xy      := s.ADR (Border.rect);
    Border.right.nextBorder:= s.ADR (Border.inner);
    Border.left.nextBorder:= s.ADR (Border.right);
    Border.inner.nextBorder := NIL;
    ResizeBorder (Border, Width, Height);
    RETURN s.ADR (Border)
  END InitBorder;

END Borders.
