ufilters.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit UFilters;
  3. {$mode objfpc}
  4. interface
  5. uses
  6. Classes, SysUtils, LazPaintType, uscripting;
  7. function ExecuteFilter(AInstance: TLazPaintCustomInstance; filter: TPictureFilter;
  8. AParameters: TVariableSet; skipDialog: boolean = false; defaultCaption: string = ''): TScriptResult;
  9. implementation
  10. uses UFilterConnector, BGRABitmap, BGRABitmapTypes, UGraph, BGRAGradients, Dialogs, UColorFilters;
  11. function ExecuteFilter(AInstance: TLazPaintCustomInstance; filter: TPictureFilter;
  12. AParameters: TVariableSet; skipDialog: boolean = false; defaultCaption: string = ''): TScriptResult;
  13. var
  14. FilterConnector: TFilterConnector;
  15. filteredLayer: TBGRABitmap;
  16. function GetCaption: string;
  17. begin
  18. result := Trim(AParameters.Strings['Caption']);
  19. if result = '' then result := defaultCaption;
  20. end;
  21. function GetSkip: boolean;
  22. begin
  23. result := skipDialog or AParameters.Booleans['Validate'];
  24. end;
  25. procedure DoBlurCustom;
  26. var
  27. blurMask,blurMaskCopy: TBGRABitmap;
  28. begin
  29. if GetSkip and (AInstance.Config.DefaultCustomBlurMaskUTF8 <> '') then
  30. begin
  31. try
  32. blurMask := TBGRABitmap.Create(AInstance.Config.DefaultCustomBlurMaskUTF8,True);
  33. blurMaskCopy := blurMask.FilterGrayscale as TBGRABitmap;
  34. blurMask.Fill(BGRABlack);
  35. blurMask.PutImage(0,0,blurMaskCopy,dmDrawWithTransparency);
  36. blurMaskCopy.Free;
  37. filteredLayer := FilterConnector.ActiveLayer.FilterCustomBlur(FilterConnector.WorkArea, blurMask) as TBGRABitmap;
  38. blurMask.Free;
  39. except
  40. on ex: exception do
  41. AInstance.ShowError(PictureFilterStr[filter],ex.Message);
  42. end;
  43. end
  44. else
  45. result := AInstance.ShowCustomBlurDlg(FilterConnector);
  46. end;
  47. procedure DoSimpleBlur;
  48. var
  49. blurType: TRadialBlurType;
  50. radiusX,radiusY: single;
  51. begin
  52. case filter of
  53. pfBlurPrecise: blurType := rbPrecise;
  54. pfBlurRadial: blurType := rbNormal;
  55. pfBlurCorona: blurType := rbCorona;
  56. pfBlurDisk: blurType := rbDisk;
  57. pfBlurFast: blurType := rbFast;
  58. pfBlurBox: blurType := rbBox;
  59. else
  60. exit;
  61. end;
  62. if GetSkip then
  63. begin
  64. if AParameters.IsDefined('Radius') then
  65. begin
  66. radiusX := AParameters.Floats['Radius'];
  67. radiusY := radiusX;
  68. end else
  69. begin
  70. if AParameters.IsDefined('RadiusX') then
  71. radiusX := AParameters.Floats['RadiusX']
  72. else radiusX := AInstance.Config.DefaultBlurRadius;
  73. if AParameters.IsDefined('RadiusY') then
  74. radiusY := AParameters.Floats['RadiusY']
  75. else radiusY := AInstance.Config.DefaultBlurRadius;
  76. end;
  77. filteredLayer := FilterConnector.ActiveLayer.FilterBlurRadial(FilterConnector.WorkArea, radiusX,radiusY,blurType) as TBGRABitmap
  78. end
  79. else
  80. result := AInstance.ShowRadialBlurDlg(FilterConnector, blurType, GetCaption);
  81. end;
  82. procedure DoMetalFloor;
  83. var temp: TBGRABitmap;
  84. begin
  85. temp := CreateMetalFloorTexture(100);
  86. filteredLayer := temp.GetPart(rect(0,0,FilterConnector.ActiveLayer.Width,FilterConnector.ActiveLayer.Height)) as TBGRABitmap;
  87. temp.Free;
  88. end;
  89. var
  90. layer: TBGRABitmap;
  91. applyOfsBefore: Boolean;
  92. begin
  93. result := srException;
  94. if filter = pfNone then exit(srInvalidParameters);
  95. if not AInstance.Image.CheckNoAction then exit;
  96. if not AInstance.image.CheckCurrentLayerVisible then exit;
  97. if skipDialog then AParameters.Booleans['Validate'] := true;
  98. if (filter = pfLinearNegative) and AInstance.Image.SelectionMaskEmpty and (AInstance.Image.NbLayers = 1) then
  99. begin
  100. AInstance.Image.LinearNegativeAll;
  101. result := srOk;
  102. exit;
  103. end;
  104. applyOfsBefore:= false;
  105. if not (filter in[pfSharpen, pfSmooth, pfClearType, pfClearTypeInverse, pfNormalize, pfMedian,
  106. pfNegative, pfLinearNegative, pfComplementaryColor, pfGrayscale]) then
  107. if AInstance.Image.SelectionLayerIsEmpty then
  108. applyOfsBefore := true;
  109. try
  110. FilterConnector := TFilterConnector.Create(AInstance, AParameters, applyOfsBefore);
  111. layer := FilterConnector.ActiveLayer;
  112. filteredLayer := nil;
  113. case filter of
  114. pfSharpen: result := AInstance.ShowSharpenDlg(FilterConnector);
  115. pfSmooth: filteredLayer := layer.FilterSmooth as TBGRABitmap;
  116. pfClearTypeInverse: filteredLayer := ClearTypeInverseFilter(layer) as TBGRABitmap;
  117. pfClearType: filteredLayer := ClearTypeFilter(layer) as TBGRABitmap;
  118. pfSphere: filteredLayer := layer.FilterSphere as TBGRABitmap;
  119. pfPlane: filteredLayer := layer.FilterPlane as TBGRABitmap;
  120. pfCylinder: filteredLayer := layer.FilterCylinder as TBGRABitmap;
  121. pfNormalize: filteredLayer := layer.FilterNormalize(FilterConnector.WorkArea) as TBGRABitmap;
  122. pfMedian: filteredLayer := layer.FilterMedian(moLowSmooth) as TBGRABitmap;
  123. pfNegative:
  124. begin
  125. filteredLayer := layer.Duplicate as TBGRABitmap;
  126. filteredLayer.NegativeRect(FilterConnector.WorkArea);
  127. end;
  128. pfLinearNegative:
  129. begin
  130. filteredLayer := layer.Duplicate as TBGRABitmap;
  131. filteredLayer.LinearNegativeRect(FilterConnector.WorkArea)
  132. end;
  133. pfComplementaryColor:
  134. begin
  135. filteredLayer := layer.Duplicate as TBGRABitmap;
  136. FilterComplementaryColor(filteredLayer,FilterConnector.WorkArea);
  137. end;
  138. pfBlurPrecise, pfBlurRadial, pfBlurCorona, pfBlurDisk, pfBlurFast, pfBlurBox: DoSimpleBlur;
  139. pfBlurMotion: result := AInstance.ShowMotionBlurDlg(FilterConnector);
  140. pfBlurCustom: DoBlurCustom;
  141. pfEmboss: result := AInstance.ShowEmbossDlg(FilterConnector);
  142. pfRain: result := AInstance.ShowRainDlg(FilterConnector);
  143. pfPhong: result := AInstance.ShowPhongFilterDlg(FilterConnector);
  144. pfFunction: result := AInstance.ShowFunctionFilterDlg(FilterConnector);
  145. pfNoise: result := AInstance.ShowNoiseFilterDlg(FilterConnector);
  146. pfPixelate: result := AInstance.ShowPixelateDlg(FilterConnector);
  147. pfTwirl: result := AInstance.ShowTwirlDlg(FilterConnector);
  148. pfWaveDisplacement: result := AInstance.ShowWaveDisplacementDlg(FilterConnector);
  149. pfContour: filteredLayer := layer.FilterContour as TBGRABitmap;
  150. pfGrayscale: filteredLayer := layer.FilterGrayscale(FilterConnector.WorkArea) as TBGRABitmap;
  151. pfPerlinNoise: filteredLayer := CreatePerlinNoiseMap(layer.Width,layer.Height,layer.Width/256,layer.Height/256,1,rfBestQuality);
  152. pfCyclicPerlinNoise: filteredLayer := CreateCyclicPerlinNoiseMap(layer.Width,layer.Height,layer.Width/256,layer.Height/256,1,rfBestQuality);
  153. pfClouds:
  154. begin
  155. filteredLayer := layer.Duplicate as TBGRABitmap;
  156. RenderCloudsOn(filteredLayer,AInstance.ToolManager.ForeColor);
  157. end;
  158. pfCustomWater:
  159. begin
  160. filteredLayer := layer.Duplicate as TBGRABitmap;
  161. RenderWaterOn(filteredLayer,AInstance.ToolManager.ForeColor,AInstance.ToolManager.BackColor);
  162. end;
  163. pfWater: filteredLayer := CreateWaterTexture(layer.Width,layer.Height);
  164. pfWood: filteredLayer := CreateWoodTexture(layer.Width,layer.Height);
  165. pfWoodVertical: filteredLayer := CreateVerticalWoodTexture(layer.Width,layer.Height);
  166. pfPlastik: filteredLayer := CreatePlastikTexture(layer.Width,layer.Height);
  167. pfMetalFloor: DoMetalFloor;
  168. pfCamouflage: filteredLayer := CreateCamouflageTexture(layer.Width,layer.Height);
  169. pfSnowPrint: filteredLayer := CreateSnowPrintTexture(layer.Width,layer.Height);
  170. pfStone: filteredLayer := CreateStoneTexture(layer.Width,layer.Height);
  171. pfRoundStone: filteredLayer := CreateRoundStoneTexture(layer.Width,layer.Height);
  172. pfMarble: filteredLayer := CreateMarbleTexture(layer.Width,layer.Height);
  173. end;
  174. if filteredLayer <> nil then
  175. begin
  176. if FilterConnector.ActionDone then
  177. filteredLayer.Free
  178. else
  179. begin
  180. FilterConnector.PutImage(filteredLayer,IsColoredFilter[filter],True);
  181. FilterConnector.ValidateAction;
  182. end;
  183. end;
  184. except
  185. on ex: Exception do
  186. AInstance.ShowError(PictureFilterStr[filter],ex.Message);
  187. end;
  188. if FilterConnector.ActionDone then
  189. result := srOk;
  190. FilterConnector.Free;
  191. end;
  192. end.