Browse Source

script: phong filter and emboss

johann 5 years ago
parent
commit
f063a64692

+ 0 - 1
lazpaint/dialog/filter/uemboss.lfm

@@ -17,7 +17,6 @@ object FEmboss: TFEmboss
   ClientWidth = 148
   Font.Height = -12
   OnCreate = FormCreate
-  OnDestroy = FormDestroy
   OnShow = FormShow
   Position = poMainFormCenter
   LCLVersion = '1.6.0.4'

+ 29 - 11
lazpaint/dialog/filter/uemboss.pas

@@ -26,7 +26,6 @@ type
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_Change(Sender: TObject);
     procedure FormCreate(Sender: TObject);
-    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
       {%H-}Shift: TShiftState; X, Y: Integer);
@@ -42,9 +41,11 @@ type
     PaintBoxMouseMovePos: TPoint;
     angle: single;
     selectingAngle: boolean;
+    FInitializing: boolean;
     procedure ComputeAngle(X,Y: integer);
     function ComputeFilteredLayer: TBGRABitmap;
     procedure PreviewNeeded;
+    procedure InitParams;
   public
     FilterConnector: TFilterConnector;
     FVars: TVariableSet;
@@ -68,8 +69,17 @@ begin
   try
     if FEmboss.FilterConnector.ActiveLayer <> nil then
     begin
-      if FEmboss.showModal = mrOk then result := srOk
-      else result := srCancelledByUser;
+      if Assigned(FEmboss.FilterConnector.Parameters) and
+        FEmboss.FilterConnector.Parameters.Booleans['Validate'] then
+      begin
+        FEmboss.InitParams;
+        FEmboss.PreviewNeeded;
+        FEmboss.FilterConnector.ValidateAction;
+      end else
+      begin
+        if FEmboss.showModal = mrOk then result := srOk
+        else result := srCancelledByUser;
+      end;
     end
     else
       result := srException;
@@ -86,16 +96,9 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
 end;
 
-procedure TFEmboss.FormDestroy(Sender: TObject);
-begin
-
-end;
-
 procedure TFEmboss.FormShow(Sender: TObject);
 begin
-  if Assigned(FVars) and FVars.IsDefined('Angle') then
-    angle := FVars.Floats['Angle'] else
-    angle := FilterConnector.LazPaintInstance.Config.DefaultEmbossAngle;
+  InitParams;
   PreviewNeeded;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left
 end;
@@ -190,6 +193,21 @@ begin
   FilterConnector.PutImage(ComputeFilteredLayer,False,True);
 end;
 
+procedure TFEmboss.InitParams;
+begin
+  FInitializing:= true;
+  angle := FilterConnector.LazPaintInstance.Config.DefaultEmbossAngle;
+  if Assigned(FVars) then
+  begin
+    if FVars.IsDefined('Angle') then angle := FVars.Floats['Angle'];
+    if FVars.IsDefined('Transparent') then
+      CheckBox_Transparent.Checked := FVars.Booleans['Transparent'];
+    if FVars.IsDefined('PreserveColors') then
+      CheckBox_PreserveColors.Checked := FVars.Booleans['PreserveColors'];
+  end;
+  FInitializing:= false;
+end;
+
 {$R *.lfm}
 
 end.

+ 54 - 12
lazpaint/dialog/filter/uphongfilter.pas

@@ -54,6 +54,7 @@ type
     FHeightMap: TBGRABitmap;
     FWorkspaceColor: TColor;
     function GetCurrentLightPos: TPointF;
+    procedure InitParams;
     procedure PreviewNeeded;
     function ComputeFilteredLayer: TBGRABitmap;
   public
@@ -77,8 +78,18 @@ begin
   try
     if FPhongFilter.FilterConnector.ActiveLayer <> nil then
     begin
-      if FPhongFilter.showModal = mrOk then result := srOk
-      else result := srCancelledByUser;
+      if Assigned(FPhongFilter.FilterConnector.Parameters) and
+        FPhongFilter.FilterConnector.Parameters.Booleans['Validate'] then
+      begin
+        FPhongFilter.InitParams;
+        FPhongFilter.PreviewNeeded;
+        FPhongFilter.FilterConnector.PutImage(FPhongFilter.ComputeFilteredLayer,true,true);
+        FPhongFilter.FilterConnector.ValidateAction;
+      end else
+      begin
+        if FPhongFilter.showModal = mrOk then result := srOk
+        else result := srCancelledByUser;
+      end;
     end
     else
       result := srException;
@@ -113,16 +124,7 @@ end;
 
 procedure TFPhongFilter.FormShow(Sender: TObject);
 begin
-  FInitializing:= true;
-  Radio_UseTexture.Enabled := (FilterConnector.LazPaintInstance.ToolManager.GetTexture <> nil);
-  if Radio_UseTexture.Enabled then Radio_UseTexture.Checked := true
-  else Radio_UsePenColor.Checked := true;
-  SpinEdit_Altitude.Value := FilterConnector.LazPaintInstance.Config.DefaultPhongFilterAltitude;
-  SpinEdit_AltitudeChange(nil);
-  with FilterConnector.LazPaintInstance.ToolManager.LightPosition do
-    FCenter := PointF(X/FilterConnector.LazPaintInstance.Image.Width,
-        Y/FilterConnector.LazPaintInstance.Image.Height);
-  FInitializing := false;
+  InitParams;
   PreviewNeeded;
 end;
 
@@ -209,6 +211,46 @@ begin
     FCenter.Y*FilterConnector.ActiveLayer.Height);
 end;
 
+procedure TFPhongFilter.InitParams;
+begin
+  FInitializing:= true;
+  Radio_UseTexture.Enabled := (FilterConnector.LazPaintInstance.ToolManager.GetTexture <> nil);
+  if Radio_UseTexture.Enabled then Radio_UseTexture.Checked := true
+  else Radio_UsePenColor.Checked := true;
+  SpinEdit_Altitude.Value := FilterConnector.LazPaintInstance.Config.DefaultPhongFilterAltitude;
+  with FilterConnector.LazPaintInstance.ToolManager.LightPosition do
+    FCenter := PointF(X/FilterConnector.LazPaintInstance.Image.Width,
+        Y/FilterConnector.LazPaintInstance.Image.Height);
+  if Assigned(FilterConnector.Parameters) then
+  with FilterConnector.Parameters do
+  begin
+    if IsDefined('ColorSource') then
+    case Strings['ColorSource'] of
+    'Pen': Radio_UsePenColor.checked := true;
+    'Back': Radio_UseBackColor.checked := true;
+    'Layer': Radio_UseKeep.checked := true;
+    end;
+    if IsDefined('AltitudePercent') then
+      SpinEdit_Altitude.Value := Integers['AltitudePercent'];
+    if IsDefined('LightXPercent') then
+      FCenter.x := Floats['LightXPercent']/100;
+    if IsDefined('LightYPercent') then
+      FCenter.y := Floats['LightYPercent']/100;
+    if IsDefined('AltitudeSource') then
+    case Strings['AltitudeSource'] of
+    'Lightness': Radio_MapLightness.Checked:= true;
+    'LinearLightness': Radio_MapLinearLightness.Checked:= true;
+    'Saturation': Radio_MapSaturation.Checked:= true;
+    'Alpha': Radio_MapAlpha.Checked:= true;
+    'Red': Radio_MapRed.Checked:= true;
+    'Green': Radio_MapGreen.Checked:= true;
+    'Blue': Radio_MapBlue.Checked:= true;
+    end;
+  end;
+  SpinEdit_AltitudeChange(nil);
+  FInitializing := false;
+end;
+
 procedure ScanLineMapLightness(psrc,pdest: PBGRAPixel; count: integer);
 const oneOver65535 = 1/65535;
 begin

+ 3 - 16
lazpaint/ufilters.pas

@@ -142,21 +142,6 @@ var
     else result := AInstance.ShowSharpenDlg(FilterConnector);
   end;
 
-  procedure DoEmboss;
-  var
-    angle: Double;
-  begin
-    if GetSkip then
-    begin
-      if AParameters.IsDefined('Angle') then
-        angle := AParameters.Floats['Angle']
-      else angle := AInstance.Config.DefaultEmbossAngle;
-      filteredLayer := FilterConnector.ActiveLayer.FilterEmboss(angle, FilterConnector.WorkArea) as TBGRABitmap
-    end
-    else
-      result := AInstance.ShowEmbossDlg(FilterConnector);
-  end;
-
 var
   layer: TBGRABitmap;
   applyOfsBefore: Boolean;
@@ -166,6 +151,8 @@ begin
   if filter = pfNone then exit(srInvalidParameters);
   if not AInstance.Image.CheckNoAction then exit;
   if not AInstance.image.CheckCurrentLayerVisible then exit;
+  if skipDialog then AParameters.Booleans['Validate'] := true;
+
   if (filter = pfLinearNegative) and AInstance.Image.SelectionMaskEmpty and (AInstance.Image.NbLayers = 1) then
   begin
       AInstance.Image.LinearNegativeAll;
@@ -212,7 +199,7 @@ begin
     pfBlurPrecise, pfBlurRadial, pfBlurCorona, pfBlurDisk, pfBlurFast, pfBlurBox: DoSimpleBlur;
     pfBlurMotion: DoBlurMotion;
     pfBlurCustom: DoBlurCustom;
-    pfEmboss: DoEmboss;
+    pfEmboss: result := AInstance.ShowEmbossDlg(FilterConnector);
     pfRain: result := AInstance.ShowRainDlg(FilterConnector);
     pfPhong: result := AInstance.ShowPhongFilterDlg(FilterConnector);
     pfFunction: result := AInstance.ShowFunctionFilterDlg(FilterConnector);

+ 17 - 2
lazpaintscripts/lazpaint/filter.py

@@ -54,6 +54,18 @@ PIXELATE_QUALITY_MITCHELL = 'Mitchell'
 PIXELATE_QUALITY_SPLINE = 'Spline'
 PIXELATE_QUALITY_BEST = PIXELATE_QUALITY_MITCHELL
 
+PHONG_COLOR_LAYER = 'Layer'
+PHONG_COLOR_PEN = 'Pen'
+PHONG_COLOR_BACK = 'Back'
+
+PHONG_ALTITUDE_LIGHTNESS = 'Lightness'
+PHONG_ALTITUDE_LINEAR_LIGHTNESS = 'LinearLightness'
+PHONG_ALTITUDE_SATURATION = 'Saturation'
+PHONG_ALTITUDE_ALPHA_CHANNEL = 'Alpha'
+PHONG_ALTITUDE_RED_CHANNEL = 'Red'
+PHONG_ALTITUDE_GREEN_CHANNEL = 'Green'
+PHONG_ALTITUDE_BLUE_CHANNEL = 'Blue'
+
 def run(name, validate=True):
   command.send("Filter", Name=name, Validate=validate)
 
@@ -75,8 +87,8 @@ def pixelate(pixel_size=None, quality=None, validate=True):
 def filter_function(red=None, green=None, blue=None, alpha=None, hue=None, saturation=None, lightness=None, validate=True):
   command.send("Filter", Name=FILTER_FUNCTION, Red=red, Green=green, Blue=blue, Alpha=alpha, Hue=hue, Saturation=saturation, Lightness=lightness, Validate=validate)
 
-def emboss(angle=None, validate=True):
-  command.send("Filter", Name=EMBOSS, Angle=angle, Validate=validate)
+def emboss(angle=None, transparent=None, preserve_colors=None, validate=True):
+  command.send("Filter", Name=EMBOSS, Angle=angle, Transparent=transparent, PreserveColors=preserve_colors, Validate=validate)
 
 def rain(amount=None, wind=None, validate=True):
   command.send("Filter", Name=RAIN, Amount=amount, Wind=wind, Validate=validate)
@@ -84,3 +96,6 @@ def rain(amount=None, wind=None, validate=True):
 def posterize(levels=None, by_lightness=None, validate=True):
   command.send("Filter", Name=POSTERIZE, Levels=levels, ByLightness=by_lightness, Validate=validate)
 
+def phong(color_source=None, altitude_percent=None, altitude_source=None, light_x_percent=None, light_y_percent=None, validate=True):
+  command.send("Filter", Name=PHONG, ColorSource=color_source, AltitudePercent=altitude_percent, AltitudeSource=altitude_source, LightXPercent=light_x_percent, LightYPercent=light_y_percent, Validate=validate)
+

+ 5 - 3
lazpaintscripts/test_filter.py

@@ -1,6 +1,8 @@
-from lazpaint import filter
+from lazpaint import filter, image
 
 filter.filter_function(green="green*2")
-filter.noise(grayscale=True, opacity=128)
-filter.pixelate(20, filter.PIXELATE_QUALITY_BEST)
+#filter.phong(color_source=filter.PHONG_COLOR_LAYER, light_x_percent=20, light_y_percent=20, altitude_percent=30, altitude_source=filter.PHONG_ALTITUDE_ALPHA_CHANNEL)
+filter.emboss(angle=45, transparent=False, preserve_colors=True)
+#filter.noise(grayscale=True, opacity=128)
+#filter.pixelate(20, filter.PIXELATE_QUALITY_BEST)