Browse Source

* fix Shadow bugs

pierre 24 years ago
parent
commit
52f77478c0
2 changed files with 222 additions and 106 deletions
  1. 111 53
      fv/views.pas
  2. 111 53
      fvision/views.pas

+ 111 - 53
fv/views.pas

@@ -182,6 +182,8 @@ CONST
    vdBorder  = $08;                                   { Draw view border }
    vdFocus   = $10;                                   { Draw focus state }
    vdNoChild = $20;                                   { Draw no children }
+   vdShadow  = $40;
+   vdAll     = vdBackGnd + vdInner + vdCursor + vdBorder + vdFocus + vdShadow;
 
 {---------------------------------------------------------------------------}
 {                            TView HELP CONTEXTS                            }
@@ -836,6 +838,7 @@ CONST
      Store:   @TWindow.Store                          { Object store method }
    );
 
+
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
                              IMPLEMENTATION
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
@@ -1228,12 +1231,6 @@ PROCEDURE TView.DrawView;
 VAR ViewPort: ViewPortType;                           { Common variables }
     Parent : PGroup;
 BEGIN
-   Parent:=Owner;
-   While Assigned(Parent) do Begin
-     If (Parent^.LockFlag>0) then
-       exit;
-     Parent:=Parent^.Owner;
-   End;
    If (State AND sfVisible <> 0) AND                  { View is visible }
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (State AND sfIconised = 0) Then Begin              { View not iconised }
@@ -1241,6 +1238,16 @@ BEGIN
      GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
+         Parent:=Owner;
+         While Assigned(Parent) do Begin
+           If (Parent^.LockFlag>0) then
+             Begin
+               If (DrawMask = 0) OR (DrawMask = vdNoChild)  then
+                 SetDrawMask(vdAll);
+               exit;
+             End;
+           Parent:=Parent^.Owner;
+         End;
          HideMouseCursor;                             { Hide mouse cursor }
          If (DrawMask = 0) OR (DrawMask = vdNoChild)  { No special masks set }
             { OR Assigned(LimitsLocked) }
@@ -1254,9 +1261,11 @@ BEGIN
            If (Options AND ofFramed <> 0) OR
            (GOptions AND goThickFramed <> 0)          { View has border }
              Then DrawBorder;                         { Draw border }
+{$ifndef NoShadow}
            If ((State AND sfShadow) <> 0) AND
               (GOptions And goNoShadow = 0) Then
              DrawShadow;
+{$endif ndef NoShadow}
          End Else Begin                               { Masked draws only  }
            If (DrawMask AND vdBackGnd <> 0) Then      { Chk background mask }
              Begin
@@ -1284,6 +1293,16 @@ BEGIN
                DrawMask := DrawMask and Not vdBorder;
                DrawBorder;                              { Draw border }
              End;
+{$ifndef NoShadow}
+           If ((State AND sfShadow) <> 0) AND
+              (DrawMask AND vdShadow <> 0) AND
+              (GOptions And goNoShadow = 0) AND
+              (not assigned(Owner) OR (Owner^.GOptions And goNoShadow = 0)) Then
+             Begin
+               DrawMask := DrawMask and Not vdShadow;
+               DrawShadow;
+             End;
+{$endif ndef NoShadow}
          End;
          ShowMouseCursor;                             { Show mouse cursor }
      End;
@@ -1384,6 +1403,14 @@ END;
 PROCEDURE TView.DrawShadow;
 VAR X1, Y1, X2, Y2 : Integer;
 BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'DrawShadow');
+     End;
+{$endif DEBUG}
   If not TextModeGFV then
     exit;
   If Assigned(Owner) Then Begin
@@ -1392,6 +1419,7 @@ BEGIN
     Y1:=RawOrigin.Y+SysFontHeight;
     Y2:=RawOrigin.Y+RawSize.Y+1+ShadowSize.Y*SysFontHeight;
     GOptions := GOptions OR goNoShadow;
+    Owner^.GOptions := Owner^.GOptions OR goNoShadow;
     Owner^.RedrawArea(X1,Y1,X2,Y2);
     WriteShadow(X1 div SysFontWidth, Y1 div SysFontHeight,
       X2 div SysFontWidth, Y2 div SysFontHeight);
@@ -1403,6 +1431,7 @@ BEGIN
     WriteShadow(X1 div SysFontWidth, Y1 div SysFontHeight,
       X2 div SysFontWidth, Y2 div SysFontHeight);
     GOptions := GOptions AND not goNoShadow;
+    Owner^.GOptions := Owner^.GOptions AND not goNoShadow;
   End;
 END;
 
@@ -1498,6 +1527,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, TextModeGFV);{ Set new clip limits }
    End;
 END;
@@ -1609,18 +1639,6 @@ BEGIN
      Mask := Mask AND NOT vdFocus;                    { Clear focus draws }
    OldMask:=DrawMask;
    DrawMask := DrawMask OR Mask;                      { Set draw masks }
-   (*If TextModeGFV and (DrawMask<>0) and (DrawMask<>OldMask) then Begin
-     Mask:=vdBackGnd OR vdInner OR vdBorder OR vdCursor OR vdFocus;
-     If (Options AND ofFramed = 0) AND                  { Check for no frame }
-       (GOptions AND goThickFramed = 0) AND             { Check no thick frame }
-       (GOptions AND goTitled = 0) Then                 { Check for title }
-         Mask := Mask AND NOT vdBorder;                 { Clear border draw }
-     If (State AND sfCursorVis = 0) Then                { Check for no cursor }
-       Mask := Mask AND NOT vdCursor;                   { Clear cursor draw }
-     If (GOptions AND goDrawFocus = 0) Then             { Check no focus draw }
-       Mask := Mask AND NOT vdFocus;                    { Clear focus draws }
-     DrawMask := DrawMask OR Mask;                      { Set draw masks }
-   End; *)
 END;
 
 {--TView--------------------------------------------------------------------}
@@ -1675,7 +1693,11 @@ BEGIN
        Owner^.RemoveView(@Self);                      { Remove from list }
        Owner^.InsertView(@Self, Target);              { Insert into list }
        State := State OR sfVisible;                   { Allow drawing again }
-       If (LastView <> Target) Then DrawView;         { Draw the view now }
+       If (LastView <> Target) Then
+         Begin
+           SetDrawMask(vdAll);
+           DrawView;         { Draw the view now }
+         End;
        If (Options AND ofSelectable <> 0) Then        { View is selectable }
          If (Owner <> Nil) Then Owner^.ResetCurrent;  { Reset current }
        Owner^.Unlock;
@@ -1714,6 +1736,14 @@ END;
 PROCEDURE TView.ReDrawArea (X1, Y1, X2, Y2: Integer);
 VAR HLimit: PView; ViewPort: ViewPortType;
 BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'ReDrawArea(',X1,',',Y1,',',X2,',',Y2,')');
+     End;
+{$endif DEBUG}
    GetViewSettings(ViewPort, TextModeGFV);            { Hold view port }
    If TextModeGFV then Begin
      X1 := X1 div SysFontWidth;
@@ -2595,8 +2625,8 @@ BEGIN
      sfFocused: Begin
          If (Current <> Nil) Then
            Current^.SetState(sfFocused, Enable);          { Focus current view }
-         If TextModeGFV then
-           SetDrawMask(vdBackGnd OR vdFocus OR vdInner OR vdBorder); { Set redraw masks }
+         {If TextModeGFV then
+           SetDrawMask(vdBackGnd OR vdFocus OR vdInner OR vdBorder);  Set redraw masks }
        End;
      sfExposed: Begin
          ForEach(@DoExpose);                          { Expose each subview }
@@ -4562,7 +4592,6 @@ BEGIN
    End;
 END;
 
-{define DirectWrite}
 PROCEDURE TView.WriteAbs(X, Y, L : Integer; Var Buf);
 VAR
   P: PGroup;
@@ -4570,16 +4599,18 @@ VAR
   CurOrigin : TPoint;
   I,XI : longint;
   ViewPort : ViewPortType;
-BEGIN
+  Skip : boolean;
+BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'WriteAbs(',X,',',Y,',',L,',',hexstr(longint(@Buf),8),')');
+     End;
+{$endif DEBUG}
   { Direct wrong method }
   GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
-{$ifdef DirectWrite}
-  For i:=0 to L-1 do Begin
-    if (X+I>=ViewPort.X1) AND (Y>=ViewPort.Y1) AND
-       (X+I<ViewPort.X2) AND (Y<ViewPort.Y2) Then
-      VideoBuf^[Y*ScreenWidth+X+i]:=TDrawBuffer(Buf)[i];
-  End;
-{$else not DirectWrite}
   { Pedestrian character method }
   { Must be in area }
   If (X+L<ViewPort.X1) OR (Y<ViewPort.Y1) OR
@@ -4593,35 +4624,48 @@ BEGIN
     If (XI<ViewPort.X1) OR
        (XI>=ViewPort.X2) Then
       Continue;
+    Skip:=false;
     While Assigned(P) do Begin
+      { If parent not visible or
+        position outside parent's limit then skip }
       if not assigned(P^.Buffer) AND
          (((P^.State AND sfVisible) = 0) OR
-         (P^.Origin.X>XI) OR (P^.Origin.X+P^.Size.X<=XI) OR
-         (P^.Origin.Y>Y) OR (P^.Origin.Y+P^.Size.Y<=Y)) then
-        continue;
+         (XI<P^.Origin.X) OR (XI>=P^.Origin.X+P^.Size.X) OR
+         (Y<P^.Origin.Y) OR (Y>=P^.Origin.Y+P^.Size.Y)) then
+        Begin
+          Skip:=true;
+          Break;
+        End;
       { Here we must check if X,Y is exposed for this view }
       PP:=P^.Last;
       { move to first }
       If Assigned(PP) then
         PP:=PP^.Next;
       While Assigned(PP) and (PP<>P^.Last) and (PP<>PrevP) do Begin
+        { If position is owned by another view that is before self
+         then skip }
         If ((PP^.State AND sfVisible) <> 0) AND
-           (PP^.Origin.X>=XI) AND
-           (PP^.Origin.X+PP^.Size.X<XI) AND
-           (PP^.Origin.Y>=Y) AND
-           (PP^.Origin.Y+PP^.Size.Y<Y) then
-          exit;
+           (XI>=PP^.Origin.X) AND
+           (XI<PP^.Origin.X+PP^.Size.X) AND
+           (Y>=PP^.Origin.Y) AND
+           (Y<PP^.Origin.Y+PP^.Size.Y) then
+          Begin
+            Skip:=true;
+            break;
+          End;
         PP:=PP^.Next;
       End;
 
-      If Assigned(P^.Buffer) then Begin
+      If Not Skip and Assigned(P^.Buffer) then Begin
         P^.Buffer^[(Y-P^.Origin.Y)*P^.size.X+(XI-P^.Origin.X)]:=TDrawBuffer(Buf)[I];
       End;
       PrevP:=P;
-      P:=P^.Owner;
+      If Skip then
+        P:=Nil
+      else
+        P:=P^.Owner;
     End;
   End;
-{$endif not DirectWrite}
 END;
 
 {define DirectWriteShadow}
@@ -4633,6 +4677,7 @@ VAR
   I,J : longint;
   B : Word;
   ViewPort : ViewPortType;
+  Skip : boolean;
 BEGIN
   { Direct wrong method }
   GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
@@ -4661,12 +4706,16 @@ BEGIN
     If (XI<ViewPort.X1) OR
        (XI>=ViewPort.X2) Then
       Continue;    }
+    Skip:=false;
     While Assigned(P) do Begin
       if not assigned(P^.Buffer) AND
          (((P^.State AND sfVisible) = 0) OR
-         (P^.Origin.X>I) OR (P^.Origin.X+P^.Size.X<=I) OR
-         (P^.Origin.Y>J) OR (P^.Origin.Y+P^.Size.Y<=J)) then
-        continue;
+         (I<P^.Origin.X) OR (I>=P^.Origin.X+P^.Size.X) OR
+         (J<P^.Origin.Y) OR (J>=P^.Origin.Y+P^.Size.Y)) then
+        Begin
+          Skip:=true;
+          Break;
+        End;
       { Here we must check if X,Y is exposed for this view }
       PP:=P^.Last;
       { move to first }
@@ -4674,20 +4723,26 @@ BEGIN
         PP:=PP^.Next;
       While Assigned(PP) and (PP<>P^.Last) and (PP<>PrevP) do Begin
         If ((PP^.State AND sfVisible) <> 0) AND
-           (PP^.Origin.X>=I) AND
-           (PP^.Origin.X+PP^.Size.X<I) AND
-           (PP^.Origin.Y>=J) AND
-           (PP^.Origin.Y+PP^.Size.Y<J) then
-          continue;
+           (I>=PP^.Origin.X) AND
+           (I<PP^.Origin.X+PP^.Size.X) AND
+           (J>=PP^.Origin.Y) AND
+           (J<PP^.Origin.Y+PP^.Size.Y) then
+          Begin
+            Skip:=true;
+            Break;
+          End;
         PP:=PP^.Next;
       End;
 
-      If Assigned(P^.Buffer) then Begin
+      If not Skip and Assigned(P^.Buffer) then Begin
         B:=P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)];
-        P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)]:= (B and $7FF);
+        P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)]:= (B and $FFF);
       End;
       PrevP:=P;
-      P:=P^.Owner;
+      If Skip then
+        P:=Nil
+      else
+        P:=P^.Owner;
     End;
   End;
   End;
@@ -5088,7 +5143,10 @@ END.
 
 {
  $Log$
- Revision 1.10  2001-05-10 16:46:28  pierre
+ Revision 1.11  2001-05-30 10:22:25  pierre
+  * fix Shadow bugs
+
+ Revision 1.10  2001/05/10 16:46:28  pierre
   + some improovements made
 
  Revision 1.9  2001/05/07 23:36:35  pierre

+ 111 - 53
fvision/views.pas

@@ -182,6 +182,8 @@ CONST
    vdBorder  = $08;                                   { Draw view border }
    vdFocus   = $10;                                   { Draw focus state }
    vdNoChild = $20;                                   { Draw no children }
+   vdShadow  = $40;
+   vdAll     = vdBackGnd + vdInner + vdCursor + vdBorder + vdFocus + vdShadow;
 
 {---------------------------------------------------------------------------}
 {                            TView HELP CONTEXTS                            }
@@ -836,6 +838,7 @@ CONST
      Store:   @TWindow.Store                          { Object store method }
    );
 
+
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
                              IMPLEMENTATION
 {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
@@ -1228,12 +1231,6 @@ PROCEDURE TView.DrawView;
 VAR ViewPort: ViewPortType;                           { Common variables }
     Parent : PGroup;
 BEGIN
-   Parent:=Owner;
-   While Assigned(Parent) do Begin
-     If (Parent^.LockFlag>0) then
-       exit;
-     Parent:=Parent^.Owner;
-   End;
    If (State AND sfVisible <> 0) AND                  { View is visible }
    (State AND sfExposed <> 0) AND                     { View is exposed }
    (State AND sfIconised = 0) Then Begin              { View not iconised }
@@ -1241,6 +1238,16 @@ BEGIN
      GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
      If OverlapsArea(ViewPort.X1, ViewPort.Y1,
      ViewPort.X2, ViewPort.Y2) Then Begin             { Must be in area }
+         Parent:=Owner;
+         While Assigned(Parent) do Begin
+           If (Parent^.LockFlag>0) then
+             Begin
+               If (DrawMask = 0) OR (DrawMask = vdNoChild)  then
+                 SetDrawMask(vdAll);
+               exit;
+             End;
+           Parent:=Parent^.Owner;
+         End;
          HideMouseCursor;                             { Hide mouse cursor }
          If (DrawMask = 0) OR (DrawMask = vdNoChild)  { No special masks set }
             { OR Assigned(LimitsLocked) }
@@ -1254,9 +1261,11 @@ BEGIN
            If (Options AND ofFramed <> 0) OR
            (GOptions AND goThickFramed <> 0)          { View has border }
              Then DrawBorder;                         { Draw border }
+{$ifndef NoShadow}
            If ((State AND sfShadow) <> 0) AND
               (GOptions And goNoShadow = 0) Then
              DrawShadow;
+{$endif ndef NoShadow}
          End Else Begin                               { Masked draws only  }
            If (DrawMask AND vdBackGnd <> 0) Then      { Chk background mask }
              Begin
@@ -1284,6 +1293,16 @@ BEGIN
                DrawMask := DrawMask and Not vdBorder;
                DrawBorder;                              { Draw border }
              End;
+{$ifndef NoShadow}
+           If ((State AND sfShadow) <> 0) AND
+              (DrawMask AND vdShadow <> 0) AND
+              (GOptions And goNoShadow = 0) AND
+              (not assigned(Owner) OR (Owner^.GOptions And goNoShadow = 0)) Then
+             Begin
+               DrawMask := DrawMask and Not vdShadow;
+               DrawShadow;
+             End;
+{$endif ndef NoShadow}
          End;
          ShowMouseCursor;                             { Show mouse cursor }
      End;
@@ -1384,6 +1403,14 @@ END;
 PROCEDURE TView.DrawShadow;
 VAR X1, Y1, X2, Y2 : Integer;
 BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'DrawShadow');
+     End;
+{$endif DEBUG}
   If not TextModeGFV then
     exit;
   If Assigned(Owner) Then Begin
@@ -1392,6 +1419,7 @@ BEGIN
     Y1:=RawOrigin.Y+SysFontHeight;
     Y2:=RawOrigin.Y+RawSize.Y+1+ShadowSize.Y*SysFontHeight;
     GOptions := GOptions OR goNoShadow;
+    Owner^.GOptions := Owner^.GOptions OR goNoShadow;
     Owner^.RedrawArea(X1,Y1,X2,Y2);
     WriteShadow(X1 div SysFontWidth, Y1 div SysFontHeight,
       X2 div SysFontWidth, Y2 div SysFontHeight);
@@ -1403,6 +1431,7 @@ BEGIN
     WriteShadow(X1 div SysFontWidth, Y1 div SysFontHeight,
       X2 div SysFontWidth, Y2 div SysFontHeight);
     GOptions := GOptions AND not goNoShadow;
+    Owner^.GOptions := Owner^.GOptions AND not goNoShadow;
   End;
 END;
 
@@ -1498,6 +1527,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, TextModeGFV);{ Set new clip limits }
    End;
 END;
@@ -1609,18 +1639,6 @@ BEGIN
      Mask := Mask AND NOT vdFocus;                    { Clear focus draws }
    OldMask:=DrawMask;
    DrawMask := DrawMask OR Mask;                      { Set draw masks }
-   (*If TextModeGFV and (DrawMask<>0) and (DrawMask<>OldMask) then Begin
-     Mask:=vdBackGnd OR vdInner OR vdBorder OR vdCursor OR vdFocus;
-     If (Options AND ofFramed = 0) AND                  { Check for no frame }
-       (GOptions AND goThickFramed = 0) AND             { Check no thick frame }
-       (GOptions AND goTitled = 0) Then                 { Check for title }
-         Mask := Mask AND NOT vdBorder;                 { Clear border draw }
-     If (State AND sfCursorVis = 0) Then                { Check for no cursor }
-       Mask := Mask AND NOT vdCursor;                   { Clear cursor draw }
-     If (GOptions AND goDrawFocus = 0) Then             { Check no focus draw }
-       Mask := Mask AND NOT vdFocus;                    { Clear focus draws }
-     DrawMask := DrawMask OR Mask;                      { Set draw masks }
-   End; *)
 END;
 
 {--TView--------------------------------------------------------------------}
@@ -1675,7 +1693,11 @@ BEGIN
        Owner^.RemoveView(@Self);                      { Remove from list }
        Owner^.InsertView(@Self, Target);              { Insert into list }
        State := State OR sfVisible;                   { Allow drawing again }
-       If (LastView <> Target) Then DrawView;         { Draw the view now }
+       If (LastView <> Target) Then
+         Begin
+           SetDrawMask(vdAll);
+           DrawView;         { Draw the view now }
+         End;
        If (Options AND ofSelectable <> 0) Then        { View is selectable }
          If (Owner <> Nil) Then Owner^.ResetCurrent;  { Reset current }
        Owner^.Unlock;
@@ -1714,6 +1736,14 @@ END;
 PROCEDURE TView.ReDrawArea (X1, Y1, X2, Y2: Integer);
 VAR HLimit: PView; ViewPort: ViewPortType;
 BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'ReDrawArea(',X1,',',Y1,',',X2,',',Y2,')');
+     End;
+{$endif DEBUG}
    GetViewSettings(ViewPort, TextModeGFV);            { Hold view port }
    If TextModeGFV then Begin
      X1 := X1 div SysFontWidth;
@@ -2595,8 +2625,8 @@ BEGIN
      sfFocused: Begin
          If (Current <> Nil) Then
            Current^.SetState(sfFocused, Enable);          { Focus current view }
-         If TextModeGFV then
-           SetDrawMask(vdBackGnd OR vdFocus OR vdInner OR vdBorder); { Set redraw masks }
+         {If TextModeGFV then
+           SetDrawMask(vdBackGnd OR vdFocus OR vdInner OR vdBorder);  Set redraw masks }
        End;
      sfExposed: Begin
          ForEach(@DoExpose);                          { Expose each subview }
@@ -4562,7 +4592,6 @@ BEGIN
    End;
 END;
 
-{define DirectWrite}
 PROCEDURE TView.WriteAbs(X, Y, L : Integer; Var Buf);
 VAR
   P: PGroup;
@@ -4570,16 +4599,18 @@ VAR
   CurOrigin : TPoint;
   I,XI : longint;
   ViewPort : ViewPortType;
-BEGIN
+  Skip : boolean;
+BEGIN
+{$ifdef DEBUG}
+   if WriteDebugInfo then
+     Begin
+       Writeln(stderr,'TView(',hexstr(longint(@self),8),')');
+       Writeln(stderr,'Object Type(',hexstr(plongint(@self)^,8),')');
+       Writeln(stderr,'WriteAbs(',X,',',Y,',',L,',',hexstr(longint(@Buf),8),')');
+     End;
+{$endif DEBUG}
   { Direct wrong method }
   GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
-{$ifdef DirectWrite}
-  For i:=0 to L-1 do Begin
-    if (X+I>=ViewPort.X1) AND (Y>=ViewPort.Y1) AND
-       (X+I<ViewPort.X2) AND (Y<ViewPort.Y2) Then
-      VideoBuf^[Y*ScreenWidth+X+i]:=TDrawBuffer(Buf)[i];
-  End;
-{$else not DirectWrite}
   { Pedestrian character method }
   { Must be in area }
   If (X+L<ViewPort.X1) OR (Y<ViewPort.Y1) OR
@@ -4593,35 +4624,48 @@ BEGIN
     If (XI<ViewPort.X1) OR
        (XI>=ViewPort.X2) Then
       Continue;
+    Skip:=false;
     While Assigned(P) do Begin
+      { If parent not visible or
+        position outside parent's limit then skip }
       if not assigned(P^.Buffer) AND
          (((P^.State AND sfVisible) = 0) OR
-         (P^.Origin.X>XI) OR (P^.Origin.X+P^.Size.X<=XI) OR
-         (P^.Origin.Y>Y) OR (P^.Origin.Y+P^.Size.Y<=Y)) then
-        continue;
+         (XI<P^.Origin.X) OR (XI>=P^.Origin.X+P^.Size.X) OR
+         (Y<P^.Origin.Y) OR (Y>=P^.Origin.Y+P^.Size.Y)) then
+        Begin
+          Skip:=true;
+          Break;
+        End;
       { Here we must check if X,Y is exposed for this view }
       PP:=P^.Last;
       { move to first }
       If Assigned(PP) then
         PP:=PP^.Next;
       While Assigned(PP) and (PP<>P^.Last) and (PP<>PrevP) do Begin
+        { If position is owned by another view that is before self
+         then skip }
         If ((PP^.State AND sfVisible) <> 0) AND
-           (PP^.Origin.X>=XI) AND
-           (PP^.Origin.X+PP^.Size.X<XI) AND
-           (PP^.Origin.Y>=Y) AND
-           (PP^.Origin.Y+PP^.Size.Y<Y) then
-          exit;
+           (XI>=PP^.Origin.X) AND
+           (XI<PP^.Origin.X+PP^.Size.X) AND
+           (Y>=PP^.Origin.Y) AND
+           (Y<PP^.Origin.Y+PP^.Size.Y) then
+          Begin
+            Skip:=true;
+            break;
+          End;
         PP:=PP^.Next;
       End;
 
-      If Assigned(P^.Buffer) then Begin
+      If Not Skip and Assigned(P^.Buffer) then Begin
         P^.Buffer^[(Y-P^.Origin.Y)*P^.size.X+(XI-P^.Origin.X)]:=TDrawBuffer(Buf)[I];
       End;
       PrevP:=P;
-      P:=P^.Owner;
+      If Skip then
+        P:=Nil
+      else
+        P:=P^.Owner;
     End;
   End;
-{$endif not DirectWrite}
 END;
 
 {define DirectWriteShadow}
@@ -4633,6 +4677,7 @@ VAR
   I,J : longint;
   B : Word;
   ViewPort : ViewPortType;
+  Skip : boolean;
 BEGIN
   { Direct wrong method }
   GetViewSettings(ViewPort, TextModeGFV);          { Get set viewport }
@@ -4661,12 +4706,16 @@ BEGIN
     If (XI<ViewPort.X1) OR
        (XI>=ViewPort.X2) Then
       Continue;    }
+    Skip:=false;
     While Assigned(P) do Begin
       if not assigned(P^.Buffer) AND
          (((P^.State AND sfVisible) = 0) OR
-         (P^.Origin.X>I) OR (P^.Origin.X+P^.Size.X<=I) OR
-         (P^.Origin.Y>J) OR (P^.Origin.Y+P^.Size.Y<=J)) then
-        continue;
+         (I<P^.Origin.X) OR (I>=P^.Origin.X+P^.Size.X) OR
+         (J<P^.Origin.Y) OR (J>=P^.Origin.Y+P^.Size.Y)) then
+        Begin
+          Skip:=true;
+          Break;
+        End;
       { Here we must check if X,Y is exposed for this view }
       PP:=P^.Last;
       { move to first }
@@ -4674,20 +4723,26 @@ BEGIN
         PP:=PP^.Next;
       While Assigned(PP) and (PP<>P^.Last) and (PP<>PrevP) do Begin
         If ((PP^.State AND sfVisible) <> 0) AND
-           (PP^.Origin.X>=I) AND
-           (PP^.Origin.X+PP^.Size.X<I) AND
-           (PP^.Origin.Y>=J) AND
-           (PP^.Origin.Y+PP^.Size.Y<J) then
-          continue;
+           (I>=PP^.Origin.X) AND
+           (I<PP^.Origin.X+PP^.Size.X) AND
+           (J>=PP^.Origin.Y) AND
+           (J<PP^.Origin.Y+PP^.Size.Y) then
+          Begin
+            Skip:=true;
+            Break;
+          End;
         PP:=PP^.Next;
       End;
 
-      If Assigned(P^.Buffer) then Begin
+      If not Skip and Assigned(P^.Buffer) then Begin
         B:=P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)];
-        P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)]:= (B and $7FF);
+        P^.Buffer^[(J-P^.Origin.Y)*P^.size.X+(I-P^.Origin.X)]:= (B and $FFF);
       End;
       PrevP:=P;
-      P:=P^.Owner;
+      If Skip then
+        P:=Nil
+      else
+        P:=P^.Owner;
     End;
   End;
   End;
@@ -5088,7 +5143,10 @@ END.
 
 {
  $Log$
- Revision 1.10  2001-05-10 16:46:28  pierre
+ Revision 1.11  2001-05-30 10:22:25  pierre
+  * fix Shadow bugs
+
+ Revision 1.10  2001/05/10 16:46:28  pierre
   + some improovements made
 
  Revision 1.9  2001/05/07 23:36:35  pierre