Browse Source

using guid for layer id

johann 5 years ago
parent
commit
255c02954a
2 changed files with 50 additions and 6 deletions
  1. 28 0
      lazpaint/image/uimage.pas
  2. 22 6
      lazpaint/image/uimageaction.pas

+ 28 - 0
lazpaint/image/uimage.pas

@@ -64,6 +64,7 @@ type
     function GetIsTiff: boolean;
     function GetIsTiff: boolean;
     function GetIsGif: boolean;
     function GetIsGif: boolean;
     function GetLayerBitmapById(AId: integer): TBGRABitmap;
     function GetLayerBitmapById(AId: integer): TBGRABitmap;
+    function GetLayerGuid(AIndex: integer): TGuid;
     function GetLayerId(AIndex: integer): integer;
     function GetLayerId(AIndex: integer): integer;
     function GetLayerOriginal(AIndex: integer): TBGRALayerCustomOriginal;
     function GetLayerOriginal(AIndex: integer): TBGRALayerCustomOriginal;
     function GetLayerOriginalClass(AIndex: integer): TBGRALayerOriginalAny;
     function GetLayerOriginalClass(AIndex: integer): TBGRALayerOriginalAny;
@@ -181,6 +182,7 @@ type
     function GetRegistry(AIdentifier: string): RawByteString;
     function GetRegistry(AIdentifier: string): RawByteString;
 
 
     function GetLayerIndexById(AId: integer): integer;
     function GetLayerIndexById(AId: integer): integer;
+    function GetLayerIndexByGuid(AGuid: TGuid): integer;
     procedure AddNewLayer;
     procedure AddNewLayer;
     procedure AddNewLayer(AOriginal: TBGRALayerCustomOriginal; AName: string; ABlendOp: TBlendOperation; AMatrix: TAffineMatrix);
     procedure AddNewLayer(AOriginal: TBGRALayerCustomOriginal; AName: string; ABlendOp: TBlendOperation; AMatrix: TAffineMatrix);
     procedure AddNewLayer(ALayer: TBGRABitmap; AName: string; ABlendOp: TBlendOperation);
     procedure AddNewLayer(ALayer: TBGRABitmap; AName: string; ABlendOp: TBlendOperation);
@@ -263,6 +265,7 @@ type
     property LayerOriginalClass[AIndex: integer]: TBGRALayerOriginalAny read GetLayerOriginalClass;
     property LayerOriginalClass[AIndex: integer]: TBGRALayerOriginalAny read GetLayerOriginalClass;
     property LayerOriginalMatrix[AIndex: integer]: TAffineMatrix read GetLayerOriginalMatrix write SetLayerOriginalMatrix;
     property LayerOriginalMatrix[AIndex: integer]: TAffineMatrix read GetLayerOriginalMatrix write SetLayerOriginalMatrix;
     property LayerId[AIndex: integer]: integer read GetLayerId;
     property LayerId[AIndex: integer]: integer read GetLayerId;
+    property LayerGuid[AIndex: integer]: TGuid read GetLayerGuid;
     property LayerVisible[AIndex: integer]: boolean read GetLayerVisible write SetLayerVisible;
     property LayerVisible[AIndex: integer]: boolean read GetLayerVisible write SetLayerVisible;
     property LayerOpacity[AIndex: integer]: byte read GetLayerOpacity write SetLayerOpacity;
     property LayerOpacity[AIndex: integer]: byte read GetLayerOpacity write SetLayerOpacity;
     property LayerOffset[AIndex: integer]: TPoint read GetLayerOffset write SetLayerOffset;
     property LayerOffset[AIndex: integer]: TPoint read GetLayerOffset write SetLayerOffset;
@@ -1352,6 +1355,20 @@ begin
   result := FCurrentState.LayerBitmapById[AId];
   result := FCurrentState.LayerBitmapById[AId];
 end;
 end;
 
 
+function TLazPaintImage.GetLayerGuid(AIndex: integer): TGuid;
+var
+  guidStr: RawByteString;
+begin
+  guidStr := GetLayerRegistry(AIndex, 'guid');
+  if guidStr<>'' then
+    result := StringToGUID(guidStr)
+  else
+  begin
+    CreateGUID(result);
+    SetLayerRegistry(AIndex, 'guid', GUIDToString(result));
+  end;
+end;
+
 function TLazPaintImage.GetLayerId(AIndex: integer): integer;
 function TLazPaintImage.GetLayerId(AIndex: integer): integer;
 begin
 begin
   result := FCurrentState.LayerId[AIndex];
   result := FCurrentState.LayerId[AIndex];
@@ -2235,6 +2252,17 @@ begin
   result := FCurrentState.LayeredBitmap.GetLayerIndexFromId(AId);
   result := FCurrentState.LayeredBitmap.GetLayerIndexFromId(AId);
 end;
 end;
 
 
+function TLazPaintImage.GetLayerIndexByGuid(AGuid: TGuid): integer;
+var
+  guidStr: String;
+  i: Integer;
+begin
+  guidStr := GUIDToString(AGuid);
+  for i := 0 to NbLayers-1 do
+    if CompareText(GetLayerRegistry(i, 'guid'),guidStr)=0 then exit(i);
+  exit(-1);
+end;
+
 constructor TLazPaintImage.Create;
 constructor TLazPaintImage.Create;
 begin
 begin
   FCurrentState := TImageState.Create;
   FCurrentState := TImageState.Create;

+ 22 - 6
lazpaint/image/uimageaction.pas

@@ -25,6 +25,7 @@ type
     function ScriptImageMoveLayerIndex(AVars: TVariableSet): TScriptResult;
     function ScriptImageMoveLayerIndex(AVars: TVariableSet): TScriptResult;
     function ScriptLayerFromFile(AVars: TVariableSet): TScriptResult;
     function ScriptLayerFromFile(AVars: TVariableSet): TScriptResult;
     function ScriptImageGetRegistry(AVars: TVariableSet): TScriptResult;
     function ScriptImageGetRegistry(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerGetId(AVars: TVariableSet): TScriptResult;
     function ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
     function ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
     function ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
     function ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
     function ScriptLayerAddNew(AVars: TVariableSet): TScriptResult;
     function ScriptLayerAddNew(AVars: TVariableSet): TScriptResult;
@@ -166,7 +167,7 @@ begin
 
 
   Scripting.RegisterScriptFunction('LayerHorizontalFlip',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerHorizontalFlip',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerVerticalFlip',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerVerticalFlip',@GenericScriptFunction,ARegister);
-  Scripting.RegisterScriptFunction('LayerGetId',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('LayerGetId',@ScriptLayerGetId,ARegister);
   Scripting.RegisterScriptFunction('LayerGetName',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerGetName',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerGetOpacity',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerGetOpacity',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerGetBlendOp',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerGetBlendOp',@GenericScriptFunction,ARegister);
@@ -250,7 +251,6 @@ begin
   if f = 'IsLayerEmpty' then AVars.Booleans['Result'] := Image.CurrentLayerEmpty else
   if f = 'IsLayerEmpty' then AVars.Booleans['Result'] := Image.CurrentLayerEmpty else
   if f = 'LayerHorizontalFlip' then HorizontalFlip(foCurrentLayer) else
   if f = 'LayerHorizontalFlip' then HorizontalFlip(foCurrentLayer) else
   if f = 'LayerVerticalFlip' then VerticalFlip(foCurrentLayer) else
   if f = 'LayerVerticalFlip' then VerticalFlip(foCurrentLayer) else
-  if f = 'LayerGetId' then AVars.Integers['Result'] := Image.LayerId[Image.CurrentLayerIndex] else
   if f = 'LayerGetName' then AVars.Strings['Result'] := Image.LayerName[Image.CurrentLayerIndex] else
   if f = 'LayerGetName' then AVars.Strings['Result'] := Image.LayerName[Image.CurrentLayerIndex] else
   if f = 'LayerGetOpacity' then AVars.Integers['Result'] := Image.LayerOpacity[Image.CurrentLayerIndex] else
   if f = 'LayerGetOpacity' then AVars.Integers['Result'] := Image.LayerOpacity[Image.CurrentLayerIndex] else
   if f = 'LayerGetBlendOp' then AVars.Strings['Result'] := BlendOperationStr[Image.BlendOperation[Image.CurrentLayerIndex]] else
   if f = 'LayerGetBlendOp' then AVars.Strings['Result'] := BlendOperationStr[Image.BlendOperation[Image.CurrentLayerIndex]] else
@@ -273,12 +273,14 @@ end;
 
 
 function TImageActions.ScriptGetLayerIndex(AVars: TVariableSet): TScriptResult;
 function TImageActions.ScriptGetLayerIndex(AVars: TVariableSet): TScriptResult;
 var
 var
-  idx,layerId: Integer;
+  idx: Integer;
+  layerGuid: TGUID;
 begin
 begin
   if AVars.IsDefined('LayerId') then
   if AVars.IsDefined('LayerId') then
   begin
   begin
-    layerId := AVars.Integers['LayerId'];
-    idx := Image.CurrentState.LayeredBitmap.GetLayerIndexFromId(layerId);
+    if not TryStringToGUID('{'+AVars.Strings['LayerId']+'}', layerGuid) then
+      exit(srInvalidParameters);
+    idx := Image.GetLayerIndexByGuid(layerGuid);
     if idx <> -1 then
     if idx <> -1 then
       AVars.Integers['Result']:= idx+1
       AVars.Integers['Result']:= idx+1
     else
     else
@@ -318,6 +320,17 @@ begin
   result := srOk;
   result := srOk;
 end;
 end;
 
 
+function TImageActions.ScriptLayerGetId(AVars: TVariableSet): TScriptResult;
+var
+  guidStr: String;
+begin
+  guidStr := LowerCase(GUIDToString(Image.LayerGuid[Image.CurrentLayerIndex]));
+  if (length(guidStr)>0) and (guidStr[1]='{') and (guidStr[length(guidStr)]='}') then
+    guidStr := copy(guidStr,2,length(guidStr)-2);
+  AVars.Strings['Result'] := guidStr;
+  result := srOk;
+end;
+
 function TImageActions.ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
 function TImageActions.ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
 var
 var
   identifier: String;
   identifier: String;
@@ -331,8 +344,11 @@ end;
 function TImageActions.ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
 function TImageActions.ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
 var
 var
   idx: Integer;
   idx: Integer;
+  layerGuid: TGUID;
 begin
 begin
-  idx := Image.GetLayerIndexById(AVars.Integers['Id']);
+  if not TryStringToGUID('{'+AVars.Strings['Id']+'}', layerGuid) then
+    exit(srInvalidParameters);
+  idx := Image.GetLayerIndexByGuid(layerGuid);
   if idx = -1 then exit(srInvalidParameters)
   if idx = -1 then exit(srInvalidParameters)
   else if not Image.SetCurrentLayerByIndex(idx) then exit(srException)
   else if not Image.SetCurrentLayerByIndex(idx) then exit(srException)
   else exit(srOk);
   else exit(srOk);