1 // SPDX-License-Identifier: GPL-3.0-only
2 unit USharpen;
3 
4 {$mode objfpc}
5 
6 interface
7 
8 uses
9   Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
10   StdCtrls, Spin, ExtCtrls, UFilterConnector, UScripting;
11 
12 type
13   TSharpenMode = (smSharpen);
14 
15   { TFSharpen }
16 
17   TFSharpen = class(TForm)
18     Button_Cancel: TButton;
19     Button_OK: TButton;
20     Label_Amount: TLabel;
21     Panel1: TPanel;
22     Panel2: TPanel;
23     SpinEdit_Amount: TSpinEdit;
24     procedure Button_OKClick(Sender: TObject);
25     procedure FormCreate(Sender: TObject);
26     procedure FormShow(Sender: TObject);
27     procedure SpinEdit_AmountChange(Sender: TObject);
28   protected
29     procedure OnTryStopAction({%H-}sender: TFilterConnector);
30   private
31     { private declarations }
32     FMode :TSharpenMode;
33     FInitializing: boolean;
34     FFilterConnector: TFilterConnector;
35     procedure InitParams;
36     procedure PreviewNeeded;
37   end;
38 
ShowSharpenDlgnull39 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
40 
41 implementation
42 
43 uses LCScaleDPI, UMac, LazPaintType, BGRABitmap, BGRABitmapTypes;
44 
ShowSharpenDlgnull45 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
46 var FSharpen: TFSharpen;
47 begin
48   FSharpen := TFSharpen.Create(nil);
49   FSharpen.FMode := AMode;
50   try
51     FSharpen.FFilterConnector := AFilterConnector as TFilterConnector;
52     FSharpen.FFilterConnector.OnTryStopAction := @FSharpen.OnTryStopAction;
53   except
54     on ex: exception do
55     begin
56       (AFilterConnector as TFilterConnector).LazPaintInstance.ShowError('ShowSharpenDlg',ex.Message);
57       result := srException;
58       exit;
59     end;
60   end;
61   try
62     if Assigned(FSharpen.FFilterConnector.Parameters) and
63       FSharpen.FFilterConnector.Parameters.Booleans['Validate'] then
64     begin
65       FSharpen.InitParams;
66       FSharpen.PreviewNeeded;
67       FSharpen.FFilterConnector.ValidateAction;
68       result := srOk;
69     end else
70     begin
71       if FSharpen.ShowModal = mrOK then
72         result := srOk else result := srCancelledByUser;
73     end;
74   finally
75     FSharpen.FFilterConnector.OnTryStopAction := nil;
76     FSharpen.Free;
77   end;
78 end;
79 
80 { TFSharpen }
81 
82 procedure TFSharpen.FormCreate(Sender: TObject);
83 begin
84   ScaleControl(Self,OriginalDPI);
85 
86   CheckOKCancelBtns(Button_OK{,Button_Cancel});
87   CheckSpinEdit(SpinEdit_Amount);
88   FMode := smSharpen;
89 end;
90 
91 procedure TFSharpen.FormShow(Sender: TObject);
92 var idxSlash: integer;
93 begin
94   InitParams;
95   PreviewNeeded;
96   idxSlash:= Pos('/',Caption);
97   if idxSlash <> 0 then
98   begin
99     if FMode = smSharpen then Caption := Trim(copy(Caption,1,idxSlash-1)) else
100         Caption := Trim(Copy(Caption,idxSlash+1,length(Caption)-idxSlash));
101   end;
102   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
103 end;
104 
105 procedure TFSharpen.SpinEdit_AmountChange(Sender: TObject);
106 begin
107   if not FInitializing then PreviewNeeded;
108 end;
109 
110 procedure TFSharpen.Button_OKClick(Sender: TObject);
111 begin
112   FFilterConnector.ValidateAction;
113   FFilterConnector.LazPaintInstance.Config.SetDefaultSharpenAmount(SpinEdit_Amount.Value/100);
114   ModalResult := mrOK;
115 end;
116 
117 procedure TFSharpen.OnTryStopAction(sender: TFilterConnector);
118 begin
119   if self.visible then Close;
120 end;
121 
122 procedure TFSharpen.InitParams;
123 begin
124   FInitializing := true;
125   if Assigned(FFilterConnector.Parameters) and FFilterConnector.Parameters.IsDefined('Amount') then
126     SpinEdit_Amount.Value := round(FFilterConnector.Parameters.Floats['Amount']*100)
127   else
128      SpinEdit_Amount.Value := round(FFilterConnector.LazPaintInstance.Config.DefaultSharpenAmount*100);
129   FInitializing := false;
130 end;
131 
132 procedure TFSharpen.PreviewNeeded;
133 var filtered: TBGRABitmap;
134 begin
135   if FMode = smSharpen then
136   begin
137     filtered := FFilterConnector.BackupLayer.FilterSharpen(FFilterConnector.WorkArea,SpinEdit_Amount.Value/100) as TBGRABitmap;
138     FFilterConnector.PutImage(filtered,False,True);
139   end;
140 end;
141 
142 {$R *.lfm}
143 
144 end.
145 
146