home *** CD-ROM | disk | FTP | other *** search
- UNIT PlScript;
- (* V.1.0.a vom 07.01.1989 *)
- (* Überarbeitete Version von MyVec.Pas / (c) 1988 D. Bückart u. DMV-Verlag *)
- (* .. veröffentlicht auf der Disk. FontEdit V.2.0 *)
-
- INTERFACE
-
- USES HPGL, GRAPH, DOS;
-
- TYPE
- ByteArray = ARRAY [0..30000] OF BYTE;
-
- ByteArrayPtr= ^ByteArray;
- FontRec = RECORD
- Offset,
- CHR_Pos,
- Anzahl,
- Min_Char,
- VecStart,
- Hoehe,
- Unter,
- VecTab,
- Breiten : INTEGER;
- Loaded : BOOLEAN;
- CHR_Length: INTEGER;
- RamFont : BOOLEAN;
- Puffer : ByteArrayPtr;
- END;
- FontPtr = ^FontRec;
-
- FontDescribeRec = RECORD
- Name : String[4];
- FileName : String[64];
- Font : FontPtr;
- END;
-
- CONST MaxFonts = 7;
- FontArray: ARRAY [1..MaxFonts] OF FontDescribeRec =
- ( (Name: 'TRIP'; FileName: 'TRIP.CHR'; Font: NIL),
- (Name: 'LITT'; FileName: 'LITT.CHR'; Font: NIL),
- (Name: 'SANS'; FileName: 'SANS.CHR'; Font: NIL),
- (Name: 'GOTH'; FileName: 'GOTH.CHR'; Font: NIL),
- (Name: 'GREK'; FileName: 'GREK.FE2'; Font: NIL),
- (Name: 'SCRI'; FileName: 'SCRI.FE2'; Font: NIL),
- (Name: 'SCR2'; FileName: 'SCR2.FE2'; Font: NIL)
- );
-
- Trip : INTEGER = 1; Litt : INTEGER = 2; Sans : INTEGER = 3;
- Goth : INTEGER = 4; Grek : INTEGER = 5; Scri : INTEGER = 6;
- Scr2 : INTEGER = 7;
-
- VAR Farbe : ARRAY [1..80] OF BYTE;
- (* Stiftnummer / Zeichen des Textes *)
-
- PROCEDURE SetTextStyle (Font, Direction, CharSize: INTEGER);
- PROCEDURE SetUserCharSize (MultX,DivX, MultY,DivY: INTEGER);
- PROCEDURE SetTextJustIFy (Horiz, Vert: INTEGER);
- FUNCTION TextHeight(Text: String): INTEGER;
- FUNCTION TextWidth (Text: String): INTEGER;
- PROCEDURE OuttextXY (x,y: INTEGER; Text: STRING);
- PROCEDURE GetTextSettings (VAR TextInfo : TextSettingsType);
- (*-----------------------------------------------*)
- IMPLEMENTATION
-
- CONST
- VDONE = 0;
- VDUMMY= 1;
- VMOVE = 2;
- VLINE = 3;
-
- SizeArray : ARRAY [1..26] OF REAL =
- ( 0.571428571, 0.642857143, 0.75, 1, 1.321428571,
- 1.642857143, 2, 2.5, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20 );
-
- VAR
- _Font_,
- _JustX_,_JustY_,
- _UserMultX_, _UserMultY_,
- _UserDivX_, _UserDivY_ ,
- _Direction_,
- _CharSize_ : INTEGER;
-
- DrawFont : FontPtr;
- TextInfo : TextSettingsType;
- (*-----------------------------------------------*)
- PROCEDURE SwapVars (VAR a,b: INTEGER);
- VAR x: INTEGER;
- BEGIN x:=a; a:=b; b:=x; END;
- (*-----------------------------------------------*)
- FUNCTION CHR_Laden (VAR a: FontDescribeRec) : INTEGER;
- VAR x : INTEGER;
- CHR_File : File;
- BEGIN
- WITH a.Font^ DO
- BEGIN
- ASSIGN (CHR_File, a.FileName);
- {$I-} RESET (CHR_File,1); {$I+}
- DosError := IOResult;
-
- IF DosError <>0 THEN BEGIN CHR_Laden := -8; EXIT; END;
-
- CHR_Length := FileSize (CHR_File);
-
- IF CHR_Length > MaxAvail THEN BEGIN CHR_Laden := -9; EXIT; END;
-
- GetMem (Puffer, CHR_Length);
- BlockRead (CHR_File, Puffer^, CHR_Length);
- Close(CHR_File);
-
- x:= 0;
- WHILE (x<$80) AND (Puffer^[x] <> $1A) DO INC (x);
- IF x=$80 THEN BEGIN CHR_Laden:= -2; EXIT; END;
-
- INC (x);
- OffSet:= Puffer^[x] + Puffer^[x+1] SHL 8;
- INC (x,6);
- CHR_Pos:= x; { Start der Daten }
-
- { ********** diese zusätzliche Prüfung kostet überfüssige Zeit ***** }
- { IF Puffer^[x] + Puffer^[x+1] SHL 8 + OffSet <> CHR_Length THEN
- BEGIN CHR_Laden:= -3; EXIT; END;
- }
-
- Anzahl := Puffer^[OffSet+1]; { Anzahl der Definitionen }
- MIN_Char := Puffer^[OffSet+4]; { kleinstes ASCII-Zeichen }
- VecStart := Puffer^[OffSet+5] + Puffer^[OffSet+6] SHL 8; { Vektorenstart }
- Hoehe := Puffer^[OffSet+8]; { Höher der Großbuchstaben }
- Unter := ShortInt(Puffer^[OffSet+10]); { Unterlänge der Zeichen }
- VecTab := OffSet + $10; { Vektor-Tabelle für Adressen }
- Breiten := VecTab + Anzahl SHL 1; { Breitentabelle }
- Loaded := True;
- RamFont := False;
- CHR_Laden := 0;
- END;
- END;
- (*-----------------------------------------------*)
- PROCEDURE Use_nth_Font (n: INTEGER);
- {Wird von Settextstyle aufgerufen}
- VAR Error: INTEGER;
- BEGIN
- NEW (FontArray[n].Font);
- Error := CHR_Laden (FontArray[n]);
-
- (* hier kann eine Fehlerausgabe eingefügt werden ! *)
-
- DrawFont := FontArray[n].Font;
- END;
- (*-----------------------------------------------*)
- PROCEDURE SetTextStyle (Font, Direction, CharSize: INTEGER);
- BEGIN
- _Font_ := Font;
- _Direction_ := Direction;
- _CharSize_ := CharSize;
- IF (Font IN [1..MaxFonts]) THEN Use_nth_Font (Font) ELSE Halt;
- Graph.SetTextStyle (Font, Direction, CharSize);
- END;
- (*-----------------------------------------------*)
- PROCEDURE SetUserCharSize (MultX, DivX, MultY, DivY: INTEGER);
- BEGIN
- _UserMultX_:= MultX;
- _UserMultY_:= MultY;
- _UserDivY_ := DivY;
- _UserDivX_ := DivX;
- Graph.SetUserCharSize (MultX, DivX, MultY, DivY);
- END;
- (*-----------------------------------------------*)
- PROCEDURE SetTextJustify (Horiz, Vert: INTEGER);
- BEGIN
- _JustX_:= Horiz;
- _JustY_:= Vert;
- Graph.SetTextJustify (Horiz, Vert);
- END;
- (*-----------------------------------------------*)
- FUNCTION CharIndex (ch : Char) : INTEGER;
- {Berechnen der Adresse der Definitionen}
- VAR x : INTEGER;
- BEGIN
- WITH DrawFont^ DO
- BEGIN
- x:= (Ord(ch) - MIN_Char) SHL 1;
- CharIndex :=
- Puffer^[x+VecTab] + 256*Puffer^[x+VecTab+1] + VecStart + OffSet;
- END;
- END;
- (*-----------------------------------------------*)
- FUNCTION CharBreite (ch : Char) : INTEGER;
- {Holt die Breite aus der Breiten-Tabelle}
- VAR x : INTEGER;
- BEGIN
- WITH DrawFont^ DO
- BEGIN
- x:= (Ord(ch) - MIN_Char);
- CharBreite := Puffer^[x+Breiten];
- END;
- END;
- (*-----------------------------------------------*)
- FUNCTION CharWidth (c: Char): INTEGER;
- {Berechnet die Breite eines einzelnen Zeichens.}
- VAR ComSizeX: Real;
- BEGIN
- IF _CharSize_ = 0 THEN ComSizeX:= _UserMultX_ / _UserDivX_
- ELSE ComSizeX:= SizeArray[_CharSize_];
-
- CharWidth:= Round (CharBreite (c)*ComSizeX);
- END;
- (*-----------------------------------------------*)
- FUNCTION TextHeight (Text: STRING) : INTEGER;
- VAR ComSizeY: Real;
- BEGIN
- IF _CharSize_ = 0 THEN ComSizeY:= _UserMultY_ / _UserDivY_
- ELSE ComSizeY:= SizeArray[_CharSize_];
- TextHeight:= Trunc ( (DrawFont^.Hoehe - DrawFont^.Unter) * ComSizeY);
- END;
- (*-----------------------------------------------*)
- FUNCTION TextWidth (Text: STRING) : INTEGER;
- VAR i,r: INTEGER;
- BEGIN
- r:=0;
- FOR i:=1 TO LENGTH (Text) DO INC (r,CharWidth(Text[i]));
- TextWidth:= r;
- END;
- (*-----------------------------------------------*)
- PROCEDURE GetTextSettings (VAR TextInfo : TextSettingsType);
- BEGIN
- WITH TextInfo DO
- BEGIN
- Font := _font_;
- Direction := _direction_;
- CharSize := _CharSize_;
- Horiz := _justX_;
- Vert := _justY_;
- END;
- END;
- (*-----------------------------------------------*)
- PROCEDURE PaintChar (Pos, X, Y, Size : INTEGER);
- VAR
- XVec, YVec, Code : INTEGER;
- ComSizeX, ComSizeY : REAL;
- BEGIN
- IF Size = 0 THEN BEGIN
- ComSizeX:= _UserMultX_ / _UserDivX_;
- ComSizeY:= _UserMultY_ / _UserDivY_;
- END
- ELSE BEGIN
- ComSizeX:= SizeArray[Size];
- ComSizeY:= ComSizeX;
- END;
- REPEAT
- WITH DrawFont^ DO
- BEGIN
- XVec := Puffer^[Pos];
- INC (Pos);
- YVec := Puffer^[Pos];
- INC (Pos);
- END;
-
- Code := (XVec AND $80) SHR 6 + (YVec AND $80) SHR 7;
- XVec := XVec AND $7F;
- YVec := YVec AND $7F;
- IF XVec >= $40 THEN XVec := -128 + XVec; { geht schneller so }
- IF YVec >= $40 THEN YVec := -128 + YVec;
-
- XVec := TRUNC (XVEC * ComSizeX);
- YVec := TRUNC (YVec * ComSizeY);
-
- IF _Direction_= VertDir THEN
- BEGIN SwapVars (XVec,YVec); XVec:= -XVec; END;
-
- CASE Code of
- VMOVE : P_MoveTo (X + XVec, Y + YVec);
- VLINE : P_LineTo (X + XVec, Y + YVec);
- END;
-
- UNTIL Code = VDONE;
- END;
- (*-----------------------------------------------*)
- PROCEDURE _Outtext (x,y : INTEGER; Text : String);
- VAR i : INTEGER;
- BEGIN
- IF _Direction_ = HorizDir THEN
- BEGIN
- IF _JustY_ = TopText THEN INC (y, TextHeight (Text));
- IF _JustY_ = CenterText THEN INC (y, TextHeight (Text) DIV 2);
- IF _JustX_ = RightText THEN DEC(x, TextWidth (Text));
- IF _JustX_ = CenterText THEN DEC(x, TextWidth (Text) DIV 2);
- END
- ELSE
- BEGIN
- IF _JustY_ = TopText THEN INC (y, TextWidth (Text));
- IF _JustY_ = CenterText THEN INC (y, TextWidth (Text) DIV 2);
- IF _JustX_ = RightText THEN DEC(x, TextHeight (Text));
- IF _JustX_ = CenterText THEN DEC(x, TextHeight (Text) DIV 2);
- END;
-
- FOR i:=1 TO LENGTH (Text) DO
- BEGIN
- P_SetColor (Farbe [i]);
- (* ^ siehe Anmerkung im Beitrag ! *)
- PaintChar (CharIndex (Text[i]), X, Y, _CharSize_);
- IF _Direction_ = HorizDir THEN x := x + CharWidth (Text [i])
- ELSE y := y + CharWidth (Text [i]);
- END;
-
- IF _Direction_ = HorizDir THEN
- BEGIN
- IF _JustY_ = TopText THEN DEC (y, TextHeight (Text));
- IF _JustY_ = CenterText THEN DEC (y, TextHeight (Text) DIV 2);
- IF _JustX_ = CenterText THEN DEC (x, TextWidth (Text) DIV 2);
- END
- ELSE
- BEGIN
- IF _JustY_ = BottomText THEN INC (y, TextWidth (Text));
- IF _JustY_ = CenterText THEN INC (y, TextWidth (Text) DIV 2);
- IF _JustX_ = RightText THEN INC (x, TextHeight (Text));
- IF _JustX_ = CenterText THEN INC (x, TextHeight (Text) DIV 2);
- END;
- END;
- (*-----------------------------------------------*)
- PROCEDURE OutTextXY (x, y : INTEGER; Text: STRING);
- BEGIN _OutText (x, y, Text); END;
- (*-----------------------------------------------*)
- BEGIN { Initialisierungen }
- DrawFont := NIL;
- _Font_ := 0;
- _JustX_ := 0;
- _JustY_ := 2;
- _UserMultX_ :=1;
- _UserMultY_ :=1;
- _UserDivX_ :=1;
- _UserDivY_ :=1;
- _Direction_ :=0;
- _CharSize_ :=4;
- END.