ソースを参照

script image registry draft

johann 5 年 前
コミット
57698ac18f

+ 50 - 1
lazpaint/image/uimageaction.pas

@@ -24,8 +24,12 @@ type
     function ScriptGetLayerIndex(AVars: TVariableSet): TScriptResult;
     function ScriptImageMoveLayerIndex(AVars: TVariableSet): TScriptResult;
     function ScriptLayerFromFile(AVars: TVariableSet): TScriptResult;
+    function ScriptImageGetRegistry(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
     function ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
     function ScriptLayerAddNew(AVars: TVariableSet): TScriptResult;
+    function ScriptImageSetRegistry(AVars: TVariableSet): TScriptResult;
+    function ScriptLayerSetRegistry(AVars: TVariableSet): TScriptResult;
     function ScriptPasteAsNewLayer(AVars: TVariableSet): TScriptResult;
     function ScriptLayerDuplicate(AVars: TVariableSet): TScriptResult;
     function ScriptPutImage(AVars: TVariableSet): TScriptResult;
@@ -178,6 +182,10 @@ begin
   Scripting.RegisterScriptFunction('LayerRasterize',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerMergeOver',@GenericScriptFunction,ARegister);
   Scripting.RegisterScriptFunction('LayerRemoveCurrent',@GenericScriptFunction,ARegister);
+  Scripting.RegisterScriptFunction('LayerGetRegistry',@ScriptLayerGetRegistry,ARegister);
+  Scripting.RegisterScriptFunction('LayerSetRegistry',@ScriptLayerSetRegistry,ARegister);
+  Scripting.RegisterScriptFunction('ImageGetRegistry',@ScriptImageGetRegistry,ARegister);
+  Scripting.RegisterScriptFunction('ImageSetRegistry',@ScriptImageSetRegistry,ARegister);
   Scripting.RegisterScriptFunction('ImageMoveLayerIndex',@ScriptImageMoveLayerIndex,ARegister);
   Scripting.RegisterScriptFunction('GetLayerIndex',@ScriptGetLayerIndex,ARegister);
   Scripting.RegisterScriptFunction('SelectLayerIndex',@ScriptSelectLayerIndex,ARegister);
@@ -253,7 +261,6 @@ begin
   if f = 'LayerRasterize' then RasterizeLayer else
   if f = 'LayerMergeOver' then MergeLayerOver 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
@@ -299,6 +306,26 @@ begin
   end;
 end;
 
+function TImageActions.ScriptImageGetRegistry(AVars: TVariableSet): TScriptResult;
+var
+  identifier: String;
+begin
+  identifier := AVars.Strings['Identifier'];
+  if length(identifier)=0 then exit(srInvalidParameters);
+  AVars.Strings['Result'] := Image.CurrentState.LayeredBitmap.GetGlobalRegistry(identifier);
+  result := srOk;
+end;
+
+function TImageActions.ScriptLayerGetRegistry(AVars: TVariableSet): TScriptResult;
+var
+  identifier: String;
+begin
+  identifier := AVars.Strings['Identifier'];
+  if length(identifier)=0 then exit(srInvalidParameters);
+  AVars.Strings['Result'] := Image.CurrentState.LayeredBitmap.GetLayerRegistry(Image.CurrentLayerIndex, identifier);
+  result := srOk;
+end;
+
 function TImageActions.ScriptLayerSelectId(AVars: TVariableSet): TScriptResult;
 var
   idx: Integer;
@@ -319,6 +346,28 @@ begin
   end;
 end;
 
+function TImageActions.ScriptImageSetRegistry(AVars: TVariableSet): TScriptResult;
+var
+  identifier: String;
+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']);
+  result := srOk;
+end;
+
+function TImageActions.ScriptLayerSetRegistry(AVars: TVariableSet): TScriptResult;
+var
+  identifier: String;
+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']);
+  result := srOk;
+end;
+
 function TImageActions.ScriptPasteAsNewLayer(AVars: TVariableSet
   ): TScriptResult;
 var

+ 35 - 4
scripts/layer_shadow.py

@@ -17,13 +17,35 @@ if layer.is_empty():
 MAX_RADIUS = 100
 MAX_OFFSET = 100
 
-image.do_begin()
-chosen_radius = 10
-chosen_offset = (10, 10)
+source_layer_id = layer.get_id()
+source_layer_name = layer.get_name()
+
+chosen_radius = layer.get_registry("shadow-radius")
+if chosen_radius == None: 
+    chosen_radius = image.get_registry("shadow-radius")
+if chosen_radius == None:
+    chosen_radius = 10
+
+chosen_offset = layer.get_registry("shadow-offset")
+if chosen_offset == None or len(chosen_offset) != 2:
+    chosen_offset = image.get_registry("shadow-offset")
+if chosen_offset == None or len(chosen_offset) != 2:
+    chosen_offset = (10, 10)
+
+shadow_layer_id = layer.get_registry("shadow-layer-id")
+if image.get_layer_index(shadow_layer_id) == None:
+    shadow_layer_id = None
 
 def create_shadow_layer():
+    global shadow_layer_id
     image.do_begin()
+    if shadow_layer_id != None:
+        layer.select_id(shadow_layer_id)
+        layer.remove()
+    layer.select_id(source_layer_id)
     layer.duplicate()
+    layer.set_name("Shadow of "+source_layer_name)
+    shadow_layer_id = layer.get_id()
     shadow_index = image.get_layer_index()
     image.move_layer_index(shadow_index, shadow_index-1)
     colors.lightness(shift=-1)
@@ -60,12 +82,20 @@ def apply_offset():
 ######## interface
 
 def button_ok_click():
+    global source_layer_id, chosen_radius, chosen_offset
+    layer.select_id(source_layer_id)
+    layer.set_registry("shadow-radius", chosen_radius)
+    layer.set_registry("shadow-offset", chosen_offset)
+    layer.set_registry("shadow-layer-id", shadow_layer_id)
+    image.set_registry("shadow-radius", chosen_radius)
+    image.set_registry("shadow-offset", chosen_offset)
     image.do_end()
     exit()
 
-def button_cancel_click():
+def button_cancel_click():    
     if image.do_end():
         image.undo()
+    layer.select_id(source_layer_id)
     exit()
 
 scale_radius_update_job = None
@@ -133,6 +163,7 @@ button_ok.pack(side=RIGHT, padx=10, pady=10)
 button_cancel = Button(window, text="Cancel", command=button_cancel_click)
 button_cancel.pack(side=RIGHT, pady=10)
 
+image.do_begin()
 create_shadow_layer()
 apply_blur()
 

+ 7 - 5
scripts/lazpaint/command.py

@@ -7,6 +7,12 @@ if input('') != chr(27) + 'LazPaint':
   print("Needs to be run from LazPaint.")
   exit()
 
+def parse_str(text):
+  if text[:1] == "#":
+    return text
+  else:
+    return ast.literal_eval(text)
+
 # sends a command to LazPaint
 def send(command, **keywords):
   if keywords is None:
@@ -14,11 +20,7 @@ def send(command, **keywords):
   else:
     print(chr(27) + command + chr(29) + str(keywords))
   if command[-1] == '?':
-    result_str =  input('')
-    if result_str[:1] == "#":
-      return result_str
-    else:
-      return ast.literal_eval(result_str)
+    return parse_str(input(''))
   else:
     return
 

+ 16 - 2
scripts/lazpaint/image.py

@@ -37,8 +37,22 @@ def get_width():
 def get_height():
   return command.send("GetImageHeight?")
 
-def get_layer_index():
-  return command.send("GetLayerIndex?")
+def get_registry(identifier):
+  str_result = command.send("ImageGetRegistry?", Identifier=identifier)
+  if str_result == "":
+    return None
+  else:
+    return command.parse_str(str_result)
+
+def set_registry(identifier, value):
+  if value == None:
+    value = ""
+  else:
+    value = str(value)
+  command.send("ImageSetRegistry", Identifier=identifier, Value=value)
+
+def get_layer_index(layer_id=None):
+  return command.send("GetLayerIndex?", LayerId=layer_id)
 
 def select_layer_index(index):
   return command.send("SelectLayerIndex", Index=index)

+ 14 - 0
scripts/lazpaint/layer.py

@@ -88,6 +88,20 @@ def merge_over():
 def is_empty():
   return command.send("IsLayerEmpty?")
 
+def get_registry(identifier):
+  str_result = command.send("LayerGetRegistry?", Identifier=identifier)
+  if str_result == "":
+    return None
+  else:
+    return command.parse_str(str_result)
+
+def set_registry(identifier, value):
+  if value == None:
+    value = ""
+  else:
+    value = str(value)
+  command.send("LayerSetRegistry", Identifier=identifier, Value=value)
+
 def remove():
   command.send("LayerRemoveCurrent")