Browse Source

fix image view update bounds

Johann ELSASS 5 năm trước cách đây
mục cha
commit
a2601b8b62
1 tập tin đã thay đổi với 21 bổ sung49 xóa
  1. 21 49
      lazpaint/uimageview.pas

+ 21 - 49
lazpaint/uimageview.pas

@@ -86,8 +86,8 @@ type
     function GetFillSelectionHighlight: boolean;
     function GetPenCursorPosition: TVSCursorPosition;
     function GetWorkspaceColor: TColor;
-    procedure PaintPictureImplementation(AWorkArea: TRect; AVSPart: TRect);
-    procedure PaintVirtualScreenImplementation(AWorkArea: TRect; AVSPart: TRect);
+    procedure PaintPictureImplementation(AWorkArea: TRect; AInvalidatedPart: TRect);
+    procedure PaintVirtualScreenImplementation(AWorkArea: TRect; AInvalidatedPart: TRect);
     procedure PaintBlueAreaImplementation(AWorkArea: TRect);
     procedure PaintBlueAreaOnly(AWorkArea: TRect);
     procedure ComputePictureParams(AWorkArea: TRect);
@@ -403,7 +403,7 @@ begin
   result := FInstance.Image;
 end;
 
-procedure TImageView.PaintPictureImplementation(AWorkArea: TRect; AVSPart: TRect);
+procedure TImageView.PaintPictureImplementation(AWorkArea: TRect; AInvalidatedPart: TRect);
 var
   renderRect: TRect;
   picParamWereDefined: boolean;
@@ -502,13 +502,13 @@ begin
     Image.RenderMayChange(LazPaintInstance.ToolManager.RenderTool(FVirtualScreen), false, false);
   end;
 
-  PaintVirtualScreenImplementation(AWorkArea, AVSPart);
+  PaintVirtualScreenImplementation(AWorkArea, AInvalidatedPart);
   Image.VisibleArea := TRectF.Intersect(rectF(FormToBitmap(AWorkArea.Left, AWorkArea.Top),
                                               FormToBitmap(AWorkArea.Right, AWorkArea.Bottom)),
                           rectF(-0.5,-0.5,Image.Width-0.5,Image.Height-0.5));
 end;
 
-procedure TImageView.PaintVirtualScreenImplementation(AWorkArea: TRect; AVSPart: TRect);
+procedure TImageView.PaintVirtualScreenImplementation(AWorkArea: TRect; AInvalidatedPart: TRect);
 var cursorBack: TBGRABitmap;
     DestCanvas: TCanvas;
     cursorContourF: array of TPointF;
@@ -517,27 +517,19 @@ var cursorBack: TBGRABitmap;
 
   procedure DrawPart;
   var
-    canvasVSPart: TRect;
+    vsPart: TRect;
   begin
-    if CanvasScale > 1 then
-    begin
-      AVSPart.Left := AVSPart.Left - (AVSPart.Left mod CanvasScale);
-      AVSPart.Top := AVSPart.Top - (AVSPart.Top mod CanvasScale);
-      inc(AVSPart.Right, CanvasScale - 1);
-      inc(AVSPart.Bottom, CanvasScale - 1);
-      AVSPart.Right := AVSPart.Right - (AVSPart.Right mod CanvasScale);
-      AVSPart.Bottom := AVSPart.Bottom - (AVSPart.Bottom mod CanvasScale);
-    end;
-    canvasVSPart := rect(AVSPart.Left div CanvasScale, AVSPart.Top div CanvasScale,
-      AVSPart.Right div CanvasScale, AVSPart.Bottom div CanvasScale);
-    canvasVSPart.Offset(FLastPictureParameters.virtualScreenArea.TopLeft);
-    FVirtualScreen.DrawPart(AVSPart, DestCanvas, canvasVSPart, True);
+    with AInvalidatedPart do
+      vsPart := rect(Left*CanvasScale, Top*CanvasScale, Right*CanvasScale, Bottom*CanvasScale);
+    with FLastPictureParameters.scaledVirtualScreenArea do
+      vsPart.Offset(-Left, -Top);
+    FVirtualScreen.DrawPart(vsPart, DestCanvas, AInvalidatedPart, True);
   end;
 
 begin
   if (FVirtualScreen = nil) or not FLastPictureParameters.defined then exit;
-  AVSPart.Intersect(rect(0,0, FVirtualScreen.Width,FVirtualScreen.Height));
-  if AVSPart.IsEmpty then exit;
+  AInvalidatedPart.Intersect(FLastPictureParameters.virtualScreenArea);
+  if AInvalidatedPart.IsEmpty then exit;
 
   DestCanvas := PictureCanvas;
 
@@ -730,27 +722,17 @@ begin
 end;
 
 procedure TImageView.DoPaint(AWorkArea: TRect; AShowNoPicture: boolean);
-var
-  vsRect: TRect;
 begin
   if AShowNoPicture then
     PaintBlueAreaOnly(AWorkArea)
   else
   begin
-    {$IFDEF WINDOWS}
-    vsRect := rect(0,0,FLastPictureParameters.scaledVirtualScreenArea.Width,FLastPictureParameters.scaledVirtualScreenArea.Height);
-    {$ELSE}
-    with FPaintBox.PaintRect do
-      vsRect := rect(Left*CanvasScale, Top*CanvasScale, Right*CanvasScale, Bottom*CanvasScale);
-    with FLastPictureParameters.scaledVirtualScreenArea do
-      vsRect.Offset(-Left, -Top);
-    {$ENDIF}
     if FQueryPaintVirtualScreen and
        (FLastPictureParameters.defined and
         IsRectEmpty(GetRenderUpdateRectVS(False))) then
-       PaintVirtualScreenImplementation(AWorkArea, vsRect)
+       PaintVirtualScreenImplementation(AWorkArea, FPaintBox.PaintRect)
     else
-      PaintPictureImplementation(AWorkArea, vsRect);
+      PaintPictureImplementation(AWorkArea, FPaintBox.PaintRect);
     PaintBlueAreaImplementation(AWorkArea);
   end;
   if Assigned(FOnPaint) then FOnPaint(self);
@@ -946,13 +928,6 @@ begin
   area := FPenCursorPos.bounds;
   FPenCursorPos := GetPenCursorPosition;
   area := RectUnion(area, FPenCursorPos.bounds);
-  OffsetRect(area, FLastPictureParameters.scaledVirtualScreenArea.Left,
-                   FLastPictureParameters.scaledVirtualScreenArea.Top);
-  {$IFDEF IMAGEVIEW_DIRECTUPDATE}
-  OffsetRect(area, -FLastPictureParameters.scaledVirtualScreenArea.Left, -FLastPictureParameters.scaledVirtualScreenArea.Top);
-  PaintVirtualScreenImplementation(AWorkArea, area);
-  {$ELSE}
-  FQueryPaintVirtualScreen := True;
   if CanvasScale > 1 then
   begin
     area.Left := area.Left div CanvasScale;
@@ -960,6 +935,12 @@ begin
     area.Right := (area.Right+CanvasScale-1) div CanvasScale;
     area.Bottom := (area.Bottom+CanvasScale-1) div CanvasScale;
   end;
+  OffsetRect(area, FLastPictureParameters.virtualScreenArea.Left,
+                   FLastPictureParameters.virtualScreenArea.Top);
+  {$IFDEF IMAGEVIEW_DIRECTUPDATE}
+  PaintVirtualScreenImplementation(AWorkArea, area);
+  {$ELSE}
+  FQueryPaintVirtualScreen := True;
   FPaintBox.InvalidateRect(area);
   {$IFNDEF DARWIN}FPaintBox.Update;{$ENDIF}
   FQueryPaintVirtualScreen := False;
@@ -1037,15 +1018,6 @@ begin
   updateArea := GetRectToInvalidate(false, AWorkArea);
   FPenCursorPosBefore.bounds := EmptyRect;
   {$IFDEF IMAGEVIEW_DIRECTUPDATE}
-  if FLastPictureParameters.defined then
-    OffsetRect(updateArea, -FLastPictureParameters.virtualScreenArea.Left,-FLastPictureParameters.virtualScreenArea.Top);
-  with updateArea do
-  begin
-    Left *= CanvasScale;
-    Top *= CanvasScale;
-    Right *= CanvasScale;
-    Bottom *= CanvasScale;
-  end;
   PaintPictureImplementation(AWorkArea, updateArea);
   if prevVSArea <> FLastPictureParameters.virtualScreenArea then
     PaintBlueAreaImplementation(AWorkArea);