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