Browse Source

* import of Leon de Boer's files

pierre 24 năm trước cách đây
mục cha
commit
e720096155
22 tập tin đã thay đổi với 1388 bổ sung719 xóa
  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