Browse Source

script texture fill

johann 5 years ago
parent
commit
cd0669d68a

+ 1 - 1
lazpaint/image/uimageaction.pas

@@ -263,7 +263,7 @@ begin
   if f = 'LayerGetBlendOp' then AVars.Strings['Result'] := BlendOperationStr[Image.BlendOperation[Image.CurrentLayerIndex]] else
   if f = 'LayerGetVisible' then AVars.Booleans['Result'] := Image.LayerVisible[Image.CurrentLayerIndex] else
   if f = 'LayerSetName' then Image.LayerName[Image.CurrentLayerIndex] := AVars.Strings['Name'] else
-  if f = 'LayerSetOpacity' then Image.LayerOpacity[Image.CurrentLayerIndex] := AVars.Integers['Opacity'] else
+  if f = 'LayerSetOpacity' then Image.LayerOpacity[Image.CurrentLayerIndex] := min(255, max(0, AVars.Integers['Opacity'])) else
   if f = 'LayerSetBlendOp' then Image.BlendOperation[Image.CurrentLayerIndex] := StrToBlendOperation(AVars.Strings['BlendOp']) else
   if f = 'LayerSetVisible' then Image.LayerVisible[Image.CurrentLayerIndex] := AVars.Booleans['Visible'] else
   if f = 'LayerRasterize' then RasterizeLayer else

+ 142 - 1
lazpaint/tools/utool.pas

@@ -299,6 +299,12 @@ type
     function ScriptGetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
     function ScriptGetForeGradientType(AVars: TVariableSet): TScriptResult;
     function ScriptGetForeGradientColors(AVars: TVariableSet): TScriptResult;
+    function ScriptGetTextureRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptGetTextureOpacity(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptGetBackTextureRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptGetBackTextureOpacity(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeTextureRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeTextureOpacity(AVars: TVariableSet): TScriptResult;
     function ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptGetLineCap(AVars: TVariableSet): TScriptResult;
@@ -343,6 +349,15 @@ type
     function ScriptSetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
     function ScriptSetForeGradientType(AVars: TVariableSet): TScriptResult;
     function ScriptSetForeGradientColors(AVars: TVariableSet): TScriptResult;
+    function ScriptSetTexture(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetTextureRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetTextureOpacity(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetBackTexture(AVars: TVariableSet): TScriptResult;
+    function ScriptSetBackTextureRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptSetBackTextureOpacity(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeTexture(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeTextureRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeTextureOpacity(AVars: TVariableSet): TScriptResult;
     function ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptSetLineCap(AVars: TVariableSet): TScriptResult;
@@ -558,7 +573,7 @@ function ToolPopupMessageToStr(AMessage :TToolPopupMessage; AKey: Word = 0): str
 implementation
 
 uses UGraph, LCScaleDPI, LazPaintType, UCursors, BGRATextFX, ULoading, UResourceStrings,
-  BGRATransform, LCVectorOriginal, BGRASVGOriginal, math;
+  BGRATransform, LCVectorOriginal, BGRASVGOriginal, math, ULoadImage;
 
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 var pt: TPaintToolType;
@@ -1882,6 +1897,49 @@ begin
   result := ScriptGetGradientColors(AVars, FForeFill);
 end;
 
+function TToolManager.ScriptGetTextureRepetition(AVars: TVariableSet;
+  AFill: TVectorialFill): TScriptResult;
+begin
+  if AFill.FillType <> vftTexture then exit(srException);
+  result := srOk;
+  case AFill.TextureRepetition of
+  trNone: AVars.Strings['Result'] := 'None';
+  trRepeatX: AVars.Strings['Result'] := 'RepeatX';
+  trRepeatY: AVars.Strings['Result'] := 'RepeatY';
+  trRepeatBoth: AVars.Strings['Result'] := 'RepeatBoth';
+  else
+    result := srException;
+  end;
+end;
+
+function TToolManager.ScriptGetTextureOpacity(AVars: TVariableSet;
+  AFill: TVectorialFill): TScriptResult;
+begin
+  if AFill.FillType <> vftTexture then exit(srException);
+  AVars.Integers['Result'] := AFill.TextureOpacity;
+  result := srOk;
+end;
+
+function TToolManager.ScriptGetBackTextureRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetTextureRepetition(AVars, BackFill);
+end;
+
+function TToolManager.ScriptGetBackTextureOpacity(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetTextureOpacity(AVars, BackFill);
+end;
+
+function TToolManager.ScriptGetForeTextureRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetTextureRepetition(AVars, ForeFill);
+end;
+
+function TToolManager.ScriptGetForeTextureOpacity(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetTextureOpacity(AVars, ForeFill);
+end;
+
 function TToolManager.ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
 begin
   result := srOk;
@@ -2342,6 +2400,79 @@ begin
   result := ScriptSetGradientColors(AVars, FForeFill);
 end;
 
+function TToolManager.ScriptSetTexture(AVars: TVariableSet;
+  AFill: TVectorialFill): TScriptResult;
+var
+  fileName: String;
+  flatImg: TBGRABitmap;
+begin
+  fileName := trim(AVars.Strings['FileName']);
+  if fileName='' then exit(srInvalidParameters);
+  flatImg := LoadFlatImageUTF8(fileName).bmp;
+  if flatImg = nil then exit(srException);
+  try
+    if AFill.FillType <> vftTexture then
+      AFill.SetTexture(flatImg, AffineMatrixIdentity)
+    else
+      AFill.SetTexture(flatImg, AffineMatrixIdentity, AFill.TextureOpacity, AFill.TextureRepetition);
+    result := srOk;
+  finally
+    flatImg.FreeReference;
+  end;
+end;
+
+function TToolManager.ScriptSetTextureRepetition(AVars: TVariableSet;
+  AFill: TVectorialFill): TScriptResult;
+begin
+  if AFill.FillType <> vftTexture then exit(srException);
+  case AVars.Strings['Repetition'] of
+  'None': AFill.TextureRepetition:= trNone;
+  'RepeatX': AFill.TextureRepetition:= trRepeatX;
+  'RepeatY': AFill.TextureRepetition:= trRepeatY;
+  'RepeatBoth': AFill.TextureRepetition:= trRepeatBoth;
+  else exit(srInvalidParameters);
+  end;
+  result := srOk;
+end;
+
+function TToolManager.ScriptSetTextureOpacity(AVars: TVariableSet;
+  AFill: TVectorialFill): TScriptResult;
+begin
+  if AFill.FillType <> vftTexture then exit(srException);
+  AFill.TextureOpacity := min(255, max(0, AVars.Integers['Opacity']));
+  result := srOk;
+end;
+
+function TToolManager.ScriptSetBackTexture(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTexture(AVars, BackFill);
+end;
+
+function TToolManager.ScriptSetBackTextureRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTextureRepetition(AVars, BackFill);
+end;
+
+function TToolManager.ScriptSetBackTextureOpacity(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTextureOpacity(AVars, BackFill);
+end;
+
+function TToolManager.ScriptSetForeTexture(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTexture(AVars, ForeFill);
+end;
+
+function TToolManager.ScriptSetForeTextureRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTextureRepetition(AVars, ForeFill);
+end;
+
+function TToolManager.ScriptSetForeTextureOpacity(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetTextureOpacity(AVars, ForeFill);
+end;
+
 function TToolManager.ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
 begin
   result := srOk;
@@ -3013,6 +3144,16 @@ begin
   FScriptContext.RegisterScriptFunction('ToolGetBackGradientInterpolation', @ScriptGetBackGradientInterpolation, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetBackGradientColors', @ScriptSetBackGradientColors, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetBackGradientColors', @ScriptGetBackGradientColors, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeTexture', @ScriptSetForeTexture, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeTextureRepetition', @ScriptSetForeTextureRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeTextureRepetition', @ScriptGetForeTextureRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeTextureOpacity', @ScriptSetForeTextureOpacity, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeTextureOpacity', @ScriptGetForeTextureOpacity, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackTexture', @ScriptSetBackTexture, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackTextureRepetition', @ScriptSetBackTextureRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetBackTextureRepetition', @ScriptGetBackTextureRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackTextureOpacity', @ScriptSetBackTextureOpacity, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetBackTextureOpacity', @ScriptGetBackTextureOpacity, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeAltitude', @ScriptSetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetPhongShapeAltitude', @ScriptGetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeBorderSize', @ScriptSetPhongShapeBorderSize, ARegister);

+ 35 - 0
scripts/lazpaint/tools.py

@@ -112,6 +112,11 @@ GRADIENT_REPETITION_REPEAT = 'Repeat'
 GRADIENT_REPETITION_REFLECT = 'Reflect'
 GRADIENT_REPETITION_SINE = 'Sine'
 
+TEXTURE_REPETITION_NONE = 'None';
+TEXTURE_REPETITION_X = 'RepeatX';
+TEXTURE_REPETITION_Y = 'RepeatY';
+TEXTURE_REPETITION_BOTH = 'RepeatBoth';
+
 SHAPE_KIND_RECTANGLE = 'Rectangle'
 SHAPE_KIND_ROUND_RECTANGLE = 'RoundRectangle'
 SHAPE_KIND_HALF_SPHERE = 'HalfSphere'
@@ -424,6 +429,36 @@ def set_back_gradient_repetition(repetition):
 def get_back_gradient_repetition():
   return command.send('ToolGetBackGradientRepetition?')
 
+def set_fore_texture(file_name):
+  command.send('ToolSetForeTexture', FileName=file_name)
+
+def set_fore_texture_repetition(repetition):
+  command.send('ToolSetForeTextureRepetition', Repetition=repetition)
+
+def get_fore_texture_repetition():
+  return command.send('ToolGetForeTextureRepetition?')
+
+def set_fore_texture_opacity(opacity: int):
+  command.send('ToolSetForeTextureOpacity', Opacity=opacity)
+
+def get_fore_texture_opacity(): #-> int 0..255
+  return command.send('ToolGetForeTextureOpacity?')
+
+def set_back_texture(file_name):
+  command.send('ToolSetBackTexture', FileName=file_name)
+
+def set_back_texture_repetition(repetition):
+  command.send('ToolSetBackTextureRepetition', Repetition=repetition)
+
+def get_back_texture_repetition():
+  return command.send('ToolGetBackTextureRepetition?')
+
+def set_back_texture_opacity(opacity: int):
+  command.send('ToolSetBackTextureOpacity', Opacity=opacity)
+
+def get_back_texture_opacity(): #-> int 0..255
+  return command.send('ToolGetBackTextureOpacity?')
+
 def set_phong_shape_kind(kind):
   command.send('ToolSetPhongShapeKind', Kind=kind)
 

+ 6 - 0
scripts/test/layer_to_backfill.py

@@ -0,0 +1,6 @@
+from lazpaint import image, layer, tools
+
+temp_name = image.get_temporary_name()
+layer.save_as(temp_name)
+tools.set_back_texture(temp_name)
+