johann пре 5 година
родитељ
комит
dcf81da7cd

+ 6 - 0
lazpaint/image/uimage.pas

@@ -174,6 +174,7 @@ type
     procedure SetLayerOffset(AIndex: integer; AValue: TPoint; APrecomputedLayerBounds: TRect);
     function CurrentLayerReadOnly: TBGRABitmap;
 
+    function GetLayerIndexById(AId: integer): integer;
     procedure AddNewLayer;
     procedure AddNewLayer(AOriginal: TBGRALayerCustomOriginal; AName: string; ABlendOp: TBlendOperation; AMatrix: TAffineMatrix);
     procedure AddNewLayer(ALayer: TBGRABitmap; AName: string; ABlendOp: TBlendOperation);
@@ -2127,6 +2128,11 @@ begin
   result := GetSelectedImageLayer;
 end;
 
+function TLazPaintImage.GetLayerIndexById(AId: integer): integer;
+begin
+  result := FCurrentState.LayeredBitmap.GetLayerIndexFromId(AId);
+end;
+
 constructor TLazPaintImage.Create;
 begin
   FCurrentState := TImageState.Create;

+ 78 - 14
lazpaint/image/uimageaction.pas

@@ -21,10 +21,15 @@ type
     procedure ChooseTool(ATool: TPaintToolType);
     procedure RegisterScripts(ARegister: Boolean);
     function GenericScriptFunction(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerFromFile(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerAddNew(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerDuplicate(AVars: TVariableSet): TScriptResult;
     function ScriptPutImage(AVars: TVariableSet): TScriptResult;
     function ScriptLayerFill(AVars: TVariableSet): TScriptResult;
     function ScriptGetFrameIndex(AVars: TVariableSet): TScriptResult;
     procedure ReleaseSelection;
+    function ScriptSelectLayerIndex(AVars: TVariableSet): TScriptResult;
   public
     constructor Create(AInstance: TLazPaintCustomInstance);
     destructor Destroy; override;
@@ -55,13 +60,13 @@ type
     procedure PasteAsNewLayer;
     procedure SelectAll;
     procedure SelectionFit;
-    procedure NewLayer; overload;
+    function NewLayer: boolean; overload;
     function NewLayer(ALayer: TBGRABitmap; AName: string; ABlendOp: TBlendOperation): boolean; overload;
     function NewLayer(ALayer: TBGRALayerCustomOriginal; AName: string; ABlendOp: TBlendOperation; AMatrix: TAffineMatrix): boolean; overload;
-    procedure DuplicateLayer;
+    function DuplicateLayer: boolean;
     procedure RasterizeLayer;
     procedure MergeLayerOver;
-    procedure RemoveLayer;
+    function RemoveLayer: boolean;
     procedure EditSelection(ACallback: TModifyImageCallback);
     procedure Import3DObject(AFilenameUTF8: string);
     function GetPixel(X,Y: Integer): TBGRAPixel;
@@ -140,11 +145,16 @@ begin
   Scripting.RegisterScriptFunction('IsSelectionMaskEmpty',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerHorizontalFlip',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerVerticalFlip',@GenericScriptFunction,ARegister);
-  Scripting.RegisterScriptFunction('LayerAddNew',@GenericScriptFunction,ARegister);
-  Scripting.RegisterScriptFunction('LayerDuplicate',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('LayerGetId',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('LayerSelectId',@ScriptLayerSelectId,ARegister);
+  Scripting.RegisterScriptFunction('LayerAddNew',@ScriptLayerAddNew,ARegister);
+  Scripting.RegisterScriptFunction('LayerFromFile',@ScriptLayerFromFile,ARegister);
+  Scripting.RegisterScriptFunction('LayerDuplicate',@ScriptLayerDuplicate,ARegister);
   Scripting.RegisterScriptFunction('LayerRasterize',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerMergeOver',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerRemoveCurrent',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('GetLayerIndex',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('SelectLayerIndex',@ScriptSelectLayerIndex,ARegister);
   Scripting.RegisterScriptFunction('GetLayerCount',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('GetFrameIndex',@ScriptGetFrameIndex,ARegister);
   Scripting.RegisterScriptFunction('GetFrameCount',@GenericScriptFunction,ARegister);
@@ -203,11 +213,11 @@ begin
   if f = 'IsSelectionMaskEmpty' then AVars.Booleans['Result'] := Image.SelectionMaskEmpty else
   if f = 'LayerHorizontalFlip' then HorizontalFlip(foCurrentLayer) else
   if f = 'LayerVerticalFlip' then VerticalFlip(foCurrentLayer) else
-  if f = 'LayerAddNew' then NewLayer else
-  if f = 'LayerDuplicate' then DuplicateLayer else
+  if f = 'LayerGetId' then AVars.Integers['Result'] := Image.LayerId[Image.CurrentLayerIndex] else
   if f = 'LayerRasterize' then RasterizeLayer else
   if f = 'LayerMergeOver' then MergeLayerOver else
-  if f = 'LayerRemoveCurrent' then RemoveLayer else
+  if f = 'LayerRemoveCurrent' then begin if not RemoveLayer then result := srException end else
+  if f = 'GetLayerIndex' then AVars.Integers['Result']:= Image.CurrentLayerIndex+1 else
   if f = 'GetLayerCount' then AVars.Integers['Result']:= Image.NbLayers else
   if f = 'GetFrameCount' then AVars.Integers['Result']:= Image.FrameCount else
   if f = 'GetPixel' then AVars.Pixels['Result']:= GetPixel(AVars.Integers['X'],AVars.Integers['Y']) else
@@ -216,6 +226,45 @@ begin
     result := srFunctionNotDefined;
 end;
 
+function TImageActions.ScriptLayerFromFile(AVars: TVariableSet): TScriptResult;
+begin
+  if not AVars.IsDefined('FileName') then exit(srInvalidParameters) else
+  if not TryAddLayerFromFile(AVars.Strings['FileName']) then exit(srException) else
+  begin
+    AVars.Integers['Result'] := Image.LayerId[Image.CurrentLayerIndex];
+    exit(srOk);
+  end;
+end;
+
+function TImageActions.ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
+var
+  idx: Integer;
+begin
+  idx := Image.GetLayerIndexById(AVars.Integers['Id']);
+  if idx = -1 then exit(srInvalidParameters)
+  else if not Image.SetCurrentLayerByIndex(idx) then exit(srException)
+  else exit(srOk);
+end;
+
+function TImageActions.ScriptLayerAddNew(AVars: TVariableSet): TScriptResult;
+begin
+  if not NewLayer then result := srException
+  else
+  begin
+    AVars.Integers['Result'] := Image.LayerId[Image.CurrentLayerIndex];
+    result := srOk;
+  end;
+end;
+
+function TImageActions.ScriptLayerDuplicate(AVars: TVariableSet): TScriptResult;
+begin
+  if not DuplicateLayer then result := srException else
+  begin
+    AVars.Integers['Result'] := Image.LayerId[Image.CurrentLayerIndex];
+    result := srOk;
+  end;
+end;
+
 function TImageActions.ScriptPutImage(AVars: TVariableSet): TScriptResult;
 var
   x, y, width, height, opacity, yb, dataPos, xb: integer;
@@ -1057,6 +1106,16 @@ begin
   layeraction.Free;
 end;
 
+function TImageActions.ScriptSelectLayerIndex(AVars: TVariableSet): TScriptResult;
+var
+  index: Int64;
+begin
+  index := AVars.Integers['Index'];
+  if (AVars.Integers['Index'] < 1) or (AVars.Integers['Index'] > Image.NbLayers) then exit(srInvalidParameters);
+  if not Image.SetCurrentLayerByIndex(index-1) then result := srException
+  else result := srOk;
+end;
+
 procedure TImageActions.Paste;
 var partial: TBGRABitmap;
     layeraction: TLayerAction;
@@ -1188,7 +1247,7 @@ begin
   end;
 end;
 
-procedure TImageActions.NewLayer;
+function TImageActions.NewLayer: boolean;
 {var top: TTopMostInfo;
     res: integer;}
 begin
@@ -1207,7 +1266,9 @@ begin
     Image.AddNewLayer;
     ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
-  end;
+    result := true;
+  end else
+    result := false;
 end;
 
 function TImageActions.NewLayer(ALayer: TBGRABitmap; AName: string;
@@ -1250,13 +1311,15 @@ begin
   end;
 end;
 
-procedure TImageActions.DuplicateLayer;
+function TImageActions.DuplicateLayer: boolean;
 begin
   if image.NbLayers < MaxLayersToAdd then
   begin
     Image.DuplicateLayer;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
-  end;
+    result := true;
+  end else
+    result := false;
 end;
 
 procedure TImageActions.RasterizeLayer;
@@ -1279,7 +1342,7 @@ begin
   end;
 end;
 
-procedure TImageActions.RemoveLayer;
+function TImageActions.RemoveLayer: boolean;
 var idx: integer;
 begin
   if (Image.CurrentLayerIndex <> -1) and (Image.NbLayers > 1) then
@@ -1291,7 +1354,8 @@ begin
     Image.RemoveLayer;
     ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(idx);
-  end;
+    result := true;
+  end else result := false;
 end;
 
 procedure TImageActions.EditSelection(ACallback: TModifyImageCallback);

+ 6 - 0
lazpaintscripts/lazpaint/image.py

@@ -12,6 +12,12 @@ def get_width():
 def get_height():
   return command.send("GetImageHeight?")
 
+def get_layer_index():
+  return command.send("GetLayerIndex?")
+
+def select_layer_index(index):
+  return command.send("SelectLayerIndex", Index=index)
+
 def get_layer_count():
   return command.send("GetLayerCount?")
 

+ 34 - 0
lazpaintscripts/lazpaint/layer.py

@@ -9,6 +9,33 @@ DM_SET = "dmSet"
 DM_SET_EXCEPT_TRANSPARENT = "dmSetExceptTransparent"
 DM_XOR = "dmXor"
 
+def get_id():
+  return command.send("LayerGetId?")
+
+def select_id(id):
+  command.send("LayerSelectId", Id=id)
+
+def new():
+  return command.send("LayerAddNew?")
+
+def add_from_file(file_name):
+  return command.send("LayerFromFile?", FileName=file_name)
+
+def duplicate():
+  return command.send("LayerDuplicate?")
+
+def merge_over():
+  command.send("LayerMergeOver")
+
+def remove():
+  command.send("LayerRemoveCurrent")
+
+def get_count():
+  return command.send("GetLayerCount?")
+
+def rasterize():
+  command.send("LayerRasterize")
+
 def put_image(x, y, image, mode=DM_DRAW, opacity=255):
   height = len(image)
   if height == 0: return
@@ -23,3 +50,10 @@ def get_pixel(x, y):
 
 def fill(color, mode=DM_DRAW):
   command.send("LayerFill", Color=color, Mode=mode)
+
+def horizontal_flip():
+  command.send("LayerHorizontalFlip")
+
+def vertical_flip():
+  command.send("LayerVerticalFlip")
+

+ 10 - 0
lazpaintscripts/test_layer.py

@@ -0,0 +1,10 @@
+from lazpaint import layer, dialog
+
+layer_id = layer.get_id()
+layer.duplicate()
+layer.horizontal_flip()
+layer.duplicate()
+layer.vertical_flip()
+layer.merge_over()
+layer.select_id(layer_id)
+layer.remove()

+ 6 - 0
lazpaintscripts/test_layer2.py

@@ -0,0 +1,6 @@
+from lazpaint import image, layer, filter
+
+for i in range(1, image.get_layer_count()+1):
+  image.select_layer_index(i)
+  filter.twirl(radius=min(image.get_width(),image.get_height())/2, angle=360)
+