unoisefilter.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit unoisefilter;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  7. StdCtrls, Spin, ExtCtrls, BGRABitmap, BGRABitmapTypes, UFilterConnector,
  8. UScripting;
  9. type
  10. { TFNoiseFilter }
  11. TFNoiseFilter = class(TForm)
  12. Button_Cancel: TButton;
  13. Button_OK: TButton;
  14. Label_Opacity: TLabel;
  15. Panel1: TPanel;
  16. Panel2: TPanel;
  17. Panel3: TPanel;
  18. Radio_GrayscaleNoise: TRadioButton;
  19. Radio_RGBNoise: TRadioButton;
  20. SpinEdit_Alpha: TSpinEdit;
  21. procedure Button_OKClick(Sender: TObject);
  22. procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
  23. procedure FormDestroy(Sender: TObject);
  24. procedure FormHide(Sender: TObject);
  25. procedure Radio_NoiseChange(Sender: TObject);
  26. procedure FormCreate(Sender: TObject);
  27. procedure FormShow(Sender: TObject);
  28. procedure SpinEdit_AlphaChange(Sender: TObject);
  29. private
  30. { private declarations }
  31. FComputedLayer: TBGRABitmap;
  32. FClosing: boolean;
  33. procedure InitParams;
  34. public
  35. FInitializing: boolean;
  36. FFilterConnector: TFilterConnector;
  37. procedure ComputeFilteredLayer;
  38. procedure PreviewNeeded(ARecomputeRandom: boolean);
  39. end;
  40. function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
  41. implementation
  42. uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType;
  43. function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
  44. var
  45. FNoiseFilter: TFNoiseFilter;
  46. begin
  47. FNoiseFilter:= TFNoiseFilter.create(nil);
  48. FNoiseFilter.FFilterConnector := AFilterConnector as TFilterConnector;
  49. try
  50. if FNoiseFilter.FFilterConnector.ActiveLayer <> nil then
  51. begin
  52. if Assigned(FNoiseFilter.FFilterConnector.Parameters) and
  53. FNoiseFilter.FFilterConnector.Parameters.Booleans['Validate'] then
  54. begin
  55. FNoiseFilter.InitParams;
  56. FNoiseFilter.PreviewNeeded(true);
  57. FNoiseFilter.FFilterConnector.ValidateAction;
  58. result := srOk;
  59. end else
  60. begin
  61. if FNoiseFilter.showModal = mrOk then result := srOk
  62. else result := srCancelledByUser;
  63. end;
  64. end
  65. else
  66. result := srException;
  67. finally
  68. FNoiseFilter.free;
  69. end;
  70. end;
  71. {$R *.lfm}
  72. { TFNoiseFilter }
  73. procedure TFNoiseFilter.Button_OKClick(Sender: TObject);
  74. begin
  75. FFilterConnector.ValidateAction;
  76. ModalResult := mrOK;
  77. end;
  78. procedure TFNoiseFilter.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  79. begin
  80. FClosing := true;
  81. end;
  82. procedure TFNoiseFilter.FormDestroy(Sender: TObject);
  83. begin
  84. FreeAndNil(FComputedLayer);
  85. end;
  86. procedure TFNoiseFilter.FormHide(Sender: TObject);
  87. begin
  88. FreeAndNil(FComputedLayer);
  89. end;
  90. procedure TFNoiseFilter.Radio_NoiseChange(Sender: TObject);
  91. begin
  92. if FInitializing then exit;
  93. PreviewNeeded(true);
  94. end;
  95. procedure TFNoiseFilter.FormCreate(Sender: TObject);
  96. begin
  97. ScaleControl(Self,OriginalDPI);
  98. CheckOKCancelBtns(Button_OK{,Button_Cancel});
  99. CheckSpinEdit(SpinEdit_Alpha);
  100. end;
  101. procedure TFNoiseFilter.FormShow(Sender: TObject);
  102. begin
  103. FInitializing := true;
  104. FClosing := false;
  105. Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
  106. FInitializing := false;
  107. InitParams;
  108. PreviewNeeded(True);
  109. end;
  110. procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject);
  111. begin
  112. if FInitializing or FClosing then exit;
  113. if FComputedLayer = nil then ComputeFilteredLayer;
  114. FComputedLayer.AlphaFill(SpinEdit_Alpha.Value);
  115. PreviewNeeded(False);
  116. end;
  117. procedure TFNoiseFilter.InitParams;
  118. begin
  119. FInitializing:= true;
  120. if FFilterConnector.LazPaintInstance.BlackAndWhite then
  121. begin
  122. Radio_GrayscaleNoise.Checked := true;
  123. Radio_RGBNoise.Enabled := False;
  124. end else
  125. begin
  126. Radio_RGBNoise.Enabled := true;
  127. Radio_RGBNoise.Checked := true;
  128. end;
  129. if Assigned(FFilterConnector.Parameters) then
  130. with FFilterConnector.Parameters do
  131. begin
  132. if Booleans['Grayscale'] then Radio_GrayscaleNoise.Checked:= true;
  133. if IsDefined('Opacity') then SpinEdit_Alpha.Value := Integers['Opacity'];
  134. end;
  135. FInitializing:= false;
  136. end;
  137. procedure TFNoiseFilter.ComputeFilteredLayer;
  138. var scan: TBGRARandomScanner;
  139. begin
  140. scan := TBGRARandomScanner.Create(Radio_GrayscaleNoise.Checked, SpinEdit_Alpha.Value);
  141. if FComputedLayer = nil then
  142. FComputedLayer := TBGRABitmap.Create(FFilterConnector.ActiveLayer.Width,FFilterConnector.ActiveLayer.Height);
  143. FComputedLayer.FillRect(FFilterConnector.WorkArea,scan,dmSet);
  144. scan.Free;
  145. end;
  146. procedure TFNoiseFilter.PreviewNeeded(ARecomputeRandom: boolean);
  147. begin
  148. if ARecomputeRandom or (FComputedLayer = nil) then ComputeFilteredLayer;
  149. if SpinEdit_Alpha.Value <> 255 then
  150. begin
  151. FFilterConnector.RestoreBackup;
  152. FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmDrawWithTransparency);
  153. end else
  154. FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmSet);
  155. end;
  156. end.