circular17 3 роки тому
батько
коміт
a9d0779684
2 змінених файлів з 28 додано та 4 видалено
  1. 17 1
      lazpaint/image/uimage.pas
  2. 11 3
      lazpaint/uzoom.pas

+ 17 - 1
lazpaint/image/uimage.pas

@@ -39,6 +39,7 @@ type
   TLazPaintImage = class
   private
     FLazPaintInstance: TObject;
+    FZoom: TZoom;
     FActionInProgress: TCustomLayerAction;
     FOnActionProgress: TLayeredActionProgressEvent;
     FOnSelectedLayerIndexChanging: TOnCurrentLayerIndexChanged;
@@ -126,6 +127,7 @@ type
     procedure SetOnActionProgress(AValue: TLayeredActionProgressEvent);
     procedure SetOnSizeChanged(AValue: TNotifyEvent);
     procedure SetSelectionTransform(ATransform: TAffineMatrix);
+    procedure SetZoom(AValue: TZoom);
     procedure UpdateIconFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
     procedure UpdateTiffFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
     procedure UpdateGifFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
@@ -133,10 +135,10 @@ type
     procedure LayerActionNotifyChange({%H-}ASender: TObject; ALayer: TBGRABitmap; ARect: TRect);
     procedure LayerActionDestroy(Sender: TObject);
     procedure LayerActionNotifyUndo({%H-}ASender: TObject; AUndo: TCustomImageDifference; var Owned: boolean);
+    procedure ZoomOnCenterQuery(Sender: TObject);
   public
     OnException: TImageExceptionHandler;
     ImageOffset: TPoint;
-    Zoom: TZoom;
     CursorHotSpot: TPoint;
     BPP, FrameIndex, FrameCount: integer;
     VisibleArea: TRectF;
@@ -298,6 +300,7 @@ type
     property RenderUpdateRectInPicCoord: TRect read FRenderUpdateRectInPicCoord;
     property RenderUpdateRectInVSCoord: TRect read FRenderUpdateRectInVSCoord;
     property SelectionTransform: TAffineMatrix read GetSelectionTransform write SetSelectionTransform;
+    property Zoom: TZoom read FZoom write SetZoom;
     property ZoomFactor: single read GetZoomFactor;
     property DraftOriginal: boolean read FDraftOriginal write SetDraftOriginal;
     property IsIconCursor: boolean read GetIsIconCursor;
@@ -352,6 +355,11 @@ begin
   OnImageChanged.NotifyObservers;
 end;
 
+procedure TLazPaintImage.ZoomOnCenterQuery(Sender: TObject);
+begin
+  ImageOffset := Point(0,0);
+end;
+
 function TLazPaintImage.MakeCroppedLayer: TBGRABitmap;
 var r: TRect;
   cropped: TBGRABitmap;
@@ -964,6 +972,14 @@ begin
   end;
 end;
 
+procedure TLazPaintImage.SetZoom(AValue: TZoom);
+begin
+  if FZoom=AValue then Exit;
+  if Assigned(FZoom) then FZoom.OnCenterQuery:= nil;
+  FZoom:=AValue;
+  if Assigned(FZoom) then FZoom.OnCenterQuery:=@ZoomOnCenterQuery;
+end;
+
 procedure TLazPaintImage.SetLayerName(AIndex: integer; AValue: string);
 begin
   AddUndo(FCurrentState.SetLayerName(AIndex,Avalue));

+ 11 - 3
lazpaint/uzoom.pas

@@ -33,13 +33,15 @@ type
     FOnZoomChangedHandler : TOnZoomChangedHandler;
     FBitmapPosition: TPointF;
     FMousePosition: TPoint;
+    FOnCenterQuery: TNotifyEvent;
     function GetEditingZoom: boolean;
     function GetPositionDefined: boolean;
     function GetZoomFactor: single;
     procedure SetEditingZoom(AValue: boolean);
     procedure SetMaxFactor(AValue: single);
     procedure SetMinFactor(AValue: single);
-    procedure SetZoomFactor(AValue: single);
+    procedure SetZoomFactor(AValue: single); overload;
+    procedure SetZoomFactor(AValue: single; ACenter: boolean); overload;
   protected
     procedure EditZoom_KeyPress(Sender: TObject; var Key: char);
     procedure EditZoom_ZoomExit(Sender: TObject);
@@ -66,6 +68,7 @@ type
     property BitmapPosition: TPointF read FBitmapPosition;
     property MousePosition: TPoint read FMousePosition;
     property PositionDefined: boolean read GetPositionDefined;
+    property OnCenterQuery: TNotifyEvent read FOnCenterQuery write FOnCenterQuery;
   end;
 
 implementation
@@ -120,12 +123,17 @@ begin
 end;
 
 procedure TZoom.SetZoomFactor(AValue: single);
+begin
+  SetZoomFactor(AValue, false);
+end;
+
+procedure TZoom.SetZoomFactor(AValue: single; ACenter: boolean);
 begin
   if (FMinFactor <> 0) and (AValue < FMinFactor) then AValue := FMinFactor;
   if (FMaxFactor <> 0) and (AValue > FMaxFactor) then AValue := FMaxFactor;
-  if AValue = FZoomFactor then exit;
   EditingZoom:= False;
   FZoomFactor:= AValue;
+  if ACenter and Assigned(OnCenterQuery) then OnCenterQuery(self);
   if Assigned(FOnZoomChangedHandler) then
     FOnZoomChangedHandler(self, AValue);
   UpdateLabel;
@@ -236,7 +244,7 @@ begin
   try
     zx := (pictureArea.right-pictureArea.left-pixelMargin)/AImageWidth;
     zy := (pictureArea.bottom-pictureArea.top-pixelMargin)/AImageheight;
-    Factor:= min(zx,zy);
+    SetZoomFactor(min(zx,zy), true);
   except
     on ex:Exception do
     begin end;