Browse Source

* import of Leon de Boer's files

pierre 24 years ago
parent
commit
e720096155
22 changed files with 1388 additions and 719 deletions
  1. 34 29
      fv/app.pas
  2. 6 2
      fv/dialogs.pas
  3. 136 49
      fv/drivers.pas
  4. 32 20
      fv/fileio.pas
  5. 162 58
      fv/gfvgraph.pas
  6. 3 1
      fv/menus.pas
  7. 20 4
      fv/platform.inc
  8. 5 2
      fv/validate.pas
  9. 248 141
      fv/views.pas
  10. 34 29
      fvision/app.pas
  11. 43 43
      fvision/common.pas
  12. 6 2
      fvision/dialogs.pas
  13. 136 49
      fvision/drivers.pas
  14. 25 15
      fvision/emsunit.pas
  15. 32 20
      fvision/fileio.pas
  16. 162 58
      fvision/gfvgraph.pas
  17. 3 1
      fvision/menus.pas
  18. 23 47
      fvision/objects.pas
  19. 20 4
      fvision/platform.inc
  20. 5 2
      fvision/validate.pas
  21. 248 141
      fvision/views.pas
  22. 5 2
      fvision/xmsunit.pas

+ 34 - 29
fv/app.pas

@@ -100,7 +100,8 @@ USES
      Os2Def, Os2Base, OS2PmApi,                       { Standard units }
    {$ENDIF}
 
-   Common, Memory, GFVGraph,                          { GFV standard units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Memory,                                    { GFV standard units }
    Objects, Drivers, Views, Menus, HistList, Dialogs; { GFV standard units }
 
 {***************************************************************************}
@@ -139,6 +140,7 @@ CONST
 {---------------------------------------------------------------------------}
 CONST
   { Turbo Vision 1.0 Color Palettes }
+
    CColor =
          #$81#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
      #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
@@ -160,7 +162,8 @@ CONST
    { Turbo Vision 2.0 Color Palettes }
 
    CAppColor =
-         #$81#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
+         {$IFDEF OS_WINDOWS}#$81+{$ELSE}#$71+{$ENDIF}
+         #$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
      #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
      #$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E#$20#$2B#$2F#$78#$2E#$70#$30 +
      #$3F#$3E#$1F#$2F#$1A#$20#$72#$31#$31#$30#$2F#$3E#$31#$13#$38#$00 +
@@ -423,8 +426,7 @@ CONST Pending: TEvent = (What: evNothing);            { Pending event }
 {---------------------------------------------------------------------------}
 FUNCTION TvAppMsgHandler (Wnd: hWnd; iMessage, wParam: Sw_Word;
 lParam: LongInt): LongInt; {$IFDEF BIT_16} EXPORT; {$ELSE} STDCALL; {$ENDIF}
-VAR Li: LongInt; Min, MAx: TPoint; Event: TEvent; P: PView; Wp: ^TWindowPos;
-    Mm: ^TMinMaxInfo;
+VAR Event: TEvent; P: PView; Mm: ^TMinMaxInfo;
 BEGIN
    {$IFDEF BIT_16}                                    { 16 BIT CODE }
    PtrRec(P).Seg := GetProp(Wnd, ViewSeg);            { Fetch seg property }
@@ -566,13 +568,15 @@ BEGIN
    GetPalette := @P;                                  { Return palette }
 END;
 
-procedure TBackground.DrawbackGround;
-var
-  B: TDrawBuffer;
-begin
-  MoveChar(B, Pattern, GetColor($01), Size.X);
-  WriteLine(0, 0, Size.X, Size.Y, B);
-end;
+{--TBackGround--------------------------------------------------------------}
+{  DrawBackground -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB    }
+{---------------------------------------------------------------------------}
+PROCEDURE TBackground.DrawBackground;
+VAR B: TDrawBuffer;
+BEGIN
+   MoveChar(B, Pattern, GetColor($01), Size.X);       { Fill draw buffer }
+   WriteLine(0, 0, Size.X, Size.Y, B);                { Draw to area }
+END;
 
 {--TBackGround--------------------------------------------------------------}
 {  Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB             }
@@ -594,7 +598,6 @@ CONSTRUCTOR TDesktop.Init (Var Bounds: Objects.TRect);
 BEGIN
    Inherited Init(Bounds);                            { Call ancestor }
    GrowMode := gfGrowHiX + gfGrowHiY;                 { Set growmode }
-   {GOptions := GOptions AND NOT goNoDrawView;}         { This group draws }
    InitBackground;                                    { Create background }
    If (Background <> Nil) Then Insert(Background);    { Insert background }
 END;
@@ -622,9 +625,9 @@ END;
 PROCEDURE TDesktop.InitBackground;
 {$IFNDEF OS_WINDOWS} CONST Ch: Char = #176; {$ELSE} CONST Ch: Char = #167; {$ENDIF}
 VAR R: TRect;
-BEGIN                                                 { Compatability only }
-   getExtent(R);
-   BackGround := New(PbackGround, Init(R, Ch));
+BEGIN
+   GetExtent(R);                                      { Get desktop extents }
+   BackGround := New(PBackground, Init(R, Ch));       { Insert a background }
 END;
 
 {--TDesktop-----------------------------------------------------------------}
@@ -784,11 +787,8 @@ VAR I: Integer; R: TRect; {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
 BEGIN
    Application := @Self;                              { Set application ptr }
    InitScreen;                                        { Initialize screen }
-  { R.Assign(0, 0, ScreenWidth, ScreenHeight); }        { Full screen area }
-   R.A.X := 0;
-   R.A.Y := 0;
-   R.B.X := -(SysScreenWidth);
-   R.B.Y := -(SysScreenHeight);
+   R.Assign(0, 0, -(GetMaxX(TextModeGFV)+1),
+     -(GetMaxY(TextModeGFV)+1));                      { Full screen area }
    Inherited Init(R);                                 { Call ancestor }
    State := sfVisible + sfSelected + sfFocused +
       sfModal + sfExposed;                            { Deafult states }
@@ -808,11 +808,11 @@ BEGIN
    CreateWindowNow(swp_Show);                         { Create app window }
    {$ENDIF}
    {$IFNDEF OS_DOS}                                   { WIN/NT/OS2 CODE }
-   AppWindow := HWindow;
-   Size.X := ScreenWidth;
-   Size.Y := ScreenHeight;
-   RawSize.X := ScreenWidth * SysFontWidth;
-   RawSize.Y := ScreenHeight * SysFontHeight - 1;
+   AppWindow := HWindow;                              { Set app window handle }
+   Size.X := ScreenWidth;                             { Set x size value }
+   Size.Y := ScreenHeight;                            { Set y size value }
+   RawSize.X := ScreenWidth * SysFontWidth;           { Set rawsize x }
+   RawSize.Y := ScreenHeight * SysFontHeight - 1;     { Set rawsize y }
    {$ENDIF}
    InitStatusLine;                                    { Init status line }
    If (StatusLine <> Nil) Then Insert(StatusLine);    { Insert status line }
@@ -837,8 +837,10 @@ BEGIN
   {$IFDEF OS_WINDOWS}                                 { WIN/NT CODE }
    For I := 0 To 15 Do DeleteObject(ColBrush[I]);     { Delete brushes }
    For I := 0 To 15 Do DeleteObject(ColPen[I]);       { Delete pens }
-   AppWindow := 0;                                    { Zero app window }
-   {$ENDIF}
+  {$ENDIF}
+  {$IFNDEF OS_DOS}                                    { WIN/NT/OS2 CODE }
+   AppWindow := 0;                                    { Zero app window handle }
+  {$ENDIF}
 END;
 
 {--TProgram-----------------------------------------------------------------}
@@ -1041,7 +1043,7 @@ END;
 {  HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB       }
 {---------------------------------------------------------------------------}
 PROCEDURE TProgram.HandleEvent (Var Event: TEvent);
-VAR I: Word; C: Char;
+VAR C: Char;
 BEGIN
    If (Event.What = evKeyDown) Then Begin             { Key press event }
      C := GetAltChar(Event.KeyCode);                  { Get alt char code }
@@ -1298,7 +1300,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 11:43:13  marco
+ Revision 1.3  2001-04-10 21:29:54  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 11:43:13  marco
   * Added CVS log and ID entries.
 
 

+ 6 - 2
fv/dialogs.pas

@@ -97,7 +97,8 @@ USES
      OS2Def, OS2Base, OS2PMAPI,                       { Standard units }
    {$ENDIF}
 
-   Common, GFVGraph, Objects, Drivers, Views, Validate; { Standard GFV units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Objects, Drivers, Views, Validate;         { Standard GFV units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -3215,7 +3216,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:20  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:20  marco
   * CVS log and ID tags
 
 

+ 136 - 49
fv/drivers.pas

@@ -5,9 +5,10 @@
 {                                                          }
 {    Interface Copyright (c) 1992 Borland International    }
 {                                                          }
-{    Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer  }
+{    Copyright (c) 1996, 1997, 1998, 1999, 2000            }
+{    by Leon de Boer                                       }
 {    [email protected]  - primary e-mail addr          }
-{    ldeboer@starwon.com.au - backup e-mail addr           }
+{    ldeboer@projectent.com.au - backup e-mail addr        }
 {                                                          }
 {    Original FormatStr kindly donated by Marco Schmidt    }
 {                                                          }
@@ -62,6 +63,7 @@
 {  1.98     09 Sep 99   GetMouseEvent fixed for OS2.       }
 {  1.99     03 Nov 99   FPC windows support added.         }
 {  2.00     26 Nov 99   Graphics stuff moved to GFVGraph   }
+{  2.01     21 May 00   DOS fixed to use std GRAPH unit    }
 {**********************************************************}
 
 UNIT Drivers;
@@ -101,10 +103,13 @@ USES
        {$IFDEF PPC_FPC}                               { FPC WINDOWS COMPILER }
          Windows,                                     { Standard unit }
        {$ELSE}                                        { OTHER COMPILERS }
-         WinTypes, WinProcs,                          { Standard units }
+         WinTypes, WinProcs, Strings,                 { Standard units }
+         {$IFDEF BIT_16}                              { 16 BIT WINDOWS COMPILER }
+         Win31,                                       { Standard unit }
+         {$ENDIF}
        {$ENDIF}
        {$IFDEF PPC_DELPHI}                            { DELPHI3+ COMPILER }
-       SysUtils, Messages,                            { Standard unit }
+         SysUtils, Messages,                          { Standard unit }
        {$ENDIF}
      {$ELSE}                                          { SYBIL2+ COMPILER }
        WinBase, WinDef, WinUser, WinGDI,              { Standard units }
@@ -120,7 +125,11 @@ USES
      {$ENDIF}
    {$ENDIF}
 
-   Common, GFVGraph, Objects;                         { GFV standard units }
+   GFVGraph,                                          { GFV graphics unit }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   Graph,                                             { Standard bp unit }
+   {$ENDIF}
+   Common, Objects;                                   { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -578,6 +587,7 @@ PROCEDURE ShowMouseCursor;
 {---------------------------------------------------------------------------}
 {$IFDEF OS_WINDOWS}                                   { WIN/NT CODE }
 CONST
+   RawHandler   : Boolean = False;
    AppWindow    : HWnd = 0;                           { Application window }
    DefGfvFont   : HFont = 0;                          { Default GFV font }
    DefFontWeight: Integer = fw_Normal;                { Default font weight }
@@ -624,6 +634,7 @@ CONST
 {          >>> NEW INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES <<<            }
 {---------------------------------------------------------------------------}
 CONST
+   TextModeGFV    : Boolean = False;                  { DOS/DPMI textmode op }
    DefLineNum     : Integer = 25;                     { Default line number }
    DefFontHeight  : Integer = 0;                      { Default font height }
    SysFontWidth   : Integer = 8;                      { System font width }
@@ -662,7 +673,7 @@ VAR
 {---------------------------------------------------------------------------}
 {                 DOS/DPMI MOUSE INTERRUPT EVENT QUEUE SIZE                 }
 {---------------------------------------------------------------------------}
-CONST EventQSize = 16;                                { Default irq bufsize }
+CONST EventQSize = 16;                                { Default int bufsize }
 {$ENDIF}
 
 {---------------------------------------------------------------------------}
@@ -1279,6 +1290,16 @@ ASSEMBLER;
      CMP DL, 25;                                      { Check screen ht }
      SBB AH, AH;                                      { Subtract borrow }
      INC AH;                                          { Make #1 if in high }
+     MOV CL, 1;                                       { Preset value of 1 }
+     OR DL, DL;                                       { Test for zero }
+     JNZ @@1;                                         { Branch if not zero }
+     MOV CL, 0                                        { Set value to zero }
+     MOV DL, 24;                                      { Zero = 24 lines }
+   @@1:
+     INC DL;                                          { Add one line }
+     MOV ScreenWidth, DH;                             { Hold screen width }
+     MOV ScreenHeight, DL;                            { Hold screen height }
+     MOV HiResScreen, CL;                             { Set hires mask }
      CMP AL, smMono;                                  { Is screen mono }
      JZ @@Exit1;                                      { Exit of mono }
      CMP AL, smBW80;                                  { Is screen B&W }
@@ -1306,6 +1327,16 @@ ASSEMBLER;
      CMPB $25, %DL;                                   { Check screen ht }
      SBB %AH, %AH;                                    { Subtract borrow }
      INCB %AH;                                        { Make #1 if in high }
+     MOVB $1, %CL;                                    { Preset value of 1 }
+     ORB %DL, %DL;                                    { Test for zero }
+     JNZ .L_JMP1;                                     { Branch if not zero }
+     MOVB $0, %CL;                                    { Set value to zero }
+     MOVB $24, %DL;                                   { Zero = 24 lines }
+   .L_JMP1:
+     INCB %DL;                                        { Add one line }
+     MOVB %DH, SCREENWIDTH;                           { Hold screen width }
+     MOVB %DL, SCREENHEIGHT;                          { Hold screen height }
+     MOVB %CL, HIRESSCREEN;                           { Set hires mask }
      CMPB $07, %AL;                                   { Is screen mono }
      JZ .L_Exit1;                                     { Exit of mono }
      CMPB $02, %AL;                                   { Is screen B&W }
@@ -1700,7 +1731,16 @@ BEGIN
        WM_SysKeyDown: Begin                           { SYSTEM KEY DOWN }
          If (NumPos > 0) Then Begin                   { Numerics entry op }
            Case Msg.wParam Of
-             VK_Insert: B := 0;                       { Key value = 0 }
+             VK_Insert: Begin                         { Insert key }
+               If (GetShiftState AND kbAltShift <> 0) { Alt key down }
+               Then Begin
+                 Event.What := evKeyDown;             { Key down event }
+                 Event.KeyCode := kbAltIns;           { Alt + Ins key }
+                 Handled := True;                     { Set key handled }
+                 Exit;                                { Now exit }
+               End;
+               B := 0;                                { Key value = 0 }
+             End;
              VK_End: B := 1;                          { Key value = 1 }
              VK_Down: B := 2;                         { Key value = 2 }
              VK_Next: B := 3;                         { Key value = 3 }
@@ -1862,7 +1902,7 @@ BEGIN
 END;
 
 {---------------------------------------------------------------------------}
-{  GetMouseEvent -> Platforms DOS/DPMI/WINDOWS/OS2 - Updated 09Sep98 LdB    }
+{  GetMouseEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Sep98 LdB     }
 {---------------------------------------------------------------------------}
 PROCEDURE GetMouseEvent (Var Event: TEvent);
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
@@ -2121,10 +2161,10 @@ BEGIN
    Event.What := evNothing;                           { Preset no event }
    {$IFDEF PPC_FPC}                                   { FPC WINDOWS COMPILER }
    If PeekMessage(@Msg, 0, WM_MouseFirst,
-   WM_MouseLast, pm_Remove) Then Begin                { Fetch mouse message }
+     WM_MouseLast, pm_Remove) Then Begin              { Fetch mouse message }
    {$ELSE}                                            { OTHER COMPILERS }
    If PeekMessage(Msg, 0, WM_MouseFirst,
-   WM_MouseLast, pm_Remove) Then Begin                { Fetch mouse message }
+     WM_MouseLast, pm_Remove) Then Begin              { Fetch mouse message }
    {$ENDIF}
      TranslateMessage(Msg);                           { Translate message }
      DispatchMessage(Msg);                            { Dispatch message }
@@ -2242,12 +2282,19 @@ VAR {$IFDEF OS_DOS} I, J: Integer; Ts: TextSettingsType; {$ENDIF}
     {$IFDEF OS_OS2} Ts, Fs: Integer; Ps: HPs; Tm: FontMetrics; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   I := Detect;                                       { Detect video card }
-   J := 0;                                            { Zero select mode }
-   InitGraph(I, J, '');                               { Initialize graphics }
-   I := GetMaxX;                                      { Fetch max x size }
-   J := GetMaxY;                                      { Fetch max y size }
-   {$IFDEF PPC_FPC}                                   { FPC DOS COMPILER }
+     If (TextModeGFV = True) Then Begin               { TEXT MODE GFV }
+       I := ScreenWidth*8 -1;                         { Mouse width }
+       J := ScreenHeight*8 -1;                        { Mouse height }
+       SysScreenWidth := I + 1;
+       SysScreenHeight := J + 1;
+     End Else Begin                                   { GRAPHICS MODE GFV }
+       I := Detect;                                   { Detect video card }
+       J := 0;                                        { Zero select mode }
+       InitGraph(I, J, '');                           { Initialize graphics }
+       I := GetMaxX;                                  { Fetch max x size }
+       J := GetMaxY;                                  { Fetch max y size }
+     End;
+     {$IFDEF PPC_FPC}                                 { FPC DOS COMPILER }
      ASM
        MOVW $7, %AX;                                  { Set function  id }
        MOVW $0, %CX;                                  { Clear register }
@@ -2259,10 +2306,12 @@ BEGIN
        INT $0x33;                                     { Set mouse y movement }
      END;
      Lock_Code(Pointer(@ShowTheMouse), 400);          { Lock cursor code }
-     MouseMoveProc := ShowTheMouse;                   { Set move function }
-     ShowMouseProc := ShowTheMouse;                   { Set show function }
-     HideMouseProc := ShowTheMouse;                   { Set hide function }
-   {$ELSE}                                            { OTHER DOS COMPILERS }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       MouseMoveProc := ShowTheMouse;                 { Set move function }
+       ShowMouseProc := ShowTheMouse;                 { Set show function }
+       HideMouseProc := ShowTheMouse;                 { Set hide function }
+     End;
+     {$ELSE}                                          { OTHER DOS COMPILERS }
      ASM
        MOV AX, 7;                                     { Set function  id }
        XOR CX, CX;                                    { Clear register }
@@ -2273,25 +2322,33 @@ BEGIN
        MOV DX, J;                                     { Maximum y size }
        INT 33H;                                       { Set mouse y movement }
      END;
-   {$ENDIF}
-     SysScreenWidth := GetMaxX+1;                     { Max screen width }
-     SysScreenHeight := GetMaxY+1;                    { Max screen height }
-
-     If (DefFontHeight = 0) Then                      { Font height not set }
-       J := SysScreenHeight DIV DefLineNum            { Approx font height }
-       Else J := DefFontHeight;                       { Use set font height }
-     I := J DIV (TextHeight('H')+4);                  { Approx magnification }
-     If (I < 1) Then I := 1;                          { Must be 1 or above }
-     GetTextSettings(Ts);                             { Get text style }
-     SetTextStyle(Ts.Font, Ts.Direction, I);          { Set new font settings }
-     SysFontWidth := TextWidth('H');                  { Transfer font width }
-     SysFontHeight := TextHeight('H')+4;              { Transfer font height }
+     {$ENDIF}
+     If (TextModeGFV = True) Then Begin               { TEXT MODE GFV }
+       SysFontWidth := 8;                             { Font width }
+       SysFontHeight := 8;                            { Font height }
+     End Else Begin                                   { GRAPHICS MODE GFV }
+       If (DefFontHeight = 0) Then                    { Font height not set }
+         J := (GetMaxY+1) DIV DefLineNum              { Approx font height }
+         Else J := DefFontHeight;                     { Use set font height }
+       I := J DIV (TextHeight('H')+4);                { Approx magnification }
+       If (I < 1) Then I := 1;                        { Must be 1 or above }
+       GetTextSettings(Ts);                           { Get text style }
+       SetTextStyle(Ts.Font, Ts.Direction, I);        { Set new font settings }
+       SysFontWidth := TextWidth('H');                { Transfer font width }
+       SysFontHeight := TextHeight('H')+4;            { Transfer font height }
+       ScreenWidth := (SysScreenWidth+1) DIV
+         SysFontWidth;                                { Calc screen width }
+       ScreenHeight := (SysScreenHeight+1) DIV
+         SysFontHeight;                               { Calc screen height }
+     End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
      SysScreenWidth := GetSystemMetrics(
        SM_CXFullScreen)-GetSystemMetrics(SM_CXFrame); { Max screen width }
      SysScreenHeight := GetSystemMetrics(
        SM_CYFullScreen);                              { Max screen height }
+     SystemParametersInfo(SPI_GETICONTITLELOGFONT,
+       SizeOf(TLogFont), @TempFont, 0);               { Get system font }
      With TempFont Do Begin
        If (DefFontHeight = 0) Then Begin              { Font height not set }
          lfHeight := SysScreenHeight DIV DefLineNum;  { Best guess height }
@@ -2309,11 +2366,20 @@ BEGIN
        lfQuality       := Proof_Quality;              { Proof quality }
        lfPitchAndFamily:= Variable_Pitch OR
          Fixed_Pitch;                                 { Either fitch format }
+(*       {$IFDEF WESTERNS}
        FillChar(lfFaceName, SizeOf(lfFaceName), #0);  { Clear memory area }
        Move(DefFontStyle[1], lfFacename,
          Length(DefFontStyle));                       { Transfer style name }
+       {$ELSE}
+       DefFontStyle[0] := Chr(StrLen(lfFacename));
+       Move(lfFacename, DefFontStyle[1], Ord(DefFontStyle[0]));
+       {$ENDIF}*)
      End;
-     DefGFVFont := CreateFontIndirect(TempFont);      { Create a default font }
+     {$IFDEF PPC_FPC}                                 { FPC WINDOWS COMPILER }
+       DefGFVFont := CreateFontIndirect(@TempFont);   { Create a default font }
+     {$ELSE}
+       DefGFVFont := CreateFontIndirect(TempFont);    { Create a default font }
+     {$ENDIF}
      Dc := GetDc(0);                                  { Get screen context }
      Mem := CreateCompatibleDC(Dc);                   { Compatable context }
      SelectObject(Mem, DefGFVFont);                   { Select the font }
@@ -2358,23 +2424,24 @@ BEGIN
      GpiQueryFontMetrics(Ps, SizeOf(Tm), Tm);         { Get text metrics }
      SysFontWidth := Tm.lAveCharWidth+1;              { Transfer font width }
      SysFontHeight := Tm.lMaxBaselineExt;             { Transfer font height }
-    { SysFontheight := SysScreenheight DIV DefLineNum;}
      WinReleasePS(Ps);                                { Release desktop PS }
      DefPointer := WinQuerySysPointer(HWND_DESKTOP,
        SPTR_ARROW, False);                            { Hold default pointer }
    {$ENDIF}
-   ScreenWidth := SysScreenWidth DIV SysFontWidth;    { Calc screen width }
-   ScreenHeight := SysScreenHeight DIV SysFontHeight; { Calc screen height }
-   SysScreenWidth := ScreenWidth * SysFontWidth;      { Actual width }
-   SysScreenHeight := ScreenHeight * SysFontHeight;   { Actual height }
-   {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
-   Inc(SysScreenWidth, 2*GetSystemMetrics(SM_CXFrame)); { Max screen width }
-   Inc(SysScreenHeight, GetSystemMetrics(SM_CYCaption)
-     + GetSystemMetrics(SM_CYFrame));                 { Max screen height }
-   {$ENDIF}
-   {$IFDEF OS_OS2}                                    { OS2 CODE }
-   Inc(SysScreenWidth, Fs);                           { Max screen width }
-   Inc(SysScreenHeight, Ts);                          { Max screen height }
+   {$IFNDEF OS_DOS}                                   { WIN/NT/OS2 ONLY }
+     ScreenWidth := SysScreenWidth DIV SysFontWidth;  { Calc screen width }
+     ScreenHeight := SysScreenHeight DIV SysFontHeight;{ Calc screen height }
+     SysScreenWidth := ScreenWidth * SysFontWidth;    { Actual width }
+     SysScreenHeight := ScreenHeight * SysFontHeight; { Actual height }
+     {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
+     Inc(SysScreenWidth, 2*GetSystemMetrics(SM_CXFrame));{ Max screen width }
+     Inc(SysScreenHeight, GetSystemMetrics(SM_CYCaption)
+       + GetSystemMetrics(SM_CYFrame));               { Max screen height }
+     {$ENDIF}
+     {$IFDEF OS_OS2}                                  { OS2 CODE }
+     Inc(SysScreenWidth, Fs);                         { Max screen width }
+     Inc(SysScreenHeight, Ts);                        { Max screen height }
+     {$ENDIF}
    {$ENDIF}
 END;
 
@@ -2390,7 +2457,24 @@ BEGIN
      HideMouseProc := Nil;                            { Clr hide mouse ptr }
      UnLock_Code(Pointer(@ShowTheMouse), 400);        { Unlock cursor code }
      {$ENDIF}
-     CloseGraph;                                      { Close down graphics }
+     If (TextModeGFV <> True) Then CloseGraph         { Close down graphics }
+     Else Begin                                       { Text mode gfv }
+       {$IFDEF PPC_FPC}                               { FPC DOS COMPILER }
+       ASM
+         MOVW SCREENMODE, %AX;                        { Original screen mode }
+         PUSH %EBP;                                   { Save register }
+         INT $0x10;                                   { Reset video }
+         POP %EBP;                                    { Restore register }
+       END;
+       {$ELSE}                                        { OTHER DOS COMPILERS }
+       ASM
+         MOV AX, ScreenMode;                          { Original screen mode }
+         PUSH BP;                                     { Save register }
+         INT 10H;                                     { Reset video }
+         POP BP;                                      { Restore register }
+       END;
+       {$ENDIF}
+     End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
      If (DefGFVFont <> 0) Then                        { Check font created }
@@ -2625,7 +2709,10 @@ BEGIN
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 	
 

+ 32 - 20
fv/fileio.pas

@@ -5,7 +5,7 @@
 {                                                          }
 {   Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer   }
 {   [email protected]  - primary e-mail address        }
-{   ldeboer@starwon.com.au - backup e-mail address         }
+{   ldeboer@projectent.com.au - backup e-mail address      }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -32,6 +32,7 @@
 {        OS2      - Virtual Pascal 1.0+     (32 Bit)       }
 {                 - Speed Pascal 1.0+       (32 Bit)       }
 {                 - C'T patch to BP         (16 Bit)       }
+{        LINUX    - FPC 1.0.2+              (32 Bit)       }
 {                                                          }
 {******************[ REVISION HISTORY ]********************}
 {  Version  Date        Fix                                }
@@ -46,6 +47,7 @@
 {  1.60     14 Jun 99   References to Common.pas added.    }
 {  1.61     07 Jul 99   Speedsoft SYBIL 2.0 code added.    }
 {  1.62     03 Nov 99   FPC windows support added.         }
+{  1.70     10 Nov 00   Revamp using changed common unit   }
 {**********************************************************}
 
 UNIT FileIO;
@@ -87,7 +89,9 @@ UNIT FileIO;
   {$ENDIF}
 {$ENDIF}
 
-USES Common;                                          { Standard GFV unit }
+USES
+  {$IFDEF WIN16} WinTypes, WinProcs, {$ENDIF}         { Stardard BP units }
+  Common;                                             { Standard GFV unit }
 
 {***************************************************************************}
 {                             PUBLIC CONSTANTS                              }
@@ -138,9 +142,9 @@ TYPE
 The file opened by the handle is closed. If close action is successful
 true is returned but if the handle is invalid or a file error occurs
 false will be returned.
-20Oct98 LdB
+14Nov00 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileClose (Handle: Word): Boolean;
+FUNCTION FileClose (Handle: THandle): Boolean;
 
 {-FileOpen-----------------------------------------------------------
 Given a valid filename to file that exists, is not locked with a valid
@@ -148,7 +152,7 @@ access mode the file is opened and the file handle returned. If the
 name or mode is invalid or an error occurs the return will be zero.
 27Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
+FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): THandle;
 
 {-SetFileSize--------------------------------------------------------
 The file opened by the handle is set the given size. If the action is
@@ -156,7 +160,7 @@ successful zero is returned but if the handle is invalid or a file error
 occurs a standard file error value will be returned.
 21Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
+FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
 
 {-SetFilePos---------------------------------------------------------
 The file opened by the handle is set the given position in the file.
@@ -165,7 +169,7 @@ the position is beyond the file size or a file error occurs a standard
 file error value will be returned.
 21Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
+FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
 Var Actual: LongInt): Word;
 
 {-FileRead-----------------------------------------------------------
@@ -176,7 +180,7 @@ error occurs the function will return a file error constant and actual
 will contain the bytes transfered before the error if any.
 22Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 
 {-FileWrite----------------------------------------------------------
 The file opened by the handle has count bytes written to it from the
@@ -186,7 +190,7 @@ error occurs the function will return a file error constant and actual
 will contain the bytes transfered before the error if any.
 22Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
                                IMPLEMENTATION
@@ -195,10 +199,8 @@ FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word):
 {$IFDEF OS_WINDOWS}                                   { WIN/NT UNITS }
 
   {$IFNDEF PPC_SPEED}                                 { NON SPEED COMPILER }
-    {$IFDEF PPC_FPC}                                  { FPC WINDOWS COMPILER }
+    {$IFDEF WIN32}                                    { WIN32 COMPILER }
     USES Windows;                                     { Standard unit }
-    {$ELSE}                                           { NON FPC COMPILER }
-    USES WinTypes, WinProcs;                          { Stardard units }
     {$ENDIF}
   TYPE LongWord = LongInt;                            { Type fixup }
   {$ELSE}                                             { SPEEDSOFT COMPILER }
@@ -228,9 +230,9 @@ FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word):
 {***************************************************************************}
 
 {---------------------------------------------------------------------------}
-{  FileClose -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Oct98 LdB         }
+{  FileClose -> Platforms DOS/DPMI/WIN/NT/OS2/LINUX - Updated 14Nov00 LdB   }
 {---------------------------------------------------------------------------}
-FUNCTION FileClose (Handle: Word): Boolean;
+FUNCTION FileClose (Handle: THandle): Boolean;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -274,11 +276,18 @@ BEGIN
      Else FileClose := False;                         { Closure failed }
 END;
 {$ENDIF}
+{$IFDEF OS_LINUX}                                     { LINUX CODE }
+BEGIN
+   fdClose(Handle);                                   { Close the file }
+   If (LinuxError <= 0) Then FileClosed := True       { Close succesful }
+     Else FileClosed := False;                        { Close failed }
+END;
+{$ENDIF}
 
 {---------------------------------------------------------------------------}
 {  FileOpen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct98 LdB          }
 {---------------------------------------------------------------------------}
-FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
+FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): THandle;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -370,7 +379,7 @@ END;
 {---------------------------------------------------------------------------}
 {  SetFileSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Feb97 LdB       }
 {---------------------------------------------------------------------------}
-FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
+FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -441,7 +450,7 @@ END;
 {---------------------------------------------------------------------------}
 {  SetFilePos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Feb97 LdB        }
 {---------------------------------------------------------------------------}
-FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
+FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
 Var Actual: LongInt): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
@@ -509,7 +518,7 @@ END;
 {---------------------------------------------------------------------------}
 {  FileRead -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB          }
 {---------------------------------------------------------------------------}
-FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -567,7 +576,7 @@ END;
 {---------------------------------------------------------------------------}
 {  FileWrite -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB         }
 {---------------------------------------------------------------------------}
-FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -624,7 +633,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 
 

+ 162 - 58
fv/gfvgraph.pas

@@ -3,9 +3,9 @@
 {                                                          }
 {          System independent GFV GRAPHICS UNIT            }
 {                                                          }
-{   Copyright (c) 1999 by Leon de Boer                     }
+{   Copyright (c) 1999, 2000 by Leon de Boer               }
 {   [email protected]  - primary e-mail address        }
-{   ldeboer@starwon.com.au - backup e-mail address         }
+{   ldeboer@projectent.com.au - backup e-mail address      }
 {                                                          }
 {   This unit provides the interlink between the graphics  }
 {   used in GFV and the graphics API for the different     }
@@ -24,9 +24,6 @@
 {                                                          }
 {*****************[ SUPPORTED PLATFORMS ]******************}
 {     16 and 32 Bit compilers                              }
-{        DOS      - Turbo Pascal 7.0 +      (16 Bit)       }
-{        DPMI     - Turbo Pascal 7.0 +      (16 Bit)       }
-{                 - FPC 0.9912+ (GO32V2)    (32 Bit)       }
 {        WINDOWS  - Turbo Pascal 7.0 +      (16 Bit)       }
 {                 - Delphi 1.0+             (16 Bit)       }
 {        WIN95/NT - Delphi 2.0+             (32 Bit)       }
@@ -41,6 +38,8 @@
 {  -------  ---------   ---------------------------------- }
 {  1.00     26 Nov 99   Unit started from relocated code   }
 {                       originally from views.pas          }
+{  1.01     21 May 00   GetMaxX and GetMaxY added.         }
+{  1.02     05 Dec 00   Fixed DOS/DPMI implementation.     }
 {**********************************************************}
 
 UNIT GFVGraph;
@@ -73,6 +72,10 @@ UNIT GFVGraph;
 {$V-} { Turn off strict VAR strings }
 {====================================================================}
 
+{$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
+USES Graph;                                           { Standard unit }
+{$ENDIF}
+
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
 {***************************************************************************}
@@ -122,33 +125,13 @@ CONST
 CONST
    Detect = 0;                                        { Detect video }
 
+{$IFDEF OS_DOS}                                       { DOS CODE ONLY }
 {---------------------------------------------------------------------------}
-{                        TEXT JUSTIFICATION CONSTANTS                       }
+{                 DOS GRAPHICS SOLID FILL BAR AREA CONSTANT                 }
 {---------------------------------------------------------------------------}
 CONST
-   LeftText   = 0;                                    { Left justify }
-   CenterText = 1;                                    { Centre justify }
-   RightText  = 2;                                    { Right justify }
-   BottomText = 0;                                    { Bottom justify }
-   TopText    = 2;                                    { Top justify }
-
-{---------------------------------------------------------------------------}
-{                           FILL PATTERN CONSTANTS                          }
-{---------------------------------------------------------------------------}
-CONST
-   EmptyFill      = 0;                                { No fill pattern }
-   SolidFill      = 1;                                { Solid colour }
-   LineFill       = 2;                                { Line fill }
-   LtSlashFill    = 3;                                { Fwd slash line type }
-   SlashFill      = 4;                                { Fwd slash pattern }
-   BkSlashFill    = 5;                                { Back slash pattern }
-   LtBkSlashFill  = 6;                                { Back slash line type }
-   HatchFill      = 7;                                { Hatch pattern }
-   XHatchFill     = 8;                                { Cross hatch pattern }
-   InterleaveFill = 9;                                { Interleaved pattern }
-   WideDotFill    = 10;                               { Wide dot pattern }
-   CloseDotFill   = 11;                               { Close dot pattern }
-   UserFill       = 12;                               { User defined fill }
+   SolidFill = Graph.SolidFill;
+{$ENDIF}
 
 {$IFDEF OS_WINDOWS}                                   { WIN/NT CODE }
 {---------------------------------------------------------------------------}
@@ -199,7 +182,7 @@ Sets the current write mode constant all subsequent draws etc. are
 then via the set mode.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE SetWriteMode (Mode: Byte);
+PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
 
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {                         VIEWPORT CONTROL ROUTINES                         }
@@ -209,13 +192,41 @@ PROCEDURE SetWriteMode (Mode: Byte);
 Returns the current viewport and clip parameters in the variable.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType);
+PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
 
 {-SetViewPort--------------------------------------------------------
 Set the current viewport and clip parameters to that requested.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip: Boolean);
+PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
+
+
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                    GRAPHICS DEVICE CAPACITY ROUTINES                      }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+
+{-GetMaxX------------------------------------------------------------
+Returns X coordinate of maximum value that can be entered in any
+graphics routine, that is the actual screen width in pixels - 1.
+21May2000 LdB
+---------------------------------------------------------------------}
+FUNCTION GetMaxX (TextMode: Boolean): Integer;
+
+{-GetMaxY------------------------------------------------------------
+Returns Y coordinate of maximum value that can be entered in any
+graphics routine, that is the actual screen height in pixels - 1.
+21May2000 LdB
+---------------------------------------------------------------------}
+FUNCTION GetMaxY (TextMode: Boolean): Integer;
+
+{$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+PROCEDURE SetColor(Color: Word);
+PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
+PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
+PROCEDURE Line(X1, Y1, X2, Y2: Integer);
+PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
+PROCEDURE OutTextXY(X,Y: Integer; TextString: String);
+{$ENDIF}
 
 {***************************************************************************}
 {                        INITIALIZED PUBLIC VARIABLES                       }
@@ -241,6 +252,7 @@ CONST
 {               DOS/DPMI/WIN/NT/OS2 INITIALIZED VARIABLES                   }
 {---------------------------------------------------------------------------}
 CONST
+   FillCol : Integer = 0;
    Cxp     : Integer = 0;                             { Current x position }
    Cyp     : Integer = 0;                             { Current y position }
    ViewPort: ViewPortType = (X1:0; Y1:0; X2: 639;
@@ -256,11 +268,16 @@ CONST
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 
 {---------------------------------------------------------------------------}
-{  SetWriteMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB      }
+{  SetWriteMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB    }
 {---------------------------------------------------------------------------}
-PROCEDURE SetWriteMode (Mode: Byte);
+PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
 BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then WriteMode := Mode                 { Hold write mode }
+     Else Graph.SetWriteMode(Mode);                   { Call graph proc }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
    WriteMode := Mode;                                 { Hold writemode value }
+   {$ENDIF}
 END;
 
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
@@ -268,44 +285,131 @@ END;
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 
 {---------------------------------------------------------------------------}
-{  GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB   }
+{  GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
 {---------------------------------------------------------------------------}
-PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType);
+PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
+{$IFDEF OS_DOS} VAR Ts: Graph.ViewPortType;{$ENDIF}   { DOS/DPMI CODE }
 BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then CurrentViewPort := ViewPort       { Textmode viewport }
+     Else Begin
+       Graph.GetViewSettings(Ts);                     { Get graph settings }
+       CurrentViewPort.X1 := Ts.X1;                   { Transfer X1 }
+       CurrentViewPort.Y1 := Ts.Y1;                   { Transfer Y1 }
+       CurrentViewPort.X2 := Ts.X2;                   { Transfer X2 }
+       CurrentViewPort.Y2 := Ts.Y2;                   { Transfer Y2 }
+       CurrentViewPort.Clip := Ts.Clip;               { Transfer clip mask }
+     End;
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
    CurrentViewPort := ViewPort;                       { Return view port }
+   {$ENDIF}
+END;
+
+{---------------------------------------------------------------------------}
+{  SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB     }
+{---------------------------------------------------------------------------}
+PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
+BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If (TextMode = TRUE) Then Begin                    { TEXT MODE GFV }
+   {$ENDIF}
+     If (X1 < 0) Then X1 := 0;                        { X1 negative fix }
+     If (X1 > SysScreenWidth) Then
+       X1 := SysScreenWidth;                          { X1 off screen fix }
+     If (Y1 < 0) Then Y1 := 0;                        { Y1 negative fix }
+     If (Y1 > SysScreenHeight) Then
+       Y1 := SysScreenHeight;                         { Y1 off screen fix }
+     If (X2 < 0) Then X2 := 0;                        { X2 negative fix }
+     If (X2 > SysScreenWidth) Then
+       X2 := SysScreenWidth;                          { X2 off screen fix }
+     If (Y2 < 0) Then Y2 := 0;                        { Y2 negative fix }
+     If (Y2 > SysScreenHeight) Then
+       Y2 := SysScreenHeight;                         { Y2 off screen fix }
+     ViewPort.X1 := X1;                               { Set X1 port value }
+     ViewPort.Y1 := Y1;                               { Set Y1 port value }
+     ViewPort.X2 := X2;                               { Set X2 port value }
+     ViewPort.Y2 := Y2;                               { Set Y2 port value }
+     ViewPort.Clip := Clip;                           { Set port clip value }
+     Cxp := X1;                                       { Set current x pos }
+     Cyp := Y1;                                       { Set current y pos }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   End Else Begin                                     { GRAPHICS MODE GFV }
+     Graph.SetViewPort(X1, Y1, X2, Y2, Clip);         { Call graph proc }
+   End;
+   {$ENDIF}
 END;
 
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                    GRAPHICS DEVICE CAPACITY ROUTINES                      }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+
 {---------------------------------------------------------------------------}
-{  SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB       }
+{  GetMaxX - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB          }
 {---------------------------------------------------------------------------}
-PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip: Boolean);
+FUNCTION GetMaxX (TextMode: Boolean): Integer;
 BEGIN
-   If (X1 < 0) Then X1 := 0;                          { X1 negative fix }
-   If (X1 > SysScreenWidth) Then
-     X1 := SysScreenWidth;                            { X1 off screen fix }
-   If (Y1 < 0) Then Y1 := 0;                          { Y1 negative fix }
-   If (Y1 > SysScreenHeight) Then
-     Y1 := SysScreenHeight;                           { Y1 off screen fix }
-   If (X2 < 0) Then X2 := 0;                          { X2 negative fix }
-   If (X2 > SysScreenWidth) Then X2 := SysScreenWidth;{ X2 off screen fix }
-   If (Y2 < 0) Then Y2 := 0;                          { Y2 negative fix }
-   If (Y2 > SysScreenHeight) Then
-     Y2 := SysScreenHeight;                           { Y2 off screen fix }
-   ViewPort.X1 := X1;                                 { Set X1 port value }
-   ViewPort.Y1 := Y1;                                 { Set Y1 port value }
-   ViewPort.X2 := X2;                                 { Set X2 port value }
-   ViewPort.Y2 := Y2;                                 { Set Y2 port value }
-   ViewPort.Clip := Clip;                             { Set port clip value }
-   Cxp := X1;                                         { Set current x pos }
-   Cyp := Y1;                                         { Set current y pos }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then GetMaxX := SysScreenWidth-1       { Screen width }
+     Else GetMaxX := Graph.GetMaxX;                   { Call graph func }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
+   GetMaxX := SysScreenWidth-1;                       { Screen width }
+   {$ENDIF}
 END;
 
+{---------------------------------------------------------------------------}
+{  GetMaxY - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB          }
+{---------------------------------------------------------------------------}
+FUNCTION GetMaxY (TextMode: Boolean): Integer;
+BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then GetMaxY := SysScreenHeight-1      { Screen height }
+     Else GetMaxY := Graph.GetMaxY;                   { Call graph func }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
+   GetMaxY := SysScreenHeight-1;                      { Screen height }
+   {$ENDIF}
+END;
+
+{$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
+PROCEDURE SetColor(Color: Word);
+BEGIN
+   Graph.SetColor(Color);                             { Call graph proc }
+END;
+
+PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
+BEGIN
+   Graph.SetFillStyle(Pattern, Color);                { Call graph proc }
+END;
+
+PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Bar(X1, Y1, X2, Y2);                         { Call graph proc }
+END;
+
+PROCEDURE Line(X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Line(X1, Y1, X2, Y2);                        { Call graph proc }
+END;
+
+PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Rectangle(X1, Y1, X2, Y2);                  { Call graph proc }
+END;
+
+PROCEDURE OutTextXY(X,Y: Integer; TextString: string);
+BEGIN
+   Graph.OutTextXY(X, Y, TextString);                 { Call graph proc }
+END;
+{$ENDIF}
+
 END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 
 
-}
+}

+ 3 - 1
fv/menus.pas

@@ -93,7 +93,9 @@ USES
        WinBase, WinDef,                               { Standard units }
      {$ENDIF}
    {$ENDIF}
-   GFVGraph, Objects, Drivers, Views;                 { GFV standard units }
+
+   GFVGraph,                                          { GFV standard unit }
+   Objects, Drivers, Views;                           { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }

+ 20 - 4
fv/platform.inc

@@ -6,9 +6,9 @@
 {    Parts Copyright (c) 1997 by Balazs Scheidler          }
 {    [email protected]                                     }
 {                                                          }
-{    Parts Copyright (c) 1999 by Leon de Boer              }
+{    Parts Copyright (c) 1999, 2000 by Leon de Boer        }
 {    [email protected]  - primary e-mail address       }
-{    ldeboer@starwon.com.au - backup e-mail address        }
+{    ldeboer@projectent.com.au - backup e-mail address     }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -54,6 +54,7 @@
 {  1.3     13 Jun 99  LdB    Sybil 2.0 undef BP_VMT link   }
 {  1.31    03 Nov 99  LdB    FPC windows defines WIN32     }
 {  1.32    04 Nov 99  LdB    Delphi 5 definitions added    }
+{  1.33    16 Oct 00  LdB    WIN32/WIN16 defines added     }
 {**********************************************************}
 
 { ****************************************************************************
@@ -341,11 +342,26 @@ FOR FPC THESE ARE THE TRANSLATIONS
   {$ENDIF}
 {$ENDIF}
 
+{---------------------------------------------------------------------------}
+{  WIN16 AND WIN32 set if in windows - Updated 16Oct2000 LdB                }
+{---------------------------------------------------------------------------}
+{$IFDEF OS_WINDOWS}                                   { WINDOWS SYSTEM }
+  {$IFDEF BIT_16}
+    {$DEFINE WIN16}                                   { 16 BIT WINDOWS }
+  {$ENDIF}
+  {$IFDEF BIT_32}
+    {$DEFINE WIN32}                                   { 32 BIT WINDOWS }
+  {$ENDIF}
+{$ENDIF}
+
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 
-}
+}

+ 5 - 2
fv/validate.pas

@@ -1001,7 +1001,7 @@ END;
 {  Lookup -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 18May98 LdB            }
 {---------------------------------------------------------------------------}
 FUNCTION TStringLookUpValidator.Lookup (Const S: String): Boolean;
-VAR Index: Integer;
+{$IFDEF PPC_VIRTUAL} VAR Index: LongInt; {$ELSE} VAR Index: Integer; {$ENDIF}
 BEGIN
    Lookup := False;                                   { Preset false return }
    If (Strings <> Nil) Then
@@ -1058,7 +1058,10 @@ END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 

+ 248 - 141
fv/views.pas

@@ -95,7 +95,8 @@ USES
      OS2Def, OS2Base, OS2PMAPI,                       { Standard units }
    {$ENDIF}
 
-   Common, GFVGraph, Objects, Drivers;                { GFV standard units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Objects, Drivers;                          { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -310,7 +311,7 @@ CONST
 
 {$IFDEF BIT_16}                                       { WINDOWS 16 BIT CODE }
 {---------------------------------------------------------------------------}
-{              WIN16 LABEL CONSTANTS FOR WINDOW PROPERTY CALLS              }
+{             WIN16 LABEL CONSTANTS FOR WINDOW PROPERTY CALLS               }
 {---------------------------------------------------------------------------}
 CONST
    ViewSeg = 'TVWINSEG'+#0;                           { View segment label }
@@ -319,7 +320,7 @@ CONST
 
 {$IFDEF BIT_32}                                       { WINDOWS 32 BIT CODE }
 {---------------------------------------------------------------------------}
-{             WIN32/NT LABEL CONSTANTS FOR WINDOW PROPERTY CALLS            }
+{            WIN32/NT LABEL CONSTANTS FOR WINDOW PROPERTY CALLS             }
 {---------------------------------------------------------------------------}
 CONST
    ViewPtr = 'TVWINPTR'+#0;                           { View ptr label }
@@ -388,37 +389,40 @@ TYPE
 {---------------------------------------------------------------------------}
    PView = ^TView;
    TView = OBJECT (TObject)
-         GrowMode  : Byte;                            { View grow mode }
-         DragMode  : Byte;                            { View drag mode }
-         DrawMask  : Byte;                            { Draw masks }
-         TabMask   : Byte;                            { Tab move masks }
-         ColourOfs : Integer;                         { View palette offset }
-         HelpCtx   : Word;                            { View help context }
-         State     : Word;                            { View state masks }
-         Options   : Word;                            { View options masks }
-         EventMask : Word;                            { View event masks }
-         GOptions  : Word;                            { Graphics options }
-         Origin    : TPoint;                          { View origin }
-         Size      : TPoint;                          { View size }
-         Cursor    : TPoint;                          { Cursor position }
-         RawOrigin : TPoint;                          { View raw origin }
-         RawSize   : TPoint;                          { View raw size }
-         Next      : PView;                           { Next peerview }
-         Owner     : PGroup;                          { Owner group }
-         HoldLimit : PComplexArea;                    { Hold limit values }
+         GrowMode : Byte;                             { View grow mode }
+         DragMode : Byte;                             { View drag mode }
+         DrawMask : Byte;                             { Draw masks }
+         TabMask  : Byte;                             { Tab move masks }
+         ColourOfs: Integer;                          { View palette offset }
+         HelpCtx  : Word;                             { View help context }
+         State    : Word;                             { View state masks }
+         Options  : Word;                             { View options masks }
+         EventMask: Word;                             { View event masks }
+         GOptions : Word;                             { Graphics options }
+         Origin   : TPoint;                           { View origin }
+         Size     : TPoint;                           { View size }
+         Cursor   : TPoint;                           { Cursor position }
+         RawOrigin: TPoint;                           { View raw origin }
+         RawSize  : TPoint;                           { View raw size }
+         Next     : PView;                            { Next peerview }
+         Owner    : PGroup;                           { Owner group }
+         HoldLimit: PComplexArea;                     { Hold limit values }
+
+         RevCol    : Boolean;
+
          {$IFDEF OS_WINDOWS}                          { WIN/NT DATA ONLY }
-         ExStyle   : LongInt;                         { Extended style }
-         Dc        : HDc;                             { Device context }
+         ExStyle  : LongInt;                          { Extended style }
+         Dc       : HDc;                              { Device context }
          {$ENDIF}
          {$IFDEF OS_OS2}                              { OS2 DATA ONLY }
-         lStyle    : LongInt;                         { Style }
-         Client    : HWnd;                            { Client handle }
-         Ps        : HPs;                             { Paint structure }
+         lStyle   : LongInt;                          { Style }
+         Client   : HWnd;                             { Client handle }
+         Ps       : HPs;                              { Paint structure }
          {$ENDIF}
          {$IFNDEF OS_DOS}                             { WIN/NT/OS2 DATA ONLY }
-         FrameSize : Integer;                         { Frame size (X) }
-         CaptSize  : Integer;                         { Caption size (Y) }
-         HWindow   : HWnd;                            { Window handle }
+         FrameSize: Integer;                          { Frame size (X) }
+         CaptSize : Integer;                          { Caption size (Y) }
+         HWindow  : HWnd;                             { Window handle }
          {$ENDIF}
       CONSTRUCTOR Init (Var Bounds: TRect);
       CONSTRUCTOR Load (Var S: TStream);
@@ -823,11 +827,12 @@ TYPE TColorRef = LongInt;                             { TColorRef defined }
 {$ENDIF}
 
 {$IFDEF PPC_SPEED}                                    { SPEEDSOFT SYBIL2+ }
-TYPE TColorRef = LongInt;                             { TColorRef defined }
-     TPaintStruct = PaintStruct;
-     TWindowPos = WindowPos;
-     TSize = Size;
-     TWndClass = WndClass;
+TYPE
+   TColorRef = LongInt;                               { TColorRef defined }
+   TPaintStruct = PaintStruct;                        { TPaintStruct define }
+   TWindowPos = WindowPos;                            { TWindowPos defined }
+   TSize = Size;                                      { TSize defined }
+   TWndClass = WndClass;                              { TWndClass defined }
 {$ENDIF}
 
 {---------------------------------------------------------------------------}
@@ -1088,7 +1093,7 @@ BEGIN
          Event.What := evMouseDown;                   { Mouse down event }
          Event.Double := True;                        { Double click }
          MouseButtons := MouseButtons OR
-           mbLeftButton;                              { Set button mask }
+           mbRightButton;                             { Set button mask }
        End;
        WM_MButtonDown: Begin                          { MIDDLE MOUSE DOWN }
          Event.What := evMouseDown;                   { Mouse down event }
@@ -1122,11 +1127,6 @@ BEGIN
            MouseButtons := MouseButtons OR
              mbRightButton;                           { Set right button mask }
        End;
-       {$IFDEF BIT_32}
-       WM_Notify: Begin
-         I := 0;
-       End;
-       {$ENDIF}
        WM_EraseBkGnd: TvViewMsgHandler := 1;          { BACKGROUND MESSAGE }
        WM_Paint: If (P^.Dc = 0) Then Begin            { PAINT MESSAGE }
          P^.Dc := BeginPaint(Wnd, Ps);                { Fetch structure }
@@ -1929,7 +1929,7 @@ BEGIN
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (State AND sfIconised = 0) Then Begin              { View not iconised }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
@@ -2028,15 +2028,18 @@ END;
 PROCEDURE TView.DrawBorder;
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE ONLY }
-   BiColorRectangle(0, 0, RawSize.X, RawSize.Y, White,
-     DarkGray, False);                                { Draw 3d effect }
-   If (GOptions AND goThickFramed <> 0) Then Begin    { Thick frame at work }
-     GraphRectangle(1, 1, RawSize.X-1, RawSize.Y-1,
-       LightGray);                                    { Draw frame part 1 }
-     GraphRectangle(2, 2, RawSize.X-2, RawSize.Y-2,
-       LightGray);                                    { Fraw frame part 2 }
-     BiColorRectangle(3, 3, RawSize.X-3, RawSize.Y-3,
-       White, DarkGray, True);                        { Draw highlights }
+   If (TextModeGFV = FALSE) Then Begin                { GRAPHICS GFV MODE }
+     BiColorRectangle(0, 0, RawSize.X, RawSize.Y,
+       White, DarkGray, False);                       { Draw 3d effect }
+     If (GOptions AND goThickFramed <> 0) Then Begin  { Thick frame at work }
+       GraphRectangle(1, 1, RawSize.X-1, RawSize.Y-1,
+         LightGray);                                  { Draw frame part 1 }
+       GraphRectangle(2, 2, RawSize.X-2, RawSize.Y-2,
+         LightGray);                                  { Fraw frame part 2 }
+       BiColorRectangle(3, 3, RawSize.X-3, RawSize.Y-3,
+         White, DarkGray, True);                      { Draw highlights }
+     End;
+   End Else Begin                                     { TEXT GFV MODE }
    End;
    {$ENDIF}
 END;
@@ -2093,7 +2096,7 @@ VAR X1, Y1, X2, Y2: Integer; P: PGroup; ViewPort: ViewPortType; Ca: PComplexArea
 BEGIN
    If (MaxAvail >= SizeOf(TComplexArea)) Then Begin   { Check enough memory }
      GetMem(Ca, SizeOf(TComplexArea));                { Allocate memory }
-     GetViewSettings(ViewPort);                       { Fetch view port }
+     GetViewSettings(ViewPort, TextModeGFV);          { Fetch view port }
      Ca^.X1 := ViewPort.X1;                           { Hold current X1 }
      Ca^.Y1 := ViewPort.Y1;                           { Hold current Y1 }
      Ca^.X2 := ViewPort.X2;                           { Hold current X2 }
@@ -2126,7 +2129,7 @@ BEGIN
        If (X2 > ViewPort.X2) Then X2 := ViewPort.X2;  { Adjust x2 to locked }
        If (Y2 > ViewPort.Y2) Then Y2 := ViewPort.Y2;  { Adjust y2 to locked }
      End;
-     SetViewPort(X1, Y1, X2, Y2, ClipOn);             { Set new clip limits }
+     SetViewPort(X1, Y1, X2, Y2, ClipOn, TextModeGFV);{ Set new clip limits }
    End;
 END;
 
@@ -2135,13 +2138,14 @@ END;
 {---------------------------------------------------------------------------}
 PROCEDURE TView.DrawBackGround;
 VAR Bc: Byte; X1, Y1, X2, Y2: Integer; ViewPort: ViewPortType;
+{$IFDEF OS_DOS} X, Y: Integer; {$ENDIF}
 {$IFDEF OS_OS2} Ptl: PointL; {$ENDIF}
 BEGIN
    If (GOptions AND goNoDrawView = 0) Then Begin      { Non draw views exit }
      If (State AND sfDisabled = 0) Then
        Bc := GetColor(1) AND $F0 SHR 4 Else           { Select back colour }
        Bc := GetColor(4) AND $F0 SHR 4;               { Disabled back colour }
-     GetViewSettings(ViewPort);                       { Get view settings }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get view settings }
      If (ViewPort.X1 <= RawOrigin.X) Then X1 := 0     { Right to left edge }
        Else X1 := ViewPort.X1-RawOrigin.X;            { Offset from left }
      If (ViewPort.Y1 <= RawOrigin.Y) Then Y1 := 0     { Right to top edge }
@@ -2153,8 +2157,23 @@ BEGIN
        Y2 := RawSize.Y Else                           { Right to bottom edge }
        Y2 := ViewPort.Y2-RawOrigin.Y;                 { Offset from bottom }
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       SetFillStyle(SolidFill, Bc);                   { Set fill colour }
-       Bar(0, 0, X2-X1, Y2-Y1);                       { Clear the area }
+       If (TextModeGFV <> True) Then Begin            { GRAPHICS MODE GFV }
+         SetFillStyle(SolidFill, Bc);                 { Set fill colour }
+         Bar(0, 0, X2-X1, Y2-Y1);                     { Clear the area }
+       End Else Begin                                 { TEXT MODE GFV }
+         X1 := (RawOrigin.X+X1) DIV SysFontWidth;
+         Y1 := (RawOrigin.Y+Y1) DIV SysFontHeight;
+         X2 := (RawOrigin.X+X2) DIV SysFontWidth;
+         Y2 := (RawOrigin.Y+Y2) DIV SysFontHeight;
+         If (State AND sfDisabled = 0) Then
+           Bc := GetColor(1) Else           { Select back colour }
+           Bc := GetColor(4);               { Disabled back colour }
+         For Y := Y1 To Y2 Do
+           For X := X1 To X2 Do Begin
+             Mem[$B800:$0+(Y*ScreenWidth+X)*2] := $20;
+             Mem[$B800:$0+(Y*ScreenWidth+X)*2+1] := Bc;
+           End;
+       End;
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
      If (Dc <> 0) Then Begin                          { Valid device context }
@@ -2186,7 +2205,8 @@ BEGIN
    P := HoldLimit;                                    { Transfer pointer }
    If (P <> Nil) Then Begin                           { Valid complex area }
      HoldLimit := P^.NextArea;                        { Move to prior area }
-     SetViewPort(P^.X1, P^.Y1, P^.X2, P^.Y2, ClipOn); { Restore clip limits }
+     SetViewPort(P^.X1, P^.Y1, P^.X2, P^.Y2, ClipOn,
+       TextModeGFV);                                  { Restore clip limits }
      FreeMem(P, SizeOf(TComplexArea));                { Release memory }
    End;
 END;
@@ -2317,14 +2337,14 @@ END;
 PROCEDURE TView.ReDrawArea (X1, Y1, X2, Y2: Integer);
 VAR HLimit: PView; ViewPort: ViewPortType;
 BEGIN
-   GetViewSettings(ViewPort);                         { Hold view port }
-   SetViewPort(X1, Y1, X2, Y2, ClipOn);               { Set new clip limits }
+   GetViewSettings(ViewPort, TextModeGFV);            { Hold view port }
+   SetViewPort(X1, Y1, X2, Y2, ClipOn, TextModeGFV);  { Set new clip limits }
    HLimit := LimitsLocked;                            { Hold lock limits }
    LimitsLocked := @Self;                             { We are the lock view }
    DrawView;                                          { Redraw the area }
    LimitsLocked := HLimit;                            { Release our lock }
    SetViewPort(ViewPort.X1, ViewPort.Y1,
-     ViewPort.X2, ViewPort.Y2, ClipOn);               { Reset old limits }
+     ViewPort.X2, ViewPort.Y2, ClipOn, TextModeGFV);  { Reset old limits }
 END;
 
 {--TView--------------------------------------------------------------------}
@@ -4329,7 +4349,7 @@ BEGIN
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (Max <> Min) Then Begin                            { View has some size }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}
@@ -4369,7 +4389,7 @@ BEGIN
    If (State AND sfVisible <> 0) AND                  { View is visible }
    (State AND sfExposed <> 0) Then Begin              { View is exposed }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}
@@ -4584,13 +4604,14 @@ END;
 {---------------------------------------------------------------------------}
 FUNCTION TListViewer.GetText (Item: Integer; MaxLen: Integer): String;
 BEGIN                                                 { Abstract method }
+   GetText := '';                                     { Return empty }
 END;
 
 {--TListViewer--------------------------------------------------------------}
 {  DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB    }
 {---------------------------------------------------------------------------}
 PROCEDURE TListViewer.DrawBackGround;
-VAR SCOff: Byte; I, J, ColWidth, Item, Indent, CurCol: Integer; Color: Word;
+VAR  I, J, ColWidth, Item, Indent, CurCol: Integer; Color: Word;
     Text: String; B: TDrawBuffer;
     {$IFDEF OS_WINDOWS} S: String; {$ENDIF}           { WIN/NT CODE }
 
@@ -4643,9 +4664,9 @@ BEGIN
          MoveStr(B[CurCol+1], Text, Color);           { Transfer to buffer }
          If ShowMarkers Then Begin
            WordRec(B[CurCol]).Lo := Byte(
-             SpecialChars[SCOff]);                    { Set marker character }
+             SpecialChars[4]);                        { Set marker character }
            WordRec(B[CurCol+ColWidth-2]).Lo := Byte(
-             SpecialChars[SCOff+1]);                  { Set marker character }
+             SpecialChars[5]);                        { Set marker character }
          End;
        End;
        MoveChar(B[CurCol+ColWidth-1], #179,
@@ -4659,13 +4680,12 @@ END;
 {  DrawFocus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB         }
 {---------------------------------------------------------------------------}
 PROCEDURE TListViewer.DrawFocus;
-VAR DrawIt: Boolean; I, J, Item, CurCol, ColWidth: Integer;
+VAR DrawIt: Boolean; SCOff: Byte; I, J, Item, CurCol, ColWidth: Integer;
     Color: Word;
 
   Indent: Integer;
   B: TDrawBuffer;
-  Text,S: String;
-  SCOff: Byte;
+  Text: String;
 BEGIN
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (GOptions AND goNativeClass <> 0) Then Exit;    { Native class exits }
@@ -5462,7 +5482,7 @@ END;
 FUNCTION TView.Exposed: Boolean;
 VAR ViewPort: ViewPortType;
 BEGIN
-   GetViewSettings(ViewPort);                         { Fetch viewport }
+   GetViewSettings(ViewPort, TextModeGFV);            { Fetch viewport }
    If (State AND sfVisible<>0) AND                    { View visible }
      (State AND sfExposed<>0) AND                     { View exposed }
      OverlapsArea(ViewPort.X1, ViewPort.Y1,
@@ -5479,11 +5499,14 @@ VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}  { DOS/DPMI VARIABLES }
     {$IFDEF OS_OS2} I: LongInt; Lp: PointL; OPs: HPs; {$ENDIF}{ OS2 VARIABLES }
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   GetViewSettings(ViewPort);                         { Get viewport settings }
-   SetColor(Colour);                                  { Set line colour }
-   Line(RawOrigin.X + X1 - ViewPort.X1,
-     RawOrigin.Y + Y1 - ViewPort.Y1, RawOrigin.X + X2
-     - ViewPort.X1, RawOrigin.Y + Y2-ViewPort.Y1);    { Draw the line }
+   GetViewSettings(ViewPort, TextModeGFV);            { Get viewport settings }
+   If (TextModeGFV <> TRUE) Then Begin
+     SetColor(Colour);                                { Set line colour }
+     Line(RawOrigin.X + X1 - ViewPort.X1,
+       RawOrigin.Y + Y1 - ViewPort.Y1, RawOrigin.X + X2
+       - ViewPort.X1, RawOrigin.Y + Y2-ViewPort.Y1);  { Draw the line }
+   End Else Begin                                     { LEON???? }
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5549,11 +5572,14 @@ VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   SetColor(Colour);                                  { Set line colour }
-   GetViewSettings(ViewPort);
-   Rectangle(RawOrigin.X + X1 - ViewPort.X1, RawOrigin.Y + Y1
-     - ViewPort.Y1, RawOrigin.X + X2 - ViewPort.X1,
-     RawOrigin.Y+Y2-ViewPort.Y1);                     { Draw a rectangle }
+   If (TextModeGFV <> TRUE) Then Begin                { GRAPHICS MODE GFV }
+     SetColor(Colour);                                { Set line colour }
+     GetViewSettings(ViewPort, TextModeGFV);
+     Rectangle(RawOrigin.X + X1 - ViewPort.X1, RawOrigin.Y + Y1
+       - ViewPort.Y1, RawOrigin.X + X2 - ViewPort.X1,
+       RawOrigin.Y+Y2-ViewPort.Y1);                   { Draw a rectangle }
+   End Else Begin                                     { LEON???? }
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5619,16 +5645,28 @@ END;
 {  ClearArea -> Platforms DOS/DPMI/WIN/OS2 - Checked 19Sep97 LdB            }
 {---------------------------------------------------------------------------}
 PROCEDURE TView.ClearArea (X1, Y1, X2, Y2: Integer; Colour: Byte);
-VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+VAR {$IFDEF OS_DOS} X, Y: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
     {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   GetViewSettings(ViewPort);                         { Get viewport }
-   SetFillStyle(SolidFill, Colour);                   { Set colour up }
-   Bar(RawOrigin.X+X1-ViewPort.X1, RawOrigin.Y+Y1-
-     ViewPort.Y1, RawOrigin.X+X2-ViewPort.X1,
-     RawOrigin.Y+Y2-ViewPort.Y1);                     { Clear the area }
+   GetViewSettings(ViewPort, TextModeGFV);            { Get viewport }
+   If (TextModeGFV <> TRUE) Then Begin                { GRAPHICAL GFV MODE }
+     SetFillStyle(SolidFill, Colour);                 { Set colour up }
+     Bar(RawOrigin.X+X1-ViewPort.X1, RawOrigin.Y+Y1-
+       ViewPort.Y1, RawOrigin.X+X2-ViewPort.X1,
+       RawOrigin.Y+Y2-ViewPort.Y1);                   { Clear the area }
+   End Else Begin                                     { TEXT MODE GFV }
+     X1 := (RawOrigin.X+X1) DIV SysFontWidth;
+     Y1 := (RawOrigin.Y+Y1) DIV SysFontHeight;
+     X2 := (RawOrigin.X+X2) DIV SysFontWidth;
+     Y2 := (RawOrigin.Y+Y2) DIV SysFontHeight;
+     For Y := Y1 To Y2 Do
+       For X := X1 To X2 Do Begin
+         Mem[$B800:$0+(Y*ScreenWidth+X)*2] := $20;
+         Mem[$B800:$0+(Y*ScreenWidth+X)*2+1] := Colour SHL 4;
+       End;
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5674,7 +5712,7 @@ END;
 PROCEDURE TView.GraphArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad: Integer;
 Colour: Byte);
 CONST RadConv  = 57.2957795130823229;                 { Degrees per radian }
-VAR X1, Y1, X2, Y2: Integer; {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
+VAR X1, Y1, X2, Y2, X3, Y3: Integer; {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
 BEGIN
    {$IFDEF OS_WINDOWS}
    Xc := Xc - FrameSize;
@@ -5688,16 +5726,23 @@ BEGIN
    Y1 := Yc - Round(Cos(Sa)*YRad);                    { Calc 1st y value }
    X2 := Xc + Round(Sin(Sa+Ea)*XRad);                 { Calc 2nd x value }
    Y2 := Yc - Round(Cos(Sa+Ea)*YRad);                 { Calc 2nd y value }
+   X3 := X2;                                          { Use X2 value }
+   Y3 := Y2;                                          { Use Y2 value }
+   If (Abs(Ea) > Pi) Then Begin
+     X3 := Xc + Round(Sin(Sa+Pi)*XRad);               { Calc 3rd x value }
+     Y3 := Yc - Round(Cos(Sa+Pi)*YRad);               { Calc 3rd y value }
+   End;
    {$IFDEF OS_WINDOWS}
    If (HWindow <> 0) Then Begin                       { Valid window }
      ODc := Dc;                                       { Hold device context }
      If (Dc = 0) Then Dc := GetDC(HWindow);           { Create a context }
      SelectObject(Dc, ColPen[Colour]);                { Pen colour }
-     If (XRad > 2 ) AND (YRAd > 2) Then Begin         { Must exceed 2x2 arc }
+     If (Abs(X1-X3) > 1) OR (Abs(Y1-Y3) > 1)          { Must exceed 2x2 arc }
+     Then Begin
        If (Ea < 0) Then
          Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
            X1, Y1, X2, Y2) Else                       { Draw c/clkwise arc }
-         Arc(Dc, Xc-XRad, Yc+YRad, Xc+XRad, Yc-YRad,
+         Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
            X2, Y2, X1, Y1);                           { Draw clockwise arc }
      End;
      If (ODc = 0) Then ReleaseDC(HWindow, Dc);        { Release context }
@@ -5779,7 +5824,7 @@ END;
 
 PROCEDURE TView.WriteBuf (X, Y, W, H: Integer; Var Buf);
 VAR I, J, K, L, CW: Integer; P: PDrawBuffer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+    {$IFDEF OS_DOS} Tix, Tiy: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5795,9 +5840,9 @@ BEGIN
        Y := Y * SysFontHeight;                        { Y graphical adjust }
      End;
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       GetViewSettings(ViewPort);                     { Get current viewport }
-       X := X + RawOrigin.X - ViewPort.X;             { Calc x position }
-       Y := Y + RawOrigin.Y - ViewPort.Y;             { Calc y position }
+       GetViewSettings(ViewPort, TextModeGFV);        { Get current viewport }
+       X := X + RawOrigin.X - ViewPort.X1;            { Calc x position }
+       Y := Y + RawOrigin.Y - ViewPort.Y1;            { Calc y position }
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
        ODc := Dc;                                     { Hold device context }
@@ -5815,11 +5860,18 @@ BEGIN
        For I := 0 To (W-1) Do Begin                   { For each character }
          Cw := TextWidth(Chr(Lo(P^[L])));             { Width of this char }
          {$IFDEF OS_DOS}                              { DOS/DPMI CODE }
-           SetFillStyle(SolidFill, Hi(P^[L]) AND $F0
-             SHR 4);                                  { Set back colour }
-           SetColor(Hi(P^[L]) AND $0F);               { Set text colour }
-           Bar(K, Y, K+Cw, Y+FontHeight-1);           { Clear text backing }
-           OutTextXY(K, Y+2, Chr(Lo(P^[L])));         { Write text char }
+           If (TextModeGFV <> TRUE) Then Begin        { GRAPHICAL MODE GFV }
+             SetFillStyle(SolidFill, Hi(P^[L]) AND
+               $F0 SHR 4);                            { Set back colour }
+             SetColor(Hi(P^[L]) AND $0F);             { Set text colour }
+             Bar(K, Y, K+Cw, Y+FontHeight-1);         { Clear text backing }
+             OutTextXY(K, Y+2, Chr(Lo(P^[L])));       { Write text char }
+           End Else Begin                             { TEXT MODE GFV }
+             Tix := (K + ViewPort.X1) DIV SysFontWidth;
+             Tiy := (Y + 2 + ViewPort.Y1) DIV SysFontHeight;
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Lo(P^[L]);
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := Hi(P^[L]);
+           End;
          {$ENDIF}
          {$IFDEF OS_WINDOWS}                          { WIN/NT CODE }
            SetBkColor(Dc, ColRef[Hi(P^[L]) AND $F0
@@ -5855,7 +5907,7 @@ END;
 
 PROCEDURE TView.WriteLine (X, Y, W, H: Integer; Var Buf);
 VAR I, J, K, Cw: Integer; P: PDrawBuffer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+    {$IFDEF OS_DOS} Tix, Tiy: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5870,9 +5922,9 @@ BEGIN
        Y := Y * SysFontHeight;                        { Y graphical adjust }
      End;
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       GetViewSettings(ViewPort);                     { Get current viewport }
-       X := X + RawOrigin.X - ViewPort.X;             { Calc x position }
-       Y := Y + RawOrigin.Y - ViewPort.Y;             { Calc y position }
+       GetViewSettings(ViewPort, TextModeGFV);        { Get current viewport }
+       X := X + RawOrigin.X - ViewPort.X1;            { Calc x position }
+       Y := Y + RawOrigin.Y - ViewPort.Y1;            { Calc y position }
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
        ODc := Dc;                                     { Hold device context }
@@ -5890,11 +5942,18 @@ BEGIN
        For I := 0 To (W-1) Do Begin                   { For each character }
          Cw := TextWidth(Chr(Lo(P^[I])));             { Width of this char }
          {$IFDEF OS_DOS}                              { DOS/DPMI CODE }
-           SetFillStyle(SolidFill, Hi(P^[I]) AND $F0
-             SHR 4);                                  { Set back colour }
-           SetColor(Hi(P^[I]) AND $0F);               { Set text colour }
-           Bar(K, Y, K+Cw, Y+FontHeight-1);           { Clear text backing }
-           OutTextXY(K, Y+2, Chr(Lo(P^[I])));         { Write text char }
+           If (TextModeGFV <> TRUE) Then Begin        { GRAPHICAL MODE GFV }
+             SetFillStyle(SolidFill, Hi(P^[I]) AND
+               $F0 SHR 4);                            { Set back colour }
+             SetColor(Hi(P^[I]) AND $0F);             { Set text colour }
+             Bar(K, Y, K+Cw, Y+FontHeight-1);         { Clear text backing }
+             OutTextXY(K, Y+2, Chr(Lo(P^[I])));       { Write text char }
+           End Else Begin                             { TEXT MODE GFV }
+             Tix := (K + ViewPort.X1) DIV SysFontWidth;
+             Tiy := (Y + ViewPort.Y1 + 2) DIV SysFontHeight;
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Lo(P^[I]);
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := Hi(P^[I]);
+           End;
          {$ENDIF}
          {$IFDEF OS_WINDOWS}                          { WIN/NT CODE }
            SetBkColor(Dc, ColRef[Hi(P^[I]) AND $F0
@@ -5956,8 +6015,8 @@ BEGIN
 END;
 
 PROCEDURE TView.WriteStr (X, Y: Integer; Str: String; Color: Byte);
-VAR Fc, Bc: Byte; X1, Y1, X2, Y2: Integer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+VAR Fc, Bc, B: Byte; X1, Y1, X2, Y2: Integer;
+    {$IFDEF OS_DOS} Tix, Tiy, Ti: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; P: Pointer; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; P: Pointer; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5969,6 +6028,14 @@ BEGIN
      Fc := GetColor(Color);                           { Get view color }
      Bc := Fc AND $F0 SHR 4;                          { Calc back colour }
      Fc := Fc AND $0F;                                { Calc text colour }
+
+     If RevCol Then Begin
+       B := Bc;
+       Bc := Fc;
+       Fc := B;
+     End;
+
+
      {$IFDEF OS_DOS}
      If (X >= 0) AND (Y >= 0) Then Begin
        X := RawOrigin.X+X*FontWidth;                    { X position }
@@ -5977,12 +6044,23 @@ BEGIN
        X := RawOrigin.X + Abs(X);
        Y := RawOrigin.Y + Abs(Y);
      End;
-     GetViewSettings(ViewPort);
-     SetFillStyle(SolidFill, Bc);                     { Set fill style }
-     Bar(X-ViewPort.X1, Y-ViewPort.Y1,
-       X-ViewPort.X1+Length(Str)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
-     SetColor(Fc);
-     OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1+2, Str);    { Write text char }
+     GetViewSettings(ViewPort, TextModeGFV);
+     If (TextModeGFV <> TRUE) Then Begin              { GRAPHICAL MODE GFV }
+       SetFillStyle(SolidFill, Bc);                   { Set fill style }
+       Bar(X-ViewPort.X1, Y-ViewPort.Y1,
+         X-ViewPort.X1+Length(Str)*FontWidth,
+         Y-ViewPort.Y1+FontHeight-1);
+       SetColor(Fc);
+       OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1+2, Str);{ Write text char }
+     End Else Begin                                   { TEXT MODE GFV }
+       Tix := X DIV SysFontWidth;
+       Tiy := Y DIV SysFontHeight;
+       For Ti := 1 To length(Str) Do Begin
+         Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Ord(Str[Ti]);
+         Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := GetColor(Color);
+         Tix := Tix + SysFontWidth;
+       End;
+     End;
      {$ENDIF}
      {$IFDEF OS_WINDOWS}
      If (HWindow <> 0) Then Begin
@@ -6062,12 +6140,14 @@ END;
 
 PROCEDURE TView.WriteChar (X, Y: Integer; C: Char; Color: Byte;
   Count: Integer);
-VAR Fc, Bc: Byte; I: Integer; Col: Word; S: String; ViewPort: ViewPortType;
+{$IFDEF OS_DOS}
+VAR Fc, Bc: Byte; I, Ti, Tix, Tiy: Integer; Col: Word; S: String; ViewPort: ViewPortType;
+{$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}
    If (State AND sfVisible <> 0) AND                  { View visible }
    (State AND sfExposed <> 0) Then Begin              { View exposed }
-     GetViewSettings(ViewPort);
+     GetViewSettings(ViewPort, TextModeGFV);
      Col := GetColor(Color);                          { Get view color }
      Fc := Col AND $0F;                               { Foreground colour }
      Bc := Col AND $F0 SHR 4;                         { Background colour }
@@ -6077,11 +6157,22 @@ BEGIN
      While (Count>0) Do Begin
        If (Count>255) Then I := 255 Else I := Count;  { Size to make }
        S[0] := Chr(I);                                { Set string length }
-       SetFillStyle(SolidFill, Bc);                   { Set fill style }
-       Bar(X-ViewPort.X1, Y-ViewPort.Y1,
-         X-ViewPort.X1+Length(S)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
-       SetColor(Fc);
-       OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1, S);    { Write text char }
+       If (TextModeGFV <> TRUE) Then Begin            { GRAPHICAL MODE GFV }
+         SetFillStyle(SolidFill, Bc);                 { Set fill style }
+         Bar(X-ViewPort.X1, Y-ViewPort.Y1,
+           X-ViewPort.X1+Length(S)*FontWidth,
+           Y-ViewPort.Y1+FontHeight-1);
+         SetColor(Fc);
+         OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1, S);  { Write text char }
+       End Else Begin                                 { TEXT MODE GFV }
+         Tix := X DIV SysFontWidth;
+         Tiy := Y DIV SysFontHeight;
+         For Ti := 1 To length(S) Do Begin
+           Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Ord(S[Ti]);
+           Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := GetColor(Color);
+           Tix := Tix + SysFontWidth;
+         End;
+       End;
        Count := Count - I;                            { Subtract count }
        X := X + I*FontWidth;                          { Move x position }
      End;
@@ -6155,9 +6246,9 @@ BEGIN
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
      HideMouseCursor;                                 { Hide the mouse }
      {$ENDIF}
-     SetWriteMode(XORPut);
+     SetWriteMode(XORPut, TextModeGFV);
      GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-     SetWriteMode(NormalPut);
+     SetWriteMode(NormalPut, TextModeGFV);
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
      ShowMouseCursor;                                 { Show the mouse }
      {$ENDIF}
@@ -6182,13 +6273,13 @@ BEGIN
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
        HideMouseCursor;                               { Hide the mouse }
        {$ENDIF}
-       SetWriteMode(XORPut);
+       SetWriteMode(XORPut, TextModeGFV);
        GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-       SetWriteMode(NormalPut);
+       SetWriteMode(NormalPut, TextModeGFV);
        MoveGrow(R, Mouse);                            { Resize the view }
-       SetWriteMode(XORPut);
+       SetWriteMode(XORPut, TextModeGFV);
        GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-       SetWriteMode(NormalPut);
+       SetWriteMode(NormalPut, TextModeGFV);
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
        ShowMouseCursor;                               { Show the mouse }
        {$ENDIF}
@@ -6495,7 +6586,8 @@ BEGIN
 END;
 
 PROCEDURE TWindow.DrawBorder;
-VAR Fc, Bc: Byte; X, Y: Integer; S: String; ViewPort: ViewPortType;
+{$IFDEF OS_DOS} VAR Fc, Bc: Byte; X, Y: Integer; S: String;
+ViewPort: ViewPortType; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}
    Fc := GetColor(2) AND $0F;                        { Foreground colour }
@@ -6506,28 +6598,40 @@ BEGIN
    ClearArea(0, Y, RawSize.X, Y+FontHeight, Bc);      { Clear background }
    If (Title<>Nil) AND (GOptions AND goTitled<>0)
    Then Begin                                         { View has a title }
-     GetViewSettings(ViewPort);
+     GetViewSettings(ViewPort, TextModeGFV);
      X := (RawSize.X DIV 2);                          { Half way point }
      X := X - (Length(Title^)*FontWidth) DIV 2;       { Calc start point }
-     SetColor(Fc);
-     OutTextXY(RawOrigin.X+X-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, Title^);          { Write the title }
+     If (TextModeGFV <> TRUE) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(Fc);
+       OutTextXY(RawOrigin.X+X-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, Title^);      { Write the title }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    If (Number>0) AND (Number<10) Then Begin           { Valid number }
      Str(Number, S);                                  { Make number string }
-     SetColor(GetColor(2) AND $0F);
-     OutTextXY(RawOrigin.X+RawSize.X-2*FontWidth-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, S);               { Write number }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(GetColor(2) AND $0F);
+       OutTextXY(RawOrigin.X+RawSize.X-2*FontWidth-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, S);           { Write number }
+     End Else Begin                                   { LEON ????? }
+     End;
    End;
    If (Flags AND wfClose<>0) Then Begin               { Close icon request }
-     SetColor(Fc);
-     OutTextXY(RawOrigin.X+Y+FontWidth-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, '[*]');           { Write close icon }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(Fc);
+       OutTextXY(RawOrigin.X+Y+FontWidth-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, '[*]');       { Write close icon }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    If (Flags AND wfZoom<>0) Then Begin
-     SetColor(GetColor(2) AND $0F);
-     OutTextXY(RawOrigin.X+RawSize.X-4*FontWidth-Y-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, '['+#24+']');     { Write zoom icon }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(GetColor(2) AND $0F);
+       OutTextXY(RawOrigin.X+RawSize.X-4*FontWidth-Y-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, '['+#24+']'); { Write zoom icon }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    BiColorRectangle(Y+1, Y+1, RawSize.X-Y-1, Y+FontHeight,
      White, DarkGray, False);                         { Draw 3d effect }
@@ -6628,7 +6732,10 @@ END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 

+ 34 - 29
fvision/app.pas

@@ -100,7 +100,8 @@ USES
      Os2Def, Os2Base, OS2PmApi,                       { Standard units }
    {$ENDIF}
 
-   Common, Memory, GFVGraph,                          { GFV standard units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Memory,                                    { GFV standard units }
    Objects, Drivers, Views, Menus, HistList, Dialogs; { GFV standard units }
 
 {***************************************************************************}
@@ -139,6 +140,7 @@ CONST
 {---------------------------------------------------------------------------}
 CONST
   { Turbo Vision 1.0 Color Palettes }
+
    CColor =
          #$81#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
      #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
@@ -160,7 +162,8 @@ CONST
    { Turbo Vision 2.0 Color Palettes }
 
    CAppColor =
-         #$81#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
+         {$IFDEF OS_WINDOWS}#$81+{$ELSE}#$71+{$ENDIF}
+         #$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
      #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
      #$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E#$20#$2B#$2F#$78#$2E#$70#$30 +
      #$3F#$3E#$1F#$2F#$1A#$20#$72#$31#$31#$30#$2F#$3E#$31#$13#$38#$00 +
@@ -423,8 +426,7 @@ CONST Pending: TEvent = (What: evNothing);            { Pending event }
 {---------------------------------------------------------------------------}
 FUNCTION TvAppMsgHandler (Wnd: hWnd; iMessage, wParam: Sw_Word;
 lParam: LongInt): LongInt; {$IFDEF BIT_16} EXPORT; {$ELSE} STDCALL; {$ENDIF}
-VAR Li: LongInt; Min, MAx: TPoint; Event: TEvent; P: PView; Wp: ^TWindowPos;
-    Mm: ^TMinMaxInfo;
+VAR Event: TEvent; P: PView; Mm: ^TMinMaxInfo;
 BEGIN
    {$IFDEF BIT_16}                                    { 16 BIT CODE }
    PtrRec(P).Seg := GetProp(Wnd, ViewSeg);            { Fetch seg property }
@@ -566,13 +568,15 @@ BEGIN
    GetPalette := @P;                                  { Return palette }
 END;
 
-procedure TBackground.DrawbackGround;
-var
-  B: TDrawBuffer;
-begin
-  MoveChar(B, Pattern, GetColor($01), Size.X);
-  WriteLine(0, 0, Size.X, Size.Y, B);
-end;
+{--TBackGround--------------------------------------------------------------}
+{  DrawBackground -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB    }
+{---------------------------------------------------------------------------}
+PROCEDURE TBackground.DrawBackground;
+VAR B: TDrawBuffer;
+BEGIN
+   MoveChar(B, Pattern, GetColor($01), Size.X);       { Fill draw buffer }
+   WriteLine(0, 0, Size.X, Size.Y, B);                { Draw to area }
+END;
 
 {--TBackGround--------------------------------------------------------------}
 {  Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB             }
@@ -594,7 +598,6 @@ CONSTRUCTOR TDesktop.Init (Var Bounds: Objects.TRect);
 BEGIN
    Inherited Init(Bounds);                            { Call ancestor }
    GrowMode := gfGrowHiX + gfGrowHiY;                 { Set growmode }
-   {GOptions := GOptions AND NOT goNoDrawView;}         { This group draws }
    InitBackground;                                    { Create background }
    If (Background <> Nil) Then Insert(Background);    { Insert background }
 END;
@@ -622,9 +625,9 @@ END;
 PROCEDURE TDesktop.InitBackground;
 {$IFNDEF OS_WINDOWS} CONST Ch: Char = #176; {$ELSE} CONST Ch: Char = #167; {$ENDIF}
 VAR R: TRect;
-BEGIN                                                 { Compatability only }
-   getExtent(R);
-   BackGround := New(PbackGround, Init(R, Ch));
+BEGIN
+   GetExtent(R);                                      { Get desktop extents }
+   BackGround := New(PBackground, Init(R, Ch));       { Insert a background }
 END;
 
 {--TDesktop-----------------------------------------------------------------}
@@ -784,11 +787,8 @@ VAR I: Integer; R: TRect; {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
 BEGIN
    Application := @Self;                              { Set application ptr }
    InitScreen;                                        { Initialize screen }
-  { R.Assign(0, 0, ScreenWidth, ScreenHeight); }        { Full screen area }
-   R.A.X := 0;
-   R.A.Y := 0;
-   R.B.X := -(SysScreenWidth);
-   R.B.Y := -(SysScreenHeight);
+   R.Assign(0, 0, -(GetMaxX(TextModeGFV)+1),
+     -(GetMaxY(TextModeGFV)+1));                      { Full screen area }
    Inherited Init(R);                                 { Call ancestor }
    State := sfVisible + sfSelected + sfFocused +
       sfModal + sfExposed;                            { Deafult states }
@@ -808,11 +808,11 @@ BEGIN
    CreateWindowNow(swp_Show);                         { Create app window }
    {$ENDIF}
    {$IFNDEF OS_DOS}                                   { WIN/NT/OS2 CODE }
-   AppWindow := HWindow;
-   Size.X := ScreenWidth;
-   Size.Y := ScreenHeight;
-   RawSize.X := ScreenWidth * SysFontWidth;
-   RawSize.Y := ScreenHeight * SysFontHeight - 1;
+   AppWindow := HWindow;                              { Set app window handle }
+   Size.X := ScreenWidth;                             { Set x size value }
+   Size.Y := ScreenHeight;                            { Set y size value }
+   RawSize.X := ScreenWidth * SysFontWidth;           { Set rawsize x }
+   RawSize.Y := ScreenHeight * SysFontHeight - 1;     { Set rawsize y }
    {$ENDIF}
    InitStatusLine;                                    { Init status line }
    If (StatusLine <> Nil) Then Insert(StatusLine);    { Insert status line }
@@ -837,8 +837,10 @@ BEGIN
   {$IFDEF OS_WINDOWS}                                 { WIN/NT CODE }
    For I := 0 To 15 Do DeleteObject(ColBrush[I]);     { Delete brushes }
    For I := 0 To 15 Do DeleteObject(ColPen[I]);       { Delete pens }
-   AppWindow := 0;                                    { Zero app window }
-   {$ENDIF}
+  {$ENDIF}
+  {$IFNDEF OS_DOS}                                    { WIN/NT/OS2 CODE }
+   AppWindow := 0;                                    { Zero app window handle }
+  {$ENDIF}
 END;
 
 {--TProgram-----------------------------------------------------------------}
@@ -1041,7 +1043,7 @@ END;
 {  HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB       }
 {---------------------------------------------------------------------------}
 PROCEDURE TProgram.HandleEvent (Var Event: TEvent);
-VAR I: Word; C: Char;
+VAR C: Char;
 BEGIN
    If (Event.What = evKeyDown) Then Begin             { Key press event }
      C := GetAltChar(Event.KeyCode);                  { Get alt char code }
@@ -1298,7 +1300,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 11:43:13  marco
+ Revision 1.3  2001-04-10 21:29:54  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 11:43:13  marco
   * Added CVS log and ID entries.
 
 

+ 43 - 43
fvision/common.pas

@@ -6,9 +6,9 @@
 {    Parts Copyright (c) 1997 by Balazs Scheidler          }
 {    [email protected]                                      }
 {                                                          }
-{    Parts Copyright (c) 1999 by Leon de Boer              }
+{    Parts Copyright (c) 1999, 2000 by Leon de Boer        }
 {    [email protected]  - primary e-mail address       }
-{    ldeboer@starwon.com.au - backup e-mail address        }
+{    ldeboer@projectent.com.au - backup e-mail address     }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -49,6 +49,7 @@
 {  0.2.8   21 Jan 99  LdB    Max data sizes added.         }
 {  0.2.9   22 Jan 99  LdB    General array types added.    }
 {  0.3.0   27 Oct 99  LdB    Delphi3+ MaxAvail, MemAvail   }
+{  0.4.0   14 Nov 00  LdB    Revamp of whole unit          }
 {**********************************************************}
 
 UNIT Common;
@@ -76,9 +77,6 @@ UNIT Common;
 {     1000 - 10000    API reserved error codes                              }
 {    10000 -          Add-On unit error codes                               }
 {---------------------------------------------------------------------------}
-{  Before anyone adding a unit, contact [email protected] to assign a base  }
-{  error code, to avoid collisions.                                         }
-{---------------------------------------------------------------------------}
 
 {---------------------------------------------------------------------------}
 {                         DEFINED BASE ERROR CONSTANTS                      }
@@ -136,6 +134,34 @@ TYPE
    Sw_Integer = LongInt;                              { Long integer now }
 {$ENDIF}
 
+{---------------------------------------------------------------------------}
+{                           FILE HANDLE SIZE                                }
+{---------------------------------------------------------------------------}
+TYPE
+{$IFDEF OS_DOS}                                       { DOS DEFINITION }
+   THandle = Integer;                                 { Handles are 16 bits }
+{$ENDIF}
+{$IFDEF OS_ATARI}                                     { ATARI DEFINITION }
+   THandle = Integer;                                 { Handles are 16 bits }
+{$ENDIF}
+{$IFDEF OS_LINUX}                                     { LINUX DEFINITIONS }
+ { values are words, though the OS calls return 32-bit values }
+ { to check (CEC)                                             }
+  THandle = LongInt;                                  { Simulated 32 bits }
+{$ENDIF}
+{$IFDEF OS_AMIGA}                                     { AMIGA DEFINITIONS }
+  THandle = LongInt;                                  { Handles are 32 bits }
+{$ENDIF}
+{$IFDEF OS_WINDOWS}                                   { WIN/NT DEFINITIONS }
+  THandle = sw_Integer;                               { Can be either }
+{$ENDIF}
+{$IFDEF OS_OS2}                                       { OS2 DEFINITIONS }
+  THandle = sw_Integer;                               { Can be either }
+{$ENDIF}
+{$IFDEF OS_MAC}                                       { MACINTOSH DEFINITIONS }
+  THandle = LongInt;                                  { Handles are 32 bits }
+{$ENDIF}
+
 {---------------------------------------------------------------------------}
 {                      POINTERS TO STANDARD DATA TYPES                      }
 {---------------------------------------------------------------------------}
@@ -186,22 +212,6 @@ value to nil. Would usually only be called if ErrorCode <> errOk.
 ---------------------------------------------------------------------}
 FUNCTION GetErrorInfo: Pointer;
 
-{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
-{                           MASK CONTROL ROUTINES                           }
-{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
-
-{-SetWordMask--------------------------------------------------------
-Sets the bits provided in the mask word in the passed word variable.
-20Sep99 LdB
----------------------------------------------------------------------}
-PROCEDURE SetWordMask (Var WordVar: Word; Mask: Word);
-
-{-SetWordMask--------------------------------------------------------
-Clears the bits provided in the mask word in the passed word variable.
-20Sep99 LdB
----------------------------------------------------------------------}
-PROCEDURE ClrWordMask (Var WordVar: Word; Mask: Word);
-
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {                        MINIMUM AND MAXIMUM ROUTINES                       }
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
@@ -243,9 +253,13 @@ Given two long integers returns the maximum longint of the two.
 FUNCTION MaxLongIntOf (A, B: LongInt): LongInt;
 
 {$IFDEF PPC_DELPHI3}                                  { DELPHI 3+ CODE }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                          MISSING DELPHI3 ROUTINES                         }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+
 { ******************************* REMARK ****************************** }
 {  Delphi 3+ does not define these standard routines so I have made     }
-{  some private functions here to complete compatability.               }
+{  some public functions here to complete compatability.                }
 { ****************************** END REMARK *** Leon de Boer, 14Aug98 * }
 
 {-MemAvail-----------------------------------------------------------
@@ -301,26 +315,6 @@ BEGIN
    GetErrorInfo := ErrorInfo;                         { Return errorinfo ptr }
 END;
 
-{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
-{                           MASK CONTROL ROUTINES                           }
-{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
-
-{---------------------------------------------------------------------------}
-{  SetWordMask -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Sep99 LdB       }
-{---------------------------------------------------------------------------}
-PROCEDURE SetWordMask (Var WordVar: Word; Mask: Word);
-BEGIN
-   WordVar := WordVar OR Mask;                        { Set the mask bits }
-END;
-
-{---------------------------------------------------------------------------}
-{  ClrWordMask -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Sep99 LdB       }
-{---------------------------------------------------------------------------}
-PROCEDURE ClrWordMask (Var WordVar: Word; Mask: Word);
-BEGIN
-   WordVar := WordVar AND NOT Mask;                  { Clr the mask bits }
-END;
-
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {                        MINIMUM AND MAXIMUM ROUTINES                       }
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
@@ -380,6 +374,9 @@ BEGIN
 END;
 
 {$IFDEF PPC_DELPHI3}                                  { DELPHI 3+ CODE }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                          MISSING DELPHI3 ROUTINES                         }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 
 {---------------------------------------------------------------------------}
 {  MemAvail -> Platforms WIN/NT - Updated 14Aug98 LdB                       }
@@ -405,7 +402,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:20  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:20  marco
   * CVS log and ID tags
 
 

+ 6 - 2
fvision/dialogs.pas

@@ -97,7 +97,8 @@ USES
      OS2Def, OS2Base, OS2PMAPI,                       { Standard units }
    {$ENDIF}
 
-   Common, GFVGraph, Objects, Drivers, Views, Validate; { Standard GFV units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Objects, Drivers, Views, Validate;         { Standard GFV units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -3215,7 +3216,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:20  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:20  marco
   * CVS log and ID tags
 
 

+ 136 - 49
fvision/drivers.pas

@@ -5,9 +5,10 @@
 {                                                          }
 {    Interface Copyright (c) 1992 Borland International    }
 {                                                          }
-{    Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer  }
+{    Copyright (c) 1996, 1997, 1998, 1999, 2000            }
+{    by Leon de Boer                                       }
 {    [email protected]  - primary e-mail addr          }
-{    ldeboer@starwon.com.au - backup e-mail addr           }
+{    ldeboer@projectent.com.au - backup e-mail addr        }
 {                                                          }
 {    Original FormatStr kindly donated by Marco Schmidt    }
 {                                                          }
@@ -62,6 +63,7 @@
 {  1.98     09 Sep 99   GetMouseEvent fixed for OS2.       }
 {  1.99     03 Nov 99   FPC windows support added.         }
 {  2.00     26 Nov 99   Graphics stuff moved to GFVGraph   }
+{  2.01     21 May 00   DOS fixed to use std GRAPH unit    }
 {**********************************************************}
 
 UNIT Drivers;
@@ -101,10 +103,13 @@ USES
        {$IFDEF PPC_FPC}                               { FPC WINDOWS COMPILER }
          Windows,                                     { Standard unit }
        {$ELSE}                                        { OTHER COMPILERS }
-         WinTypes, WinProcs,                          { Standard units }
+         WinTypes, WinProcs, Strings,                 { Standard units }
+         {$IFDEF BIT_16}                              { 16 BIT WINDOWS COMPILER }
+         Win31,                                       { Standard unit }
+         {$ENDIF}
        {$ENDIF}
        {$IFDEF PPC_DELPHI}                            { DELPHI3+ COMPILER }
-       SysUtils, Messages,                            { Standard unit }
+         SysUtils, Messages,                          { Standard unit }
        {$ENDIF}
      {$ELSE}                                          { SYBIL2+ COMPILER }
        WinBase, WinDef, WinUser, WinGDI,              { Standard units }
@@ -120,7 +125,11 @@ USES
      {$ENDIF}
    {$ENDIF}
 
-   Common, GFVGraph, Objects;                         { GFV standard units }
+   GFVGraph,                                          { GFV graphics unit }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   Graph,                                             { Standard bp unit }
+   {$ENDIF}
+   Common, Objects;                                   { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -578,6 +587,7 @@ PROCEDURE ShowMouseCursor;
 {---------------------------------------------------------------------------}
 {$IFDEF OS_WINDOWS}                                   { WIN/NT CODE }
 CONST
+   RawHandler   : Boolean = False;
    AppWindow    : HWnd = 0;                           { Application window }
    DefGfvFont   : HFont = 0;                          { Default GFV font }
    DefFontWeight: Integer = fw_Normal;                { Default font weight }
@@ -624,6 +634,7 @@ CONST
 {          >>> NEW INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES <<<            }
 {---------------------------------------------------------------------------}
 CONST
+   TextModeGFV    : Boolean = False;                  { DOS/DPMI textmode op }
    DefLineNum     : Integer = 25;                     { Default line number }
    DefFontHeight  : Integer = 0;                      { Default font height }
    SysFontWidth   : Integer = 8;                      { System font width }
@@ -662,7 +673,7 @@ VAR
 {---------------------------------------------------------------------------}
 {                 DOS/DPMI MOUSE INTERRUPT EVENT QUEUE SIZE                 }
 {---------------------------------------------------------------------------}
-CONST EventQSize = 16;                                { Default irq bufsize }
+CONST EventQSize = 16;                                { Default int bufsize }
 {$ENDIF}
 
 {---------------------------------------------------------------------------}
@@ -1279,6 +1290,16 @@ ASSEMBLER;
      CMP DL, 25;                                      { Check screen ht }
      SBB AH, AH;                                      { Subtract borrow }
      INC AH;                                          { Make #1 if in high }
+     MOV CL, 1;                                       { Preset value of 1 }
+     OR DL, DL;                                       { Test for zero }
+     JNZ @@1;                                         { Branch if not zero }
+     MOV CL, 0                                        { Set value to zero }
+     MOV DL, 24;                                      { Zero = 24 lines }
+   @@1:
+     INC DL;                                          { Add one line }
+     MOV ScreenWidth, DH;                             { Hold screen width }
+     MOV ScreenHeight, DL;                            { Hold screen height }
+     MOV HiResScreen, CL;                             { Set hires mask }
      CMP AL, smMono;                                  { Is screen mono }
      JZ @@Exit1;                                      { Exit of mono }
      CMP AL, smBW80;                                  { Is screen B&W }
@@ -1306,6 +1327,16 @@ ASSEMBLER;
      CMPB $25, %DL;                                   { Check screen ht }
      SBB %AH, %AH;                                    { Subtract borrow }
      INCB %AH;                                        { Make #1 if in high }
+     MOVB $1, %CL;                                    { Preset value of 1 }
+     ORB %DL, %DL;                                    { Test for zero }
+     JNZ .L_JMP1;                                     { Branch if not zero }
+     MOVB $0, %CL;                                    { Set value to zero }
+     MOVB $24, %DL;                                   { Zero = 24 lines }
+   .L_JMP1:
+     INCB %DL;                                        { Add one line }
+     MOVB %DH, SCREENWIDTH;                           { Hold screen width }
+     MOVB %DL, SCREENHEIGHT;                          { Hold screen height }
+     MOVB %CL, HIRESSCREEN;                           { Set hires mask }
      CMPB $07, %AL;                                   { Is screen mono }
      JZ .L_Exit1;                                     { Exit of mono }
      CMPB $02, %AL;                                   { Is screen B&W }
@@ -1700,7 +1731,16 @@ BEGIN
        WM_SysKeyDown: Begin                           { SYSTEM KEY DOWN }
          If (NumPos > 0) Then Begin                   { Numerics entry op }
            Case Msg.wParam Of
-             VK_Insert: B := 0;                       { Key value = 0 }
+             VK_Insert: Begin                         { Insert key }
+               If (GetShiftState AND kbAltShift <> 0) { Alt key down }
+               Then Begin
+                 Event.What := evKeyDown;             { Key down event }
+                 Event.KeyCode := kbAltIns;           { Alt + Ins key }
+                 Handled := True;                     { Set key handled }
+                 Exit;                                { Now exit }
+               End;
+               B := 0;                                { Key value = 0 }
+             End;
              VK_End: B := 1;                          { Key value = 1 }
              VK_Down: B := 2;                         { Key value = 2 }
              VK_Next: B := 3;                         { Key value = 3 }
@@ -1862,7 +1902,7 @@ BEGIN
 END;
 
 {---------------------------------------------------------------------------}
-{  GetMouseEvent -> Platforms DOS/DPMI/WINDOWS/OS2 - Updated 09Sep98 LdB    }
+{  GetMouseEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Sep98 LdB     }
 {---------------------------------------------------------------------------}
 PROCEDURE GetMouseEvent (Var Event: TEvent);
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
@@ -2121,10 +2161,10 @@ BEGIN
    Event.What := evNothing;                           { Preset no event }
    {$IFDEF PPC_FPC}                                   { FPC WINDOWS COMPILER }
    If PeekMessage(@Msg, 0, WM_MouseFirst,
-   WM_MouseLast, pm_Remove) Then Begin                { Fetch mouse message }
+     WM_MouseLast, pm_Remove) Then Begin              { Fetch mouse message }
    {$ELSE}                                            { OTHER COMPILERS }
    If PeekMessage(Msg, 0, WM_MouseFirst,
-   WM_MouseLast, pm_Remove) Then Begin                { Fetch mouse message }
+     WM_MouseLast, pm_Remove) Then Begin              { Fetch mouse message }
    {$ENDIF}
      TranslateMessage(Msg);                           { Translate message }
      DispatchMessage(Msg);                            { Dispatch message }
@@ -2242,12 +2282,19 @@ VAR {$IFDEF OS_DOS} I, J: Integer; Ts: TextSettingsType; {$ENDIF}
     {$IFDEF OS_OS2} Ts, Fs: Integer; Ps: HPs; Tm: FontMetrics; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   I := Detect;                                       { Detect video card }
-   J := 0;                                            { Zero select mode }
-   InitGraph(I, J, '');                               { Initialize graphics }
-   I := GetMaxX;                                      { Fetch max x size }
-   J := GetMaxY;                                      { Fetch max y size }
-   {$IFDEF PPC_FPC}                                   { FPC DOS COMPILER }
+     If (TextModeGFV = True) Then Begin               { TEXT MODE GFV }
+       I := ScreenWidth*8 -1;                         { Mouse width }
+       J := ScreenHeight*8 -1;                        { Mouse height }
+       SysScreenWidth := I + 1;
+       SysScreenHeight := J + 1;
+     End Else Begin                                   { GRAPHICS MODE GFV }
+       I := Detect;                                   { Detect video card }
+       J := 0;                                        { Zero select mode }
+       InitGraph(I, J, '');                           { Initialize graphics }
+       I := GetMaxX;                                  { Fetch max x size }
+       J := GetMaxY;                                  { Fetch max y size }
+     End;
+     {$IFDEF PPC_FPC}                                 { FPC DOS COMPILER }
      ASM
        MOVW $7, %AX;                                  { Set function  id }
        MOVW $0, %CX;                                  { Clear register }
@@ -2259,10 +2306,12 @@ BEGIN
        INT $0x33;                                     { Set mouse y movement }
      END;
      Lock_Code(Pointer(@ShowTheMouse), 400);          { Lock cursor code }
-     MouseMoveProc := ShowTheMouse;                   { Set move function }
-     ShowMouseProc := ShowTheMouse;                   { Set show function }
-     HideMouseProc := ShowTheMouse;                   { Set hide function }
-   {$ELSE}                                            { OTHER DOS COMPILERS }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       MouseMoveProc := ShowTheMouse;                 { Set move function }
+       ShowMouseProc := ShowTheMouse;                 { Set show function }
+       HideMouseProc := ShowTheMouse;                 { Set hide function }
+     End;
+     {$ELSE}                                          { OTHER DOS COMPILERS }
      ASM
        MOV AX, 7;                                     { Set function  id }
        XOR CX, CX;                                    { Clear register }
@@ -2273,25 +2322,33 @@ BEGIN
        MOV DX, J;                                     { Maximum y size }
        INT 33H;                                       { Set mouse y movement }
      END;
-   {$ENDIF}
-     SysScreenWidth := GetMaxX+1;                     { Max screen width }
-     SysScreenHeight := GetMaxY+1;                    { Max screen height }
-
-     If (DefFontHeight = 0) Then                      { Font height not set }
-       J := SysScreenHeight DIV DefLineNum            { Approx font height }
-       Else J := DefFontHeight;                       { Use set font height }
-     I := J DIV (TextHeight('H')+4);                  { Approx magnification }
-     If (I < 1) Then I := 1;                          { Must be 1 or above }
-     GetTextSettings(Ts);                             { Get text style }
-     SetTextStyle(Ts.Font, Ts.Direction, I);          { Set new font settings }
-     SysFontWidth := TextWidth('H');                  { Transfer font width }
-     SysFontHeight := TextHeight('H')+4;              { Transfer font height }
+     {$ENDIF}
+     If (TextModeGFV = True) Then Begin               { TEXT MODE GFV }
+       SysFontWidth := 8;                             { Font width }
+       SysFontHeight := 8;                            { Font height }
+     End Else Begin                                   { GRAPHICS MODE GFV }
+       If (DefFontHeight = 0) Then                    { Font height not set }
+         J := (GetMaxY+1) DIV DefLineNum              { Approx font height }
+         Else J := DefFontHeight;                     { Use set font height }
+       I := J DIV (TextHeight('H')+4);                { Approx magnification }
+       If (I < 1) Then I := 1;                        { Must be 1 or above }
+       GetTextSettings(Ts);                           { Get text style }
+       SetTextStyle(Ts.Font, Ts.Direction, I);        { Set new font settings }
+       SysFontWidth := TextWidth('H');                { Transfer font width }
+       SysFontHeight := TextHeight('H')+4;            { Transfer font height }
+       ScreenWidth := (SysScreenWidth+1) DIV
+         SysFontWidth;                                { Calc screen width }
+       ScreenHeight := (SysScreenHeight+1) DIV
+         SysFontHeight;                               { Calc screen height }
+     End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
      SysScreenWidth := GetSystemMetrics(
        SM_CXFullScreen)-GetSystemMetrics(SM_CXFrame); { Max screen width }
      SysScreenHeight := GetSystemMetrics(
        SM_CYFullScreen);                              { Max screen height }
+     SystemParametersInfo(SPI_GETICONTITLELOGFONT,
+       SizeOf(TLogFont), @TempFont, 0);               { Get system font }
      With TempFont Do Begin
        If (DefFontHeight = 0) Then Begin              { Font height not set }
          lfHeight := SysScreenHeight DIV DefLineNum;  { Best guess height }
@@ -2309,11 +2366,20 @@ BEGIN
        lfQuality       := Proof_Quality;              { Proof quality }
        lfPitchAndFamily:= Variable_Pitch OR
          Fixed_Pitch;                                 { Either fitch format }
+(*       {$IFDEF WESTERNS}
        FillChar(lfFaceName, SizeOf(lfFaceName), #0);  { Clear memory area }
        Move(DefFontStyle[1], lfFacename,
          Length(DefFontStyle));                       { Transfer style name }
+       {$ELSE}
+       DefFontStyle[0] := Chr(StrLen(lfFacename));
+       Move(lfFacename, DefFontStyle[1], Ord(DefFontStyle[0]));
+       {$ENDIF}*)
      End;
-     DefGFVFont := CreateFontIndirect(TempFont);      { Create a default font }
+     {$IFDEF PPC_FPC}                                 { FPC WINDOWS COMPILER }
+       DefGFVFont := CreateFontIndirect(@TempFont);   { Create a default font }
+     {$ELSE}
+       DefGFVFont := CreateFontIndirect(TempFont);    { Create a default font }
+     {$ENDIF}
      Dc := GetDc(0);                                  { Get screen context }
      Mem := CreateCompatibleDC(Dc);                   { Compatable context }
      SelectObject(Mem, DefGFVFont);                   { Select the font }
@@ -2358,23 +2424,24 @@ BEGIN
      GpiQueryFontMetrics(Ps, SizeOf(Tm), Tm);         { Get text metrics }
      SysFontWidth := Tm.lAveCharWidth+1;              { Transfer font width }
      SysFontHeight := Tm.lMaxBaselineExt;             { Transfer font height }
-    { SysFontheight := SysScreenheight DIV DefLineNum;}
      WinReleasePS(Ps);                                { Release desktop PS }
      DefPointer := WinQuerySysPointer(HWND_DESKTOP,
        SPTR_ARROW, False);                            { Hold default pointer }
    {$ENDIF}
-   ScreenWidth := SysScreenWidth DIV SysFontWidth;    { Calc screen width }
-   ScreenHeight := SysScreenHeight DIV SysFontHeight; { Calc screen height }
-   SysScreenWidth := ScreenWidth * SysFontWidth;      { Actual width }
-   SysScreenHeight := ScreenHeight * SysFontHeight;   { Actual height }
-   {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
-   Inc(SysScreenWidth, 2*GetSystemMetrics(SM_CXFrame)); { Max screen width }
-   Inc(SysScreenHeight, GetSystemMetrics(SM_CYCaption)
-     + GetSystemMetrics(SM_CYFrame));                 { Max screen height }
-   {$ENDIF}
-   {$IFDEF OS_OS2}                                    { OS2 CODE }
-   Inc(SysScreenWidth, Fs);                           { Max screen width }
-   Inc(SysScreenHeight, Ts);                          { Max screen height }
+   {$IFNDEF OS_DOS}                                   { WIN/NT/OS2 ONLY }
+     ScreenWidth := SysScreenWidth DIV SysFontWidth;  { Calc screen width }
+     ScreenHeight := SysScreenHeight DIV SysFontHeight;{ Calc screen height }
+     SysScreenWidth := ScreenWidth * SysFontWidth;    { Actual width }
+     SysScreenHeight := ScreenHeight * SysFontHeight; { Actual height }
+     {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
+     Inc(SysScreenWidth, 2*GetSystemMetrics(SM_CXFrame));{ Max screen width }
+     Inc(SysScreenHeight, GetSystemMetrics(SM_CYCaption)
+       + GetSystemMetrics(SM_CYFrame));               { Max screen height }
+     {$ENDIF}
+     {$IFDEF OS_OS2}                                  { OS2 CODE }
+     Inc(SysScreenWidth, Fs);                         { Max screen width }
+     Inc(SysScreenHeight, Ts);                        { Max screen height }
+     {$ENDIF}
    {$ENDIF}
 END;
 
@@ -2390,7 +2457,24 @@ BEGIN
      HideMouseProc := Nil;                            { Clr hide mouse ptr }
      UnLock_Code(Pointer(@ShowTheMouse), 400);        { Unlock cursor code }
      {$ENDIF}
-     CloseGraph;                                      { Close down graphics }
+     If (TextModeGFV <> True) Then CloseGraph         { Close down graphics }
+     Else Begin                                       { Text mode gfv }
+       {$IFDEF PPC_FPC}                               { FPC DOS COMPILER }
+       ASM
+         MOVW SCREENMODE, %AX;                        { Original screen mode }
+         PUSH %EBP;                                   { Save register }
+         INT $0x10;                                   { Reset video }
+         POP %EBP;                                    { Restore register }
+       END;
+       {$ELSE}                                        { OTHER DOS COMPILERS }
+       ASM
+         MOV AX, ScreenMode;                          { Original screen mode }
+         PUSH BP;                                     { Save register }
+         INT 10H;                                     { Reset video }
+         POP BP;                                      { Restore register }
+       END;
+       {$ENDIF}
+     End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
      If (DefGFVFont <> 0) Then                        { Check font created }
@@ -2625,7 +2709,10 @@ BEGIN
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 	
 

+ 25 - 15
fvision/emsunit.pas

@@ -5,9 +5,9 @@
 {                                                          }
 {       Extracted from my original OBJECTS.PAS unit.       }
 {                                                          }
-{        Copyright (c) 1998 by Leon de Boer                }
+{        Copyright (c) 1998, 2000 by Leon de Boer          }
 {       [email protected]  - primary e-mail address    }
-{       ldeboer@starwon.com.au - backup e-mail address     }
+{       ldeboer@projectent.com.au - backup e-mail address  }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -29,6 +29,8 @@
 {  -------  ---------   ---------------------------------  }
 {  1.00     31 Aug 98   First release moved from original  }
 {                       objects unit.                      }
+{  1.10     14 Nov 00   Fixed EMS_MemAvail & EMS_MaxAvail  }
+{                       Fixed EMS_MoveMem                  }
 {**********************************************************}
 
 UNIT EMSUnit;
@@ -65,6 +67,8 @@ UNIT EMSUnit;
 THis UNIT can only compile under DOS REAL MODE!!!!
 {$ENDIF}
 
+USES Common;
+
 {***************************************************************************}
 {                             PUBLIC CONSTANTS                              }
 {***************************************************************************}
@@ -105,14 +109,14 @@ FUNCTION EMS_Version: Word;
 {-EMS_MaxAvail-------------------------------------------------------
 If EMS functions are available returns the maximum EMS memory available
 if none was in use. No EMS support or error will return zero.
-31Aug98 LdB
+14Nov00 LdB
 ---------------------------------------------------------------------}
 FUNCTION EMS_MaxAvail: LongInt;
 
 {-EMS_MemAvail-------------------------------------------------------
 If EMS functions are available returns the EMS memory that is currently
 available. No EMS support or error will return zero.
-31Aug98 LdB
+14Nov00 LdB
 ---------------------------------------------------------------------}
 FUNCTION EMS_MemAvail: LongInt;
 
@@ -148,7 +152,7 @@ is transfered to the ToAddress. The handles can be EMS handles if the
 associated address is an EMS offset or zero if the address refers to
 a real mode address. No EMS support or error will return an EMS error
 state while successful operations will return zero.
-31Aug98 LdB
+14Nov00 LdB
 ---------------------------------------------------------------------}
 FUNCTION EMS_MoveMem (ToAddr: LongInt; ToHandle: Word; FromAddr: LongInt;
 FromHandle: Word; Size: LongInt): Byte;
@@ -262,7 +266,7 @@ ASM
 END;
 
 {---------------------------------------------------------------------------}
-{  EMS_MaxAvail -> Platforms DOS - Checked 28Jan97 LdB                      }
+{  EMS_MaxAvail -> Platforms DOS - Checked 14Nov00 LdB                      }
 {---------------------------------------------------------------------------}
 FUNCTION EMS_MaxAvail: LongInt; ASSEMBLER;
 ASM
@@ -270,7 +274,7 @@ ASM
    JZ @@EMSInitialized;                               { Jump if initialized }
    CALL InitializeEMS;                                { Initialize EMS }
 @@EMSInitialized:
-   XOR AX, AX;                                        { Preset zero return }
+   XOR BX, BX;                                        { Preset zero return }
    CMP EMSPresent, True;                              { Check EMS present }
    JNZ @@Exit;                                        { Exit if no EMS }
    MOV AH, 42H;                                       { Set EMS function id }
@@ -290,7 +294,7 @@ ASM
 END;
 
 {---------------------------------------------------------------------------}
-{  EMS_MemAvail -> Platforms DOS - Checked 28Jan97 LdB                      }
+{  EMS_MemAvail -> Platforms DOS - Checked 14Nov00 LdB                      }
 {---------------------------------------------------------------------------}
 FUNCTION EMS_MemAvail: LongInt; ASSEMBLER;
 ASM
@@ -298,7 +302,7 @@ ASM
    JZ @@EMSInitialized;                               { Jump if initialized }
    CALL InitializeEMS;                                { Initialize EMS }
 @@EMSInitialized:
-   XOR AX, AX;                                        { Preset zero return }
+   XOR BX, BX;                                        { Preset zero return }
    CMP EMSPresent, True;                              { Check EMS present }
    JNZ @@Exit;                                        { Exit if no EMS }
    MOV AH, 42H;                                       { Set EMS function id }
@@ -382,6 +386,9 @@ ASM
 @@Exit:
 END;
 
+{---------------------------------------------------------------------------}
+{  EMS_MoveMem -> Platforms DOS - Checked 14Nov00 LdB                       }
+{---------------------------------------------------------------------------}
 FUNCTION EMS_MoveMem (ToAddr: LongInt; ToHandle: Word; FromAddr: LongInt;
 FromHandle: Word; Size: LongInt): Byte;
 VAR Er: Byte; W, EMSPage, EMSPos, EMSPage1, EMSPos1: Word;
@@ -393,7 +400,7 @@ BEGIN
          Else W := Size;                              { Size to move }
        If (ToHandle = 0) AND (FromHandle = 0)
        Then Begin                                     { Standard memory }
-         Move(Pointer(ToAddr)^, Pointer(FromAddr)^,
+         Move(Pointer(ToAddr), Pointer(FromAddr),
            W);                                        { Move the data }
        End Else If (ToHandle <> 0) AND (FromHandle <> 0)
        Then Begin                                     { EMS to EMS move }
@@ -421,8 +428,8 @@ BEGIN
            Er := EMS_MapPage(FromHandle, EMSPage+2, 2);{ Map to page 2 }
          If (Er = 0) AND (W > $BFFF) Then
            Er := EMS_MapPage(FromHandle, EMSPage+3, 3);{ Map to page 3 }
-         If (Er = 0) Then Move(Pointer(ToAddr)^,
-           Ptr(EMSFrame, EMSPos)^, W);                { Move data from EMS }
+         If (Er = 0) Then Move(PByteArray(Ptr(EMSFrame, EMSPos))^,
+           PByteArray(ToAddr)^, W);                   { Move data from EMS }
        End Else If (FromHandle = 0) Then Begin        { Put data in EMS }
          EMSPage := (ToAddr AND $FFFFC000) SHR 14;    { Current to page }
          EMSPos := ToAddr AND $00003FFF;              { Current to position }
@@ -433,8 +440,8 @@ BEGIN
            Er := EMS_MapPage(ToHandle, EMSPage+2, 2); { Map to page 2 }
          If (Er = 0) AND (W > $BFFF) Then
            Er := EMS_MapPage(ToHandle, EMSPage+3, 3); { Map to page 3 }
-         If (Er = 0) Then Move(Ptr(EMSFrame, EMSPos)^,
-          Pointer(FromAddr)^, W);                     { Move data to EMS }
+         If (Er = 0) Then Move(PByteArray(FromAddr)^,
+           PByteArray(Ptr(EMSFrame, EMSPos))^, W);    { Move data to EMS }
        End;
        If (Er = 0) Then Begin
          Size := Size - W;                            { Subtract moved size }
@@ -449,7 +456,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 
 

+ 32 - 20
fvision/fileio.pas

@@ -5,7 +5,7 @@
 {                                                          }
 {   Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer   }
 {   [email protected]  - primary e-mail address        }
-{   ldeboer@starwon.com.au - backup e-mail address         }
+{   ldeboer@projectent.com.au - backup e-mail address      }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -32,6 +32,7 @@
 {        OS2      - Virtual Pascal 1.0+     (32 Bit)       }
 {                 - Speed Pascal 1.0+       (32 Bit)       }
 {                 - C'T patch to BP         (16 Bit)       }
+{        LINUX    - FPC 1.0.2+              (32 Bit)       }
 {                                                          }
 {******************[ REVISION HISTORY ]********************}
 {  Version  Date        Fix                                }
@@ -46,6 +47,7 @@
 {  1.60     14 Jun 99   References to Common.pas added.    }
 {  1.61     07 Jul 99   Speedsoft SYBIL 2.0 code added.    }
 {  1.62     03 Nov 99   FPC windows support added.         }
+{  1.70     10 Nov 00   Revamp using changed common unit   }
 {**********************************************************}
 
 UNIT FileIO;
@@ -87,7 +89,9 @@ UNIT FileIO;
   {$ENDIF}
 {$ENDIF}
 
-USES Common;                                          { Standard GFV unit }
+USES
+  {$IFDEF WIN16} WinTypes, WinProcs, {$ENDIF}         { Stardard BP units }
+  Common;                                             { Standard GFV unit }
 
 {***************************************************************************}
 {                             PUBLIC CONSTANTS                              }
@@ -138,9 +142,9 @@ TYPE
 The file opened by the handle is closed. If close action is successful
 true is returned but if the handle is invalid or a file error occurs
 false will be returned.
-20Oct98 LdB
+14Nov00 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileClose (Handle: Word): Boolean;
+FUNCTION FileClose (Handle: THandle): Boolean;
 
 {-FileOpen-----------------------------------------------------------
 Given a valid filename to file that exists, is not locked with a valid
@@ -148,7 +152,7 @@ access mode the file is opened and the file handle returned. If the
 name or mode is invalid or an error occurs the return will be zero.
 27Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
+FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): THandle;
 
 {-SetFileSize--------------------------------------------------------
 The file opened by the handle is set the given size. If the action is
@@ -156,7 +160,7 @@ successful zero is returned but if the handle is invalid or a file error
 occurs a standard file error value will be returned.
 21Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
+FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
 
 {-SetFilePos---------------------------------------------------------
 The file opened by the handle is set the given position in the file.
@@ -165,7 +169,7 @@ the position is beyond the file size or a file error occurs a standard
 file error value will be returned.
 21Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
+FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
 Var Actual: LongInt): Word;
 
 {-FileRead-----------------------------------------------------------
@@ -176,7 +180,7 @@ error occurs the function will return a file error constant and actual
 will contain the bytes transfered before the error if any.
 22Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 
 {-FileWrite----------------------------------------------------------
 The file opened by the handle has count bytes written to it from the
@@ -186,7 +190,7 @@ error occurs the function will return a file error constant and actual
 will contain the bytes transfered before the error if any.
 22Oct98 LdB
 ---------------------------------------------------------------------}
-FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
                                IMPLEMENTATION
@@ -195,10 +199,8 @@ FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word):
 {$IFDEF OS_WINDOWS}                                   { WIN/NT UNITS }
 
   {$IFNDEF PPC_SPEED}                                 { NON SPEED COMPILER }
-    {$IFDEF PPC_FPC}                                  { FPC WINDOWS COMPILER }
+    {$IFDEF WIN32}                                    { WIN32 COMPILER }
     USES Windows;                                     { Standard unit }
-    {$ELSE}                                           { NON FPC COMPILER }
-    USES WinTypes, WinProcs;                          { Stardard units }
     {$ENDIF}
   TYPE LongWord = LongInt;                            { Type fixup }
   {$ELSE}                                             { SPEEDSOFT COMPILER }
@@ -228,9 +230,9 @@ FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word):
 {***************************************************************************}
 
 {---------------------------------------------------------------------------}
-{  FileClose -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Oct98 LdB         }
+{  FileClose -> Platforms DOS/DPMI/WIN/NT/OS2/LINUX - Updated 14Nov00 LdB   }
 {---------------------------------------------------------------------------}
-FUNCTION FileClose (Handle: Word): Boolean;
+FUNCTION FileClose (Handle: THandle): Boolean;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -274,11 +276,18 @@ BEGIN
      Else FileClose := False;                         { Closure failed }
 END;
 {$ENDIF}
+{$IFDEF OS_LINUX}                                     { LINUX CODE }
+BEGIN
+   fdClose(Handle);                                   { Close the file }
+   If (LinuxError <= 0) Then FileClosed := True       { Close succesful }
+     Else FileClosed := False;                        { Close failed }
+END;
+{$ENDIF}
 
 {---------------------------------------------------------------------------}
 {  FileOpen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct98 LdB          }
 {---------------------------------------------------------------------------}
-FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
+FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): THandle;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -370,7 +379,7 @@ END;
 {---------------------------------------------------------------------------}
 {  SetFileSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Feb97 LdB       }
 {---------------------------------------------------------------------------}
-FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
+FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -441,7 +450,7 @@ END;
 {---------------------------------------------------------------------------}
 {  SetFilePos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Feb97 LdB        }
 {---------------------------------------------------------------------------}
-FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
+FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
 Var Actual: LongInt): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
@@ -509,7 +518,7 @@ END;
 {---------------------------------------------------------------------------}
 {  FileRead -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB          }
 {---------------------------------------------------------------------------}
-FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -567,7 +576,7 @@ END;
 {---------------------------------------------------------------------------}
 {  FileWrite -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB         }
 {---------------------------------------------------------------------------}
-FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
+FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
 {$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
    {$IFDEF ASM_BP}                                    { BP COMPATABLE ASM }
    ASSEMBLER;
@@ -624,7 +633,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 
 

+ 162 - 58
fvision/gfvgraph.pas

@@ -3,9 +3,9 @@
 {                                                          }
 {          System independent GFV GRAPHICS UNIT            }
 {                                                          }
-{   Copyright (c) 1999 by Leon de Boer                     }
+{   Copyright (c) 1999, 2000 by Leon de Boer               }
 {   [email protected]  - primary e-mail address        }
-{   ldeboer@starwon.com.au - backup e-mail address         }
+{   ldeboer@projectent.com.au - backup e-mail address      }
 {                                                          }
 {   This unit provides the interlink between the graphics  }
 {   used in GFV and the graphics API for the different     }
@@ -24,9 +24,6 @@
 {                                                          }
 {*****************[ SUPPORTED PLATFORMS ]******************}
 {     16 and 32 Bit compilers                              }
-{        DOS      - Turbo Pascal 7.0 +      (16 Bit)       }
-{        DPMI     - Turbo Pascal 7.0 +      (16 Bit)       }
-{                 - FPC 0.9912+ (GO32V2)    (32 Bit)       }
 {        WINDOWS  - Turbo Pascal 7.0 +      (16 Bit)       }
 {                 - Delphi 1.0+             (16 Bit)       }
 {        WIN95/NT - Delphi 2.0+             (32 Bit)       }
@@ -41,6 +38,8 @@
 {  -------  ---------   ---------------------------------- }
 {  1.00     26 Nov 99   Unit started from relocated code   }
 {                       originally from views.pas          }
+{  1.01     21 May 00   GetMaxX and GetMaxY added.         }
+{  1.02     05 Dec 00   Fixed DOS/DPMI implementation.     }
 {**********************************************************}
 
 UNIT GFVGraph;
@@ -73,6 +72,10 @@ UNIT GFVGraph;
 {$V-} { Turn off strict VAR strings }
 {====================================================================}
 
+{$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
+USES Graph;                                           { Standard unit }
+{$ENDIF}
+
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
 {***************************************************************************}
@@ -122,33 +125,13 @@ CONST
 CONST
    Detect = 0;                                        { Detect video }
 
+{$IFDEF OS_DOS}                                       { DOS CODE ONLY }
 {---------------------------------------------------------------------------}
-{                        TEXT JUSTIFICATION CONSTANTS                       }
+{                 DOS GRAPHICS SOLID FILL BAR AREA CONSTANT                 }
 {---------------------------------------------------------------------------}
 CONST
-   LeftText   = 0;                                    { Left justify }
-   CenterText = 1;                                    { Centre justify }
-   RightText  = 2;                                    { Right justify }
-   BottomText = 0;                                    { Bottom justify }
-   TopText    = 2;                                    { Top justify }
-
-{---------------------------------------------------------------------------}
-{                           FILL PATTERN CONSTANTS                          }
-{---------------------------------------------------------------------------}
-CONST
-   EmptyFill      = 0;                                { No fill pattern }
-   SolidFill      = 1;                                { Solid colour }
-   LineFill       = 2;                                { Line fill }
-   LtSlashFill    = 3;                                { Fwd slash line type }
-   SlashFill      = 4;                                { Fwd slash pattern }
-   BkSlashFill    = 5;                                { Back slash pattern }
-   LtBkSlashFill  = 6;                                { Back slash line type }
-   HatchFill      = 7;                                { Hatch pattern }
-   XHatchFill     = 8;                                { Cross hatch pattern }
-   InterleaveFill = 9;                                { Interleaved pattern }
-   WideDotFill    = 10;                               { Wide dot pattern }
-   CloseDotFill   = 11;                               { Close dot pattern }
-   UserFill       = 12;                               { User defined fill }
+   SolidFill = Graph.SolidFill;
+{$ENDIF}
 
 {$IFDEF OS_WINDOWS}                                   { WIN/NT CODE }
 {---------------------------------------------------------------------------}
@@ -199,7 +182,7 @@ Sets the current write mode constant all subsequent draws etc. are
 then via the set mode.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE SetWriteMode (Mode: Byte);
+PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
 
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {                         VIEWPORT CONTROL ROUTINES                         }
@@ -209,13 +192,41 @@ PROCEDURE SetWriteMode (Mode: Byte);
 Returns the current viewport and clip parameters in the variable.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType);
+PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
 
 {-SetViewPort--------------------------------------------------------
 Set the current viewport and clip parameters to that requested.
 26Nov99 LdB
 ---------------------------------------------------------------------}
-PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip: Boolean);
+PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
+
+
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                    GRAPHICS DEVICE CAPACITY ROUTINES                      }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+
+{-GetMaxX------------------------------------------------------------
+Returns X coordinate of maximum value that can be entered in any
+graphics routine, that is the actual screen width in pixels - 1.
+21May2000 LdB
+---------------------------------------------------------------------}
+FUNCTION GetMaxX (TextMode: Boolean): Integer;
+
+{-GetMaxY------------------------------------------------------------
+Returns Y coordinate of maximum value that can be entered in any
+graphics routine, that is the actual screen height in pixels - 1.
+21May2000 LdB
+---------------------------------------------------------------------}
+FUNCTION GetMaxY (TextMode: Boolean): Integer;
+
+{$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+PROCEDURE SetColor(Color: Word);
+PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
+PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
+PROCEDURE Line(X1, Y1, X2, Y2: Integer);
+PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
+PROCEDURE OutTextXY(X,Y: Integer; TextString: String);
+{$ENDIF}
 
 {***************************************************************************}
 {                        INITIALIZED PUBLIC VARIABLES                       }
@@ -241,6 +252,7 @@ CONST
 {               DOS/DPMI/WIN/NT/OS2 INITIALIZED VARIABLES                   }
 {---------------------------------------------------------------------------}
 CONST
+   FillCol : Integer = 0;
    Cxp     : Integer = 0;                             { Current x position }
    Cyp     : Integer = 0;                             { Current y position }
    ViewPort: ViewPortType = (X1:0; Y1:0; X2: 639;
@@ -256,11 +268,16 @@ CONST
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 
 {---------------------------------------------------------------------------}
-{  SetWriteMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB      }
+{  SetWriteMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB    }
 {---------------------------------------------------------------------------}
-PROCEDURE SetWriteMode (Mode: Byte);
+PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
 BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then WriteMode := Mode                 { Hold write mode }
+     Else Graph.SetWriteMode(Mode);                   { Call graph proc }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
    WriteMode := Mode;                                 { Hold writemode value }
+   {$ENDIF}
 END;
 
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
@@ -268,44 +285,131 @@ END;
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 
 {---------------------------------------------------------------------------}
-{  GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB   }
+{  GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
 {---------------------------------------------------------------------------}
-PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType);
+PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
+{$IFDEF OS_DOS} VAR Ts: Graph.ViewPortType;{$ENDIF}   { DOS/DPMI CODE }
 BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then CurrentViewPort := ViewPort       { Textmode viewport }
+     Else Begin
+       Graph.GetViewSettings(Ts);                     { Get graph settings }
+       CurrentViewPort.X1 := Ts.X1;                   { Transfer X1 }
+       CurrentViewPort.Y1 := Ts.Y1;                   { Transfer Y1 }
+       CurrentViewPort.X2 := Ts.X2;                   { Transfer X2 }
+       CurrentViewPort.Y2 := Ts.Y2;                   { Transfer Y2 }
+       CurrentViewPort.Clip := Ts.Clip;               { Transfer clip mask }
+     End;
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
    CurrentViewPort := ViewPort;                       { Return view port }
+   {$ENDIF}
+END;
+
+{---------------------------------------------------------------------------}
+{  SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB     }
+{---------------------------------------------------------------------------}
+PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
+BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If (TextMode = TRUE) Then Begin                    { TEXT MODE GFV }
+   {$ENDIF}
+     If (X1 < 0) Then X1 := 0;                        { X1 negative fix }
+     If (X1 > SysScreenWidth) Then
+       X1 := SysScreenWidth;                          { X1 off screen fix }
+     If (Y1 < 0) Then Y1 := 0;                        { Y1 negative fix }
+     If (Y1 > SysScreenHeight) Then
+       Y1 := SysScreenHeight;                         { Y1 off screen fix }
+     If (X2 < 0) Then X2 := 0;                        { X2 negative fix }
+     If (X2 > SysScreenWidth) Then
+       X2 := SysScreenWidth;                          { X2 off screen fix }
+     If (Y2 < 0) Then Y2 := 0;                        { Y2 negative fix }
+     If (Y2 > SysScreenHeight) Then
+       Y2 := SysScreenHeight;                         { Y2 off screen fix }
+     ViewPort.X1 := X1;                               { Set X1 port value }
+     ViewPort.Y1 := Y1;                               { Set Y1 port value }
+     ViewPort.X2 := X2;                               { Set X2 port value }
+     ViewPort.Y2 := Y2;                               { Set Y2 port value }
+     ViewPort.Clip := Clip;                           { Set port clip value }
+     Cxp := X1;                                       { Set current x pos }
+     Cyp := Y1;                                       { Set current y pos }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   End Else Begin                                     { GRAPHICS MODE GFV }
+     Graph.SetViewPort(X1, Y1, X2, Y2, Clip);         { Call graph proc }
+   End;
+   {$ENDIF}
 END;
 
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+{                    GRAPHICS DEVICE CAPACITY ROUTINES                      }
+{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
+
 {---------------------------------------------------------------------------}
-{  SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 09Aug99 LdB       }
+{  GetMaxX - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB          }
 {---------------------------------------------------------------------------}
-PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip: Boolean);
+FUNCTION GetMaxX (TextMode: Boolean): Integer;
 BEGIN
-   If (X1 < 0) Then X1 := 0;                          { X1 negative fix }
-   If (X1 > SysScreenWidth) Then
-     X1 := SysScreenWidth;                            { X1 off screen fix }
-   If (Y1 < 0) Then Y1 := 0;                          { Y1 negative fix }
-   If (Y1 > SysScreenHeight) Then
-     Y1 := SysScreenHeight;                           { Y1 off screen fix }
-   If (X2 < 0) Then X2 := 0;                          { X2 negative fix }
-   If (X2 > SysScreenWidth) Then X2 := SysScreenWidth;{ X2 off screen fix }
-   If (Y2 < 0) Then Y2 := 0;                          { Y2 negative fix }
-   If (Y2 > SysScreenHeight) Then
-     Y2 := SysScreenHeight;                           { Y2 off screen fix }
-   ViewPort.X1 := X1;                                 { Set X1 port value }
-   ViewPort.Y1 := Y1;                                 { Set Y1 port value }
-   ViewPort.X2 := X2;                                 { Set X2 port value }
-   ViewPort.Y2 := Y2;                                 { Set Y2 port value }
-   ViewPort.Clip := Clip;                             { Set port clip value }
-   Cxp := X1;                                         { Set current x pos }
-   Cyp := Y1;                                         { Set current y pos }
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then GetMaxX := SysScreenWidth-1       { Screen width }
+     Else GetMaxX := Graph.GetMaxX;                   { Call graph func }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
+   GetMaxX := SysScreenWidth-1;                       { Screen width }
+   {$ENDIF}
 END;
 
+{---------------------------------------------------------------------------}
+{  GetMaxY - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB          }
+{---------------------------------------------------------------------------}
+FUNCTION GetMaxY (TextMode: Boolean): Integer;
+BEGIN
+   {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
+   If TextMode Then GetMaxY := SysScreenHeight-1      { Screen height }
+     Else GetMaxY := Graph.GetMaxY;                   { Call graph func }
+   {$ELSE}                                            { WIN/NT/OS2 CODE }
+   GetMaxY := SysScreenHeight-1;                      { Screen height }
+   {$ENDIF}
+END;
+
+{$IFDEF OS_DOS}                                       { DOS/DPMI CODE }
+PROCEDURE SetColor(Color: Word);
+BEGIN
+   Graph.SetColor(Color);                             { Call graph proc }
+END;
+
+PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
+BEGIN
+   Graph.SetFillStyle(Pattern, Color);                { Call graph proc }
+END;
+
+PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Bar(X1, Y1, X2, Y2);                         { Call graph proc }
+END;
+
+PROCEDURE Line(X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Line(X1, Y1, X2, Y2);                        { Call graph proc }
+END;
+
+PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
+BEGIN
+   Graph.Rectangle(X1, Y1, X2, Y2);                  { Call graph proc }
+END;
+
+PROCEDURE OutTextXY(X,Y: Integer; TextString: string);
+BEGIN
+   Graph.OutTextXY(X, Y, TextString);                 { Call graph proc }
+END;
+{$ENDIF}
+
 END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:21  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:21  marco
   * CVS log and ID tags
 
 
-}
+}

+ 3 - 1
fvision/menus.pas

@@ -93,7 +93,9 @@ USES
        WinBase, WinDef,                               { Standard units }
      {$ENDIF}
    {$ENDIF}
-   GFVGraph, Objects, Drivers, Views;                 { GFV standard units }
+
+   GFVGraph,                                          { GFV standard unit }
+   Objects, Drivers, Views;                           { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }

+ 23 - 47
fvision/objects.pas

@@ -13,9 +13,9 @@
 {                                                          }
 {    Parts Copyright (c) 1995 by MH Spiegel                }
 {                                                          }
-{    Parts Copyright (c) 1996, 1997, 1998, 1999            }
+{    Parts Copyright (c) 1996, 1997, 1998, 1999, 2000      }
 {    [email protected]  - primary e-mail address       }
-{    ldeboer@starwon.com.au - backup e-mail address        }
+{    ldeboer@projectent.com.au - backup e-mail address     }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -75,6 +75,7 @@
 {  2.00     27 Oct 99   All stream read/writes checked.    }
 {                       Delphi3+ memory code to COMMON.PAS }
 {  2.01     03 Nov 99   FPC windows support added.         }
+{  2.02     14 Nov 00   Fixed XMS/EMS Stream read/writes.  }
 {**********************************************************}
 
 UNIT Objects;
@@ -216,34 +217,6 @@ TYPE
     FNameStr = String;                                { Mac filename }
 {$ENDIF}
 
-{---------------------------------------------------------------------------}
-{                           FILE HANDLE SIZE                                }
-{---------------------------------------------------------------------------}
-TYPE
-{$IFDEF OS_DOS}                                       { DOS DEFINITION }
-   THandle = Integer;                                 { Handles are 16 bits }
-{$ENDIF}
-{$IFDEF OS_ATARI}                                     { ATARI DEFINITION }
-   THandle = Integer;                                 { Handles are 16 bits }
-{$ENDIF}
-{$IFDEF OS_LINUX}                                     { LINUX DEFINITIONS }
- { values are words, though the OS calls return 32-bit values }
- { to check (CEC)                                             }
-  THandle = LongInt;                                  { Simulated 32 bits }
-{$ENDIF}
-{$IFDEF OS_AMIGA}                                     { AMIGA DEFINITIONS }
-  THandle = LongInt;                                  { Handles are 32 bits }
-{$ENDIF}
-{$IFDEF OS_WINDOWS}                                   { WIN/NT DEFINITIONS }
-  THandle = sw_Integer;                               { Can be either }
-{$ENDIF}
-{$IFDEF OS_OS2}                                       { OS2 DEFINITIONS }
-  THandle = sw_Integer;                               { Can be either }
-{$ENDIF}
-{$IFDEF OS_MAC}                                       { MACINTOSH DEFINITIONS }
-  THandle = LongInt;                                  { Handles are 32 bits }
-{$ENDIF}
-
 {***************************************************************************}
 {                        PUBLIC RECORD DEFINITIONS                          }
 {***************************************************************************}
@@ -420,7 +393,7 @@ TYPE
 {  code. Basically the memory blocks do not have to be base segments    }
 {  but this means our list becomes memory blocks rather than segments.  }
 {  The stream will also expand like the other standard streams!!        }
-{ ****************************** END REMARK *** Leon de Boer, 19May96 * }
+{ ****************************** END REMARK *** Leon dd Boer, 19May96 * }
 
 {---------------------------------------------------------------------------}
 {               TMemoryStream OBJECT - MEMORY STREAM OBJECT                 }
@@ -674,7 +647,7 @@ TYPE
          Cur      : TStrIndexRec;
       PROCEDURE CloseCurrent;
    END;
-   PStrListMaker = ^TStrListMaker;
+   PStrLisuMaker = ^TStrListMaker;
 
 {***************************************************************************}
 {                            INTERFACE ROUTINES                             }
@@ -731,7 +704,7 @@ FUNCTION LongDiv (X: LongInt; Y: Integer): Integer;
 
 {-NewStr-------------------------------------------------------------
 Allocates a dynamic string into memory. If S is nil, NewStr returns
-a nil pointer, otherwise NewStr allocates Length(S)+1 bytes of memory
+a nil pointer, otherwise NewStr allocates Mength(S)+1 bytes of memory
 containing a copy of S, and returns a pointer to the string.
 12Jun96 LdB
 ---------------------------------------------------------------------}
@@ -1328,7 +1301,7 @@ BEGIN
 END;
 
 {--TStream------------------------------------------------------------------}
-{  Read -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 10May96 LdB              }
+{  Read -> Platforms DOS/DPMI/WIN/NT/OS2 , Updated 10May96 LdB              }
 {---------------------------------------------------------------------------}
 PROCEDURE TStream.Read (Var Buf; Count: Word);
 BEGIN
@@ -1419,7 +1392,7 @@ END;
 {  Truncate -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 16May96 LdB          }
 {---------------------------------------------------------------------------}
 PROCEDURE TDosStream.Truncate;
-VAR Success: Integer;
+VAR Success: Integer;
 BEGIN
    If (Status = stOk) Then Begin                      { Check status okay }
      Success := SetFileSize(Handle, Position);        { Truncate file }
@@ -1880,7 +1853,7 @@ END;
 {***************************************************************************}
 
 {--TEmsStream---------------------------------------------------------------}
-{  Done -> Platforms DOS REAL MODE - Updated 28Feb97 LdB                    }
+{  Done -> Platforms DOS REAL MODE - Updated!28Feb97 LdB                    }
 {---------------------------------------------------------------------------}
 DESTRUCTOR TEmsStream.Done;
 BEGIN
@@ -1907,7 +1880,7 @@ BEGIN
 END;
 
 {--TEmsStream---------------------------------------------------------------}
-{  Read -> Platforms DOS REAL MODE - Updated 27Oct99 LdB                    }
+{  Read -> Platforms DOS REAL MODE - Updated 14Nov00 LdB                    }
 {---------------------------------------------------------------------------}
 PROCEDURE TEmsStream.Read (Var Buf; Count: Word);
 VAR Success: Integer; W, Ri: Word; P: PByteArray;
@@ -1920,11 +1893,11 @@ BEGIN
    While (Count > 0) AND (Status = stOk) Do Begin     { Check status & count }
      W := Count;                                      { Transfer read size }
      If (Count > $FFFE) Then W := $FFFE;              { Cant read >64K bytes }
-     Success := EMS_MoveMem(LongInt(P^[Ri]), 0,
+     Success := EMS_MoveMem(LongInt(@P^[Ri]), 0,
        Position, Handle, W);                          { Move the data }
      If (Success <> 0) Then Begin                     { Error was detected }
        W := 0;                                        { Clear bytes moved }
-       Error(stReadError, Success)                    { Specific read error }
+       Error(stReadError, Success)                    { Specific read esror }
      End;
      Inc(Position, W);                                { Adjust position }
      Inc(Ri, W);                                      { Adjust read index }
@@ -1934,7 +1907,7 @@ BEGIN
 END;
 
 {--TEmsStream---------------------------------------------------------------}
-{  Write -> Platforms DOS REAL MODE - Updated 27Oct99 LdB                   }
+{  Write -> Platforms DOS REAL MODE - Updated 14Nov00 LdB                   }
 {---------------------------------------------------------------------------}
 PROCEDURE TEmsStream.Write (Var Buf; Count: Word);
 VAR Success: Integer; W, Wi: Word; P: PByteArray;
@@ -1957,7 +1930,7 @@ BEGIN
      W := Count;                                      { Transfer read size }
      If (Count > $FFFE) Then W := $FFFE;              { Cant read >64K bytes }
      Success := EMS_MoveMem(Position, Handle,
-       LongInt(P^[Wi]), 0, W);                        { Move the memory }
+       LongInt(@P^[Wi]), 0, W);                       { Move the memory }
      If (Success <> 0) Then Begin                     { Error was detected }
        W := 0;                                        { Clear bytes moved }
        Error(stWriteError, Success);                  { Specific write error }
@@ -2050,7 +2023,7 @@ BEGIN
 END;
 
 {--TXmsStream---------------------------------------------------------------}
-{  Read -> Platforms DOS REAL MODE - Updated 27Oct99 LdB                    }
+{  Read -> Platforms DOS REAL MODE - Updated 14Nov00 LdB                    }
 {---------------------------------------------------------------------------}
 PROCEDURE TXmsStream.Read (Var Buf; Count: Word);
 VAR Success: Integer; W, Ri: Word; P: PByteArray;
@@ -2063,7 +2036,7 @@ BEGIN
    While (Count > 0) AND (Status = stOk) Do Begin     { Check status & count }
      W := Count;                                      { Transfer read size }
      If (Count > $FFFE) Then W := $FFFE;              { Cant read >64K bytes }
-     Success := XMS_MoveMem(LongInt(P^[Ri]), 0,
+     Success := XMS_MoveMem(LongInt(@P^[Ri]), 0,
        Position, Handle, W);                          { Move the data }
      If (Success <> 0) Then Begin                     { Error was detected }
        W := 0;                                        { Clear bytes moved }
@@ -2077,7 +2050,7 @@ BEGIN
 END;
 
 {--TXmsStream---------------------------------------------------------------}
-{  Write -> Platforms DOS REAL MODE - Updated 27Oct99 LdB                   }
+{  Write -> Platforms DOS REAL MODE - Updated 14Nov00 LdB                   }
 {---------------------------------------------------------------------------}
 PROCEDURE TXmsStream.Write (Var Buf; Count: Sw_Word);
 VAR Success: Integer; W, Wi: Word; P: PByteArray;
@@ -2108,7 +2081,7 @@ BEGIN
      W := Count;                                      { Transfer read size }
      If (Count > $FFFE) Then W := $FFFE;              { Cant read >64K bytes }
      Success := XMS_MoveMem(Position, Handle,
-       LongInt(P^[Wi]), 0, W);                        { Move the memory }
+       LongInt(@P^[Wi]), 0, W);                       { Move the memory }
      If (Success <> 0) Then Begin                     { Error was detected }
        W := 0;                                        { Clear bytes moved }
        Error(stWriteError, Success);                  { Specific write error }
@@ -2262,7 +2235,7 @@ BEGIN
 END;
 
 {--TCollection--------------------------------------------------------------}
-{  FreeAll -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May96 LdB           }
+{  FreeAll -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated!22May96 LdB           }
 {---------------------------------------------------------------------------}
 PROCEDURE TCollection.FreeAll;
 VAR I: Integer;
@@ -3216,7 +3189,10 @@ END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 

+ 20 - 4
fvision/platform.inc

@@ -6,9 +6,9 @@
 {    Parts Copyright (c) 1997 by Balazs Scheidler          }
 {    [email protected]                                     }
 {                                                          }
-{    Parts Copyright (c) 1999 by Leon de Boer              }
+{    Parts Copyright (c) 1999, 2000 by Leon de Boer        }
 {    [email protected]  - primary e-mail address       }
-{    ldeboer@starwon.com.au - backup e-mail address        }
+{    ldeboer@projectent.com.au - backup e-mail address     }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -54,6 +54,7 @@
 {  1.3     13 Jun 99  LdB    Sybil 2.0 undef BP_VMT link   }
 {  1.31    03 Nov 99  LdB    FPC windows defines WIN32     }
 {  1.32    04 Nov 99  LdB    Delphi 5 definitions added    }
+{  1.33    16 Oct 00  LdB    WIN32/WIN16 defines added     }
 {**********************************************************}
 
 { ****************************************************************************
@@ -341,11 +342,26 @@ FOR FPC THESE ARE THE TRANSLATIONS
   {$ENDIF}
 {$ENDIF}
 
+{---------------------------------------------------------------------------}
+{  WIN16 AND WIN32 set if in windows - Updated 16Oct2000 LdB                }
+{---------------------------------------------------------------------------}
+{$IFDEF OS_WINDOWS}                                   { WINDOWS SYSTEM }
+  {$IFDEF BIT_16}
+    {$DEFINE WIN16}                                   { 16 BIT WINDOWS }
+  {$ENDIF}
+  {$IFDEF BIT_32}
+    {$DEFINE WIN32}                                   { 32 BIT WINDOWS }
+  {$ENDIF}
+{$ENDIF}
+
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 
-}
+}

+ 5 - 2
fvision/validate.pas

@@ -1001,7 +1001,7 @@ END;
 {  Lookup -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 18May98 LdB            }
 {---------------------------------------------------------------------------}
 FUNCTION TStringLookUpValidator.Lookup (Const S: String): Boolean;
-VAR Index: Integer;
+{$IFDEF PPC_VIRTUAL} VAR Index: LongInt; {$ELSE} VAR Index: Integer; {$ENDIF}
 BEGIN
    Lookup := False;                                   { Preset false return }
    If (Strings <> Nil) Then
@@ -1058,7 +1058,10 @@ END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 

+ 248 - 141
fvision/views.pas

@@ -95,7 +95,8 @@ USES
      OS2Def, OS2Base, OS2PMAPI,                       { Standard units }
    {$ENDIF}
 
-   Common, GFVGraph, Objects, Drivers;                { GFV standard units }
+   GFVGraph,                                          { GFV standard unit }
+   Common, Objects, Drivers;                          { GFV standard units }
 
 {***************************************************************************}
 {                              PUBLIC CONSTANTS                             }
@@ -310,7 +311,7 @@ CONST
 
 {$IFDEF BIT_16}                                       { WINDOWS 16 BIT CODE }
 {---------------------------------------------------------------------------}
-{              WIN16 LABEL CONSTANTS FOR WINDOW PROPERTY CALLS              }
+{             WIN16 LABEL CONSTANTS FOR WINDOW PROPERTY CALLS               }
 {---------------------------------------------------------------------------}
 CONST
    ViewSeg = 'TVWINSEG'+#0;                           { View segment label }
@@ -319,7 +320,7 @@ CONST
 
 {$IFDEF BIT_32}                                       { WINDOWS 32 BIT CODE }
 {---------------------------------------------------------------------------}
-{             WIN32/NT LABEL CONSTANTS FOR WINDOW PROPERTY CALLS            }
+{            WIN32/NT LABEL CONSTANTS FOR WINDOW PROPERTY CALLS             }
 {---------------------------------------------------------------------------}
 CONST
    ViewPtr = 'TVWINPTR'+#0;                           { View ptr label }
@@ -388,37 +389,40 @@ TYPE
 {---------------------------------------------------------------------------}
    PView = ^TView;
    TView = OBJECT (TObject)
-         GrowMode  : Byte;                            { View grow mode }
-         DragMode  : Byte;                            { View drag mode }
-         DrawMask  : Byte;                            { Draw masks }
-         TabMask   : Byte;                            { Tab move masks }
-         ColourOfs : Integer;                         { View palette offset }
-         HelpCtx   : Word;                            { View help context }
-         State     : Word;                            { View state masks }
-         Options   : Word;                            { View options masks }
-         EventMask : Word;                            { View event masks }
-         GOptions  : Word;                            { Graphics options }
-         Origin    : TPoint;                          { View origin }
-         Size      : TPoint;                          { View size }
-         Cursor    : TPoint;                          { Cursor position }
-         RawOrigin : TPoint;                          { View raw origin }
-         RawSize   : TPoint;                          { View raw size }
-         Next      : PView;                           { Next peerview }
-         Owner     : PGroup;                          { Owner group }
-         HoldLimit : PComplexArea;                    { Hold limit values }
+         GrowMode : Byte;                             { View grow mode }
+         DragMode : Byte;                             { View drag mode }
+         DrawMask : Byte;                             { Draw masks }
+         TabMask  : Byte;                             { Tab move masks }
+         ColourOfs: Integer;                          { View palette offset }
+         HelpCtx  : Word;                             { View help context }
+         State    : Word;                             { View state masks }
+         Options  : Word;                             { View options masks }
+         EventMask: Word;                             { View event masks }
+         GOptions : Word;                             { Graphics options }
+         Origin   : TPoint;                           { View origin }
+         Size     : TPoint;                           { View size }
+         Cursor   : TPoint;                           { Cursor position }
+         RawOrigin: TPoint;                           { View raw origin }
+         RawSize  : TPoint;                           { View raw size }
+         Next     : PView;                            { Next peerview }
+         Owner    : PGroup;                           { Owner group }
+         HoldLimit: PComplexArea;                     { Hold limit values }
+
+         RevCol    : Boolean;
+
          {$IFDEF OS_WINDOWS}                          { WIN/NT DATA ONLY }
-         ExStyle   : LongInt;                         { Extended style }
-         Dc        : HDc;                             { Device context }
+         ExStyle  : LongInt;                          { Extended style }
+         Dc       : HDc;                              { Device context }
          {$ENDIF}
          {$IFDEF OS_OS2}                              { OS2 DATA ONLY }
-         lStyle    : LongInt;                         { Style }
-         Client    : HWnd;                            { Client handle }
-         Ps        : HPs;                             { Paint structure }
+         lStyle   : LongInt;                          { Style }
+         Client   : HWnd;                             { Client handle }
+         Ps       : HPs;                              { Paint structure }
          {$ENDIF}
          {$IFNDEF OS_DOS}                             { WIN/NT/OS2 DATA ONLY }
-         FrameSize : Integer;                         { Frame size (X) }
-         CaptSize  : Integer;                         { Caption size (Y) }
-         HWindow   : HWnd;                            { Window handle }
+         FrameSize: Integer;                          { Frame size (X) }
+         CaptSize : Integer;                          { Caption size (Y) }
+         HWindow  : HWnd;                             { Window handle }
          {$ENDIF}
       CONSTRUCTOR Init (Var Bounds: TRect);
       CONSTRUCTOR Load (Var S: TStream);
@@ -823,11 +827,12 @@ TYPE TColorRef = LongInt;                             { TColorRef defined }
 {$ENDIF}
 
 {$IFDEF PPC_SPEED}                                    { SPEEDSOFT SYBIL2+ }
-TYPE TColorRef = LongInt;                             { TColorRef defined }
-     TPaintStruct = PaintStruct;
-     TWindowPos = WindowPos;
-     TSize = Size;
-     TWndClass = WndClass;
+TYPE
+   TColorRef = LongInt;                               { TColorRef defined }
+   TPaintStruct = PaintStruct;                        { TPaintStruct define }
+   TWindowPos = WindowPos;                            { TWindowPos defined }
+   TSize = Size;                                      { TSize defined }
+   TWndClass = WndClass;                              { TWndClass defined }
 {$ENDIF}
 
 {---------------------------------------------------------------------------}
@@ -1088,7 +1093,7 @@ BEGIN
          Event.What := evMouseDown;                   { Mouse down event }
          Event.Double := True;                        { Double click }
          MouseButtons := MouseButtons OR
-           mbLeftButton;                              { Set button mask }
+           mbRightButton;                             { Set button mask }
        End;
        WM_MButtonDown: Begin                          { MIDDLE MOUSE DOWN }
          Event.What := evMouseDown;                   { Mouse down event }
@@ -1122,11 +1127,6 @@ BEGIN
            MouseButtons := MouseButtons OR
              mbRightButton;                           { Set right button mask }
        End;
-       {$IFDEF BIT_32}
-       WM_Notify: Begin
-         I := 0;
-       End;
-       {$ENDIF}
        WM_EraseBkGnd: TvViewMsgHandler := 1;          { BACKGROUND MESSAGE }
        WM_Paint: If (P^.Dc = 0) Then Begin            { PAINT MESSAGE }
          P^.Dc := BeginPaint(Wnd, Ps);                { Fetch structure }
@@ -1929,7 +1929,7 @@ BEGIN
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (State AND sfIconised = 0) Then Begin              { View not iconised }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
@@ -2028,15 +2028,18 @@ END;
 PROCEDURE TView.DrawBorder;
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE ONLY }
-   BiColorRectangle(0, 0, RawSize.X, RawSize.Y, White,
-     DarkGray, False);                                { Draw 3d effect }
-   If (GOptions AND goThickFramed <> 0) Then Begin    { Thick frame at work }
-     GraphRectangle(1, 1, RawSize.X-1, RawSize.Y-1,
-       LightGray);                                    { Draw frame part 1 }
-     GraphRectangle(2, 2, RawSize.X-2, RawSize.Y-2,
-       LightGray);                                    { Fraw frame part 2 }
-     BiColorRectangle(3, 3, RawSize.X-3, RawSize.Y-3,
-       White, DarkGray, True);                        { Draw highlights }
+   If (TextModeGFV = FALSE) Then Begin                { GRAPHICS GFV MODE }
+     BiColorRectangle(0, 0, RawSize.X, RawSize.Y,
+       White, DarkGray, False);                       { Draw 3d effect }
+     If (GOptions AND goThickFramed <> 0) Then Begin  { Thick frame at work }
+       GraphRectangle(1, 1, RawSize.X-1, RawSize.Y-1,
+         LightGray);                                  { Draw frame part 1 }
+       GraphRectangle(2, 2, RawSize.X-2, RawSize.Y-2,
+         LightGray);                                  { Fraw frame part 2 }
+       BiColorRectangle(3, 3, RawSize.X-3, RawSize.Y-3,
+         White, DarkGray, True);                      { Draw highlights }
+     End;
+   End Else Begin                                     { TEXT GFV MODE }
    End;
    {$ENDIF}
 END;
@@ -2093,7 +2096,7 @@ VAR X1, Y1, X2, Y2: Integer; P: PGroup; ViewPort: ViewPortType; Ca: PComplexArea
 BEGIN
    If (MaxAvail >= SizeOf(TComplexArea)) Then Begin   { Check enough memory }
      GetMem(Ca, SizeOf(TComplexArea));                { Allocate memory }
-     GetViewSettings(ViewPort);                       { Fetch view port }
+     GetViewSettings(ViewPort, TextModeGFV);          { Fetch view port }
      Ca^.X1 := ViewPort.X1;                           { Hold current X1 }
      Ca^.Y1 := ViewPort.Y1;                           { Hold current Y1 }
      Ca^.X2 := ViewPort.X2;                           { Hold current X2 }
@@ -2126,7 +2129,7 @@ BEGIN
        If (X2 > ViewPort.X2) Then X2 := ViewPort.X2;  { Adjust x2 to locked }
        If (Y2 > ViewPort.Y2) Then Y2 := ViewPort.Y2;  { Adjust y2 to locked }
      End;
-     SetViewPort(X1, Y1, X2, Y2, ClipOn);             { Set new clip limits }
+     SetViewPort(X1, Y1, X2, Y2, ClipOn, TextModeGFV);{ Set new clip limits }
    End;
 END;
 
@@ -2135,13 +2138,14 @@ END;
 {---------------------------------------------------------------------------}
 PROCEDURE TView.DrawBackGround;
 VAR Bc: Byte; X1, Y1, X2, Y2: Integer; ViewPort: ViewPortType;
+{$IFDEF OS_DOS} X, Y: Integer; {$ENDIF}
 {$IFDEF OS_OS2} Ptl: PointL; {$ENDIF}
 BEGIN
    If (GOptions AND goNoDrawView = 0) Then Begin      { Non draw views exit }
      If (State AND sfDisabled = 0) Then
        Bc := GetColor(1) AND $F0 SHR 4 Else           { Select back colour }
        Bc := GetColor(4) AND $F0 SHR 4;               { Disabled back colour }
-     GetViewSettings(ViewPort);                       { Get view settings }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get view settings }
      If (ViewPort.X1 <= RawOrigin.X) Then X1 := 0     { Right to left edge }
        Else X1 := ViewPort.X1-RawOrigin.X;            { Offset from left }
      If (ViewPort.Y1 <= RawOrigin.Y) Then Y1 := 0     { Right to top edge }
@@ -2153,8 +2157,23 @@ BEGIN
        Y2 := RawSize.Y Else                           { Right to bottom edge }
        Y2 := ViewPort.Y2-RawOrigin.Y;                 { Offset from bottom }
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       SetFillStyle(SolidFill, Bc);                   { Set fill colour }
-       Bar(0, 0, X2-X1, Y2-Y1);                       { Clear the area }
+       If (TextModeGFV <> True) Then Begin            { GRAPHICS MODE GFV }
+         SetFillStyle(SolidFill, Bc);                 { Set fill colour }
+         Bar(0, 0, X2-X1, Y2-Y1);                     { Clear the area }
+       End Else Begin                                 { TEXT MODE GFV }
+         X1 := (RawOrigin.X+X1) DIV SysFontWidth;
+         Y1 := (RawOrigin.Y+Y1) DIV SysFontHeight;
+         X2 := (RawOrigin.X+X2) DIV SysFontWidth;
+         Y2 := (RawOrigin.Y+Y2) DIV SysFontHeight;
+         If (State AND sfDisabled = 0) Then
+           Bc := GetColor(1) Else           { Select back colour }
+           Bc := GetColor(4);               { Disabled back colour }
+         For Y := Y1 To Y2 Do
+           For X := X1 To X2 Do Begin
+             Mem[$B800:$0+(Y*ScreenWidth+X)*2] := $20;
+             Mem[$B800:$0+(Y*ScreenWidth+X)*2+1] := Bc;
+           End;
+       End;
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
      If (Dc <> 0) Then Begin                          { Valid device context }
@@ -2186,7 +2205,8 @@ BEGIN
    P := HoldLimit;                                    { Transfer pointer }
    If (P <> Nil) Then Begin                           { Valid complex area }
      HoldLimit := P^.NextArea;                        { Move to prior area }
-     SetViewPort(P^.X1, P^.Y1, P^.X2, P^.Y2, ClipOn); { Restore clip limits }
+     SetViewPort(P^.X1, P^.Y1, P^.X2, P^.Y2, ClipOn,
+       TextModeGFV);                                  { Restore clip limits }
      FreeMem(P, SizeOf(TComplexArea));                { Release memory }
    End;
 END;
@@ -2317,14 +2337,14 @@ END;
 PROCEDURE TView.ReDrawArea (X1, Y1, X2, Y2: Integer);
 VAR HLimit: PView; ViewPort: ViewPortType;
 BEGIN
-   GetViewSettings(ViewPort);                         { Hold view port }
-   SetViewPort(X1, Y1, X2, Y2, ClipOn);               { Set new clip limits }
+   GetViewSettings(ViewPort, TextModeGFV);            { Hold view port }
+   SetViewPort(X1, Y1, X2, Y2, ClipOn, TextModeGFV);  { Set new clip limits }
    HLimit := LimitsLocked;                            { Hold lock limits }
    LimitsLocked := @Self;                             { We are the lock view }
    DrawView;                                          { Redraw the area }
    LimitsLocked := HLimit;                            { Release our lock }
    SetViewPort(ViewPort.X1, ViewPort.Y1,
-     ViewPort.X2, ViewPort.Y2, ClipOn);               { Reset old limits }
+     ViewPort.X2, ViewPort.Y2, ClipOn, TextModeGFV);  { Reset old limits }
 END;
 
 {--TView--------------------------------------------------------------------}
@@ -4329,7 +4349,7 @@ BEGIN
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (Max <> Min) Then Begin                            { View has some size }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}
@@ -4369,7 +4389,7 @@ BEGIN
    If (State AND sfVisible <> 0) AND                  { View is visible }
    (State AND sfExposed <> 0) Then Begin              { View is exposed }
      SetViewLimits;                                   { Set view limits }
-     GetViewSettings(ViewPort);                       { Get set viewport }
+     GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
        {$IFDEF OS_DOS}
@@ -4584,13 +4604,14 @@ END;
 {---------------------------------------------------------------------------}
 FUNCTION TListViewer.GetText (Item: Integer; MaxLen: Integer): String;
 BEGIN                                                 { Abstract method }
+   GetText := '';                                     { Return empty }
 END;
 
 {--TListViewer--------------------------------------------------------------}
 {  DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB    }
 {---------------------------------------------------------------------------}
 PROCEDURE TListViewer.DrawBackGround;
-VAR SCOff: Byte; I, J, ColWidth, Item, Indent, CurCol: Integer; Color: Word;
+VAR  I, J, ColWidth, Item, Indent, CurCol: Integer; Color: Word;
     Text: String; B: TDrawBuffer;
     {$IFDEF OS_WINDOWS} S: String; {$ENDIF}           { WIN/NT CODE }
 
@@ -4643,9 +4664,9 @@ BEGIN
          MoveStr(B[CurCol+1], Text, Color);           { Transfer to buffer }
          If ShowMarkers Then Begin
            WordRec(B[CurCol]).Lo := Byte(
-             SpecialChars[SCOff]);                    { Set marker character }
+             SpecialChars[4]);                        { Set marker character }
            WordRec(B[CurCol+ColWidth-2]).Lo := Byte(
-             SpecialChars[SCOff+1]);                  { Set marker character }
+             SpecialChars[5]);                        { Set marker character }
          End;
        End;
        MoveChar(B[CurCol+ColWidth-1], #179,
@@ -4659,13 +4680,12 @@ END;
 {  DrawFocus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB         }
 {---------------------------------------------------------------------------}
 PROCEDURE TListViewer.DrawFocus;
-VAR DrawIt: Boolean; I, J, Item, CurCol, ColWidth: Integer;
+VAR DrawIt: Boolean; SCOff: Byte; I, J, Item, CurCol, ColWidth: Integer;
     Color: Word;
 
   Indent: Integer;
   B: TDrawBuffer;
-  Text,S: String;
-  SCOff: Byte;
+  Text: String;
 BEGIN
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (GOptions AND goNativeClass <> 0) Then Exit;    { Native class exits }
@@ -5462,7 +5482,7 @@ END;
 FUNCTION TView.Exposed: Boolean;
 VAR ViewPort: ViewPortType;
 BEGIN
-   GetViewSettings(ViewPort);                         { Fetch viewport }
+   GetViewSettings(ViewPort, TextModeGFV);            { Fetch viewport }
    If (State AND sfVisible<>0) AND                    { View visible }
      (State AND sfExposed<>0) AND                     { View exposed }
      OverlapsArea(ViewPort.X1, ViewPort.Y1,
@@ -5479,11 +5499,14 @@ VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}  { DOS/DPMI VARIABLES }
     {$IFDEF OS_OS2} I: LongInt; Lp: PointL; OPs: HPs; {$ENDIF}{ OS2 VARIABLES }
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   GetViewSettings(ViewPort);                         { Get viewport settings }
-   SetColor(Colour);                                  { Set line colour }
-   Line(RawOrigin.X + X1 - ViewPort.X1,
-     RawOrigin.Y + Y1 - ViewPort.Y1, RawOrigin.X + X2
-     - ViewPort.X1, RawOrigin.Y + Y2-ViewPort.Y1);    { Draw the line }
+   GetViewSettings(ViewPort, TextModeGFV);            { Get viewport settings }
+   If (TextModeGFV <> TRUE) Then Begin
+     SetColor(Colour);                                { Set line colour }
+     Line(RawOrigin.X + X1 - ViewPort.X1,
+       RawOrigin.Y + Y1 - ViewPort.Y1, RawOrigin.X + X2
+       - ViewPort.X1, RawOrigin.Y + Y2-ViewPort.Y1);  { Draw the line }
+   End Else Begin                                     { LEON???? }
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5549,11 +5572,14 @@ VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   SetColor(Colour);                                  { Set line colour }
-   GetViewSettings(ViewPort);
-   Rectangle(RawOrigin.X + X1 - ViewPort.X1, RawOrigin.Y + Y1
-     - ViewPort.Y1, RawOrigin.X + X2 - ViewPort.X1,
-     RawOrigin.Y+Y2-ViewPort.Y1);                     { Draw a rectangle }
+   If (TextModeGFV <> TRUE) Then Begin                { GRAPHICS MODE GFV }
+     SetColor(Colour);                                { Set line colour }
+     GetViewSettings(ViewPort, TextModeGFV);
+     Rectangle(RawOrigin.X + X1 - ViewPort.X1, RawOrigin.Y + Y1
+       - ViewPort.Y1, RawOrigin.X + X2 - ViewPort.X1,
+       RawOrigin.Y+Y2-ViewPort.Y1);                   { Draw a rectangle }
+   End Else Begin                                     { LEON???? }
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5619,16 +5645,28 @@ END;
 {  ClearArea -> Platforms DOS/DPMI/WIN/OS2 - Checked 19Sep97 LdB            }
 {---------------------------------------------------------------------------}
 PROCEDURE TView.ClearArea (X1, Y1, X2, Y2: Integer; Colour: Byte);
-VAR {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+VAR {$IFDEF OS_DOS} X, Y: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
     {$IFDEF OS_OS2} Lp: PointL; OPs: HPs; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}                                    { DOS/DPMI CODE }
-   GetViewSettings(ViewPort);                         { Get viewport }
-   SetFillStyle(SolidFill, Colour);                   { Set colour up }
-   Bar(RawOrigin.X+X1-ViewPort.X1, RawOrigin.Y+Y1-
-     ViewPort.Y1, RawOrigin.X+X2-ViewPort.X1,
-     RawOrigin.Y+Y2-ViewPort.Y1);                     { Clear the area }
+   GetViewSettings(ViewPort, TextModeGFV);            { Get viewport }
+   If (TextModeGFV <> TRUE) Then Begin                { GRAPHICAL GFV MODE }
+     SetFillStyle(SolidFill, Colour);                 { Set colour up }
+     Bar(RawOrigin.X+X1-ViewPort.X1, RawOrigin.Y+Y1-
+       ViewPort.Y1, RawOrigin.X+X2-ViewPort.X1,
+       RawOrigin.Y+Y2-ViewPort.Y1);                   { Clear the area }
+   End Else Begin                                     { TEXT MODE GFV }
+     X1 := (RawOrigin.X+X1) DIV SysFontWidth;
+     Y1 := (RawOrigin.Y+Y1) DIV SysFontHeight;
+     X2 := (RawOrigin.X+X2) DIV SysFontWidth;
+     Y2 := (RawOrigin.Y+Y2) DIV SysFontHeight;
+     For Y := Y1 To Y2 Do
+       For X := X1 To X2 Do Begin
+         Mem[$B800:$0+(Y*ScreenWidth+X)*2] := $20;
+         Mem[$B800:$0+(Y*ScreenWidth+X)*2+1] := Colour SHL 4;
+       End;
+   End;
    {$ENDIF}
    {$IFDEF OS_WINDOWS}                                { WIN/NT CODE }
    If (HWindow <> 0) Then Begin                       { Valid window }
@@ -5674,7 +5712,7 @@ END;
 PROCEDURE TView.GraphArc (Xc, Yc: Integer; Sa, Ea: Real; XRad, YRad: Integer;
 Colour: Byte);
 CONST RadConv  = 57.2957795130823229;                 { Degrees per radian }
-VAR X1, Y1, X2, Y2: Integer; {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
+VAR X1, Y1, X2, Y2, X3, Y3: Integer; {$IFDEF OS_WINDOWS} ODc: hDc; {$ENDIF}
 BEGIN
    {$IFDEF OS_WINDOWS}
    Xc := Xc - FrameSize;
@@ -5688,16 +5726,23 @@ BEGIN
    Y1 := Yc - Round(Cos(Sa)*YRad);                    { Calc 1st y value }
    X2 := Xc + Round(Sin(Sa+Ea)*XRad);                 { Calc 2nd x value }
    Y2 := Yc - Round(Cos(Sa+Ea)*YRad);                 { Calc 2nd y value }
+   X3 := X2;                                          { Use X2 value }
+   Y3 := Y2;                                          { Use Y2 value }
+   If (Abs(Ea) > Pi) Then Begin
+     X3 := Xc + Round(Sin(Sa+Pi)*XRad);               { Calc 3rd x value }
+     Y3 := Yc - Round(Cos(Sa+Pi)*YRad);               { Calc 3rd y value }
+   End;
    {$IFDEF OS_WINDOWS}
    If (HWindow <> 0) Then Begin                       { Valid window }
      ODc := Dc;                                       { Hold device context }
      If (Dc = 0) Then Dc := GetDC(HWindow);           { Create a context }
      SelectObject(Dc, ColPen[Colour]);                { Pen colour }
-     If (XRad > 2 ) AND (YRAd > 2) Then Begin         { Must exceed 2x2 arc }
+     If (Abs(X1-X3) > 1) OR (Abs(Y1-Y3) > 1)          { Must exceed 2x2 arc }
+     Then Begin
        If (Ea < 0) Then
          Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
            X1, Y1, X2, Y2) Else                       { Draw c/clkwise arc }
-         Arc(Dc, Xc-XRad, Yc+YRad, Xc+XRad, Yc-YRad,
+         Arc(Dc, Xc-XRad, Yc-YRad, Xc+XRad, Yc+YRad,
            X2, Y2, X1, Y1);                           { Draw clockwise arc }
      End;
      If (ODc = 0) Then ReleaseDC(HWindow, Dc);        { Release context }
@@ -5779,7 +5824,7 @@ END;
 
 PROCEDURE TView.WriteBuf (X, Y, W, H: Integer; Var Buf);
 VAR I, J, K, L, CW: Integer; P: PDrawBuffer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+    {$IFDEF OS_DOS} Tix, Tiy: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5795,9 +5840,9 @@ BEGIN
        Y := Y * SysFontHeight;                        { Y graphical adjust }
      End;
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       GetViewSettings(ViewPort);                     { Get current viewport }
-       X := X + RawOrigin.X - ViewPort.X;             { Calc x position }
-       Y := Y + RawOrigin.Y - ViewPort.Y;             { Calc y position }
+       GetViewSettings(ViewPort, TextModeGFV);        { Get current viewport }
+       X := X + RawOrigin.X - ViewPort.X1;            { Calc x position }
+       Y := Y + RawOrigin.Y - ViewPort.Y1;            { Calc y position }
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
        ODc := Dc;                                     { Hold device context }
@@ -5815,11 +5860,18 @@ BEGIN
        For I := 0 To (W-1) Do Begin                   { For each character }
          Cw := TextWidth(Chr(Lo(P^[L])));             { Width of this char }
          {$IFDEF OS_DOS}                              { DOS/DPMI CODE }
-           SetFillStyle(SolidFill, Hi(P^[L]) AND $F0
-             SHR 4);                                  { Set back colour }
-           SetColor(Hi(P^[L]) AND $0F);               { Set text colour }
-           Bar(K, Y, K+Cw, Y+FontHeight-1);           { Clear text backing }
-           OutTextXY(K, Y+2, Chr(Lo(P^[L])));         { Write text char }
+           If (TextModeGFV <> TRUE) Then Begin        { GRAPHICAL MODE GFV }
+             SetFillStyle(SolidFill, Hi(P^[L]) AND
+               $F0 SHR 4);                            { Set back colour }
+             SetColor(Hi(P^[L]) AND $0F);             { Set text colour }
+             Bar(K, Y, K+Cw, Y+FontHeight-1);         { Clear text backing }
+             OutTextXY(K, Y+2, Chr(Lo(P^[L])));       { Write text char }
+           End Else Begin                             { TEXT MODE GFV }
+             Tix := (K + ViewPort.X1) DIV SysFontWidth;
+             Tiy := (Y + 2 + ViewPort.Y1) DIV SysFontHeight;
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Lo(P^[L]);
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := Hi(P^[L]);
+           End;
          {$ENDIF}
          {$IFDEF OS_WINDOWS}                          { WIN/NT CODE }
            SetBkColor(Dc, ColRef[Hi(P^[L]) AND $F0
@@ -5855,7 +5907,7 @@ END;
 
 PROCEDURE TView.WriteLine (X, Y, W, H: Integer; Var Buf);
 VAR I, J, K, Cw: Integer; P: PDrawBuffer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+    {$IFDEF OS_DOS} Tix, Tiy: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5870,9 +5922,9 @@ BEGIN
        Y := Y * SysFontHeight;                        { Y graphical adjust }
      End;
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
-       GetViewSettings(ViewPort);                     { Get current viewport }
-       X := X + RawOrigin.X - ViewPort.X;             { Calc x position }
-       Y := Y + RawOrigin.Y - ViewPort.Y;             { Calc y position }
+       GetViewSettings(ViewPort, TextModeGFV);        { Get current viewport }
+       X := X + RawOrigin.X - ViewPort.X1;            { Calc x position }
+       Y := Y + RawOrigin.Y - ViewPort.Y1;            { Calc y position }
      {$ENDIF}
      {$IFDEF OS_WINDOWS}                              { WIN/NT CODE }
        ODc := Dc;                                     { Hold device context }
@@ -5890,11 +5942,18 @@ BEGIN
        For I := 0 To (W-1) Do Begin                   { For each character }
          Cw := TextWidth(Chr(Lo(P^[I])));             { Width of this char }
          {$IFDEF OS_DOS}                              { DOS/DPMI CODE }
-           SetFillStyle(SolidFill, Hi(P^[I]) AND $F0
-             SHR 4);                                  { Set back colour }
-           SetColor(Hi(P^[I]) AND $0F);               { Set text colour }
-           Bar(K, Y, K+Cw, Y+FontHeight-1);           { Clear text backing }
-           OutTextXY(K, Y+2, Chr(Lo(P^[I])));         { Write text char }
+           If (TextModeGFV <> TRUE) Then Begin        { GRAPHICAL MODE GFV }
+             SetFillStyle(SolidFill, Hi(P^[I]) AND
+               $F0 SHR 4);                            { Set back colour }
+             SetColor(Hi(P^[I]) AND $0F);             { Set text colour }
+             Bar(K, Y, K+Cw, Y+FontHeight-1);         { Clear text backing }
+             OutTextXY(K, Y+2, Chr(Lo(P^[I])));       { Write text char }
+           End Else Begin                             { TEXT MODE GFV }
+             Tix := (K + ViewPort.X1) DIV SysFontWidth;
+             Tiy := (Y + ViewPort.Y1 + 2) DIV SysFontHeight;
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Lo(P^[I]);
+             Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := Hi(P^[I]);
+           End;
          {$ENDIF}
          {$IFDEF OS_WINDOWS}                          { WIN/NT CODE }
            SetBkColor(Dc, ColRef[Hi(P^[I]) AND $F0
@@ -5956,8 +6015,8 @@ BEGIN
 END;
 
 PROCEDURE TView.WriteStr (X, Y: Integer; Str: String; Color: Byte);
-VAR Fc, Bc: Byte; X1, Y1, X2, Y2: Integer;
-    {$IFDEF OS_DOS} ViewPort: ViewPortType; {$ENDIF}
+VAR Fc, Bc, B: Byte; X1, Y1, X2, Y2: Integer;
+    {$IFDEF OS_DOS} Tix, Tiy, Ti: Integer; ViewPort: ViewPortType; {$ENDIF}
     {$IFDEF OS_WINDOWS} ODc: HDc; P: Pointer; {$ENDIF}
     {$IFDEF OS_OS2} OPs: HPs; P: Pointer; Pt: PointL; {$ENDIF}
 BEGIN
@@ -5969,6 +6028,14 @@ BEGIN
      Fc := GetColor(Color);                           { Get view color }
      Bc := Fc AND $F0 SHR 4;                          { Calc back colour }
      Fc := Fc AND $0F;                                { Calc text colour }
+
+     If RevCol Then Begin
+       B := Bc;
+       Bc := Fc;
+       Fc := B;
+     End;
+
+
      {$IFDEF OS_DOS}
      If (X >= 0) AND (Y >= 0) Then Begin
        X := RawOrigin.X+X*FontWidth;                    { X position }
@@ -5977,12 +6044,23 @@ BEGIN
        X := RawOrigin.X + Abs(X);
        Y := RawOrigin.Y + Abs(Y);
      End;
-     GetViewSettings(ViewPort);
-     SetFillStyle(SolidFill, Bc);                     { Set fill style }
-     Bar(X-ViewPort.X1, Y-ViewPort.Y1,
-       X-ViewPort.X1+Length(Str)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
-     SetColor(Fc);
-     OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1+2, Str);    { Write text char }
+     GetViewSettings(ViewPort, TextModeGFV);
+     If (TextModeGFV <> TRUE) Then Begin              { GRAPHICAL MODE GFV }
+       SetFillStyle(SolidFill, Bc);                   { Set fill style }
+       Bar(X-ViewPort.X1, Y-ViewPort.Y1,
+         X-ViewPort.X1+Length(Str)*FontWidth,
+         Y-ViewPort.Y1+FontHeight-1);
+       SetColor(Fc);
+       OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1+2, Str);{ Write text char }
+     End Else Begin                                   { TEXT MODE GFV }
+       Tix := X DIV SysFontWidth;
+       Tiy := Y DIV SysFontHeight;
+       For Ti := 1 To length(Str) Do Begin
+         Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Ord(Str[Ti]);
+         Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := GetColor(Color);
+         Tix := Tix + SysFontWidth;
+       End;
+     End;
      {$ENDIF}
      {$IFDEF OS_WINDOWS}
      If (HWindow <> 0) Then Begin
@@ -6062,12 +6140,14 @@ END;
 
 PROCEDURE TView.WriteChar (X, Y: Integer; C: Char; Color: Byte;
   Count: Integer);
-VAR Fc, Bc: Byte; I: Integer; Col: Word; S: String; ViewPort: ViewPortType;
+{$IFDEF OS_DOS}
+VAR Fc, Bc: Byte; I, Ti, Tix, Tiy: Integer; Col: Word; S: String; ViewPort: ViewPortType;
+{$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}
    If (State AND sfVisible <> 0) AND                  { View visible }
    (State AND sfExposed <> 0) Then Begin              { View exposed }
-     GetViewSettings(ViewPort);
+     GetViewSettings(ViewPort, TextModeGFV);
      Col := GetColor(Color);                          { Get view color }
      Fc := Col AND $0F;                               { Foreground colour }
      Bc := Col AND $F0 SHR 4;                         { Background colour }
@@ -6077,11 +6157,22 @@ BEGIN
      While (Count>0) Do Begin
        If (Count>255) Then I := 255 Else I := Count;  { Size to make }
        S[0] := Chr(I);                                { Set string length }
-       SetFillStyle(SolidFill, Bc);                   { Set fill style }
-       Bar(X-ViewPort.X1, Y-ViewPort.Y1,
-         X-ViewPort.X1+Length(S)*FontWidth, Y-ViewPort.Y1+FontHeight-1);
-       SetColor(Fc);
-       OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1, S);    { Write text char }
+       If (TextModeGFV <> TRUE) Then Begin            { GRAPHICAL MODE GFV }
+         SetFillStyle(SolidFill, Bc);                 { Set fill style }
+         Bar(X-ViewPort.X1, Y-ViewPort.Y1,
+           X-ViewPort.X1+Length(S)*FontWidth,
+           Y-ViewPort.Y1+FontHeight-1);
+         SetColor(Fc);
+         OutTextXY(X-ViewPort.X1, Y-ViewPort.Y1, S);  { Write text char }
+       End Else Begin                                 { TEXT MODE GFV }
+         Tix := X DIV SysFontWidth;
+         Tiy := Y DIV SysFontHeight;
+         For Ti := 1 To length(S) Do Begin
+           Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2] := Ord(S[Ti]);
+           Mem[$B800:$0+((Tiy * ScreenWidth)+Tix)*2+1] := GetColor(Color);
+           Tix := Tix + SysFontWidth;
+         End;
+       End;
        Count := Count - I;                            { Subtract count }
        X := X + I*FontWidth;                          { Move x position }
      End;
@@ -6155,9 +6246,9 @@ BEGIN
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
      HideMouseCursor;                                 { Hide the mouse }
      {$ENDIF}
-     SetWriteMode(XORPut);
+     SetWriteMode(XORPut, TextModeGFV);
      GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-     SetWriteMode(NormalPut);
+     SetWriteMode(NormalPut, TextModeGFV);
      {$IFDEF OS_DOS}                                  { DOS/DPMI CODE }
      ShowMouseCursor;                                 { Show the mouse }
      {$ENDIF}
@@ -6182,13 +6273,13 @@ BEGIN
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
        HideMouseCursor;                               { Hide the mouse }
        {$ENDIF}
-       SetWriteMode(XORPut);
+       SetWriteMode(XORPut, TextModeGFV);
        GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-       SetWriteMode(NormalPut);
+       SetWriteMode(NormalPut, TextModeGFV);
        MoveGrow(R, Mouse);                            { Resize the view }
-       SetWriteMode(XORPut);
+       SetWriteMode(XORPut, TextModeGFV);
        GraphRectangle(0, 0, RawSize.X, RawSize.Y, Red);
-       SetWriteMode(NormalPut);
+       SetWriteMode(NormalPut, TextModeGFV);
        {$IFDEF OS_DOS}                                { DOS/DPMI CODE }
        ShowMouseCursor;                               { Show the mouse }
        {$ENDIF}
@@ -6495,7 +6586,8 @@ BEGIN
 END;
 
 PROCEDURE TWindow.DrawBorder;
-VAR Fc, Bc: Byte; X, Y: Integer; S: String; ViewPort: ViewPortType;
+{$IFDEF OS_DOS} VAR Fc, Bc: Byte; X, Y: Integer; S: String;
+ViewPort: ViewPortType; {$ENDIF}
 BEGIN
    {$IFDEF OS_DOS}
    Fc := GetColor(2) AND $0F;                        { Foreground colour }
@@ -6506,28 +6598,40 @@ BEGIN
    ClearArea(0, Y, RawSize.X, Y+FontHeight, Bc);      { Clear background }
    If (Title<>Nil) AND (GOptions AND goTitled<>0)
    Then Begin                                         { View has a title }
-     GetViewSettings(ViewPort);
+     GetViewSettings(ViewPort, TextModeGFV);
      X := (RawSize.X DIV 2);                          { Half way point }
      X := X - (Length(Title^)*FontWidth) DIV 2;       { Calc start point }
-     SetColor(Fc);
-     OutTextXY(RawOrigin.X+X-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, Title^);          { Write the title }
+     If (TextModeGFV <> TRUE) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(Fc);
+       OutTextXY(RawOrigin.X+X-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, Title^);      { Write the title }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    If (Number>0) AND (Number<10) Then Begin           { Valid number }
      Str(Number, S);                                  { Make number string }
-     SetColor(GetColor(2) AND $0F);
-     OutTextXY(RawOrigin.X+RawSize.X-2*FontWidth-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, S);               { Write number }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(GetColor(2) AND $0F);
+       OutTextXY(RawOrigin.X+RawSize.X-2*FontWidth-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, S);           { Write number }
+     End Else Begin                                   { LEON ????? }
+     End;
    End;
    If (Flags AND wfClose<>0) Then Begin               { Close icon request }
-     SetColor(Fc);
-     OutTextXY(RawOrigin.X+Y+FontWidth-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, '[*]');           { Write close icon }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(Fc);
+       OutTextXY(RawOrigin.X+Y+FontWidth-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, '[*]');       { Write close icon }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    If (Flags AND wfZoom<>0) Then Begin
-     SetColor(GetColor(2) AND $0F);
-     OutTextXY(RawOrigin.X+RawSize.X-4*FontWidth-Y-ViewPort.X1,
-       RawOrigin.Y+Y+1-ViewPort.Y1+2, '['+#24+']');     { Write zoom icon }
+     If (TextModeGFV <> True) Then Begin              { GRAPHICS MODE GFV }
+       SetColor(GetColor(2) AND $0F);
+       OutTextXY(RawOrigin.X+RawSize.X-4*FontWidth-Y-ViewPort.X1,
+         RawOrigin.Y+Y+1-ViewPort.Y1+2, '['+#24+']'); { Write zoom icon }
+     End Else Begin                                   { LEON??? }
+     End;
    End;
    BiColorRectangle(Y+1, Y+1, RawSize.X-Y-1, Y+FontHeight,
      White, DarkGray, False);                         { Draw 3d effect }
@@ -6628,7 +6732,10 @@ END.
 
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:22  marco
+ Revision 1.3  2001-04-10 21:29:55  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:22  marco
   * CVS log and ID tags
 
 

+ 5 - 2
fvision/xmsunit.pas

@@ -7,7 +7,7 @@
 {                                                          }
 {        Copyright (c) 1998 by Leon de Boer                }
 {       [email protected]  - primary e-mail address    }
-{       ldeboer@starwon.com.au - backup e-mail address     }
+{       ldeboer@projectent.com.au - backup e-mail address  }
 {                                                          }
 {****************[ THIS CODE IS FREEWARE ]*****************}
 {                                                          }
@@ -510,7 +510,10 @@ END;
 END.
 {
  $Log$
- Revision 1.2  2000-08-24 12:00:23  marco
+ Revision 1.3  2001-04-10 21:29:56  pierre
+  * import of Leon de Boer's files
+
+ Revision 1.2  2000/08/24 12:00:23  marco
   * CVS log and ID tags