Selaa lähdekoodia

layer registry undo

johann 5 vuotta sitten
vanhempi
commit
e8d5a86f68

+ 28 - 0
lazpaint/image/uimage.pas

@@ -176,6 +176,11 @@ type
     procedure SetLayerOffset(AIndex: integer; AValue: TPoint; APrecomputedLayerBounds: TRect);
     function CurrentLayerReadOnly: TBGRABitmap;
 
+    procedure SetLayerRegistry(ALayerIndex: integer; AIdentifier: string; AValue: RawByteString);
+    function GetLayerRegistry(ALayerIndex: integer; AIdentifier: string): RawByteString;
+    procedure SetRegistry(AIdentifier: string; AValue: RawByteString);
+    function GetRegistry(AIdentifier: string): RawByteString;
+
     function GetLayerIndexById(AId: integer): integer;
     procedure AddNewLayer;
     procedure AddNewLayer(AOriginal: TBGRALayerCustomOriginal; AName: string; ABlendOp: TBlendOperation; AMatrix: TAffineMatrix);
@@ -2203,6 +2208,29 @@ begin
   result := GetSelectedImageLayer;
 end;
 
+procedure TLazPaintImage.SetLayerRegistry(ALayerIndex: integer;
+  AIdentifier: string; AValue: RawByteString);
+begin
+  AddUndo(TSetLayerRegistryDifference.Create(FCurrentState, LayerId[ALayerIndex], AIdentifier, AValue, true));
+end;
+
+function TLazPaintImage.GetLayerRegistry(ALayerIndex: integer;
+  AIdentifier: string): RawByteString;
+begin
+  result := FCurrentState.LayeredBitmap.GetLayerRegistry(ALayerIndex, AIdentifier);
+end;
+
+procedure TLazPaintImage.SetRegistry(AIdentifier: string;
+  AValue: RawByteString);
+begin
+  AddUndo(TSetImageRegistryDifference.Create(FCurrentState, AIdentifier, AValue, true));
+end;
+
+function TLazPaintImage.GetRegistry(AIdentifier: string): RawByteString;
+begin
+  result := FCurrentState.LayeredBitmap.GetGlobalRegistry(AIdentifier);
+end;
+
 function TLazPaintImage.GetLayerIndexById(AId: integer): integer;
 begin
   result := FCurrentState.LayeredBitmap.GetLayerIndexFromId(AId);

+ 5 - 6
lazpaint/image/uimageaction.pas

@@ -312,7 +312,7 @@ var
 begin
   identifier := AVars.Strings['Identifier'];
   if length(identifier)=0 then exit(srInvalidParameters);
-  AVars.Strings['Result'] := Image.CurrentState.LayeredBitmap.GetGlobalRegistry(identifier);
+  AVars.Strings['Result'] := Image.GetRegistry(identifier);
   result := srOk;
 end;
 
@@ -322,7 +322,7 @@ var
 begin
   identifier := AVars.Strings['Identifier'];
   if length(identifier)=0 then exit(srInvalidParameters);
-  AVars.Strings['Result'] := Image.CurrentState.LayeredBitmap.GetLayerRegistry(Image.CurrentLayerIndex, identifier);
+  AVars.Strings['Result'] := Image.GetLayerRegistry(Image.CurrentLayerIndex, identifier);
   result := srOk;
 end;
 
@@ -353,7 +353,7 @@ begin
   identifier := AVars.Strings['Identifier'];
   if length(identifier)=0 then exit(srInvalidParameters);
   if not AVars.IsDefined('Value') then exit(srInvalidParameters);
-  Image.CurrentState.LayeredBitmap.SetGlobalRegistry(identifier, AVars.Strings['Value']);
+  Image.SetRegistry(identifier, AVars.Strings['Value']);
   result := srOk;
 end;
 
@@ -364,12 +364,11 @@ begin
   identifier := AVars.Strings['Identifier'];
   if length(identifier)=0 then exit(srInvalidParameters);
   if not AVars.IsDefined('Value') then exit(srInvalidParameters);
-  Image.CurrentState.LayeredBitmap.SetLayerRegistry(Image.CurrentLayerIndex, identifier, AVars.Strings['Value']);
+  Image.SetLayerRegistry(Image.CurrentLayerIndex, identifier, AVars.Strings['Value']);
   result := srOk;
 end;
 
-function TImageActions.ScriptPasteAsNewLayer(AVars: TVariableSet
-  ): TScriptResult;
+function TImageActions.ScriptPasteAsNewLayer(AVars: TVariableSet): TScriptResult;
 var
   id: Integer;
 begin

+ 131 - 0
lazpaint/image/uimagediff.pas

@@ -147,6 +147,39 @@ type
     procedure UnapplyTo(AState: TState); override;
   end;
 
+  { TSetLayerRegistryDifference }
+
+  TSetLayerRegistryDifference = class(TCustomImageDifference)
+  private
+    identifier: string;
+    previousValue,nextValue: RawByteString;
+    layerId: integer;
+  protected
+    function GetImageDifferenceKind: TImageDifferenceKind; override;
+    function GetIsIdentity: boolean; override;
+    function GetCost: integer; override;
+  public
+    constructor Create(ADestination: TState; ALayerId: integer; AIdentifier: string; ANewValue: RawByteString; AApplyNow: boolean);
+    procedure ApplyTo(AState: TState); override;
+    procedure UnapplyTo(AState: TState); override;
+  end;
+
+  { TSetImageRegistryDifference }
+
+  TSetImageRegistryDifference = class(TCustomImageDifference)
+  private
+    identifier: string;
+    previousValue,nextValue: RawByteString;
+  protected
+    function GetImageDifferenceKind: TImageDifferenceKind; override;
+    function GetIsIdentity: boolean; override;
+    function GetCost: integer; override;
+  public
+    constructor Create(ADestination: TState; AIdentifier: string; ANewValue: RawByteString; AApplyNow: boolean);
+    procedure ApplyTo(AState: TState); override;
+    procedure UnapplyTo(AState: TState); override;
+  end;
+
   { TSetSelectionTransformDifference }
 
   TSetSelectionTransformDifference = class(TCustomImageDifference)
@@ -643,6 +676,104 @@ begin
     result := false;
 end;
 
+{ TSetImageRegistryDifference }
+
+function TSetImageRegistryDifference.GetImageDifferenceKind: TImageDifferenceKind;
+begin
+  Result:= idkChangeStack;
+end;
+
+function TSetImageRegistryDifference.GetIsIdentity: boolean;
+begin
+  Result:= previousValue = nextValue;
+end;
+
+function TSetImageRegistryDifference.GetCost: integer;
+begin
+  Result:= 0;
+end;
+
+constructor TSetImageRegistryDifference.Create(ADestination: TState;
+  AIdentifier: string; ANewValue: RawByteString; AApplyNow: boolean);
+var
+  imgState: TImageState;
+begin
+  inherited Create(ADestination);
+  identifier := AIdentifier;
+  nextValue := ANewValue;
+  imgState := ADestination as TImageState;
+  previousValue:= imgState.LayeredBitmap.GetGlobalRegistry(identifier);
+  if AApplyNow then ApplyTo(ADestination);
+end;
+
+procedure TSetImageRegistryDifference.ApplyTo(AState: TState);
+var
+  imgState: TImageState;
+begin
+  inherited ApplyTo(AState);
+  imgState := AState as TImageState;
+  imgState.LayeredBitmap.SetGlobalRegistry(identifier, nextValue);
+end;
+
+procedure TSetImageRegistryDifference.UnapplyTo(AState: TState);
+var
+  imgState: TImageState;
+begin
+  inherited UnapplyTo(AState);
+  imgState := AState as TImageState;
+  imgState.LayeredBitmap.SetGlobalRegistry(identifier, previousValue);
+end;
+
+{ TSetLayerRegistryDifference }
+
+function TSetLayerRegistryDifference.GetImageDifferenceKind: TImageDifferenceKind;
+begin
+  Result:= idkChangeStack;
+end;
+
+function TSetLayerRegistryDifference.GetIsIdentity: boolean;
+begin
+  Result:= previousValue = nextValue;
+end;
+
+function TSetLayerRegistryDifference.GetCost: integer;
+begin
+  Result:= 0;
+end;
+
+constructor TSetLayerRegistryDifference.Create(ADestination: TState;
+  ALayerId: integer; AIdentifier: string; ANewValue: RawByteString;
+  AApplyNow: boolean);
+var
+  imgState: TImageState;
+begin
+  inherited Create(ADestination);
+  layerId := ALayerId;
+  identifier := AIdentifier;
+  nextValue := ANewValue;
+  imgState := ADestination as TImageState;
+  previousValue:= imgState.LayeredBitmap.GetLayerRegistry(imgState.LayeredBitmap.GetLayerIndexFromId(layerId), identifier);
+  if AApplyNow then ApplyTo(ADestination);
+end;
+
+procedure TSetLayerRegistryDifference.ApplyTo(AState: TState);
+var
+  imgState: TImageState;
+begin
+  inherited ApplyTo(AState);
+  imgState := AState as TImageState;
+  imgState.LayeredBitmap.SetLayerRegistry(imgState.LayeredBitmap.GetLayerIndexFromId(layerId), identifier, nextValue);
+end;
+
+procedure TSetLayerRegistryDifference.UnapplyTo(AState: TState);
+var
+  imgState: TImageState;
+begin
+  inherited UnapplyTo(AState);
+  imgState := AState as TImageState;
+  imgState.LayeredBitmap.SetLayerRegistry(imgState.LayeredBitmap.GetLayerIndexFromId(layerId), identifier, previousValue);
+end;
+
 { TReplaceLayerByCustomOriginalDifference }
 
 function TReplaceLayerByCustomOriginalDifference.CreateOriginal(AState: TState;

+ 7 - 1
lazpaint/image/ustatetype.pas

@@ -43,6 +43,7 @@ type
     function GetImageDifferenceKind: TImageDifferenceKind; virtual;
     function GetChangingBounds: TRect; virtual;
     function GetChangingBoundsDefined: boolean; virtual;
+    function GetCost: integer; virtual;
   public
     constructor Create(AFromState: TState; AToState: TState);
     constructor Create(AFromState: TState);
@@ -425,7 +426,7 @@ begin
     if FDiffs[i] is TComposedImageDifference then
       inc(result, TComposedImageDifference(FDiffs[i]).TotalCount)
     else
-      inc(result);
+      inc(result, FDiffs[i].GetCost);
 end;
 
 function TComposedImageDifference.GetIsIdentity: boolean;
@@ -776,6 +777,11 @@ begin
   result := false;
 end;
 
+function TCustomImageDifference.GetCost: integer;
+begin
+  result := 1;
+end;
+
 constructor TCustomImageDifference.Create(AFromState: TState; AToState: TState);
 begin
   FSavedBefore:= AFromState.saved;