Browse Source

Merge branch 'dev-lazpaint' into master

circular17 1 year ago
parent
commit
45a7a471d5
100 changed files with 3606 additions and 4238 deletions
  1. 27 18
      lazpaint/dialog/color/uadjustcurves.lfm
  2. 3 2
      lazpaint/dialog/color/uadjustcurves.lrj
  3. 50 1
      lazpaint/dialog/color/uadjustcurves.pas
  4. 22 15
      lazpaint/dialog/color/ucolorintensity.lfm
  5. 3 2
      lazpaint/dialog/color/ucolorintensity.lrj
  6. 20 0
      lazpaint/dialog/color/ucolorintensity.pas
  7. 31 24
      lazpaint/dialog/color/ucolorize.lfm
  8. 4 3
      lazpaint/dialog/color/ucolorize.lrj
  9. 21 0
      lazpaint/dialog/color/ucolorize.pas
  10. 121 113
      lazpaint/dialog/color/ushiftcolors.lfm
  11. 4 3
      lazpaint/dialog/color/ushiftcolors.lrj
  12. 60 6
      lazpaint/dialog/color/ushiftcolors.pas
  13. 24 13
      lazpaint/dialog/filter/ucustomblur.lfm
  14. 3 2
      lazpaint/dialog/filter/ucustomblur.lrj
  15. 57 1
      lazpaint/dialog/filter/ucustomblur.pas
  16. 33 22
      lazpaint/dialog/filter/uemboss.lfm
  17. 3 2
      lazpaint/dialog/filter/uemboss.lrj
  18. 26 8
      lazpaint/dialog/filter/uemboss.pas
  19. 138 125
      lazpaint/dialog/filter/ufilterfunction.lfm
  20. 4 3
      lazpaint/dialog/filter/ufilterfunction.lrj
  21. 43 6
      lazpaint/dialog/filter/ufilterfunction.pas
  22. 28 27
      lazpaint/dialog/filter/uformrain.lfm
  23. 2 2
      lazpaint/dialog/filter/uformrain.lrj
  24. 11 1
      lazpaint/dialog/filter/uformrain.pas
  25. 102 0
      lazpaint/dialog/filter/uhypocycloid.lfm
  26. 6 0
      lazpaint/dialog/filter/uhypocycloid.lrj
  27. 335 0
      lazpaint/dialog/filter/uhypocycloid.pas
  28. 29 18
      lazpaint/dialog/filter/umotionblur.lfm
  29. 3 2
      lazpaint/dialog/filter/umotionblur.lrj
  30. 61 3
      lazpaint/dialog/filter/umotionblur.pas
  31. 44 33
      lazpaint/dialog/filter/unoisefilter.lfm
  32. 3 2
      lazpaint/dialog/filter/unoisefilter.lrj
  33. 38 13
      lazpaint/dialog/filter/unoisefilter.pas
  34. 23 12
      lazpaint/dialog/filter/uphongfilter.lfm
  35. 4 3
      lazpaint/dialog/filter/uphongfilter.lrj
  36. 28 3
      lazpaint/dialog/filter/uphongfilter.pas
  37. 22 11
      lazpaint/dialog/filter/upixelate.lfm
  38. 3 2
      lazpaint/dialog/filter/upixelate.lrj
  39. 22 2
      lazpaint/dialog/filter/upixelate.pas
  40. 25 14
      lazpaint/dialog/filter/uposterize.lfm
  41. 3 2
      lazpaint/dialog/filter/uposterize.lrj
  42. 27 7
      lazpaint/dialog/filter/uposterize.pas
  43. 37 25
      lazpaint/dialog/filter/uradialblur.lfm
  44. 3 2
      lazpaint/dialog/filter/uradialblur.lrj
  45. 57 3
      lazpaint/dialog/filter/uradialblur.pas
  46. 24 13
      lazpaint/dialog/filter/usharpen.lfm
  47. 3 2
      lazpaint/dialog/filter/usharpen.lrj
  48. 26 6
      lazpaint/dialog/filter/usharpen.pas
  49. 61 51
      lazpaint/dialog/filter/utwirl.lfm
  50. 3 2
      lazpaint/dialog/filter/utwirl.lrj
  51. 32 2
      lazpaint/dialog/filter/utwirl.pas
  52. 73 62
      lazpaint/dialog/filter/uwavedisplacement.lfm
  53. 3 2
      lazpaint/dialog/filter/uwavedisplacement.lrj
  54. 32 2
      lazpaint/dialog/filter/uwavedisplacement.pas
  55. 18 1
      lazpaint/dialog/uchoosecolorinterface.pas
  56. 27 6
      lazpaint/image/uimage.pas
  57. 6 1
      lazpaint/image/uimagediff.pas
  58. 27 0
      lazpaint/image/ustatetype.pas
  59. 14 2
      lazpaint/lazpaint.lpi
  60. 1 1
      lazpaint/lazpaint.lpr
  61. 12 0
      lazpaint/lazpaintdialogs.inc
  62. 46 5
      lazpaint/lazpaintinstance.pas
  63. 28 1
      lazpaint/lazpaintmainform.lfm
  64. 335 334
      lazpaint/lazpaintmainform.lrj
  65. 8 6
      lazpaint/lazpaintmainform.pas
  66. 14 5
      lazpaint/lazpainttype.pas
  67. 18 6
      lazpaint/maintoolbar.inc
  68. 24 170
      lazpaint/release/bin/i18n/lazpaint.ar.po
  69. 25 170
      lazpaint/release/bin/i18n/lazpaint.bg.po
  70. 26 170
      lazpaint/release/bin/i18n/lazpaint.cs.po
  71. 25 170
      lazpaint/release/bin/i18n/lazpaint.de.po
  72. 26 170
      lazpaint/release/bin/i18n/lazpaint.es.po
  73. 23 170
      lazpaint/release/bin/i18n/lazpaint.fi.po
  74. 29 171
      lazpaint/release/bin/i18n/lazpaint.fr.po
  75. 24 170
      lazpaint/release/bin/i18n/lazpaint.it.po
  76. 24 170
      lazpaint/release/bin/i18n/lazpaint.ja.po
  77. 25 170
      lazpaint/release/bin/i18n/lazpaint.kab.po
  78. 25 170
      lazpaint/release/bin/i18n/lazpaint.lv.po
  79. 34 191
      lazpaint/release/bin/i18n/lazpaint.nl.po
  80. 25 170
      lazpaint/release/bin/i18n/lazpaint.pl.po
  81. 23 170
      lazpaint/release/bin/i18n/lazpaint.pot
  82. 25 178
      lazpaint/release/bin/i18n/lazpaint.pt_BR.po
  83. 26 170
      lazpaint/release/bin/i18n/lazpaint.ru.po
  84. 25 170
      lazpaint/release/bin/i18n/lazpaint.sv.po
  85. 25 170
      lazpaint/release/bin/i18n/lazpaint.zh_CN.po
  86. 11 9
      lazpaint/uchoosecolor.lfm
  87. 28 1
      lazpaint/uchoosecolor.pas
  88. 27 0
      lazpaint/uconfig.pas
  89. 3 0
      lazpaint/ufilters.pas
  90. 1 1
      lazpaint/uimageview.pas
  91. 11 4
      lazpaint/umainformlayout.pas
  92. 2 2
      lazpaint/umenu.pas
  93. 214 45
      lazpaint/upalettetoolbar.pas
  94. 6 4
      lazpaint/uprocessauto.pas
  95. 375 10
      lazpaint/upython.pas
  96. 3 0
      lazpaint/uresourcestrings.pas
  97. 6 6
      lazpaint/uscripting.pas
  98. 13 0
      lazpaintcontrols/lcvectorialfillcontrol.pas
  99. 22 0
      lazpaintcontrols/lcvectorialfillinterface.pas
  100. 1 0
      lazpaintcontrols/lcvectororiginal.pas

+ 27 - 18
lazpaint/dialog/color/uadjustcurves.lfm

@@ -1,11 +1,11 @@
 object FAdjustCurves: TFAdjustCurves
 object FAdjustCurves: TFAdjustCurves
   Left = 439
   Left = 439
-  Height = 326
+  Height = 345
   Top = 193
   Top = 193
   Width = 432
   Width = 432
   BorderIcons = [biSystemMenu, biMinimize]
   BorderIcons = [biSystemMenu, biMinimize]
   Caption = 'Adjust curves'
   Caption = 'Adjust curves'
-  ClientHeight = 326
+  ClientHeight = 345
   ClientWidth = 432
   ClientWidth = 432
   KeyPreview = True
   KeyPreview = True
   OnCloseQuery = FormCloseQuery
   OnCloseQuery = FormCloseQuery
@@ -15,7 +15,7 @@ object FAdjustCurves: TFAdjustCurves
   OnKeyDown = FormKeyDown
   OnKeyDown = FormKeyDown
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.8.2.0'
+  LCLVersion = '2.2.4.0'
   object TabControl1: TTabControl
   object TabControl1: TTabControl
     Left = 0
     Left = 0
     Height = 289
     Height = 289
@@ -33,12 +33,11 @@ object FAdjustCurves: TFAdjustCurves
       'Alpha'
       'Alpha'
     )
     )
     Align = alClient
     Align = alClient
-    Anchors = [akLeft, akTop, akRight, akBottom]
     TabOrder = 0
     TabOrder = 0
     object vsChart: TBGRAVirtualScreen
     object vsChart: TBGRAVirtualScreen
       Left = 2
       Left = 2
-      Height = 230
-      Top = 57
+      Height = 239
+      Top = 48
       Width = 428
       Width = 428
       OnRedraw = vsChartRedraw
       OnRedraw = vsChartRedraw
       Align = alClient
       Align = alClient
@@ -53,7 +52,7 @@ object FAdjustCurves: TFAdjustCurves
     object Panel2: TPanel
     object Panel2: TPanel
       Left = 2
       Left = 2
       Height = 25
       Height = 25
-      Top = 32
+      Top = 23
       Width = 428
       Width = 428
       Align = alTop
       Align = alTop
       ClientHeight = 25
       ClientHeight = 25
@@ -65,7 +64,6 @@ object FAdjustCurves: TFAdjustCurves
         Top = 0
         Top = 0
         Width = 90
         Width = 90
         Align = alNone
         Align = alNone
-        Anchors = [akTop, akLeft]
         EdgeBorders = []
         EdgeBorders = []
         Images = FMain.ImageList16
         Images = FMain.ImageList16
         ParentShowHint = False
         ParentShowHint = False
@@ -98,50 +96,61 @@ object FAdjustCurves: TFAdjustCurves
   end
   end
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 0
     Left = 0
-    Height = 37
+    Height = 56
     Top = 289
     Top = 289
     Width = 432
     Width = 432
     Align = alBottom
     Align = alBottom
     BevelOuter = bvNone
     BevelOuter = bvNone
-    ClientHeight = 37
+    ClientHeight = 56
     ClientWidth = 432
     ClientWidth = 432
     TabOrder = 1
     TabOrder = 1
     object Button_Cancel: TButton
     object Button_Cancel: TButton
       Left = 213
       Left = 213
       Height = 22
       Height = 22
-      Top = 7
+      Top = 26
       Width = 72
       Width = 72
       Anchors = [akLeft, akBottom]
       Anchors = [akLeft, akBottom]
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 149
       Left = 149
       Height = 22
       Height = 22
-      Top = 7
+      Top = 26
       Width = 59
       Width = 59
       Anchors = [akLeft, akBottom]
       Anchors = [akLeft, akBottom]
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       ModalResult = 1
       ModalResult = 1
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 1
       TabOrder = 1
     end
     end
+    object CheckBox_Preview: TCheckBox
+      Left = 8
+      Height = 19
+      Top = 0
+      Width = 70
+      Caption = 'rsPreview'
+      Checked = True
+      OnChange = CheckBox_PreviewChange
+      State = cbChecked
+      TabOrder = 2
+    end
   end
   end
   object Timer_Thread: TTimer
   object Timer_Thread: TTimer
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer_ThreadTimer
     OnTimer = Timer_ThreadTimer
-    left = 62
-    top = 466
+    Left = 62
+    Top = 466
   end
   end
   object Timer_Chart: TTimer
   object Timer_Chart: TTimer
     Enabled = False
     Enabled = False
     Interval = 20
     Interval = 20
     OnTimer = Timer_ChartTimer
     OnTimer = Timer_ChartTimer
-    left = 123
-    top = 467
+    Left = 123
+    Top = 467
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/color/uadjustcurves.lrj

@@ -3,6 +3,7 @@
 {"hash":26714085,"name":"tfadjustcurves.toolbutton_newcurve.hint","sourcebytes":[68,105,115,99,97,114,100,32,99,117,114,114,101,110,116,32,99,117,114,118,101,32,97,110,100,32,115,116,97,114,116,32,97,32,110,101,119,32,111,110,101],"value":"Discard current curve and start a new one"},
 {"hash":26714085,"name":"tfadjustcurves.toolbutton_newcurve.hint","sourcebytes":[68,105,115,99,97,114,100,32,99,117,114,114,101,110,116,32,99,117,114,118,101,32,97,110,100,32,115,116,97,114,116,32,97,32,110,101,119,32,111,110,101],"value":"Discard current curve and start a new one"},
 {"hash":1994857,"name":"tfadjustcurves.toolbutton_removepoint.hint","sourcebytes":[82,101,109,111,118,101,32,115,101,108,101,99,116,101,100,32,112,111,105,110,116,32,40,68,101,108,41],"value":"Remove selected point (Del)"},
 {"hash":1994857,"name":"tfadjustcurves.toolbutton_removepoint.hint","sourcebytes":[82,101,109,111,118,101,32,115,101,108,101,99,116,101,100,32,112,111,105,110,116,32,40,68,101,108,41],"value":"Remove selected point (Del)"},
 {"hash":179103845,"name":"tfadjustcurves.toolbutton_posterize.hint","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"},
 {"hash":179103845,"name":"tfadjustcurves.toolbutton_posterize.hint","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"},
-{"hash":77089212,"name":"tfadjustcurves.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
-{"hash":1339,"name":"tfadjustcurves.button_ok.caption","sourcebytes":[79,75],"value":"OK"}
+{"hash":127421996,"name":"tfadjustcurves.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
+{"hash":497723,"name":"tfadjustcurves.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":126662215,"name":"tfadjustcurves.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 50 - 1
lazpaint/dialog/color/uadjustcurves.pas

@@ -25,6 +25,7 @@ type
   { TFAdjustCurves }
   { TFAdjustCurves }
 
 
   TFAdjustCurves = class(TForm)
   TFAdjustCurves = class(TForm)
+    CheckBox_Preview: TCheckBox;
     Panel2: TPanel;
     Panel2: TPanel;
     Timer_Chart: TTimer;
     Timer_Chart: TTimer;
     Timer_Thread: TTimer;
     Timer_Thread: TTimer;
@@ -38,6 +39,7 @@ type
     Panel1: TPanel;
     Panel1: TPanel;
     TabControl1: TTabControl;
     TabControl1: TTabControl;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormHide(Sender: TObject);
     procedure FormHide(Sender: TObject);
@@ -104,6 +106,11 @@ type
     procedure DiscardHistogram;
     procedure DiscardHistogram;
     procedure QueryHistogramRedraw;
     procedure QueryHistogramRedraw;
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
+  private
+    FInitializingGui: boolean;
+    FComputedImage: TBGRABitmap;
+    procedure DisplayComputedImage;
+    procedure StoreComputedImage;
   public
   public
     { public declarations }
     { public declarations }
     function ShowModal: integer; override;
     function ShowModal: integer; override;
@@ -336,6 +343,13 @@ procedure TFAdjustCurves.FormShow(Sender: TObject);
 begin
 begin
   vsChart.DiscardBitmap;
   vsChart.DiscardBitmap;
   DiscardHistogram;
   DiscardHistogram;
+
+  FInitializingGui := True;
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
+  CheckBox_Preview.Caption := rsPreview;
+  CheckBox_Preview.Checked := True;
+  FInitializingGui := False;
 end;
 end;
 
 
 procedure TFAdjustCurves.TabControl1Change(Sender: TObject);
 procedure TFAdjustCurves.TabControl1Change(Sender: TObject);
@@ -428,14 +442,29 @@ procedure TFAdjustCurves.FormDestroy(Sender: TObject);
 begin
 begin
   FreeAndNil(FGraphBackgroundLeft);
   FreeAndNil(FGraphBackgroundLeft);
   FreeAndNil(FGraphBackgroundBottom);
   FreeAndNil(FGraphBackgroundBottom);
+  FreeAndNil(FComputedImage);
 end;
 end;
 
 
 procedure TFAdjustCurves.Button_OKClick(Sender: TObject);
 procedure TFAdjustCurves.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction;
   if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction;
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFAdjustCurves.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializingGui then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+  begin
+    StoreComputedImage;
+    FFilterConnector.RestoreBackup;
+  end;
+end;
+
 procedure TFAdjustCurves.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 procedure TFAdjustCurves.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 begin
 begin
   FThreadManager.Quit;
   FThreadManager.Quit;
@@ -947,7 +976,10 @@ begin
       if FThreadManager.ReadyToClose then
       if FThreadManager.ReadyToClose then
         Close
         Close
       else
       else
-        if AEvent = tmeCompletedTask then Button_OK.Enabled := true;
+        if AEvent = tmeCompletedTask then begin
+          Button_OK.Enabled := true;
+          CheckBox_Preview.Enabled := true;
+        end;
     end;
     end;
   tmeStartingNewTask:
   tmeStartingNewTask:
     begin
     begin
@@ -955,10 +987,27 @@ begin
       Timer_Thread.Interval := 100;
       Timer_Thread.Interval := 100;
       Timer_Thread.Enabled := true;
       Timer_Thread.Enabled := true;
       Button_OK.Enabled := false;
       Button_OK.Enabled := false;
+      FInitializingGui := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FreeAndNil(FComputedImage);
+      FInitializingGui := False;
     end;
     end;
   end;
   end;
 end;
 end;
 
 
+procedure TFAdjustCurves.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage, false, false);
+end;
+
+procedure TFAdjustCurves.StoreComputedImage;
+begin
+  if FComputedImage = nil then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 function TFAdjustCurves.ShowModal: integer;
 function TFAdjustCurves.ShowModal: integer;
 begin
 begin
   if (FFilterConnector = nil) or (FFilterConnector.ActiveLayer = nil) then
   if (FFilterConnector = nil) or (FFilterConnector.ActiveLayer = nil) then

+ 22 - 15
lazpaint/dialog/color/ucolorintensity.lfm

@@ -1,31 +1,31 @@
 object FColorIntensity: TFColorIntensity
 object FColorIntensity: TFColorIntensity
   Left = 405
   Left = 405
-  Height = 109
+  Height = 128
   Top = 187
   Top = 187
   Width = 472
   Width = 472
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = 'Intensity'
   Caption = 'Intensity'
-  ClientHeight = 109
+  ClientHeight = 128
   ClientWidth = 472
   ClientWidth = 472
   Font.Height = -12
   Font.Height = -12
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.0.10.0'
+  LCLVersion = '2.2.4.0'
   object Label_Multiply: TLabel
   object Label_Multiply: TLabel
     Left = 8
     Left = 8
-    Height = 16
+    Height = 15
     Top = 46
     Top = 46
-    Width = 45
+    Width = 44
     Caption = 'Multiply'
     Caption = 'Multiply'
     ParentColor = False
     ParentColor = False
   end
   end
   object Label_Shift: TLabel
   object Label_Shift: TLabel
     Left = 8
     Left = 8
-    Height = 16
+    Height = 15
     Top = 13
     Top = 13
-    Width = 25
+    Width = 24
     Caption = 'Shift'
     Caption = 'Shift'
     ParentColor = False
     ParentColor = False
   end
   end
@@ -50,9 +50,9 @@ object FColorIntensity: TFColorIntensity
   object Button_OK: TButton
   object Button_OK: TButton
     Left = 165
     Left = 165
     Height = 22
     Height = 22
-    Top = 80
+    Top = 96
     Width = 59
     Width = 59
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     Default = True
     ModalResult = 1
     ModalResult = 1
     OnClick = Button_OKClick
     OnClick = Button_OKClick
@@ -61,10 +61,10 @@ object FColorIntensity: TFColorIntensity
   object Button_Cancel: TButton
   object Button_Cancel: TButton
     Left = 229
     Left = 229
     Height = 22
     Height = 22
-    Top = 80
+    Top = 96
     Width = 72
     Width = 72
     Cancel = True
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     ModalResult = 2
     TabOrder = 3
     TabOrder = 3
   end
   end
@@ -74,12 +74,10 @@ object FColorIntensity: TFColorIntensity
     Top = 8
     Top = 8
     Width = 72
     Width = 72
     DecimalPlaces = 3
     DecimalPlaces = 3
-    Increment = 1
     MaxValue = 1
     MaxValue = 1
     MinValue = -1
     MinValue = -1
     OnChange = FloatSpinEdit_ShiftChange
     OnChange = FloatSpinEdit_ShiftChange
     TabOrder = 4
     TabOrder = 4
-    Value = 0
   end
   end
   object FloatSpinEdit_Factor: TFloatSpinEdit
   object FloatSpinEdit_Factor: TFloatSpinEdit
     Left = 392
     Left = 392
@@ -87,11 +85,20 @@ object FColorIntensity: TFColorIntensity
     Top = 43
     Top = 43
     Width = 72
     Width = 72
     DecimalPlaces = 3
     DecimalPlaces = 3
-    Increment = 1
     MaxValue = 2
     MaxValue = 2
     MinValue = -2
     MinValue = -2
     OnChange = FloatSpinEdit_FactorChange
     OnChange = FloatSpinEdit_FactorChange
     TabOrder = 5
     TabOrder = 5
-    Value = 0
+  end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 80
+    Width = 70
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 6
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/color/ucolorintensity.lrj

@@ -2,6 +2,7 @@
 {"hash":180736233,"name":"tfcolorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121],"value":"Intensity"},
 {"hash":180736233,"name":"tfcolorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121],"value":"Intensity"},
 {"hash":205194361,"name":"tfcolorintensity.label_multiply.caption","sourcebytes":[77,117,108,116,105,112,108,121],"value":"Multiply"},
 {"hash":205194361,"name":"tfcolorintensity.label_multiply.caption","sourcebytes":[77,117,108,116,105,112,108,121],"value":"Multiply"},
 {"hash":5894100,"name":"tfcolorintensity.label_shift.caption","sourcebytes":[83,104,105,102,116],"value":"Shift"},
 {"hash":5894100,"name":"tfcolorintensity.label_shift.caption","sourcebytes":[83,104,105,102,116],"value":"Shift"},
-{"hash":1339,"name":"tfcolorintensity.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfcolorintensity.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":497723,"name":"tfcolorintensity.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfcolorintensity.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
+{"hash":126662215,"name":"tfcolorintensity.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 20 - 0
lazpaint/dialog/color/ucolorintensity.pas

@@ -18,6 +18,7 @@ type
   TFColorIntensity = class(TForm)
   TFColorIntensity = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     FloatSpinEdit_Shift: TFloatSpinEdit;
     FloatSpinEdit_Shift: TFloatSpinEdit;
     FloatSpinEdit_Factor: TFloatSpinEdit;
     FloatSpinEdit_Factor: TFloatSpinEdit;
     Label_Multiply: TLabel;
     Label_Multiply: TLabel;
@@ -25,6 +26,7 @@ type
     TrackBar_Multiply: TTrackBar;
     TrackBar_Multiply: TTrackBar;
     TrackBar_Shift: TTrackBar;
     TrackBar_Shift: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FloatSpinEdit_FactorChange(Sender: TObject);
     procedure FloatSpinEdit_FactorChange(Sender: TObject);
     procedure FloatSpinEdit_ShiftChange(Sender: TObject);
     procedure FloatSpinEdit_ShiftChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
@@ -92,6 +94,15 @@ begin
   FFilterConnector.Parameters.Floats['Shift'] := FloatSpinEdit_Shift.Value;
   FFilterConnector.Parameters.Floats['Shift'] := FloatSpinEdit_Shift.Value;
 end;
 end;
 
 
+procedure TFColorIntensity.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if not FInitialized then exit;
+  if CheckBox_Preview.Checked then
+    ApplyChosenIntensity
+  else
+   FFilterConnector.RestoreBackup;
+end;
+
 procedure TFColorIntensity.FloatSpinEdit_FactorChange(Sender: TObject);
 procedure TFColorIntensity.FloatSpinEdit_FactorChange(Sender: TObject);
 begin
 begin
   FUpdatingSpinEdit := true;
   FUpdatingSpinEdit := true;
@@ -198,6 +209,11 @@ begin
     if FFilterConnector.Parameters.IsDefined('Shift') then
     if FFilterConnector.Parameters.IsDefined('Shift') then
       ChosenShift := FFilterConnector.Parameters.Floats['Shift'];
       ChosenShift := FFilterConnector.Parameters.Floats['Shift'];
     UpdateSpinEdit;
     UpdateSpinEdit;
+
+    Button_OK.Caption := rsOK;
+    Button_Cancel.Caption := rsCancel;
+    CheckBox_Preview.Caption := rsPreview;
+    CheckBox_Preview.Checked := True;
     FInitialized := OldInitialized;
     FInitialized := OldInitialized;
   end;
   end;
 end;
 end;
@@ -272,6 +288,10 @@ begin
     ciIntensity: FilterIntensity(FFilterConnector, ChosenFactor,ChosenShift);
     ciIntensity: FilterIntensity(FFilterConnector, ChosenFactor,ChosenShift);
     ciLightness: FilterLightness(FFilterConnector, ChosenFactor,ChosenShift);
     ciLightness: FilterLightness(FFilterConnector, ChosenFactor,ChosenShift);
   end;
   end;
+
+  FInitialized := False;
+  CheckBox_Preview.Checked := True;
+  FInitialized := True;
 end;
 end;
 
 
 {$R *.lfm}
 {$R *.lfm}

+ 31 - 24
lazpaint/dialog/color/ucolorize.lfm

@@ -1,23 +1,23 @@
 object FColorize: TFColorize
 object FColorize: TFColorize
   Left = 476
   Left = 476
-  Height = 174
+  Height = 193
   Top = 173
   Top = 173
   Width = 489
   Width = 489
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = 'Colorize'
   Caption = 'Colorize'
-  ClientHeight = 174
+  ClientHeight = 193
   ClientWidth = 489
   ClientWidth = 489
   Font.Height = -12
   Font.Height = -12
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Label_Hue: TLabel
   object Label_Hue: TLabel
     Left = 8
     Left = 8
     Height = 15
     Height = 15
     Top = 10
     Top = 10
-    Width = 24
+    Width = 22
     Caption = 'Hue'
     Caption = 'Hue'
     ParentColor = False
     ParentColor = False
   end
   end
@@ -25,7 +25,7 @@ object FColorize: TFColorize
     Left = 8
     Left = 8
     Height = 15
     Height = 15
     Top = 48
     Top = 48
-    Width = 57
+    Width = 52
     Caption = 'Colorness'
     Caption = 'Colorness'
     ParentColor = False
     ParentColor = False
   end
   end
@@ -50,10 +50,10 @@ object FColorize: TFColorize
   object Button_OK: TButton
   object Button_OK: TButton
     Left = 173
     Left = 173
     Height = 22
     Height = 22
-    Top = 143
+    Top = 162
     Width = 59
     Width = 59
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     Default = True
     ModalResult = 1
     ModalResult = 1
     OnClick = Button_OKClick
     OnClick = Button_OKClick
@@ -62,43 +62,39 @@ object FColorize: TFColorize
   object Button_Cancel: TButton
   object Button_Cancel: TButton
     Left = 237
     Left = 237
     Height = 22
     Height = 22
-    Top = 143
+    Top = 162
     Width = 72
     Width = 72
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
     Cancel = True
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     ModalResult = 2
     TabOrder = 3
     TabOrder = 3
   end
   end
   object FloatSpinEdit_Hue: TFloatSpinEdit
   object FloatSpinEdit_Hue: TFloatSpinEdit
     Left = 408
     Left = 408
-    Height = 27
+    Height = 23
     Top = 7
     Top = 7
     Width = 72
     Width = 72
     DecimalPlaces = 1
     DecimalPlaces = 1
     MaxValue = 360
     MaxValue = 360
-    MinValue = 0
     OnChange = FloatSpinEdit_HueChange
     OnChange = FloatSpinEdit_HueChange
     TabOrder = 4
     TabOrder = 4
-    Value = 0
   end
   end
   object FloatSpinEdit_Saturation: TFloatSpinEdit
   object FloatSpinEdit_Saturation: TFloatSpinEdit
     Left = 408
     Left = 408
-    Height = 27
+    Height = 23
     Top = 43
     Top = 43
     Width = 72
     Width = 72
     DecimalPlaces = 3
     DecimalPlaces = 3
     MaxValue = 1
     MaxValue = 1
-    MinValue = 0
     OnChange = FloatSpinEdit_SaturationChange
     OnChange = FloatSpinEdit_SaturationChange
     TabOrder = 5
     TabOrder = 5
-    Value = 0
   end
   end
   object CheckBox_GSBA: TCheckBox
   object CheckBox_GSBA: TCheckBox
     Left = 8
     Left = 8
-    Height = 23
+    Height = 19
     Top = 80
     Top = 80
-    Width = 197
+    Width = 168
     Caption = 'Corrected hue and lightness'
     Caption = 'Corrected hue and lightness'
     OnChange = CheckBox_GSBAChange
     OnChange = CheckBox_GSBAChange
     TabOrder = 6
     TabOrder = 6
@@ -117,8 +113,8 @@ object FColorize: TFColorize
     object Label_Preset: TLabel
     object Label_Preset: TLabel
       Left = 0
       Left = 0
       Height = 15
       Height = 15
-      Top = 7
-      Width = 37
+      Top = 4
+      Width = 32
       AutoSize = False
       AutoSize = False
       BorderSpacing.Right = 6
       BorderSpacing.Right = 6
       BorderSpacing.CellAlignVertical = ccaCenter
       BorderSpacing.CellAlignVertical = ccaCenter
@@ -126,21 +122,21 @@ object FColorize: TFColorize
       ParentColor = False
       ParentColor = False
     end
     end
     object Combo_Preset: TComboBox
     object Combo_Preset: TComboBox
-      Left = 43
-      Height = 29
+      Left = 38
+      Height = 23
       Top = 0
       Top = 0
       Width = 100
       Width = 100
       BorderSpacing.Right = 6
       BorderSpacing.Right = 6
       BorderSpacing.CellAlignVertical = ccaCenter
       BorderSpacing.CellAlignVertical = ccaCenter
-      ItemHeight = 0
+      ItemHeight = 15
       OnChange = Combo_PresetChange
       OnChange = Combo_PresetChange
       Style = csDropDownList
       Style = csDropDownList
       TabOrder = 0
       TabOrder = 0
     end
     end
     object ToolBar_AddRemove: TToolBar
     object ToolBar_AddRemove: TToolBar
-      Left = 149
+      Left = 144
       Height = 22
       Height = 22
-      Top = 3
+      Top = 0
       Width = 47
       Width = 47
       Align = alNone
       Align = alNone
       BorderSpacing.CellAlignVertical = ccaCenter
       BorderSpacing.CellAlignVertical = ccaCenter
@@ -160,4 +156,15 @@ object FColorize: TFColorize
       end
       end
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 136
+    Width = 70
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 8
+  end
 end
 end

+ 4 - 3
lazpaint/dialog/color/ucolorize.lrj

@@ -2,8 +2,9 @@
 {"hash":104240549,"name":"tfcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101],"value":"Colorize"},
 {"hash":104240549,"name":"tfcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101],"value":"Colorize"},
 {"hash":20405,"name":"tfcolorize.label_hue.caption","sourcebytes":[72,117,101],"value":"Hue"},
 {"hash":20405,"name":"tfcolorize.label_hue.caption","sourcebytes":[72,117,101],"value":"Hue"},
 {"hash":57214659,"name":"tfcolorize.label_colorness.caption","sourcebytes":[67,111,108,111,114,110,101,115,115],"value":"Colorness"},
 {"hash":57214659,"name":"tfcolorize.label_colorness.caption","sourcebytes":[67,111,108,111,114,110,101,115,115],"value":"Colorness"},
-{"hash":1339,"name":"tfcolorize.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfcolorize.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
+{"hash":497723,"name":"tfcolorize.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfcolorize.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
 {"hash":72944099,"name":"tfcolorize.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"},
 {"hash":72944099,"name":"tfcolorize.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"},
-{"hash":91802052,"name":"tfcolorize.label_preset.caption","sourcebytes":[80,114,101,115,101,116],"value":"Preset"}
+{"hash":91802052,"name":"tfcolorize.label_preset.caption","sourcebytes":[80,114,101,115,101,116],"value":"Preset"},
+{"hash":126662215,"name":"tfcolorize.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 21 - 0
lazpaint/dialog/color/ucolorize.pas

@@ -18,6 +18,7 @@ type
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
     CheckBox_GSBA: TCheckBox;
     CheckBox_GSBA: TCheckBox;
+    CheckBox_Preview: TCheckBox;
     Combo_Preset: TComboBox;
     Combo_Preset: TComboBox;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
@@ -32,6 +33,7 @@ type
     TrackBar_Saturation: TTrackBar;
     TrackBar_Saturation: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure Combo_PresetChange(Sender: TObject);
     procedure Combo_PresetChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
@@ -114,6 +116,15 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TFColorize.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if not FInitialized then exit;
+  if CheckBox_Preview.Checked then
+    ApplyChosenColor
+  else
+   FFilterConnector.RestoreBackup;
+end;
+
 procedure TFColorize.Combo_PresetChange(Sender: TObject);
 procedure TFColorize.Combo_PresetChange(Sender: TObject);
 begin
 begin
   if FInComboPreset then exit;
   if FInComboPreset then exit;
@@ -266,6 +277,12 @@ begin
   if AParams.IsDefined('Correction') then
   if AParams.IsDefined('Correction') then
     CheckBox_GSBA.Checked := AParams.Booleans['Correction'];
     CheckBox_GSBA.Checked := AParams.Booleans['Correction'];
   UpdateSpinEdit;
   UpdateSpinEdit;
+
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
+  CheckBox_Preview.Caption := rsPreview;
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Enabled := True;
   FInitialized := OldInitialized;
   FInitialized := OldInitialized;
 end;
 end;
 
 
@@ -359,6 +376,10 @@ end;
 procedure TFColorize.ApplyChosenColor;
 procedure TFColorize.ApplyChosenColor;
 begin
 begin
   Colorize(FFilterConnector, ChosenHueDegF, ChosenSatF, CheckBox_GSBA.Checked);
   Colorize(FFilterConnector, ChosenHueDegF, ChosenSatF, CheckBox_GSBA.Checked);
+
+  FInitialized := False;
+  CheckBox_Preview.Checked := True;
+  FInitialized := True;
 end;
 end;
 
 
 {$R *.lfm}
 {$R *.lfm}

+ 121 - 113
lazpaint/dialog/color/ushiftcolors.lfm

@@ -1,113 +1,121 @@
-object FShiftColors: TFShiftColors
-  Left = 509
-  Height = 141
-  Top = 150
-  Width = 490
-  BorderIcons = [biSystemMenu]
-  BorderStyle = bsDialog
-  Caption = 'Shift colors'
-  ClientHeight = 141
-  ClientWidth = 490
-  Font.Height = -12
-  OnCreate = FormCreate
-  OnShow = FormShow
-  Position = poOwnerFormCenter
-  LCLVersion = '1.2.4.0'
-  object Label1: TLabel
-    Left = 8
-    Height = 15
-    Top = 10
-    Width = 24
-    Caption = 'Hue'
-    ParentColor = False
-  end
-  object Label2: TLabel
-    Left = 8
-    Height = 15
-    Top = 48
-    Width = 63
-    Caption = 'Saturation'
-    ParentColor = False
-  end
-  object TrackBar_Hue: TTrackBar
-    Left = 70
-    Height = 35
-    Top = 5
-    Width = 328
-    OnChange = TrackBar_Change
-    Position = 0
-    TabOrder = 0
-  end
-  object TrackBar_Saturation: TTrackBar
-    Left = 70
-    Height = 35
-    Top = 44
-    Width = 328
-    OnChange = TrackBar_Change
-    Position = 0
-    TabOrder = 1
-  end
-  object Button_OK: TButton
-    Left = 163
-    Height = 22
-    Top = 110
-    Width = 59
-    Caption = 'OK'
-    Default = True
-    ModalResult = 1
-    OnClick = Button_OKClick
-    TabOrder = 2
-  end
-  object Button_Cancel: TButton
-    Left = 227
-    Height = 22
-    Top = 110
-    Width = 72
-    Cancel = True
-    Caption = 'Cancel'
-    ModalResult = 2
-    TabOrder = 3
-  end
-  object CheckBox_GSBA: TCheckBox
-    Left = 8
-    Height = 22
-    Top = 81
-    Width = 195
-    Caption = 'Corrected hue and lightness'
-    OnChange = CheckBox_GSBAChange
-    TabOrder = 4
-  end
-  object FloatSpinEdit_Saturation: TFloatSpinEdit
-    Left = 408
-    Height = 25
-    Top = 43
-    Width = 72
-    DecimalPlaces = 3
-    Increment = 1
-    MaxValue = 2
-    MinValue = -2
-    OnChange = FloatSpinEdit_SaturationChange
-    TabOrder = 5
-    Value = 0
-  end
-  object FloatSpinEdit_Hue: TFloatSpinEdit
-    Left = 408
-    Height = 25
-    Top = 7
-    Width = 72
-    DecimalPlaces = 1
-    Increment = 1
-    MaxValue = 180
-    MinValue = -180
-    OnChange = FloatSpinEdit_HueChange
-    TabOrder = 6
-    Value = 0
-  end
-  object TimerDrawPendingRows: TTimer
-    Enabled = False
-    Interval = 10
-    OnTimer = TimerDrawPendingRowsTimer
-    left = 362
-    top = 80
-  end
-end
+object FShiftColors: TFShiftColors
+  Left = 509
+  Height = 160
+  Top = 150
+  Width = 490
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'Shift colors'
+  ClientHeight = 160
+  ClientWidth = 490
+  Font.Height = -12
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  OnShow = FormShow
+  Position = poOwnerFormCenter
+  LCLVersion = '2.2.4.0'
+  object Label1: TLabel
+    Left = 8
+    Height = 15
+    Top = 10
+    Width = 22
+    Caption = 'Hue'
+    ParentColor = False
+  end
+  object Label2: TLabel
+    Left = 8
+    Height = 15
+    Top = 48
+    Width = 54
+    Caption = 'Saturation'
+    ParentColor = False
+  end
+  object TrackBar_Hue: TTrackBar
+    Left = 70
+    Height = 35
+    Top = 5
+    Width = 328
+    OnChange = TrackBar_Change
+    Position = 0
+    TabOrder = 0
+  end
+  object TrackBar_Saturation: TTrackBar
+    Left = 70
+    Height = 35
+    Top = 44
+    Width = 328
+    OnChange = TrackBar_Change
+    Position = 0
+    TabOrder = 1
+  end
+  object Button_OK: TButton
+    Left = 168
+    Height = 22
+    Top = 128
+    Width = 59
+    Caption = 'rsOK'
+    Default = True
+    ModalResult = 1
+    OnClick = Button_OKClick
+    TabOrder = 2
+  end
+  object Button_Cancel: TButton
+    Left = 232
+    Height = 22
+    Top = 128
+    Width = 72
+    Cancel = True
+    Caption = 'rsCancel'
+    ModalResult = 2
+    TabOrder = 3
+  end
+  object CheckBox_GSBA: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 81
+    Width = 168
+    Caption = 'Corrected hue and lightness'
+    OnChange = CheckBox_GSBAChange
+    TabOrder = 4
+  end
+  object FloatSpinEdit_Saturation: TFloatSpinEdit
+    Left = 408
+    Height = 23
+    Top = 43
+    Width = 72
+    DecimalPlaces = 3
+    MaxValue = 2
+    MinValue = -2
+    OnChange = FloatSpinEdit_SaturationChange
+    TabOrder = 5
+  end
+  object FloatSpinEdit_Hue: TFloatSpinEdit
+    Left = 408
+    Height = 23
+    Top = 7
+    Width = 72
+    DecimalPlaces = 1
+    MaxValue = 180
+    MinValue = -180
+    OnChange = FloatSpinEdit_HueChange
+    TabOrder = 6
+  end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 109
+    Width = 70
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 7
+  end
+  object TimerDrawPendingRows: TTimer
+    Enabled = False
+    Interval = 10
+    OnTimer = TimerDrawPendingRowsTimer
+    Left = 362
+    Top = 80
+  end
+end

+ 4 - 3
lazpaint/dialog/color/ushiftcolors.lrj

@@ -2,7 +2,8 @@
 {"hash":52227059,"name":"tfshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115],"value":"Shift colors"},
 {"hash":52227059,"name":"tfshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115],"value":"Shift colors"},
 {"hash":20405,"name":"tfshiftcolors.label1.caption","sourcebytes":[72,117,101],"value":"Hue"},
 {"hash":20405,"name":"tfshiftcolors.label1.caption","sourcebytes":[72,117,101],"value":"Hue"},
 {"hash":210581742,"name":"tfshiftcolors.label2.caption","sourcebytes":[83,97,116,117,114,97,116,105,111,110],"value":"Saturation"},
 {"hash":210581742,"name":"tfshiftcolors.label2.caption","sourcebytes":[83,97,116,117,114,97,116,105,111,110],"value":"Saturation"},
-{"hash":1339,"name":"tfshiftcolors.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfshiftcolors.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
-{"hash":72944099,"name":"tfshiftcolors.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"}
+{"hash":497723,"name":"tfshiftcolors.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfshiftcolors.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
+{"hash":72944099,"name":"tfshiftcolors.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"},
+{"hash":126662215,"name":"tfshiftcolors.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 60 - 6
lazpaint/dialog/color/ushiftcolors.pas

@@ -18,6 +18,7 @@ type
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
     CheckBox_GSBA: TCheckBox;
     CheckBox_GSBA: TCheckBox;
+    CheckBox_Preview: TCheckBox;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
     Label1: TLabel;
     Label1: TLabel;
@@ -27,9 +28,11 @@ type
     TrackBar_Saturation: TTrackBar;
     TrackBar_Saturation: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure TimerDrawPendingRowsTimer(Sender: TObject);
     procedure TimerDrawPendingRowsTimer(Sender: TObject);
     procedure TrackBar_Change(Sender: TObject);
     procedure TrackBar_Change(Sender: TObject);
@@ -41,6 +44,7 @@ type
     FUpdatingSpinEdit: boolean;
     FUpdatingSpinEdit: boolean;
     FOddRows: boolean;
     FOddRows: boolean;
     FPendingRows: boolean;
     FPendingRows: boolean;
+    FComputedImage: TBGRABitmap;
     function GetChosenHueShiftF: single;
     function GetChosenHueShiftF: single;
     function GetChosenSatShiftF: single;
     function GetChosenSatShiftF: single;
     procedure SetChosenHueShiftF(AValue: single);
     procedure SetChosenHueShiftF(AValue: single);
@@ -51,7 +55,9 @@ type
     procedure SetChosenHueShift(AValue: integer);
     procedure SetChosenHueShift(AValue: integer);
     procedure LoadParameters;
     procedure LoadParameters;
     procedure HalfApplyChosenShift;
     procedure HalfApplyChosenShift;
-    procedure ParametersChanged;
+    procedure PreviewNeeded;
+    procedure DisplayComputedImage;
+    procedure StoreComputedImage;
   public
   public
     { public declarations }
     { public declarations }
     function ShowModal: integer; override;
     function ShowModal: integer; override;
@@ -85,6 +91,11 @@ begin
   UpdateSpinEdit;
   UpdateSpinEdit;
 end;
 end;
 
 
+procedure TFShiftColors.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FComputedImage);
+end;
+
 procedure TFShiftColors.FormShow(Sender: TObject);
 procedure TFShiftColors.FormShow(Sender: TObject);
 begin
 begin
   LoadParameters;
   LoadParameters;
@@ -103,6 +114,7 @@ begin
     FPendingRows:= false;
     FPendingRows:= false;
   end;
   end;
   Button_OK.Enabled := true;
   Button_OK.Enabled := true;
+  CheckBox_Preview.Enabled := true;
 end;
 end;
 
 
 procedure TFShiftColors.TrackBar_Change(Sender: TObject);
 procedure TFShiftColors.TrackBar_Change(Sender: TObject);
@@ -110,7 +122,7 @@ begin
   if FInitialized then
   if FInitialized then
   begin
   begin
     UpdateSpinEdit;
     UpdateSpinEdit;
-    ParametersChanged;
+    PreviewNeeded;
   end;
   end;
 end;
 end;
 
 
@@ -174,6 +186,14 @@ begin
     if FFilterConnector.Parameters.IsDefined('Correction') then
     if FFilterConnector.Parameters.IsDefined('Correction') then
       CheckBox_GSBA.Checked := FFilterConnector.Parameters.Booleans['Correction'];
       CheckBox_GSBA.Checked := FFilterConnector.Parameters.Booleans['Correction'];
     UpdateSpinEdit;
     UpdateSpinEdit;
+
+    FreeAndNil(FComputedImage);
+    Button_OK.Caption := rsOK;
+    Button_OK.Enabled := True;
+    Button_Cancel.Caption := rsCancel;
+    CheckBox_Preview.Caption := rsPreview;
+    CheckBox_Preview.Checked := True;
+    CheckBox_Preview.Enabled := True;
     FInitialized := OldInitialized;
     FInitialized := OldInitialized;
   end;
   end;
 end;
 end;
@@ -256,7 +276,11 @@ end;
 procedure TFShiftColors.Button_OKClick(Sender: TObject);
 procedure TFShiftColors.Button_OKClick(Sender: TObject);
 begin
 begin
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
-  if FPendingRows then
+  CheckBox_Preview.Enabled := false;
+
+  if not CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else if FPendingRows then
   begin
   begin
     HalfApplyChosenShift;
     HalfApplyChosenShift;
     FPendingRows := false;
     FPendingRows := false;
@@ -269,7 +293,18 @@ end;
 
 
 procedure TFShiftColors.CheckBox_GSBAChange(Sender: TObject);
 procedure TFShiftColors.CheckBox_GSBAChange(Sender: TObject);
 begin
 begin
-  if FInitialized and Visible then ParametersChanged;
+  if FInitialized and Visible then PreviewNeeded;
+end;
+
+procedure TFShiftColors.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if not FInitialized then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else begin
+    StoreComputedImage;
+    FFilterConnector.RestoreBackup;
+  end;
 end;
 end;
 
 
 procedure TFShiftColors.FloatSpinEdit_HueChange(Sender: TObject);
 procedure TFShiftColors.FloatSpinEdit_HueChange(Sender: TObject);
@@ -294,14 +329,33 @@ begin
   FOddRows:= not FOddRows;
   FOddRows:= not FOddRows;
 end;
 end;
 
 
-procedure TFShiftColors.ParametersChanged;
+procedure TFShiftColors.PreviewNeeded;
 begin
 begin
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
+
+  FInitialized := false;
+  CheckBox_Preview.Enabled := false;
+  CheckBox_Preview.Checked := true;
+  FInitialized := true;
+  FreeAndNil(FComputedImage);
+
   HalfApplyChosenShift;
   HalfApplyChosenShift;
-  FPendingRows:= true;
+  FPendingRows := true;
   TimerDrawPendingRows.Enabled := true;
   TimerDrawPendingRows.Enabled := true;
 end;
 end;
 
 
+procedure TFShiftColors.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage, false, false);
+end;
+
+procedure TFShiftColors.StoreComputedImage;
+begin
+  if not FPendingRows and (FComputedImage = nil) then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 {$R *.lfm}
 {$R *.lfm}
 
 
 end.
 end.

+ 24 - 13
lazpaint/dialog/filter/ucustomblur.lfm

@@ -1,12 +1,12 @@
 object FCustomBlur: TFCustomBlur
 object FCustomBlur: TFCustomBlur
-  Left = 672
-  Height = 300
-  Top = 158
+  Left = 646
+  Height = 319
+  Top = 261
   Width = 400
   Width = 400
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = 'Custom blur'
   Caption = 'Custom blur'
-  ClientHeight = 300
+  ClientHeight = 319
   ClientWidth = 400
   ClientWidth = 400
   Font.Height = -12
   Font.Height = -12
   OnCloseQuery = FormCloseQuery
   OnCloseQuery = FormCloseQuery
@@ -14,7 +14,7 @@ object FCustomBlur: TFCustomBlur
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Image1: TImage
   object Image1: TImage
     Left = 8
     Left = 8
     Height = 216
     Height = 216
@@ -27,9 +27,9 @@ object FCustomBlur: TFCustomBlur
   object Button_OK: TButton
   object Button_OK: TButton
     Left = 128
     Left = 128
     Height = 22
     Height = 22
-    Top = 272
+    Top = 288
     Width = 59
     Width = 59
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     Default = True
     OnClick = Button_OKClick
     OnClick = Button_OKClick
     TabOrder = 0
     TabOrder = 0
@@ -37,10 +37,10 @@ object FCustomBlur: TFCustomBlur
   object Button_Cancel: TButton
   object Button_Cancel: TButton
     Left = 194
     Left = 194
     Height = 22
     Height = 22
-    Top = 272
+    Top = 288
     Width = 81
     Width = 81
     Cancel = True
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     ModalResult = 2
     TabOrder = 1
     TabOrder = 1
   end
   end
@@ -62,18 +62,29 @@ object FCustomBlur: TFCustomBlur
     OnClick = Button_EditMaskClick
     OnClick = Button_EditMaskClick
     TabOrder = 3
     TabOrder = 3
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 264
+    Width = 70
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 4
+  end
   object OpenPictureDialog1: TOpenPictureDialog
   object OpenPictureDialog1: TOpenPictureDialog
     Title = 'Open grayscale file'
     Title = 'Open grayscale file'
     Filter = 'Mask images (*.bmp, *.jpeg, *.lzp, *.pcx, *.png, *.tga)|*.bmp;*.jpg;*.jpeg;*.lzp;*.pcx;*.png;*.tga;*.BMP;*.JPG;*.JPEG;*.LZP;*.PCX;*.PNG;*.TGA;*.Bmp;*.Jpg;*.Jpeg;*.Lzp;*.Pcx;*.Png;*.Tga|Bitmaps (*.bmp)|*.bmp;*.BMP;*.Bmp|JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG;*.Jpg;*.Jpeg|LazPaint (*.lzp)|*.lzp;*.LZP;*.Lzp|PCX (*.pcx)|*.pcx;*.PCX;*.Pcx|Portable Network Graphic (*.png)|*.png;*.PNG;*.Png|Targa (*.tga)|*.tga;*.TGA;*.Tga'
     Filter = 'Mask images (*.bmp, *.jpeg, *.lzp, *.pcx, *.png, *.tga)|*.bmp;*.jpg;*.jpeg;*.lzp;*.pcx;*.png;*.tga;*.BMP;*.JPG;*.JPEG;*.LZP;*.PCX;*.PNG;*.TGA;*.Bmp;*.Jpg;*.Jpeg;*.Lzp;*.Pcx;*.Png;*.Tga|Bitmaps (*.bmp)|*.bmp;*.BMP;*.Bmp|JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG;*.Jpg;*.Jpeg|LazPaint (*.lzp)|*.lzp;*.LZP;*.Lzp|PCX (*.pcx)|*.pcx;*.PCX;*.Pcx|Portable Network Graphic (*.png)|*.png;*.PNG;*.Png|Targa (*.tga)|*.tga;*.TGA;*.Tga'
     Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
     Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
-    left = 48
-    top = 248
+    Left = 232
+    Top = 232
   end
   end
   object Timer1: TTimer
   object Timer1: TTimer
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 308
-    top = 230
+    Left = 328
+    Top = 232
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/filter/ucustomblur.lrj

@@ -1,8 +1,9 @@
 {"version":1,"strings":[
 {"version":1,"strings":[
 {"hash":96229746,"name":"tfcustomblur.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114],"value":"Custom blur"},
 {"hash":96229746,"name":"tfcustomblur.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114],"value":"Custom blur"},
-{"hash":1339,"name":"tfcustomblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfcustomblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
+{"hash":497723,"name":"tfcustomblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfcustomblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
 {"hash":113031038,"name":"tfcustomblur.button_loadmask.caption","sourcebytes":[76,111,97,100,32,109,97,115,107,46,46,46],"value":"Load mask..."},
 {"hash":113031038,"name":"tfcustomblur.button_loadmask.caption","sourcebytes":[76,111,97,100,32,109,97,115,107,46,46,46],"value":"Load mask..."},
 {"hash":120776574,"name":"tfcustomblur.button_editmask.caption","sourcebytes":[69,100,105,116,32,109,97,115,107,46,46,46],"value":"Edit mask..."},
 {"hash":120776574,"name":"tfcustomblur.button_editmask.caption","sourcebytes":[69,100,105,116,32,109,97,115,107,46,46,46],"value":"Edit mask..."},
+{"hash":126662215,"name":"tfcustomblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
 {"hash":210391541,"name":"tfcustomblur.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,103,114,97,121,115,99,97,108,101,32,102,105,108,101],"value":"Open grayscale file"}
 {"hash":210391541,"name":"tfcustomblur.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,103,114,97,121,115,99,97,108,101,32,102,105,108,101],"value":"Open grayscale file"}
 ]}
 ]}

+ 57 - 1
lazpaint/dialog/filter/ucustomblur.pas

@@ -21,12 +21,14 @@ type
     Button_OK: TButton;
     Button_OK: TButton;
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     btnLoadMask: TButton;
     btnLoadMask: TButton;
+    CheckBox_Preview: TCheckBox;
     Image1: TImage;
     Image1: TImage;
     OpenPictureDialog1: TOpenPictureDialog;
     OpenPictureDialog1: TOpenPictureDialog;
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_EditMaskClick(Sender: TObject);
     procedure Button_EditMaskClick(Sender: TObject);
     procedure Button_LoadMaskClick(Sender: TObject);
     procedure Button_LoadMaskClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -40,6 +42,10 @@ type
     FLazPaintInstance: TLazPaintCustomInstance;
     FLazPaintInstance: TLazPaintCustomInstance;
     FFilterConnector: TFilterConnector;
     FFilterConnector: TFilterConnector;
     FThreadManager: TFilterThreadManager;
     FThreadManager: TFilterThreadManager;
+    FInitializing, FComputed: boolean;
+    FComputedImage: TBGRABitmap;
+    procedure DisplayComputedImage;
+    procedure StoreComputedImage;
     procedure GenerateDefaultMask;
     procedure GenerateDefaultMask;
     procedure SetLazPaintInstance(const AValue: TLazPaintCustomInstance);
     procedure SetLazPaintInstance(const AValue: TLazPaintCustomInstance);
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
@@ -63,16 +69,26 @@ begin
     'ForeColor=FFFFFFFF'+LineEnding+
     'ForeColor=FFFFFFFF'+LineEnding+
     'BackColor=000000FF'+LineEnding+
     'BackColor=000000FF'+LineEnding+
     'PenWidth=1');
     'PenWidth=1');
+
+  FComputed := false;
+  FComputedImage := nil;
 end;
 end;
 
 
 procedure TFCustomBlur.FormDestroy(Sender: TObject);
 procedure TFCustomBlur.FormDestroy(Sender: TObject);
 begin
 begin
   subConfig.Free;
   subConfig.Free;
   FreeAndNil(FBrowseImages);
   FreeAndNil(FBrowseImages);
+  FreeAndNil(FComputedImage);
 end;
 end;
 
 
 procedure TFCustomBlur.FormShow(Sender: TObject);
 procedure TFCustomBlur.FormShow(Sender: TObject);
 begin
 begin
+  FInitializing := true;
+  CheckBox_Preview.Checked := true;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
+  FInitializing := false;
   PreviewNeeded;
   PreviewNeeded;
 end;
 end;
 
 
@@ -119,6 +135,18 @@ begin
   Timer1.Enabled:= true;
   Timer1.Enabled:= true;
 end;
 end;
 
 
+procedure TFCustomBlur.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage, false, false);
+end;
+
+procedure TFCustomBlur.StoreComputedImage;
+begin
+  if FComputed and (FComputedImage = nil) then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 procedure TFCustomBlur.GenerateDefaultMask;
 procedure TFCustomBlur.GenerateDefaultMask;
 var bmp: TBitmap;
 var bmp: TBitmap;
     defaultMask: TBGRABitmap;
     defaultMask: TBGRABitmap;
@@ -162,7 +190,16 @@ begin
       if FThreadManager.ReadyToClose then
       if FThreadManager.ReadyToClose then
         Close
         Close
       else
       else
-        if AEvent = tmeCompletedTask then Button_OK.Enabled := true;
+        if AEvent = tmeCompletedTask then begin
+          Button_OK.Enabled := true;
+          CheckBox_Preview.Enabled := true;
+        end;
+
+      if FComputedImage <> nil then FComputedImage.Free;
+      case AEvent of
+        tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate;
+        tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+      end;
     end;
     end;
   tmeStartingNewTask:
   tmeStartingNewTask:
     begin
     begin
@@ -170,6 +207,11 @@ begin
       Timer1.Interval := 100;
       Timer1.Interval := 100;
       Timer1.Enabled := true;
       Timer1.Enabled := true;
       Button_OK.Enabled := false;
       Button_OK.Enabled := false;
+
+      FInitializing := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FInitializing := False;
     end;
     end;
   end;
   end;
 end;
 end;
@@ -258,10 +300,24 @@ end;
 
 
 procedure TFCustomBlur.Button_OKClick(Sender: TObject);
 procedure TFCustomBlur.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction;
   if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction;
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFCustomBlur.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+  begin
+   StoreComputedImage;
+   FFilterConnector.RestoreBackup;
+  end;
+end;
+
 procedure TFCustomBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 procedure TFCustomBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 begin
 begin
   FThreadManager.Quit;
   FThreadManager.Quit;

+ 33 - 22
lazpaint/dialog/filter/uemboss.lfm

@@ -1,6 +1,6 @@
 object FEmboss: TFEmboss
 object FEmboss: TFEmboss
   Left = 491
   Left = 491
-  Height = 277
+  Height = 296
   Top = 168
   Top = 168
   Width = 148
   Width = 148
   AutoSize = True
   AutoSize = True
@@ -13,18 +13,18 @@ object FEmboss: TFEmboss
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 277
+  ClientHeight = 296
   ClientWidth = 148
   ClientWidth = 148
   Font.Height = -12
   Font.Height = -12
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poMainFormCenter
   Position = poMainFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Label_Direction: TLabel
   object Label_Direction: TLabel
     Left = 8
     Left = 8
     Height = 15
     Height = 15
     Top = 8
     Top = 8
-    Width = 112
+    Width = 130
     Caption = 'Direction :'
     Caption = 'Direction :'
     ParentColor = False
     ParentColor = False
   end
   end
@@ -32,7 +32,7 @@ object FEmboss: TFEmboss
     Left = 8
     Left = 8
     Height = 105
     Height = 105
     Top = 31
     Top = 31
-    Width = 112
+    Width = 130
     OnMouseDown = PaintBox1MouseDown
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseMove = PaintBox1MouseMove
     OnMouseUp = PaintBox1MouseUp
     OnMouseUp = PaintBox1MouseUp
@@ -40,18 +40,18 @@ object FEmboss: TFEmboss
   end
   end
   object CheckBox_Transparent: TCheckBox
   object CheckBox_Transparent: TCheckBox
     Left = 8
     Left = 8
-    Height = 23
+    Height = 19
     Top = 144
     Top = 144
-    Width = 112
+    Width = 130
     Caption = 'Transparent'
     Caption = 'Transparent'
     OnChange = CheckBox_Change
     OnChange = CheckBox_Change
     TabOrder = 0
     TabOrder = 0
   end
   end
   object CheckBox_PreserveColors: TCheckBox
   object CheckBox_PreserveColors: TCheckBox
     Left = 8
     Left = 8
-    Height = 23
-    Top = 175
-    Width = 112
+    Height = 19
+    Top = 171
+    Width = 130
     Caption = 'Preserve colors'
     Caption = 'Preserve colors'
     Checked = True
     Checked = True
     OnChange = CheckBox_Change
     OnChange = CheckBox_Change
@@ -61,17 +61,17 @@ object FEmboss: TFEmboss
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 206
-    Width = 112
+    Top = 198
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 2
     TabOrder = 2
     object TrackBar_Strength: TTrackBar
     object TrackBar_Strength: TTrackBar
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 112
+      Width = 130
       Frequency = 64
       Frequency = 64
       Max = 256
       Max = 256
       OnChange = TrackBar_StrengthChange
       OnChange = TrackBar_StrengthChange
@@ -80,37 +80,48 @@ object FEmboss: TFEmboss
       TabOrder = 0
       TabOrder = 0
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 231
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 4
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 239
-    Width = 112
+    Top = 258
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 3
     TabOrder = 3
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end

+ 3 - 2
lazpaint/dialog/filter/uemboss.lrj

@@ -3,6 +3,7 @@
 {"hash":182806666,"name":"tfemboss.label_direction.caption","sourcebytes":[68,105,114,101,99,116,105,111,110,32,58],"value":"Direction :"},
 {"hash":182806666,"name":"tfemboss.label_direction.caption","sourcebytes":[68,105,114,101,99,116,105,111,110,32,58],"value":"Direction :"},
 {"hash":171115524,"name":"tfemboss.checkbox_transparent.caption","sourcebytes":[84,114,97,110,115,112,97,114,101,110,116],"value":"Transparent"},
 {"hash":171115524,"name":"tfemboss.checkbox_transparent.caption","sourcebytes":[84,114,97,110,115,112,97,114,101,110,116],"value":"Transparent"},
 {"hash":169540963,"name":"tfemboss.checkbox_preservecolors.caption","sourcebytes":[80,114,101,115,101,114,118,101,32,99,111,108,111,114,115],"value":"Preserve colors"},
 {"hash":169540963,"name":"tfemboss.checkbox_preservecolors.caption","sourcebytes":[80,114,101,115,101,114,118,101,32,99,111,108,111,114,115],"value":"Preserve colors"},
-{"hash":1339,"name":"tfemboss.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfemboss.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfemboss.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfemboss.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfemboss.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 26 - 8
lazpaint/dialog/filter/uemboss.pas

@@ -17,6 +17,7 @@ type
   TFEmboss = class(TForm)
   TFEmboss = class(TForm)
     Button_OK: TButton;
     Button_OK: TButton;
     Button_Cancel: TButton;
     Button_Cancel: TButton;
+    CheckBox_Preview: TCheckBox;
     CheckBox_Transparent: TCheckBox;
     CheckBox_Transparent: TCheckBox;
     CheckBox_PreserveColors: TCheckBox;
     CheckBox_PreserveColors: TCheckBox;
     Label_Direction: TLabel;
     Label_Direction: TLabel;
@@ -26,6 +27,7 @@ type
     TrackBar_Strength: TTrackBar;
     TrackBar_Strength: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_Change(Sender: TObject);
     procedure CheckBox_Change(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
@@ -45,7 +47,7 @@ type
     FInitializing: boolean;
     FInitializing: boolean;
     procedure ComputeAngle(X,Y: integer);
     procedure ComputeAngle(X,Y: integer);
     function ComputeFilteredLayer: TBGRABitmap;
     function ComputeFilteredLayer: TBGRABitmap;
-    procedure PreviewNeeded;
+    procedure DisplayPreview;
     procedure InitParams;
     procedure InitParams;
   public
   public
     FilterConnector: TFilterConnector;
     FilterConnector: TFilterConnector;
@@ -56,7 +58,7 @@ function ShowEmbossDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses BGRABitmapTypes, math, ugraph, umac;
+uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings;
 
 
 { TFEmboss }
 { TFEmboss }
 
 
@@ -74,7 +76,7 @@ begin
         FEmboss.FilterConnector.Parameters.Booleans['Validate'] then
         FEmboss.FilterConnector.Parameters.Booleans['Validate'] then
       begin
       begin
         FEmboss.InitParams;
         FEmboss.InitParams;
-        FEmboss.PreviewNeeded;
+        FEmboss.DisplayPreview;
         FEmboss.FilterConnector.ValidateAction;
         FEmboss.FilterConnector.ValidateAction;
         result := srOk;
         result := srOk;
       end else
       end else
@@ -101,12 +103,14 @@ end;
 procedure TFEmboss.FormShow(Sender: TObject);
 procedure TFEmboss.FormShow(Sender: TObject);
 begin
 begin
   InitParams;
   InitParams;
-  PreviewNeeded;
+  DisplayPreview;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left
 end;
 end;
 
 
 procedure TFEmboss.Button_OKClick(Sender: TObject);
 procedure TFEmboss.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayPreview;
+
   FilterConnector.ValidateAction;
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultEmbossAngle(angle);
   FilterConnector.LazPaintInstance.Config.SetDefaultEmbossAngle(angle);
   ModalResult := mrOK;
   ModalResult := mrOK;
@@ -114,7 +118,16 @@ end;
 
 
 procedure TFEmboss.CheckBox_Change(Sender: TObject);
 procedure TFEmboss.CheckBox_Change(Sender: TObject);
 begin
 begin
-  PreviewNeeded;
+  if CheckBox_Preview.Checked then DisplayPreview;
+end;
+
+procedure TFEmboss.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayPreview
+  else
+    FilterConnector.RestoreBackup;
 end;
 end;
 
 
 procedure TFEmboss.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
 procedure TFEmboss.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
@@ -171,7 +184,7 @@ end;
 
 
 procedure TFEmboss.TrackBar_StrengthChange(Sender: TObject);
 procedure TFEmboss.TrackBar_StrengthChange(Sender: TObject);
 begin
 begin
-  PreviewNeeded;
+  if CheckBox_Preview.Checked then DisplayPreview;
   PaintBox1.Repaint;
   PaintBox1.Repaint;
 end;
 end;
 
 
@@ -180,7 +193,7 @@ begin
   if selectingAngle then
   if selectingAngle then
   begin
   begin
     angle := ugraph.ComputeAngle(X-PaintBox1.Width/2,Y-PaintBox1.Height/2);
     angle := ugraph.ComputeAngle(X-PaintBox1.Width/2,Y-PaintBox1.Height/2);
-    PreviewNeeded;
+    if CheckBox_Preview.Checked then DisplayPreview;
     PaintBox1.Repaint;
     PaintBox1.Repaint;
   end;
   end;
 end;
 end;
@@ -194,7 +207,7 @@ begin
   result := FilterConnector.BackupLayer.FilterEmboss(angle,FilterConnector.WorkArea,TrackBar_Strength.Position,options) as TBGRABitmap;
   result := FilterConnector.BackupLayer.FilterEmboss(angle,FilterConnector.WorkArea,TrackBar_Strength.Position,options) as TBGRABitmap;
 end;
 end;
 
 
-procedure TFEmboss.PreviewNeeded;
+procedure TFEmboss.DisplayPreview;
 begin
 begin
   FilterConnector.PutImage(ComputeFilteredLayer,False,True);
   FilterConnector.PutImage(ComputeFilteredLayer,False,True);
 end;
 end;
@@ -211,6 +224,11 @@ begin
     if FVars.IsDefined('PreserveColors') then
     if FVars.IsDefined('PreserveColors') then
       CheckBox_PreserveColors.Checked := FVars.Booleans['PreserveColors'];
       CheckBox_PreserveColors.Checked := FVars.Booleans['PreserveColors'];
   end;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing:= false;
   FInitializing:= false;
 end;
 end;
 
 

+ 138 - 125
lazpaint/dialog/filter/ufilterfunction.lfm

@@ -1,26 +1,25 @@
 object FFilterFunction: TFFilterFunction
 object FFilterFunction: TFFilterFunction
   Left = 437
   Left = 437
-  Height = 365
+  Height = 271
   Top = 135
   Top = 135
-  Width = 645
+  Width = 640
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = 'Apply function'
   Caption = 'Apply function'
-  ClientHeight = 365
-  ClientWidth = 645
-  DesignTimePPI = 144
+  ClientHeight = 271
+  ClientWidth = 640
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.6.0'
   object Button_OK: TButton
   object Button_OK: TButton
-    Left = 218
-    Height = 33
-    Top = 318
-    Width = 88
+    Left = 251
+    Height = 22
+    Top = 240
+    Width = 59
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     Default = True
     Enabled = False
     Enabled = False
     OnClick = Button_OKClick
     OnClick = Button_OKClick
@@ -28,13 +27,13 @@ object FFilterFunction: TFFilterFunction
     TabOrder = 0
     TabOrder = 0
   end
   end
   object Button_Cancel: TButton
   object Button_Cancel: TButton
-    Left = 314
-    Height = 33
-    Top = 318
-    Width = 110
+    Left = 315
+    Height = 22
+    Top = 240
+    Width = 73
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
     Cancel = True
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     ModalResult = 2
     OnClick = Button_CancelClick
     OnClick = Button_CancelClick
     ParentFont = False
     ParentFont = False
@@ -43,10 +42,11 @@ object FFilterFunction: TFFilterFunction
   object Label_AlphaEquals: TLabel
   object Label_AlphaEquals: TLabel
     AnchorSideTop.Control = Edit_Alpha
     AnchorSideTop.Control = Edit_Alpha
     AnchorSideTop.Side = asrCenter
     AnchorSideTop.Side = asrCenter
-    Left = 24
-    Height = 24
-    Top = 275
-    Width = 6
+    Left = 16
+    Height = 16
+    Top = 189
+    Width = 4
+    Anchors = [akLeft, akBottom]
     Caption = '.'
     Caption = '.'
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
@@ -54,23 +54,24 @@ object FFilterFunction: TFFilterFunction
   object Edit_Alpha: TEdit
   object Edit_Alpha: TEdit
     AnchorSideLeft.Control = Label_AlphaEquals
     AnchorSideLeft.Control = Label_AlphaEquals
     AnchorSideLeft.Side = asrBottom
     AnchorSideLeft.Side = asrBottom
-    Left = 30
-    Height = 36
-    Top = 269
-    Width = 594
+    Left = 20
+    Height = 22
+    Top = 186
+    Width = 606
     Anchors = [akLeft, akRight, akBottom]
     Anchors = [akLeft, akRight, akBottom]
     OnChange = Edit_AlphaChange
     OnChange = Edit_AlphaChange
     ParentFont = False
     ParentFont = False
     TabOrder = 2
     TabOrder = 2
   end
   end
   object PageControl_Color: TPageControl
   object PageControl_Color: TPageControl
-    Left = 12
-    Height = 204
-    Top = 46
-    Width = 624
-    ActivePage = TabSheet_RGB
+    Left = 8
+    Height = 145
+    Top = 31
+    Width = 626
+    ActivePage = TabSheet_HSL
+    Anchors = [akTop, akLeft, akRight]
     ParentFont = False
     ParentFont = False
-    TabIndex = 0
+    TabIndex = 1
     TabOrder = 3
     TabOrder = 3
     OnChange = PageControl_ColorChange
     OnChange = PageControl_ColorChange
     object TabSheet_RGB: TTabSheet
     object TabSheet_RGB: TTabSheet
@@ -80,14 +81,14 @@ object FFilterFunction: TFFilterFunction
       ChildSizing.VerticalSpacing = 6
       ChildSizing.VerticalSpacing = 6
       ChildSizing.EnlargeHorizontal = crsScaleChilds
       ChildSizing.EnlargeHorizontal = crsScaleChilds
       ChildSizing.ControlsPerLine = 1
       ChildSizing.ControlsPerLine = 1
-      ClientHeight = 166
-      ClientWidth = 614
+      ClientHeight = 115
+      ClientWidth = 620
       ParentFont = False
       ParentFont = False
       object PanelRGB: TPanel
       object PanelRGB: TPanel
-        Left = 12
-        Height = 120
+        Left = 10
+        Height = 79
         Top = 6
         Top = 6
-        Width = 596
+        Width = 604
         Align = alClient
         Align = alClient
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.HorizontalSpacing = 6
         ChildSizing.HorizontalSpacing = 6
@@ -95,14 +96,14 @@ object FFilterFunction: TFFilterFunction
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 120
-        ClientWidth = 596
+        ClientHeight = 79
+        ClientWidth = 604
         TabOrder = 0
         TabOrder = 0
         object Edit_Red: TEdit
         object Edit_Red: TEdit
           Left = 0
           Left = 0
-          Height = 36
+          Height = 22
           Top = 0
           Top = 0
-          Width = 596
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_RedChange
           OnChange = Edit_RedChange
           ParentFont = False
           ParentFont = False
@@ -110,9 +111,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_Green: TEdit
         object Edit_Green: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 42
-          Width = 596
+          Height = 22
+          Top = 28
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_GreenChange
           OnChange = Edit_GreenChange
           ParentFont = False
           ParentFont = False
@@ -120,9 +121,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_Blue: TEdit
         object Edit_Blue: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 84
-          Width = 596
+          Height = 22
+          Top = 56
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_BlueChange
           OnChange = Edit_BlueChange
           ParentFont = False
           ParentFont = False
@@ -131,9 +132,9 @@ object FFilterFunction: TFFilterFunction
       end
       end
       object CheckBox_Gamma: TCheckBox
       object CheckBox_Gamma: TCheckBox
         Left = 6
         Left = 6
-        Height = 28
-        Top = 132
-        Width = 602
+        Height = 18
+        Top = 91
+        Width = 608
         Align = alBottom
         Align = alBottom
         Caption = 'Gamma correction'
         Caption = 'Gamma correction'
         OnChange = CheckBox_GammaChange
         OnChange = CheckBox_GammaChange
@@ -142,41 +143,41 @@ object FFilterFunction: TFFilterFunction
       end
       end
       object PanelLabelRGB: TPanel
       object PanelLabelRGB: TPanel
         Left = 6
         Left = 6
-        Height = 120
+        Height = 79
         Top = 6
         Top = 6
-        Width = 6
+        Width = 4
         Align = alLeft
         Align = alLeft
         AutoSize = True
         AutoSize = True
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.VerticalSpacing = 6
         ChildSizing.VerticalSpacing = 6
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 120
-        ClientWidth = 6
+        ClientHeight = 79
+        ClientWidth = 4
         TabOrder = 2
         TabOrder = 2
         object Label_RedEquals: TLabel
         object Label_RedEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
+          Height = 16
           Top = 0
           Top = 0
-          Width = 6
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_GreenEquals: TLabel
         object Label_GreenEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 30
-          Width = 6
+          Height = 16
+          Top = 22
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_BlueEquals: TLabel
         object Label_BlueEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 60
-          Width = 6
+          Height = 16
+          Top = 44
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
@@ -188,14 +189,14 @@ object FFilterFunction: TFFilterFunction
       ChildSizing.LeftRightSpacing = 6
       ChildSizing.LeftRightSpacing = 6
       ChildSizing.TopBottomSpacing = 6
       ChildSizing.TopBottomSpacing = 6
       ChildSizing.VerticalSpacing = 6
       ChildSizing.VerticalSpacing = 6
-      ClientHeight = 166
-      ClientWidth = 614
+      ClientHeight = 115
+      ClientWidth = 620
       ParentFont = False
       ParentFont = False
       object PanelHSL: TPanel
       object PanelHSL: TPanel
-        Left = 12
-        Height = 120
+        Left = 10
+        Height = 79
         Top = 6
         Top = 6
-        Width = 596
+        Width = 604
         Align = alClient
         Align = alClient
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.HorizontalSpacing = 6
         ChildSizing.HorizontalSpacing = 6
@@ -203,14 +204,14 @@ object FFilterFunction: TFFilterFunction
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 120
-        ClientWidth = 596
+        ClientHeight = 79
+        ClientWidth = 604
         TabOrder = 0
         TabOrder = 0
         object Edit_Hue: TEdit
         object Edit_Hue: TEdit
           Left = 0
           Left = 0
-          Height = 36
+          Height = 22
           Top = 0
           Top = 0
-          Width = 596
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_HueChange
           OnChange = Edit_HueChange
           ParentFont = False
           ParentFont = False
@@ -218,9 +219,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_Saturation: TEdit
         object Edit_Saturation: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 42
-          Width = 596
+          Height = 22
+          Top = 28
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_SaturationChange
           OnChange = Edit_SaturationChange
           ParentFont = False
           ParentFont = False
@@ -228,9 +229,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_Lightness: TEdit
         object Edit_Lightness: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 84
-          Width = 596
+          Height = 22
+          Top = 56
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_LightnessChange
           OnChange = Edit_LightnessChange
           ParentFont = False
           ParentFont = False
@@ -239,9 +240,9 @@ object FFilterFunction: TFFilterFunction
       end
       end
       object CheckBox_GSBA: TCheckBox
       object CheckBox_GSBA: TCheckBox
         Left = 6
         Left = 6
-        Height = 28
-        Top = 132
-        Width = 602
+        Height = 18
+        Top = 91
+        Width = 608
         Align = alBottom
         Align = alBottom
         Caption = 'Corrected hue and lightness'
         Caption = 'Corrected hue and lightness'
         OnChange = CheckBox_GSBAChange
         OnChange = CheckBox_GSBAChange
@@ -250,41 +251,41 @@ object FFilterFunction: TFFilterFunction
       end
       end
       object PanelLabelHSL: TPanel
       object PanelLabelHSL: TPanel
         Left = 6
         Left = 6
-        Height = 120
+        Height = 79
         Top = 6
         Top = 6
-        Width = 6
+        Width = 4
         Align = alLeft
         Align = alLeft
         AutoSize = True
         AutoSize = True
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.VerticalSpacing = 6
         ChildSizing.VerticalSpacing = 6
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 120
-        ClientWidth = 6
+        ClientHeight = 79
+        ClientWidth = 4
         TabOrder = 2
         TabOrder = 2
         object Label_HueEquals: TLabel
         object Label_HueEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
+          Height = 16
           Top = 0
           Top = 0
-          Width = 6
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_SaturationEquals: TLabel
         object Label_SaturationEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 30
-          Width = 6
+          Height = 16
+          Top = 22
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_LightnessEquals: TLabel
         object Label_LightnessEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 60
-          Width = 6
+          Height = 16
+          Top = 44
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
@@ -296,13 +297,13 @@ object FFilterFunction: TFFilterFunction
       ChildSizing.LeftRightSpacing = 6
       ChildSizing.LeftRightSpacing = 6
       ChildSizing.TopBottomSpacing = 6
       ChildSizing.TopBottomSpacing = 6
       ChildSizing.VerticalSpacing = 6
       ChildSizing.VerticalSpacing = 6
-      ClientHeight = 166
-      ClientWidth = 614
+      ClientHeight = 115
+      ClientWidth = 620
       object PanelLab: TPanel
       object PanelLab: TPanel
-        Left = 12
-        Height = 154
+        Left = 10
+        Height = 103
         Top = 6
         Top = 6
-        Width = 596
+        Width = 604
         Align = alClient
         Align = alClient
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.HorizontalSpacing = 6
         ChildSizing.HorizontalSpacing = 6
@@ -310,14 +311,14 @@ object FFilterFunction: TFFilterFunction
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.EnlargeHorizontal = crsScaleChilds
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 154
-        ClientWidth = 596
+        ClientHeight = 103
+        ClientWidth = 604
         TabOrder = 0
         TabOrder = 0
         object Edit_L: TEdit
         object Edit_L: TEdit
           Left = 0
           Left = 0
-          Height = 36
+          Height = 22
           Top = 0
           Top = 0
-          Width = 596
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_LChange
           OnChange = Edit_LChange
           ParentFont = False
           ParentFont = False
@@ -325,9 +326,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_a: TEdit
         object Edit_a: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 42
-          Width = 596
+          Height = 22
+          Top = 28
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_aChange
           OnChange = Edit_aChange
           ParentFont = False
           ParentFont = False
@@ -335,9 +336,9 @@ object FFilterFunction: TFFilterFunction
         end
         end
         object Edit_b: TEdit
         object Edit_b: TEdit
           Left = 0
           Left = 0
-          Height = 36
-          Top = 84
-          Width = 596
+          Height = 22
+          Top = 56
+          Width = 604
           AutoSize = False
           AutoSize = False
           OnChange = Edit_bChange
           OnChange = Edit_bChange
           ParentFont = False
           ParentFont = False
@@ -346,41 +347,41 @@ object FFilterFunction: TFFilterFunction
       end
       end
       object PanelLabelLab: TPanel
       object PanelLabelLab: TPanel
         Left = 6
         Left = 6
-        Height = 154
+        Height = 103
         Top = 6
         Top = 6
-        Width = 6
+        Width = 4
         Align = alLeft
         Align = alLeft
         AutoSize = True
         AutoSize = True
         BevelOuter = bvNone
         BevelOuter = bvNone
         ChildSizing.VerticalSpacing = 6
         ChildSizing.VerticalSpacing = 6
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.Layout = cclLeftToRightThenTopToBottom
         ChildSizing.ControlsPerLine = 1
         ChildSizing.ControlsPerLine = 1
-        ClientHeight = 154
-        ClientWidth = 6
+        ClientHeight = 103
+        ClientWidth = 4
         TabOrder = 1
         TabOrder = 1
         object Label_LEquals: TLabel
         object Label_LEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
+          Height = 16
           Top = 0
           Top = 0
-          Width = 6
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_aEquals: TLabel
         object Label_aEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 30
-          Width = 6
+          Height = 16
+          Top = 22
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
         end
         end
         object Label_bEquals: TLabel
         object Label_bEquals: TLabel
           Left = 0
           Left = 0
-          Height = 24
-          Top = 60
-          Width = 6
+          Height = 16
+          Top = 44
+          Width = 4
           Caption = '.'
           Caption = '.'
           ParentColor = False
           ParentColor = False
           ParentFont = False
           ParentFont = False
@@ -389,25 +390,37 @@ object FFilterFunction: TFFilterFunction
     end
     end
   end
   end
   object Label_Variables: TLabel
   object Label_Variables: TLabel
-    Left = 14
-    Height = 24
-    Top = 12
-    Width = 104
+    Left = 9
+    Height = 16
+    Top = 8
+    Width = 63
     Caption = 'Variables :'
     Caption = 'Variables :'
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 21
+    Height = 18
+    Top = 217
+    Width = 82
+    Anchors = [akLeft, akBottom]
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 4
+  end
   object Timer1: TTimer
   object Timer1: TTimer
     Enabled = False
     Enabled = False
     Interval = 30
     Interval = 30
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 300
-    top = 60
+    Left = 144
+    Top = 8
   end
   end
   object Timer_AdjustVerticalSize: TTimer
   object Timer_AdjustVerticalSize: TTimer
     Interval = 20
     Interval = 20
     OnTimer = Timer_AdjustVerticalSizeTimer
     OnTimer = Timer_AdjustVerticalSizeTimer
-    left = 452
-    top = 25
+    Left = 488
+    Top = 8
   end
   end
 end
 end

+ 4 - 3
lazpaint/dialog/filter/ufilterfunction.lrj

@@ -1,7 +1,7 @@
 {"version":1,"strings":[
 {"version":1,"strings":[
 {"hash":221847054,"name":"tffilterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110],"value":"Apply function"},
 {"hash":221847054,"name":"tffilterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110],"value":"Apply function"},
-{"hash":1339,"name":"tffilterfunction.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tffilterfunction.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
+{"hash":497723,"name":"tffilterfunction.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tffilterfunction.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
 {"hash":46,"name":"tffilterfunction.label_alphaequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_alphaequals.caption","sourcebytes":[46],"value":"."},
 {"hash":22194,"name":"tffilterfunction.tabsheet_rgb.caption","sourcebytes":[82,71,66],"value":"RGB"},
 {"hash":22194,"name":"tffilterfunction.tabsheet_rgb.caption","sourcebytes":[82,71,66],"value":"RGB"},
 {"hash":193524366,"name":"tffilterfunction.checkbox_gamma.caption","sourcebytes":[71,97,109,109,97,32,99,111,114,114,101,99,116,105,111,110],"value":"Gamma correction"},
 {"hash":193524366,"name":"tffilterfunction.checkbox_gamma.caption","sourcebytes":[71,97,109,109,97,32,99,111,114,114,101,99,116,105,111,110],"value":"Gamma correction"},
@@ -17,5 +17,6 @@
 {"hash":46,"name":"tffilterfunction.label_lequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_lequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_aequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_aequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_bequals.caption","sourcebytes":[46],"value":"."},
 {"hash":46,"name":"tffilterfunction.label_bequals.caption","sourcebytes":[46],"value":"."},
-{"hash":133057994,"name":"tffilterfunction.label_variables.caption","sourcebytes":[86,97,114,105,97,98,108,101,115,32,58],"value":"Variables :"}
+{"hash":133057994,"name":"tffilterfunction.label_variables.caption","sourcebytes":[86,97,114,105,97,98,108,101,115,32,58],"value":"Variables :"},
+{"hash":126662215,"name":"tffilterfunction.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 43 - 6
lazpaint/dialog/filter/ufilterfunction.pas

@@ -22,6 +22,7 @@ type
   TFFilterFunction = class(TForm)
   TFFilterFunction = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     CheckBox_Gamma: TCheckBox;
     CheckBox_Gamma: TCheckBox;
     CheckBox_GSBA: TCheckBox;
     CheckBox_GSBA: TCheckBox;
     Edit_Alpha: TEdit;
     Edit_Alpha: TEdit;
@@ -61,6 +62,7 @@ type
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_GammaChange(Sender: TObject);
     procedure CheckBox_GammaChange(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure Edit_aChange(Sender: TObject);
     procedure Edit_aChange(Sender: TObject);
     procedure Edit_AlphaChange(Sender: TObject);
     procedure Edit_AlphaChange(Sender: TObject);
     procedure Edit_bChange(Sender: TObject);
     procedure Edit_bChange(Sender: TObject);
@@ -85,7 +87,8 @@ type
     FRedError, FGreenError, FBlueError, FAlphaError,
     FRedError, FGreenError, FBlueError, FAlphaError,
     FHueError, FSaturationError, FLightnessError,
     FHueError, FSaturationError, FLightnessError,
     FLError, FaError, FbError: boolean;
     FLError, FaError, FbError: boolean;
-    FComputing: boolean;
+    FComputing,
+    FComputationRestarted: boolean;
     FSourceAsLab: TLabABitmap;
     FSourceAsLab: TLabABitmap;
     FComputedImage: TBGRABitmap;
     FComputedImage: TBGRABitmap;
     FComputedLines: integer;
     FComputedLines: integer;
@@ -96,6 +99,7 @@ type
         count: integer;
         count: integer;
         computed: boolean;
         computed: boolean;
       end;
       end;
+    procedure DisplayComputedImage;
     procedure UpdateExpr(AExpr: TFPExpressionParser; AEdit: TEdit;
     procedure UpdateExpr(AExpr: TFPExpressionParser; AEdit: TEdit;
       var AError: boolean);
       var AError: boolean);
     procedure InitParams;
     procedure InitParams;
@@ -115,7 +119,7 @@ function ShowFilterFunctionDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses UMac, LazPaintType, math;
+uses UMac, LazPaintType, UResourceStrings, math;
 
 
 function ShowFilterFunctionDlg(AFilterConnector: TObject): TScriptResult;
 function ShowFilterFunctionDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -233,7 +237,10 @@ begin
   Label_bEquals.Caption := 'b (-1..1) = ';
   Label_bEquals.Caption := 'b (-1..1) = ';
   Label_Variables.Caption := Label_Variables.Caption+' x,y,width,height,random,min,max,avg';
   Label_Variables.Caption := Label_Variables.Caption+' x,y,width,height,random,min,max,avg';
 
 
+  FComputedImage := nil;
   StatsNotComputed(low(FStats), high(FStats));
   StatsNotComputed(low(FStats), high(FStats));
+
+  PageControl_Color.ActivePage := TabSheet_RGB;
 end;
 end;
 
 
 procedure TFFilterFunction.FormDestroy(Sender: TObject);
 procedure TFFilterFunction.FormDestroy(Sender: TObject);
@@ -503,8 +510,10 @@ begin
   if FComputing then
   if FComputing then
   begin
   begin
     if FComputedImage = nil then
     if FComputedImage = nil then
-    begin
       FComputedImage := TBGRABitmap.Create(FFilterConnector.BackupLayer.Width,FFilterConnector.BackupLayer.Height);
       FComputedImage := TBGRABitmap.Create(FFilterConnector.BackupLayer.Width,FFilterConnector.BackupLayer.Height);
+    if FComputationRestarted then
+    begin
+      FComputationRestarted := false;
       FComputedLines := FFilterConnector.WorkArea.Top;
       FComputedLines := FFilterConnector.WorkArea.Top;
       FFilterConnector.RestoreBackup;
       FFilterConnector.RestoreBackup;
     end;
     end;
@@ -699,12 +708,13 @@ begin
 
 
       end;
       end;
     end;
     end;
-    FFilterConnector.PutImage(FComputedImage, rect(0,prevComputedLines,FComputedImage.Width,FComputedLines), True,False);
+    if CheckBox_Preview.Checked then
+      FFilterConnector.PutImage(FComputedImage, rect(0,prevComputedLines,FComputedImage.Width,FComputedLines), True,False);
     if FComputedLines = FFilterConnector.WorkArea.Bottom then
     if FComputedLines = FFilterConnector.WorkArea.Bottom then
     begin
     begin
-      FreeAndNil(FComputedImage);
       FComputing := false;
       FComputing := false;
       Button_OK.Enabled := true;
       Button_OK.Enabled := true;
+      CheckBox_Preview.Enabled := true;
     end;
     end;
     Timer1.Interval := 15;
     Timer1.Interval := 15;
     Timer1.Enabled := True;
     Timer1.Enabled := True;
@@ -754,15 +764,17 @@ end;
 procedure TFFilterFunction.PreviewNeeded;
 procedure TFFilterFunction.PreviewNeeded;
 begin
 begin
   Timer1.Enabled := False;
   Timer1.Enabled := False;
-  FreeAndNil(FComputedImage);
   FComputing := false;
   FComputing := false;
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
+  FComputationRestarted := false;
 
 
   if not FAlphaError and not FGreenError and not FBlueError and not FRedError
   if not FAlphaError and not FGreenError and not FBlueError and not FRedError
     and not FHueError and not FSaturationError and not FLightnessError then
     and not FHueError and not FSaturationError and not FLightnessError then
   begin
   begin
     FComputing := True;
     FComputing := True;
     FComputedLines := 0;
     FComputedLines := 0;
+    FComputationRestarted := true;
     Timer1.Interval := 200;
     Timer1.Interval := 200;
     Timer1.Enabled := True;
     Timer1.Enabled := True;
   end;
   end;
@@ -798,6 +810,8 @@ begin
       if IsDefined('b') then Edit_Lightness.Text := Strings['b'];
       if IsDefined('b') then Edit_Lightness.Text := Strings['b'];
       if IsDefined('GammaCorrection') then CheckBox_Gamma.Checked:= Booleans['GammaCorrection'];
       if IsDefined('GammaCorrection') then CheckBox_Gamma.Checked:= Booleans['GammaCorrection'];
       if IsDefined('CorrectedHue') then CheckBox_GSBA.Checked:= Booleans['CorrectedHue'];
       if IsDefined('CorrectedHue') then CheckBox_GSBA.Checked:= Booleans['CorrectedHue'];
+      if IsDefined('Red') or IsDefined('Green') or IsDefined('Blue') then
+        PageControl_Color.ActivePage := TabSheet_RGB else
       if IsDefined('Hue') or IsDefined('Saturation') or IsDefined('Lightness') then
       if IsDefined('Hue') or IsDefined('Saturation') or IsDefined('Lightness') then
         PageControl_Color.ActivePage := TabSheet_HSL else
         PageControl_Color.ActivePage := TabSheet_HSL else
       if IsDefined('L') or IsDefined('a') or IsDefined('b') then
       if IsDefined('L') or IsDefined('a') or IsDefined('b') then
@@ -814,6 +828,11 @@ begin
   Edit_LChange(nil);
   Edit_LChange(nil);
   Edit_aChange(nil);
   Edit_aChange(nil);
   Edit_bChange(nil);
   Edit_bChange(nil);
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing:= false;
   FInitializing:= false;
 end;
 end;
 
 
@@ -1043,6 +1062,9 @@ end;
 
 
 procedure TFFilterFunction.Button_OKClick(Sender: TObject);
 procedure TFFilterFunction.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then
+    DisplayComputedImage;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.ValidateAction;
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
@@ -1066,6 +1088,21 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TFFilterFunction.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage,True,False);
+end;
+
+procedure TFFilterFunction.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+    FFilterConnector.RestoreBackup;
+end;
+
 procedure TFFilterFunction.Edit_aChange(Sender: TObject);
 procedure TFFilterFunction.Edit_aChange(Sender: TObject);
 begin
 begin
   UpdateExpr(FaExpr,Edit_a,FaError);
   UpdateExpr(FaExpr,Edit_a,FaError);

+ 28 - 27
lazpaint/dialog/filter/uformrain.lfm

@@ -20,20 +20,20 @@ object FRain: TFRain
   OnHide = FormHide
   OnHide = FormHide
   OnShow = FormShow
   OnShow = FormShow
   Position = poMainFormCenter
   Position = poMainFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Label_Wind: TLabel
   object Label_Wind: TLabel
     Left = 8
     Left = 8
-    Height = 20
+    Height = 15
     Top = 8
     Top = 8
-    Width = 124
+    Width = 130
     Caption = 'Wind :'
     Caption = 'Wind :'
     ParentColor = False
     ParentColor = False
   end
   end
   object PaintBox_Wind: TPaintBox
   object PaintBox_Wind: TPaintBox
     Left = 8
     Left = 8
     Height = 105
     Height = 105
-    Top = 36
-    Width = 124
+    Top = 31
+    Width = 130
     OnMouseDown = PaintBox_WindMouseDown
     OnMouseDown = PaintBox_WindMouseDown
     OnMouseMove = PaintBox_WindMouseMove
     OnMouseMove = PaintBox_WindMouseMove
     OnMouseUp = PaintBox_WindMouseUp
     OnMouseUp = PaintBox_WindMouseUp
@@ -41,29 +41,30 @@ object FRain: TFRain
   end
   end
   object Label_Quantity: TLabel
   object Label_Quantity: TLabel
     Left = 8
     Left = 8
-    Height = 20
-    Top = 149
-    Width = 124
+    Height = 15
+    Top = 144
+    Width = 130
     Caption = 'Quantity:'
     Caption = 'Quantity:'
     ParentColor = False
     ParentColor = False
   end
   end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 177
-    Width = 124
+    Top = 167
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object TrackBar_Quantity: TTrackBar
     object TrackBar_Quantity: TTrackBar
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 124
+      Width = 130
       Frequency = 100
       Frequency = 100
       Max = 100
       Max = 100
-      PageSize = 200
+      OnChange = TrackBar_QuantityChange
+      PageSize = 10
       Position = 0
       Position = 0
       ScalePos = trRight
       ScalePos = trRight
       Align = alClient
       Align = alClient
@@ -72,35 +73,35 @@ object FRain: TFRain
   end
   end
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
-    Height = 30
-    Top = 210
-    Width = 124
+    Height = 25
+    Top = 200
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 30
-    ClientWidth = 124
+    ClientHeight = 25
+    ClientWidth = 130
     TabOrder = 0
     TabOrder = 0
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
-      Height = 30
+      Height = 25
       Top = 0
       Top = 0
-      Width = 46
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 54
-      Height = 30
+      Left = 59
+      Height = 25
       Top = 0
       Top = 0
-      Width = 70
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end
@@ -109,7 +110,7 @@ object FRain: TFRain
     Enabled = False
     Enabled = False
     Interval = 100
     Interval = 100
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 96
-    top = 40
+    Left = 96
+    Top = 40
   end
   end
 end
 end

+ 2 - 2
lazpaint/dialog/filter/uformrain.lrj

@@ -2,6 +2,6 @@
 {"hash":362494,"name":"tfrain.caption","sourcebytes":[82,97,105,110],"value":"Rain"},
 {"hash":362494,"name":"tfrain.caption","sourcebytes":[82,97,105,110],"value":"Rain"},
 {"hash":98584122,"name":"tfrain.label_wind.caption","sourcebytes":[87,105,110,100,32,58],"value":"Wind :"},
 {"hash":98584122,"name":"tfrain.label_wind.caption","sourcebytes":[87,105,110,100,32,58],"value":"Wind :"},
 {"hash":140202874,"name":"tfrain.label_quantity.caption","sourcebytes":[81,117,97,110,116,105,116,121,58],"value":"Quantity:"},
 {"hash":140202874,"name":"tfrain.label_quantity.caption","sourcebytes":[81,117,97,110,116,105,116,121,58],"value":"Quantity:"},
-{"hash":1339,"name":"tfrain.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfrain.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":497723,"name":"tfrain.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfrain.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 11 - 1
lazpaint/dialog/filter/uformrain.pas

@@ -37,6 +37,7 @@ type
       {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
       {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
     procedure PaintBox_WindPaint(Sender: TObject);
     procedure PaintBox_WindPaint(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
+    procedure TrackBar_QuantityChange(Sender: TObject);
   private
   private
     { private declarations }
     { private declarations }
     wind: single;
     wind: single;
@@ -64,7 +65,7 @@ function ShowRainDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses LCScaleDPI, umac, LazPaintType;
+uses LCScaleDPI, umac, LazPaintType, UResourceStrings;
 
 
 function ShowRainDlg(AFilterConnector: TObject): TScriptResult;
 function ShowRainDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -128,6 +129,9 @@ begin
   PreviewNeeded;
   PreviewNeeded;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left;
   Timer1.Enabled := true;
   Timer1.Enabled := true;
+
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
 end;
 end;
 
 
 procedure TFRain.PaintBox_WindMouseDown(Sender: TObject; Button: TMouseButton;
 procedure TFRain.PaintBox_WindMouseDown(Sender: TObject; Button: TMouseButton;
@@ -189,6 +193,12 @@ begin
   Timer1.Enabled:= true;
   Timer1.Enabled:= true;
 end;
 end;
 
 
+procedure TFRain.TrackBar_QuantityChange(Sender: TObject);
+begin
+  FreeAndNil(FRenderer);
+  PreviewNeeded;
+end;
+
 function TFRain.GetRainRenderer: TRainRenderer;
 function TFRain.GetRainRenderer: TRainRenderer;
 begin
 begin
   if FRenderer = nil then
   if FRenderer = nil then

+ 102 - 0
lazpaint/dialog/filter/uhypocycloid.lfm

@@ -0,0 +1,102 @@
+object FHypocycloid: TFHypocycloid
+  Left = 989
+  Height = 90
+  Top = 156
+  Width = 203
+  AutoSize = True
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'Hypocycloid'
+  ChildSizing.LeftRightSpacing = 8
+  ChildSizing.TopBottomSpacing = 8
+  ChildSizing.HorizontalSpacing = 8
+  ChildSizing.VerticalSpacing = 8
+  ChildSizing.Layout = cclLeftToRightThenTopToBottom
+  ChildSizing.ControlsPerLine = 1
+  ClientHeight = 90
+  ClientWidth = 203
+  OnCreate = FormCreate
+  OnHide = FormHide
+  OnShow = FormShow
+  Position = poScreenCenter
+  LCLVersion = '2.2.6.0'
+  object Panel1: TPanel
+    Left = 8
+    Height = 21
+    Top = 8
+    Width = 130
+    BevelOuter = bvNone
+    ChildSizing.HorizontalSpacing = 8
+    ChildSizing.Layout = cclLeftToRightThenTopToBottom
+    ChildSizing.ControlsPerLine = 2
+    ClientHeight = 21
+    ClientWidth = 130
+    TabOrder = 0
+    object Label_Amount: TLabel
+      Left = 0
+      Height = 21
+      Top = 0
+      Width = 42
+      Caption = 'Cusps:'
+      Layout = tlCenter
+      ParentColor = False
+    end
+    object SpinEdit_CuspCount: TSpinEdit
+      Left = 50
+      Height = 21
+      Top = 0
+      Width = 65
+      Constraints.MinWidth = 65
+      MaxValue = 20
+      MinValue = 1
+      OnChange = SpinEdit_CuspCountChange
+      TabOrder = 0
+      Value = 6
+    end
+  end
+  object Panel2: TPanel
+    Left = 8
+    Height = 20
+    Top = 37
+    Width = 130
+    BevelOuter = bvNone
+    ChildSizing.HorizontalSpacing = 8
+    ChildSizing.Layout = cclLeftToRightThenTopToBottom
+    ChildSizing.ControlsPerLine = 2
+    ClientHeight = 20
+    ClientWidth = 130
+    TabOrder = 1
+    object Button_OK: TButton
+      Left = 0
+      Height = 20
+      Top = 0
+      Width = 50
+      AutoSize = True
+      Caption = 'rsOK'
+      Default = True
+      Enabled = False
+      ModalResult = 1
+      OnClick = Button_OKClick
+      TabOrder = 0
+    end
+    object Button_Cancel: TButton
+      Left = 58
+      Height = 20
+      Top = 0
+      Width = 72
+      AutoSize = True
+      Cancel = True
+      Caption = 'rsCancel'
+      ModalResult = 2
+      OnClick = Button_CancelClick
+      TabOrder = 1
+    end
+  end
+  object TimerDisplay: TTimer
+    Enabled = False
+    Interval = 200
+    OnTimer = TimerDisplayTimer
+    Left = 152
+    Top = 24
+  end
+end

+ 6 - 0
lazpaint/dialog/filter/uhypocycloid.lrj

@@ -0,0 +1,6 @@
+{"version":1,"strings":[
+{"hash":178926244,"name":"tfhypocycloid.caption","sourcebytes":[72,121,112,111,99,121,99,108,111,105,100],"value":"Hypocycloid"},
+{"hash":78423914,"name":"tfhypocycloid.label_amount.caption","sourcebytes":[67,117,115,112,115,58],"value":"Cusps:"},
+{"hash":497723,"name":"tfhypocycloid.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfhypocycloid.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
+]}

+ 335 - 0
lazpaint/dialog/filter/uhypocycloid.pas

@@ -0,0 +1,335 @@
+unit uhypocycloid;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Spin,
+  LazPaintType, UStateType, UScripting, UResourceStrings, LCVectorOriginal, LCVectorPolyShapes;
+
+const
+  RenderName = 'hypocycloid';
+
+type
+
+  { TFHypocycloid }
+
+  TFHypocycloid = class(TForm)
+    Button_Cancel: TButton;
+    Button_OK: TButton;
+    Label_Amount: TLabel;
+    Panel1: TPanel;
+    Panel2: TPanel;
+    SpinEdit_CuspCount: TSpinEdit;
+    TimerDisplay: TTimer;
+    procedure Button_CancelClick(Sender: TObject);
+    procedure Button_OKClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormHide(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+    procedure SpinEdit_CuspCountChange(Sender: TObject);
+    procedure TimerDisplayTimer(Sender: TObject);
+  private
+    FComposeShape: TComposedImageDifference;
+    FUpdateLayer: boolean;
+    FInitializing: boolean;
+    FInstance: TLazPaintCustomInstance;
+    FParameters: TVariableSet;
+    FPreviewDone: boolean;
+    procedure InitParams;
+    procedure NeedPreview;
+    procedure DisplayShape;
+    procedure UpdateOriginal(AOriginal: TVectorOriginal; ACuspCount: integer);
+    function IsCorrespondingOriginal: boolean;
+  end;
+
+function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
+
+// create a hypocycloid shape
+function MakeHypocycloid(ASurfaceWidth, ASurfaceHeight: integer; ACuspCount: integer): TVectorShape;
+
+implementation
+
+uses LCScaleDPI, UMac, UImageAction, BGRABitmapTypes, UImageDiff, BGRATransform, Math;
+
+{$R *.lfm}
+
+function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
+var
+  FHypocycloid: TFHypocycloid;
+  doFound, somethingDone: boolean;
+begin
+  FHypocycloid:= TFHypocycloid.create(nil);
+  FHypocycloid.FInstance := AInstance;
+  FHypocycloid.FParameters := AParameters;
+  try
+    TImageActions(AInstance.ImageAction).Deselect;
+
+    if Assigned(AParameters) and
+      AParameters.Booleans['Validate'] then
+    begin
+      AInstance.Image.DoBegin;
+      FHypocycloid.InitParams;
+      FHypocycloid.DisplayShape;
+      AInstance.Image.DoEnd(doFound, somethingDone);
+      result := srOk;
+    end else
+    begin
+      if FHypocycloid.showModal = mrOk then result := srOk
+      else result := srCancelledByUser;
+    end;
+  finally
+    FHypocycloid.free;
+  end;
+end;
+
+function MakeHypocycloid(ASurfaceWidth, ASurfaceHeight: integer; ACuspCount: integer): TVectorShape;
+
+  // center of the small circle
+  function HypocycloidCenterAt(phi, nR, r: Double): TPointF;
+  begin
+    result.x := (nR - r) * cos(phi);
+    result.y := (nR - r) * sin(phi);
+  end;
+
+  // hypocycloid position is on the small circle
+  function HypocycloidAt(phi, nR, r: Double): TPointF;
+  begin
+    result := HypocycloidCenterAt(phi, nR, R)
+    + PointF(  r * cos((nR - r) / r * phi),
+             - r * sin((nR - r) / r * phi) );
+  end;
+
+var
+  t: Double;
+  shape: TCurveShape;
+  center: TPointF;
+  nR: Double; // radius of bounding circle
+  r: Double; // radius of small circle
+  nbPoints, i: integer;
+
+begin
+  center := PointF(ASurfaceWidth / 2,
+                   ASurfaceHeight / 2);
+  nR := Math.Min(ASurfaceWidth, ASurfaceHeight) * 0.4;
+  r := nR / ACuspCount;
+
+  shape := TCurveShape.Create(nil);
+  shape.PenColor := CSSRed;
+  shape.PenWidth := 3;
+  shape.Closed := true;
+
+  nbPoints := ACuspCount * 8;
+  for i := 0 to nbPoints - 1 do
+  begin
+    t := i/nbPoints*2*Pi;
+    shape.AddPoint(HypocycloidAt(t, nR, r) + center);
+  end;
+
+  result := shape;
+end;
+
+{ TFHypocycloid }
+
+procedure TFHypocycloid.FormCreate(Sender: TObject);
+begin
+  ScaleControl(Self,OriginalDPI);
+
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
+
+  CheckOKCancelBtns(Button_OK{,Button_Cancel});
+  CheckSpinEdit(SpinEdit_CuspCount);
+
+  FComposeShape := nil;
+  FPreviewDone := false;
+end;
+
+procedure TFHypocycloid.Button_OKClick(Sender: TObject);
+begin
+  TimerDisplay.Enabled := false;
+  if not FPreviewDone then DisplayShape;
+end;
+
+procedure TFHypocycloid.Button_CancelClick(Sender: TObject);
+begin
+  TimerDisplay.Enabled := false;
+  if Assigned(FComposeShape) then
+  begin
+    FInstance.Image.Undo;
+    FComposeShape := nil;
+  end;
+end;
+
+procedure TFHypocycloid.FormHide(Sender: TObject);
+begin
+  if Assigned(FComposeShape) then
+  begin
+    If ModalResult <> mrOk then
+       FInstance.Image.Undo;
+    FComposeShape := nil;
+  end;
+end;
+
+procedure TFHypocycloid.FormShow(Sender: TObject);
+begin
+  InitParams;
+  NeedPreview;
+end;
+
+procedure TFHypocycloid.SpinEdit_CuspCountChange(Sender: TObject);
+begin
+  NeedPreview;
+end;
+
+procedure TFHypocycloid.TimerDisplayTimer(Sender: TObject);
+begin
+  TimerDisplay.Enabled:= false;
+  DisplayShape;
+end;
+
+procedure TFHypocycloid.InitParams;
+var
+  isOriginal: Boolean;
+  layerIndex, cuspCount, errPos: Integer;
+  cuspCountStr: RawByteString;
+begin
+  FInitializing := true;
+
+  // default parameters
+  cuspCount := FInstance.Config.DefaultCuspCount;
+
+  // parameters from current layer
+  layerIndex := FInstance.Image.CurrentLayerIndex;
+  if IsCorrespondingOriginal then
+  begin
+    cuspCountStr := FInstance.Image.GetLayerRegistry(layerIndex, 'cusp-count');
+    val(cuspCountStr, cuspCount, errPos);
+    if errPos = 0 then
+      SpinEdit_CuspCount.Value := cuspCount;
+    FUpdateLayer:= true;
+  end
+  else
+    FUpdateLayer:= false;
+
+  // supplied parameters to script function
+  if Assigned(FParameters) and
+    FParameters.IsDefined('CuspCount') then
+    cuspCount := FParameters.Integers['CuspCount'];
+
+  SpinEdit_CuspCount.Value := cuspCount;
+
+  FInitializing := false;
+end;
+
+procedure TFHypocycloid.NeedPreview;
+begin
+  TimerDisplay.Enabled := false;
+  TimerDisplay.Enabled := true;
+  FPreviewDone := false;
+  Button_OK.Enabled := false;
+end;
+
+procedure TFHypocycloid.DisplayShape;
+var
+  original, prevOriginal: TVectorOriginal;
+  curIndex, cuspCount: Integer;
+begin
+  FPreviewDone := true;
+
+  // cancel the preview
+  if Assigned(FComposeShape) then
+  begin
+    FInstance.Image.Undo;
+    FComposeShape := nil;
+  end;
+
+  // chosen parameters
+  cuspCount := SpinEdit_CuspCount.Value;
+
+  // make a new preview
+  FComposeShape := FInstance.Image.DoBegin;
+  try
+    // if there is already a corresponding layer
+    if FUpdateLayer then
+    begin
+      curIndex := FInstance.Image.CurrentLayerIndex;
+      prevOriginal := FInstance.Image.LayerOriginal[curIndex] as TVectorOriginal;
+
+      // record changes made inside the original
+      FInstance.Image.CurrentState.DiscardOriginalDiff:= false;
+      UpdateOriginal(prevOriginal, cuspCount);
+      FInstance.Image.CurrentState.DiscardOriginalDiff:= true;
+    end else
+    begin
+      // create a new layer
+      original := TVectorOriginal.Create;
+      UpdateOriginal(original, cuspCount);
+
+      // if current layer is empty, replace it
+      if FInstance.Image.CurrentLayerEmpty then
+      begin
+        curIndex := FInstance.Image.CurrentLayerIndex;
+        FInstance.Image.AddUndo(
+          TReplaceLayerByCustomOriginalDifference.Create(FInstance.Image.CurrentState,
+            FInstance.Image.CurrentLayerIndex, true, original));
+        FInstance.Image.ImageMayChangeCompletely;
+        FInstance.Image.LayerName[curIndex] := Caption;
+      end
+      else
+      begin
+        // otherwise add the new layer
+        FInstance.Image.AddNewLayer(original, Caption, boTransparent, AffineMatrixIdentity);
+        curIndex := FInstance.Image.CurrentLayerIndex;
+      end;
+
+      FInstance.Image.SetLayerRegistry(curIndex, 'render-name', RenderName);
+    end;
+
+    // update the parameters saved in the layer
+    FInstance.Image.SetLayerRegistry(curIndex, 'cusp-count', IntToStr(cuspCount));
+
+    Button_OK.Enabled := true;
+  finally
+    FInstance.Image.DoEnd(FComposeShape);
+  end;
+end;
+
+procedure TFHypocycloid.UpdateOriginal(AOriginal: TVectorOriginal; ACuspCount: integer);
+var
+  shape, prevShape: TCurveShape;
+  i: Integer;
+begin
+  // create prototype shape
+  shape := MakeHypocycloid(FInstance.Image.Width, FInstance.Image.Height,
+                           ACuspCount) as TCurveShape;
+
+  // find the existing hypocycloid
+  for i := 0 to AOriginal.ShapeCount-1 do
+    if AOriginal.Shape[i] is TCurveShape then
+    begin
+      prevShape := AOriginal.Shape[i] as TCurveShape;
+      prevShape.Clear;
+      prevShape.AddPointRange(shape.GetPointRange);
+      FreeAndNil(shape);
+      break;
+    end;
+
+  // if the shape wasn't found, add the prototype
+  if Assigned(shape) then
+    AOriginal.AddShape(shape);
+end;
+
+function TFHypocycloid.IsCorrespondingOriginal: boolean;
+var
+  curIndex: Integer;
+begin
+  curIndex := FInstance.Image.CurrentLayerIndex;
+  result :=
+    (FInstance.Image.LayerOriginalClass[curIndex] = TVectorOriginal) and
+    (FInstance.Image.GetLayerRegistry(curIndex, 'render-name') = RenderName)
+end;
+
+end.
+

+ 29 - 18
lazpaint/dialog/filter/umotionblur.lfm

@@ -1,6 +1,6 @@
 object FMotionBlur: TFMotionBlur
 object FMotionBlur: TFMotionBlur
   Left = 438
   Left = 438
-  Height = 217
+  Height = 236
   Top = 173
   Top = 173
   Width = 148
   Width = 148
   AutoSize = True
   AutoSize = True
@@ -13,25 +13,26 @@ object FMotionBlur: TFMotionBlur
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 217
+  ClientHeight = 236
   ClientWidth = 148
   ClientWidth = 148
   Font.Height = -12
   Font.Height = -12
   OnCloseQuery = FormCloseQuery
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
   OnCreate = FormCreate
+  OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
     Height = 23
     Height = 23
     Top = 8
     Top = 8
-    Width = 124
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 23
     ClientHeight = 23
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object Label_Distance: TLabel
     object Label_Distance: TLabel
       Left = 0
       Left = 0
@@ -51,7 +52,6 @@ object FMotionBlur: TFMotionBlur
       DecimalPlaces = 1
       DecimalPlaces = 1
       Increment = 3
       Increment = 3
       MaxValue = 1000
       MaxValue = 1000
-      MinValue = 0
       OnChange = SpinEdit_DistanceChange
       OnChange = SpinEdit_DistanceChange
       TabOrder = 0
       TabOrder = 0
       Value = 5
       Value = 5
@@ -61,7 +61,7 @@ object FMotionBlur: TFMotionBlur
     Left = 8
     Left = 8
     Height = 19
     Height = 19
     Top = 39
     Top = 39
-    Width = 124
+    Width = 130
     Caption = 'Oriented'
     Caption = 'Oriented'
     Checked = True
     Checked = True
     OnChange = Checkbox_OrientedChange
     OnChange = Checkbox_OrientedChange
@@ -72,43 +72,54 @@ object FMotionBlur: TFMotionBlur
     Left = 8
     Left = 8
     Height = 105
     Height = 105
     Top = 66
     Top = 66
-    Width = 124
+    Width = 130
     OnMouseDown = PaintBox1MouseDown
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseMove = PaintBox1MouseMove
     OnMouseUp = PaintBox1MouseUp
     OnMouseUp = PaintBox1MouseUp
     OnPaint = PaintBox1Paint
     OnPaint = PaintBox1Paint
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 179
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 3
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 179
-    Width = 124
+    Top = 206
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 2
     TabOrder = 2
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end
@@ -117,7 +128,7 @@ object FMotionBlur: TFMotionBlur
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 112
-    top = 96
+    Left = 112
+    Top = 96
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/filter/umotionblur.lrj

@@ -2,6 +2,7 @@
 {"hash":106100930,"name":"tfmotionblur.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114],"value":"Motion blur"},
 {"hash":106100930,"name":"tfmotionblur.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114],"value":"Motion blur"},
 {"hash":176170906,"name":"tfmotionblur.label_distance.caption","sourcebytes":[68,105,115,116,97,110,99,101,32,58],"value":"Distance :"},
 {"hash":176170906,"name":"tfmotionblur.label_distance.caption","sourcebytes":[68,105,115,116,97,110,99,101,32,58],"value":"Distance :"},
 {"hash":150757332,"name":"tfmotionblur.checkbox_oriented.caption","sourcebytes":[79,114,105,101,110,116,101,100],"value":"Oriented"},
 {"hash":150757332,"name":"tfmotionblur.checkbox_oriented.caption","sourcebytes":[79,114,105,101,110,116,101,100],"value":"Oriented"},
-{"hash":1339,"name":"tfmotionblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfmotionblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfmotionblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfmotionblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfmotionblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 61 - 3
lazpaint/dialog/filter/umotionblur.pas

@@ -17,6 +17,7 @@ type
   TFMotionBlur = class(TForm)
   TFMotionBlur = class(TForm)
     Button_OK: TButton;
     Button_OK: TButton;
     Button_Cancel: TButton;
     Button_Cancel: TButton;
+    CheckBox_Preview: TCheckBox;
     Checkbox_Oriented: TCheckBox;
     Checkbox_Oriented: TCheckBox;
     Panel1: TPanel;
     Panel1: TPanel;
     Panel2: TPanel;
     Panel2: TPanel;
@@ -26,8 +27,10 @@ type
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure Checkbox_OrientedChange(Sender: TObject);
     procedure Checkbox_OrientedChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
       {%H-}Shift: TShiftState; X, Y: Integer);
       {%H-}Shift: TShiftState; X, Y: Integer);
@@ -47,11 +50,15 @@ type
     selectingAngle: boolean;
     selectingAngle: boolean;
     InPaintBoxMouseMove: boolean;
     InPaintBoxMouseMove: boolean;
     PaintBoxMouseMovePos: TPoint;
     PaintBoxMouseMovePos: TPoint;
-    FQuitQuery: boolean;
+    FQuitQuery,
+    FInitializing, FComputed: boolean;
+    FComputedImage: TBGRABitmap;
     procedure UpdateStep;
     procedure UpdateStep;
     procedure ComputeAngle(X,Y: integer);
     procedure ComputeAngle(X,Y: integer);
     procedure InitParams;
     procedure InitParams;
+    procedure DisplayComputedImage;
     procedure PreviewNeeded;
     procedure PreviewNeeded;
+    procedure StoreComputedImage;
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
   end;
   end;
 
 
@@ -59,7 +66,7 @@ function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses BGRABitmapTypes, math, ugraph, umac, BGRAFilters;
+uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings, BGRAFilters;
 
 
 function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult;
 function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -186,6 +193,19 @@ begin
     angle := FVars.Floats['Angle']
     angle := FVars.Floats['Angle']
   else
   else
     angle := FFilterConnector.LazPaintInstance.Config.DefaultBlurMotionAngle;
     angle := FFilterConnector.LazPaintInstance.Config.DefaultBlurMotionAngle;
+
+  FInitializing := true;
+  CheckBox_Preview.Checked := true;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
+  FInitializing := false;
+end;
+
+procedure TFMotionBlur.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage, false, false);
 end;
 end;
 
 
 procedure TFMotionBlur.PreviewNeeded;
 procedure TFMotionBlur.PreviewNeeded;
@@ -195,6 +215,12 @@ begin
     Checkbox_Oriented.Checked));
     Checkbox_Oriented.Checked));
 end;
 end;
 
 
+procedure TFMotionBlur.StoreComputedImage;
+begin
+  if FComputed and (FComputedImage = nil) then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent
 procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent
   );
   );
 begin
 begin
@@ -205,7 +231,11 @@ begin
       if FThreadManager.ReadyToClose then
       if FThreadManager.ReadyToClose then
         Close
         Close
       else
       else
-        if AEvent = tmeCompletedTask then Button_OK.Enabled := true;
+        if AEvent = tmeCompletedTask then begin
+          Button_OK.Enabled := true;
+          CheckBox_Preview.Enabled := true;
+          FComputed := true;
+        end;
     end;
     end;
   tmeStartingNewTask:
   tmeStartingNewTask:
     begin
     begin
@@ -213,6 +243,12 @@ begin
       Timer1.Interval := 100;
       Timer1.Interval := 100;
       Timer1.Enabled := true;
       Timer1.Enabled := true;
       Button_OK.Enabled := false;
       Button_OK.Enabled := false;
+
+      FInitializing := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FreeAndNil(FComputedImage);
+      FInitializing := False;
     end;
     end;
   end;
   end;
 end;
 end;
@@ -225,6 +261,14 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckFloatSpinEdit(SpinEdit_Distance);
   CheckFloatSpinEdit(SpinEdit_Distance);
   SpinEdit_Distance.Constraints.MinWidth := DoScaleX(70, OriginalDPI);
   SpinEdit_Distance.Constraints.MinWidth := DoScaleX(70, OriginalDPI);
+
+  FComputed := false;
+  FComputedImage := nil;
+end;
+
+procedure TFMotionBlur.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FComputedImage);
 end;
 end;
 
 
 procedure TFMotionBlur.FormShow(Sender: TObject);
 procedure TFMotionBlur.FormShow(Sender: TObject);
@@ -262,6 +306,8 @@ end;
 
 
 procedure TFMotionBlur.Button_OKClick(Sender: TObject);
 procedure TFMotionBlur.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then
   if not FFilterConnector.ActionDone then
   begin
   begin
     FFilterConnector.ValidateAction;
     FFilterConnector.ValidateAction;
@@ -278,6 +324,18 @@ begin
   PreviewNeeded;
   PreviewNeeded;
 end;
 end;
 
 
+procedure TFMotionBlur.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+   begin
+     StoreComputedImage;
+     FFilterConnector.RestoreBackup;
+   end;
+end;
+
 procedure TFMotionBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 procedure TFMotionBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 begin
 begin
   FThreadManager.Quit;
   FThreadManager.Quit;

+ 44 - 33
lazpaint/dialog/filter/unoisefilter.lfm

@@ -1,6 +1,6 @@
 object FNoiseFilter: TFNoiseFilter
 object FNoiseFilter: TFNoiseFilter
   Left = 367
   Left = 367
-  Height = 125
+  Height = 144
   Top = 354
   Top = 354
   Width = 154
   Width = 154
   AutoSize = True
   AutoSize = True
@@ -13,7 +13,7 @@ object FNoiseFilter: TFNoiseFilter
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 125
+  ClientHeight = 144
   ClientWidth = 154
   ClientWidth = 154
   OnCloseQuery = FormCloseQuery
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
   OnCreate = FormCreate
@@ -21,31 +21,31 @@ object FNoiseFilter: TFNoiseFilter
   OnHide = FormHide
   OnHide = FormHide
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel3: TPanel
   object Panel3: TPanel
     Left = 8
     Left = 8
-    Height = 48
+    Height = 38
     Top = 8
     Top = 8
-    Width = 127
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 1
     ChildSizing.ControlsPerLine = 1
-    ClientHeight = 48
-    ClientWidth = 127
+    ClientHeight = 38
+    ClientWidth = 130
     TabOrder = 2
     TabOrder = 2
     object Radio_GrayscaleNoise: TRadioButton
     object Radio_GrayscaleNoise: TRadioButton
       Left = 0
       Left = 0
-      Height = 24
+      Height = 19
       Top = 0
       Top = 0
-      Width = 126
+      Width = 101
       Caption = 'Grayscale noise'
       Caption = 'Grayscale noise'
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Radio_RGBNoise: TRadioButton
     object Radio_RGBNoise: TRadioButton
       Left = 0
       Left = 0
-      Height = 24
-      Top = 24
-      Width = 126
+      Height = 19
+      Top = 19
+      Width = 101
       Caption = 'RGB noise'
       Caption = 'RGB noise'
       Checked = True
       Checked = True
       OnChange = Radio_NoiseChange
       OnChange = Radio_NoiseChange
@@ -55,29 +55,29 @@ object FNoiseFilter: TFNoiseFilter
   end
   end
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
-    Height = 28
-    Top = 64
-    Width = 127
+    Height = 23
+    Top = 54
+    Width = 130
     AutoSize = True
     AutoSize = True
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 28
-    ClientWidth = 127
+    ClientHeight = 23
+    ClientWidth = 130
     TabOrder = 0
     TabOrder = 0
     object Label_Opacity: TLabel
     object Label_Opacity: TLabel
       Left = 0
       Left = 0
-      Height = 28
+      Height = 23
       Top = 0
       Top = 0
-      Width = 54
+      Width = 44
       Caption = 'Opacity:'
       Caption = 'Opacity:'
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
     end
     end
     object SpinEdit_Alpha: TSpinEdit
     object SpinEdit_Alpha: TSpinEdit
-      Left = 62
-      Height = 28
+      Left = 52
+      Height = 23
       Top = 0
       Top = 0
       Width = 65
       Width = 65
       Constraints.MinWidth = 65
       Constraints.MinWidth = 65
@@ -89,38 +89,49 @@ object FNoiseFilter: TFNoiseFilter
       Value = 255
       Value = 255
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 85
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 3
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
-    Height = 30
-    Top = 100
-    Width = 127
+    Height = 25
+    Top = 112
+    Width = 130
     AutoSize = True
     AutoSize = True
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 30
-    ClientWidth = 127
+    ClientHeight = 25
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
-      Height = 30
+      Height = 25
       Top = 0
       Top = 0
-      Width = 46
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 54
-      Height = 30
+      Left = 59
+      Height = 25
       Top = 0
       Top = 0
-      Width = 70
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end

+ 3 - 2
lazpaint/dialog/filter/unoisefilter.lrj

@@ -3,6 +3,7 @@
 {"hash":243178037,"name":"tfnoisefilter.radio_grayscalenoise.caption","sourcebytes":[71,114,97,121,115,99,97,108,101,32,110,111,105,115,101],"value":"Grayscale noise"},
 {"hash":243178037,"name":"tfnoisefilter.radio_grayscalenoise.caption","sourcebytes":[71,114,97,121,115,99,97,108,101,32,110,111,105,115,101],"value":"Grayscale noise"},
 {"hash":74782245,"name":"tfnoisefilter.radio_rgbnoise.caption","sourcebytes":[82,71,66,32,110,111,105,115,101],"value":"RGB noise"},
 {"hash":74782245,"name":"tfnoisefilter.radio_rgbnoise.caption","sourcebytes":[82,71,66,32,110,111,105,115,101],"value":"RGB noise"},
 {"hash":108662442,"name":"tfnoisefilter.label_opacity.caption","sourcebytes":[79,112,97,99,105,116,121,58],"value":"Opacity:"},
 {"hash":108662442,"name":"tfnoisefilter.label_opacity.caption","sourcebytes":[79,112,97,99,105,116,121,58],"value":"Opacity:"},
-{"hash":1339,"name":"tfnoisefilter.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfnoisefilter.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfnoisefilter.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfnoisefilter.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfnoisefilter.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 38 - 13
lazpaint/dialog/filter/unoisefilter.pas

@@ -16,6 +16,7 @@ type
   TFNoiseFilter = class(TForm)
   TFNoiseFilter = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Opacity: TLabel;
     Label_Opacity: TLabel;
     Panel1: TPanel;
     Panel1: TPanel;
     Panel2: TPanel;
     Panel2: TPanel;
@@ -24,6 +25,7 @@ type
     Radio_RGBNoise: TRadioButton;
     Radio_RGBNoise: TRadioButton;
     SpinEdit_Alpha: TSpinEdit;
     SpinEdit_Alpha: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
     procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormHide(Sender: TObject);
     procedure FormHide(Sender: TObject);
@@ -36,18 +38,19 @@ type
     FComputedLayer: TBGRABitmap;
     FComputedLayer: TBGRABitmap;
     FClosing: boolean;
     FClosing: boolean;
     procedure InitParams;
     procedure InitParams;
+    procedure DisplayComputedImage;
   public
   public
     FInitializing: boolean;
     FInitializing: boolean;
     FFilterConnector: TFilterConnector;
     FFilterConnector: TFilterConnector;
     procedure ComputeFilteredLayer;
     procedure ComputeFilteredLayer;
-    procedure PreviewNeeded(ARecomputeRandom: boolean);
+    procedure DisplayPreview(ARecomputeRandom: boolean);
   end;
   end;
 
 
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType;
+uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType, UResourceStrings;
 
 
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -62,7 +65,7 @@ begin
         FNoiseFilter.FFilterConnector.Parameters.Booleans['Validate'] then
         FNoiseFilter.FFilterConnector.Parameters.Booleans['Validate'] then
       begin
       begin
         FNoiseFilter.InitParams;
         FNoiseFilter.InitParams;
-        FNoiseFilter.PreviewNeeded(true);
+        FNoiseFilter.DisplayPreview(true);
         FNoiseFilter.FFilterConnector.ValidateAction;
         FNoiseFilter.FFilterConnector.ValidateAction;
         result := srOk;
         result := srOk;
       end else
       end else
@@ -84,10 +87,22 @@ end;
 
 
 procedure TFNoiseFilter.Button_OKClick(Sender: TObject);
 procedure TFNoiseFilter.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then
+    DisplayComputedImage;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.ValidateAction;
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFNoiseFilter.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+    FFilterConnector.RestoreBackup;
+end;
+
 procedure TFNoiseFilter.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 procedure TFNoiseFilter.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 begin
 begin
   FClosing := true;
   FClosing := true;
@@ -106,7 +121,7 @@ end;
 procedure TFNoiseFilter.Radio_NoiseChange(Sender: TObject);
 procedure TFNoiseFilter.Radio_NoiseChange(Sender: TObject);
 begin
 begin
   if FInitializing then exit;
   if FInitializing then exit;
-  PreviewNeeded(true);
+  DisplayPreview(true);
 end;
 end;
 
 
 procedure TFNoiseFilter.FormCreate(Sender: TObject);
 procedure TFNoiseFilter.FormCreate(Sender: TObject);
@@ -124,7 +139,7 @@ begin
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
   FInitializing := false;
   FInitializing := false;
   InitParams;
   InitParams;
-  PreviewNeeded(True);
+  DisplayPreview(True);
 end;
 end;
 
 
 procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject);
 procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject);
@@ -132,7 +147,7 @@ begin
   if FInitializing or FClosing then exit;
   if FInitializing or FClosing then exit;
   if FComputedLayer = nil then ComputeFilteredLayer;
   if FComputedLayer = nil then ComputeFilteredLayer;
   FComputedLayer.AlphaFill(SpinEdit_Alpha.Value);
   FComputedLayer.AlphaFill(SpinEdit_Alpha.Value);
-  PreviewNeeded(False);
+  DisplayPreview(False);
 end;
 end;
 
 
 procedure TFNoiseFilter.InitParams;
 procedure TFNoiseFilter.InitParams;
@@ -153,9 +168,24 @@ begin
     if Booleans['Grayscale'] then Radio_GrayscaleNoise.Checked:= true;
     if Booleans['Grayscale'] then Radio_GrayscaleNoise.Checked:= true;
     if IsDefined('Opacity') then SpinEdit_Alpha.Value := Integers['Opacity'];
     if IsDefined('Opacity') then SpinEdit_Alpha.Value := Integers['Opacity'];
   end;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing:= false;
   FInitializing:= false;
 end;
 end;
 
 
+procedure TFNoiseFilter.DisplayComputedImage;
+begin
+  if SpinEdit_Alpha.Value <> 255 then
+  begin
+    FFilterConnector.RestoreBackup;
+    FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmDrawWithTransparency);
+  end else
+    FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmSet);
+end;
+
 procedure TFNoiseFilter.ComputeFilteredLayer;
 procedure TFNoiseFilter.ComputeFilteredLayer;
 var scan: TBGRARandomScanner;
 var scan: TBGRARandomScanner;
 begin
 begin
@@ -166,15 +196,10 @@ begin
   scan.Free;
   scan.Free;
 end;
 end;
 
 
-procedure TFNoiseFilter.PreviewNeeded(ARecomputeRandom: boolean);
+procedure TFNoiseFilter.DisplayPreview(ARecomputeRandom: boolean);
 begin
 begin
   if ARecomputeRandom or (FComputedLayer = nil) then ComputeFilteredLayer;
   if ARecomputeRandom or (FComputedLayer = nil) then ComputeFilteredLayer;
-  if SpinEdit_Alpha.Value <> 255 then
-  begin
-    FFilterConnector.RestoreBackup;
-    FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmDrawWithTransparency);
-  end else
-    FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmSet);
+  if CheckBox_Preview.Checked then DisplayComputedImage;
 end;
 end;
 
 
 end.
 end.

+ 23 - 12
lazpaint/dialog/filter/uphongfilter.lfm

@@ -1,25 +1,25 @@
 object FPhongFilter: TFPhongFilter
 object FPhongFilter: TFPhongFilter
   Left = 402
   Left = 402
-  Height = 191
+  Height = 210
   Top = 127
   Top = 127
   Width = 509
   Width = 509
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
   Caption = 'Shaded map'
   Caption = 'Shaded map'
-  ClientHeight = 191
+  ClientHeight = 210
   ClientWidth = 509
   ClientWidth = 509
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '1.1'
+  LCLVersion = '2.2.4.0'
   object Button_OK: TButton
   object Button_OK: TButton
     Left = 175
     Left = 175
     Height = 22
     Height = 22
-    Top = 162
+    Top = 181
     Width = 59
     Width = 59
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     Default = True
     OnClick = Button_OKClick
     OnClick = Button_OKClick
     TabOrder = 0
     TabOrder = 0
@@ -27,11 +27,11 @@ object FPhongFilter: TFPhongFilter
   object Button_Cancel: TButton
   object Button_Cancel: TButton
     Left = 241
     Left = 241
     Height = 22
     Height = 22
-    Top = 162
+    Top = 181
     Width = 73
     Width = 73
     Anchors = [akLeft, akBottom]
     Anchors = [akLeft, akBottom]
     Cancel = True
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     ModalResult = 2
     TabOrder = 1
     TabOrder = 1
   end
   end
@@ -71,7 +71,7 @@ object FPhongFilter: TFPhongFilter
     Top = 4
     Top = 4
     Width = 128
     Width = 128
     Caption = 'Color'
     Caption = 'Color'
-    ClientHeight = 88
+    ClientHeight = 86
     ClientWidth = 124
     ClientWidth = 124
     TabOrder = 3
     TabOrder = 3
     object Radio_UsePenColor: TRadioButton
     object Radio_UsePenColor: TRadioButton
@@ -96,7 +96,7 @@ object FPhongFilter: TFPhongFilter
       Left = 6
       Left = 6
       Height = 19
       Height = 19
       Top = 63
       Top = 63
-      Width = 99
+      Width = 100
       Caption = 'Current texture'
       Caption = 'Current texture'
       OnChange = Radio_UseChange
       OnChange = Radio_UseChange
       TabOrder = 2
       TabOrder = 2
@@ -124,7 +124,7 @@ object FPhongFilter: TFPhongFilter
     Top = 4
     Top = 4
     Width = 152
     Width = 152
     Caption = 'Altitude map'
     Caption = 'Altitude map'
-    ClientHeight = 100
+    ClientHeight = 98
     ClientWidth = 148
     ClientWidth = 148
     TabOrder = 4
     TabOrder = 4
     object Radio_MapAlpha: TRadioButton
     object Radio_MapAlpha: TRadioButton
@@ -193,11 +193,22 @@ object FPhongFilter: TFPhongFilter
       TabOrder = 4
       TabOrder = 4
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 14
+    Height = 19
+    Top = 160
+    Width = 70
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 5
+  end
   object Timer1: TTimer
   object Timer1: TTimer
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 312
-    top = 176
+    Left = 312
+    Top = 176
   end
   end
 end
 end

+ 4 - 3
lazpaint/dialog/filter/uphongfilter.lrj

@@ -1,7 +1,7 @@
 {"version":1,"strings":[
 {"version":1,"strings":[
 {"hash":179572208,"name":"tfphongfilter.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112],"value":"Shaded map"},
 {"hash":179572208,"name":"tfphongfilter.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112],"value":"Shaded map"},
-{"hash":1339,"name":"tfphongfilter.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfphongfilter.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
+{"hash":497723,"name":"tfphongfilter.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfphongfilter.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"},
 {"hash":118747402,"name":"tfphongfilter.label_altitude.caption","sourcebytes":[71,108,111,98,97,108,32,97,108,116,105,116,117,100,101,32,58],"value":"Global altitude :"},
 {"hash":118747402,"name":"tfphongfilter.label_altitude.caption","sourcebytes":[71,108,111,98,97,108,32,97,108,116,105,116,117,100,101,32,58],"value":"Global altitude :"},
 {"hash":4875106,"name":"tfphongfilter.groupbox_color.caption","sourcebytes":[67,111,108,111,114],"value":"Color"},
 {"hash":4875106,"name":"tfphongfilter.groupbox_color.caption","sourcebytes":[67,111,108,111,114],"value":"Color"},
 {"hash":6952354,"name":"tfphongfilter.radio_usepencolor.caption","sourcebytes":[80,101,110,32,99,111,108,111,114],"value":"Pen color"},
 {"hash":6952354,"name":"tfphongfilter.radio_usepencolor.caption","sourcebytes":[80,101,110,32,99,111,108,111,114],"value":"Pen color"},
@@ -16,5 +16,6 @@
 {"hash":234561107,"name":"tfphongfilter.radio_maplightness.caption","sourcebytes":[76,105,103,104,116,110,101,115,115],"value":"Lightness"},
 {"hash":234561107,"name":"tfphongfilter.radio_maplightness.caption","sourcebytes":[76,105,103,104,116,110,101,115,115],"value":"Lightness"},
 {"hash":71,"name":"tfphongfilter.radio_mapgreen.caption","sourcebytes":[71],"value":"G"},
 {"hash":71,"name":"tfphongfilter.radio_mapgreen.caption","sourcebytes":[71],"value":"G"},
 {"hash":66,"name":"tfphongfilter.radio_mapblue.caption","sourcebytes":[66],"value":"B"},
 {"hash":66,"name":"tfphongfilter.radio_mapblue.caption","sourcebytes":[66],"value":"B"},
-{"hash":108801555,"name":"tfphongfilter.radio_maplinearlightness.caption","sourcebytes":[76,105,110,101,97,114,32,108,105,103,104,116,110,101,115,115],"value":"Linear lightness"}
+{"hash":108801555,"name":"tfphongfilter.radio_maplinearlightness.caption","sourcebytes":[76,105,110,101,97,114,32,108,105,103,104,116,110,101,115,115],"value":"Linear lightness"},
+{"hash":126662215,"name":"tfphongfilter.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}
 ]}
 ]}

+ 28 - 3
lazpaint/dialog/filter/uphongfilter.pas

@@ -17,6 +17,7 @@ type
   TFPhongFilter = class(TForm)
   TFPhongFilter = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     GroupBox_Color: TGroupBox;
     GroupBox_Color: TGroupBox;
     GroupBox_Color1: TGroupBox;
     GroupBox_Color1: TGroupBox;
     Label_LightPosition: TLabel;
     Label_LightPosition: TLabel;
@@ -36,6 +37,7 @@ type
     SpinEdit_Altitude: TSpinEdit;
     SpinEdit_Altitude: TSpinEdit;
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
@@ -52,7 +54,8 @@ type
     { private declarations }
     { private declarations }
     FInitializing: boolean;
     FInitializing: boolean;
     FCenter: TPointF;
     FCenter: TPointF;
-    FHeightMap: TBGRABitmap;
+    FHeightMap,
+    FComputedImage: TBGRABitmap;
     FWorkspaceColor: TColor;
     FWorkspaceColor: TColor;
     FTexture: TBGRACustomBitmap;
     FTexture: TBGRACustomBitmap;
     function GetCurrentLightPos: TPointF;
     function GetCurrentLightPos: TPointF;
@@ -68,7 +71,7 @@ function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses LCScaleDPI, UMac, BGRAGradients, LazPaintType;
+uses LCScaleDPI, UMac, BGRAGradients, LazPaintType, UResourceStrings;
 
 
 function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult;
 function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -105,12 +108,24 @@ end;
 
 
 procedure TFPhongFilter.Button_OKClick(Sender: TObject);
 procedure TFPhongFilter.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then
+    FilterConnector.PutImage(FComputedImage, True, false);
+
   FilterConnector.ValidateAction;
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultPhongFilterAltitude(SpinEdit_Altitude.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultPhongFilterAltitude(SpinEdit_Altitude.Value);
   FilterConnector.LazPaintInstance.ToolManager.LightPosition := CurrentLightPos;
   FilterConnector.LazPaintInstance.ToolManager.LightPosition := CurrentLightPos;
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFPhongFilter.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    FilterConnector.PutImage(FComputedImage, true, false)
+  else
+   FilterConnector.RestoreBackup;
+end;
+
 procedure TFPhongFilter.FormCreate(Sender: TObject);
 procedure TFPhongFilter.FormCreate(Sender: TObject);
 begin
 begin
   ScaleControl(Self,OriginalDPI);
   ScaleControl(Self,OriginalDPI);
@@ -123,6 +138,7 @@ procedure TFPhongFilter.FormDestroy(Sender: TObject);
 begin
 begin
   FreeAndNil(FHeightMap);
   FreeAndNil(FHeightMap);
   if Assigned(FTexture) then FTexture.Free;
   if Assigned(FTexture) then FTexture.Free;
+  if Assigned(FComputedImage) then FComputedImage.Free;
 end;
 end;
 
 
 
 
@@ -198,8 +214,11 @@ end;
 procedure TFPhongFilter.Timer1Timer(Sender: TObject);
 procedure TFPhongFilter.Timer1Timer(Sender: TObject);
 begin
 begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
-  FilterConnector.PutImage(ComputeFilteredLayer,True,true);
+  if FComputedImage <> nil then FComputedImage.Free;
+  FComputedImage := ComputeFilteredLayer;
+  if CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,True,false);
   Button_OK.Enabled := true;
   Button_OK.Enabled := true;
+  CheckBox_Preview.Enabled := true;
 end;
 end;
 
 
 procedure TFPhongFilter.PreviewNeeded;
 procedure TFPhongFilter.PreviewNeeded;
@@ -207,6 +226,7 @@ begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
   Timer1.Enabled := True;
   Timer1.Enabled := True;
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
 end;
 end;
 
 
 function TFPhongFilter.GetCurrentLightPos: TPointF;
 function TFPhongFilter.GetCurrentLightPos: TPointF;
@@ -271,6 +291,11 @@ begin
     end;
     end;
   end;
   end;
   SpinEdit_AltitudeChange(nil);
   SpinEdit_AltitudeChange(nil);
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 

+ 22 - 11
lazpaint/dialog/filter/upixelate.lfm

@@ -1,6 +1,6 @@
 object FPixelate: TFPixelate
 object FPixelate: TFPixelate
   Left = 607
   Left = 607
-  Height = 125
+  Height = 144
   Top = 313
   Top = 313
   Width = 179
   Width = 179
   AutoSize = True
   AutoSize = True
@@ -13,12 +13,12 @@ object FPixelate: TFPixelate
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 125
+  ClientHeight = 144
   ClientWidth = 179
   ClientWidth = 179
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
     Height = 23
     Height = 23
@@ -35,13 +35,13 @@ object FPixelate: TFPixelate
       Left = 0
       Left = 0
       Height = 23
       Height = 23
       Top = 0
       Top = 0
-      Width = 52
+      Width = 53
       Caption = 'Pixel size :'
       Caption = 'Pixel size :'
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
     end
     end
     object SpinEdit_PixelSize: TSpinEdit
     object SpinEdit_PixelSize: TSpinEdit
-      Left = 60
+      Left = 61
       Height = 23
       Height = 23
       Top = 0
       Top = 0
       Width = 65
       Width = 65
@@ -85,10 +85,21 @@ object FPixelate: TFPixelate
       TabOrder = 0
       TabOrder = 0
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 70
+    Width = 152
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 3
+  end
   object Panel3: TPanel
   object Panel3: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 70
+    Top = 97
     Width = 152
     Width = 152
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
@@ -101,21 +112,21 @@ object FPixelate: TFPixelate
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end

+ 3 - 2
lazpaint/dialog/filter/upixelate.lrj

@@ -2,6 +2,7 @@
 {"hash":15478229,"name":"tfpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101],"value":"Pixelate"},
 {"hash":15478229,"name":"tfpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101],"value":"Pixelate"},
 {"hash":49409242,"name":"tfpixelate.label_pixelsize.caption","sourcebytes":[80,105,120,101,108,32,115,105,122,101,32,58],"value":"Pixel size :"},
 {"hash":49409242,"name":"tfpixelate.label_pixelsize.caption","sourcebytes":[80,105,120,101,108,32,115,105,122,101,32,58],"value":"Pixel size :"},
 {"hash":137421706,"name":"tfpixelate.label_quality.caption","sourcebytes":[81,117,97,108,105,116,121,32,58],"value":"Quality :"},
 {"hash":137421706,"name":"tfpixelate.label_quality.caption","sourcebytes":[81,117,97,108,105,116,121,32,58],"value":"Quality :"},
-{"hash":1339,"name":"tfpixelate.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfpixelate.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfpixelate.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfpixelate.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfpixelate.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 22 - 2
lazpaint/dialog/filter/upixelate.pas

@@ -17,6 +17,7 @@ type
   TFPixelate = class(TForm)
   TFPixelate = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     ComboBox_Quality: TComboBox;
     ComboBox_Quality: TComboBox;
     Label_Quality: TLabel;
     Label_Quality: TLabel;
     Label_PixelSize: TLabel;
     Label_PixelSize: TLabel;
@@ -25,6 +26,7 @@ type
     Panel3: TPanel;
     Panel3: TPanel;
     SpinEdit_PixelSize: TSpinEdit;
     SpinEdit_PixelSize: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure ComboBox_QualityChange(Sender: TObject);
     procedure ComboBox_QualityChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
@@ -97,6 +99,8 @@ procedure TFPixelate.Button_OKClick(Sender: TObject);
 var
 var
   qualityStr: TCaption;
   qualityStr: TCaption;
 begin
 begin
+  if not CheckBox_Preview.Checked then PreviewNeeded;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.ValidateAction;
   FFilterConnector.LazPaintInstance.Config.SetDefaultPixelateSize(SpinEdit_PixelSize.Value);
   FFilterConnector.LazPaintInstance.Config.SetDefaultPixelateSize(SpinEdit_PixelSize.Value);
   qualityStr := ComboBox_Quality.Text;
   qualityStr := ComboBox_Quality.Text;
@@ -109,9 +113,19 @@ begin
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFPixelate.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    PreviewNeeded
+  else
+   FFilterConnector.RestoreBackup;
+end;
+
 procedure TFPixelate.ComboBox_QualityChange(Sender: TObject);
 procedure TFPixelate.ComboBox_QualityChange(Sender: TObject);
 begin
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then PreviewNeeded;
 end;
 end;
 
 
 procedure TFPixelate.FormShow(Sender: TObject);
 procedure TFPixelate.FormShow(Sender: TObject);
@@ -123,7 +137,8 @@ end;
 
 
 procedure TFPixelate.SpinEdit_PixelSizeChange(Sender: TObject);
 procedure TFPixelate.SpinEdit_PixelSizeChange(Sender: TObject);
 begin
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then PreviewNeeded;
 end;
 end;
 
 
 function TFPixelate.ComputeFilteredLayer: TBGRABitmap;
 function TFPixelate.ComputeFilteredLayer: TBGRABitmap;
@@ -155,6 +170,11 @@ begin
     qualityStr := '';
     qualityStr := '';
 
 
   ComboBox_Quality.ItemIndex := ComboBox_Quality.Items.IndexOf(qualityStr);
   ComboBox_Quality.ItemIndex := ComboBox_Quality.Items.IndexOf(qualityStr);
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 

+ 25 - 14
lazpaint/dialog/filter/uposterize.lfm

@@ -1,6 +1,6 @@
 object FPosterize: TFPosterize
 object FPosterize: TFPosterize
   Left = 345
   Left = 345
-  Height = 114
+  Height = 133
   Top = 163
   Top = 163
   Width = 148
   Width = 148
   AutoSize = True
   AutoSize = True
@@ -13,23 +13,23 @@ object FPosterize: TFPosterize
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 114
+  ClientHeight = 133
   ClientWidth = 148
   ClientWidth = 148
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
     Height = 23
     Height = 23
     Top = 8
     Top = 8
-    Width = 112
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 23
     ClientHeight = 23
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object Label_Levels: TLabel
     object Label_Levels: TLabel
       Left = 0
       Left = 0
@@ -57,40 +57,51 @@ object FPosterize: TFPosterize
     Left = 8
     Left = 8
     Height = 19
     Height = 19
     Top = 39
     Top = 39
-    Width = 112
+    Width = 130
     Caption = 'By lightness'
     Caption = 'By lightness'
     OnChange = CheckBox_ByLightnessChange
     OnChange = CheckBox_ByLightnessChange
     TabOrder = 0
     TabOrder = 0
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 66
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 3
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 66
-    Width = 112
+    Top = 93
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 2
     TabOrder = 2
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 42
-      Caption = 'OK'
+      Width = 51
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 62
+      Width = 71
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end

+ 3 - 2
lazpaint/dialog/filter/uposterize.lrj

@@ -2,6 +2,7 @@
 {"hash":179103845,"name":"tfposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"},
 {"hash":179103845,"name":"tfposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"},
 {"hash":214708250,"name":"tfposterize.label_levels.caption","sourcebytes":[76,101,118,101,108,115,32,58],"value":"Levels :"},
 {"hash":214708250,"name":"tfposterize.label_levels.caption","sourcebytes":[76,101,118,101,108,115,32,58],"value":"Levels :"},
 {"hash":157433427,"name":"tfposterize.checkbox_bylightness.caption","sourcebytes":[66,121,32,108,105,103,104,116,110,101,115,115],"value":"By lightness"},
 {"hash":157433427,"name":"tfposterize.checkbox_bylightness.caption","sourcebytes":[66,121,32,108,105,103,104,116,110,101,115,115],"value":"By lightness"},
-{"hash":1339,"name":"tfposterize.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfposterize.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfposterize.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfposterize.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfposterize.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 27 - 7
lazpaint/dialog/filter/uposterize.pas

@@ -16,6 +16,7 @@ type
   TFPosterize = class(TForm)
   TFPosterize = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     CheckBox_ByLightness: TCheckBox;
     CheckBox_ByLightness: TCheckBox;
     Label_Levels: TLabel;
     Label_Levels: TLabel;
     Panel1: TPanel;
     Panel1: TPanel;
@@ -23,6 +24,7 @@ type
     SpinEdit_Levels: TSpinEdit;
     SpinEdit_Levels: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_ByLightnessChange(Sender: TObject);
     procedure CheckBox_ByLightnessChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure SpinEdit_LevelsChange(Sender: TObject);
     procedure SpinEdit_LevelsChange(Sender: TObject);
@@ -31,7 +33,7 @@ type
     FFilterConnector: TFilterConnector;
     FFilterConnector: TFilterConnector;
     procedure OnTryStopAction({%H-}sender: TFilterConnector);
     procedure OnTryStopAction({%H-}sender: TFilterConnector);
     procedure InitParams;
     procedure InitParams;
-    procedure PreviewNeeded;
+    procedure DisplayPreview;
     { private declarations }
     { private declarations }
   public
   public
     { public declarations }
     { public declarations }
@@ -41,7 +43,7 @@ function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVari
 
 
 implementation
 implementation
 
 
-uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, math;
+uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, UResourceStrings, math;
 
 
 function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
 function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
 var FPosterize: TFPosterize;
 var FPosterize: TFPosterize;
@@ -65,7 +67,7 @@ begin
        FPosterize.FFilterConnector.Parameters.Booleans['Validate'] then
        FPosterize.FFilterConnector.Parameters.Booleans['Validate'] then
     begin
     begin
       FPosterize.InitParams;
       FPosterize.InitParams;
-      FPosterize.PreviewNeeded;
+      FPosterize.DisplayPreview;
       FPosterize.FFilterConnector.ValidateAction;
       FPosterize.FFilterConnector.ValidateAction;
       result := srOk;
       result := srOk;
     end else
     end else
@@ -95,6 +97,8 @@ end;
 
 
 procedure TFPosterize.Button_OKClick(Sender: TObject);
 procedure TFPosterize.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayPreview;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.ValidateAction;
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeLevels(SpinEdit_Levels.Value);
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeLevels(SpinEdit_Levels.Value);
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeByLightness(CheckBox_ByLightness.Checked);
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeByLightness(CheckBox_ByLightness.Checked);
@@ -103,19 +107,30 @@ end;
 
 
 procedure TFPosterize.CheckBox_ByLightnessChange(Sender: TObject);
 procedure TFPosterize.CheckBox_ByLightnessChange(Sender: TObject);
 begin
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then DisplayPreview;
+end;
+
+procedure TFPosterize.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayPreview
+  else
+   FFilterConnector.RestoreBackup;
 end;
 end;
 
 
 procedure TFPosterize.FormShow(Sender: TObject);
 procedure TFPosterize.FormShow(Sender: TObject);
 begin
 begin
   InitParams;
   InitParams;
-  PreviewNeeded;
+  DisplayPreview;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
 end;
 end;
 
 
 procedure TFPosterize.SpinEdit_LevelsChange(Sender: TObject);
 procedure TFPosterize.SpinEdit_LevelsChange(Sender: TObject);
 begin
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then DisplayPreview;
 end;
 end;
 
 
 procedure TFPosterize.OnTryStopAction(sender: TFilterConnector);
 procedure TFPosterize.OnTryStopAction(sender: TFilterConnector);
@@ -136,10 +151,15 @@ begin
     CheckBox_ByLightness.Checked := FFilterConnector.Parameters.Booleans['ByLightness']
     CheckBox_ByLightness.Checked := FFilterConnector.Parameters.Booleans['ByLightness']
   else
   else
     CheckBox_ByLightness.Checked := FFilterConnector.LazPaintInstance.Config.DefaultPosterizeByLightness;
     CheckBox_ByLightness.Checked := FFilterConnector.LazPaintInstance.Config.DefaultPosterizeByLightness;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 
-procedure TFPosterize.PreviewNeeded;
+procedure TFPosterize.DisplayPreview;
 var params:TVariableSet;
 var params:TVariableSet;
   levels: integer;
   levels: integer;
 
 

+ 37 - 25
lazpaint/dialog/filter/uradialblur.lfm

@@ -1,6 +1,6 @@
 object FRadialBlur: TFRadialBlur
 object FRadialBlur: TFRadialBlur
   Left = 403
   Left = 403
-  Height = 82
+  Height = 101
   Top = 328
   Top = 328
   Width = 175
   Width = 175
   AutoSize = True
   AutoSize = True
@@ -13,38 +13,39 @@ object FRadialBlur: TFRadialBlur
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 82
+  ClientHeight = 101
   ClientWidth = 175
   ClientWidth = 175
   Font.Height = -12
   Font.Height = -12
   OnCloseQuery = FormCloseQuery
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
   OnCreate = FormCreate
+  OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
-    Height = 27
+    Height = 23
     Top = 8
     Top = 8
-    Width = 126
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 27
-    ClientWidth = 126
+    ClientHeight = 23
+    ClientWidth = 130
     TabOrder = 0
     TabOrder = 0
     object Label_Radius: TLabel
     object Label_Radius: TLabel
       Left = 0
       Left = 0
-      Height = 27
+      Height = 23
       Top = 0
       Top = 0
-      Width = 48
+      Width = 41
       Caption = 'Radius :'
       Caption = 'Radius :'
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
     end
     end
     object SpinEdit_Radius: TFloatSpinEdit
     object SpinEdit_Radius: TFloatSpinEdit
-      Left = 56
-      Height = 27
+      Left = 49
+      Height = 23
       Top = 0
       Top = 0
       Width = 70
       Width = 70
       Constraints.MinWidth = 70
       Constraints.MinWidth = 70
@@ -56,37 +57,48 @@ object FRadialBlur: TFRadialBlur
       Value = 5
       Value = 5
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 39
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 2
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
-    Height = 29
-    Top = 43
-    Width = 126
+    Height = 25
+    Top = 66
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 29
-    ClientWidth = 126
+    ClientHeight = 25
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
-      Height = 29
+      Height = 25
       Top = 0
       Top = 0
-      Width = 31
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 39
-      Height = 29
+      Left = 59
+      Height = 25
       Top = 0
       Top = 0
-      Width = 54
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end
@@ -95,7 +107,7 @@ object FRadialBlur: TFRadialBlur
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 128
-    top = 8
+    Left = 128
+    Top = 8
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/filter/uradialblur.lrj

@@ -1,6 +1,7 @@
 {"version":1,"strings":[
 {"version":1,"strings":[
 {"hash":129960242,"name":"tfradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"},
 {"hash":129960242,"name":"tfradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"},
 {"hash":129024186,"name":"tfradialblur.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"},
 {"hash":129024186,"name":"tfradialblur.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"},
-{"hash":1339,"name":"tfradialblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfradialblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfradialblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfradialblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfradialblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 57 - 3
lazpaint/dialog/filter/uradialblur.pas

@@ -18,6 +18,7 @@ type
     Button_OK: TButton;
     Button_OK: TButton;
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button3: TButton;
     Button3: TButton;
+    CheckBox_Preview: TCheckBox;
     Panel1: TPanel;
     Panel1: TPanel;
     Panel2: TPanel;
     Panel2: TPanel;
     SpinEdit_Radius: TFloatSpinEdit;
     SpinEdit_Radius: TFloatSpinEdit;
@@ -25,18 +26,23 @@ type
     Label_Radius: TLabel;
     Label_Radius: TLabel;
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure SpinEdit_RadiusChange(Sender: TObject);
     procedure SpinEdit_RadiusChange(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
   private
   private
-    FInitializing: boolean;
+    FInitializing, FComputed: boolean;
     FFilterConnector: TFilterConnector;
     FFilterConnector: TFilterConnector;
     FThreadManager: TFilterThreadManager;
     FThreadManager: TFilterThreadManager;
     FLastRadius: single;
     FLastRadius: single;
     FVars: TVariableSet;
     FVars: TVariableSet;
+    FComputedImage: TBGRABitmap;
+    procedure DisplayComputedImage;
     procedure PreviewNeeded;
     procedure PreviewNeeded;
+    procedure StoreComputedImage;
     procedure UpdateStep;
     procedure UpdateStep;
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
   public
   public
@@ -48,7 +54,7 @@ function ShowRadialBlurDlg(AFilterConnector: TObject; ABlurType:TRadialBlurType;
 
 
 implementation
 implementation
 
 
-uses UMac, BGRAFilters;
+uses UMac, UResourceStrings, BGRAFilters;
 
 
 function ShowRadialBlurDlg(AFilterConnector: TObject;
 function ShowRadialBlurDlg(AFilterConnector: TObject;
   ABlurType: TRadialBlurType; ACaption: string): TScriptResult;
   ABlurType: TRadialBlurType; ACaption: string): TScriptResult;
@@ -73,8 +79,16 @@ end;
 
 
 { TFRadialBlur }
 { TFRadialBlur }
 
 
+procedure TFRadialBlur.DisplayComputedImage;
+begin
+  if FComputedImage <> nil then
+    FFilterConnector.PutImage(FComputedImage, false, false);
+end;
+
 procedure TFRadialBlur.Button_OKClick(Sender: TObject);
 procedure TFRadialBlur.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then
   if not FFilterConnector.ActionDone then
   begin
   begin
     FFilterConnector.ValidateAction;
     FFilterConnector.ValidateAction;
@@ -83,6 +97,24 @@ begin
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFRadialBlur.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+  begin
+    StoreComputedImage;
+    FFilterConnector.RestoreBackup;
+  end;
+end;
+
+procedure TFRadialBlur.StoreComputedImage;
+begin
+  if FComputed and (FComputedImage = nil) then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 procedure TFRadialBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 procedure TFRadialBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 begin
 begin
   FThreadManager.Quit;
   FThreadManager.Quit;
@@ -97,6 +129,14 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckFloatSpinEdit(SpinEdit_Radius);
   CheckFloatSpinEdit(SpinEdit_Radius);
   SpinEdit_Radius.Constraints.MinWidth := DoScaleX(70, OriginalDPI);
   SpinEdit_Radius.Constraints.MinWidth := DoScaleX(70, OriginalDPI);
+
+  FComputed := false;
+  FComputedImage := nil;
+end;
+
+procedure TFRadialBlur.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FComputedImage);
 end;
 end;
 
 
 procedure TFRadialBlur.FormShow(Sender: TObject);
 procedure TFRadialBlur.FormShow(Sender: TObject);
@@ -109,6 +149,10 @@ begin
   else
   else
     SpinEdit_Radius.Value := FFilterConnector.LazPaintInstance.Config.DefaultBlurRadius;
     SpinEdit_Radius.Value := FFilterConnector.LazPaintInstance.Config.DefaultBlurRadius;
   UpdateStep;
   UpdateStep;
+  CheckBox_Preview.Checked := true;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := False;
   FInitializing := False;
   PreviewNeeded;
   PreviewNeeded;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
@@ -158,7 +202,11 @@ begin
       if FThreadManager.ReadyToClose then
       if FThreadManager.ReadyToClose then
         Close
         Close
       else
       else
-        if AEvent = tmeCompletedTask then Button_OK.Enabled := true;
+        if AEvent = tmeCompletedTask then begin
+          Button_OK.Enabled := true;
+          CheckBox_Preview.Enabled := true;
+          FComputed := true;
+        end;
     end;
     end;
   tmeStartingNewTask:
   tmeStartingNewTask:
     begin
     begin
@@ -166,6 +214,12 @@ begin
       Timer1.Interval := 100;
       Timer1.Interval := 100;
       Timer1.Enabled := true;
       Timer1.Enabled := true;
       Button_OK.Enabled := false;
       Button_OK.Enabled := false;
+
+      FInitializing := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FreeAndNil(FComputedImage);
+      FInitializing := False;
     end;
     end;
   end;
   end;
 end;
 end;

+ 24 - 13
lazpaint/dialog/filter/usharpen.lfm

@@ -1,6 +1,6 @@
 object FSharpen: TFSharpen
 object FSharpen: TFSharpen
   Left = 734
   Left = 734
-  Height = 94
+  Height = 113
   Top = 206
   Top = 206
   Width = 173
   Width = 173
   AutoSize = True
   AutoSize = True
@@ -13,23 +13,23 @@ object FSharpen: TFSharpen
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 94
+  ClientHeight = 113
   ClientWidth = 173
   ClientWidth = 173
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
     Height = 23
     Height = 23
     Top = 8
     Top = 8
-    Width = 123
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 23
     ClientHeight = 23
-    ClientWidth = 123
+    ClientWidth = 130
     TabOrder = 0
     TabOrder = 0
     object Label_Amount: TLabel
     object Label_Amount: TLabel
       Left = 0
       Left = 0
@@ -54,37 +54,48 @@ object FSharpen: TFSharpen
       Value = 100
       Value = 100
     end
     end
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 39
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 2
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
     Height = 25
     Height = 25
-    Top = 39
-    Width = 123
+    Top = 66
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
     ClientHeight = 25
-    ClientWidth = 123
+    ClientWidth = 130
     TabOrder = 1
     TabOrder = 1
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Height = 25
       Top = 0
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       ModalResult = 2
       TabOrder = 1
       TabOrder = 1
     end
     end

+ 3 - 2
lazpaint/dialog/filter/usharpen.lrj

@@ -1,6 +1,7 @@
 {"version":1,"strings":[
 {"version":1,"strings":[
 {"hash":170608904,"name":"tfsharpen.caption","sourcebytes":[83,104,97,114,112,101,110,47,83,109,111,111,116,104],"value":"Sharpen/Smooth"},
 {"hash":170608904,"name":"tfsharpen.caption","sourcebytes":[83,104,97,114,112,101,110,47,83,109,111,111,116,104],"value":"Sharpen/Smooth"},
 {"hash":74207930,"name":"tfsharpen.label_amount.caption","sourcebytes":[65,109,111,117,110,116,32,58],"value":"Amount :"},
 {"hash":74207930,"name":"tfsharpen.label_amount.caption","sourcebytes":[65,109,111,117,110,116,32,58],"value":"Amount :"},
-{"hash":1339,"name":"tfsharpen.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfsharpen.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfsharpen.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfsharpen.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfsharpen.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 26 - 6
lazpaint/dialog/filter/usharpen.pas

@@ -17,11 +17,13 @@ type
   TFSharpen = class(TForm)
   TFSharpen = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Amount: TLabel;
     Label_Amount: TLabel;
     Panel1: TPanel;
     Panel1: TPanel;
     Panel2: TPanel;
     Panel2: TPanel;
     SpinEdit_Amount: TSpinEdit;
     SpinEdit_Amount: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure SpinEdit_AmountChange(Sender: TObject);
     procedure SpinEdit_AmountChange(Sender: TObject);
@@ -33,14 +35,15 @@ type
     FInitializing: boolean;
     FInitializing: boolean;
     FFilterConnector: TFilterConnector;
     FFilterConnector: TFilterConnector;
     procedure InitParams;
     procedure InitParams;
-    procedure PreviewNeeded;
+    procedure DisplayPreview;
   end;
   end;
 
 
 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses LCScaleDPI, UMac, LazPaintType, BGRABitmap, BGRABitmapTypes;
+uses LCScaleDPI, UMac, LazPaintType, UResourceStrings, BGRABitmap,
+  BGRABitmapTypes;
 
 
 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
 function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult;
 var FSharpen: TFSharpen;
 var FSharpen: TFSharpen;
@@ -63,7 +66,7 @@ begin
       FSharpen.FFilterConnector.Parameters.Booleans['Validate'] then
       FSharpen.FFilterConnector.Parameters.Booleans['Validate'] then
     begin
     begin
       FSharpen.InitParams;
       FSharpen.InitParams;
-      FSharpen.PreviewNeeded;
+      FSharpen.DisplayPreview;
       FSharpen.FFilterConnector.ValidateAction;
       FSharpen.FFilterConnector.ValidateAction;
       result := srOk;
       result := srOk;
     end else
     end else
@@ -92,7 +95,7 @@ procedure TFSharpen.FormShow(Sender: TObject);
 var idxSlash: integer;
 var idxSlash: integer;
 begin
 begin
   InitParams;
   InitParams;
-  PreviewNeeded;
+  DisplayPreview;
   idxSlash:= Pos('/',Caption);
   idxSlash:= Pos('/',Caption);
   if idxSlash <> 0 then
   if idxSlash <> 0 then
   begin
   begin
@@ -104,16 +107,28 @@ end;
 
 
 procedure TFSharpen.SpinEdit_AmountChange(Sender: TObject);
 procedure TFSharpen.SpinEdit_AmountChange(Sender: TObject);
 begin
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then DisplayPreview;
 end;
 end;
 
 
 procedure TFSharpen.Button_OKClick(Sender: TObject);
 procedure TFSharpen.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayPreview;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.ValidateAction;
   FFilterConnector.LazPaintInstance.Config.SetDefaultSharpenAmount(SpinEdit_Amount.Value/100);
   FFilterConnector.LazPaintInstance.Config.SetDefaultSharpenAmount(SpinEdit_Amount.Value/100);
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFSharpen.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayPreview
+  else
+   FFilterConnector.RestoreBackup;
+end;
+
 procedure TFSharpen.OnTryStopAction(sender: TFilterConnector);
 procedure TFSharpen.OnTryStopAction(sender: TFilterConnector);
 begin
 begin
   if self.visible then Close;
   if self.visible then Close;
@@ -126,10 +141,15 @@ begin
     SpinEdit_Amount.Value := round(FFilterConnector.Parameters.Floats['Amount']*100)
     SpinEdit_Amount.Value := round(FFilterConnector.Parameters.Floats['Amount']*100)
   else
   else
      SpinEdit_Amount.Value := round(FFilterConnector.LazPaintInstance.Config.DefaultSharpenAmount*100);
      SpinEdit_Amount.Value := round(FFilterConnector.LazPaintInstance.Config.DefaultSharpenAmount*100);
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 
-procedure TFSharpen.PreviewNeeded;
+procedure TFSharpen.DisplayPreview;
 var filtered: TBGRABitmap;
 var filtered: TBGRABitmap;
 begin
 begin
   if FMode = smSharpen then
   if FMode = smSharpen then

+ 61 - 51
lazpaint/dialog/filter/utwirl.lfm

@@ -1,8 +1,8 @@
 object FTwirl: TFTwirl
 object FTwirl: TFTwirl
   Left = 631
   Left = 631
-  Height = 288
+  Height = 249
   Top = 173
   Top = 173
-  Width = 173
+  Width = 142
   AutoSize = True
   AutoSize = True
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
@@ -13,48 +13,47 @@ object FTwirl: TFTwirl
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 288
-  ClientWidth = 173
-  DesignTimePPI = 120
-  Font.Height = -15
+  ClientHeight = 249
+  ClientWidth = 142
+  Font.Height = -12
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
-    Height = 76
+    Height = 54
     Top = 8
     Top = 8
-    Width = 143
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 76
-    ClientWidth = 143
-    Font.Height = -15
+    ClientHeight = 54
+    ClientWidth = 130
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     TabOrder = 0
     TabOrder = 0
     object Label_Radius: TLabel
     object Label_Radius: TLabel
       Left = 0
       Left = 0
-      Height = 34
+      Height = 23
       Top = 0
       Top = 0
-      Width = 54
+      Width = 41
       Caption = 'Radius :'
       Caption = 'Radius :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_Radius: TSpinEdit
     object SpinEdit_Radius: TSpinEdit
-      Left = 62
-      Height = 34
+      Left = 49
+      Height = 23
       Top = 0
       Top = 0
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 10
       Increment = 10
       MaxValue = 10000
       MaxValue = 10000
       MinValue = 1
       MinValue = 1
@@ -65,22 +64,22 @@ object FTwirl: TFTwirl
     end
     end
     object Label_Angle: TLabel
     object Label_Angle: TLabel
       Left = 0
       Left = 0
-      Height = 34
-      Top = 42
-      Width = 54
+      Height = 23
+      Top = 31
+      Width = 41
       Caption = 'Angle :'
       Caption = 'Angle :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_Angle: TSpinEdit
     object SpinEdit_Angle: TSpinEdit
-      Left = 62
-      Height = 34
-      Top = 42
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Left = 49
+      Height = 23
+      Top = 31
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 30
       Increment = 30
       MaxValue = 10000
       MaxValue = 10000
       MinValue = -10000
       MinValue = -10000
@@ -92,51 +91,62 @@ object FTwirl: TFTwirl
   end
   end
   object PaintBox1: TPaintBox
   object PaintBox1: TPaintBox
     Left = 8
     Left = 8
-    Height = 131
-    Top = 92
-    Width = 143
-    Font.Height = -15
+    Height = 105
+    Top = 70
+    Width = 130
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     OnMouseDown = PaintBox1MouseDown
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseMove = PaintBox1MouseMove
     OnPaint = PaintBox1Paint
     OnPaint = PaintBox1Paint
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 183
+    Width = 130
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 2
+  end
   object Panel2: TPanel
   object Panel2: TPanel
     Left = 8
     Left = 8
-    Height = 36
-    Top = 231
-    Width = 143
+    Height = 25
+    Top = 210
+    Width = 130
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 36
-    ClientWidth = 143
-    Font.Height = -15
+    ClientHeight = 25
+    ClientWidth = 130
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     TabOrder = 1
     TabOrder = 1
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
-      Height = 36
+      Height = 25
       Top = 0
       Top = 0
-      Width = 35
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
-      Font.Height = -15
+      Font.Height = -12
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       ParentFont = False
       ParentFont = False
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 43
-      Height = 36
+      Left = 59
+      Height = 25
       Top = 0
       Top = 0
-      Width = 59
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
-      Font.Height = -15
+      Caption = 'rsCancel'
+      Font.Height = -12
       ModalResult = 2
       ModalResult = 2
       ParentFont = False
       ParentFont = False
       TabOrder = 1
       TabOrder = 1
@@ -146,7 +156,7 @@ object FTwirl: TFTwirl
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 64
-    top = 120
+    Left = 51
+    Top = 96
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/filter/utwirl.lrj

@@ -2,6 +2,7 @@
 {"hash":6021260,"name":"tftwirl.caption","sourcebytes":[84,119,105,114,108],"value":"Twirl"},
 {"hash":6021260,"name":"tftwirl.caption","sourcebytes":[84,119,105,114,108],"value":"Twirl"},
 {"hash":129024186,"name":"tftwirl.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"},
 {"hash":129024186,"name":"tftwirl.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"},
 {"hash":139339642,"name":"tftwirl.label_angle.caption","sourcebytes":[65,110,103,108,101,32,58],"value":"Angle :"},
 {"hash":139339642,"name":"tftwirl.label_angle.caption","sourcebytes":[65,110,103,108,101,32,58],"value":"Angle :"},
-{"hash":1339,"name":"tftwirl.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tftwirl.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tftwirl.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tftwirl.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tftwirl.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 32 - 2
lazpaint/dialog/filter/utwirl.pas

@@ -17,6 +17,7 @@ type
   TFTwirl = class(TForm)
   TFTwirl = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Radius: TLabel;
     Label_Radius: TLabel;
     Label_Angle: TLabel;
     Label_Angle: TLabel;
     PaintBox1: TPaintBox;
     PaintBox1: TPaintBox;
@@ -26,6 +27,7 @@ type
     SpinEdit_Radius: TSpinEdit;
     SpinEdit_Radius: TSpinEdit;
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
@@ -41,8 +43,10 @@ type
     { private declarations }
     { private declarations }
     FInitializing: boolean;
     FInitializing: boolean;
     FCenter: TPointF;
     FCenter: TPointF;
+    FComputedImage: TBGRABitmap;
     procedure InitParams;
     procedure InitParams;
     procedure PreviewNeeded;
     procedure PreviewNeeded;
+    procedure DisplayComputedImage;
     function ComputeFilteredLayer: TBGRABitmap;
     function ComputeFilteredLayer: TBGRABitmap;
   public
   public
     FilterConnector: TFilterConnector;
     FilterConnector: TFilterConnector;
@@ -52,7 +56,7 @@ function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses umac;
+uses umac, UResourceStrings;
 
 
 function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult;
 function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -96,6 +100,7 @@ end;
 
 
 procedure TFTwirl.FormDestroy(Sender: TObject);
 procedure TFTwirl.FormDestroy(Sender: TObject);
 begin
 begin
+  if FComputedImage <> nil then FreeAndNil(FComputedImage);
 end;
 end;
 
 
 procedure TFTwirl.FormShow(Sender: TObject);
 procedure TFTwirl.FormShow(Sender: TObject);
@@ -152,8 +157,11 @@ end;
 procedure TFTwirl.Timer1Timer(Sender: TObject);
 procedure TFTwirl.Timer1Timer(Sender: TObject);
 begin
 begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
-  FilterConnector.PutImage(ComputeFilteredLayer,False,true);
+  if FComputedImage <> nil then FComputedImage.Free;
+  FComputedImage := ComputeFilteredLayer;
+  if CheckBox_Preview.Checked then DisplayComputedImage;
   Button_OK.Enabled := true;
   Button_OK.Enabled := true;
+  CheckBox_Preview.Enabled := true;
 end;
 end;
 
 
 procedure TFTwirl.InitParams;
 procedure TFTwirl.InitParams;
@@ -171,6 +179,11 @@ begin
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
   end;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 
@@ -179,6 +192,12 @@ begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
   Timer1.Enabled := True;
   Timer1.Enabled := True;
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
+end;
+
+procedure TFTwirl.DisplayComputedImage;
+begin
+  FilterConnector.PutImage(FComputedImage,False,False);
 end;
 end;
 
 
 function TFTwirl.ComputeFilteredLayer: TBGRABitmap;
 function TFTwirl.ComputeFilteredLayer: TBGRABitmap;
@@ -189,12 +208,23 @@ end;
 
 
 procedure TFTwirl.Button_OKClick(Sender: TObject);
 procedure TFTwirl.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   FilterConnector.ValidateAction;
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlRadius(SpinEdit_Radius.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlRadius(SpinEdit_Radius.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlTurn(SpinEdit_Angle.Value/360);
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlTurn(SpinEdit_Angle.Value/360);
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFTwirl.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+    FilterConnector.RestoreBackup;
+end;
+
 {$R *.lfm}
 {$R *.lfm}
 
 
 end.
 end.

+ 73 - 62
lazpaint/dialog/filter/uwavedisplacement.lfm

@@ -1,8 +1,8 @@
 object FWaveDisplacement: TFWaveDisplacement
 object FWaveDisplacement: TFWaveDisplacement
   Left = 306
   Left = 306
-  Height = 356
+  Height = 285
   Top = 172
   Top = 172
-  Width = 222
+  Width = 168
   AutoSize = True
   AutoSize = True
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   BorderStyle = bsDialog
@@ -13,47 +13,47 @@ object FWaveDisplacement: TFWaveDisplacement
   ChildSizing.VerticalSpacing = 8
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 356
-  ClientWidth = 222
-  DesignTimePPI = 120
+  ClientHeight = 285
+  ClientWidth = 168
   OnCreate = FormCreate
   OnCreate = FormCreate
+  OnDestroy = FormDestroy
   OnShow = FormShow
   OnShow = FormShow
   Position = poScreenCenter
   Position = poScreenCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
   object Panel1: TPanel
     Left = 8
     Left = 8
-    Height = 118
+    Height = 85
     Top = 8
     Top = 8
-    Width = 191
+    Width = 151
     AutoSize = True
     AutoSize = True
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 118
-    ClientWidth = 191
-    Font.Height = -15
+    ClientHeight = 85
+    ClientWidth = 151
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     TabOrder = 0
     TabOrder = 0
     object Label_Wavelength: TLabel
     object Label_Wavelength: TLabel
       Left = 0
       Left = 0
-      Height = 34
+      Height = 23
       Top = 0
       Top = 0
-      Width = 102
+      Width = 78
       Caption = 'Wavelength :'
       Caption = 'Wavelength :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_Wavelength: TSpinEdit
     object SpinEdit_Wavelength: TSpinEdit
-      Left = 110
-      Height = 34
+      Left = 86
+      Height = 23
       Top = 0
       Top = 0
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 10
       Increment = 10
       MaxValue = 10000
       MaxValue = 10000
       MinValue = 1
       MinValue = 1
@@ -64,22 +64,22 @@ object FWaveDisplacement: TFWaveDisplacement
     end
     end
     object Label_Displacement: TLabel
     object Label_Displacement: TLabel
       Left = 0
       Left = 0
-      Height = 34
-      Top = 42
-      Width = 102
+      Height = 23
+      Top = 31
+      Width = 78
       Caption = 'Displacement :'
       Caption = 'Displacement :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_Displacement: TSpinEdit
     object SpinEdit_Displacement: TSpinEdit
-      Left = 110
-      Height = 34
-      Top = 42
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Left = 86
+      Height = 23
+      Top = 31
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 5
       Increment = 5
       MaxValue = 1000
       MaxValue = 1000
       OnChange = SpinEdit_DisplacementChange
       OnChange = SpinEdit_DisplacementChange
@@ -89,22 +89,22 @@ object FWaveDisplacement: TFWaveDisplacement
     end
     end
     object Label_Phase: TLabel
     object Label_Phase: TLabel
       Left = 0
       Left = 0
-      Height = 34
-      Top = 84
-      Width = 102
+      Height = 23
+      Top = 62
+      Width = 78
       Caption = 'Phase :'
       Caption = 'Phase :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_Phase: TSpinEdit
     object SpinEdit_Phase: TSpinEdit
-      Left = 110
-      Height = 34
-      Top = 84
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Left = 86
+      Height = 23
+      Top = 62
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 30
       Increment = 30
       MaxValue = 360
       MaxValue = 360
       OnChange = SpinEdit_PhaseChange
       OnChange = SpinEdit_PhaseChange
@@ -113,52 +113,63 @@ object FWaveDisplacement: TFWaveDisplacement
     end
     end
   end
   end
   object PaintBox1: TPaintBox
   object PaintBox1: TPaintBox
-    Left = 9
-    Height = 160
-    Top = 136
-    Width = 189
-    Font.Height = -15
+    Left = 8
+    Height = 105
+    Top = 101
+    Width = 151
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     OnMouseDown = PaintBox1MouseDown
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseMove = PaintBox1MouseMove
     OnPaint = PaintBox1Paint
     OnPaint = PaintBox1Paint
   end
   end
+  object CheckBox_Preview: TCheckBox
+    Left = 8
+    Height = 19
+    Top = 214
+    Width = 151
+    Caption = 'rsPreview'
+    Checked = True
+    OnChange = CheckBox_PreviewChange
+    State = cbChecked
+    TabOrder = 2
+  end
   object Panel2: TPanel
   object Panel2: TPanel
-    Left = 9
-    Height = 36
-    Top = 304
-    Width = 188
+    Left = 8
+    Height = 25
+    Top = 241
+    Width = 151
     BevelOuter = bvNone
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 36
-    ClientWidth = 188
-    Font.Height = -15
+    ClientHeight = 25
+    ClientWidth = 151
+    Font.Height = -12
     ParentFont = False
     ParentFont = False
     TabOrder = 1
     TabOrder = 1
     object Button_OK: TButton
     object Button_OK: TButton
       Left = 0
       Left = 0
-      Height = 36
+      Height = 25
       Top = 0
       Top = 0
-      Width = 35
+      Width = 51
       AutoSize = True
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       Default = True
-      Font.Height = -15
+      Font.Height = -12
       OnClick = Button_OKClick
       OnClick = Button_OKClick
       ParentFont = False
       ParentFont = False
       TabOrder = 0
       TabOrder = 0
     end
     end
     object Button_Cancel: TButton
     object Button_Cancel: TButton
-      Left = 43
-      Height = 36
+      Left = 59
+      Height = 25
       Top = 0
       Top = 0
-      Width = 59
+      Width = 71
       AutoSize = True
       AutoSize = True
       Cancel = True
       Cancel = True
-      Caption = 'Cancel'
-      Font.Height = -15
+      Caption = 'rsCancel'
+      Font.Height = -12
       ModalResult = 2
       ModalResult = 2
       ParentFont = False
       ParentFont = False
       TabOrder = 1
       TabOrder = 1
@@ -168,7 +179,7 @@ object FWaveDisplacement: TFWaveDisplacement
     Enabled = False
     Enabled = False
     Interval = 200
     Interval = 200
     OnTimer = Timer1Timer
     OnTimer = Timer1Timer
-    left = 48
-    top = 184
+    Left = 38
+    Top = 147
   end
   end
 end
 end

+ 3 - 2
lazpaint/dialog/filter/uwavedisplacement.lrj

@@ -3,6 +3,7 @@
 {"hash":261514778,"name":"tfwavedisplacement.label_wavelength.caption","sourcebytes":[87,97,118,101,108,101,110,103,116,104,32,58],"value":"Wavelength :"},
 {"hash":261514778,"name":"tfwavedisplacement.label_wavelength.caption","sourcebytes":[87,97,118,101,108,101,110,103,116,104,32,58],"value":"Wavelength :"},
 {"hash":211645722,"name":"tfwavedisplacement.label_displacement.caption","sourcebytes":[68,105,115,112,108,97,99,101,109,101,110,116,32,58],"value":"Displacement :"},
 {"hash":211645722,"name":"tfwavedisplacement.label_displacement.caption","sourcebytes":[68,105,115,112,108,97,99,101,109,101,110,116,32,58],"value":"Displacement :"},
 {"hash":115906410,"name":"tfwavedisplacement.label_phase.caption","sourcebytes":[80,104,97,115,101,32,58],"value":"Phase :"},
 {"hash":115906410,"name":"tfwavedisplacement.label_phase.caption","sourcebytes":[80,104,97,115,101,32,58],"value":"Phase :"},
-{"hash":1339,"name":"tfwavedisplacement.button_ok.caption","sourcebytes":[79,75],"value":"OK"},
-{"hash":77089212,"name":"tfwavedisplacement.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}
+{"hash":126662215,"name":"tfwavedisplacement.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"},
+{"hash":497723,"name":"tfwavedisplacement.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"},
+{"hash":127421996,"name":"tfwavedisplacement.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}
 ]}
 ]}

+ 32 - 2
lazpaint/dialog/filter/uwavedisplacement.pas

@@ -17,6 +17,7 @@ type
   TFWaveDisplacement = class(TForm)
   TFWaveDisplacement = class(TForm)
     Button_Cancel: TButton;
     Button_Cancel: TButton;
     Button_OK: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Displacement: TLabel;
     Label_Displacement: TLabel;
     Label_Phase: TLabel;
     Label_Phase: TLabel;
     Label_Wavelength: TLabel;
     Label_Wavelength: TLabel;
@@ -28,7 +29,9 @@ type
     SpinEdit_Wavelength: TSpinEdit;
     SpinEdit_Wavelength: TSpinEdit;
     Timer1: TTimer;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; {%H-}Button: TMouseButton;
     procedure PaintBox1MouseDown(Sender: TObject; {%H-}Button: TMouseButton;
       {%H-}Shift: TShiftState; X, Y: Integer);
       {%H-}Shift: TShiftState; X, Y: Integer);
@@ -43,6 +46,7 @@ type
     { private declarations }
     { private declarations }
     FInitializing: boolean;
     FInitializing: boolean;
     FCenter: TPointF;
     FCenter: TPointF;
+    FComputedImage: TBGRABitmap;
     procedure InitParams;
     procedure InitParams;
     procedure PreviewNeeded;
     procedure PreviewNeeded;
     function ComputeFilteredLayer: TBGRABitmap;
     function ComputeFilteredLayer: TBGRABitmap;
@@ -57,7 +61,7 @@ function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult;
 
 
 implementation
 implementation
 
 
-uses umac, ugraph, LCScaleDPI;
+uses umac, ugraph, UResourceStrings, LCScaleDPI;
 
 
 function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult;
 function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult;
 var
 var
@@ -100,6 +104,11 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
 end;
 end;
 
 
+procedure TFWaveDisplacement.FormDestroy(Sender: TObject);
+begin
+  if FComputedImage <> nil then FreeAndNil(FComputedImage);
+end;
+
 procedure TFWaveDisplacement.FormShow(Sender: TObject);
 procedure TFWaveDisplacement.FormShow(Sender: TObject);
 begin
 begin
   InitParams;
   InitParams;
@@ -159,8 +168,12 @@ end;
 procedure TFWaveDisplacement.Timer1Timer(Sender: TObject);
 procedure TFWaveDisplacement.Timer1Timer(Sender: TObject);
 begin
 begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
-  FilterConnector.PutImage(ComputeFilteredLayer,False,true);
+  if FComputedImage <> nil then FComputedImage.Free;
+  FComputedImage := ComputeFilteredLayer;
+  if CheckBox_Preview.Checked then
+    FilterConnector.PutImage(FComputedImage,False,False);
   Button_OK.Enabled := true;
   Button_OK.Enabled := true;
+  CheckBox_Preview.Enabled := true;
 end;
 end;
 
 
 procedure TFWaveDisplacement.InitParams;
 procedure TFWaveDisplacement.InitParams;
@@ -180,6 +193,11 @@ begin
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
   end;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
   FInitializing := false;
 end;
 end;
 
 
@@ -188,6 +206,7 @@ begin
   Timer1.Enabled := false;
   Timer1.Enabled := false;
   Timer1.Enabled := True;
   Timer1.Enabled := True;
   Button_OK.Enabled := false;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
 end;
 end;
 
 
 function TFWaveDisplacement.ComputeFilteredLayer: TBGRABitmap;
 function TFWaveDisplacement.ComputeFilteredLayer: TBGRABitmap;
@@ -199,6 +218,8 @@ end;
 
 
 procedure TFWaveDisplacement.Button_OKClick(Sender: TObject);
 procedure TFWaveDisplacement.Button_OKClick(Sender: TObject);
 begin
 begin
+  if not CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,false,false);
+
   FilterConnector.ValidateAction;
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementWavelength(SpinEdit_Wavelength.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementWavelength(SpinEdit_Wavelength.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementAmount(SpinEdit_Displacement.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementAmount(SpinEdit_Displacement.Value);
@@ -206,6 +227,15 @@ begin
   ModalResult := mrOK;
   ModalResult := mrOK;
 end;
 end;
 
 
+procedure TFWaveDisplacement.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    FilterConnector.PutImage(FComputedImage,False,False)
+  else
+   FilterConnector.RestoreBackup;
+end;
+
 {$R *.lfm}
 {$R *.lfm}
 
 
 end.
 end.

+ 18 - 1
lazpaint/dialog/uchoosecolorinterface.pas

@@ -122,6 +122,7 @@ type
     procedure HideEditor;
     procedure HideEditor;
     function GetPreferredSize: TSize;
     function GetPreferredSize: TSize;
     procedure AdjustControlHeight;
     procedure AdjustControlHeight;
+    procedure SimpleRedraw;
 
 
     property DarkTheme: boolean read FDarkTheme write SetDarkTheme;
     property DarkTheme: boolean read FDarkTheme write SetDarkTheme;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
@@ -211,7 +212,7 @@ var
   bmpRect: TRect;
   bmpRect: TRect;
   previewSize: single;
   previewSize: single;
   previewRect: TRectF;
   previewRect: TRectF;
-  c: TBGRAPixel;
+  c, cDigit: TBGRAPixel;
   bmpColorXYSize: integer;
   bmpColorXYSize: integer;
   bmpCursorWidth, i: integer;
   bmpCursorWidth, i: integer;
   bmpCursorOpacity: byte;
   bmpCursorOpacity: byte;
@@ -297,8 +298,19 @@ begin
       c := GetCurrentColor;
       c := GetCurrentColor;
       c.alpha := 255;
       c.alpha := 255;
       with InterfaceToPixel(previewRect) do
       with InterfaceToPixel(previewRect) do
+      begin
         Bitmap.RoundRectAntialias(Left, Top, Right - 1, Bottom - 1,
         Bitmap.RoundRectAntialias(Left, Top, Right - 1, Bottom - 1,
             previewSize/6, previewSize/6, BGRA(0,0,0,192), bmpCursorWidth, c, []);
             previewSize/6, previewSize/6, BGRA(0,0,0,192), bmpCursorWidth, c, []);
+        c := GetCurrentColor;
+        s := FLazPaintInstance.GetKeyAssociatedToColor(c);
+        if Length(s) > 0 then
+        begin
+          if GetLightness(c)/65535 > 0.5 then
+            cDigit := BGRABlack else cDigit := BGRAWhite;
+          Bitmap.FontFullHeight := Height;
+          Bitmap.TextOut(CenterPoint.x, CenterPoint.y-Height div 2, s, cDigit, taCenter);
+        end;
+      end;
     end;
     end;
   end;
   end;
 end;
 end;
@@ -1172,5 +1184,10 @@ begin
   Container.Height := round(h + FTextAreaHeight + ExternalMargin);
   Container.Height := round(h + FTextAreaHeight + ExternalMargin);
 end;
 end;
 
 
+procedure TChooseColorInterface.SimpleRedraw;
+begin
+  UpdateColorview(False, False, True);
+end;
+
 end.
 end.
 
 

+ 27 - 6
lazpaint/image/uimage.pas

@@ -156,8 +156,9 @@ type
     function CanRedo: boolean;
     function CanRedo: boolean;
     procedure Undo;
     procedure Undo;
     procedure Redo;
     procedure Redo;
-    procedure DoBegin;
+    function DoBegin: TComposedImageDifference;
     procedure DoEnd(out ADoFound: boolean; out ASomethingDone: boolean);
     procedure DoEnd(out ADoFound: boolean; out ASomethingDone: boolean);
+    procedure DoEnd(var ACompose: TComposedImageDifference);
     procedure ClearUndo;
     procedure ClearUndo;
     procedure CompressUndo;
     procedure CompressUndo;
     function UsedMemory: int64;
     function UsedMemory: int64;
@@ -1170,9 +1171,10 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TLazPaintImage.DoBegin;
+function TLazPaintImage.DoBegin: TComposedImageDifference;
 begin
 begin
-  AddUndo(TComposedImageDifference.Create(True));
+  result := TComposedImageDifference.Create(True);
+  AddUndo(result);
 end;
 end;
 
 
 procedure TLazPaintImage.DoEnd(out ADoFound: boolean; out ASomethingDone: boolean);
 procedure TLazPaintImage.DoEnd(out ADoFound: boolean; out ASomethingDone: boolean);
@@ -1189,14 +1191,16 @@ begin
     curIndex := FUndoPos;
     curIndex := FUndoPos;
     curDiff := curGroup[curIndex];
     curDiff := curGroup[curIndex];
     if not ((curDiff is TComposedImageDifference) and
     if not ((curDiff is TComposedImageDifference) and
-      TComposedImageDifference(curDiff).Agglutinate) then
+      TComposedImageDifference(curDiff).Agglutinate and
+      not TComposedImageDifference(curDiff).LockAgglutinate) then
         exit;
         exit;
     ADoFound:= true;
     ADoFound:= true;
     ASomethingDone := true;
     ASomethingDone := true;
     repeat
     repeat
       insideDiff := TComposedImageDifference(curDiff).GetLast;
       insideDiff := TComposedImageDifference(curDiff).GetLast;
       if (insideDiff <> nil) and (insideDiff is TComposedImageDifference) and
       if (insideDiff <> nil) and (insideDiff is TComposedImageDifference) and
-         TComposedImageDifference(insideDiff).Agglutinate then
+         TComposedImageDifference(insideDiff).Agglutinate and
+         not TComposedImageDifference(insideDiff).LockAgglutinate then
       begin
       begin
         curGroup := TComposedImageDifference(curDiff);
         curGroup := TComposedImageDifference(curDiff);
         curIndex := curGroup.Count-1;
         curIndex := curGroup.Count-1;
@@ -1209,12 +1213,29 @@ begin
     if TComposedImageDifference(curDiff).Count = 0 then
     if TComposedImageDifference(curDiff).Count = 0 then
     begin
     begin
       curGroup.Delete(curIndex);
       curGroup.Delete(curIndex);
-      if curGroup = FUndoList then dec(FUndoPos);
+      if (curGroup = FUndoList) and (FUndoPos >= curIndex) then dec(FUndoPos);
       ASomethingDone := false;
       ASomethingDone := false;
     end;
     end;
   end;
   end;
 end;
 end;
 
 
+procedure TLazPaintImage.DoEnd(var ACompose: TComposedImageDifference);
+var
+  index: Integer;
+begin
+  ACompose.StopAgglutinate;
+  if ACompose.Count = 0 then
+  begin
+    index := FUndoList.IndexOf(ACompose);
+    if index <> -1 then
+    begin
+      FUndoList.Delete(index);
+      if FUndoPos >= index then dec(FUndoPos);
+      ACompose := nil;
+    end;
+  end;
+end;
+
 procedure TLazPaintImage.ClearUndo;
 procedure TLazPaintImage.ClearUndo;
 begin
 begin
   try
   try

+ 6 - 1
lazpaint/image/uimagediff.pas

@@ -306,6 +306,7 @@ type
     blendOp: TBlendOperation;
     blendOp: TBlendOperation;
     opacity: byte;
     opacity: byte;
     matrix: TAffineMatrix;
     matrix: TAffineMatrix;
+    originalGuid: TGuid;
     function UsedMemory: int64; override;
     function UsedMemory: int64; override;
     function TryCompress: boolean; override;
     function TryCompress: boolean; override;
     procedure ApplyTo(AState: TState); override;
     procedure ApplyTo(AState: TState); override;
@@ -1657,7 +1658,7 @@ begin
   with AState as TImageState do
   with AState as TImageState do
   begin
   begin
     originalData.Position:= 0;
     originalData.Position:= 0;
-    origIdx:= LayeredBitmap.AddOriginalFromStream(originalData);
+    origIdx:= LayeredBitmap.AddOriginalFromStream(originalData, originalGuid);
     idx := LayeredBitmap.AddLayerFromOriginal(LayeredBitmap.Original[origIdx].Guid, self.blendOp, self.opacity);
     idx := LayeredBitmap.AddLayerFromOriginal(LayeredBitmap.Original[origIdx].Guid, self.blendOp, self.opacity);
     LayeredBitmap.LayerUniqueId[idx] := self.layerId;
     LayeredBitmap.LayerUniqueId[idx] := self.layerId;
     LayeredBitmap.LayerName[idx] := name;
     LayeredBitmap.LayerName[idx] := name;
@@ -1676,6 +1677,8 @@ begin
     idx := LayeredBitmap.GetLayerIndexFromId(self.layerId);
     idx := LayeredBitmap.GetLayerIndexFromId(self.layerId);
     LayeredBitmap.RemoveLayer(idx);
     LayeredBitmap.RemoveLayer(idx);
     SelectedImageLayerIndex := LayeredBitmap.GetLayerIndexFromId(self.previousActiveLayerId);
     SelectedImageLayerIndex := LayeredBitmap.GetLayerIndexFromId(self.previousActiveLayerId);
+    idx := LayeredBitmap.IndexOfOriginal(originalGuid);
+    LayeredBitmap.DeleteOriginal(idx);
   end;
   end;
 end;
 end;
 
 
@@ -1695,9 +1698,11 @@ begin
 
 
   self.name := AName;
   self.name := AName;
   self.blendOp:= AblendOp;
   self.blendOp:= AblendOp;
+  self.opacity:= AOpacity;
   self.matrix := AMatrix;
   self.matrix := AMatrix;
   self.previousActiveLayerId := imgDest.LayeredBitmap.LayerUniqueId[imgDest.SelectedImageLayerIndex];
   self.previousActiveLayerId := imgDest.LayeredBitmap.LayerUniqueId[imgDest.SelectedImageLayerIndex];
   idx := imgDest.LayeredBitmap.AddLayerFromOwnedOriginal(AOriginal, ABlendOp, AOpacity);
   idx := imgDest.LayeredBitmap.AddLayerFromOwnedOriginal(AOriginal, ABlendOp, AOpacity);
+  originalGuid := AOriginal.Guid;
   imgDest.LayeredBitmap.LayerName[idx] := name;
   imgDest.LayeredBitmap.LayerName[idx] := name;
   imgDest.LayeredBitmap.LayerOriginalMatrix[idx] := matrix;
   imgDest.LayeredBitmap.LayerOriginalMatrix[idx] := matrix;
   self.layerId := imgDest.LayeredBitmap.LayerUniqueId[idx];
   self.layerId := imgDest.LayeredBitmap.LayerUniqueId[idx];

+ 27 - 0
lazpaint/image/ustatetype.pas

@@ -68,9 +68,12 @@ type
     function GetCount: integer;
     function GetCount: integer;
     function GetItem(AIndex: integer): TCustomImageDifference;
     function GetItem(AIndex: integer): TCustomImageDifference;
     function GetTotalCount: integer;
     function GetTotalCount: integer;
+    procedure SetLockAgglutinate(AValue: boolean);
   protected
   protected
     FDiffs: TImageDifferenceList;
     FDiffs: TImageDifferenceList;
     FAgglutinate: boolean;
     FAgglutinate: boolean;
+    FLockAgglutinate: boolean; // prevent stopping the agglutination to have a frame
+                               // for subactions having their own stack of composed difference
     function GetIsIdentity: boolean; override;
     function GetIsIdentity: boolean; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetChangingBounds: TRect; override;
     function GetChangingBounds: TRect; override;
@@ -89,11 +92,13 @@ type
     procedure Clear;
     procedure Clear;
     procedure Delete(AIndex: integer);
     procedure Delete(AIndex: integer);
     procedure DeleteFrom(AIndex: integer);
     procedure DeleteFrom(AIndex: integer);
+    function IndexOf(ADiff: TCustomImageDifference): integer;
     function GetLast: TCustomImageDifference;
     function GetLast: TCustomImageDifference;
     function ToString: ansistring; override;
     function ToString: ansistring; override;
     property Count: integer read GetCount;
     property Count: integer read GetCount;
     property TotalCount: integer read GetTotalCount;
     property TotalCount: integer read GetTotalCount;
     property Agglutinate: boolean read FAgglutinate;
     property Agglutinate: boolean read FAgglutinate;
+    property LockAgglutinate: boolean read FLockAgglutinate write SetLockAgglutinate;
     property Item[AIndex: integer]: TCustomImageDifference read GetItem; default;
     property Item[AIndex: integer]: TCustomImageDifference read GetItem; default;
   end;
   end;
 
 
@@ -223,6 +228,14 @@ begin
       inc(result, FDiffs[i].GetCost);
       inc(result, FDiffs[i].GetCost);
 end;
 end;
 
 
+procedure TComposedImageDifference.SetLockAgglutinate(AValue: boolean);
+begin
+  if FLockAgglutinate=AValue then Exit;
+  if AValue and not Agglutinate then
+    raise Exception.Create('Currently not agglutinating actions');
+  FLockAgglutinate:=AValue;
+end;
+
 function TComposedImageDifference.GetIsIdentity: boolean;
 function TComposedImageDifference.GetIsIdentity: boolean;
 var
 var
   i: Integer;
   i: Integer;
@@ -290,8 +303,17 @@ begin
 end;
 end;
 
 
 procedure TComposedImageDifference.StopAgglutinate;
 procedure TComposedImageDifference.StopAgglutinate;
+var
+  last: TComposedImageDifference;
 begin
 begin
   FAgglutinate:= false;
   FAgglutinate:= false;
+  if (FDiffs.Count > 0) and (FDiffs[FDiffs.Count-1] is TComposedImageDifference) then
+  begin
+    last := TComposedImageDifference(FDiffs[FDiffs.Count-1]);
+    last.StopAgglutinate;
+    if last.Count = 0 then
+       FDiffs.Delete(FDiffs.Count-1);
+  end;
 end;
 end;
 
 
 destructor TComposedImageDifference.Destroy;
 destructor TComposedImageDifference.Destroy;
@@ -365,6 +387,11 @@ begin
     Delete(i);
     Delete(i);
 end;
 end;
 
 
+function TComposedImageDifference.IndexOf(ADiff: TCustomImageDifference): integer;
+begin
+  result := FDiffs.IndexOf(ADiff);
+end;
+
 function TComposedImageDifference.GetLast: TCustomImageDifference;
 function TComposedImageDifference.GetLast: TCustomImageDifference;
 begin
 begin
   if Count = 0 then result := nil
   if Count = 0 then result := nil

+ 14 - 2
lazpaint/lazpaint.lpi

@@ -21,14 +21,19 @@
     <i18n>
     <i18n>
       <EnableI18N Value="True"/>
       <EnableI18N Value="True"/>
       <OutDir Value="release\bin\i18n"/>
       <OutDir Value="release\bin\i18n"/>
+      <ExcludedOriginals Count="3">
+        <Item1 Value="rsPreview"/>
+        <Item2 Value="rsOK"/>
+        <Item3 Value="rsCancel"/>
+      </ExcludedOriginals>
     </i18n>
     </i18n>
     <VersionInfo>
     <VersionInfo>
       <UseVersionInfo Value="True"/>
       <UseVersionInfo Value="True"/>
       <MajorVersionNr Value="7"/>
       <MajorVersionNr Value="7"/>
       <MinorVersionNr Value="2"/>
       <MinorVersionNr Value="2"/>
+      <RevisionNr Value="2"/>
       <CharSet Value="04B0"/>
       <CharSet Value="04B0"/>
       <StringTable CompanyName="http://sourceforge.net/projects/lazpaint/" FileDescription="LazPaint" InternalName="lazpaint" OriginalFilename="lazpaint.exe" ProductName="LazPaint"/>
       <StringTable CompanyName="http://sourceforge.net/projects/lazpaint/" FileDescription="LazPaint" InternalName="lazpaint" OriginalFilename="lazpaint.exe" ProductName="LazPaint"/>
-      <RevisionNr Value="2"/>
     </VersionInfo>
     </VersionInfo>
     <BuildModes Count="10">
     <BuildModes Count="10">
       <Item1 Name="Debug" Default="True"/>
       <Item1 Name="Debug" Default="True"/>
@@ -430,7 +435,7 @@
         <PackageName Value="LCL"/>
         <PackageName Value="LCL"/>
       </Item5>
       </Item5>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="107">
+    <Units Count="108">
       <Unit0>
       <Unit0>
         <Filename Value="lazpaint.lpr"/>
         <Filename Value="lazpaint.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -1057,6 +1062,13 @@
         <Filename Value="getfilesindir.inc"/>
         <Filename Value="getfilesindir.inc"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
       </Unit106>
       </Unit106>
+      <Unit107>
+        <Filename Value="dialog\filter\uhypocycloid.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FHypocycloid"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit107>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

+ 1 - 1
lazpaint/lazpaint.lpr

@@ -40,7 +40,7 @@ uses
   URainType, UFormRain, UPaletteToolbar, uselectionhighlight,
   URainType, UFormRain, UPaletteToolbar, uselectionhighlight,
   UImagePreview, UPreviewDialog, UQuestion, UTiff, UImageView,
   UImagePreview, UPreviewDialog, UQuestion, UTiff, UImageView,
   UDarkTheme, URaw, UProcessAuto, UPython, UImageBackup, ULayerStackInterface,
   UDarkTheme, URaw, UProcessAuto, UPython, UImageBackup, ULayerStackInterface,
-  UChooseColorInterface, UIconCache;
+  UChooseColorInterface, UIconCache, uhypocycloid;
 
 
 //sometimes LResources disappear in the uses clause
 //sometimes LResources disappear in the uses clause
 
 

+ 12 - 0
lazpaint/lazpaintdialogs.inc

@@ -583,4 +583,16 @@ begin
   self.ShowTopmost(top);
   self.ShowTopmost(top);
 end;
 end;
 
 
+function TLazPaintInstance.ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
+var oldSelectionNormal: boolean;
+    top: TTopMostInfo;
+begin
+  top := self.HideTopmost;
+  oldSelectionNormal := ShowSelectionNormal;
+  ShowSelectionNormal := true;
+  result := uhypocycloid.ShowHypocycloidDlg(AInstance, AParameters);
+  ShowSelectionNormal := oldSelectionNormal;
+  self.ShowTopmost(top);
+end;
+
 
 

+ 46 - 5
lazpaint/lazpaintinstance.pas

@@ -7,7 +7,7 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, LazPaintType, BGRABitmap, BGRABitmapTypes, BGRALayers, LCVectorialFill,
   Classes, SysUtils, LazPaintType, BGRABitmap, BGRABitmapTypes, BGRALayers, LCVectorialFill,
-  Menus, Forms, Controls, fgl,
+  Menus, Forms, Controls, fgl, LCLType,
 
 
   LazPaintMainForm, UMainFormLayout,
   LazPaintMainForm, UMainFormLayout,
 
 
@@ -73,6 +73,7 @@ type
     procedure PythonScriptCommand({%H-}ASender: TObject; ACommand, AParam: UTF8String; out
     procedure PythonScriptCommand({%H-}ASender: TObject; ACommand, AParam: UTF8String; out
       AResult: UTF8String);
       AResult: UTF8String);
     procedure PythonBusy({%H-}Sender: TObject);
     procedure PythonBusy({%H-}Sender: TObject);
+    procedure PythonWarning({%H-}Sender: TObject; AMessage: UTF8String; out AProceed: boolean);
     function ScriptShowMessage(AVars: TVariableSet): TScriptResult;
     function ScriptShowMessage(AVars: TVariableSet): TScriptResult;
     function ScriptInputBox(AVars: TVariableSet): TScriptResult;
     function ScriptInputBox(AVars: TVariableSet): TScriptResult;
     procedure ToolQueryColorTarget({%H-}sender: TToolManager; ATarget: TVectorialFill);
     procedure ToolQueryColorTarget({%H-}sender: TToolManager; ATarget: TVectorialFill);
@@ -240,6 +241,7 @@ type
     procedure ColorToFChooseColor; override;
     procedure ColorToFChooseColor; override;
     procedure ExitColorEditor; override;
     procedure ExitColorEditor; override;
     function ColorEditorActive: boolean; override;
     function ColorEditorActive: boolean; override;
+    procedure NotifyColorBinding; override;
     function ShowSaveOptionDlg({%H-}AParameters: TVariableSet; AOutputFilenameUTF8: string;
     function ShowSaveOptionDlg({%H-}AParameters: TVariableSet; AOutputFilenameUTF8: string;
       ASkipOptions: boolean; AExport: boolean): boolean; override;
       ASkipOptions: boolean; AExport: boolean): boolean; override;
     function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; override;
     function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; override;
@@ -260,6 +262,7 @@ type
     function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; override;
     function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; override;
     function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; override;
     function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; override;
     function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; override;
     function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; override;
+    function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; override;
     procedure ShowPrintDlg; override;
     procedure ShowPrintDlg; override;
     function HideTopmost: TTopMostInfo; override;
     function HideTopmost: TTopMostInfo; override;
     procedure ShowTopmost(AInfo: TTopMostInfo); override;
     procedure ShowTopmost(AInfo: TTopMostInfo); override;
@@ -288,16 +291,20 @@ type
     procedure UpdateEditPicture(ADelayed: boolean); override;
     procedure UpdateEditPicture(ADelayed: boolean); override;
     procedure AddColorToPalette(AColor: TBGRAPixel); override;
     procedure AddColorToPalette(AColor: TBGRAPixel); override;
     procedure RemoveColorFromPalette(AColor: TBGRAPixel); override;
     procedure RemoveColorFromPalette(AColor: TBGRAPixel); override;
+    function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; override;
     property Initialized: boolean read GetInitialized;
     property Initialized: boolean read GetInitialized;
+    procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); override;
+    procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); override;
+    procedure SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char); override;
   end;
   end;
 
 
 implementation
 implementation
 
 
-uses LCLType, Types, Dialogs, FileUtil, StdCtrls, LCLIntf, BGRAUTF8, UTranslation,
+uses Types, Dialogs, FileUtil, StdCtrls, LCLIntf, BGRAUTF8, UTranslation,
 
 
      URadialBlur, UMotionBlur, UEmboss, UTwirl, UWaveDisplacement,
      URadialBlur, UMotionBlur, UEmboss, UTwirl, UWaveDisplacement,
      unewimage, uresample, UPixelate, unoisefilter, ufilters,
      unewimage, uresample, UPixelate, unoisefilter, ufilters,
-     USharpen, uposterize, UPhongFilter, UFilterFunction,
+     USharpen, uposterize, uhypocycloid, UPhongFilter, UFilterFunction,
      uprint, USaveOption, UFormRain,
      uprint, USaveOption, UFormRain,
      {$IFDEF DARWIN}Graphics, BGRAGraphics,{$ENDIF}
      {$IFDEF DARWIN}Graphics, BGRAGraphics,{$ENDIF}
 
 
@@ -1023,6 +1030,12 @@ begin
   Application.ProcessMessages;
   Application.ProcessMessages;
 end;
 end;
 
 
+procedure TLazPaintInstance.PythonWarning(Sender: TObject;
+  AMessage: UTF8String; out AProceed: boolean);
+begin
+  AProceed := QuestionDlg(rsScript, AMessage, mtWarning, [mrOk,rsOkay, mrCancel,rsCancel],'') = mrOK;
+end;
+
 function TLazPaintInstance.GetShowSelectionNormal: boolean;
 function TLazPaintInstance.GetShowSelectionNormal: boolean;
 begin
 begin
   if FMain <> nil then result := fmain.ShowSelectionNormal
   if FMain <> nil then result := fmain.ShowSelectionNormal
@@ -1888,8 +1901,8 @@ begin
       else FScriptName := AFilename;
       else FScriptName := AFilename;
     p.OnCommand:=@PythonScriptCommand;
     p.OnCommand:=@PythonScriptCommand;
     p.OnBusy := @PythonBusy;
     p.OnBusy := @PythonBusy;
-    p.Run(AFilename);
-    if p.ErrorText<>'' then
+    p.OnWarning:= @PythonWarning;
+    if not p.Run(AFilename) and (p.ErrorText<>'') then
     begin
     begin
       fError := TForm.Create(nil);
       fError := TForm.Create(nil);
       try
       try
@@ -1981,6 +1994,11 @@ begin
     else result := false;
     else result := false;
 end;
 end;
 
 
+procedure TLazPaintInstance.NotifyColorBinding;
+begin
+  if Assigned(FChooseColor) then FChooseColor.SimpleRedraw;
+end;
+
 function TLazPaintInstance.ShowSaveOptionDlg(AParameters: TVariableSet;
 function TLazPaintInstance.ShowSaveOptionDlg(AParameters: TVariableSet;
   AOutputFilenameUTF8: string; ASkipOptions: boolean; AExport: boolean): boolean;
   AOutputFilenameUTF8: string; ASkipOptions: boolean; AExport: boolean): boolean;
 begin
 begin
@@ -2195,5 +2213,28 @@ begin
   if Assigned(FMain) then FMain.Layout.RemoveColorFromPalette(AColor);
   if Assigned(FMain) then FMain.Layout.RemoveColorFromPalette(AColor);
 end;
 end;
 
 
+function TLazPaintInstance.GetKeyAssociatedToColor(const AColor: TBGRAPixel): string;
+begin
+  if Assigned(FMain) and
+     Assigned(FMain.Layout) and
+     Assigned(FMain.Layout.PaletteToolbar) then Result := FMain.Layout.PaletteToolbar.GetKeyAssociatedToColor(AColor)
+  else Result := '';
+end;
+
+procedure TLazPaintInstance.SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState);
+begin
+  if Assigned(FMain) then FMain.FormKeyDown(FMain, key, Shift);
+end;
+
+procedure TLazPaintInstance.SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState);
+begin
+  if Assigned(FMain) then FMain.FormKeyUp(FMain, key, Shift);
+end;
+
+procedure TLazPaintInstance.SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char);
+begin
+  if Assigned(FMain) then FMain.FormUTF8KeyPress(FMain, UTF8Key);
+end;
+
 end.
 end.
 
 

+ 28 - 1
lazpaint/lazpaintmainform.lfm

@@ -24,7 +24,7 @@ object FMain: TFMain
   OnUTF8KeyPress = FormUTF8KeyPress
   OnUTF8KeyPress = FormUTF8KeyPress
   Position = poDefault
   Position = poDefault
   ShowHint = True
   ShowHint = True
-  LCLVersion = '2.2.0.1'
+  LCLVersion = '2.2.6.0'
   object Panel_ToolbarBackground: TPanel
   object Panel_ToolbarBackground: TPanel
     Left = 8
     Left = 8
     Height = 36
     Height = 36
@@ -35,6 +35,7 @@ object FMain: TFMain
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
     TabOrder = 8
     TabOrder = 8
+    OnClick = Panel_ToolbarBackgroundClick
   end
   end
   object Panel_File: TPanel
   object Panel_File: TPanel
     Left = 48
     Left = 48
@@ -134,6 +135,7 @@ object FMain: TFMain
       Font.Color = clWindowText
       Font.Color = clWindowText
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
       Transparent = False
       Transparent = False
     end
     end
@@ -212,6 +214,7 @@ object FMain: TFMain
       Caption = '100%'
       Caption = '100%'
       Font.Height = -10
       Font.Height = -10
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
   end
   end
@@ -235,6 +238,7 @@ object FMain: TFMain
       Caption = 'Width'
       Caption = 'Width'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_PenWidth: TBCTrackbarUpdown
     object SpinEdit_PenWidth: TBCTrackbarUpdown
@@ -334,6 +338,7 @@ object FMain: TFMain
       Caption = 'Erase'
       Caption = 'Erase'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar19: TToolBar
     object ToolBar19: TToolBar
@@ -487,6 +492,7 @@ object FMain: TFMain
       Caption = 'Tolerance'
       Caption = 'Tolerance'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar6: TToolBar
     object ToolBar6: TToolBar
@@ -725,6 +731,7 @@ object FMain: TFMain
       Caption = '9999x9999'
       Caption = '9999x9999'
       Font.Height = -10
       Font.Height = -10
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
   end
   end
@@ -1327,6 +1334,7 @@ object FMain: TFMain
       Caption = 'Grid'
       Caption = 'Grid'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object Label_GridX: TLabel
     object Label_GridX: TLabel
@@ -1339,6 +1347,7 @@ object FMain: TFMain
       Caption = 'x'
       Caption = 'x'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar13: TToolBar
     object ToolBar13: TToolBar
@@ -1554,6 +1563,7 @@ object FMain: TFMain
       Caption = 'Curve'
       Caption = 'Curve'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar20: TToolBar
     object ToolBar20: TToolBar
@@ -1764,6 +1774,7 @@ object FMain: TFMain
       Caption = 'Text'
       Caption = 'Text'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
       OnMouseMove = Panel_TextMouseMove
       OnMouseMove = Panel_TextMouseMove
     end
     end
@@ -1923,6 +1934,7 @@ object FMain: TFMain
       Caption = 'Shape'
       Caption = 'Shape'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object Label_PhongBorder: TLabel
     object Label_PhongBorder: TLabel
@@ -1934,6 +1946,7 @@ object FMain: TFMain
       Caption = 'Border'
       Caption = 'Border'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar16: TToolBar
     object ToolBar16: TToolBar
@@ -2103,6 +2116,7 @@ object FMain: TFMain
       Caption = 'Altitude'
       Caption = 'Altitude'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_ShapeAltitude: TBCTrackbarUpdown
     object SpinEdit_ShapeAltitude: TBCTrackbarUpdown
@@ -2202,6 +2216,7 @@ object FMain: TFMain
       Caption = 'Width'
       Caption = 'Width'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar17: TToolBar
     object ToolBar17: TToolBar
@@ -2360,6 +2375,7 @@ object FMain: TFMain
       Caption = 'Brush'
       Caption = 'Brush'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object Label_Spacing: TLabel
     object Label_Spacing: TLabel
@@ -2371,6 +2387,7 @@ object FMain: TFMain
       Caption = 'Spacing'
       Caption = 'Spacing'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object ToolBar21: TToolBar
     object ToolBar21: TToolBar
@@ -2623,6 +2640,7 @@ object FMain: TFMain
       Caption = 'Ratio'
       Caption = 'Ratio'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
   end
   end
@@ -2730,6 +2748,7 @@ object FMain: TFMain
       Caption = 'Blur'
       Caption = 'Blur'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_TextBlur: TBCTrackbarUpdown
     object SpinEdit_TextBlur: TBCTrackbarUpdown
@@ -2817,6 +2836,7 @@ object FMain: TFMain
       Caption = 'Offset'
       Caption = 'Offset'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object SpinEdit_TextShadowX: TBCTrackbarUpdown
     object SpinEdit_TextShadowX: TBCTrackbarUpdown
@@ -2993,6 +3013,7 @@ object FMain: TFMain
       Caption = 'Pen'
       Caption = 'Pen'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object VectorialFill_Pen: TLCVectorialFillControl
     object VectorialFill_Pen: TLCVectorialFillControl
@@ -3177,6 +3198,7 @@ object FMain: TFMain
       Caption = 'Back'
       Caption = 'Back'
       Font.Height = -12
       Font.Height = -12
       Layout = tlCenter
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
     object VectorialFill_Back: TLCVectorialFillControl
     object VectorialFill_Back: TLCVectorialFillControl
@@ -5614,6 +5636,11 @@ object FMain: TFMain
       OnUpdate = FileSaveUpdate
       OnUpdate = FileSaveUpdate
       ShortCut = 16465
       ShortCut = 16465
     end
     end
+    object RenderHypocycloid: TAction
+      Category = 'Render'
+      Caption = 'Hypocycloid...'
+      OnExecute = RenderAnyExecute
+    end
   end
   end
   object ColorDialog1: TColorDialog
   object ColorDialog1: TColorDialog
     Title = 'Choose color'
     Title = 'Choose color'

+ 335 - 334
lazpaint/lazpaintmainform.lrj

@@ -1,334 +1,335 @@
-{"version":1,"strings":[
-{"hash":150371188,"name":"tfmain.caption","sourcebytes":[76,97,122,80,97,105,110,116],"value":"LazPaint"},
-{"hash":44380332,"name":"tfmain.image_currenttool.hint","sourcebytes":[83,101,108,101,99,116,101,100,32,116,111,111,108],"value":"Selected tool"},
-{"hash":30191261,"name":"tfmain.label_currentzoom.hint","sourcebytes":[67,117,114,114,101,110,116,32,122,111,111,109],"value":"Current zoom"},
-{"hash":37,"name":"tfmain.label_currentzoom.caption","sourcebytes":[37],"value":"%"},
-{"hash":176868709,"name":"tfmain.label_currentdiff.hint","sourcebytes":[67,111,108,111,114,32,100,105,102,102,101,114,101,110,99,101],"value":"Color difference"},
-{"hash":213797,"name":"tfmain.label_currentdiff.caption","sourcebytes":[49,48,48,37],"value":"100%"},
-{"hash":6159272,"name":"tfmain.label_penwidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"},
-{"hash":8236392,"name":"tfmain.spinedit_penwidth.hint","sourcebytes":[80,101,110,32,119,105,100,116,104],"value":"Pen width"},
-{"hash":5015701,"name":"tfmain.label_eraser.caption","sourcebytes":[69,114,97,115,101],"value":"Erase"},
-{"hash":219565076,"name":"tfmain.tool_erasealpha.hint","sourcebytes":[77,97,107,101,32,116,114,97,110,115,112,97,114,101,110,116],"value":"Make transparent"},
-{"hash":94755518,"name":"tfmain.tool_eraseblur.hint","sourcebytes":[83,111,102,116,101,110],"value":"Soften"},
-{"hash":50199278,"name":"tfmain.tool_eraselighten.hint","sourcebytes":[76,105,103,104,116,101,110],"value":"Lighten"},
-{"hash":78156222,"name":"tfmain.tool_erasedarken.hint","sourcebytes":[68,97,114,107,101,110],"value":"Darken"},
-{"hash":166237934,"name":"tfmain.tool_erasesharpen.hint","sourcebytes":[83,104,97,114,112,101,110],"value":"Sharpen"},
-{"hash":250503177,"name":"tfmain.spinedit_eraser.hint","sourcebytes":[69,114,97,115,101,114,32,111,112,97,99,105,116,121],"value":"Eraser opacity"},
-{"hash":46678005,"name":"tfmain.label_tolerance.caption","sourcebytes":[84,111,108,101,114,97,110,99,101],"value":"Tolerance"},
-{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.hint","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"},
-{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.caption","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"},
-{"hash":115147346,"name":"tfmain.tool_drawshapeborder.hint","sourcebytes":[68,114,97,119,32,98,111,114,100,101,114],"value":"Draw border"},
-{"hash":243087429,"name":"tfmain.tool_fillshape.hint","sourcebytes":[70,105,108,108,32,115,104,97,112,101],"value":"Fill shape"},
-{"hash":181333059,"name":"tfmain.label_coordinates.hint","sourcebytes":[67,111,111,114,100,105,110,97,116,101,115],"value":"Coordinates"},
-{"hash":218886153,"name":"tfmain.label_coordinates.caption","sourcebytes":[57,57,57,57,120,57,57,57,57],"value":"9999x9999"},
-{"hash":42364240,"name":"tfmain.tool_capflat.hint","sourcebytes":[70,108,97,116,32,99,97,112],"value":"Flat cap"},
-{"hash":205926624,"name":"tfmain.tool_capround.hint","sourcebytes":[82,111,117,110,100,32,99,97,112],"value":"Round cap"},
-{"hash":142786864,"name":"tfmain.tool_capsquare.hint","sourcebytes":[83,113,117,97,114,101,32,99,97,112],"value":"Square cap"},
-{"hash":224157463,"name":"tfmain.spinedit_arrowsizex.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Horizontal size of the arrow"},
-{"hash":47574855,"name":"tfmain.spinedit_arrowsizey.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Vertical size of the arrow"},
-{"hash":65090695,"name":"tfmain.combobox_arrowstart.hint","sourcebytes":[83,116,97,114,116,105,110,103,32,97,114,114,111,119],"value":"Starting arrow"},
-{"hash":229386535,"name":"tfmain.combobox_arrowend.hint","sourcebytes":[69,110,100,105,110,103,32,97,114,114,111,119],"value":"Ending arrow"},
-{"hash":199465278,"name":"tfmain.tool_joinbevel.hint","sourcebytes":[66,101,118,101,108,32,106,111,105,110],"value":"Bevel join"},
-{"hash":73704254,"name":"tfmain.tool_joinround.hint","sourcebytes":[82,111,117,110,100,32,106,111,105,110],"value":"Round join"},
-{"hash":205804894,"name":"tfmain.tool_joinmiter.hint","sourcebytes":[77,105,116,101,114,32,106,111,105,110],"value":"Miter join"},
-{"hash":8055525,"name":"tfmain.combobox_penstyle.hint","sourcebytes":[80,101,110,32,115,116,121,108,101],"value":"Pen style"},
-{"hash":321780,"name":"tfmain.label_grid.caption","sourcebytes":[71,114,105,100],"value":"Grid"},
-{"hash":120,"name":"tfmain.label_gridx.caption","sourcebytes":[120],"value":"x"},
-{"hash":65314814,"name":"tfmain.tool_gridmovewithoutdeformation.hint","sourcebytes":[77,111,118,101,32,103,114,105,100,32,119,105,116,104,111,117,116,32,100,101,102,111,114,109,97,116,105,111,110],"value":"Move grid without deformation"},
-{"hash":4901317,"name":"tfmain.label_curve.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"},
-{"hash":200334437,"name":"tfmain.tool_curvemodeangle.hint","sourcebytes":[68,114,97,119,32,97,110,32,97,110,103,108,101],"value":"Draw an angle"},
-{"hash":131219621,"name":"tfmain.tool_curvemodecurve.hint","sourcebytes":[68,114,97,119,32,97,32,99,117,114,118,101],"value":"Draw a curve"},
-{"hash":218543091,"name":"tfmain.tool_curvemodeauto.hint","sourcebytes":[65,117,116,111,100,101,116,101,99,116,32,97,110,103,108,101,115],"value":"Autodetect angles"},
-{"hash":125049492,"name":"tfmain.tool_curvemovepoint.hint","sourcebytes":[77,111,118,101,32,112,111,105,110,116],"value":"Move point"},
-{"hash":371956,"name":"tfmain.label_text.caption","sourcebytes":[84,101,120,116],"value":"Text"},
-{"hash":71566590,"name":"tfmain.tool_textfont.hint","sourcebytes":[67,104,111,111,115,101,32,102,111,110,116,46,46,46],"value":"Choose font..."},
-{"hash":180162887,"name":"tfmain.tool_textphong.hint","sourcebytes":[84,101,120,116,32,112,104,111,110,103,32,115,104,97,100,105,110,103],"value":"Text phong shading"},
-{"hash":235120932,"name":"tfmain.tool_textalignleft.hint","sourcebytes":[65,108,105,103,110,32,108,101,102,116],"value":"Align left"},
-{"hash":77355714,"name":"tfmain.tool_textaligncenter.hint","sourcebytes":[67,101,110,116,101,114],"value":"Center"},
-{"hash":3199508,"name":"tfmain.tool_textalignright.hint","sourcebytes":[65,108,105,103,110,32,114,105,103,104,116],"value":"Align right"},
-{"hash":258464709,"name":"tfmain.spinedit_textsize.hint","sourcebytes":[84,101,120,116,32,115,105,122,101],"value":"Text size"},
-{"hash":5892197,"name":"tfmain.label_shape.caption","sourcebytes":[83,104,97,112,101],"value":"Shape"},
-{"hash":76974786,"name":"tfmain.label_phongborder.caption","sourcebytes":[66,111,114,100,101,114],"value":"Border"},
-{"hash":178787989,"name":"tfmain.tool_phongshaperectangle.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"},
-{"hash":4807381,"name":"tfmain.tool_phongshaperoundrect.hint","sourcebytes":[82,111,117,110,100,101,100,32,114,101,99,116,97,110,103,108,101],"value":"Rounded rectangle"},
-{"hash":94825605,"name":"tfmain.tool_phongshapesphere.hint","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"},
-{"hash":304709,"name":"tfmain.tool_phongshapecone.hint","sourcebytes":[67,111,110,101],"value":"Cone"},
-{"hash":187648901,"name":"tfmain.tool_phongshapeverticalcone.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,111,110,101],"value":"Vertical cone"},
-{"hash":115522882,"name":"tfmain.tool_phongshapehorizontalcylinder.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,99,121,108,105,110,100,101,114],"value":"Horizontal cylinder"},
-{"hash":31811010,"name":"tfmain.tool_phongshapeverticalcylinder.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,121,108,105,110,100,101,114],"value":"Vertical cylinder"},
-{"hash":202312101,"name":"tfmain.spinedit_phongbordersize.hint","sourcebytes":[66,111,114,100,101,114,32,115,105,122,101],"value":"Border size"},
-{"hash":61914917,"name":"tfmain.label_altitude.caption","sourcebytes":[65,108,116,105,116,117,100,101],"value":"Altitude"},
-{"hash":221694037,"name":"tfmain.spinedit_shapealtitude.hint","sourcebytes":[83,104,97,112,101,32,97,108,116,105,116,117,100,101],"value":"Shape altitude"},
-{"hash":6159272,"name":"tfmain.label_outlinewidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"},
-{"hash":57137717,"name":"tfmain.tool_textoutline.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101],"value":"Text outline"},
-{"hash":68821400,"name":"tfmain.spinedit_textoutlinewidth.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101,32,119,105,100,116,104],"value":"Text outline width"},
-{"hash":30209135,"name":"tfmain.perspective_twoplanes.hint","sourcebytes":[68,114,97,119,32,111,112,112,111,115,105,116,101,32,112,108,97,110,101,32,116,111,111],"value":"Draw opposite plane too"},
-{"hash":65297493,"name":"tfmain.perspective_repeat.hint","sourcebytes":[82,101,112,101,97,116,32,105,109,97,103,101],"value":"Repeat image"},
-{"hash":4824216,"name":"tfmain.label_brush.caption","sourcebytes":[66,114,117,115,104],"value":"Brush"},
-{"hash":174563351,"name":"tfmain.label_spacing.caption","sourcebytes":[83,112,97,99,105,110,103],"value":"Spacing"},
-{"hash":70662787,"name":"tfmain.spinedit_brushspacing.hint","sourcebytes":[83,112,97,99,105,110,103,32,98,101,116,119,101,101,110,32,112,97,116,116,101,114,110,115],"value":"Spacing between patterns"},
-{"hash":5802751,"name":"tfmain.label_ratio.caption","sourcebytes":[82,97,116,105,111],"value":"Ratio"},
-{"hash":67807111,"name":"tfmain.tool_aliasing.hint","sourcebytes":[68,105,115,97,98,108,101,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Disable antialiasing"},
-{"hash":120839925,"name":"tfmain.tool_closeshape.hint","sourcebytes":[67,108,111,115,101,32,115,104,97,112,101],"value":"Close shape"},
-{"hash":130332167,"name":"tfmain.tool_textshadow.hint","sourcebytes":[84,101,120,116,32,115,104,97,100,111,119],"value":"Text shadow"},
-{"hash":299970,"name":"tfmain.label_textblur.caption","sourcebytes":[66,108,117,114],"value":"Blur"},
-{"hash":114259058,"name":"tfmain.spinedit_textblur.hint","sourcebytes":[83,104,97,100,111,119,32,98,108,117,114],"value":"Shadow blur"},
-{"hash":89971140,"name":"tfmain.label_shadowoffset.caption","sourcebytes":[79,102,102,115,101,116],"value":"Offset"},
-{"hash":236421172,"name":"tfmain.spinedit_textshadowx.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Horizontal shadow offset"},
-{"hash":105381300,"name":"tfmain.spinedit_textshadowy.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Vertical shadow offset"},
-{"hash":22206,"name":"tfmain.label_pen.caption","sourcebytes":[80,101,110],"value":"Pen"},
-{"hash":264792562,"name":"tfmain.image_swapcolors.hint","sourcebytes":[83,119,105,116,99,104,32,99,111,108,111,114],"value":"Switch color"},
-{"hash":296859,"name":"tfmain.label_back.caption","sourcebytes":[66,97,99,107],"value":"Back"},
-{"hash":76172398,"name":"tfmain.button_donate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."},
-{"hash":300580,"name":"tfmain.tool_textbold.hint","sourcebytes":[66,111,108,100],"value":"Bold"},
-{"hash":84574963,"name":"tfmain.tool_textitalic.hint","sourcebytes":[73,116,97,108,105,99],"value":"Italic"},
-{"hash":180974597,"name":"tfmain.tool_textunderline.hint","sourcebytes":[85,110,100,101,114,108,105,110,101],"value":"Underline"},
-{"hash":151125108,"name":"tfmain.tool_textstrikeout.hint","sourcebytes":[83,116,114,105,107,101,111,117,116],"value":"Strikeout"},
-{"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"},
-{"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"},
-{"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"},
-{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"},
-{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"},
-{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"},
-{"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."},
-{"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"},
-{"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."},
-{"hash":218146437,"name":"tfmain.fileopen.hint","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101],"value":"Open existing file"},
-{"hash":23459486,"name":"tfmain.viewzoomin.hint","sourcebytes":[90,111,111,109,32,105,110],"value":"Zoom in"},
-{"hash":106918100,"name":"tfmain.viewzoomout.hint","sourcebytes":[90,111,111,109,32,111,117,116],"value":"Zoom out"},
-{"hash":251132352,"name":"tfmain.imagehorizontalflip.caption","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,102,108,105,112],"value":"Horizontal flip"},
-{"hash":107134297,"name":"tfmain.imagehorizontalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip image horizontally"},
-{"hash":187662016,"name":"tfmain.imageverticalflip.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,102,108,105,112],"value":"Vertical flip"},
-{"hash":128483817,"name":"tfmain.imageverticalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip image vertically"},
-{"hash":72010382,"name":"tfmain.imageresample.caption","sourcebytes":[82,101,115,97,109,112,108,101,46,46,46],"value":"Resample..."},
-{"hash":200831861,"name":"tfmain.imageresample.hint","sourcebytes":[82,101,115,97,109,112,108,101,32,105,109,97,103,101],"value":"Resample image"},
-{"hash":192766339,"name":"tfmain.imagesmartzoom3.caption","sourcebytes":[83,109,97,114,116,32,122,111,111,109,32,120,51],"value":"Smart zoom x3"},
-{"hash":23626005,"name":"tfmain.viewzoomoriginal.caption","sourcebytes":[79,114,105,103,105,110,97,108,32,115,105,122,101],"value":"Original size"},
-{"hash":259531189,"name":"tfmain.viewzoomoriginal.hint","sourcebytes":[90,111,111,109,32,116,111,32,111,114,105,103,105,110,97,108,32,112,105,120,101,108,32,115,105,122,101],"value":"Zoom to original pixel size"},
-{"hash":378031,"name":"tfmain.editundo.caption","sourcebytes":[85,110,100,111],"value":"Undo"},
-{"hash":130699086,"name":"tfmain.editundo.hint","sourcebytes":[85,110,100,111,32,108,97,115,116,32,109,111,100,105,102,105,99,97,116,105,111,110],"value":"Undo last modification"},
-{"hash":363439,"name":"tfmain.editredo.hint","sourcebytes":[82,101,100,111],"value":"Redo"},
-{"hash":106916628,"name":"tfmain.viewzoomfit.caption","sourcebytes":[90,111,111,109,32,102,105,116],"value":"Zoom fit"},
-{"hash":131274455,"name":"tfmain.viewzoomfit.hint","sourcebytes":[90,111,111,109,32,116,111,32,102,105,116,32,105,110,32,116,104,101,32,119,105,110,100,111,119],"value":"Zoom to fit in the window"},
-{"hash":211562244,"name":"tfmain.editdeselect.hint","sourcebytes":[68,101,115,101,108,101,99,116],"value":"Deselect"},
-{"hash":237622494,"name":"tfmain.editinvertselection.hint","sourcebytes":[73,110,118,101,114,116,32,115,101,108,101,99,116,105,111,110],"value":"Invert selection"},
-{"hash":17148597,"name":"tfmain.toolselectrect.hint","sourcebytes":[83,101,108,101,99,116,32,114,101,99,116,97,110,103,108,101],"value":"Select rectangle"},
-{"hash":135963749,"name":"tfmain.toolselectellipse.hint","sourcebytes":[83,101,108,101,99,116,32,101,108,108,105,112,115,101],"value":"Select ellipse"},
-{"hash":193486782,"name":"tfmain.toolselectpoly.hint","sourcebytes":[83,101,108,101,99,116,32,112,111,108,121,103,111,110],"value":"Select polygon"},
-{"hash":66511461,"name":"tfmain.toolselectspline.hint","sourcebytes":[83,101,108,101,99,116,32,99,117,114,118,101],"value":"Select curve"},
-{"hash":75354974,"name":"tfmain.toolmoveselection.hint","sourcebytes":[77,111,118,101,32,115,101,108,101,99,116,105,111,110],"value":"Move selection"},
-{"hash":128109646,"name":"tfmain.toolselectpen.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,112,101,110],"value":"Selection pen"},
-{"hash":228577870,"name":"tfmain.toolselectpen.hint","sourcebytes":[68,114,97,119,32,115,101,108,101,99,116,105,111,110,32,119,105,116,104,32,112,101,110],"value":"Draw selection with pen"},
-{"hash":304761,"name":"tfmain.editcopy.caption","sourcebytes":[67,111,112,121],"value":"Copy"},
-{"hash":79811454,"name":"tfmain.editcopy.hint","sourcebytes":[67,111,112,121,32,115,101,108,101,99,116,105,111,110],"value":"Copy selection"},
-{"hash":5671589,"name":"tfmain.editpaste.hint","sourcebytes":[80,97,115,116,101],"value":"Paste"},
-{"hash":19140,"name":"tfmain.editcut.caption","sourcebytes":[67,117,116],"value":"Cut"},
-{"hash":142399070,"name":"tfmain.editcut.hint","sourcebytes":[67,117,116,32,115,101,108,101,99,116,105,111,110],"value":"Cut selection"},
-{"hash":78392485,"name":"tfmain.editdeleteselection.caption","sourcebytes":[68,101,108,101,116,101],"value":"Delete"},
-{"hash":236551166,"name":"tfmain.editdeleteselection.hint","sourcebytes":[68,101,108,101,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Delete selection"},
-{"hash":169361790,"name":"tfmain.toolrotateselection.hint","sourcebytes":[82,111,116,97,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Rotate selection"},
-{"hash":195296268,"name":"tfmain.editselectall.caption","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"},
-{"hash":195296268,"name":"tfmain.editselectall.hint","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"},
-{"hash":191244600,"name":"tfmain.viewtoolbox.caption","sourcebytes":[84,111,111,108,98,111,120],"value":"Toolbox"},
-{"hash":78001811,"name":"tfmain.viewcolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"},
-{"hash":88162814,"name":"tfmain.imagecrop.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110],"value":"Crop to selection"},
-{"hash":128112628,"name":"tfmain.editselectionfit.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,102,105,116],"value":"Selection fit"},
-{"hash":73053668,"name":"tfmain.imageclearalpha.caption","sourcebytes":[67,108,101,97,114,32,97,108,112,104,97,32,99,104,97,110,110,101,108,32,97,110,100,32,115,101,116,32,98,97,99,107,103,114,111,117,110,100],"value":"Clear alpha channel and set background"},
-{"hash":32413959,"name":"tfmain.imagefillbackground.caption","sourcebytes":[70,105,108,108,32,98,97,99,107,103,114,111,117,110,100,32,119,105,116,104,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Fill background with antialiasing"},
-{"hash":40698606,"name":"tfmain.imagechangecanvassize.caption","sourcebytes":[67,97,110,118,97,115,32,115,105,122,101,46,46,46],"value":"Canvas size..."},
-{"hash":174425639,"name":"tfmain.imagerotatecw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,87],"value":"Rotate 90\u00B0 CW"},
-{"hash":106458407,"name":"tfmain.imagerotateccw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,67,87],"value":"Rotate 90\u00B0 CCW"},
-{"hash":44176496,"name":"tfmain.imagerotate180.caption","sourcebytes":[82,111,116,97,116,101,32,49,56,48,194,176],"value":"Rotate 180\u00B0"},
-{"hash":219032926,"name":"tfmain.colorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121,46,46,46],"value":"Intensity..."},
-{"hash":102010462,"name":"tfmain.colorlightness.caption","sourcebytes":[66,114,105,103,104,116,110,101,115,115,32,47,32,67,111,110,116,114,97,115,116,46,46,46],"value":"Brightness / Contrast..."},
-{"hash":247427790,"name":"tfmain.colorshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115,46,46,46],"value":"Shift colors..."},
-{"hash":156902510,"name":"tfmain.colorcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101,46,46,46],"value":"Colorize..."},
-{"hash":78427662,"name":"tfmain.helpindex.caption","sourcebytes":[73,110,100,101,120,46,46,46],"value":"Index..."},
-{"hash":158102910,"name":"tfmain.helpabout.caption","sourcebytes":[65,98,111,117,116,46,46,46],"value":"About..."},
-{"hash":112740814,"name":"tfmain.imagerepeat.caption","sourcebytes":[82,101,112,101,97,116,46,46,46],"value":"Repeat..."},
-{"hash":257089940,"name":"tfmain.toolmagicwand.caption","sourcebytes":[77,97,103,105,99,32,119,97,110,100],"value":"Magic wand"},
-{"hash":45494836,"name":"tfmain.toolmagicwand.hint","sourcebytes":[77,97,103,105,99,32,119,97,110,100,32,115,101,108,101,99,116],"value":"Magic wand select"},
-{"hash":77818803,"name":"tfmain.renderclouds.caption","sourcebytes":[67,108,111,117,100,115],"value":"Clouds"},
-{"hash":240690499,"name":"tfmain.rendercustomwater.caption","sourcebytes":[87,97,116,101,114,32,119,105,116,104,32,99,117,115,116,111,109,32,99,111,108,111,114,115],"value":"Water with custom colors"},
-{"hash":85578645,"name":"tfmain.renderperlinnoise.caption","sourcebytes":[80,101,114,108,105,110,32,110,111,105,115,101],"value":"Perlin noise"},
-{"hash":261781,"name":"tfmain.rendercyclicperlinnoise.caption","sourcebytes":[67,121,99,108,105,99,32,80,101,114,108,105,110,32,110,111,105,115,101],"value":"Cyclic Perlin noise"},
-{"hash":386644,"name":"tfmain.renderwood.caption","sourcebytes":[87,111,111,100],"value":"Wood"},
-{"hash":120105643,"name":"tfmain.renderplastik.caption","sourcebytes":[80,108,97,115,116,105,107],"value":"Plastik"},
-{"hash":239140882,"name":"tfmain.rendermetalfloor.caption","sourcebytes":[77,101,116,97,108,32,102,108,111,111,114],"value":"Metal floor"},
-{"hash":112836501,"name":"tfmain.rendercamouflage.caption","sourcebytes":[67,97,109,111,117,102,108,97,103,101],"value":"Camouflage"},
-{"hash":158477108,"name":"tfmain.rendersnowprint.caption","sourcebytes":[83,110,111,119,32,112,114,105,110,116],"value":"Snow print"},
-{"hash":5944901,"name":"tfmain.renderstone.caption","sourcebytes":[83,116,111,110,101],"value":"Stone"},
-{"hash":103012869,"name":"tfmain.renderroundstone.caption","sourcebytes":[82,111,117,110,100,32,115,116,111,110,101],"value":"Round stone"},
-{"hash":87591205,"name":"tfmain.rendermarble.caption","sourcebytes":[77,97,114,98,108,101],"value":"Marble"},
-{"hash":6130370,"name":"tfmain.renderwater.caption","sourcebytes":[87,97,116,101,114],"value":"Water"},
-{"hash":187599764,"name":"tfmain.renderwoodvertical.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,119,111,111,100],"value":"Vertical wood"},
-{"hash":137342309,"name":"tfmain.embeddedvalidate.caption","sourcebytes":[86,97,108,105,100,97,116,101],"value":"Validate"},
-{"hash":75331571,"name":"tfmain.embeddedvalidate.hint","sourcebytes":[86,97,108,105,100,97,116,101,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Validate modifications"},
-{"hash":77089212,"name":"tfmain.embeddedcancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
-{"hash":93963171,"name":"tfmain.embeddedcancel.hint","sourcebytes":[67,97,110,99,101,108,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Cancel modifications"},
-{"hash":321780,"name":"tfmain.viewgrid.caption","sourcebytes":[71,114,105,100],"value":"Grid"},
-{"hash":176417125,"name":"tfmain.editpasteasnew.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,105,109,97,103,101],"value":"Paste as new image"},
-{"hash":221621454,"name":"tfmain.editselection.caption","sourcebytes":[69,100,105,116,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Edit selection..."},
-{"hash":86572179,"name":"tfmain.viewlayerstack.caption","sourcebytes":[76,97,121,101,114,115],"value":"Layers"},
-{"hash":124848643,"name":"tfmain.viewlayerstackbutton.caption","sourcebytes":[83,104,111,119,32,108,97,121,101,114,115],"value":"Show layers"},
-{"hash":214344631,"name":"tfmain.viewlayerstackbutton.hint","sourcebytes":[83,104,111,119,32,111,114,32,104,105,100,101,32,108,97,121,101,114,32,115,116,97,99,107,32,119,105,110,100,111,119],"value":"Show or hide layer stack window"},
-{"hash":161226738,"name":"tfmain.imagecroplayer.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110,32,97,110,100,32,99,117,114,114,101,110,116,32,108,97,121,101,114],"value":"Crop to selection and current layer"},
-{"hash":97075273,"name":"tfmain.layerhorizontalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip layer horizontally"},
-{"hash":110750825,"name":"tfmain.layerverticalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip layer vertically"},
-{"hash":248838978,"name":"tfmain.layeraddnew.hint","sourcebytes":[65,100,100,32,110,101,119,32,108,97,121,101,114],"value":"Add new layer"},
-{"hash":50252034,"name":"tfmain.layerremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,108,97,121,101,114],"value":"Remove layer"},
-{"hash":26157074,"name":"tfmain.layerduplicate.hint","sourcebytes":[68,117,112,108,105,99,97,116,101,32,115,101,108,101,99,116,101,100,32,108,97,121,101,114],"value":"Duplicate selected layer"},
-{"hash":20150450,"name":"tfmain.layermergeover.hint","sourcebytes":[77,101,114,103,101,32,108,97,121,101,114,32,111,118,101,114],"value":"Merge layer over"},
-{"hash":224054046,"name":"tfmain.layerfromfile.hint","sourcebytes":[73,109,112,111,114,116,32,108,97,121,101,114,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Import layer from file..."},
-{"hash":125290754,"name":"tfmain.layermove.hint","sourcebytes":[77,111,118,101,32,108,97,121,101,114],"value":"Move layer"},
-{"hash":50603874,"name":"tfmain.layerrotate.hint","sourcebytes":[82,111,116,97,116,101,32,108,97,121,101,114],"value":"Rotate layer"},
-{"hash":222858453,"name":"tfmain.imageflatten.caption","sourcebytes":[70,108,97,116,116,101,110,32,105,109,97,103,101],"value":"Flatten image"},
-{"hash":93074804,"name":"tfmain.filereload.caption","sourcebytes":[82,101,108,111,97,100],"value":"Reload"},
-{"hash":366789,"name":"tfmain.filesave.caption","sourcebytes":[83,97,118,101],"value":"Save"},
-{"hash":60022005,"name":"tfmain.filesave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101],"value":"Save current file"},
-{"hash":124639694,"name":"tfmain.filesaveas.caption","sourcebytes":[83,97,118,101,32,97,115,46,46,46],"value":"Save as..."},
-{"hash":159035875,"name":"tfmain.filesaveas.hint","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115],"value":"Save file as"},
-{"hash":363524,"name":"tfmain.filequit.hint","sourcebytes":[81,117,105,116],"value":"Quit"},
-{"hash":169186686,"name":"tfmain.filesaveselectionas.caption","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."},
-{"hash":223186382,"name":"tfmain.fileloadselection.caption","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Load selection..."},
-{"hash":59477454,"name":"tfmain.fileimport3d.caption","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116,46,46,46],"value":"Import 3D object..."},
-{"hash":164375502,"name":"tfmain.colorcurves.caption","sourcebytes":[67,117,114,118,101,115,46,46,46],"value":"Curves..."},
-{"hash":243723214,"name":"tfmain.colorposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101,46,46,46],"value":"Posterize..."},
-{"hash":151352958,"name":"tfmain.fileprint.caption","sourcebytes":[80,114,105,110,116,46,46,46],"value":"Print..."},
-{"hash":225719252,"name":"tfmain.viewimagelist.caption","sourcebytes":[73,109,97,103,101,32,108,105,115,116],"value":"Image list"},
-{"hash":66110750,"name":"tfmain.filesaveasinsamefolder.caption","sourcebytes":[83,97,118,101,32,105,110,32,115,97,109,101,32,102,111,108,100,101,114,46,46,46],"value":"Save in same folder..."},
-{"hash":178213234,"name":"tfmain.editpasteasnewlayer.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,108,97,121,101,114],"value":"Paste as new layer"},
-{"hash":158677870,"name":"tfmain.filterblurbox.caption","sourcebytes":[66,111,120,32,98,108,117,114,46,46,46],"value":"Box blur..."},
-{"hash":234157934,"name":"tfmain.filterblurfast.caption","sourcebytes":[70,97,115,116,32,98,108,117,114,46,46,46],"value":"Fast blur..."},
-{"hash":61344174,"name":"tfmain.filterblurradial.caption","sourcebytes":[71,97,117,115,115,105,97,110,32,98,108,117,114,46,46,46],"value":"Gaussian blur..."},
-{"hash":262805710,"name":"tfmain.filterblurcorona.caption","sourcebytes":[67,111,114,111,110,97,32,98,108,117,114,46,46,46],"value":"Corona blur..."},
-{"hash":227339886,"name":"tfmain.filterblurdisk.caption","sourcebytes":[68,105,115,107,32,98,108,117,114,46,46,46],"value":"Disk blur..."},
-{"hash":77369838,"name":"tfmain.filterblurprecise.caption","sourcebytes":[80,114,101,99,105,115,101,32,98,108,117,114,46,46,46],"value":"Precise blur..."},
-{"hash":260847150,"name":"tfmain.filterblurmotion.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114,46,46,46],"value":"Motion blur..."},
-{"hash":93793486,"name":"tfmain.filterblurcustom.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114,46,46,46],"value":"Custom blur..."},
-{"hash":158314382,"name":"tfmain.filtersharpen.caption","sourcebytes":[83,104,97,114,112,101,110,46,46,46],"value":"Sharpen..."},
-{"hash":94660264,"name":"tfmain.filtersmooth.caption","sourcebytes":[83,109,111,111,116,104],"value":"Smooth"},
-{"hash":87797630,"name":"tfmain.filtermedian.caption","sourcebytes":[77,101,100,105,97,110],"value":"Median"},
-{"hash":157953342,"name":"tfmain.filteremboss.caption","sourcebytes":[69,109,98,111,115,115,46,46,46],"value":"Emboss..."},
-{"hash":154699365,"name":"tfmain.filternormalize.caption","sourcebytes":[78,111,114,109,97,108,105,122,101],"value":"Normalize"},
-{"hash":198751621,"name":"tfmain.filternegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"},
-{"hash":151640741,"name":"tfmain.filtergrayscale.caption","sourcebytes":[71,114,97,121,115,99,97,108,101],"value":"Grayscale"},
-{"hash":174438018,"name":"tfmain.filtercontour.caption","sourcebytes":[67,111,110,116,111,117,114],"value":"Contour"},
-{"hash":94825605,"name":"tfmain.filtersphere.caption","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"},
-{"hash":3165810,"name":"tfmain.filtercylinder.caption","sourcebytes":[67,121,108,105,110,100,101,114],"value":"Cylinder"},
-{"hash":258000517,"name":"tfmain.filterlinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"},
-{"hash":126661353,"name":"tfmain.filterplane.caption","sourcebytes":[80,108,97,110,101,32,40,115,108,111,119,41],"value":"Plane (slow)"},
-{"hash":235468478,"name":"tfmain.filtertwirl.caption","sourcebytes":[84,119,105,114,108,46,46,46],"value":"Twirl..."},
-{"hash":48074702,"name":"tfmain.filterpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101,46,46,46],"value":"Pixelate..."},
-{"hash":193464901,"name":"tfmain.filtercleartype.caption","sourcebytes":[67,108,101,97,114,84,121,112,101],"value":"ClearType"},
-{"hash":37795461,"name":"tfmain.filtercleartypeinverse.caption","sourcebytes":[73,110,118,101,114,115,101,32,67,108,101,97,114,84,121,112,101],"value":"Inverse ClearType"},
-{"hash":14654542,"name":"tfmain.filterphong.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112,46,46,46],"value":"Shaded map..."},
-{"hash":31581342,"name":"tfmain.filterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110,46,46,46],"value":"Apply function..."},
-{"hash":144289715,"name":"tfmain.filtercomplementarycolor.caption","sourcebytes":[67,111,109,112,108,101,109,101,110,116,97,114,121,32,99,111,108,111,114,115],"value":"Complementary colors"},
-{"hash":54233774,"name":"tfmain.filternoise.caption","sourcebytes":[78,111,105,115,101,32,102,105,108,116,101,114,46,46,46],"value":"Noise filter..."},
-{"hash":142610782,"name":"tfmain.filterrain.caption","sourcebytes":[82,97,105,110,46,46,46],"value":"Rain..."},
-{"hash":197181954,"name":"tfmain.viewstatusbar.caption","sourcebytes":[83,116,97,116,117,115,32,98,97,114],"value":"Status bar"},
-{"hash":109235189,"name":"tfmain.viewpalette.caption","sourcebytes":[80,97,108,101,116,116,101],"value":"Palette"},
-{"hash":167619026,"name":"tfmain.fileuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"},
-{"hash":64004190,"name":"tfmain.filechooseentry.caption","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,46,46,46],"value":"Choose entry..."},
-{"hash":143653317,"name":"tfmain.filechooseentry.hint","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,32,119,105,116,104,105,110,32,102,105,108,101],"value":"Choose entry within file"},
-{"hash":116001155,"name":"tfmain.forgetdialoganswers.caption","sourcebytes":[70,111,114,103,101,116,32,100,105,97,108,111,103,32,98,111,120,32,97,110,115,119,101,114,115],"value":"Forget dialog box answers"},
-{"hash":224505747,"name":"tfmain.forgetdialoganswers.hint","sourcebytes":[70,111,114,103,101,116,32,97,110,115,119,101,114,115,32,103,105,118,101,110,32,116,111,32,100,105,97,108,111,103,32,98,111,120,101,115],"value":"Forget answers given to dialog boxes"},
-{"hash":198751621,"name":"tfmain.imagenegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"},
-{"hash":258000517,"name":"tfmain.imagelinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"},
-{"hash":179963859,"name":"tfmain.imageswapredblue.caption","sourcebytes":[83,119,97,112,32,114,101,100,32,97,110,100,32,98,108,117,101,32,99,104,97,110,110,101,108,115],"value":"Swap red and blue channels"},
-{"hash":259299730,"name":"tfmain.layerzoom.hint","sourcebytes":[90,111,111,109,32,108,97,121,101,114],"value":"Zoom layer"},
-{"hash":153208601,"name":"tfmain.selectionhorizontalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip selection horizontally"},
-{"hash":166020249,"name":"tfmain.selectionverticalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip selection vertically"},
-{"hash":244531892,"name":"tfmain.fileremembersaveformat.hint","sourcebytes":[82,101,109,101,109,98,101,114,32,115,97,118,101,32,102,111,114,109,97,116],"value":"Remember save format"},
-{"hash":232678978,"name":"tfmain.layerrasterize.hint","sourcebytes":[82,97,115,116,101,114,105,122,101,32,108,97,121,101,114],"value":"Rasterize layer"},
-{"hash":97266030,"name":"tfmain.viewworkspacecolor.caption","sourcebytes":[83,101,116,32,119,111,114,107,115,112,97,99,101,32,99,111,108,111,114,46,46,46],"value":"Set workspace color..."},
-{"hash":226378933,"name":"tfmain.viewdarktheme.caption","sourcebytes":[68,97,114,107,32,116,104,101,109,101],"value":"Dark theme"},
-{"hash":17857150,"name":"tfmain.filterwavedisplacement.caption","sourcebytes":[87,97,118,101,32,100,105,115,112,108,97,99,101,109,101,110,116,46,46,46],"value":"Wave displacement..."},
-{"hash":321604,"name":"tfmain.toolhand.caption","sourcebytes":[72,97,110,100],"value":"Hand"},
-{"hash":171743509,"name":"tfmain.toolhand.hint","sourcebytes":[77,111,118,101,32,97,110,100,32,115,99,114,111,108,108,32,112,105,99,116,117,114,101],"value":"Move and scroll picture"},
-{"hash":107455380,"name":"tfmain.toolhotspot.caption","sourcebytes":[72,111,116,32,115,112,111,116],"value":"Hot spot"},
-{"hash":14124562,"name":"tfmain.toolhotspot.hint","sourcebytes":[67,104,111,111,115,101,32,104,111,116,32,115,112,111,116,32,111,102,32,97,32,99,117,114,115,111,114],"value":"Choose hot spot of a cursor"},
-{"hash":63551362,"name":"tfmain.toolcolorpicker.hint","sourcebytes":[67,111,108,111,114,32,112,105,99,107,101,114],"value":"Color picker"},
-{"hash":22206,"name":"tfmain.toolpen.caption","sourcebytes":[80,101,110],"value":"Pen"},
-{"hash":119723774,"name":"tfmain.toolpen.hint","sourcebytes":[83,105,109,112,108,101,32,112,101,110],"value":"Simple pen"},
-{"hash":4824216,"name":"tfmain.toolbrush.hint","sourcebytes":[66,114,117,115,104],"value":"Brush"},
-{"hash":80251330,"name":"tfmain.tooleraser.hint","sourcebytes":[69,114,97,115,101,114],"value":"Eraser"},
-{"hash":106595100,"name":"tfmain.toolfloodfill.hint","sourcebytes":[70,108,111,111,100,102,105,108,108],"value":"Floodfill"},
-{"hash":74651452,"name":"tfmain.toolclone.hint","sourcebytes":[67,108,111,110,101,32,116,111,111,108],"value":"Clone tool"},
-{"hash":108876645,"name":"tfmain.tooleditshape.hint","sourcebytes":[69,100,105,116,32,115,104,97,112,101],"value":"Edit shape"},
-{"hash":178787989,"name":"tfmain.toolrect.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"},
-{"hash":204670933,"name":"tfmain.toolellipse.hint","sourcebytes":[69,108,108,105,112,115,101],"value":"Ellipse"},
-{"hash":123993614,"name":"tfmain.toolpolygon.caption","sourcebytes":[80,111,108,121,103,111,110],"value":"Polygon"},
-{"hash":53188549,"name":"tfmain.toolpolygon.hint","sourcebytes":[80,111,108,121,103,111,110,32,111,114,32,112,111,108,121,108,105,110,101],"value":"Polygon or polyline"},
-{"hash":4901317,"name":"tfmain.toolspline.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"},
-{"hash":4901317,"name":"tfmain.toolspline.hint","sourcebytes":[67,117,114,118,101],"value":"Curve"},
-{"hash":142278836,"name":"tfmain.toolgradient.caption","sourcebytes":[71,114,97,100,105,101,110,116],"value":"Gradient"},
-{"hash":215410292,"name":"tfmain.toolgradient.hint","sourcebytes":[82,101,110,100,101,114,32,103,114,97,100,105,101,110,116],"value":"Render gradient"},
-{"hash":65508053,"name":"tfmain.toolphong.hint","sourcebytes":[83,104,97,100,101,100,32,115,104,97,112,101],"value":"Shaded shape"},
-{"hash":371956,"name":"tfmain.tooltext.hint","sourcebytes":[84,101,120,116],"value":"Text"},
-{"hash":158470974,"name":"tfmain.tooldeformation.caption","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110],"value":"Deformation"},
-{"hash":76663236,"name":"tfmain.tooldeformation.hint","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110,32,103,114,105,100],"value":"Deformation grid"},
-{"hash":205239287,"name":"tfmain.tooltexturemapping.hint","sourcebytes":[84,101,120,116,117,114,101,32,109,97,112,112,105,110,103],"value":"Texture mapping"},
-{"hash":43972261,"name":"tfmain.toollayermapping.hint","sourcebytes":[76,97,121,101,114,32,112,101,114,115,112,101,99,116,105,118,101],"value":"Layer perspective"},
-{"hash":98487735,"name":"tfmain.toolchangedocking.hint","sourcebytes":[67,104,97,110,103,101,32,100,111,99,107,105,110,103],"value":"Change docking"},
-{"hash":200728952,"name":"tfmain.brushcreategeometric.hint","sourcebytes":[67,114,101,97,116,101,32,103,101,111,109,101,116,114,105,99,32,98,114,117,115,104],"value":"Create geometric brush"},
-{"hash":217170606,"name":"tfmain.brushloadfromfile.hint","sourcebytes":[76,111,97,100,32,98,114,117,115,104,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Load brush from file..."},
-{"hash":15128104,"name":"tfmain.brushremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,99,117,114,114,101,110,116,32,98,114,117,115,104],"value":"Remove current brush"},
-{"hash":74217360,"name":"tfmain.editmoveup.hint","sourcebytes":[77,111,118,101,32,117,112],"value":"Move up"},
-{"hash":141109012,"name":"tfmain.editmovetofront.hint","sourcebytes":[66,114,105,110,103,32,116,111,32,102,114,111,110,116],"value":"Bring to front"},
-{"hash":209126078,"name":"tfmain.editmovedown.hint","sourcebytes":[77,111,118,101,32,100,111,119,110],"value":"Move down"},
-{"hash":9093403,"name":"tfmain.editmovetoback.hint","sourcebytes":[83,101,110,100,32,116,111,32,98,97,99,107],"value":"Send to back"},
-{"hash":141965220,"name":"tfmain.editshapealignleft.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,108,101,102,116],"value":"Align shape left"},
-{"hash":244832953,"name":"tfmain.editshapecenterhorizontally.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Center shape horizontally"},
-{"hash":122239604,"name":"tfmain.editshapealignright.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,114,105,103,104,116],"value":"Align shape right"},
-{"hash":43235424,"name":"tfmain.editshapealigntop.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,116,111,112],"value":"Align shape to the top"},
-{"hash":8451721,"name":"tfmain.editshapecentervertically.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Center shape vertically"},
-{"hash":174494829,"name":"tfmain.editshapealignbottom.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,98,111,116,116,111,109],"value":"Align shape to the bottom"},
-{"hash":52527029,"name":"tfmain.editshapetocurve.hint","sourcebytes":[67,111,110,118,101,114,116,32,115,104,97,112,101,32,116,111,32,99,117,114,118,101],"value":"Convert shape to curve"},
-{"hash":46607102,"name":"tfmain.filerunscript.caption","sourcebytes":[82,117,110,32,115,99,114,105,112,116,46,46,46],"value":"Run script..."},
-{"hash":104868661,"name":"tfmain.toolpolyline.hint","sourcebytes":[80,111,108,121,108,105,110,101],"value":"Polyline"},
-{"hash":51121525,"name":"tfmain.toolopenedcurve.hint","sourcebytes":[79,112,101,110,101,100,32,99,117,114,118,101],"value":"Opened curve"},
-{"hash":124337662,"name":"tfmain.fileexport.caption","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
-{"hash":124337662,"name":"tfmain.layerexport.hint","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
-{"hash":164762421,"name":"tfmain.filequicksave.caption","sourcebytes":[81,117,105,99,107,32,115,97,118,101],"value":"Quick save"},
-{"hash":215358547,"name":"tfmain.filequicksave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101,32,119,105,116,104,111,117,116,32,100,105,97,108,111,103,115],"value":"Save current file without dialogs"},
-{"hash":66536946,"name":"tfmain.colordialog1.title","sourcebytes":[67,104,111,111,115,101,32,99,111,108,111,114],"value":"Choose color"},
-{"hash":315429,"name":"tfmain.menufile.caption","sourcebytes":[70,105,108,101],"value":"File"},
-{"hash":167619026,"name":"tfmain.itemuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"},
-{"hash":65502867,"name":"tfmain.menurecentfiles.caption","sourcebytes":[82,101,99,101,110,116,32,102,105,108,101,115],"value":"Recent files"},
-{"hash":139375349,"name":"tfmain.menulanguage.caption","sourcebytes":[76,97,110,103,117,97,103,101],"value":"Language"},
-{"hash":76172398,"name":"tfmain.itemdonate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."},
-{"hash":310020,"name":"tfmain.menuedit.caption","sourcebytes":[69,100,105,116],"value":"Edit"},
-{"hash":94120868,"name":"tfmain.menuselect.caption","sourcebytes":[83,101,108,101,99,116],"value":"Select"},
-{"hash":380871,"name":"tfmain.menuview.caption","sourcebytes":[86,105,101,119],"value":"View"},
-{"hash":267499032,"name":"tfmain.itemviewdocktoolbox.caption","sourcebytes":[68,111,99,107,32,116,111,111,108,98,111,120],"value":"Dock toolbox"},
-{"hash":46565539,"name":"tfmain.itemdocklayersandcolors.caption","sourcebytes":[68,111,99,107,32,108,97,121,101,114,115,32,97,110,100,32,99,111,108,111,114,115],"value":"Dock layers and colors"},
-{"hash":60708750,"name":"tfmain.itemfullscreen.caption","sourcebytes":[70,117,108,108,115,99,114,101,101,110],"value":"Fullscreen"},
-{"hash":5257173,"name":"tfmain.menuimage.caption","sourcebytes":[73,109,97,103,101],"value":"Image"},
-{"hash":167030057,"name":"tfmain.menuremovetransparency.caption","sourcebytes":[82,101,109,111,118,101,32,116,114,97,110,115,112,97,114,101,110,99,121],"value":"Remove transparency"},
-{"hash":78001811,"name":"tfmain.menucolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"},
-{"hash":5989939,"name":"tfmain.menutool.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"},
-{"hash":80755394,"name":"tfmain.menufilter.caption","sourcebytes":[70,105,108,116,101,114],"value":"Filter"},
-{"hash":129960242,"name":"tfmain.menuradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"},
-{"hash":93080258,"name":"tfmain.menurender.caption","sourcebytes":[82,101,110,100,101,114],"value":"Render"},
-{"hash":94015604,"name":"tfmain.menuscript.caption","sourcebytes":[83,99,114,105,112,116],"value":"Script"},
-{"hash":322608,"name":"tfmain.menuhelp.caption","sourcebytes":[72,101,108,112],"value":"Help"},
-{"hash":130864334,"name":"tfmain.loadselectiondialog.title","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110],"value":"Load selection"},
-{"hash":695557,"name":"tfmain.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,105,109,97,103,101],"value":"Open existing image"},
-{"hash":262765813,"name":"tfmain.opentexturedialog.title","sourcebytes":[79,112,101,110,32,116,101,120,116,117,114,101],"value":"Open texture"},
-{"hash":30161076,"name":"tfmain.open3dobjectdialog.title","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116],"value":"Import 3D object"},
-{"hash":186570926,"name":"tfmain.savepicturedialog1.title","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115,46,46,46],"value":"Save file as..."},
-{"hash":169186686,"name":"tfmain.saveselectiondialog.title","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."},
-{"hash":7141976,"name":"tfmain.openbrushdialog.title","sourcebytes":[79,112,101,110,32,98,114,117,115,104],"value":"Open brush"},
-{"hash":231995746,"name":"tfmain.menufiletoolbar.caption","sourcebytes":[83,104,111,119,32,102,105,108,101,32,116,111,111,108,98,97,114],"value":"Show file toolbar"},
-{"hash":55148898,"name":"tfmain.menuzoomtoolbar.caption","sourcebytes":[83,104,111,119,32,122,111,111,109,32,116,111,111,108,98,97,114],"value":"Show zoom toolbar"},
-{"hash":185663746,"name":"tfmain.menucopypastetoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,112,121,47,112,97,115,116,101,32,116,111,111,108,98,97,114],"value":"Show copy/paste toolbar"},
-{"hash":61428515,"name":"tfmain.menucoordinatestoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,111,114,100,105,110,97,116,101,115],"value":"Show coordinates"},
-{"hash":112373618,"name":"tfmain.menuundoredotoolbar.caption","sourcebytes":[83,104,111,119,32,117,110,100,111,47,114,101,100,111,32,116,111,111,108,98,97,114],"value":"Show undo/redo toolbar"},
-{"hash":66953941,"name":"tfmain.menushowpalette.caption","sourcebytes":[83,104,111,119,32,112,97,108,101,116,116,101],"value":"Show palette"},
-{"hash":165109892,"name":"tfmain.menudocktoolboxleft.caption","sourcebytes":[68,111,99,107,32,108,101,102,116],"value":"Dock left"},
-{"hash":226248804,"name":"tfmain.menudocktoolboxright.caption","sourcebytes":[68,111,99,107,32,114,105,103,104,116],"value":"Dock right"},
-{"hash":96777627,"name":"tfmain.menuundocktoolbox.caption","sourcebytes":[85,110,100,111,99,107],"value":"Undock"},
-{"hash":44513182,"name":"tfmain.exportpicturedialog.title","sourcebytes":[69,120,112,111,114,116,32,97,115,46,46,46],"value":"Export as..."}
-]}
+{"version":1,"strings":[
+{"hash":150371188,"name":"tfmain.caption","sourcebytes":[76,97,122,80,97,105,110,116],"value":"LazPaint"},
+{"hash":44380332,"name":"tfmain.image_currenttool.hint","sourcebytes":[83,101,108,101,99,116,101,100,32,116,111,111,108],"value":"Selected tool"},
+{"hash":30191261,"name":"tfmain.label_currentzoom.hint","sourcebytes":[67,117,114,114,101,110,116,32,122,111,111,109],"value":"Current zoom"},
+{"hash":37,"name":"tfmain.label_currentzoom.caption","sourcebytes":[37],"value":"%"},
+{"hash":176868709,"name":"tfmain.label_currentdiff.hint","sourcebytes":[67,111,108,111,114,32,100,105,102,102,101,114,101,110,99,101],"value":"Color difference"},
+{"hash":213797,"name":"tfmain.label_currentdiff.caption","sourcebytes":[49,48,48,37],"value":"100%"},
+{"hash":6159272,"name":"tfmain.label_penwidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"},
+{"hash":8236392,"name":"tfmain.spinedit_penwidth.hint","sourcebytes":[80,101,110,32,119,105,100,116,104],"value":"Pen width"},
+{"hash":5015701,"name":"tfmain.label_eraser.caption","sourcebytes":[69,114,97,115,101],"value":"Erase"},
+{"hash":219565076,"name":"tfmain.tool_erasealpha.hint","sourcebytes":[77,97,107,101,32,116,114,97,110,115,112,97,114,101,110,116],"value":"Make transparent"},
+{"hash":94755518,"name":"tfmain.tool_eraseblur.hint","sourcebytes":[83,111,102,116,101,110],"value":"Soften"},
+{"hash":50199278,"name":"tfmain.tool_eraselighten.hint","sourcebytes":[76,105,103,104,116,101,110],"value":"Lighten"},
+{"hash":78156222,"name":"tfmain.tool_erasedarken.hint","sourcebytes":[68,97,114,107,101,110],"value":"Darken"},
+{"hash":166237934,"name":"tfmain.tool_erasesharpen.hint","sourcebytes":[83,104,97,114,112,101,110],"value":"Sharpen"},
+{"hash":250503177,"name":"tfmain.spinedit_eraser.hint","sourcebytes":[69,114,97,115,101,114,32,111,112,97,99,105,116,121],"value":"Eraser opacity"},
+{"hash":46678005,"name":"tfmain.label_tolerance.caption","sourcebytes":[84,111,108,101,114,97,110,99,101],"value":"Tolerance"},
+{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.hint","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"},
+{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.caption","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"},
+{"hash":115147346,"name":"tfmain.tool_drawshapeborder.hint","sourcebytes":[68,114,97,119,32,98,111,114,100,101,114],"value":"Draw border"},
+{"hash":243087429,"name":"tfmain.tool_fillshape.hint","sourcebytes":[70,105,108,108,32,115,104,97,112,101],"value":"Fill shape"},
+{"hash":181333059,"name":"tfmain.label_coordinates.hint","sourcebytes":[67,111,111,114,100,105,110,97,116,101,115],"value":"Coordinates"},
+{"hash":218886153,"name":"tfmain.label_coordinates.caption","sourcebytes":[57,57,57,57,120,57,57,57,57],"value":"9999x9999"},
+{"hash":42364240,"name":"tfmain.tool_capflat.hint","sourcebytes":[70,108,97,116,32,99,97,112],"value":"Flat cap"},
+{"hash":205926624,"name":"tfmain.tool_capround.hint","sourcebytes":[82,111,117,110,100,32,99,97,112],"value":"Round cap"},
+{"hash":142786864,"name":"tfmain.tool_capsquare.hint","sourcebytes":[83,113,117,97,114,101,32,99,97,112],"value":"Square cap"},
+{"hash":224157463,"name":"tfmain.spinedit_arrowsizex.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Horizontal size of the arrow"},
+{"hash":47574855,"name":"tfmain.spinedit_arrowsizey.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Vertical size of the arrow"},
+{"hash":65090695,"name":"tfmain.combobox_arrowstart.hint","sourcebytes":[83,116,97,114,116,105,110,103,32,97,114,114,111,119],"value":"Starting arrow"},
+{"hash":229386535,"name":"tfmain.combobox_arrowend.hint","sourcebytes":[69,110,100,105,110,103,32,97,114,114,111,119],"value":"Ending arrow"},
+{"hash":199465278,"name":"tfmain.tool_joinbevel.hint","sourcebytes":[66,101,118,101,108,32,106,111,105,110],"value":"Bevel join"},
+{"hash":73704254,"name":"tfmain.tool_joinround.hint","sourcebytes":[82,111,117,110,100,32,106,111,105,110],"value":"Round join"},
+{"hash":205804894,"name":"tfmain.tool_joinmiter.hint","sourcebytes":[77,105,116,101,114,32,106,111,105,110],"value":"Miter join"},
+{"hash":8055525,"name":"tfmain.combobox_penstyle.hint","sourcebytes":[80,101,110,32,115,116,121,108,101],"value":"Pen style"},
+{"hash":321780,"name":"tfmain.label_grid.caption","sourcebytes":[71,114,105,100],"value":"Grid"},
+{"hash":120,"name":"tfmain.label_gridx.caption","sourcebytes":[120],"value":"x"},
+{"hash":65314814,"name":"tfmain.tool_gridmovewithoutdeformation.hint","sourcebytes":[77,111,118,101,32,103,114,105,100,32,119,105,116,104,111,117,116,32,100,101,102,111,114,109,97,116,105,111,110],"value":"Move grid without deformation"},
+{"hash":4901317,"name":"tfmain.label_curve.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"},
+{"hash":200334437,"name":"tfmain.tool_curvemodeangle.hint","sourcebytes":[68,114,97,119,32,97,110,32,97,110,103,108,101],"value":"Draw an angle"},
+{"hash":131219621,"name":"tfmain.tool_curvemodecurve.hint","sourcebytes":[68,114,97,119,32,97,32,99,117,114,118,101],"value":"Draw a curve"},
+{"hash":218543091,"name":"tfmain.tool_curvemodeauto.hint","sourcebytes":[65,117,116,111,100,101,116,101,99,116,32,97,110,103,108,101,115],"value":"Autodetect angles"},
+{"hash":125049492,"name":"tfmain.tool_curvemovepoint.hint","sourcebytes":[77,111,118,101,32,112,111,105,110,116],"value":"Move point"},
+{"hash":371956,"name":"tfmain.label_text.caption","sourcebytes":[84,101,120,116],"value":"Text"},
+{"hash":71566590,"name":"tfmain.tool_textfont.hint","sourcebytes":[67,104,111,111,115,101,32,102,111,110,116,46,46,46],"value":"Choose font..."},
+{"hash":180162887,"name":"tfmain.tool_textphong.hint","sourcebytes":[84,101,120,116,32,112,104,111,110,103,32,115,104,97,100,105,110,103],"value":"Text phong shading"},
+{"hash":235120932,"name":"tfmain.tool_textalignleft.hint","sourcebytes":[65,108,105,103,110,32,108,101,102,116],"value":"Align left"},
+{"hash":77355714,"name":"tfmain.tool_textaligncenter.hint","sourcebytes":[67,101,110,116,101,114],"value":"Center"},
+{"hash":3199508,"name":"tfmain.tool_textalignright.hint","sourcebytes":[65,108,105,103,110,32,114,105,103,104,116],"value":"Align right"},
+{"hash":258464709,"name":"tfmain.spinedit_textsize.hint","sourcebytes":[84,101,120,116,32,115,105,122,101],"value":"Text size"},
+{"hash":5892197,"name":"tfmain.label_shape.caption","sourcebytes":[83,104,97,112,101],"value":"Shape"},
+{"hash":76974786,"name":"tfmain.label_phongborder.caption","sourcebytes":[66,111,114,100,101,114],"value":"Border"},
+{"hash":178787989,"name":"tfmain.tool_phongshaperectangle.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"},
+{"hash":4807381,"name":"tfmain.tool_phongshaperoundrect.hint","sourcebytes":[82,111,117,110,100,101,100,32,114,101,99,116,97,110,103,108,101],"value":"Rounded rectangle"},
+{"hash":94825605,"name":"tfmain.tool_phongshapesphere.hint","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"},
+{"hash":304709,"name":"tfmain.tool_phongshapecone.hint","sourcebytes":[67,111,110,101],"value":"Cone"},
+{"hash":187648901,"name":"tfmain.tool_phongshapeverticalcone.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,111,110,101],"value":"Vertical cone"},
+{"hash":115522882,"name":"tfmain.tool_phongshapehorizontalcylinder.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,99,121,108,105,110,100,101,114],"value":"Horizontal cylinder"},
+{"hash":31811010,"name":"tfmain.tool_phongshapeverticalcylinder.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,121,108,105,110,100,101,114],"value":"Vertical cylinder"},
+{"hash":202312101,"name":"tfmain.spinedit_phongbordersize.hint","sourcebytes":[66,111,114,100,101,114,32,115,105,122,101],"value":"Border size"},
+{"hash":61914917,"name":"tfmain.label_altitude.caption","sourcebytes":[65,108,116,105,116,117,100,101],"value":"Altitude"},
+{"hash":221694037,"name":"tfmain.spinedit_shapealtitude.hint","sourcebytes":[83,104,97,112,101,32,97,108,116,105,116,117,100,101],"value":"Shape altitude"},
+{"hash":6159272,"name":"tfmain.label_outlinewidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"},
+{"hash":57137717,"name":"tfmain.tool_textoutline.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101],"value":"Text outline"},
+{"hash":68821400,"name":"tfmain.spinedit_textoutlinewidth.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101,32,119,105,100,116,104],"value":"Text outline width"},
+{"hash":30209135,"name":"tfmain.perspective_twoplanes.hint","sourcebytes":[68,114,97,119,32,111,112,112,111,115,105,116,101,32,112,108,97,110,101,32,116,111,111],"value":"Draw opposite plane too"},
+{"hash":65297493,"name":"tfmain.perspective_repeat.hint","sourcebytes":[82,101,112,101,97,116,32,105,109,97,103,101],"value":"Repeat image"},
+{"hash":4824216,"name":"tfmain.label_brush.caption","sourcebytes":[66,114,117,115,104],"value":"Brush"},
+{"hash":174563351,"name":"tfmain.label_spacing.caption","sourcebytes":[83,112,97,99,105,110,103],"value":"Spacing"},
+{"hash":70662787,"name":"tfmain.spinedit_brushspacing.hint","sourcebytes":[83,112,97,99,105,110,103,32,98,101,116,119,101,101,110,32,112,97,116,116,101,114,110,115],"value":"Spacing between patterns"},
+{"hash":5802751,"name":"tfmain.label_ratio.caption","sourcebytes":[82,97,116,105,111],"value":"Ratio"},
+{"hash":67807111,"name":"tfmain.tool_aliasing.hint","sourcebytes":[68,105,115,97,98,108,101,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Disable antialiasing"},
+{"hash":120839925,"name":"tfmain.tool_closeshape.hint","sourcebytes":[67,108,111,115,101,32,115,104,97,112,101],"value":"Close shape"},
+{"hash":130332167,"name":"tfmain.tool_textshadow.hint","sourcebytes":[84,101,120,116,32,115,104,97,100,111,119],"value":"Text shadow"},
+{"hash":299970,"name":"tfmain.label_textblur.caption","sourcebytes":[66,108,117,114],"value":"Blur"},
+{"hash":114259058,"name":"tfmain.spinedit_textblur.hint","sourcebytes":[83,104,97,100,111,119,32,98,108,117,114],"value":"Shadow blur"},
+{"hash":89971140,"name":"tfmain.label_shadowoffset.caption","sourcebytes":[79,102,102,115,101,116],"value":"Offset"},
+{"hash":236421172,"name":"tfmain.spinedit_textshadowx.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Horizontal shadow offset"},
+{"hash":105381300,"name":"tfmain.spinedit_textshadowy.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Vertical shadow offset"},
+{"hash":22206,"name":"tfmain.label_pen.caption","sourcebytes":[80,101,110],"value":"Pen"},
+{"hash":264792562,"name":"tfmain.image_swapcolors.hint","sourcebytes":[83,119,105,116,99,104,32,99,111,108,111,114],"value":"Switch color"},
+{"hash":296859,"name":"tfmain.label_back.caption","sourcebytes":[66,97,99,107],"value":"Back"},
+{"hash":76172398,"name":"tfmain.button_donate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."},
+{"hash":300580,"name":"tfmain.tool_textbold.hint","sourcebytes":[66,111,108,100],"value":"Bold"},
+{"hash":84574963,"name":"tfmain.tool_textitalic.hint","sourcebytes":[73,116,97,108,105,99],"value":"Italic"},
+{"hash":180974597,"name":"tfmain.tool_textunderline.hint","sourcebytes":[85,110,100,101,114,108,105,110,101],"value":"Underline"},
+{"hash":151125108,"name":"tfmain.tool_textstrikeout.hint","sourcebytes":[83,116,114,105,107,101,111,117,116],"value":"Strikeout"},
+{"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"},
+{"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"},
+{"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"},
+{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"},
+{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"},
+{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"},
+{"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."},
+{"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"},
+{"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."},
+{"hash":218146437,"name":"tfmain.fileopen.hint","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101],"value":"Open existing file"},
+{"hash":23459486,"name":"tfmain.viewzoomin.hint","sourcebytes":[90,111,111,109,32,105,110],"value":"Zoom in"},
+{"hash":106918100,"name":"tfmain.viewzoomout.hint","sourcebytes":[90,111,111,109,32,111,117,116],"value":"Zoom out"},
+{"hash":251132352,"name":"tfmain.imagehorizontalflip.caption","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,102,108,105,112],"value":"Horizontal flip"},
+{"hash":107134297,"name":"tfmain.imagehorizontalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip image horizontally"},
+{"hash":187662016,"name":"tfmain.imageverticalflip.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,102,108,105,112],"value":"Vertical flip"},
+{"hash":128483817,"name":"tfmain.imageverticalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip image vertically"},
+{"hash":72010382,"name":"tfmain.imageresample.caption","sourcebytes":[82,101,115,97,109,112,108,101,46,46,46],"value":"Resample..."},
+{"hash":200831861,"name":"tfmain.imageresample.hint","sourcebytes":[82,101,115,97,109,112,108,101,32,105,109,97,103,101],"value":"Resample image"},
+{"hash":192766339,"name":"tfmain.imagesmartzoom3.caption","sourcebytes":[83,109,97,114,116,32,122,111,111,109,32,120,51],"value":"Smart zoom x3"},
+{"hash":23626005,"name":"tfmain.viewzoomoriginal.caption","sourcebytes":[79,114,105,103,105,110,97,108,32,115,105,122,101],"value":"Original size"},
+{"hash":259531189,"name":"tfmain.viewzoomoriginal.hint","sourcebytes":[90,111,111,109,32,116,111,32,111,114,105,103,105,110,97,108,32,112,105,120,101,108,32,115,105,122,101],"value":"Zoom to original pixel size"},
+{"hash":378031,"name":"tfmain.editundo.caption","sourcebytes":[85,110,100,111],"value":"Undo"},
+{"hash":130699086,"name":"tfmain.editundo.hint","sourcebytes":[85,110,100,111,32,108,97,115,116,32,109,111,100,105,102,105,99,97,116,105,111,110],"value":"Undo last modification"},
+{"hash":363439,"name":"tfmain.editredo.hint","sourcebytes":[82,101,100,111],"value":"Redo"},
+{"hash":106916628,"name":"tfmain.viewzoomfit.caption","sourcebytes":[90,111,111,109,32,102,105,116],"value":"Zoom fit"},
+{"hash":131274455,"name":"tfmain.viewzoomfit.hint","sourcebytes":[90,111,111,109,32,116,111,32,102,105,116,32,105,110,32,116,104,101,32,119,105,110,100,111,119],"value":"Zoom to fit in the window"},
+{"hash":211562244,"name":"tfmain.editdeselect.hint","sourcebytes":[68,101,115,101,108,101,99,116],"value":"Deselect"},
+{"hash":237622494,"name":"tfmain.editinvertselection.hint","sourcebytes":[73,110,118,101,114,116,32,115,101,108,101,99,116,105,111,110],"value":"Invert selection"},
+{"hash":17148597,"name":"tfmain.toolselectrect.hint","sourcebytes":[83,101,108,101,99,116,32,114,101,99,116,97,110,103,108,101],"value":"Select rectangle"},
+{"hash":135963749,"name":"tfmain.toolselectellipse.hint","sourcebytes":[83,101,108,101,99,116,32,101,108,108,105,112,115,101],"value":"Select ellipse"},
+{"hash":193486782,"name":"tfmain.toolselectpoly.hint","sourcebytes":[83,101,108,101,99,116,32,112,111,108,121,103,111,110],"value":"Select polygon"},
+{"hash":66511461,"name":"tfmain.toolselectspline.hint","sourcebytes":[83,101,108,101,99,116,32,99,117,114,118,101],"value":"Select curve"},
+{"hash":75354974,"name":"tfmain.toolmoveselection.hint","sourcebytes":[77,111,118,101,32,115,101,108,101,99,116,105,111,110],"value":"Move selection"},
+{"hash":128109646,"name":"tfmain.toolselectpen.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,112,101,110],"value":"Selection pen"},
+{"hash":228577870,"name":"tfmain.toolselectpen.hint","sourcebytes":[68,114,97,119,32,115,101,108,101,99,116,105,111,110,32,119,105,116,104,32,112,101,110],"value":"Draw selection with pen"},
+{"hash":304761,"name":"tfmain.editcopy.caption","sourcebytes":[67,111,112,121],"value":"Copy"},
+{"hash":79811454,"name":"tfmain.editcopy.hint","sourcebytes":[67,111,112,121,32,115,101,108,101,99,116,105,111,110],"value":"Copy selection"},
+{"hash":5671589,"name":"tfmain.editpaste.hint","sourcebytes":[80,97,115,116,101],"value":"Paste"},
+{"hash":19140,"name":"tfmain.editcut.caption","sourcebytes":[67,117,116],"value":"Cut"},
+{"hash":142399070,"name":"tfmain.editcut.hint","sourcebytes":[67,117,116,32,115,101,108,101,99,116,105,111,110],"value":"Cut selection"},
+{"hash":78392485,"name":"tfmain.editdeleteselection.caption","sourcebytes":[68,101,108,101,116,101],"value":"Delete"},
+{"hash":236551166,"name":"tfmain.editdeleteselection.hint","sourcebytes":[68,101,108,101,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Delete selection"},
+{"hash":169361790,"name":"tfmain.toolrotateselection.hint","sourcebytes":[82,111,116,97,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Rotate selection"},
+{"hash":195296268,"name":"tfmain.editselectall.caption","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"},
+{"hash":195296268,"name":"tfmain.editselectall.hint","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"},
+{"hash":191244600,"name":"tfmain.viewtoolbox.caption","sourcebytes":[84,111,111,108,98,111,120],"value":"Toolbox"},
+{"hash":78001811,"name":"tfmain.viewcolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"},
+{"hash":88162814,"name":"tfmain.imagecrop.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110],"value":"Crop to selection"},
+{"hash":128112628,"name":"tfmain.editselectionfit.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,102,105,116],"value":"Selection fit"},
+{"hash":73053668,"name":"tfmain.imageclearalpha.caption","sourcebytes":[67,108,101,97,114,32,97,108,112,104,97,32,99,104,97,110,110,101,108,32,97,110,100,32,115,101,116,32,98,97,99,107,103,114,111,117,110,100],"value":"Clear alpha channel and set background"},
+{"hash":32413959,"name":"tfmain.imagefillbackground.caption","sourcebytes":[70,105,108,108,32,98,97,99,107,103,114,111,117,110,100,32,119,105,116,104,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Fill background with antialiasing"},
+{"hash":40698606,"name":"tfmain.imagechangecanvassize.caption","sourcebytes":[67,97,110,118,97,115,32,115,105,122,101,46,46,46],"value":"Canvas size..."},
+{"hash":174425639,"name":"tfmain.imagerotatecw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,87],"value":"Rotate 90\u00B0 CW"},
+{"hash":106458407,"name":"tfmain.imagerotateccw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,67,87],"value":"Rotate 90\u00B0 CCW"},
+{"hash":44176496,"name":"tfmain.imagerotate180.caption","sourcebytes":[82,111,116,97,116,101,32,49,56,48,194,176],"value":"Rotate 180\u00B0"},
+{"hash":219032926,"name":"tfmain.colorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121,46,46,46],"value":"Intensity..."},
+{"hash":102010462,"name":"tfmain.colorlightness.caption","sourcebytes":[66,114,105,103,104,116,110,101,115,115,32,47,32,67,111,110,116,114,97,115,116,46,46,46],"value":"Brightness / Contrast..."},
+{"hash":247427790,"name":"tfmain.colorshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115,46,46,46],"value":"Shift colors..."},
+{"hash":156902510,"name":"tfmain.colorcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101,46,46,46],"value":"Colorize..."},
+{"hash":78427662,"name":"tfmain.helpindex.caption","sourcebytes":[73,110,100,101,120,46,46,46],"value":"Index..."},
+{"hash":158102910,"name":"tfmain.helpabout.caption","sourcebytes":[65,98,111,117,116,46,46,46],"value":"About..."},
+{"hash":112740814,"name":"tfmain.imagerepeat.caption","sourcebytes":[82,101,112,101,97,116,46,46,46],"value":"Repeat..."},
+{"hash":257089940,"name":"tfmain.toolmagicwand.caption","sourcebytes":[77,97,103,105,99,32,119,97,110,100],"value":"Magic wand"},
+{"hash":45494836,"name":"tfmain.toolmagicwand.hint","sourcebytes":[77,97,103,105,99,32,119,97,110,100,32,115,101,108,101,99,116],"value":"Magic wand select"},
+{"hash":77818803,"name":"tfmain.renderclouds.caption","sourcebytes":[67,108,111,117,100,115],"value":"Clouds"},
+{"hash":240690499,"name":"tfmain.rendercustomwater.caption","sourcebytes":[87,97,116,101,114,32,119,105,116,104,32,99,117,115,116,111,109,32,99,111,108,111,114,115],"value":"Water with custom colors"},
+{"hash":85578645,"name":"tfmain.renderperlinnoise.caption","sourcebytes":[80,101,114,108,105,110,32,110,111,105,115,101],"value":"Perlin noise"},
+{"hash":261781,"name":"tfmain.rendercyclicperlinnoise.caption","sourcebytes":[67,121,99,108,105,99,32,80,101,114,108,105,110,32,110,111,105,115,101],"value":"Cyclic Perlin noise"},
+{"hash":386644,"name":"tfmain.renderwood.caption","sourcebytes":[87,111,111,100],"value":"Wood"},
+{"hash":120105643,"name":"tfmain.renderplastik.caption","sourcebytes":[80,108,97,115,116,105,107],"value":"Plastik"},
+{"hash":239140882,"name":"tfmain.rendermetalfloor.caption","sourcebytes":[77,101,116,97,108,32,102,108,111,111,114],"value":"Metal floor"},
+{"hash":112836501,"name":"tfmain.rendercamouflage.caption","sourcebytes":[67,97,109,111,117,102,108,97,103,101],"value":"Camouflage"},
+{"hash":158477108,"name":"tfmain.rendersnowprint.caption","sourcebytes":[83,110,111,119,32,112,114,105,110,116],"value":"Snow print"},
+{"hash":5944901,"name":"tfmain.renderstone.caption","sourcebytes":[83,116,111,110,101],"value":"Stone"},
+{"hash":103012869,"name":"tfmain.renderroundstone.caption","sourcebytes":[82,111,117,110,100,32,115,116,111,110,101],"value":"Round stone"},
+{"hash":87591205,"name":"tfmain.rendermarble.caption","sourcebytes":[77,97,114,98,108,101],"value":"Marble"},
+{"hash":6130370,"name":"tfmain.renderwater.caption","sourcebytes":[87,97,116,101,114],"value":"Water"},
+{"hash":187599764,"name":"tfmain.renderwoodvertical.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,119,111,111,100],"value":"Vertical wood"},
+{"hash":137342309,"name":"tfmain.embeddedvalidate.caption","sourcebytes":[86,97,108,105,100,97,116,101],"value":"Validate"},
+{"hash":75331571,"name":"tfmain.embeddedvalidate.hint","sourcebytes":[86,97,108,105,100,97,116,101,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Validate modifications"},
+{"hash":77089212,"name":"tfmain.embeddedcancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"},
+{"hash":93963171,"name":"tfmain.embeddedcancel.hint","sourcebytes":[67,97,110,99,101,108,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Cancel modifications"},
+{"hash":321780,"name":"tfmain.viewgrid.caption","sourcebytes":[71,114,105,100],"value":"Grid"},
+{"hash":176417125,"name":"tfmain.editpasteasnew.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,105,109,97,103,101],"value":"Paste as new image"},
+{"hash":221621454,"name":"tfmain.editselection.caption","sourcebytes":[69,100,105,116,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Edit selection..."},
+{"hash":86572179,"name":"tfmain.viewlayerstack.caption","sourcebytes":[76,97,121,101,114,115],"value":"Layers"},
+{"hash":124848643,"name":"tfmain.viewlayerstackbutton.caption","sourcebytes":[83,104,111,119,32,108,97,121,101,114,115],"value":"Show layers"},
+{"hash":214344631,"name":"tfmain.viewlayerstackbutton.hint","sourcebytes":[83,104,111,119,32,111,114,32,104,105,100,101,32,108,97,121,101,114,32,115,116,97,99,107,32,119,105,110,100,111,119],"value":"Show or hide layer stack window"},
+{"hash":161226738,"name":"tfmain.imagecroplayer.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110,32,97,110,100,32,99,117,114,114,101,110,116,32,108,97,121,101,114],"value":"Crop to selection and current layer"},
+{"hash":97075273,"name":"tfmain.layerhorizontalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip layer horizontally"},
+{"hash":110750825,"name":"tfmain.layerverticalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip layer vertically"},
+{"hash":248838978,"name":"tfmain.layeraddnew.hint","sourcebytes":[65,100,100,32,110,101,119,32,108,97,121,101,114],"value":"Add new layer"},
+{"hash":50252034,"name":"tfmain.layerremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,108,97,121,101,114],"value":"Remove layer"},
+{"hash":26157074,"name":"tfmain.layerduplicate.hint","sourcebytes":[68,117,112,108,105,99,97,116,101,32,115,101,108,101,99,116,101,100,32,108,97,121,101,114],"value":"Duplicate selected layer"},
+{"hash":20150450,"name":"tfmain.layermergeover.hint","sourcebytes":[77,101,114,103,101,32,108,97,121,101,114,32,111,118,101,114],"value":"Merge layer over"},
+{"hash":224054046,"name":"tfmain.layerfromfile.hint","sourcebytes":[73,109,112,111,114,116,32,108,97,121,101,114,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Import layer from file..."},
+{"hash":125290754,"name":"tfmain.layermove.hint","sourcebytes":[77,111,118,101,32,108,97,121,101,114],"value":"Move layer"},
+{"hash":50603874,"name":"tfmain.layerrotate.hint","sourcebytes":[82,111,116,97,116,101,32,108,97,121,101,114],"value":"Rotate layer"},
+{"hash":222858453,"name":"tfmain.imageflatten.caption","sourcebytes":[70,108,97,116,116,101,110,32,105,109,97,103,101],"value":"Flatten image"},
+{"hash":93074804,"name":"tfmain.filereload.caption","sourcebytes":[82,101,108,111,97,100],"value":"Reload"},
+{"hash":366789,"name":"tfmain.filesave.caption","sourcebytes":[83,97,118,101],"value":"Save"},
+{"hash":60022005,"name":"tfmain.filesave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101],"value":"Save current file"},
+{"hash":124639694,"name":"tfmain.filesaveas.caption","sourcebytes":[83,97,118,101,32,97,115,46,46,46],"value":"Save as..."},
+{"hash":159035875,"name":"tfmain.filesaveas.hint","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115],"value":"Save file as"},
+{"hash":363524,"name":"tfmain.filequit.hint","sourcebytes":[81,117,105,116],"value":"Quit"},
+{"hash":169186686,"name":"tfmain.filesaveselectionas.caption","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."},
+{"hash":223186382,"name":"tfmain.fileloadselection.caption","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Load selection..."},
+{"hash":59477454,"name":"tfmain.fileimport3d.caption","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116,46,46,46],"value":"Import 3D object..."},
+{"hash":164375502,"name":"tfmain.colorcurves.caption","sourcebytes":[67,117,114,118,101,115,46,46,46],"value":"Curves..."},
+{"hash":243723214,"name":"tfmain.colorposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101,46,46,46],"value":"Posterize..."},
+{"hash":151352958,"name":"tfmain.fileprint.caption","sourcebytes":[80,114,105,110,116,46,46,46],"value":"Print..."},
+{"hash":225719252,"name":"tfmain.viewimagelist.caption","sourcebytes":[73,109,97,103,101,32,108,105,115,116],"value":"Image list"},
+{"hash":66110750,"name":"tfmain.filesaveasinsamefolder.caption","sourcebytes":[83,97,118,101,32,105,110,32,115,97,109,101,32,102,111,108,100,101,114,46,46,46],"value":"Save in same folder..."},
+{"hash":178213234,"name":"tfmain.editpasteasnewlayer.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,108,97,121,101,114],"value":"Paste as new layer"},
+{"hash":158677870,"name":"tfmain.filterblurbox.caption","sourcebytes":[66,111,120,32,98,108,117,114,46,46,46],"value":"Box blur..."},
+{"hash":234157934,"name":"tfmain.filterblurfast.caption","sourcebytes":[70,97,115,116,32,98,108,117,114,46,46,46],"value":"Fast blur..."},
+{"hash":61344174,"name":"tfmain.filterblurradial.caption","sourcebytes":[71,97,117,115,115,105,97,110,32,98,108,117,114,46,46,46],"value":"Gaussian blur..."},
+{"hash":262805710,"name":"tfmain.filterblurcorona.caption","sourcebytes":[67,111,114,111,110,97,32,98,108,117,114,46,46,46],"value":"Corona blur..."},
+{"hash":227339886,"name":"tfmain.filterblurdisk.caption","sourcebytes":[68,105,115,107,32,98,108,117,114,46,46,46],"value":"Disk blur..."},
+{"hash":77369838,"name":"tfmain.filterblurprecise.caption","sourcebytes":[80,114,101,99,105,115,101,32,98,108,117,114,46,46,46],"value":"Precise blur..."},
+{"hash":260847150,"name":"tfmain.filterblurmotion.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114,46,46,46],"value":"Motion blur..."},
+{"hash":93793486,"name":"tfmain.filterblurcustom.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114,46,46,46],"value":"Custom blur..."},
+{"hash":158314382,"name":"tfmain.filtersharpen.caption","sourcebytes":[83,104,97,114,112,101,110,46,46,46],"value":"Sharpen..."},
+{"hash":94660264,"name":"tfmain.filtersmooth.caption","sourcebytes":[83,109,111,111,116,104],"value":"Smooth"},
+{"hash":87797630,"name":"tfmain.filtermedian.caption","sourcebytes":[77,101,100,105,97,110],"value":"Median"},
+{"hash":157953342,"name":"tfmain.filteremboss.caption","sourcebytes":[69,109,98,111,115,115,46,46,46],"value":"Emboss..."},
+{"hash":154699365,"name":"tfmain.filternormalize.caption","sourcebytes":[78,111,114,109,97,108,105,122,101],"value":"Normalize"},
+{"hash":198751621,"name":"tfmain.filternegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"},
+{"hash":151640741,"name":"tfmain.filtergrayscale.caption","sourcebytes":[71,114,97,121,115,99,97,108,101],"value":"Grayscale"},
+{"hash":174438018,"name":"tfmain.filtercontour.caption","sourcebytes":[67,111,110,116,111,117,114],"value":"Contour"},
+{"hash":94825605,"name":"tfmain.filtersphere.caption","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"},
+{"hash":3165810,"name":"tfmain.filtercylinder.caption","sourcebytes":[67,121,108,105,110,100,101,114],"value":"Cylinder"},
+{"hash":258000517,"name":"tfmain.filterlinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"},
+{"hash":126661353,"name":"tfmain.filterplane.caption","sourcebytes":[80,108,97,110,101,32,40,115,108,111,119,41],"value":"Plane (slow)"},
+{"hash":235468478,"name":"tfmain.filtertwirl.caption","sourcebytes":[84,119,105,114,108,46,46,46],"value":"Twirl..."},
+{"hash":48074702,"name":"tfmain.filterpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101,46,46,46],"value":"Pixelate..."},
+{"hash":193464901,"name":"tfmain.filtercleartype.caption","sourcebytes":[67,108,101,97,114,84,121,112,101],"value":"ClearType"},
+{"hash":37795461,"name":"tfmain.filtercleartypeinverse.caption","sourcebytes":[73,110,118,101,114,115,101,32,67,108,101,97,114,84,121,112,101],"value":"Inverse ClearType"},
+{"hash":14654542,"name":"tfmain.filterphong.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112,46,46,46],"value":"Shaded map..."},
+{"hash":31581342,"name":"tfmain.filterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110,46,46,46],"value":"Apply function..."},
+{"hash":144289715,"name":"tfmain.filtercomplementarycolor.caption","sourcebytes":[67,111,109,112,108,101,109,101,110,116,97,114,121,32,99,111,108,111,114,115],"value":"Complementary colors"},
+{"hash":54233774,"name":"tfmain.filternoise.caption","sourcebytes":[78,111,105,115,101,32,102,105,108,116,101,114,46,46,46],"value":"Noise filter..."},
+{"hash":142610782,"name":"tfmain.filterrain.caption","sourcebytes":[82,97,105,110,46,46,46],"value":"Rain..."},
+{"hash":197181954,"name":"tfmain.viewstatusbar.caption","sourcebytes":[83,116,97,116,117,115,32,98,97,114],"value":"Status bar"},
+{"hash":109235189,"name":"tfmain.viewpalette.caption","sourcebytes":[80,97,108,101,116,116,101],"value":"Palette"},
+{"hash":167619026,"name":"tfmain.fileuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"},
+{"hash":64004190,"name":"tfmain.filechooseentry.caption","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,46,46,46],"value":"Choose entry..."},
+{"hash":143653317,"name":"tfmain.filechooseentry.hint","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,32,119,105,116,104,105,110,32,102,105,108,101],"value":"Choose entry within file"},
+{"hash":116001155,"name":"tfmain.forgetdialoganswers.caption","sourcebytes":[70,111,114,103,101,116,32,100,105,97,108,111,103,32,98,111,120,32,97,110,115,119,101,114,115],"value":"Forget dialog box answers"},
+{"hash":224505747,"name":"tfmain.forgetdialoganswers.hint","sourcebytes":[70,111,114,103,101,116,32,97,110,115,119,101,114,115,32,103,105,118,101,110,32,116,111,32,100,105,97,108,111,103,32,98,111,120,101,115],"value":"Forget answers given to dialog boxes"},
+{"hash":198751621,"name":"tfmain.imagenegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"},
+{"hash":258000517,"name":"tfmain.imagelinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"},
+{"hash":179963859,"name":"tfmain.imageswapredblue.caption","sourcebytes":[83,119,97,112,32,114,101,100,32,97,110,100,32,98,108,117,101,32,99,104,97,110,110,101,108,115],"value":"Swap red and blue channels"},
+{"hash":259299730,"name":"tfmain.layerzoom.hint","sourcebytes":[90,111,111,109,32,108,97,121,101,114],"value":"Zoom layer"},
+{"hash":153208601,"name":"tfmain.selectionhorizontalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip selection horizontally"},
+{"hash":166020249,"name":"tfmain.selectionverticalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip selection vertically"},
+{"hash":244531892,"name":"tfmain.fileremembersaveformat.hint","sourcebytes":[82,101,109,101,109,98,101,114,32,115,97,118,101,32,102,111,114,109,97,116],"value":"Remember save format"},
+{"hash":232678978,"name":"tfmain.layerrasterize.hint","sourcebytes":[82,97,115,116,101,114,105,122,101,32,108,97,121,101,114],"value":"Rasterize layer"},
+{"hash":97266030,"name":"tfmain.viewworkspacecolor.caption","sourcebytes":[83,101,116,32,119,111,114,107,115,112,97,99,101,32,99,111,108,111,114,46,46,46],"value":"Set workspace color..."},
+{"hash":226378933,"name":"tfmain.viewdarktheme.caption","sourcebytes":[68,97,114,107,32,116,104,101,109,101],"value":"Dark theme"},
+{"hash":17857150,"name":"tfmain.filterwavedisplacement.caption","sourcebytes":[87,97,118,101,32,100,105,115,112,108,97,99,101,109,101,110,116,46,46,46],"value":"Wave displacement..."},
+{"hash":321604,"name":"tfmain.toolhand.caption","sourcebytes":[72,97,110,100],"value":"Hand"},
+{"hash":171743509,"name":"tfmain.toolhand.hint","sourcebytes":[77,111,118,101,32,97,110,100,32,115,99,114,111,108,108,32,112,105,99,116,117,114,101],"value":"Move and scroll picture"},
+{"hash":107455380,"name":"tfmain.toolhotspot.caption","sourcebytes":[72,111,116,32,115,112,111,116],"value":"Hot spot"},
+{"hash":14124562,"name":"tfmain.toolhotspot.hint","sourcebytes":[67,104,111,111,115,101,32,104,111,116,32,115,112,111,116,32,111,102,32,97,32,99,117,114,115,111,114],"value":"Choose hot spot of a cursor"},
+{"hash":63551362,"name":"tfmain.toolcolorpicker.hint","sourcebytes":[67,111,108,111,114,32,112,105,99,107,101,114],"value":"Color picker"},
+{"hash":22206,"name":"tfmain.toolpen.caption","sourcebytes":[80,101,110],"value":"Pen"},
+{"hash":119723774,"name":"tfmain.toolpen.hint","sourcebytes":[83,105,109,112,108,101,32,112,101,110],"value":"Simple pen"},
+{"hash":4824216,"name":"tfmain.toolbrush.hint","sourcebytes":[66,114,117,115,104],"value":"Brush"},
+{"hash":80251330,"name":"tfmain.tooleraser.hint","sourcebytes":[69,114,97,115,101,114],"value":"Eraser"},
+{"hash":106595100,"name":"tfmain.toolfloodfill.hint","sourcebytes":[70,108,111,111,100,102,105,108,108],"value":"Floodfill"},
+{"hash":74651452,"name":"tfmain.toolclone.hint","sourcebytes":[67,108,111,110,101,32,116,111,111,108],"value":"Clone tool"},
+{"hash":108876645,"name":"tfmain.tooleditshape.hint","sourcebytes":[69,100,105,116,32,115,104,97,112,101],"value":"Edit shape"},
+{"hash":178787989,"name":"tfmain.toolrect.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"},
+{"hash":204670933,"name":"tfmain.toolellipse.hint","sourcebytes":[69,108,108,105,112,115,101],"value":"Ellipse"},
+{"hash":123993614,"name":"tfmain.toolpolygon.caption","sourcebytes":[80,111,108,121,103,111,110],"value":"Polygon"},
+{"hash":53188549,"name":"tfmain.toolpolygon.hint","sourcebytes":[80,111,108,121,103,111,110,32,111,114,32,112,111,108,121,108,105,110,101],"value":"Polygon or polyline"},
+{"hash":4901317,"name":"tfmain.toolspline.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"},
+{"hash":4901317,"name":"tfmain.toolspline.hint","sourcebytes":[67,117,114,118,101],"value":"Curve"},
+{"hash":142278836,"name":"tfmain.toolgradient.caption","sourcebytes":[71,114,97,100,105,101,110,116],"value":"Gradient"},
+{"hash":215410292,"name":"tfmain.toolgradient.hint","sourcebytes":[82,101,110,100,101,114,32,103,114,97,100,105,101,110,116],"value":"Render gradient"},
+{"hash":65508053,"name":"tfmain.toolphong.hint","sourcebytes":[83,104,97,100,101,100,32,115,104,97,112,101],"value":"Shaded shape"},
+{"hash":371956,"name":"tfmain.tooltext.hint","sourcebytes":[84,101,120,116],"value":"Text"},
+{"hash":158470974,"name":"tfmain.tooldeformation.caption","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110],"value":"Deformation"},
+{"hash":76663236,"name":"tfmain.tooldeformation.hint","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110,32,103,114,105,100],"value":"Deformation grid"},
+{"hash":205239287,"name":"tfmain.tooltexturemapping.hint","sourcebytes":[84,101,120,116,117,114,101,32,109,97,112,112,105,110,103],"value":"Texture mapping"},
+{"hash":43972261,"name":"tfmain.toollayermapping.hint","sourcebytes":[76,97,121,101,114,32,112,101,114,115,112,101,99,116,105,118,101],"value":"Layer perspective"},
+{"hash":98487735,"name":"tfmain.toolchangedocking.hint","sourcebytes":[67,104,97,110,103,101,32,100,111,99,107,105,110,103],"value":"Change docking"},
+{"hash":200728952,"name":"tfmain.brushcreategeometric.hint","sourcebytes":[67,114,101,97,116,101,32,103,101,111,109,101,116,114,105,99,32,98,114,117,115,104],"value":"Create geometric brush"},
+{"hash":217170606,"name":"tfmain.brushloadfromfile.hint","sourcebytes":[76,111,97,100,32,98,114,117,115,104,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Load brush from file..."},
+{"hash":15128104,"name":"tfmain.brushremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,99,117,114,114,101,110,116,32,98,114,117,115,104],"value":"Remove current brush"},
+{"hash":74217360,"name":"tfmain.editmoveup.hint","sourcebytes":[77,111,118,101,32,117,112],"value":"Move up"},
+{"hash":141109012,"name":"tfmain.editmovetofront.hint","sourcebytes":[66,114,105,110,103,32,116,111,32,102,114,111,110,116],"value":"Bring to front"},
+{"hash":209126078,"name":"tfmain.editmovedown.hint","sourcebytes":[77,111,118,101,32,100,111,119,110],"value":"Move down"},
+{"hash":9093403,"name":"tfmain.editmovetoback.hint","sourcebytes":[83,101,110,100,32,116,111,32,98,97,99,107],"value":"Send to back"},
+{"hash":141965220,"name":"tfmain.editshapealignleft.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,108,101,102,116],"value":"Align shape left"},
+{"hash":244832953,"name":"tfmain.editshapecenterhorizontally.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Center shape horizontally"},
+{"hash":122239604,"name":"tfmain.editshapealignright.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,114,105,103,104,116],"value":"Align shape right"},
+{"hash":43235424,"name":"tfmain.editshapealigntop.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,116,111,112],"value":"Align shape to the top"},
+{"hash":8451721,"name":"tfmain.editshapecentervertically.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Center shape vertically"},
+{"hash":174494829,"name":"tfmain.editshapealignbottom.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,98,111,116,116,111,109],"value":"Align shape to the bottom"},
+{"hash":52527029,"name":"tfmain.editshapetocurve.hint","sourcebytes":[67,111,110,118,101,114,116,32,115,104,97,112,101,32,116,111,32,99,117,114,118,101],"value":"Convert shape to curve"},
+{"hash":46607102,"name":"tfmain.filerunscript.caption","sourcebytes":[82,117,110,32,115,99,114,105,112,116,46,46,46],"value":"Run script..."},
+{"hash":104868661,"name":"tfmain.toolpolyline.hint","sourcebytes":[80,111,108,121,108,105,110,101],"value":"Polyline"},
+{"hash":51121525,"name":"tfmain.toolopenedcurve.hint","sourcebytes":[79,112,101,110,101,100,32,99,117,114,118,101],"value":"Opened curve"},
+{"hash":124337662,"name":"tfmain.fileexport.caption","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
+{"hash":124337662,"name":"tfmain.layerexport.hint","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
+{"hash":164762421,"name":"tfmain.filequicksave.caption","sourcebytes":[81,117,105,99,107,32,115,97,118,101],"value":"Quick save"},
+{"hash":215358547,"name":"tfmain.filequicksave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101,32,119,105,116,104,111,117,116,32,100,105,97,108,111,103,115],"value":"Save current file without dialogs"},
+{"hash":53140398,"name":"tfmain.renderhypocycloid.caption","sourcebytes":[72,121,112,111,99,121,99,108,111,105,100,46,46,46],"value":"Hypocycloid..."},
+{"hash":66536946,"name":"tfmain.colordialog1.title","sourcebytes":[67,104,111,111,115,101,32,99,111,108,111,114],"value":"Choose color"},
+{"hash":315429,"name":"tfmain.menufile.caption","sourcebytes":[70,105,108,101],"value":"File"},
+{"hash":167619026,"name":"tfmain.itemuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"},
+{"hash":65502867,"name":"tfmain.menurecentfiles.caption","sourcebytes":[82,101,99,101,110,116,32,102,105,108,101,115],"value":"Recent files"},
+{"hash":139375349,"name":"tfmain.menulanguage.caption","sourcebytes":[76,97,110,103,117,97,103,101],"value":"Language"},
+{"hash":76172398,"name":"tfmain.itemdonate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."},
+{"hash":310020,"name":"tfmain.menuedit.caption","sourcebytes":[69,100,105,116],"value":"Edit"},
+{"hash":94120868,"name":"tfmain.menuselect.caption","sourcebytes":[83,101,108,101,99,116],"value":"Select"},
+{"hash":380871,"name":"tfmain.menuview.caption","sourcebytes":[86,105,101,119],"value":"View"},
+{"hash":267499032,"name":"tfmain.itemviewdocktoolbox.caption","sourcebytes":[68,111,99,107,32,116,111,111,108,98,111,120],"value":"Dock toolbox"},
+{"hash":46565539,"name":"tfmain.itemdocklayersandcolors.caption","sourcebytes":[68,111,99,107,32,108,97,121,101,114,115,32,97,110,100,32,99,111,108,111,114,115],"value":"Dock layers and colors"},
+{"hash":60708750,"name":"tfmain.itemfullscreen.caption","sourcebytes":[70,117,108,108,115,99,114,101,101,110],"value":"Fullscreen"},
+{"hash":5257173,"name":"tfmain.menuimage.caption","sourcebytes":[73,109,97,103,101],"value":"Image"},
+{"hash":167030057,"name":"tfmain.menuremovetransparency.caption","sourcebytes":[82,101,109,111,118,101,32,116,114,97,110,115,112,97,114,101,110,99,121],"value":"Remove transparency"},
+{"hash":78001811,"name":"tfmain.menucolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"},
+{"hash":5989939,"name":"tfmain.menutool.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"},
+{"hash":80755394,"name":"tfmain.menufilter.caption","sourcebytes":[70,105,108,116,101,114],"value":"Filter"},
+{"hash":129960242,"name":"tfmain.menuradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"},
+{"hash":93080258,"name":"tfmain.menurender.caption","sourcebytes":[82,101,110,100,101,114],"value":"Render"},
+{"hash":94015604,"name":"tfmain.menuscript.caption","sourcebytes":[83,99,114,105,112,116],"value":"Script"},
+{"hash":322608,"name":"tfmain.menuhelp.caption","sourcebytes":[72,101,108,112],"value":"Help"},
+{"hash":130864334,"name":"tfmain.loadselectiondialog.title","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110],"value":"Load selection"},
+{"hash":695557,"name":"tfmain.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,105,109,97,103,101],"value":"Open existing image"},
+{"hash":262765813,"name":"tfmain.opentexturedialog.title","sourcebytes":[79,112,101,110,32,116,101,120,116,117,114,101],"value":"Open texture"},
+{"hash":30161076,"name":"tfmain.open3dobjectdialog.title","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116],"value":"Import 3D object"},
+{"hash":186570926,"name":"tfmain.savepicturedialog1.title","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115,46,46,46],"value":"Save file as..."},
+{"hash":169186686,"name":"tfmain.saveselectiondialog.title","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."},
+{"hash":7141976,"name":"tfmain.openbrushdialog.title","sourcebytes":[79,112,101,110,32,98,114,117,115,104],"value":"Open brush"},
+{"hash":231995746,"name":"tfmain.menufiletoolbar.caption","sourcebytes":[83,104,111,119,32,102,105,108,101,32,116,111,111,108,98,97,114],"value":"Show file toolbar"},
+{"hash":55148898,"name":"tfmain.menuzoomtoolbar.caption","sourcebytes":[83,104,111,119,32,122,111,111,109,32,116,111,111,108,98,97,114],"value":"Show zoom toolbar"},
+{"hash":185663746,"name":"tfmain.menucopypastetoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,112,121,47,112,97,115,116,101,32,116,111,111,108,98,97,114],"value":"Show copy/paste toolbar"},
+{"hash":61428515,"name":"tfmain.menucoordinatestoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,111,114,100,105,110,97,116,101,115],"value":"Show coordinates"},
+{"hash":112373618,"name":"tfmain.menuundoredotoolbar.caption","sourcebytes":[83,104,111,119,32,117,110,100,111,47,114,101,100,111,32,116,111,111,108,98,97,114],"value":"Show undo/redo toolbar"},
+{"hash":66953941,"name":"tfmain.menushowpalette.caption","sourcebytes":[83,104,111,119,32,112,97,108,101,116,116,101],"value":"Show palette"},
+{"hash":165109892,"name":"tfmain.menudocktoolboxleft.caption","sourcebytes":[68,111,99,107,32,108,101,102,116],"value":"Dock left"},
+{"hash":226248804,"name":"tfmain.menudocktoolboxright.caption","sourcebytes":[68,111,99,107,32,114,105,103,104,116],"value":"Dock right"},
+{"hash":96777627,"name":"tfmain.menuundocktoolbox.caption","sourcebytes":[85,110,100,111,99,107],"value":"Undock"},
+{"hash":44513182,"name":"tfmain.exportpicturedialog.title","sourcebytes":[69,120,112,111,114,116,32,97,115,46,46,46],"value":"Export as..."}
+]}

+ 8 - 6
lazpaint/lazpaintmainform.pas

@@ -25,6 +25,7 @@ type
   { TFMain }
   { TFMain }
 
 
   TFMain = class(TForm)
   TFMain = class(TForm)
+    RenderHypocycloid: TAction;
     FileQuickSave: TAction;
     FileQuickSave: TAction;
     SVGRasterImageList1: TBGRAImageList;
     SVGRasterImageList1: TBGRAImageList;
     Panel_TextMore: TPanel;
     Panel_TextMore: TPanel;
@@ -521,6 +522,7 @@ type
       {%H-}Y: Integer);
       {%H-}Y: Integer);
     procedure Panel_TextMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
     procedure Panel_TextMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
       {%H-}Y: Integer);
       {%H-}Y: Integer);
+    procedure Panel_ToolbarBackgroundClick(Sender: TObject);
     procedure PopupToolbarPopup(Sender: TObject);
     procedure PopupToolbarPopup(Sender: TObject);
     procedure PopupToolboxPopup(Sender: TObject);
     procedure PopupToolboxPopup(Sender: TObject);
     procedure SelectionHorizontalFlipUpdate(Sender: TObject);
     procedure SelectionHorizontalFlipUpdate(Sender: TObject);
@@ -782,7 +784,7 @@ type
     procedure UpdateFloodfillToolbar;
     procedure UpdateFloodfillToolbar;
     procedure UpdatePerspectiveToolbar;
     procedure UpdatePerspectiveToolbar;
     function ShowOpenBrushDialog: boolean;
     function ShowOpenBrushDialog: boolean;
-    function TextSpinEditFocused: boolean;
+    function SpinEditFocused: boolean;
     procedure UpdateBrush;
     procedure UpdateBrush;
     procedure UpdateBrushList;
     procedure UpdateBrushList;
     function CatchToolKeyDown(var AKey: Word): boolean;
     function CatchToolKeyDown(var AKey: Word): boolean;
@@ -1870,7 +1872,7 @@ begin
     else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= true
     else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= true
     else if Key = VK_SHIFT then shiftPressed:= true;
     else if Key = VK_SHIFT then shiftPressed:= true;
     if Zoom.EditingZoom or EditingColors then exit;
     if Zoom.EditingZoom or EditingColors then exit;
-    if not ((CurrentTool = ptText) and TextSpinEditFocused and (Key = VK_BACK)) and CatchToolKeyDown(Key) then
+    if not ((CurrentTool = ptText) and SpinEditFocused and (Key = VK_BACK)) and CatchToolKeyDown(Key) then
     begin
     begin
       PaintPictureLater;
       PaintPictureLater;
     end else
     end else
@@ -2323,7 +2325,7 @@ begin
     toolProcessKey:= true;
     toolProcessKey:= true;
     if (CurrentTool in[ptText,ptEditShape]) and ((UTF8Key = #8) or ((length(UTF8Key)=1) and (UTF8Key[1] in['-','0'..'9']))) then
     if (CurrentTool in[ptText,ptEditShape]) and ((UTF8Key = #8) or ((length(UTF8Key)=1) and (UTF8Key[1] in['-','0'..'9']))) then
     begin
     begin
-      if TextSpinEditFocused then
+      if SpinEditFocused then
          toolProcessKey:= false;
          toolProcessKey:= false;
     end;
     end;
     if toolProcessKey and CatchToolKeyPress(UTF8Key) then
     if toolProcessKey and CatchToolKeyPress(UTF8Key) then
@@ -3913,12 +3915,12 @@ procedure TFMain.UpdateSpecialKeys(Shift: TShiftState);
   begin
   begin
     if (AShift in Shift) and not APressed then
     if (AShift in Shift) and not APressed then
     begin
     begin
-      if ToolManager.ToolKeyDown(ACode) then PaintPictureNow;
+      if CatchToolKeyDown(ACode) then PaintPictureNow;
       APressed:= true;
       APressed:= true;
     end else
     end else
     if not (AShift in Shift) and APressed then
     if not (AShift in Shift) and APressed then
     begin
     begin
-      if ToolManager.ToolKeyUp(ACode) then PaintPictureNow;
+      if CatchToolKeyUp(ACode) then PaintPictureNow;
       APressed:= false;
       APressed:= false;
     end;
     end;
   end;
   end;
@@ -4380,7 +4382,7 @@ begin
     else
     else
       exit;
       exit;
   end;
   end;
-  if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then Layout.FocusImage;
+  if SpinEditFocused then Layout.FocusImage;
 end;
 end;
 
 
 procedure TFMain.PictureOnPaint(Sender: TObject);
 procedure TFMain.PictureOnPaint(Sender: TObject);

+ 14 - 5
lazpaint/lazpainttype.pas

@@ -7,7 +7,7 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, UConfig, UImage, UTool, Forms, BGRALayers, Graphics, Menus,
   Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, UConfig, UImage, UTool, Forms, BGRALayers, Graphics, Menus,
-  UScripting, Dialogs, Controls
+  UScripting, Dialogs, Controls, LCLType
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
 
 
 const
 const
@@ -73,7 +73,8 @@ type
                     pfEmboss, pfPhong, pfContour, pfGrayscale, pfNegative, pfLinearNegative, pfComplementaryColor, pfNormalize,
                     pfEmboss, pfPhong, pfContour, pfGrayscale, pfNegative, pfLinearNegative, pfComplementaryColor, pfNormalize,
                     pfSphere, pfTwirl, pfWaveDisplacement, pfCylinder, pfPlane,
                     pfSphere, pfTwirl, pfWaveDisplacement, pfCylinder, pfPlane,
                     pfPerlinNoise,pfCyclicPerlinNoise,pfClouds,pfCustomWater,pfWater,pfRain,pfWood,pfWoodVertical,pfPlastik,pfMetalFloor,pfCamouflage,
                     pfPerlinNoise,pfCyclicPerlinNoise,pfClouds,pfCustomWater,pfWater,pfRain,pfWood,pfWoodVertical,pfPlastik,pfMetalFloor,pfCamouflage,
-                    pfSnowPrint,pfStone,pfRoundStone,pfMarble);
+                    pfSnowPrint,pfStone,pfRoundStone,pfMarble,
+                    pfHypocycloid);
 
 
 const
 const
   PictureFilterStr : array[TPictureFilter] of string =
   PictureFilterStr : array[TPictureFilter] of string =
@@ -83,7 +84,8 @@ const
                     'Emboss', 'Phong', 'Contour', 'Grayscale', 'Negative', 'LinearNegative', 'ComplementaryColor', 'Normalize',
                     'Emboss', 'Phong', 'Contour', 'Grayscale', 'Negative', 'LinearNegative', 'ComplementaryColor', 'Normalize',
                     'Sphere', 'Twirl', 'WaveDisplacement', 'Cylinder', 'Plane',
                     'Sphere', 'Twirl', 'WaveDisplacement', 'Cylinder', 'Plane',
                     'PerlinNoise','CyclicPerlinNoise','Clouds','CustomWater','Water','Rain','Wood','WoodVertical','Plastik','MetalFloor','Camouflage',
                     'PerlinNoise','CyclicPerlinNoise','Clouds','CustomWater','Water','Rain','Wood','WoodVertical','Plastik','MetalFloor','Camouflage',
-                    'SnowPrint','Stone','RoundStone','Marble');
+                    'SnowPrint','Stone','RoundStone','Marble',
+                    'Hypocycloid');
 
 
   IsColoredFilter: array[TPictureFilter] of boolean =
   IsColoredFilter: array[TPictureFilter] of boolean =
                    (false,
                    (false,
@@ -92,7 +94,8 @@ const
                     false, true, false, false, false, false, false, false,
                     false, true, false, false, false, false, false, false,
                     false, false, false, false, false,
                     false, false, false, false, false,
                     false,false,true,true,true,true,true,true,true,true,true,
                     false,false,true,true,true,true,true,true,true,true,true,
-                    true,true,true,true);
+                    true,true,true,true,
+                    true);
 
 
 const
 const
   MinZoomForGrid = 4;
   MinZoomForGrid = 4;
@@ -268,6 +271,7 @@ type
     procedure ColorToFChooseColor; virtual; abstract;
     procedure ColorToFChooseColor; virtual; abstract;
     procedure ExitColorEditor; virtual; abstract;
     procedure ExitColorEditor; virtual; abstract;
     function ColorEditorActive: boolean; virtual; abstract;
     function ColorEditorActive: boolean; virtual; abstract;
+    procedure NotifyColorBinding; virtual; abstract;
     function GetColor(ATarget: TColorTarget): TBGRAPixel;
     function GetColor(ATarget: TColorTarget): TBGRAPixel;
     procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel);
     procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel);
     function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string;
     function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string;
@@ -290,6 +294,7 @@ type
     function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
     function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
+    function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; virtual; abstract;
     procedure ShowPrintDlg; virtual; abstract;
     procedure ShowPrintDlg; virtual; abstract;
     function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; virtual; abstract;
     function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; virtual; abstract;
     procedure AddToImageList(const FileNames: array of String); virtual; abstract;
     procedure AddToImageList(const FileNames: array of String); virtual; abstract;
@@ -309,6 +314,7 @@ type
     procedure Wait(ACheckActive: TCheckFunction; ADelayMs: integer); virtual; abstract;
     procedure Wait(ACheckActive: TCheckFunction; ADelayMs: integer); virtual; abstract;
     procedure AddColorToPalette(AColor: TBGRAPixel); virtual; abstract;
     procedure AddColorToPalette(AColor: TBGRAPixel); virtual; abstract;
     procedure RemoveColorFromPalette(AColor: TBGRAPixel); virtual; abstract;
     procedure RemoveColorFromPalette(AColor: TBGRAPixel); virtual; abstract;
+    function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; virtual; abstract;
 
 
     property BlackAndWhite: boolean read FBlackAndWhite write SetBlackAndWhite;
     property BlackAndWhite: boolean read FBlackAndWhite write SetBlackAndWhite;
 
 
@@ -339,6 +345,9 @@ type
 
 
     procedure ImageListWindowVisibleKeyDown(var Key: Word; Shift: TShiftState); virtual; abstract;
     procedure ImageListWindowVisibleKeyDown(var Key: Word; Shift: TShiftState); virtual; abstract;
     procedure MoveImageListWindowTo(X,Y: integer); virtual; abstract;
     procedure MoveImageListWindowTo(X,Y: integer); virtual; abstract;
+    procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract;
+    procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract;
+    procedure SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char); virtual; abstract;
     property ImageListWindowWidth: integer read GetImageListWindowWidth write SetImageListWindowWidth;
     property ImageListWindowWidth: integer read GetImageListWindowWidth write SetImageListWindowWidth;
     property ImageListWindowHeight: integer read GetImageListWindowHeight write SetImageListWindowHeight;
     property ImageListWindowHeight: integer read GetImageListWindowHeight write SetImageListWindowHeight;
     property ImageListWindowVisible: boolean read GetImageListWindowVisible write SetImageListWindowVisible;
     property ImageListWindowVisible: boolean read GetImageListWindowVisible write SetImageListWindowVisible;
@@ -385,7 +394,7 @@ function CSSToPascalCase(AIdentifier: string): string;
 
 
 implementation
 implementation
 
 
-uses LCLType, BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill;
+uses BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill;
 
 
 function LazPaintVersionStr: string;
 function LazPaintVersionStr: string;
 var numbers: TStringList;
 var numbers: TStringList;

+ 18 - 6
lazpaint/maintoolbar.inc

@@ -7,6 +7,7 @@ procedure TFMain.CreateToolbarElements;
       lbl: TLabel; pnl: TPanel; mouseMove: TMouseMoveEvent; mouseClick: TNotifyEvent; AIsTarget: boolean);
       lbl: TLabel; pnl: TPanel; mouseMove: TMouseMoveEvent; mouseClick: TNotifyEvent; AIsTarget: boolean);
   begin
   begin
     vf.PopupMenu := nil;
     vf.PopupMenu := nil;
+    vf.AllowKeyInput:= false;
     vf.VerticalPadding:= DoScaleY(6, OriginalDPI);
     vf.VerticalPadding:= DoScaleY(6, OriginalDPI);
     vf.OnChooseColor :=  @VectorialFill_ChooseColor;
     vf.OnChooseColor :=  @VectorialFill_ChooseColor;
     vf.OnTextureClick := @VectorialFill_TextureClick;
     vf.OnTextureClick := @VectorialFill_TextureClick;
@@ -657,11 +658,13 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TFMain.TextSpinEditFocused: boolean;
+function TFMain.SpinEditFocused: boolean;
+var ctrl: TWinControl;
 begin
 begin
-  result := SpinEdit_TextSize.Focused or SpinEdit_TextBlur.Focused or SpinEdit_TextShadowX.Focused or
-           SpinEdit_TextShadowY.Focused or SpinEdit_ShapeAltitude.Focused or
-           SpinEdit_TextOutlineWidth.Focused;
+  ctrl := Screen.ActiveControl;
+  if Assigned(ctrl) and (ctrl is TBCTrackBarUpDown) then
+    Result := (ctrl as TBCTrackBarUpDown).Focused
+    else Result := False;
 end;
 end;
 
 
 procedure TFMain.UpdateBrush;
 procedure TFMain.UpdateBrush;
@@ -695,14 +698,14 @@ end;
 
 
 function TFMain.CatchToolKeyDown(var AKey: Word): boolean;
 function TFMain.CatchToolKeyDown(var AKey: Word): boolean;
 begin
 begin
-  if Assigned(FLayout) then
+  if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then
     result := FLayout.CatchToolKeyDown(AKey)
     result := FLayout.CatchToolKeyDown(AKey)
     else result := false;
     else result := false;
 end;
 end;
 
 
 function TFMain.CatchToolKeyUp(var AKey: Word): boolean;
 function TFMain.CatchToolKeyUp(var AKey: Word): boolean;
 begin
 begin
-  if Assigned(FLayout) then
+  if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then
     result := FLayout.CatchToolKeyUp(AKey)
     result := FLayout.CatchToolKeyUp(AKey)
     else result := false;
     else result := false;
 end;
 end;
@@ -821,12 +824,15 @@ begin
   VectorialFill_Pen.Height := min(VectorialFill_Pen.ToolIconSize + VectorialFill_Pen.VerticalPadding,
   VectorialFill_Pen.Height := min(VectorialFill_Pen.ToolIconSize + VectorialFill_Pen.VerticalPadding,
                                Panel_SwapColor.ClientHeight - VectorialFill_Pen.Top - 1);
                                Panel_SwapColor.ClientHeight - VectorialFill_Pen.Top - 1);
   VectorialFill_Pen.Tag := 0;
   VectorialFill_Pen.Tag := 0;
+  VectorialFill_Pen.AllowKeyInput:= false;
   VectorialFill_Back.Height := min(VectorialFill_Back.ToolIconSize + VectorialFill_Back.VerticalPadding,
   VectorialFill_Back.Height := min(VectorialFill_Back.ToolIconSize + VectorialFill_Back.VerticalPadding,
                                Panel_SwapColor.ClientHeight - VectorialFill_Back.Top - 1);
                                Panel_SwapColor.ClientHeight - VectorialFill_Back.Top - 1);
   VectorialFill_Back.Tag := 0;
   VectorialFill_Back.Tag := 0;
+  VectorialFill_Back.AllowKeyInput:= false;
   VectorialFill_Outline.Height := min(VectorialFill_Outline.ToolIconSize + VectorialFill_Outline.VerticalPadding,
   VectorialFill_Outline.Height := min(VectorialFill_Outline.ToolIconSize + VectorialFill_Outline.VerticalPadding,
                                   Panel_SwapColor.ClientHeight - VectorialFill_Outline.Top - 1);
                                   Panel_SwapColor.ClientHeight - VectorialFill_Outline.Top - 1);
   VectorialFill_Outline.Tag := 0;
   VectorialFill_Outline.Tag := 0;
+  VectorialFill_Outline.AllowKeyInput:= false;
   Panel_PenFill.Height := Panel_SwapColor.Height;
   Panel_PenFill.Height := Panel_SwapColor.Height;
   Panel_BackFill.Height := Panel_SwapColor.Height;
   Panel_BackFill.Height := Panel_SwapColor.Height;
   Panel_OutlineFill.Height := Panel_SwapColor.Height;
   Panel_OutlineFill.Height := Panel_SwapColor.Height;
@@ -1612,6 +1618,7 @@ begin
   AFillControl.Height := AFillControl.PreferredSize.cy;
   AFillControl.Height := AFillControl.PreferredSize.cy;
   APanel.Height := AFillControl.Top + AFillControl.Height + DoScaleY(3, OriginalDPI);
   APanel.Height := AFillControl.Top + AFillControl.Height + DoScaleY(3, OriginalDPI);
   AFillControl.Tag := 1;
   AFillControl.Tag := 1;
+  AFillControl.AllowKeyInput:= true;
   HideFill(3000, true);
   HideFill(3000, true);
 end;
 end;
 
 
@@ -1691,6 +1698,11 @@ begin
   ShowTextMore;
   ShowTextMore;
 end;
 end;
 
 
+procedure TFMain.Panel_ToolbarBackgroundClick(Sender: TObject);
+begin
+  Layout.FocusImage;
+end;
+
 procedure TFMain.PopupToolbarPopup(Sender: TObject);
 procedure TFMain.PopupToolbarPopup(Sender: TObject);
 begin
 begin
   MenuFileToolbar.Checked := Config.DefaultFileToolbarVisible;
   MenuFileToolbar.Checked := Config.DefaultFileToolbarVisible;

+ 24 - 170
lazpaint/release/bin/i18n/lazpaint.ar.po

@@ -62,16 +62,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "مفتوح المصدر (جي بي ال 3) "
 msgstr "مفتوح المصدر (جي بي ال 3) "
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "ضبط المنحنيات"
 msgstr "ضبط المنحنيات"
@@ -245,16 +235,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "لون"
 msgstr "لون"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "إزاحة"
 msgstr "إزاحة"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "تدرج"
 msgid "Preset"
 msgid "Preset"
 msgstr "مسبقا"
 msgstr "مسبقا"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "تحرير القناع"
 msgstr "تحرير القناع"
@@ -317,11 +282,6 @@ msgstr "تحرير القناع"
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "تحميل قناع"
 msgstr "تحميل قناع"
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "ضبابية مخصصة"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "فتح ملف تدرج الرمادي"
 msgstr "فتح ملف تدرج الرمادي"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "إشراف"
 msgstr "إشراف"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "تطبيق الوضيفة"
 msgstr "تطبيق الوضيفة"
@@ -474,6 +414,14 @@ msgstr ""
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr ""
 msgstr ""
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "قائمة الصور"
 msgstr "قائمة الصور"
@@ -1504,6 +1452,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "ضجيج بيرلين دائري"
 msgstr "ضجيج بيرلين دائري"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "رخام"
 msgstr "رخام"
@@ -2090,16 +2042,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "زووم للخارج"
 msgstr "زووم للخارج"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2169,16 +2111,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "العرض :"
 msgstr "العرض :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "مرشح الضجيج"
 msgstr "مرشح الضجيج"
@@ -2316,16 +2248,6 @@ msgstr ""
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr ""
 msgstr ""
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2395,16 +2317,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "النسيج الحالي"
 msgstr "النسيج الحالي"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2420,16 +2332,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "الجودة :"
 msgstr "الجودة :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2444,6 +2346,7 @@ msgid "Levels :"
 msgstr "المستوى :"
 msgstr "المستوى :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr ""
 msgstr ""
 
 
@@ -2537,16 +2440,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2557,16 +2450,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "نصف القطر :"
 msgstr "نصف القطر :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr ""
 msgstr ""
@@ -2685,16 +2568,6 @@ msgstr ""
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr ""
 msgstr ""
@@ -2704,16 +2577,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "القدر :"
 msgstr "القدر :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2739,16 +2602,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr " الأدوات "
 msgstr " الأدوات "
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2764,16 +2617,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "نصف القطر :"
 msgstr "نصف القطر :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "إلغاء"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "موافق"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3480,6 +3323,12 @@ msgstr "من غير المعقول حفظ الصورة الكبيرة في تن
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "موافق"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "حسنا"
 msgstr "حسنا"
@@ -3547,6 +3396,11 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr "الإسم مسبقا"
 msgstr "الإسم مسبقا"
 
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.bg.po

@@ -65,16 +65,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Отворен код (GPLv3)"
 msgstr "Отворен код (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "Добре"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Настройка на кривите"
 msgstr "Настройка на кривите"
@@ -245,16 +235,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 msgid "Color"
 msgstr "Цвят"
 msgstr "Цвят"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 msgid "Shift"
 msgstr "Отместване"
 msgstr "Отместване"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "TFCOLORIZE.CAPTION"
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "Отенък"
 msgid "Preset"
 msgid "Preset"
 msgstr "Предварително зададени"
 msgstr "Предварително зададени"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Обработка на маска..."
 msgstr "Обработка на маска..."
@@ -317,11 +282,6 @@ msgstr "Обработка на маска..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Зареждане на маска..."
 msgstr "Зареждане на маска..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "Нагласено размиване"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Отваряне на сивобял файл"
 msgstr "Отваряне на сивобял файл"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "TFEMBOSS.CAPTION"
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Посока:"
 msgstr "Посока:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Прилагане на функцията"
 msgstr "Прилагане на функцията"
@@ -474,6 +414,14 @@ msgstr "Преливане на непрозрачността"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Брой страни:"
 msgstr "Брой страни:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Списък с изображения"
 msgstr "Списък с изображения"
@@ -1500,6 +1448,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Повтарящ пърлинов шум"
 msgstr "Повтарящ пърлинов шум"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Мрамор"
 msgstr "Мрамор"
@@ -2077,16 +2029,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Намаляване"
 msgstr "Намаляване"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2156,16 +2098,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 msgid "Width :"
 msgstr "Ширина:"
 msgstr "Ширина:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "Добре"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Шумов филтър"
 msgstr "Шумов филтър"
@@ -2303,16 +2235,6 @@ msgstr ""
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr ""
 msgstr ""
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "TFPHONGFILTER.CAPTION"
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2382,16 +2304,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 msgid "Current texture"
 msgstr ""
 msgstr ""
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "TFPIXELATE.CAPTION"
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2407,16 +2319,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Качество:"
 msgstr "Качество:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "Добре"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2431,6 +2333,7 @@ msgid "Levels :"
 msgstr "Равнища:"
 msgstr "Равнища:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Преглед"
 msgstr "Преглед"
 
 
@@ -2525,16 +2428,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "TFRADIALBLUR.CAPTION"
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2545,16 +2438,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Радиус:"
 msgstr "Радиус:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "Добре"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Дъжд"
 msgstr "Дъжд"
@@ -2673,16 +2556,6 @@ msgstr "32 разряда"
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfsharpen.button_ok.caption
-msgctxt "TFSHARPEN.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Изостряне/ Изглаждане"
 msgstr "Изостряне/ Изглаждане"
@@ -2692,16 +2565,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Количество: "
 msgstr "Количество: "
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2727,16 +2590,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 msgid "Tools"
 msgstr "Пособия"
 msgstr "Пособия"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "TFTWIRL.CAPTION"
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
 msgid "Twirl"
@@ -2752,16 +2605,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Радиус:"
 msgstr "Радиус:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отказ"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "Добре"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3462,6 +3305,12 @@ msgstr ""
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Добре"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Добре"
 msgstr "Добре"
@@ -3529,6 +3378,12 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Предварително зададено име"
 msgstr "Предварително зададено име"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Преглед"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "точки"
 msgstr "точки"

+ 26 - 170
lazpaint/release/bin/i18n/lazpaint.cs.po

@@ -58,16 +58,6 @@ msgstr "Licence:"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Otevřený kód (GPLv3)"
 msgstr "Otevřený kód (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Nastavit křivky"
 msgstr "Nastavit křivky"
@@ -231,16 +221,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Barva"
 msgstr "Barva"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "tfcolorintensity.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "tfcolorintensity.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -254,16 +234,6 @@ msgstr "Násobek"
 msgid "Shift"
 msgid "Shift"
 msgstr "Posun"
 msgstr "Posun"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "tfcolorize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfcolorize.button_ok.caption
-msgctxt "tfcolorize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgid "Colorize"
 msgid "Colorize"
 msgstr "Obarvení"
 msgstr "Obarvení"
@@ -286,11 +256,6 @@ msgstr "Odstín"
 msgid "Preset"
 msgid "Preset"
 msgstr "Předvolba"
 msgstr "Předvolba"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "tfcustomblur.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Upravit masku..."
 msgstr "Upravit masku..."
@@ -299,11 +264,6 @@ msgstr "Upravit masku..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Načíst masku..."
 msgstr "Načíst masku..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "tfcustomblur.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgid "Custom blur"
 msgid "Custom blur"
 msgstr "Vlastní rozmazání"
 msgstr "Vlastní rozmazání"
@@ -312,16 +272,6 @@ msgstr "Vlastní rozmazání"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Otevřít černobílý obrázek"
 msgstr "Otevřít černobílý obrázek"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "tfemboss.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfemboss.button_ok.caption
-msgctxt "tfemboss.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgid "Emboss"
 msgid "Emboss"
 msgstr "Vytlačit"
 msgstr "Vytlačit"
@@ -338,16 +288,6 @@ msgstr "Průhledné"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Směr :"
 msgstr "Směr :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Použít funkci"
 msgstr "Použít funkci"
@@ -450,6 +390,14 @@ msgstr "Gradient průhlednosti"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Počet stran:"
 msgstr "Počet stran:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Seznam obrázků"
 msgstr "Seznam obrázků"
@@ -1421,6 +1369,10 @@ msgstr "Voda s vlastními barvami"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Kruhový Perlinův šum"
 msgstr "Kruhový Perlinův šum"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Mramor"
 msgstr "Mramor"
@@ -1951,16 +1903,6 @@ msgstr "Zvětšit na původní bodovou velikost"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Oddálit"
 msgstr "Oddálit"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "tfmotionblur.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "tfmotionblur.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgid "Motion blur"
 msgid "Motion blur"
 msgstr "Pohybové rozmazání"
 msgstr "Pohybové rozmazání"
@@ -2028,16 +1970,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Šířka :"
 msgstr "Šířka :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Šumový filtr"
 msgstr "Šumový filtr"
@@ -2169,16 +2101,6 @@ msgstr "Přidat bodové světlo"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Odebrat vybrané světlo"
 msgstr "Odebrat vybrané světlo"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgid "Shaded map"
 msgid "Shaded map"
 msgstr "Stínová mapa"
 msgstr "Stínová mapa"
@@ -2246,16 +2168,6 @@ msgstr "Barva pera"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Aktuální textura"
 msgstr "Aktuální textura"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "tfpixelate.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfpixelate.button_ok.caption
-msgctxt "tfpixelate.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgid "Pixelate"
 msgid "Pixelate"
 msgstr "Pixelizace"
 msgstr "Pixelizace"
@@ -2269,16 +2181,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Kvalita :"
 msgstr "Kvalita :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2293,6 +2195,7 @@ msgid "Levels :"
 msgstr "Úrovně:"
 msgstr "Úrovně:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Náhled"
 msgstr "Náhled"
 
 
@@ -2386,16 +2289,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "tfradialblur.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfradialblur.button_ok.caption
-msgctxt "tfradialblur.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2406,16 +2299,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Poloměr :"
 msgstr "Poloměr :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Déšť"
 msgstr "Déšť"
@@ -2533,16 +2416,6 @@ msgstr "32 bitů"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Ostření/Vyhlazení"
 msgstr "Ostření/Vyhlazení"
@@ -2551,16 +2424,6 @@ msgstr "Ostření/Vyhlazení"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Množství :"
 msgstr "Množství :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "tfshiftcolors.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "tfshiftcolors.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgid "Shift colors"
 msgid "Shift colors"
 msgstr "Posunout barvy"
 msgstr "Posunout barvy"
@@ -2585,16 +2448,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Nástroje"
 msgstr "Nástroje"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "tftwirl.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tftwirl.button_ok.caption
-msgctxt "tftwirl.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgid "Twirl"
 msgid "Twirl"
 msgstr "Víření"
 msgstr "Víření"
@@ -2608,16 +2461,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Poloměr :"
 msgstr "Poloměr :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Posunutí vlny"
 msgstr "Posunutí vlny"
@@ -3313,6 +3156,12 @@ msgstr "Není rozumně ukládat tak velký obrázek v tomto formátu."
 msgid "№"
 msgid "№"
 msgstr "Č."
 msgstr "Č."
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Ok"
 msgstr "Ok"
@@ -3379,6 +3228,12 @@ msgstr "Obarvit vrstvu použitím palety"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Jméno předvolby"
 msgstr "Jméno předvolby"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Náhled"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"
@@ -3632,3 +3487,4 @@ msgstr "Přiblížit sadu vrstev"
 #: uresourcestrings.rszoomlayerstackout
 #: uresourcestrings.rszoomlayerstackout
 msgid "Zoom layer stack out"
 msgid "Zoom layer stack out"
 msgstr "Oddálit sadu vrstev"
 msgstr "Oddálit sadu vrstev"
+

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.de.po

@@ -72,16 +72,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Open Source (GPLv3)"
 msgstr "Open Source (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Farbkurven anpassen"
 msgstr "Farbkurven anpassen"
@@ -255,16 +245,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Farbe"
 msgstr "Farbe"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -280,16 +260,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Verschieben"
 msgstr "Verschieben"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -314,11 +284,6 @@ msgstr "Farbton"
 msgid "Preset"
 msgid "Preset"
 msgstr "Voreingestellt"
 msgstr "Voreingestellt"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Maske bearbeiten..."
 msgstr "Maske bearbeiten..."
@@ -327,11 +292,6 @@ msgstr "Maske bearbeiten..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Maske laden..."
 msgstr "Maske laden..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -341,16 +301,6 @@ msgstr "Benutzerdefinierter Weichzeichner"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Graustufen-Datei öffnen"
 msgstr "Graustufen-Datei öffnen"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -369,16 +319,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Richtung:"
 msgstr "Richtung:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Funktion anwenden"
 msgstr "Funktion anwenden"
@@ -484,6 +424,14 @@ msgstr "Deckkraft Verlauf"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Anzahl der Seiten:"
 msgstr "Anzahl der Seiten:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Bilderliste"
 msgstr "Bilderliste"
@@ -1515,6 +1463,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Perlin-Rauschen (zyklisch)"
 msgstr "Perlin-Rauschen (zyklisch)"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmor"
 msgstr "Marmor"
@@ -2101,16 +2053,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Auszoomen"
 msgstr "Auszoomen"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2180,16 +2122,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Breite:"
 msgstr "Breite:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Rauschfilter"
 msgstr "Rauschfilter"
@@ -2327,16 +2259,6 @@ msgstr "Lichtpunkt hinzufügen"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Gewählte Lichtquelle entfernen"
 msgstr "Gewählte Lichtquelle entfernen"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2406,16 +2328,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Aktuelle Textur"
 msgstr "Aktuelle Textur"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2431,16 +2343,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Qualität"
 msgstr "Qualität"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2455,6 +2357,7 @@ msgid "Levels :"
 msgstr "Stufen:"
 msgstr "Stufen:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Vorschau"
 msgstr "Vorschau"
 
 
@@ -2548,16 +2451,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2568,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Radius:"
 msgstr "Radius:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Regen"
 msgstr "Regen"
@@ -2696,16 +2579,6 @@ msgstr "32 bits"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Scharfzeichnen/Weichzeichnen"
 msgstr "Scharfzeichnen/Weichzeichnen"
@@ -2715,16 +2588,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Wert:"
 msgstr "Wert:"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2750,16 +2613,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Werkzeuge"
 msgstr "Werkzeuge"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2775,16 +2628,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Radius:"
 msgstr "Radius:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Abbruch"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Wellen-Wandel"
 msgstr "Wellen-Wandel"
@@ -3491,6 +3334,12 @@ msgstr "Es wird nicht empfohlen, ein so großes Bild in diesem Dateiformat zu sp
 msgid "№"
 msgid "№"
 msgstr "Nr."
 msgstr "Nr."
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "OK"
 msgstr "OK"
@@ -3558,6 +3407,12 @@ msgstr "Posterisierung der Ebene mit der Palette anwenden"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Voreingestellter Name"
 msgstr "Voreingestellter Name"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Vorschau"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 26 - 170
lazpaint/release/bin/i18n/lazpaint.es.po

@@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Código libre (GPLv3)"
 msgstr "Código libre (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Ajustar curvas"
 msgstr "Ajustar curvas"
@@ -247,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Color"
 msgstr "Color"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Cambiar"
 msgstr "Cambiar"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "Matiz"
 msgid "Preset"
 msgid "Preset"
 msgstr "Preajuste"
 msgstr "Preajuste"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Editar máscara.."
 msgstr "Editar máscara.."
@@ -319,11 +284,6 @@ msgstr "Editar máscara.."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Abrir máscara.."
 msgstr "Abrir máscara.."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "Desenfoque personalizado"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Abrir archivo de escala de grises"
 msgstr "Abrir archivo de escala de grises"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Dirección:"
 msgstr "Dirección:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Aplicar función"
 msgstr "Aplicar función"
@@ -473,6 +413,14 @@ msgstr "Opacidad de degradado"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Número de lados:"
 msgstr "Número de lados:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Lista de imágenes"
 msgstr "Lista de imágenes"
@@ -1498,6 +1446,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Ruido Perlin Cíclico"
 msgstr "Ruido Perlin Cíclico"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Mármol"
 msgstr "Mármol"
@@ -2083,16 +2035,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Zoom fuera"
 msgstr "Zoom fuera"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2162,16 +2104,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Ancho:"
 msgstr "Ancho:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Ruido"
 msgstr "Ruido"
@@ -2309,16 +2241,6 @@ msgstr "Agregar una luz puntual"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Quitar luz seleccionada"
 msgstr "Quitar luz seleccionada"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2388,16 +2310,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Textura actual"
 msgstr "Textura actual"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2413,16 +2325,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Calidad:"
 msgstr "Calidad:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2437,6 +2339,7 @@ msgid "Levels :"
 msgstr "Niveles:"
 msgstr "Niveles:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Vista previa"
 msgstr "Vista previa"
 
 
@@ -2530,16 +2433,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2550,16 +2443,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Radio:"
 msgstr "Radio:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Lluvia"
 msgstr "Lluvia"
@@ -2678,16 +2561,6 @@ msgstr "32 bits"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Nítido/Suave"
 msgstr "Nítido/Suave"
@@ -2697,16 +2570,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Cantidad:"
 msgstr "Cantidad:"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2732,16 +2595,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Herramientas"
 msgstr "Herramientas"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2757,16 +2610,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Rádio:"
 msgstr "Rádio:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "TFWAVEDISPLACEMENT.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "TFWAVEDISPLACEMENT.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Desplazamiento de onda"
 msgstr "Desplazamiento de onda"
@@ -3486,6 +3329,12 @@ msgstr "No es razonable guardar una imagen tan grande con este formato."
 msgid "№"
 msgid "№"
 msgstr "Nº"
 msgstr "Nº"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Aceptar"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "OK"
 msgstr "OK"
@@ -3553,6 +3402,12 @@ msgstr "Posterizar capa usando paleta"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Nombre de preajuste"
 msgstr "Nombre de preajuste"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Vista previa"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"
@@ -3813,3 +3668,4 @@ msgstr "Hacer zoom en capas"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgid "Zoom layer stack out"
 msgstr "Deshacer zoom en capas"
 msgstr "Deshacer zoom en capas"
+

+ 23 - 170
lazpaint/release/bin/i18n/lazpaint.fi.po

@@ -54,16 +54,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Avoin lähdekoodi (GPLv3)"
 msgstr "Avoin lähdekoodi (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "TFADJUSTCURVES.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "TFADJUSTCURVES.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Muokkaa käyriä"
 msgstr "Muokkaa käyriä"
@@ -237,16 +227,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 msgid "Color"
 msgstr "Väri"
 msgstr "Väri"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 msgid "Shift"
 msgstr ""
 msgstr ""
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "TFCOLORIZE.CAPTION"
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Värisävy"
 msgid "Preset"
 msgid "Preset"
 msgstr "Esiasetus"
 msgstr "Esiasetus"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Muokkaa maskia"
 msgstr "Muokkaa maskia"
@@ -309,11 +274,6 @@ msgstr "Muokkaa maskia"
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Lataa maski"
 msgstr "Lataa maski"
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Maskin mukainen sumennus"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Avaa harmaasävytiedosto"
 msgstr "Avaa harmaasävytiedosto"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "TFEMBOSS.CAPTION"
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Suunta :"
 msgstr "Suunta :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr ""
 msgstr ""
@@ -463,6 +403,14 @@ msgstr "Liukuva peittävyys"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Sivujen määrä:"
 msgstr "Sivujen määrä:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Kuvaluettelo"
 msgstr "Kuvaluettelo"
@@ -1494,6 +1442,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Jaksottainen Perlin kohina"
 msgstr "Jaksottainen Perlin kohina"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmori"
 msgstr "Marmori"
@@ -2081,16 +2033,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Loitonna"
 msgstr "Loitonna"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2160,16 +2102,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 msgid "Width :"
 msgstr "Leveys :"
 msgstr "Leveys :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "TFNOISEFILTER.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Kohinasuodatin"
 msgstr "Kohinasuodatin"
@@ -2307,16 +2239,6 @@ msgstr ""
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr ""
 msgstr ""
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "TFPHONGFILTER.CAPTION"
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2387,16 +2309,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 msgid "Current texture"
 msgstr ""
 msgstr ""
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "TFPIXELATE.CAPTION"
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2412,16 +2324,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 msgid "Quality :"
 msgstr ""
 msgstr ""
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "TFPOSTERIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfposterize.button_ok.caption
-msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "TFPOSTERIZE.CAPTION"
 msgctxt "TFPOSTERIZE.CAPTION"
 msgid "Posterize"
 msgid "Posterize"
@@ -2436,6 +2338,7 @@ msgid "Levels :"
 msgstr ""
 msgstr ""
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr ""
 msgstr ""
 
 
@@ -2529,16 +2432,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr ""
 msgstr ""
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "TFRADIALBLUR.CAPTION"
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2550,16 +2443,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Säde :"
 msgstr "Säde :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "TFRAIN.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfrain.button_ok.caption
-msgctxt "TFRAIN.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Sade"
 msgstr "Sade"
@@ -2678,16 +2561,6 @@ msgstr ""
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfsharpen.button_ok.caption
-msgctxt "TFSHARPEN.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Terävöitä/Pehmennä"
 msgstr "Terävöitä/Pehmennä"
@@ -2697,16 +2570,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 msgid "Amount :"
 msgstr ""
 msgstr ""
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2732,16 +2595,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 msgid "Tools"
 msgstr "Työkalut"
 msgstr "Työkalut"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "TFTWIRL.CAPTION"
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
 msgid "Twirl"
@@ -2757,16 +2610,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Säde :"
 msgstr "Säde :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Peru"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3472,6 +3315,11 @@ msgstr ""
 msgid "№"
 msgid "№"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsok
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr ""
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Ok"
 msgstr "Ok"
@@ -3539,6 +3387,11 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr ""
 msgstr ""

+ 29 - 171
lazpaint/release/bin/i18n/lazpaint.fr.po

@@ -1,13 +1,15 @@
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
 "Project-Id-Version: \n"
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
 "POT-Creation-Date: \n"
 "PO-Revision-Date: \n"
 "PO-Revision-Date: \n"
 "Last-Translator: circular\n"
 "Last-Translator: circular\n"
 "Language-Team: \n"
 "Language-Team: \n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
 
 
 #: tablet.getprocfailed
 #: tablet.getprocfailed
 #, object-pascal-format
 #, object-pascal-format
@@ -62,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Code libre (GPLv3)"
 msgstr "Code libre (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Ajuster les courbes"
 msgstr "Ajuster les courbes"
@@ -245,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Couleur"
 msgstr "Couleur"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -270,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Décaler"
 msgstr "Décaler"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -304,11 +276,6 @@ msgstr "Nuances"
 msgid "Preset"
 msgid "Preset"
 msgstr "Prédéfini"
 msgstr "Prédéfini"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Éditer un masque..."
 msgstr "Éditer un masque..."
@@ -317,11 +284,6 @@ msgstr "Éditer un masque..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Charger un masque..."
 msgstr "Charger un masque..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -331,16 +293,6 @@ msgstr "Flou personnalisé"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Ouvrir un fichier en échelle de gris"
 msgstr "Ouvrir un fichier en échelle de gris"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -359,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Direction :"
 msgstr "Direction :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Appliquer la fonction"
 msgstr "Appliquer la fonction"
@@ -474,6 +416,15 @@ msgstr "Gradient d'opacité"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Nombre de côtés :"
 msgstr "Nombre de côtés :"
 
 
+#: tfhypocycloid.caption
+msgctxt "tfhypocycloid.caption"
+msgid "Hypocycloid"
+msgstr "Hypocycloïde"
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr "Arches:"
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Liste d'images"
 msgstr "Liste d'images"
@@ -1506,6 +1457,11 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Bruit de Perlin cyclique"
 msgstr "Bruit de Perlin cyclique"
 
 
+#: tfmain.renderhypocycloid.caption
+msgctxt "tfmain.renderhypocycloid.caption"
+msgid "Hypocycloid..."
+msgstr "Hypocycloïde..."
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marbre"
 msgstr "Marbre"
@@ -2092,16 +2048,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Dézoomer"
 msgstr "Dézoomer"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2171,16 +2117,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Largeur :"
 msgstr "Largeur :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Bruit"
 msgstr "Bruit"
@@ -2318,16 +2254,6 @@ msgstr "Ajouter une lumière ponctuelle"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Supprimer la source lumineuse"
 msgstr "Supprimer la source lumineuse"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2397,16 +2323,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Texture en cours"
 msgstr "Texture en cours"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2422,16 +2338,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Qualité :"
 msgstr "Qualité :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2446,6 +2352,7 @@ msgid "Levels :"
 msgstr "Niveaux :"
 msgstr "Niveaux :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Aperçu"
 msgstr "Aperçu"
 
 
@@ -2539,16 +2446,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2559,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Rayon :"
 msgstr "Rayon :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Pluie"
 msgstr "Pluie"
@@ -2687,16 +2574,6 @@ msgstr "32 bits"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Accentuer/Lisser"
 msgstr "Accentuer/Lisser"
@@ -2706,16 +2583,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Quantité :"
 msgstr "Quantité :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2741,16 +2608,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Outils"
 msgstr "Outils"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2766,16 +2623,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Rayon :"
 msgstr "Rayon :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuler"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Décalage d'onde"
 msgstr "Décalage d'onde"
@@ -3499,6 +3346,12 @@ msgstr "Il n'est pas raisonnable d'enregistrer une image aussi grande avec ce fo
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Ok"
 msgstr "Ok"
@@ -3567,6 +3420,11 @@ msgstr "Postériser le calque en utilisant la palette"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Nom"
 msgstr "Nom"
 
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Aperçu"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 24 - 170
lazpaint/release/bin/i18n/lazpaint.it.po

@@ -54,16 +54,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr ""
 msgstr ""
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Aggiusta curve"
 msgstr "Aggiusta curve"
@@ -237,16 +227,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Colore"
 msgstr "Colore"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr ""
 msgstr ""
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Tonalità"
 msgid "Preset"
 msgid "Preset"
 msgstr "Predefinisci"
 msgstr "Predefinisci"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Edita maschera"
 msgstr "Edita maschera"
@@ -309,11 +274,6 @@ msgstr "Edita maschera"
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Carica maschera"
 msgstr "Carica maschera"
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Sfocatura ottimale"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr ""
 msgstr ""
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Direzione"
 msgstr "Direzione"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Applica funzione"
 msgstr "Applica funzione"
@@ -463,6 +403,14 @@ msgstr "Gradiente di opacità"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr ""
 msgstr ""
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr ""
 msgstr ""
@@ -1493,6 +1441,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr ""
 msgstr ""
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmo"
 msgstr "Marmo"
@@ -2079,16 +2031,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr ""
 msgstr ""
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2158,16 +2100,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Larghezza"
 msgstr "Larghezza"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Filtro di rumore"
 msgstr "Filtro di rumore"
@@ -2305,16 +2237,6 @@ msgstr "Aggiungi punto luce"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Rimuovi luce selezionata"
 msgstr "Rimuovi luce selezionata"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2384,16 +2306,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Testo corrente"
 msgstr "Testo corrente"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2409,16 +2321,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Qualità"
 msgstr "Qualità"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2433,6 +2335,7 @@ msgid "Levels :"
 msgstr "Livelli"
 msgstr "Livelli"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Anteprima"
 msgstr "Anteprima"
 
 
@@ -2526,16 +2429,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr ""
 msgstr ""
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2546,16 +2439,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Raggio :"
 msgstr "Raggio :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Pioggia"
 msgstr "Pioggia"
@@ -2674,16 +2557,6 @@ msgstr ""
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr ""
 msgstr ""
@@ -2693,16 +2566,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr ""
 msgstr ""
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2729,16 +2592,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Strumenti"
 msgstr "Strumenti"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2754,16 +2607,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Raggio :"
 msgstr "Raggio :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancella"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3487,6 +3330,11 @@ msgstr ""
 msgid "№"
 msgid "№"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsok
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr ""
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr ""
 msgstr ""
@@ -3555,6 +3403,12 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Anteprima"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr ""
 msgstr ""

+ 24 - 170
lazpaint/release/bin/i18n/lazpaint.ja.po

@@ -62,16 +62,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr ""
 msgstr ""
@@ -245,16 +235,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "色"
 msgstr "色"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "シフト"
 msgstr "シフト"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "色相"
 msgid "Preset"
 msgid "Preset"
 msgstr ""
 msgstr ""
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "マスク編集"
 msgstr "マスク編集"
@@ -317,11 +282,6 @@ msgstr "マスク編集"
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "マスク読み込み"
 msgstr "マスク読み込み"
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "カスタムブラー"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "注意:ブラー用に作成されたグレースケール画像を開く"
 msgstr "注意:ブラー用に作成されたグレースケール画像を開く"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "方向:"
 msgstr "方向:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr ""
 msgstr ""
@@ -471,6 +411,14 @@ msgstr ""
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr ""
 msgstr ""
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr ""
 msgstr ""
@@ -1501,6 +1449,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Cyclic Perlinノイズ"
 msgstr "Cyclic Perlinノイズ"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "マーブル大理石"
 msgstr "マーブル大理石"
@@ -2088,16 +2040,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "ズームアウト"
 msgstr "ズームアウト"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2167,16 +2109,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "幅:"
 msgstr "幅:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr ""
 msgstr ""
@@ -2314,16 +2246,6 @@ msgstr ""
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr ""
 msgstr ""
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2393,16 +2315,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "現在のテクスチャ"
 msgstr "現在のテクスチャ"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2418,16 +2330,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "精度:"
 msgstr "精度:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2442,6 +2344,7 @@ msgid "Levels :"
 msgstr ""
 msgstr ""
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr ""
 msgstr ""
 
 
@@ -2535,16 +2438,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr ""
 msgstr ""
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2555,16 +2448,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "半径:"
 msgstr "半径:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr ""
 msgstr ""
@@ -2683,16 +2566,6 @@ msgstr ""
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr ""
 msgstr ""
@@ -2702,16 +2575,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr ""
 msgstr ""
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2737,16 +2600,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "ツール"
 msgstr "ツール"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2762,16 +2615,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "半径:"
 msgstr "半径:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "キャンセル"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3477,6 +3320,12 @@ msgstr ""
 msgid "№"
 msgid "№"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr ""
 msgstr ""
@@ -3544,6 +3393,11 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr ""
 msgstr ""

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.kab.po

@@ -65,16 +65,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Sgaddi izligen"
 msgstr "Sgaddi izligen"
@@ -248,16 +238,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Ini"
 msgstr "Ini"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -273,16 +253,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Sekḥer"
 msgstr "Sekḥer"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -307,11 +277,6 @@ msgstr "Tiɣmi"
 msgid "Preset"
 msgid "Preset"
 msgstr "Azwir-ɣewwar"
 msgstr "Azwir-ɣewwar"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Ẓreg tagelmust..."
 msgstr "Ẓreg tagelmust..."
@@ -320,11 +285,6 @@ msgstr "Ẓreg tagelmust..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Sali-d tagelmust..."
 msgstr "Sali-d tagelmust..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -334,16 +294,6 @@ msgstr "Aluɣu yugnen"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Ldi afaylu s tfesna n umelliɣdi"
 msgstr "Ldi afaylu s tfesna n umelliɣdi"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -362,16 +312,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Tanila :"
 msgstr "Tanila :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Snes tawuri"
 msgstr "Snes tawuri"
@@ -477,6 +417,14 @@ msgstr "Tiḍullest n ufesniw"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Amḍan n idisan:"
 msgstr "Amḍan n idisan:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Tabdart n tugniwin"
 msgstr "Tabdart n tugniwin"
@@ -1507,6 +1455,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Asxerxec n Perlin s wallus"
 msgstr "Asxerxec n Perlin s wallus"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Aṛxam"
 msgstr "Aṛxam"
@@ -2092,16 +2044,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Simecṭuḥ"
 msgstr "Simecṭuḥ"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2171,16 +2113,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Tehri :"
 msgstr "Tehri :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Tastayt n usxerxec"
 msgstr "Tastayt n usxerxec"
@@ -2318,16 +2250,6 @@ msgstr "Rnu tafat tunqiḍt"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Kkes tafat yettwafernen"
 msgstr "Kkes tafat yettwafernen"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2397,16 +2319,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Tizḍi tamirant"
 msgstr "Tizḍi tamirant"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2422,16 +2334,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Taɣara :"
 msgstr "Taɣara :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2446,6 +2348,7 @@ msgid "Levels :"
 msgstr "Iswiren :"
 msgstr "Iswiren :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Tamuɣli"
 msgstr "Tamuɣli"
 
 
@@ -2539,16 +2442,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2559,16 +2452,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Aqqar :"
 msgstr "Aqqar :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Agfur"
 msgstr "Agfur"
@@ -2687,16 +2570,6 @@ msgstr "32 n ibiten"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Semsed/Mzi"
 msgstr "Semsed/Mzi"
@@ -2706,16 +2579,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Tasmekta :"
 msgstr "Tasmekta :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2741,16 +2604,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Ifecka"
 msgstr "Ifecka"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2766,16 +2619,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Aqqar :"
 msgstr "Aqqar :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Sefsex"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "Ih"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Asekḥer n tayyugt"
 msgstr "Asekḥer n tayyugt"
@@ -3499,6 +3342,12 @@ msgstr "Ur iwulem ara ad teskelseḍ tugna s umasal-agi n ufaylu."
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Ih"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Ih"
 msgstr "Ih"
@@ -3567,6 +3416,12 @@ msgstr "Talɣa n ubeqqiḍ i tissi s useqdec n tpaliḍt"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Sbadu isem"
 msgstr "Sbadu isem"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Tamuɣli"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.lv.po

@@ -70,16 +70,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Atklātā pirmkoda (GPLv3)"
 msgstr "Atklātā pirmkoda (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Mainīt līknes"
 msgstr "Mainīt līknes"
@@ -253,16 +243,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Krāsa"
 msgstr "Krāsa"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -278,16 +258,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Nobīde"
 msgstr "Nobīde"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -312,11 +282,6 @@ msgstr "Nokrāsa"
 msgid "Preset"
 msgid "Preset"
 msgstr "Iestatījumi"
 msgstr "Iestatījumi"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Labot masku ..."
 msgstr "Labot masku ..."
@@ -325,11 +290,6 @@ msgstr "Labot masku ..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Ielasīt masku ..."
 msgstr "Ielasīt masku ..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -339,16 +299,6 @@ msgstr "Pielāgota izpludināšana"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Atvērt pelēktoņu attēlu"
 msgstr "Atvērt pelēktoņu attēlu"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -367,16 +317,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Virziens:"
 msgstr "Virziens:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Pielietot funkciju"
 msgstr "Pielietot funkciju"
@@ -482,6 +422,14 @@ msgstr "Izgaišana uz malām"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Malu skaits:"
 msgstr "Malu skaits:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Attēlu saraksts"
 msgstr "Attēlu saraksts"
@@ -1510,6 +1458,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Perlina troksnis flīzēm"
 msgstr "Perlina troksnis flīzēm"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmors"
 msgstr "Marmors"
@@ -2095,16 +2047,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Tālināt"
 msgstr "Tālināt"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2174,16 +2116,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Platums:"
 msgstr "Platums:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Trokšņu filtrs"
 msgstr "Trokšņu filtrs"
@@ -2322,16 +2254,6 @@ msgstr "Pievienot punktveida gaismas avotu"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Izmest doto gaismu"
 msgstr "Izmest doto gaismu"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2401,16 +2323,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Virsmas raksts"
 msgstr "Virsmas raksts"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2426,16 +2338,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Kvalitāte:"
 msgstr "Kvalitāte:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2450,6 +2352,7 @@ msgid "Levels :"
 msgstr "Līmeņi:"
 msgstr "Līmeņi:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Priekšskatījums"
 msgstr "Priekšskatījums"
 
 
@@ -2543,16 +2446,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2563,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Rādiuss:"
 msgstr "Rādiuss:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Lietus"
 msgstr "Lietus"
@@ -2691,16 +2574,6 @@ msgstr "32 biti"
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Asināt/Nogludināt"
 msgstr "Asināt/Nogludināt"
@@ -2710,16 +2583,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Stiprums:"
 msgstr "Stiprums:"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2745,16 +2608,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Rīki"
 msgstr "Rīki"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2770,16 +2623,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Rādiuss:"
 msgstr "Rādiuss:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Atcelt"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "Labi"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Viļņu nobīde"
 msgstr "Viļņu nobīde"
@@ -3503,6 +3346,12 @@ msgstr "Nav prātīgi saglabāt tik lielu attēlu šajā datnes formātā."
 msgid "№"
 msgid "№"
 msgstr "Nr. "
 msgstr "Nr. "
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Labi"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Labi"
 msgstr "Labi"
@@ -3571,6 +3420,12 @@ msgstr "Samazināt krāsu skaitu izmantojot paleti"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Iestatījumu vārds"
 msgstr "Iestatījumu vārds"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Priekšskatījums"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "pikseļi"
 msgstr "pikseļi"

+ 34 - 191
lazpaint/release/bin/i18n/lazpaint.nl.po

@@ -68,16 +68,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 msgstr "Open source (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Krommen aanpassen"
 msgstr "Krommen aanpassen"
@@ -171,9 +161,7 @@ msgstr "Basale SVG"
 
 
 #: tfblendop.label_svgover.hint
 #: tfblendop.label_svgover.hint
 msgid "Basic blend operations that are available in virtually all image editors"
 msgid "Basic blend operations that are available in virtually all image editors"
-msgstr ""
-"Basale mengoperaties die beschikbaar zijn in bijna alle "
-"beeldbewerkingssoftware"
+msgstr "Basale mengoperaties die beschikbaar zijn in bijna alle beeldbewerkingssoftware"
 
 
 #: tfbrowseimages.caption
 #: tfbrowseimages.caption
 msgid "Browse images"
 msgid "Browse images"
@@ -253,16 +241,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Kleur"
 msgstr "Kleur"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -278,16 +256,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Verschuiven"
 msgstr "Verschuiven"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -312,11 +280,6 @@ msgstr "Kleurtint"
 msgid "Preset"
 msgid "Preset"
 msgstr "Voorinstelling"
 msgstr "Voorinstelling"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Masker bewerken..."
 msgstr "Masker bewerken..."
@@ -325,11 +288,6 @@ msgstr "Masker bewerken..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Masker laden..."
 msgstr "Masker laden..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -339,16 +297,6 @@ msgstr "Aangepaste vervaging"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Zwart-witte afbeelding laden..."
 msgstr "Zwart-witte afbeelding laden..."
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -367,16 +315,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Richting :"
 msgstr "Richting :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Functie toepassen"
 msgstr "Functie toepassen"
@@ -482,6 +420,14 @@ msgstr "Dekkingsgradiënt"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Aantal zijden:"
 msgstr "Aantal zijden:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Afbeeldingslijst"
 msgstr "Afbeeldingslijst"
@@ -1507,6 +1453,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Cyclische Perlin-ruis"
 msgstr "Cyclische Perlin-ruis"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmer"
 msgstr "Marmer"
@@ -2091,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Uitzoomen"
 msgstr "Uitzoomen"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2170,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Breedte :"
 msgstr "Breedte :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Ruisfilter"
 msgstr "Ruisfilter"
@@ -2317,16 +2247,6 @@ msgstr "Voeg een puntlicht toe"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Verwijder geselecteerd licht"
 msgstr "Verwijder geselecteerd licht"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2396,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Huidige textuur"
 msgstr "Huidige textuur"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2421,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Kwaliteit :"
 msgstr "Kwaliteit :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2445,6 +2345,7 @@ msgid "Levels :"
 msgstr "Niveaus :"
 msgstr "Niveaus :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Voorbeeld"
 msgstr "Voorbeeld"
 
 
@@ -2538,16 +2439,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2558,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Straal :"
 msgstr "Straal :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Regen"
 msgstr "Regen"
@@ -2686,16 +2567,6 @@ msgstr "32 bits"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Verscherpen/Gladstrijken"
 msgstr "Verscherpen/Gladstrijken"
@@ -2705,16 +2576,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Hoeveelheid :"
 msgstr "Hoeveelheid :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2740,16 +2601,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Gereedschappen"
 msgstr "Gereedschappen"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2765,16 +2616,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Straal :"
 msgstr "Straal :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Golf verplaatsing"
 msgstr "Golf verplaatsing"
@@ -2908,9 +2749,7 @@ msgstr "CMD"
 
 
 #: uresourcestrings.rscolordescription
 #: uresourcestrings.rscolordescription
 msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
 msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
-msgstr ""
-"Kleurbeschrijving: klik om een kleur in te typen met het toetsenbord middels "
-"kleurnamen of CSS notatie."
+msgstr "Kleurbeschrijving: klik om een kleur in te typen met het toetsenbord middels kleurnamen of CSS notatie."
 
 
 #: uresourcestrings.rscoloroverlay
 #: uresourcestrings.rscoloroverlay
 msgid "Color overlay"
 msgid "Color overlay"
@@ -2931,8 +2770,7 @@ msgstr "Weet u zeker dat u deze %1-bestanden uit de container wilt verwijderen?"
 
 
 #: uresourcestrings.rsconfirmmovemultipletotrash
 #: uresourcestrings.rsconfirmmovemultipletotrash
 msgid "Are you sure you want to move these %1 files to the trash?"
 msgid "Are you sure you want to move these %1 files to the trash?"
-msgstr ""
-"Weet je zeker dat je deze %1-bestanden naar de prullenbak wilt verplaatsen?"
+msgstr "Weet je zeker dat je deze %1-bestanden naar de prullenbak wilt verplaatsen?"
 
 
 #: uresourcestrings.rsconfirmmovetotrash
 #: uresourcestrings.rsconfirmmovetotrash
 msgid "Are you sure you want to move this file to the trash?"
 msgid "Are you sure you want to move this file to the trash?"
@@ -3044,8 +2882,7 @@ msgstr "Einde zonder begin"
 
 
 #: uresourcestrings.rsenterfolderorcontainername
 #: uresourcestrings.rsenterfolderorcontainername
 msgid "Enter name for new folder or container (using RES or LRS extension):"
 msgid "Enter name for new folder or container (using RES or LRS extension):"
-msgstr ""
-"Voer naam in voor een nieuwe map of container (met extensie RES of LRS):"
+msgstr "Voer naam in voor een nieuwe map of container (met extensie RES of LRS):"
 
 
 #: uresourcestrings.rsenterlayername
 #: uresourcestrings.rsenterlayername
 msgid "Enter layer name:"
 msgid "Enter layer name:"
@@ -3410,9 +3247,7 @@ msgstr "Mitchell"
 
 
 #: uresourcestrings.rsmorethanonefile
 #: uresourcestrings.rsmorethanonefile
 msgid "You are trying to open more than one file. How would you like these files to be opened?"
 msgid "You are trying to open more than one file. How would you like these files to be opened?"
-msgstr ""
-"U probeert meer dan een bestand te openen. Hoe wilt u dat deze bestanden "
-"worden geopend?"
+msgstr "U probeert meer dan een bestand te openen. Hoe wilt u dat deze bestanden worden geopend?"
 
 
 #: uresourcestrings.rsmovingorrotatingselection
 #: uresourcestrings.rsmovingorrotatingselection
 msgid "Moving or rotating selection"
 msgid "Moving or rotating selection"
@@ -3477,14 +3312,18 @@ msgstr "Er is niets om op te halen"
 
 
 #: uresourcestrings.rsnotreasonableformat
 #: uresourcestrings.rsnotreasonableformat
 msgid "It is not reasonable to save such a big image in this file format."
 msgid "It is not reasonable to save such a big image in this file format."
-msgstr ""
-"Het is onredelijk om zo'n grote afbeelding in dit bestandsformaat op te "
-"slaan."
+msgstr "Het is onredelijk om zo'n grote afbeelding in dit bestandsformaat op te slaan."
 
 
 #: uresourcestrings.rsnumber
 #: uresourcestrings.rsnumber
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "OK"
 msgstr "OK"
@@ -3551,6 +3390,12 @@ msgstr "Posterisatie laag met behulp palet"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Voorinstellingsnaam"
 msgstr "Voorinstellingsnaam"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Voorbeeld"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"
@@ -3710,14 +3555,11 @@ msgstr "Texture mapping"
 
 
 #: uresourcestrings.rstherearenocheckeditems
 #: uresourcestrings.rstherearenocheckeditems
 msgid "There are no checked items. Check some items or add some new ones."
 msgid "There are no checked items. Check some items or add some new ones."
-msgstr ""
-"Er zijn geen aangevinkte items. Controleer enkele items of voeg nieuwe toe."
+msgstr "Er zijn geen aangevinkte items. Controleer enkele items of voeg nieuwe toe."
 
 
 #: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
 #: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
 msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
 msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
-msgstr ""
-"Er is geen bestandsnaam gegeven voor dit bestand. Gebruik \"Opslaan als…\" in "
-"het hoofdmenu."
+msgstr "Er is geen bestandsnaam gegeven voor dit bestand. Gebruik \"Opslaan als…\" in het hoofdmenu."
 
 
 #: uresourcestrings.rstodo
 #: uresourcestrings.rstodo
 msgid "To do"
 msgid "To do"
@@ -3812,3 +3654,4 @@ msgstr "Inzoomen in lagenoverzicht"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgid "Zoom layer stack out"
 msgstr "Uitzoomen uit lagenoverzicht"
 msgstr "Uitzoomen uit lagenoverzicht"
+

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.pl.po

@@ -72,16 +72,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Otwarte źródło (GPLv3)"
 msgstr "Otwarte źródło (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Dostosuj krzywe kolorów"
 msgstr "Dostosuj krzywe kolorów"
@@ -255,16 +245,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Kolory"
 msgstr "Kolory"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -280,16 +260,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Zmień"
 msgstr "Zmień"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -314,11 +284,6 @@ msgstr "Odcień"
 msgid "Preset"
 msgid "Preset"
 msgstr "Zalecany"
 msgstr "Zalecany"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Edytuj maskę..."
 msgstr "Edytuj maskę..."
@@ -327,11 +292,6 @@ msgstr "Edytuj maskę..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Ładuj maskę..."
 msgstr "Ładuj maskę..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -341,16 +301,6 @@ msgstr "Rozmycie niestandardowe"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Otwórz plik w skali szarości"
 msgstr "Otwórz plik w skali szarości"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -369,16 +319,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Kierunek:"
 msgstr "Kierunek:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Zastosuj funkcję"
 msgstr "Zastosuj funkcję"
@@ -484,6 +424,14 @@ msgstr "Gradient krycia"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Liczba stron:"
 msgstr "Liczba stron:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Lista obrazów"
 msgstr "Lista obrazów"
@@ -1515,6 +1463,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Szum Perlina (cykliczny)"
 msgstr "Szum Perlina (cykliczny)"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmur"
 msgstr "Marmur"
@@ -2101,16 +2053,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Zmniejsz"
 msgstr "Zmniejsz"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2180,16 +2122,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Szerokość:"
 msgstr "Szerokość:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Filtr szumu"
 msgstr "Filtr szumu"
@@ -2327,16 +2259,6 @@ msgstr "Dodaj światło punktowe"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Usuń wybrane światło"
 msgstr "Usuń wybrane światło"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2406,16 +2328,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Bieżąca tekstura"
 msgstr "Bieżąca tekstura"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2431,16 +2343,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Metoda:"
 msgstr "Metoda:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2455,6 +2357,7 @@ msgid "Levels :"
 msgstr "Poziomy:"
 msgstr "Poziomy:"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Podgląd"
 msgstr "Podgląd"
 
 
@@ -2548,16 +2451,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2568,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Promień:"
 msgstr "Promień:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Deszcz"
 msgstr "Deszcz"
@@ -2696,16 +2579,6 @@ msgstr "32 bity"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "Nawigacja"
 msgstr "Nawigacja"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Wyostrz / Wygładź"
 msgstr "Wyostrz / Wygładź"
@@ -2715,16 +2588,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Siła:"
 msgstr "Siła:"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2750,16 +2613,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Narzędzia"
 msgstr "Narzędzia"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2775,16 +2628,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Promień:"
 msgstr "Promień:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Przesunięcie fali"
 msgstr "Przesunięcie fali"
@@ -3495,6 +3338,12 @@ msgstr "Nie zaleca się zapisywania tak dużego obrazu w tym formacie pliku."
 msgid "№"
 msgid "№"
 msgstr "Nr."
 msgstr "Nr."
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "OK"
 msgstr "OK"
@@ -3562,6 +3411,12 @@ msgstr "Posteryzuj warstwę za pomocą palety"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Wstępna nazwa"
 msgstr "Wstępna nazwa"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Podgląd"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 23 - 170
lazpaint/release/bin/i18n/lazpaint.pot

@@ -47,16 +47,6 @@ msgstr ""
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr ""
 msgstr ""
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr ""
 msgstr ""
@@ -220,16 +210,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr ""
 msgstr ""
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "tfcolorintensity.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "tfcolorintensity.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -243,16 +223,6 @@ msgstr ""
 msgid "Shift"
 msgid "Shift"
 msgstr ""
 msgstr ""
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "tfcolorize.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfcolorize.button_ok.caption
-msgctxt "tfcolorize.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgid "Colorize"
 msgid "Colorize"
 msgstr ""
 msgstr ""
@@ -275,11 +245,6 @@ msgstr ""
 msgid "Preset"
 msgid "Preset"
 msgstr ""
 msgstr ""
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "tfcustomblur.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr ""
 msgstr ""
@@ -288,11 +253,6 @@ msgstr ""
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr ""
 msgstr ""
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "tfcustomblur.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgid "Custom blur"
 msgid "Custom blur"
 msgstr ""
 msgstr ""
@@ -301,16 +261,6 @@ msgstr ""
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr ""
 msgstr ""
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "tfemboss.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfemboss.button_ok.caption
-msgctxt "tfemboss.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgid "Emboss"
 msgid "Emboss"
 msgstr ""
 msgstr ""
@@ -327,16 +277,6 @@ msgstr ""
 msgid "Direction :"
 msgid "Direction :"
 msgstr ""
 msgstr ""
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr ""
 msgstr ""
@@ -439,6 +379,14 @@ msgstr ""
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr ""
 msgstr ""
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr ""
 msgstr ""
@@ -1410,6 +1358,10 @@ msgstr ""
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr ""
 msgstr ""
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr ""
 msgstr ""
@@ -1940,16 +1892,6 @@ msgstr ""
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr ""
 msgstr ""
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "tfmotionblur.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfmotionblur.button_ok.caption
-msgctxt "tfmotionblur.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgid "Motion blur"
 msgid "Motion blur"
 msgstr ""
 msgstr ""
@@ -2017,16 +1959,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr ""
 msgstr ""
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr ""
 msgstr ""
@@ -2158,16 +2090,6 @@ msgstr ""
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr ""
 msgstr ""
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgid "Shaded map"
 msgid "Shaded map"
 msgstr ""
 msgstr ""
@@ -2235,16 +2157,6 @@ msgstr ""
 msgid "Current texture"
 msgid "Current texture"
 msgstr ""
 msgstr ""
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "tfpixelate.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfpixelate.button_ok.caption
-msgctxt "tfpixelate.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgid "Pixelate"
 msgid "Pixelate"
 msgstr ""
 msgstr ""
@@ -2258,16 +2170,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr ""
 msgstr ""
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2282,6 +2184,7 @@ msgid "Levels :"
 msgstr ""
 msgstr ""
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr ""
 msgstr ""
 
 
@@ -2375,16 +2278,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr ""
 msgstr ""
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "tfradialblur.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfradialblur.button_ok.caption
-msgctxt "tfradialblur.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2395,16 +2288,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr ""
 msgstr ""
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr ""
 msgstr ""
@@ -2522,16 +2405,6 @@ msgstr ""
 msgid "MioMap"
 msgid "MioMap"
 msgstr ""
 msgstr ""
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr ""
 msgstr ""
@@ -2540,16 +2413,6 @@ msgstr ""
 msgid "Amount :"
 msgid "Amount :"
 msgstr ""
 msgstr ""
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "tfshiftcolors.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "tfshiftcolors.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgid "Shift colors"
 msgid "Shift colors"
 msgstr ""
 msgstr ""
@@ -2574,16 +2437,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr ""
 msgstr ""
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "tftwirl.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tftwirl.button_ok.caption
-msgctxt "tftwirl.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgid "Twirl"
 msgid "Twirl"
 msgstr ""
 msgstr ""
@@ -2597,16 +2450,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr ""
 msgstr ""
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr ""
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr ""
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr ""
 msgstr ""
@@ -3302,6 +3145,11 @@ msgstr ""
 msgid "№"
 msgid "№"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsok
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr ""
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr ""
 msgstr ""
@@ -3368,6 +3216,11 @@ msgstr ""
 msgid "Preset name"
 msgid "Preset name"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr ""
 msgstr ""

+ 25 - 178
lazpaint/release/bin/i18n/lazpaint.pt_BR.po

@@ -64,16 +64,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Código aberto (GPLv3)"
 msgstr "Código aberto (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "TFADJUSTCURVES.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "TFADJUSTCURVES.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Ajustar curvas"
 msgstr "Ajustar curvas"
@@ -247,16 +237,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 msgid "Color"
 msgstr "Cor"
 msgstr "Cor"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 msgid "Shift"
 msgstr "Alterar"
 msgstr "Alterar"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "TFCOLORIZE.CAPTION"
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "Tonalidade"
 msgid "Preset"
 msgid "Preset"
 msgstr "Predefinida"
 msgstr "Predefinida"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Editar máscara..."
 msgstr "Editar máscara..."
@@ -319,11 +284,6 @@ msgstr "Editar máscara..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Abrir máscara..."
 msgstr "Abrir máscara..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "Desfoque personalizado"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Abrir arquivo em tons de cinza"
 msgstr "Abrir arquivo em tons de cinza"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "TFEMBOSS.CAPTION"
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Direção :"
 msgstr "Direção :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Aplicar função"
 msgstr "Aplicar função"
@@ -473,6 +413,14 @@ msgstr "Gradiente de opacidade"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Número de lados:"
 msgstr "Número de lados:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Lista de Imagens"
 msgstr "Lista de Imagens"
@@ -1502,6 +1450,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Ruído Perlin cíclica"
 msgstr "Ruído Perlin cíclica"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Mármore"
 msgstr "Mármore"
@@ -2088,17 +2040,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Zoom -"
 msgstr "Zoom -"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfmotionblur.button_ok.caption
-#, fuzzy
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2170,17 +2111,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 msgid "Width :"
 msgstr "Largura :"
 msgstr "Largura :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "TFNOISEFILTER.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfnoisefilter.button_ok.caption
-#, fuzzy
-msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Filtro de ruído"
 msgstr "Filtro de ruído"
@@ -2319,16 +2249,6 @@ msgstr "Adicione uma luz pontual"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Remover luz selecionada"
 msgstr "Remover luz selecionada"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "TFPHONGFILTER.CAPTION"
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2398,17 +2318,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Textura atual"
 msgstr "Textura atual"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfpixelate.button_ok.caption
-#, fuzzy
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "TFPIXELATE.CAPTION"
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2424,17 +2333,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Qualidade :"
 msgstr "Qualidade :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "TFPOSTERIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfposterize.button_ok.caption
-#, fuzzy
-msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "TFPOSTERIZE.CAPTION"
 msgctxt "TFPOSTERIZE.CAPTION"
 msgid "Posterize"
 msgid "Posterize"
@@ -2449,6 +2347,7 @@ msgid "Levels :"
 msgstr "Níveis :"
 msgstr "Níveis :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Prévia"
 msgstr "Prévia"
 
 
@@ -2542,16 +2441,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "TFRADIALBLUR.CAPTION"
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2562,17 +2451,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Raio :"
 msgstr "Raio :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfrain.button_ok.caption
-#, fuzzy
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Chuva"
 msgstr "Chuva"
@@ -2693,16 +2571,6 @@ msgstr "32 bits"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfsharpen.button_ok.caption
-msgctxt "TFSHARPEN.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Nitidez/Suave"
 msgstr "Nitidez/Suave"
@@ -2712,17 +2580,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Quantidade :"
 msgstr "Quantidade :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfshiftcolors.button_ok.caption
-#, fuzzy
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2748,17 +2605,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 msgid "Tools"
 msgstr "Ferramentas"
 msgstr "Ferramentas"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tftwirl.button_ok.caption
-#, fuzzy
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "TFTWIRL.CAPTION"
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
 msgid "Twirl"
@@ -2774,17 +2620,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Raio :"
 msgstr "Raio :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: tfwavedisplacement.button_ok.caption
-#, fuzzy
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Deslocamento de onda"
 msgstr "Deslocamento de onda"
@@ -3491,6 +3326,12 @@ msgstr "Não é razoável salvar uma imagem grande neste formato de arquivo."
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "OK"
 msgstr "OK"
@@ -3559,6 +3400,12 @@ msgstr "Posterizar camada usando paleta"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Nome predefinido"
 msgstr "Nome predefinido"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Prévia"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 26 - 170
lazpaint/release/bin/i18n/lazpaint.ru.po

@@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "С открытым исходным кодом (GPLv3)"
 msgstr "С открытым исходным кодом (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Регулировка кривых"
 msgstr "Регулировка кривых"
@@ -242,16 +232,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 msgid "Color"
 msgstr "Цвет"
 msgstr "Цвет"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -267,16 +247,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Сдвиг"
 msgstr "Сдвиг"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -301,11 +271,6 @@ msgstr "Оттенок"
 msgid "Preset"
 msgid "Preset"
 msgstr "Предустановка"
 msgstr "Предустановка"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Редактировать маску..."
 msgstr "Редактировать маску..."
@@ -314,11 +279,6 @@ msgstr "Редактировать маску..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Загрузить маску..."
 msgstr "Загрузить маску..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -328,16 +288,6 @@ msgstr "Пользовательское размытие"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Открыть файл в оттенках серого"
 msgstr "Открыть файл в оттенках серого"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -356,16 +306,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Направление:"
 msgstr "Направление:"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Применить функцию"
 msgstr "Применить функцию"
@@ -468,6 +408,14 @@ msgstr "Градиент непрозрачности"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Кол-во сторон:"
 msgstr "Кол-во сторон:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Список изображений"
 msgstr "Список изображений"
@@ -1493,6 +1441,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Циклический шум Перлина"
 msgstr "Циклический шум Перлина"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Мрамор"
 msgstr "Мрамор"
@@ -2076,16 +2028,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Уменьшить"
 msgstr "Уменьшить"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2155,16 +2097,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Ширина:"
 msgstr "Ширина:"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Фильтр шума"
 msgstr "Фильтр шума"
@@ -2302,16 +2234,6 @@ msgstr "Добавить точечный свет"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Удалить источник света"
 msgstr "Удалить источник света"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2381,16 +2303,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Текущ. текстура"
 msgstr "Текущ. текстура"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2406,16 +2318,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Качество:"
 msgstr "Качество:"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2430,6 +2332,7 @@ msgid "Levels :"
 msgstr "Уровни :"
 msgstr "Уровни :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Предварительный осмотр"
 msgstr "Предварительный осмотр"
 
 
@@ -2523,16 +2426,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2543,16 +2436,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Радиус:"
 msgstr "Радиус:"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Дождь"
 msgstr "Дождь"
@@ -2671,16 +2554,6 @@ msgstr "32-битный"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Резкость/Сглаженность"
 msgstr "Резкость/Сглаженность"
@@ -2690,16 +2563,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Эффект:"
 msgstr "Эффект:"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2725,16 +2588,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Инструменты"
 msgstr "Инструменты"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2750,16 +2603,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Радиус:"
 msgstr "Радиус:"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Отмена"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "ОК"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Смещение волны"
 msgstr "Смещение волны"
@@ -3463,6 +3306,12 @@ msgstr "Не стоит сохранять такое большое изобр
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "ОК"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "ОК"
 msgstr "ОК"
@@ -3529,6 +3378,12 @@ msgstr "Постеризовать слой используя палитру"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Предустановленное имя"
 msgstr "Предустановленное имя"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Предварительный осмотр"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"
@@ -3787,3 +3642,4 @@ msgstr "Увеличить размер стопки слоёв"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgid "Zoom layer stack out"
 msgstr "Увеличить размер стопки слоёв"
 msgstr "Увеличить размер стопки слоёв"
+

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.sv.po

@@ -54,16 +54,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "Öppen källkod (GPLv3)"
 msgstr "Öppen källkod (GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "Justera kurvor"
 msgstr "Justera kurvor"
@@ -237,16 +227,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "Färg"
 msgstr "Färg"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "Ändra"
 msgstr "Ändra"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Ton"
 msgid "Preset"
 msgid "Preset"
 msgstr "Förinställda val"
 msgstr "Förinställda val"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "Redigera mask..."
 msgstr "Redigera mask..."
@@ -309,11 +274,6 @@ msgstr "Redigera mask..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "Ladda mask..."
 msgstr "Ladda mask..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Egen oskärpa"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "Öppna gråskalefil"
 msgstr "Öppna gråskalefil"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "Riktning :"
 msgstr "Riktning :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "Tillämpa funktion"
 msgstr "Tillämpa funktion"
@@ -473,6 +413,14 @@ msgstr "Genomskinlig gradient"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "Antal sidor:"
 msgstr "Antal sidor:"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "Bildlista"
 msgstr "Bildlista"
@@ -1503,6 +1451,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "Cyklisk Perlinbrus"
 msgstr "Cyklisk Perlinbrus"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "Marmor"
 msgstr "Marmor"
@@ -2089,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "Zoom in"
 msgstr "Zoom in"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2168,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "Bredd :"
 msgstr "Bredd :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "Brusfilter:"
 msgstr "Brusfilter:"
@@ -2315,16 +2247,6 @@ msgstr "Lägg till en punktljuskälla"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "Ta bort vald ljuskälla"
 msgstr "Ta bort vald ljuskälla"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2394,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "Vald textur"
 msgstr "Vald textur"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2419,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "Kvalitet :"
 msgstr "Kvalitet :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2443,6 +2345,7 @@ msgid "Levels :"
 msgstr "Nivåer :"
 msgstr "Nivåer :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "Förhandsvisning"
 msgstr "Förhandsvisning"
 
 
@@ -2540,16 +2443,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2560,16 +2453,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Radie :"
 msgstr "Radie :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "Regn"
 msgstr "Regn"
@@ -2688,16 +2571,6 @@ msgstr "32 bit"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "Gör skarpare/Gör mjukare"
 msgstr "Gör skarpare/Gör mjukare"
@@ -2707,16 +2580,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "Mängd :"
 msgstr "Mängd :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2742,16 +2605,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "Verktyg"
 msgstr "Verktyg"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2767,16 +2620,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "Radie :"
 msgstr "Radie :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "Vågförskjutning"
 msgstr "Vågförskjutning"
@@ -3483,6 +3326,12 @@ msgstr "Det är inte rimligt att spara en så stor bild i det här filformatet."
 msgid "№"
 msgid "№"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "Okej"
 msgstr "Okej"
@@ -3550,6 +3399,12 @@ msgstr "Posterisera lager utifrån palett"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "Namn på förval"
 msgstr "Namn på förval"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Förhandsvisning"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 25 - 170
lazpaint/release/bin/i18n/lazpaint.zh_CN.po

@@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (GPLv3)"
 msgid "Open source (GPLv3)"
 msgstr "开源(GPLv3)"
 msgstr "开源(GPLv3)"
 
 
-#: tfadjustcurves.button_cancel.caption
-msgctxt "tfadjustcurves.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfadjustcurves.button_ok.caption
-msgctxt "tfadjustcurves.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfadjustcurves.caption
 #: tfadjustcurves.caption
 msgid "Adjust curves"
 msgid "Adjust curves"
 msgstr "调整曲线"
 msgstr "调整曲线"
@@ -247,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr "颜色"
 msgstr "颜色"
 
 
-#: tfcolorintensity.button_cancel.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfcolorintensity.button_ok.caption
-msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfcolorintensity.caption
 #: tfcolorintensity.caption
 msgctxt "tfcolorintensity.caption"
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 msgid "Shift"
 msgstr "位移"
 msgstr "位移"
 
 
-#: tfcolorize.button_cancel.caption
-msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfcolorize.button_ok.caption
-msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfcolorize.caption
 #: tfcolorize.caption
 msgctxt "tfcolorize.caption"
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "色调"
 msgid "Preset"
 msgid "Preset"
 msgstr "预设"
 msgstr "预设"
 
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
 #: tfcustomblur.button_editmask.caption
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgid "Edit mask..."
 msgstr "编辑蒙版..."
 msgstr "编辑蒙版..."
@@ -319,11 +284,6 @@ msgstr "编辑蒙版..."
 msgid "Load mask..."
 msgid "Load mask..."
 msgstr "加载蒙版..."
 msgstr "加载蒙版..."
 
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfcustomblur.caption
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "自定义模糊"
 msgid "Open grayscale file"
 msgid "Open grayscale file"
 msgstr "打开灰度文件"
 msgstr "打开灰度文件"
 
 
-#: tfemboss.button_cancel.caption
-msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfemboss.button_ok.caption
-msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfemboss.caption
 #: tfemboss.caption
 msgctxt "tfemboss.caption"
 msgctxt "tfemboss.caption"
 msgid "Emboss"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 msgid "Direction :"
 msgstr "方向 :"
 msgstr "方向 :"
 
 
-#: tffilterfunction.button_cancel.caption
-msgctxt "tffilterfunction.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tffilterfunction.button_ok.caption
-msgctxt "tffilterfunction.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tffilterfunction.caption
 #: tffilterfunction.caption
 msgid "Apply function"
 msgid "Apply function"
 msgstr "应用函数"
 msgstr "应用函数"
@@ -476,6 +416,14 @@ msgstr "透明度渐变"
 msgid "Number of sides:"
 msgid "Number of sides:"
 msgstr "边数 :"
 msgstr "边数 :"
 
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 #: tfimagelist.caption
 msgid "Image List"
 msgid "Image List"
 msgstr "图像列表"
 msgstr "图像列表"
@@ -1504,6 +1452,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr "环状佩林噪声"
 msgstr "环状佩林噪声"
 
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgid "Marble"
 msgstr "大理石"
 msgstr "大理石"
@@ -2089,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 msgid "Zoom out"
 msgstr "缩小"
 msgstr "缩小"
 
 
-#: tfmotionblur.button_cancel.caption
-msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfmotionblur.button_ok.caption
-msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfmotionblur.caption
 #: tfmotionblur.caption
 msgctxt "tfmotionblur.caption"
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
 msgid "Motion blur"
@@ -2168,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 msgid "Width :"
 msgstr "宽度 :"
 msgstr "宽度 :"
 
 
-#: tfnoisefilter.button_cancel.caption
-msgctxt "tfnoisefilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfnoisefilter.button_ok.caption
-msgctxt "tfnoisefilter.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfnoisefilter.caption
 #: tfnoisefilter.caption
 msgid "Noise filter"
 msgid "Noise filter"
 msgstr "噪声滤镜"
 msgstr "噪声滤镜"
@@ -2315,16 +2247,6 @@ msgstr "添加点光源"
 msgid "Remove selected light"
 msgid "Remove selected light"
 msgstr "删除所选光源"
 msgstr "删除所选光源"
 
 
-#: tfphongfilter.button_cancel.caption
-msgctxt "tfphongfilter.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfphongfilter.button_ok.caption
-msgctxt "tfphongfilter.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfphongfilter.caption
 #: tfphongfilter.caption
 msgctxt "tfphongfilter.caption"
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
 msgid "Shaded map"
@@ -2394,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 msgid "Current texture"
 msgstr "当前纹理"
 msgstr "当前纹理"
 
 
-#: tfpixelate.button_cancel.caption
-msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfpixelate.button_ok.caption
-msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfpixelate.caption
 #: tfpixelate.caption
 msgctxt "tfpixelate.caption"
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
 msgid "Pixelate"
@@ -2419,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 msgid "Quality :"
 msgstr "品质 :"
 msgstr "品质 :"
 
 
-#: tfposterize.button_cancel.caption
-msgctxt "tfposterize.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfposterize.button_ok.caption
-msgctxt "tfposterize.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfposterize.caption
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgctxt "tfposterize.caption"
 msgid "Posterize"
 msgid "Posterize"
@@ -2443,6 +2345,7 @@ msgid "Levels :"
 msgstr "级别 :"
 msgstr "级别 :"
 
 
 #: tfpreviewdialog.caption
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgid "Preview"
 msgstr "预览"
 msgstr "预览"
 
 
@@ -2536,16 +2439,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 msgid "."
 msgstr "."
 msgstr "."
 
 
-#: tfradialblur.button_cancel.caption
-msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfradialblur.button_ok.caption
-msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfradialblur.caption
 #: tfradialblur.caption
 msgctxt "tfradialblur.caption"
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
@@ -2556,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "半径 :"
 msgstr "半径 :"
 
 
-#: tfrain.button_cancel.caption
-msgctxt "tfrain.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfrain.button_ok.caption
-msgctxt "tfrain.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfrain.caption
 #: tfrain.caption
 msgid "Rain"
 msgid "Rain"
 msgstr "雨"
 msgstr "雨"
@@ -2684,16 +2567,6 @@ msgstr "32 位色"
 msgid "MioMap"
 msgid "MioMap"
 msgstr "MioMap"
 msgstr "MioMap"
 
 
-#: tfsharpen.button_cancel.caption
-msgctxt "tfsharpen.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfsharpen.button_ok.caption
-msgctxt "tfsharpen.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfsharpen.caption
 #: tfsharpen.caption
 msgid "Sharpen/Smooth"
 msgid "Sharpen/Smooth"
 msgstr "锐化/平滑"
 msgstr "锐化/平滑"
@@ -2703,16 +2576,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 msgid "Amount :"
 msgstr "数量 :"
 msgstr "数量 :"
 
 
-#: tfshiftcolors.button_cancel.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfshiftcolors.button_ok.caption
-msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfshiftcolors.caption
 #: tfshiftcolors.caption
 msgctxt "tfshiftcolors.caption"
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
 msgid "Shift colors"
@@ -2738,16 +2601,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr "工具"
 msgstr "工具"
 
 
-#: tftwirl.button_cancel.caption
-msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
-#: tftwirl.button_ok.caption
-msgctxt "TFTWIRL.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tftwirl.caption
 #: tftwirl.caption
 msgctxt "tftwirl.caption"
 msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
@@ -2763,16 +2616,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr "半径 :"
 msgstr "半径 :"
 
 
-#: tfwavedisplacement.button_cancel.caption
-msgctxt "tfwavedisplacement.button_cancel.caption"
-msgid "Cancel"
-msgstr "取消"
-
-#: tfwavedisplacement.button_ok.caption
-msgctxt "tfwavedisplacement.button_ok.caption"
-msgid "OK"
-msgstr "确定"
-
 #: tfwavedisplacement.caption
 #: tfwavedisplacement.caption
 msgid "Wave displacement"
 msgid "Wave displacement"
 msgstr "波形移位"
 msgstr "波形移位"
@@ -3496,6 +3339,12 @@ msgstr "此文件格式不适合保存如此大的图像。"
 msgid "№"
 msgid "№"
 msgstr "№"
 msgstr "№"
 
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "确定"
+
 #: uresourcestrings.rsokay
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgid "Okay"
 msgstr "好"
 msgstr "好"
@@ -3564,6 +3413,12 @@ msgstr "使用调色板对图层进行海报化"
 msgid "Preset name"
 msgid "Preset name"
 msgstr "预设名称"
 msgstr "预设名称"
 
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "预览"
+
 #: uresourcestrings.rspx
 #: uresourcestrings.rspx
 msgid "px"
 msgid "px"
 msgstr "px"
 msgstr "px"

+ 11 - 9
lazpaint/uchoosecolor.lfm

@@ -1,27 +1,29 @@
 object FChooseColor: TFChooseColor
 object FChooseColor: TFChooseColor
   Left = 417
   Left = 417
-  Height = 297
+  Height = 198
   Top = 234
   Top = 234
-  Width = 396
+  Width = 264
   BorderIcons = [biSystemMenu]
   BorderIcons = [biSystemMenu]
   BorderStyle = bsSizeToolWin
   BorderStyle = bsSizeToolWin
   Caption = 'Color'
   Caption = 'Color'
-  ClientHeight = 297
-  ClientWidth = 396
-  DesignTimePPI = 144
-  Font.Height = -18
+  ClientHeight = 198
+  ClientWidth = 264
+  Font.Height = -12
   FormStyle = fsStayOnTop
   FormStyle = fsStayOnTop
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDeactivate = FormDeactivate
   OnDeactivate = FormDeactivate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
+  OnKeyDown = FormKeyDown
+  OnKeyUp = FormKeyUp
   OnShow = FormShow
   OnShow = FormShow
+  OnUTF8KeyPress = FormUTF8KeyPress
   ShowInTaskBar = stNever
   ShowInTaskBar = stNever
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.6.0'
   object ChooseColorControl: TPanel
   object ChooseColorControl: TPanel
     Left = 0
     Left = 0
-    Height = 297
+    Height = 198
     Top = 0
     Top = 0
-    Width = 396
+    Width = 264
     Align = alClient
     Align = alClient
     BevelOuter = bvNone
     BevelOuter = bvNone
     TabOrder = 0
     TabOrder = 0

+ 28 - 1
lazpaint/uchoosecolor.pas

@@ -8,7 +8,7 @@ interface
 uses
 uses
   Classes, SysUtils, FileUtil, LResources, Forms, Controls, ExtCtrls,
   Classes, SysUtils, FileUtil, LResources, Forms, Controls, ExtCtrls,
   BGRABitmap, BGRABitmapTypes,
   BGRABitmap, BGRABitmapTypes,
-  LazPaintType, UChooseColorInterface;
+  LazPaintType, UChooseColorInterface, LCLType;
 
 
 type
 type
 
 
@@ -19,7 +19,10 @@ type
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDeactivate(Sender: TObject);
     procedure FormDeactivate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
+    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
     procedure FormShow(Sender: TObject);
     procedure FormShow(Sender: TObject);
+    procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
   private
   private
     function GetColorTarget: TColorTarget;
     function GetColorTarget: TColorTarget;
     function GetDarkTheme: boolean;
     function GetDarkTheme: boolean;
@@ -37,6 +40,7 @@ type
     function GetCurrentColor: TBGRAPixel;
     function GetCurrentColor: TBGRAPixel;
     procedure AdjustControlHeight;
     procedure AdjustControlHeight;
     procedure HideEditor;
     procedure HideEditor;
+    procedure SimpleRedraw;
     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
     property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
     property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
     property EditorVisible: boolean read GetEditorVisible;
     property EditorVisible: boolean read GetEditorVisible;
@@ -69,11 +73,29 @@ begin
   FreeAndNil(FInterface);
   FreeAndNil(FInterface);
 end;
 end;
 
 
+procedure TFChooseColor.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+begin
+  if not EditorVisible and Assigned(LazPaintInstance) then
+    LazPaintInstance.SendKeyDownEventToMainForm(Key, Shift);
+end;
+
+procedure TFChooseColor.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+begin
+  if not EditorVisible and Assigned(LazPaintInstance) then
+    LazPaintInstance.SendKeyUpEventToMainForm(Key, Shift);
+end;
+
 procedure TFChooseColor.FormShow(Sender: TObject);
 procedure TFChooseColor.FormShow(Sender: TObject);
 begin
 begin
   self.EnsureVisible(False);
   self.EnsureVisible(False);
 end;
 end;
 
 
+procedure TFChooseColor.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
+begin
+  if not EditorVisible and Assigned(LazPaintInstance) then
+    LazPaintInstance.SendUTF8KeyPressEventToMainForm(UTF8Key);
+end;
+
 procedure TFChooseColor.SetCurrentColor(value: TBGRAPixel);
 procedure TFChooseColor.SetCurrentColor(value: TBGRAPixel);
 begin
 begin
   if Assigned(FInterface) then
   if Assigned(FInterface) then
@@ -100,6 +122,11 @@ begin
     FInterface.HideEditor;
     FInterface.HideEditor;
 end;
 end;
 
 
+procedure TFChooseColor.SimpleRedraw;
+begin
+  if Assigned(FInterface) then FInterface.SimpleRedraw;
+end;
+
 procedure TFChooseColor.SetDarkTheme(AValue: boolean);
 procedure TFChooseColor.SetDarkTheme(AValue: boolean);
 begin
 begin
   if Assigned(FInterface) then
   if Assigned(FInterface) then

+ 27 - 0
lazpaint/uconfig.pas

@@ -269,6 +269,10 @@ type
     function DefaultTransformSelectionAnswer: TModalResult;
     function DefaultTransformSelectionAnswer: TModalResult;
     procedure SetDefaultTransformSelectionAnswer(value: TModalResult);
     procedure SetDefaultTransformSelectionAnswer(value: TModalResult);
 
 
+    //palette
+    function DefaultColorsBoundToKeys: string;
+    procedure SetDefaultColorsBoundToKeys(value: string);
+
     //radial blur config
     //radial blur config
     function DefaultBlurRadius: single;
     function DefaultBlurRadius: single;
     procedure SetDefaultBlurRadius(value: single);
     procedure SetDefaultBlurRadius(value: single);
@@ -301,6 +305,9 @@ type
     function DefaultRainQuantity: double;
     function DefaultRainQuantity: double;
     procedure SetDefaultRainQuantity(value: double);
     procedure SetDefaultRainQuantity(value: double);
 
 
+    function DefaultCuspCount: integer;
+    procedure SetDefaultCuspCount(value: integer);
+
     //twirl config
     //twirl config
     function DefaultTwirlRadius: double;
     function DefaultTwirlRadius: double;
     procedure SetDefaultTwirlRadius(value: double);
     procedure SetDefaultTwirlRadius(value: double);
@@ -1161,6 +1168,16 @@ begin
   iniOptions.WriteInteger('Tool','TransformSelectionAnswer', value);
   iniOptions.WriteInteger('Tool','TransformSelectionAnswer', value);
 end;
 end;
 
 
+function TLazPaintConfig.DefaultColorsBoundToKeys: string;
+begin
+  result := iniOptions.ReadString('Palette','ColorsBoundToKeys','');
+end;
+
+procedure TLazPaintConfig.SetDefaultColorsBoundToKeys(value: string);
+begin
+   iniOptions.WriteString('Palette','ColorsBoundToKeys',value);
+end;
+
 function TLazPaintConfig.DefaultBlurRadius: single;
 function TLazPaintConfig.DefaultBlurRadius: single;
 begin
 begin
   result := iniOptions.ReadFloat('Filter','BlurRadius',5);
   result := iniOptions.ReadFloat('Filter','BlurRadius',5);
@@ -1271,6 +1288,16 @@ begin
   iniOptions.WriteFloat('Filter','RainQuantity',value);
   iniOptions.WriteFloat('Filter','RainQuantity',value);
 end;
 end;
 
 
+function TLazPaintConfig.DefaultCuspCount: integer;
+begin
+  result := iniOptions.ReadInteger('Filter','CuspCount',6);
+end;
+
+procedure TLazPaintConfig.SetDefaultCuspCount(value: integer);
+begin
+  iniOptions.WriteInteger('Filter','CuspCount',value);
+end;
+
 function TLazPaintConfig.DefaultTwirlRadius: double;
 function TLazPaintConfig.DefaultTwirlRadius: double;
 begin
 begin
   result := iniOptions.ReadFloat('Filter','TwirlRadius',100);
   result := iniOptions.ReadFloat('Filter','TwirlRadius',100);

+ 3 - 0
lazpaint/ufilters.pas

@@ -126,6 +126,9 @@ begin
     if AInstance.Image.SelectionLayerIsEmpty then
     if AInstance.Image.SelectionLayerIsEmpty then
       applyOfsBefore := true;
       applyOfsBefore := true;
 
 
+  if filter = pfHypocycloid then
+    exit(AInstance.ShowHypocycloidDlg(AInstance, AParameters));
+
   try
   try
     FilterConnector := TFilterConnector.Create(AInstance, AParameters, applyOfsBefore);
     FilterConnector := TFilterConnector.Create(AInstance, AParameters, applyOfsBefore);
     layer := FilterConnector.ActiveLayer;
     layer := FilterConnector.ActiveLayer;

+ 1 - 1
lazpaint/uimageview.pas

@@ -9,7 +9,7 @@ unit UImageView;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, USelectionHighlight, BGRABitmap, Types, BGRABitmapTypes,
+  Classes, SysUtils, USelectionHighlight, Types, BGRABitmap, BGRABitmapTypes,
   LazPaintType, UImage, UZoom, Graphics, Controls, LCLType, UImageObservation,
   LazPaintType, UImage, UZoom, Graphics, Controls, LCLType, UImageObservation,
   laztablet, LMessages;
   laztablet, LMessages;
 
 

+ 11 - 4
lazpaint/umainformlayout.pas

@@ -126,6 +126,7 @@ type
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property ToolboxPopup: TPopupMenu read GetPopupToolbox write SetPopupToolbox;
     property ToolboxPopup: TPopupMenu read GetPopupToolbox write SetPopupToolbox;
     property PaletteVisible: boolean read GetPaletteVisible write SetPaletteVisible;
     property PaletteVisible: boolean read GetPaletteVisible write SetPaletteVisible;
+    property PaletteToolbar: TPaletteToolbar read FPaletteToolbar;
     property StatusBarVisible: boolean read GetStatusBarVisible write SetStatusBarVisible;
     property StatusBarVisible: boolean read GetStatusBarVisible write SetStatusBarVisible;
     property StatusText: string read GetStatusText write SetStatusText;
     property StatusText: string read GetStatusText write SetStatusText;
     property DefaultToolboxDocking: TToolWindowDocking read GetDefaultToolboxDocking;
     property DefaultToolboxDocking: TToolWindowDocking read GetDefaultToolboxDocking;
@@ -260,15 +261,21 @@ end;
 function TMainFormLayout.CatchToolKeyDown(var AKey: Word): boolean;
 function TMainFormLayout.CatchToolKeyDown(var AKey: Word): boolean;
 begin
 begin
   if Assigned(FImageView) then
   if Assigned(FImageView) then
-    result := FImageView.CatchToolKeyDown(AKey)
-    else result := false;
+  begin
+    result := FImageView.CatchToolKeyDown(AKey);
+    if not result and Assigned(FPaletteToolbar) then
+      result := FPaletteToolbar.CatchToolKeyDown(AKey);
+  end  else result := false;
 end;
 end;
 
 
 function TMainFormLayout.CatchToolKeyUp(var AKey: Word): boolean;
 function TMainFormLayout.CatchToolKeyUp(var AKey: Word): boolean;
 begin
 begin
   if Assigned(FImageView) then
   if Assigned(FImageView) then
-    result := FImageView.CatchToolKeyUp(AKey)
-    else result := false;
+  begin
+    result := FImageView.CatchToolKeyUp(AKey);
+    if not result and Assigned(FPaletteToolbar) then
+      result := FPaletteToolbar.CatchToolKeyUp(AKey);
+  end  else result := false;
 end;
 end;
 
 
 function TMainFormLayout.CatchToolKeyPress(var AKey: TUTF8Char): boolean;
 function TMainFormLayout.CatchToolKeyPress(var AKey: TUTF8Char): boolean;

+ 2 - 2
lazpaint/umenu.pas

@@ -305,7 +305,7 @@ begin
     items.Sorted := true;
     items.Sorted := true;
     try
     try
       repeat
       repeat
-        fullname := path+PathDelim+searchRec.Name;
+        fullname := ConcatPaths([path, searchRec.Name]);
         if FileExistsUTF8(fullname) then
         if FileExistsUTF8(fullname) then
         begin
         begin
           title := GetScriptTitle(fullname);
           title := GetScriptTitle(fullname);
@@ -484,7 +484,7 @@ begin
   AddMenus('MenuRadialBlur',  'FilterBlurBox,FilterBlurFast,FilterBlurRadial,FilterBlurCorona,FilterBlurDisk');
   AddMenus('MenuRadialBlur',  'FilterBlurBox,FilterBlurFast,FilterBlurRadial,FilterBlurCorona,FilterBlurDisk');
   AddMenus('MenuColors', 'ColorCurves,ColorPosterize,ColorColorize,ColorShiftColors,FilterComplementaryColor,ColorIntensity,-,ColorLightness,FilterNegative,FilterLinearNegative,FilterNormalize,FilterGrayscale');
   AddMenus('MenuColors', 'ColorCurves,ColorPosterize,ColorColorize,ColorShiftColors,FilterComplementaryColor,ColorIntensity,-,ColorLightness,FilterNegative,FilterLinearNegative,FilterNormalize,FilterGrayscale');
   AddMenus('MenuTool',   'ToolHand,ToolHotSpot,ToolColorPicker,-,ToolPen,ToolBrush,ToolEraser,ToolFloodFill,ToolClone,-,ToolEditShape,ToolRect,ToolEllipse,ToolPolyline,ToolOpenedCurve,ToolPolygon,ToolSpline,ToolGradient,ToolPhong,ToolText,-,ToolDeformation,ToolTextureMapping');
   AddMenus('MenuTool',   'ToolHand,ToolHotSpot,ToolColorPicker,-,ToolPen,ToolBrush,ToolEraser,ToolFloodFill,ToolClone,-,ToolEditShape,ToolRect,ToolEllipse,ToolPolyline,ToolOpenedCurve,ToolPolygon,ToolSpline,ToolGradient,ToolPhong,ToolText,-,ToolDeformation,ToolTextureMapping');
-  AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain');
+  AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain,RenderHypocycloid');
   AddMenus('MenuScript', 'FileRunScript,-,InstalledScripts');
   AddMenus('MenuScript', 'FileRunScript,-,InstalledScripts');
   AddMenus('MenuHelp',   'HelpIndex,-,HelpAbout');
   AddMenus('MenuHelp',   'HelpIndex,-,HelpAbout');
   for i := 0 to high(FMainMenus) do
   for i := 0 to high(FMainMenus) do

+ 214 - 45
lazpaint/upalettetoolbar.pas

@@ -10,11 +10,20 @@ uses
   BGRAVirtualScreen, BGRABitmap,
   BGRAVirtualScreen, BGRABitmap,
   LazPaintType, UVolatileScrollBar,
   LazPaintType, UVolatileScrollBar,
   BGRAPalette, BCButton, Menus,
   BGRAPalette, BCButton, Menus,
-  Dialogs, BGRABitmapTypes;
+  Dialogs, BGRABitmapTypes, fgl;
 
 
 type
 type
   TPaletteVisibilityChangedByUserHandler = procedure(Sender:TObject) of object;
   TPaletteVisibilityChangedByUserHandler = procedure(Sender:TObject) of object;
 
 
+  { TBGRAPixelBinding }
+
+  TBGRAPixelBinding = class(specialize TFPGMap<integer, TBGRAPixel>)
+  private const FKeyPrefix = 'VK_';
+  public
+    function SaveContentToString: string;
+    procedure LoadContentFromString(const aContent: string; FTransparentPalette: boolean);
+  end;
+
   { TPaletteToolbar }
   { TPaletteToolbar }
 
 
   TPaletteToolbar = class
   TPaletteToolbar = class
@@ -70,6 +79,7 @@ type
     procedure SetVisible(AValue: boolean);
     procedure SetVisible(AValue: boolean);
     procedure TryLoadPaletteFrom(AFilename: string);
     procedure TryLoadPaletteFrom(AFilename: string);
     procedure TrySavePaletteTo(AFilename: string);
     procedure TrySavePaletteTo(AFilename: string);
+    procedure DoPickColor(Shift: TShiftState; AColor: TBGRAPixel);
   protected
   protected
     procedure PickColor(Shift: TShiftState; X, Y: Integer);
     procedure PickColor(Shift: TShiftState; X, Y: Integer);
     procedure PaletteChanged;
     procedure PaletteChanged;
@@ -85,6 +95,11 @@ type
     procedure ApplyTheme;
     procedure ApplyTheme;
     procedure ComputeMenuButtonGlyph;
     procedure ComputeMenuButtonGlyph;
     property PanelPalette: TBGRAVirtualScreen read GetPanelPalette;
     property PanelPalette: TBGRAVirtualScreen read GetPanelPalette;
+  private
+    FColorsBindToKey: TBGRAPixelBinding;
+    FSnapPressed, FAltPressed: boolean;
+    procedure ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integer);
+    function TryToGetColorBoundToKey(aDigit: integer; out aColor: TBGRAPixel): boolean;
   public
   public
     constructor Create;
     constructor Create;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -92,6 +107,9 @@ type
     procedure AddColor(AColor: TBGRAPixel);
     procedure AddColor(AColor: TBGRAPixel);
     procedure RemoveColor(AColor: TBGRAPixel);
     procedure RemoveColor(AColor: TBGRAPixel);
     procedure SetBounds(ALeft,ATop,AWidth,AHeight: integer);
     procedure SetBounds(ALeft,ATop,AWidth,AHeight: integer);
+    function CatchToolKeyDown(var AKey: Word): boolean;
+    function CatchToolKeyUp(var AKey: Word): boolean;
+    function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string;
     property Container: TWinControl read FContainer write SetContainer;
     property Container: TWinControl read FContainer write SetContainer;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property Visible: boolean read FVisible write SetVisible;
     property Visible: boolean read FVisible write SetVisible;
@@ -106,7 +124,51 @@ implementation
 uses LCScaleDPI, Graphics, Forms, UGraph,
 uses LCScaleDPI, Graphics, Forms, UGraph,
   UResourceStrings, BGRAColorQuantization,
   UResourceStrings, BGRAColorQuantization,
   ULayerAction, UCursors, UFileSystem,
   ULayerAction, UCursors, UFileSystem,
-  udarktheme, UTool, LCVectorialFill;
+  udarktheme, UScripting, UScriptType, UTool, LCVectorialFill, math,
+  LCLType;
+
+{ TBGRAPixelBinding }
+
+function TBGRAPixelBinding.SaveContentToString: string;
+var vars: TVariableSet;
+  i: integer;
+begin
+  Result := '';
+  vars := TVariableSet.Create('');
+  for i:=0 to Count-1 do
+    vars.Pixels[FKeyPrefix+Keys[i].ToString] := Data[i];
+  result := vars.VariablesAsString;
+  vars.Free;
+end;
+
+procedure TBGRAPixelBinding.LoadContentFromString(const aContent: string; FTransparentPalette: boolean);
+var vars: TVariableSet;
+  varName, strDigit: string;
+  i, digit: Integer;
+  v: TScriptVariableReference;
+begin
+  if aContent = '' then exit;
+  vars := TVariableSet.Create('');
+  try
+    if vars.LoadFromVariablesAsString(aContent) = [] then
+    begin
+      Clear;
+      for i:=0 to vars.Count-1 do
+      begin
+        varName := vars.VariableName[i];
+        v := vars.GetVariable(varName);
+        if varName.StartsWith(FKeyPrefix) and (Length(varName) > Length(FKeyPrefix)) and (v.variableType = svtPixel) then
+        begin
+          strDigit := Copy(varName, Length(FKeyPrefix)+1, Length(varName)-Length(FKeyPrefix));
+          if TryStrToInt(strDigit, digit) and (digit in [0..9]) then
+            AddOrSetData(digit, vars.Pixels[varName]);
+        end;
+      end;
+    end;
+  finally
+    vars.Free;
+  end;
+end;
 
 
 { TPaletteToolbar }
 { TPaletteToolbar }
 
 
@@ -311,6 +373,89 @@ begin
   glyphBmp.Free;
   glyphBmp.Free;
 end;
 end;
 
 
+procedure TPaletteToolbar.ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integer);
+var c: TBGRAPixel;
+  procedure RemoveBinding;
+  var idx: integer;
+  begin
+    idx := FColorsBindToKey.IndexOf(aDigit);
+    if idx <> -1 then FColorsBindToKey.Delete(idx);
+    idx := FColorsBindToKey.IndexOfData(aColor);
+    if idx <> -1 then FColorsBindToKey.Delete(idx);
+  end;
+begin
+  if not FTransparentPalette then aColor.alpha := 255;
+
+  if FColorsBindToKey.TryGetData(aDigit, c) then
+  begin
+    RemoveBinding;
+    if aColor <> c then FColorsBindToKey.Add(aDigit, aColor);
+  end else
+  begin
+    RemoveBinding;
+    FColorsBindToKey.Add(aDigit, aColor);
+  end;
+
+  LazPaintInstance.Config.SetDefaultColorsBoundToKeys(FColorsBindToKey.SaveContentToString);
+end;
+
+function TPaletteToolbar.TryToGetColorBoundToKey(aDigit: integer; out aColor: TBGRAPixel): boolean;
+begin
+  Result := FColorsBindToKey.TryGetData(aDigit, aColor);
+end;
+
+function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean;
+var digit: integer;
+  c: TBGRAPixel;
+begin
+  if AKey = VK_MENU then FAltPressed := True
+  else if (AKey = VK_SNAP) or (AKey = VK_SNAP2) then FSnapPressed := True;
+
+  digit := -1;
+  if AKey in [VK_0..VK_9] then digit := AKey - VK_0
+  else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then digit := AKey - VK_NUMPAD0;
+
+  if digit <> -1 then
+  begin
+    if FSnapPressed then
+    begin
+      c := FLazPaintInstance.GetColor(FLazPaintInstance.ChooseColorTarget);
+      ToggleBindColorToKey(c, digit);
+      PaletteChanged;
+      FLazPaintInstance.NotifyColorBinding;
+    end else
+    begin
+      if TryToGetColorBoundToKey(digit, c) then
+      begin
+        if FAltPressed then DoPickColor([ssRight], c)
+        else DoPickColor([ssLeft], c);
+      end;
+    end;
+    Result := True;
+    AKey := 0; // prevent further key event
+  end else Result := False;
+end;
+
+function TPaletteToolbar.CatchToolKeyUp(var AKey: Word): boolean;
+begin
+  if AKey = VK_MENU then FAltPressed := False
+  else if (AKey = VK_SNAP) or (AKey = VK_SNAP2) then FSnapPressed := False;
+  Result := False;
+end;
+
+function TPaletteToolbar.GetKeyAssociatedToColor(const AColor: TBGRAPixel): string;
+var idx: Integer;
+  c: TBGRAPixel;
+begin
+  c := AColor;
+  if not FTransparentPalette and (c.alpha <> 0) then c.alpha := 255;
+  idx := FColorsBindToKey.IndexOfData(c);
+  if idx <> -1 then
+    Result := FColorsBindToKey.Keys[idx].ToString
+  else
+    Result := '';
+end;
+
 procedure TPaletteToolbar.DoClearPalette(Sender: TObject);
 procedure TPaletteToolbar.DoClearPalette(Sender: TObject);
 begin
 begin
   FColors.Clear;
   FColors.Clear;
@@ -573,6 +718,7 @@ begin
     FVisible := FLazPaintInstance.Config.DefaultPaletteToolbarVisible;
     FVisible := FLazPaintInstance.Config.DefaultPaletteToolbarVisible;
     PanelPalette.Visible := FVisible;
     PanelPalette.Visible := FVisible;
     FillPaletteWithDefault;
     FillPaletteWithDefault;
+    FColorsBindToKey.LoadContentFromString(FLazPaintInstance.Config.DefaultColorsBoundToKeys, FTransparentPalette);
   end else
   end else
   begin
   begin
     FColors.Clear;
     FColors.Clear;
@@ -641,10 +787,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer);
-var idx: integer;
-  c : TBGRAPixel;
-
+procedure TPaletteToolbar.DoPickColor(Shift: TShiftState; AColor: TBGRAPixel);
   procedure NeedGradient(AFill: TVectorialFill);
   procedure NeedGradient(AFill: TVectorialFill);
   begin
   begin
     if AFill = LazPaintInstance.ToolManager.ForeFill then
     if AFill = LazPaintInstance.ToolManager.ForeFill then
@@ -659,8 +802,8 @@ var idx: integer;
   begin
   begin
     NeedGradient(AFill);
     NeedGradient(AFill);
     if not (AFill.FillType = vftGradient) then exit;
     if not (AFill.FillType = vftGradient) then exit;
-    if not FTransparentPalette then c.alpha := AFill.Gradient.StartColor.alpha;
-    AFill.Gradient.StartColor := c;
+    if not FTransparentPalette then AColor.alpha := AFill.Gradient.StartColor.alpha;
+    AFill.Gradient.StartColor := AColor;
     if AFill = LazPaintInstance.ToolManager.ForeFill then
     if AFill = LazPaintInstance.ToolManager.ForeFill then
       LazPaintInstance.ChooseColorTarget := ctForeColorStartGrad else
       LazPaintInstance.ChooseColorTarget := ctForeColorStartGrad else
     if AFill = LazPaintInstance.ToolManager.BackFill then
     if AFill = LazPaintInstance.ToolManager.BackFill then
@@ -673,8 +816,8 @@ var idx: integer;
   begin
   begin
     NeedGradient(AFill);
     NeedGradient(AFill);
     if not (AFill.FillType = vftGradient) then exit;
     if not (AFill.FillType = vftGradient) then exit;
-    if not FTransparentPalette then c.alpha := AFill.Gradient.EndColor.alpha;
-    AFill.Gradient.EndColor := c;
+    if not FTransparentPalette then AColor.alpha := AFill.Gradient.EndColor.alpha;
+    AFill.Gradient.EndColor := AColor;
     if AFill = LazPaintInstance.ToolManager.ForeFill then
     if AFill = LazPaintInstance.ToolManager.ForeFill then
       LazPaintInstance.ChooseColorTarget := ctForeColorEndGrad else
       LazPaintInstance.ChooseColorTarget := ctForeColorEndGrad else
     if AFill = LazPaintInstance.ToolManager.BackFill then
     if AFill = LazPaintInstance.ToolManager.BackFill then
@@ -692,44 +835,50 @@ var idx: integer;
         result := LazPaintInstance.ToolManager.ForeFill;
         result := LazPaintInstance.ToolManager.ForeFill;
     end;
     end;
   end;
   end;
+begin
+  if (ssLeft in Shift) and not (ssRight in Shift) then
+  begin
+    if ssSnap in Shift then
+      ChangeStartColor(GetSelectedFill)
+    else
+    begin
+      if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.ForeColor.alpha;
+      LazPaintInstance.ToolManager.ForeColor := AColor;
+      LazPaintInstance.ChooseColorTarget:= ctForeColorSolid;
+    end;
+  end else
+  if not (ssLeft in Shift) and (ssRight in Shift) then
+  begin
+    if ssSnap in Shift then
+      ChangeEndColor(GetSelectedFill)
+    else
+    begin
+      if LazPaintInstance.ToolManager.GetCurrentToolType = ptText then
+      begin
+        if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.OutlineColor.alpha;
+        LazPaintInstance.ToolManager.OutlineColor := AColor;
+        LazPaintInstance.ChooseColorTarget:= ctOutlineColorSolid;
+      end else
+      begin
+        if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.BackColor.alpha;
+        LazPaintInstance.ToolManager.BackColor := AColor;
+        LazPaintInstance.ChooseColorTarget:= ctBackColorSolid;
+      end;
+    end;
+  end else
+    exit;
+end;
 
 
+procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer);
+var idx: integer;
+  c : TBGRAPixel;
 begin
 begin
   if PtInRect(Point(X,Y),FPaletteColorRect) then
   if PtInRect(Point(X,Y),FPaletteColorRect) then
   begin
   begin
     idx := (Y-FPaletteColorRect.Top) div FPaletteColorItemHeight + FScrollPos;
     idx := (Y-FPaletteColorRect.Top) div FPaletteColorItemHeight + FScrollPos;
     if (idx < 0) or (idx >= FColors.Count) then exit;
     if (idx < 0) or (idx >= FColors.Count) then exit;
     c := FColors.Color[idx];
     c := FColors.Color[idx];
-    if (ssLeft in Shift) and not (ssRight in Shift) then
-    begin
-      if ssSnap in Shift then
-        ChangeStartColor(GetSelectedFill)
-      else
-      begin
-        if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.ForeColor.alpha;
-        LazPaintInstance.ToolManager.ForeColor := c;
-        LazPaintInstance.ChooseColorTarget:= ctForeColorSolid;
-      end;
-    end else
-    if not (ssLeft in Shift) and (ssRight in Shift) then
-    begin
-      if ssSnap in Shift then
-        ChangeEndColor(GetSelectedFill)
-      else
-      begin
-        if LazPaintInstance.ToolManager.GetCurrentToolType = ptText then
-        begin
-          if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.OutlineColor.alpha;
-          LazPaintInstance.ToolManager.OutlineColor := c;
-          LazPaintInstance.ChooseColorTarget:= ctOutlineColorSolid;
-        end else
-        begin
-          if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.BackColor.alpha;
-          LazPaintInstance.ToolManager.BackColor := c;
-          LazPaintInstance.ChooseColorTarget:= ctBackColorSolid;
-        end;
-      end;
-    end else
-      exit;
+    DoPickColor(Shift, c);
   end;
   end;
 end;
 end;
 
 
@@ -742,8 +891,9 @@ end;
 procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap);
 procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap);
 var i,x,y,w,aw,a,h: integer;
 var i,x,y,w,aw,a,h: integer;
   c: TBGRAPixel;
   c: TBGRAPixel;
-  nbVisible, maxScroll, availHeight: integer;
+  nbVisible, maxScroll, availHeight, minItemHeight, maxItemHeight: integer;
   clInterm, cSign: TBGRAPixel;
   clInterm, cSign: TBGRAPixel;
+  strKey: string;
 begin
 begin
   FCanvasScale := (Sender as TControl).GetCanvasScaleFactor;
   FCanvasScale := (Sender as TControl).GetCanvasScaleFactor;
   TVolatileScrollBar.InitDPI(FCanvasScale);
   TVolatileScrollBar.InitDPI(FCanvasScale);
@@ -763,6 +913,10 @@ begin
   h := DoScaleY(round(FPaletteItemHeight*FCanvasScale), OriginalDPI);
   h := DoScaleY(round(FPaletteItemHeight*FCanvasScale), OriginalDPI);
   if h < 3 then h := 3;
   if h < 3 then h := 3;
   availHeight := Bitmap.Height - 2 - y - 1;
   availHeight := Bitmap.Height - 2 - y - 1;
+  minItemHeight:= h-1;
+  maxItemHeight := availHeight div max(FColors.Count, 1);
+  FPaletteColorItemHeight := max(min(maxItemHeight, minItemHeight*2), minItemHeight);
+
   nbVisible := availHeight div (h-1);
   nbVisible := availHeight div (h-1);
   if nbVisible < 1 then nbVisible:= 1;
   if nbVisible < 1 then nbVisible:= 1;
   maxScroll := FColors.Count-nbVisible;
   maxScroll := FColors.Count-nbVisible;
@@ -779,8 +933,10 @@ begin
   if not Assigned(FScrollbar) then
   if not Assigned(FScrollbar) then
     w := Bitmap.Width-2-x;
     w := Bitmap.Width-2-x;
   FPaletteColorRect := rect(x,y,x+w,y);
   FPaletteColorRect := rect(x,y,x+w,y);
-  FPaletteColorItemHeight := h-1;
+  h := FPaletteColorItemHeight+1;
   nbVisible := (availHeight+h-2) div (h-1);
   nbVisible := (availHeight+h-2) div (h-1);
+  Bitmap.FontFullHeight := Round(h*2/3);
+  Bitmap.FontAntialias := True;
   for i := FScrollPos to FScrollPos+nbVisible-1 do
   for i := FScrollPos to FScrollPos+nbVisible-1 do
   if (i >= 0) and (i < FColors.Count) then
   if (i >= 0) and (i < FColors.Count) then
   begin
   begin
@@ -800,15 +956,25 @@ begin
     begin
     begin
       Bitmap.Rectangle(x,y,x+w,y+h,clInterm,c,dmSet);
       Bitmap.Rectangle(x,y,x+w,y+h,clInterm,c,dmSet);
     end;
     end;
+    if (GetLightness(c)/65535 > 0.5) or (FColors.Color[i].alpha = 0) then
+      cSign := BGRABlack else cSign := BGRAWhite;
     if FColors.Color[i] = FLastAddedColor then
     if FColors.Color[i] = FLastAddedColor then
     begin
     begin
-      if GetLightness(c)/65535 > 0.5 then
-        cSign := BGRABlack else cSign := BGRAWhite;
       Bitmap.DrawPolyLineAntialias(
       Bitmap.DrawPolyLineAntialias(
         Bitmap.ComputeOpenedSpline([PointF(x+(w-aw)*1 div 5, y+h div 4), PointF(x+(w-aw)*2 div 5, y+h*5 div 6),
         Bitmap.ComputeOpenedSpline([PointF(x+(w-aw)*1 div 5, y+h div 4), PointF(x+(w-aw)*2 div 5, y+h*5 div 6),
             PointF(x+(w-aw)*3 div 5, y+h div 4), PointF(x+(w-aw)*4 div 5, y+h div 5)], ssEasyBezier),
             PointF(x+(w-aw)*3 div 5, y+h div 4), PointF(x+(w-aw)*4 div 5, y+h div 5)], ssEasyBezier),
             cSign, DoScaleX(15, OriginalDPI)/10);
             cSign, DoScaleX(15, OriginalDPI)/10);
     end;
     end;
+    strKey := GetKeyAssociatedToColor(FColors.Color[i]);
+    if strKey <> '' then
+    begin
+      if FTransparentPalette then
+        Bitmap.TextOut(x+w-aw-Bitmap.TextSize(strKey).cx-DoScaleX(2, OriginalDPI),
+                       y+h-Bitmap.TextSize(strKey).cy, strKey, cSign, taLeftJustify)
+      else
+        Bitmap.TextOut(x+w-Bitmap.TextSize(strKey).cx-DoScaleX(2, OriginalDPI),
+                       y+h-Bitmap.TextSize(strKey).cy, strKey, cSign, taLeftJustify);
+    end;
     y += h-1;
     y += h-1;
   end;
   end;
   FPaletteColorRect.Bottom := y;
   FPaletteColorRect.Bottom := y;
@@ -850,6 +1016,8 @@ constructor TPaletteToolbar.Create;
 begin
 begin
   FPanelPalette := nil;
   FPanelPalette := nil;
   FLastAddedColor := BGRAPixelTransparent;
   FLastAddedColor := BGRAPixelTransparent;
+  FColorsBindToKey := TBGRAPixelBinding.Create;
+  FColorsBindToKey.Duplicates := dupError;
 end;
 end;
 
 
 destructor TPaletteToolbar.Destroy;
 destructor TPaletteToolbar.Destroy;
@@ -858,6 +1026,7 @@ begin
   FreeAndNil(FScrollbar);
   FreeAndNil(FScrollbar);
   FreeAndNil(FPanelPalette);
   FreeAndNil(FPanelPalette);
   FreeAndNil(FColors);
   FreeAndNil(FColors);
+  FreeAndNil(FColorsBindToKey);
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 

+ 6 - 4
lazpaint/uprocessauto.pas

@@ -24,11 +24,11 @@ type
 var
 var
   AutomationEnvironment: TStringList;
   AutomationEnvironment: TStringList;
 
 
-procedure RunProcessAutomation(AExecutable: string; AParameters: array of string;
+function RunProcessAutomation(AExecutable: string; AParameters: array of string;
   out ASendLine: TSendLineMethod;
   out ASendLine: TSendLineMethod;
   AOnReceiveOutput: TReceiveLineEvent;
   AOnReceiveOutput: TReceiveLineEvent;
   AOnReceiveError: TReceiveLineEvent;
   AOnReceiveError: TReceiveLineEvent;
-  AOnBusy: TBusyEvent);
+  AOnBusy: TBusyEvent): integer;
 
 
 implementation
 implementation
 
 
@@ -45,11 +45,11 @@ type
     procedure SendLine(const ALine: RawByteString);
     procedure SendLine(const ALine: RawByteString);
   end;
   end;
 
 
-procedure RunProcessAutomation(AExecutable: string; AParameters: array of string;
+function RunProcessAutomation(AExecutable: string; AParameters: array of string;
   out ASendLine: TSendLineMethod;
   out ASendLine: TSendLineMethod;
   AOnReceiveOutput: TReceiveLineEvent;
   AOnReceiveOutput: TReceiveLineEvent;
   AOnReceiveError: TReceiveLineEvent;
   AOnReceiveError: TReceiveLineEvent;
-  AOnBusy: TBusyEvent);
+  AOnBusy: TBusyEvent): integer;
 
 
 type
 type
   TReceiveBuffer = record
   TReceiveBuffer = record
@@ -120,6 +120,7 @@ var
   i: integer;
   i: integer;
   shouldSleep: Boolean;
   shouldSleep: Boolean;
 begin
 begin
+  result := 0;
   p := TAutomatedProcess.Create(nil);
   p := TAutomatedProcess.Create(nil);
   ASendLine := @p.SendLine;
   ASendLine := @p.SendLine;
   try
   try
@@ -145,6 +146,7 @@ begin
     end;
     end;
     Receive(p.Output, Output);
     Receive(p.Output, Output);
     Receive(p.Stderr, Error);
     Receive(p.Stderr, Error);
+    result := p.ExitCode;
   finally
   finally
     p.Free;
     p.Free;
   end;
   end;

+ 375 - 10
lazpaint/upython.pas

@@ -10,21 +10,26 @@ uses
 
 
 const
 const
   DefaultPythonBin = {$IFDEF WINDOWS}'pyw'{$ELSE}'python3'{$ENDIF};
   DefaultPythonBin = {$IFDEF WINDOWS}'pyw'{$ELSE}'python3'{$ENDIF};
+  {$IFDEF DARWIN}
+  UserPythonBin = '/usr/local/bin/python3';
+  {$ENDIF}
 
 
 type
 type
   TReceiveLineEvent = procedure(ASender: TObject; ALine: UTF8String) of object;
   TReceiveLineEvent = procedure(ASender: TObject; ALine: UTF8String) of object;
   TCommandEvent = procedure(ASender: TObject; ACommand, AParam: UTF8String; out AResult: UTF8String) of object;
   TCommandEvent = procedure(ASender: TObject; ACommand, AParam: UTF8String; out AResult: UTF8String) of object;
+  TWarningEvent = procedure(ASender: TObject; AMessage: UTF8String; out AProceed: boolean) of object;
 
 
   { TPythonScript }
   { TPythonScript }
 
 
   TPythonScript = class
   TPythonScript = class
   private
   private
-    FOnBusy: TNotifyEvent;
     FPythonBin: string;
     FPythonBin: string;
     FPythonVersion: string;
     FPythonVersion: string;
     FLinePrefix: RawByteString;
     FLinePrefix: RawByteString;
     FOnCommand: TCommandEvent;
     FOnCommand: TCommandEvent;
     FOnError: TReceiveLineEvent;
     FOnError: TReceiveLineEvent;
+    FOnBusy: TNotifyEvent;
+    FOnWarning: TWarningEvent;
     FOnOutputLine: TReceiveLineEvent;
     FOnOutputLine: TReceiveLineEvent;
     FPythonSend: TSendLineMethod;
     FPythonSend: TSendLineMethod;
     FErrorText: UTF8String;
     FErrorText: UTF8String;
@@ -33,14 +38,16 @@ type
     procedure PythonError(ALine: RawByteString);
     procedure PythonError(ALine: RawByteString);
     procedure PythonOutput(ALine: RawByteString);
     procedure PythonOutput(ALine: RawByteString);
     procedure PythonBusy(var {%H-}ASleep: boolean);
     procedure PythonBusy(var {%H-}ASleep: boolean);
+    function CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean;
   public
   public
     constructor Create(APythonBin: string = DefaultPythonBin);
     constructor Create(APythonBin: string = DefaultPythonBin);
-    procedure Run(AScriptFilename: UTF8String; APythonVersion: integer = 3);
+    function Run(AScriptFilename: UTF8String; APythonVersion: integer = 3): boolean;
     class function DefaultScriptDirectory: string;
     class function DefaultScriptDirectory: string;
     property OnOutputLine: TReceiveLineEvent read FOnOutputLine write FOnOutputLine;
     property OnOutputLine: TReceiveLineEvent read FOnOutputLine write FOnOutputLine;
     property OnError: TReceiveLineEvent read FOnError write FOnError;
     property OnError: TReceiveLineEvent read FOnError write FOnError;
     property OnCommand: TCommandEvent read FOnCommand write FOnCommand;
     property OnCommand: TCommandEvent read FOnCommand write FOnCommand;
     property OnBusy: TNotifyEvent read FOnBusy write FOnBusy;
     property OnBusy: TNotifyEvent read FOnBusy write FOnBusy;
+    property OnWarning: TWarningEvent read FOnWarning write FOnWarning;
     property PythonVersion: string read FPythonVersion;
     property PythonVersion: string read FPythonVersion;
     property PythonVersionMajor: integer read GetPythonVersionMajor;
     property PythonVersionMajor: integer read GetPythonVersionMajor;
     property ErrorText: UTF8String read FErrorText;
     property ErrorText: UTF8String read FErrorText;
@@ -48,6 +55,7 @@ type
 
 
 function GetPythonVersion(APythonBin: string = DefaultPythonBin): string;
 function GetPythonVersion(APythonBin: string = DefaultPythonBin): string;
 function GetScriptTitle(AFilename: string): string;
 function GetScriptTitle(AFilename: string): string;
+function CheckPythonScriptSafe(AFilename: string; out ASafeModules, AUnsafeModules: TStringList): boolean;
 
 
 var
 var
   CustomScriptDirectory: string;
   CustomScriptDirectory: string;
@@ -163,6 +171,277 @@ begin
   end;
   end;
 end;
 end;
 
 
+function CheckPythonScriptSafe(AFilename: string; out ASafeModules, AUnsafeModules: TStringList): boolean;
+  function binarySearch(x: string; a: array of string): integer;
+  var  L, R, M: integer;  // left, right, middle
+  begin
+    if Length(a)=0 then Exit(-1);
+    L := Low (a);
+    R := High(a);
+    while (L <= R) do begin
+      M := (L + R) div 2;
+      if (x = a[M]) then Exit(M);  // found x in a
+      if (x > a[M])
+      then L := Succ(M)
+      else R := Pred(M);
+    end;
+    Exit(-1) // did not found x in a
+  end;
+
+  function idOk(AId: string; var importCount: integer): boolean;
+  const forbidden: array[0..6] of string =
+  ('__import__',
+   'compile',
+   'eval',
+   'exec',
+   'getattr',
+   'globals',
+   'locals');
+  begin
+    if AId = 'import' then inc(importCount);
+    exit(binarySearch(AId, forbidden) = -1);
+  end;
+
+  const StartIdentifier = ['A'..'Z','a'..'z','_'];
+  const ContinueIdentifier = ['A'..'Z','a'..'z','_','0'..'9'];
+  const WhiteSpace = [' ', #9];
+
+  function importOk(const s: string; importCount: integer; previousBackslash: boolean): boolean;
+  const ForbiddenModules: array[0..22] of string =
+  ('builtins',          // Provides direct access to all built-in identifiers of Python.
+   'code',              // Facilities to implement interactive Python interpreters.
+   'codecs',            // Core support for encoding and decoding text and binary data.
+   'ctypes',            // Create and manipulate C-compatible data types in Python, and call functions in dynamic link libraries/shared libraries.
+   'ftplib',            // Interface to the FTP protocol.
+   'gc',                // Interface to the garbage collection facility for reference cycles.
+   'io',                // Core tools for working with streams (core I/O operations).
+   'multiprocessing',   // Process-based parallelism.
+   'os',                // Interface to the operating system, including file and process operations.
+   'pathlib',           // Object-oriented filesystem paths.
+   'poplib',            // Client-side support for the POP3 protocol.
+   'pty',               // Operations for handling the pseudo-terminal concept.
+   'runpy',             // Locating and running Python programs using various modes of the `__main__` module.
+   'shutil',            // High-level file operations, including copying and deletion.
+   'smtplib',           // Client-side objects for the SMTP and ESMTP protocols.
+   'socket',            // Low-level networking operations.
+   'subprocess',        // Spawn additional processes, connect to their input/output/error pipes, and obtain their return codes.
+   'sys',               // Access and set variables used or maintained by the Python interpreter.
+   'telnetlib',         // Client-side support for the Telnet protocol.
+   'tempfile',          // Generate temporary files and directories.
+   'threading',         // Higher-level threading interfaces on top of the lower-level `_thread` module.
+   'wsgiref',           // WSGI utility functions and reference implementation.
+   'xmlrpc'             // XML-RPC server and client modules.
+  );
+
+  const SafeModules: array[0..26] of string =
+  ('PIL',           // Python Imaging Library, for image processing.
+   'array',         // Basic mutable array operations.
+   'ast',           // Abstract Syntax Trees
+   'bisect',        // Algorithms for manipulating sorted lists.
+   'calendar',      // Functions for working with calendars and dates.
+   'collections',   // Container datatypes like namedtuples and defaultdict.
+   'colorsys',      // Color system conversions.
+   'copy',          // Shallow and deep copy operations.
+   'csv',           // Reading and writing CSV files.
+   'datetime',      // Basic date and time types.
+   'decimal',       // Fixed and floating point arithmetic using decimal notation.
+   'enum',          // Enumerations in Python.
+   'fractions',     // Rational numbers.
+   'functools',     // Higher-order functions and operations on callable objects.
+   'hashlib',       // Secure hash and message digest algorithms.
+   'itertools',     // Functions for creating iterators for efficient looping.
+   'json',          // Encoding and decoding JSON format.
+   'lazpaint',
+   'math',          // Mathematical functions.
+   'platform',      // Access to platform-specific attributes and functions.
+   'queue',         // A multi-producer, multi-consumer queue.
+   'random',        // Generate pseudo-random numbers.
+   'statistics',    // Mathematical statistics functions.
+   'string',        // Common string operations.
+   'time',          // Time-related functions.
+   'tkinter',       // Standard GUI library for Python.
+   'uuid');         // UUID objects
+
+  procedure SkipSpaces(var idx: integer);
+  begin
+    while (idx <= length(s)) and (s[idx] in WhiteSpace) do inc(idx);
+  end;
+
+  function GetId(var idx: integer): string;
+  var idxEnd: integer;
+  begin
+    if (idx > length(s)) or not (s[idx] in StartIdentifier) then exit('');
+    idxEnd := idx+1;
+    while (idxEnd <= length(s)) and (s[idxEnd] in ContinueIdentifier) do inc(idxEnd);
+    result := copy(s, idx, idxEnd-idx);
+    idx := idxEnd;
+  end;
+
+  function SkipAs(var idx: integer): boolean;
+  var
+    subId: String;
+  begin
+    SkipSpaces(idx);
+    if (idx > length(s)) or (s[idx] = '#') then exit(true);
+    subId := GetId(idx);
+    if subId = 'as' then
+    begin
+      SkipSpaces(idx);
+      subId := GetId(idx);
+      if subId = '' then exit(false); // syntax error
+    end;
+    exit(true);
+  end;
+
+  function ParseModuleName(var idx: integer; out AModuleName: string; out AIsSafe: boolean): boolean;
+  var
+    subId: String;
+  begin
+    SkipSpaces(idx);
+    AIsSafe := false;
+    AModuleName := GetId(idx);
+    if AModuleName = '' then exit(false); // syntax error
+    // check if module is allowed
+    if binarySearch(AModuleName, ForbiddenModules) <> -1 then exit(false);
+    AIsSafe := binarySearch(AModuleName, SafeModules) <> -1;
+    SkipSpaces(idx);
+    // submodule
+    while (idx <= length(s)) and (s[idx] = '.') do
+    begin
+      inc(idx);
+      SkipSpaces(idx);
+      subId := GetId(idx);
+      if subId = '' then exit(false); // syntax error
+      AModuleName += '.' + subId;
+      SkipSpaces(idx);
+    end;
+    exit(true);
+  end;
+
+  procedure AddModule(AModuleName: string; AIsSafe: boolean);
+  begin
+    if not AIsSafe then
+    begin
+      if AUnsafeModules = nil then
+         AUnsafeModules := TStringList.Create;
+      if AUnsafeModules.IndexOf(AModuleName) = -1 then
+        AUnsafeModules.Add(AModuleName);
+    end else
+    begin
+      if ASafeModules = nil then
+         ASafeModules := TStringList.Create;
+      if ASafeModules.IndexOf(AModuleName) = -1 then
+        ASafeModules.Add(AModuleName);
+    end;
+  end;
+
+  var idx: integer;
+    fromClause: boolean;
+    moduleName, subId: string;
+    isSafe: boolean;
+  begin
+    if importCount <> 1 then exit(false); // syntax error
+
+    if s.StartsWith('from ') then
+    begin
+      idx := length('from ') + 1;
+      fromClause := true;
+    end else
+    if s.StartsWith('import ') then
+    begin
+      if previousBackslash then exit(false); // could be an exploit
+      idx := length('import ') + 1;
+      fromClause := false;
+    end
+    else
+      exit(false); // syntax error
+
+    if not ParseModuleName(idx, moduleName, isSafe) then exit(false);
+
+    if fromClause then
+    begin
+      subId := GetId(idx);
+      if subId <> 'import' then exit(false); // syntax error
+      repeat
+        SkipSpaces(idx);
+        subId := GetId(idx);
+        if subId = '' then exit(false); // syntax error
+        AddModule(moduleName+'.'+subId, isSafe);
+        if not SkipAs(idx) then exit(false);
+        SkipSpaces(idx);
+        if (idx <= length(s)) and (s[idx] = ',') then inc(idx)
+        else break;
+      until false;
+    end else
+    begin
+      repeat
+        AddModule(moduleName, isSafe);
+        if not SkipAs(idx) then exit(false);
+        SkipSpaces(idx);
+        if (idx <= length(s)) and (s[idx] = ',') then
+        begin
+          inc(idx);
+          if not ParseModuleName(idx, moduleName, isSafe) then exit(false);
+        end
+        else break;
+      until false;
+    end;
+    if (idx <= length(s)) and (s[idx] <> '#') then // expect end of line
+      exit(false); // syntax error
+
+    exit(true);
+  end;
+
+  function lineOk(const s: string; previousBackslash: boolean): boolean;
+  var
+    startId, i: integer;
+    importCount: integer;
+  begin
+    startId := -1;
+    importCount := 0;
+
+    for i := 1 to length(s) do
+    begin
+      // check identifier boundaries
+      if (startId = -1) and (s[i] in StartIdentifier) then
+      begin
+        startId := i;
+      end else
+      if (startId <> -1) and not (s[i] in ContinueIdentifier) then
+      begin
+        if not idOk(copy(s, startId, i-startId), importCount) then exit(false);
+        startId := -1;
+      end;
+    end;
+    if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1), importCount) then
+      exit(false);
+
+    if (importCount > 0) and not importOk(s, importCount, previousBackslash) then exit(false);
+
+    exit(true);
+  end;
+
+var
+  t: textfile;
+  s: string;
+  previousBackslash: boolean;
+begin
+  ASafeModules := nil;
+  AUnsafeModules := nil;
+  assignFile(t, AFilename);
+  reset(t);
+  previousBackslash := false;
+  while not eof(t) do
+  begin
+    readln(t, s);
+    s := trim(s);
+    if not lineOk(s, previousBackslash) then exit(false);
+    previousBackslash := s.EndsWith('\');
+  end;
+  closefile(t);
+  exit(true);
+end;
+
 { TPythonScript }
 { TPythonScript }
 
 
 procedure TPythonScript.PythonOutput(ALine: RawByteString);
 procedure TPythonScript.PythonOutput(ALine: RawByteString);
@@ -257,9 +536,95 @@ begin
   if Assigned(FOnBusy) then FOnBusy(self);
   if Assigned(FOnBusy) then FOnBusy(self);
 end;
 end;
 
 
+function TPythonScript.CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean;
+var
+  filesToCheck: TStringList;
+
+  procedure AddModuleToCheck(AModuleName: UTF8String; ABasePath: UTF8String);
+  var fullPath, moduleFilename: string;
+  begin
+    fullPath := ConcatPaths([ABasePath, StringReplace(AModuleName, '.', PathDelim, [rfReplaceAll])]);
+    moduleFilename := fullPath+'.py';
+    if (filesToCheck.IndexOf(moduleFilename) = -1) and FileExists(moduleFilename) then
+      filesToCheck.Add(moduleFilename) else
+    begin
+      moduleFilename := fullPath+'\__init__.py';
+      if (filesToCheck.IndexOf(moduleFilename) = -1) and FileExists(moduleFilename) then
+        filesToCheck.Add(moduleFilename);
+      end;
+  end;
+
+var
+  safeModules, unsafeModules, allUnsafeModules: TStringList;
+  proceed: boolean;
+  curFile, i: integer;
+  curPath: string;
+
+begin
+  allUnsafeModules := TStringList.Create;
+  allUnsafeModules.Sorted := true;
+  allUnsafeModules.Duplicates:= dupIgnore;
+  filesToCheck := TStringList.Create;
+  filesToCheck.Add(AFilename);
+  curFile := 0;
+  curPath := ExtractFilePath(AFilename);
+  while curFile < filesToCheck.Count do
+  begin
+    if not CheckPythonScriptSafe(filesToCheck[curFile], safeModules, unsafeModules) then
+    begin
+      safeModules.Free;
+      unsafeModules.Free;
+      raise exception.Create('The script file does not seem to be safe: ' +
+                             filesToCheck[curFile]);
+    end;
+    if Assigned(unsafeModules) then
+    begin
+      for i := 0 to unsafeModules.Count-1 do
+      begin
+        AddModuleToCheck(unsafeModules[i], curPath);
+        allUnsafeModules.Add(unsafeModules[i]);
+      end;
+    end;
+    if Assigned(safeModules) then
+    begin
+      for i := 0 to safeModules.Count-1 do
+        AddModuleToCheck(safeModules[i], curPath);
+    end;
+    safeModules.Free;
+    unsafeModules.Free;
+    inc(curFile);
+  end;
+  filesToCheck.Free;
+
+  if allUnsafeModules.Count > 0 then
+  begin
+    proceed := true;
+    if Assigned(OnWarning) then
+    begin
+      OnWarning(self, 'Are you sure you would like to run this script? ' +
+        'The following modules used by this script may be unsafe: '+
+        allUnsafeModules.CommaText, proceed);
+    end;
+    allUnsafeModules.Free;
+    if not proceed then exit(false);
+  end else
+    allUnsafeModules.Free;
+
+  if PythonVersionMajor <> APythonVersion then
+    raise exception.Create(
+      StringReplace( StringReplace(rsPythonUnexpectedVersion,
+        '%1',inttostr(APythonVersion),[]),
+        '%2',inttostr(PythonVersionMajor),[]) + #9 + rsDownload + #9 + 'https://www.python.org');
+  exit(true);
+end;
+
 constructor TPythonScript.Create(APythonBin: string);
 constructor TPythonScript.Create(APythonBin: string);
 begin
 begin
   FPythonBin := APythonBin;
   FPythonBin := APythonBin;
+  {$IFDEF DARWIN}
+  if (FPythonBin = 'python3') and FileExists(UserPythonBin) then
+    FPythonBin:= UserPythonBin;
+  {$ENDIF}
   FPythonVersion:= GetPythonVersion(FPythonBin);
   FPythonVersion:= GetPythonVersion(FPythonBin);
 end;
 end;
 
 
@@ -283,23 +648,23 @@ begin
     val(copy(PythonVersion,1,posDot-1), result, errPos);
     val(copy(PythonVersion,1,posDot-1), result, errPos);
 end;
 end;
 
 
-procedure TPythonScript.Run(AScriptFilename: UTF8String;
-  APythonVersion: integer);
+function TPythonScript.Run(AScriptFilename: UTF8String;
+  APythonVersion: integer): boolean;
+var exitCode: integer;
 begin
 begin
+  result := false;
+  if not CheckScriptAndDependencySafe(AScriptFilename, APythonVersion) then exit;
   FLinePrefix := '';
   FLinePrefix := '';
-  if PythonVersionMajor <> APythonVersion then
-    raise exception.Create(
-      StringReplace( StringReplace(rsPythonUnexpectedVersion,
-        '%1',inttostr(APythonVersion),[]),
-        '%2',inttostr(PythonVersionMajor),[]) + #9 + rsDownload + #9 + 'https://www.python.org');
   FFirstOutput:= true;
   FFirstOutput:= true;
   AutomationEnvironment.Values['PYTHONPATH'] := DefaultScriptDirectory;
   AutomationEnvironment.Values['PYTHONPATH'] := DefaultScriptDirectory;
+  AutomationEnvironment.Values['PYTHONIOENCODING'] := 'utf-8';
   try
   try
-    RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy);
+    exitCode := RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy);
   finally
   finally
     AutomationEnvironment.Clear;
     AutomationEnvironment.Clear;
   end;
   end;
   FPythonSend := nil;
   FPythonSend := nil;
+  result := exitCode = 0;
 end;
 end;
 
 
 class function TPythonScript.DefaultScriptDirectory: string;
 class function TPythonScript.DefaultScriptDirectory: string;

+ 3 - 0
lazpaint/uresourcestrings.pas

@@ -279,6 +279,9 @@ resourcestring
   rsShowPalette = 'Show palette';
   rsShowPalette = 'Show palette';
   rsPaletteOptions = 'Palette options';
   rsPaletteOptions = 'Palette options';
 
 
+  rsPreview = 'Preview';
+  rsOK = 'OK';
+
 function RemoveTrail(ACaption: string): string;
 function RemoveTrail(ACaption: string): string;
 
 
 implementation
 implementation

+ 6 - 6
lazpaint/uscripting.pas

@@ -458,37 +458,37 @@ begin
   for i := 0 to FNbScalars-1 do
   for i := 0 to FNbScalars-1 do
     if FScalars[i].name <> '' then
     if FScalars[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FScalars[AIndex].name)
+      if AIndex = 0 then exit(FScalars[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
   for i := 0 to FNbStrings-1 do
   for i := 0 to FNbStrings-1 do
     if FStrings[i].name <> '' then
     if FStrings[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FStrings[AIndex].name)
+      if AIndex = 0 then exit(FStrings[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
   for i := 0 to FNbBoolLists-1 do
   for i := 0 to FNbBoolLists-1 do
     if FBoolLists[i].name <> '' then
     if FBoolLists[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FBoolLists[AIndex].name)
+      if AIndex = 0 then exit(FBoolLists[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
   for i := 0 to FNbScalarLists-1 do
   for i := 0 to FNbScalarLists-1 do
     if FScalarLists[i].name <> '' then
     if FScalarLists[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FScalarLists[AIndex].name)
+      if AIndex = 0 then exit(FScalarLists[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
   for i := 0 to FNbStrLists-1 do
   for i := 0 to FNbStrLists-1 do
     if FStrLists[i].name <> '' then
     if FStrLists[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FStrLists[AIndex].name)
+      if AIndex = 0 then exit(FStrLists[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
   for i := 0 to FNbSubsets-1 do
   for i := 0 to FNbSubsets-1 do
     if FSubsets[i].name <> '' then
     if FSubsets[i].name <> '' then
     begin
     begin
-      if AIndex = 0 then exit(FSubsets[AIndex].name)
+      if AIndex = 0 then exit(FSubsets[i].name)
       else dec(AIndex);
       else dec(AIndex);
     end;
     end;
 
 

+ 13 - 0
lazpaintcontrols/lcvectorialfillcontrol.pas

@@ -24,6 +24,7 @@ type
   TLCVectorialFillControl = class(TWinControl)
   TLCVectorialFillControl = class(TWinControl)
   private
   private
     function GetAllowedFillTypes: TVectorialFillTypes;
     function GetAllowedFillTypes: TVectorialFillTypes;
+    function GetAllowKeyInput: boolean;
     function GetAverageColor: TBGRAPixel;
     function GetAverageColor: TBGRAPixel;
     function GetCanAdjustToShape: boolean;
     function GetCanAdjustToShape: boolean;
     function GetCanEditGradTexPoints: boolean;
     function GetCanEditGradTexPoints: boolean;
@@ -51,6 +52,7 @@ type
     procedure InterfaceMouseUp(Sender: TObject; Button: TMouseButton;
     procedure InterfaceMouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       Shift: TShiftState; X, Y: Integer);
     procedure SetAllowedFillTypes(AValue: TVectorialFillTypes);
     procedure SetAllowedFillTypes(AValue: TVectorialFillTypes);
+    procedure SetAllowKeyInput(AValue: boolean);
     procedure SetCanAdjustToShape(AValue: boolean);
     procedure SetCanAdjustToShape(AValue: boolean);
     procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetEditingGradTexPoints(AValue: boolean);
     procedure SetEditingGradTexPoints(AValue: boolean);
@@ -112,6 +114,7 @@ type
     property TextureOpacity: byte read GetTexOpacity write SetTextureOpacity;
     property TextureOpacity: byte read GetTexOpacity write SetTextureOpacity;
     property CanAdjustToShape: boolean read GetCanAdjustToShape write SetCanAdjustToShape;
     property CanAdjustToShape: boolean read GetCanAdjustToShape write SetCanAdjustToShape;
     property PreferredSize: TSize read GetPreferredSizeAsSize;
     property PreferredSize: TSize read GetPreferredSizeAsSize;
+    property AllowKeyInput: boolean read GetAllowKeyInput write SetAllowKeyInput;
   published
   published
     property AutoSize;
     property AutoSize;
     property Align;
     property Align;
@@ -167,6 +170,11 @@ begin
   result := FInterface.AllowedFillTypes;
   result := FInterface.AllowedFillTypes;
 end;
 end;
 
 
+function TLCVectorialFillControl.GetAllowKeyInput: boolean;
+begin
+  result := FInterface.AllowKeyInput;
+end;
+
 function TLCVectorialFillControl.GetAverageColor: TBGRAPixel;
 function TLCVectorialFillControl.GetAverageColor: TBGRAPixel;
 begin
 begin
   result := FInterface.AverageColor;
   result := FInterface.AverageColor;
@@ -293,6 +301,11 @@ begin
   FInterface.AllowedFillTypes:= AValue;
   FInterface.AllowedFillTypes:= AValue;
 end;
 end;
 
 
+procedure TLCVectorialFillControl.SetAllowKeyInput(AValue: boolean);
+begin
+  FInterface.AllowKeyInput := AValue;
+end;
+
 procedure TLCVectorialFillControl.SetCanAdjustToShape(AValue: boolean);
 procedure TLCVectorialFillControl.SetCanAdjustToShape(AValue: boolean);
 begin
 begin
   FInterface.CanAdjustToShape := AValue;
   FInterface.CanAdjustToShape := AValue;

+ 22 - 0
lazpaintcontrols/lcvectorialfillinterface.pas

@@ -25,6 +25,7 @@ type
 
 
   TVectorialFillInterface = class(TComponent)
   TVectorialFillInterface = class(TComponent)
   private
   private
+    FAllowKeyInput: boolean;
     FCanEditGradTexPoints: boolean;
     FCanEditGradTexPoints: boolean;
     FIsTarget: boolean;
     FIsTarget: boolean;
     FOnMouseDown: TMouseEvent;
     FOnMouseDown: TMouseEvent;
@@ -36,6 +37,7 @@ type
     function GetEditingGradTexPoints: boolean;
     function GetEditingGradTexPoints: boolean;
     procedure Preview_MouseUp(Sender: TObject; Button: TMouseButton;
     procedure Preview_MouseUp(Sender: TObject; Button: TMouseButton;
       {%H-}Shift: TShiftState; X, {%H-}Y: Integer);
       {%H-}Shift: TShiftState; X, {%H-}Y: Integer);
+    procedure SetAllowKeyInput(AValue: boolean);
     procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetEditingGradTexPoints(AValue: boolean);
     procedure SetEditingGradTexPoints(AValue: boolean);
     procedure SetIsTarget(AValue: boolean);
     procedure SetIsTarget(AValue: boolean);
@@ -216,6 +218,7 @@ type
     property VerticalPadding: integer read FVerticalPadding write SetVerticalPadding;
     property VerticalPadding: integer read FVerticalPadding write SetVerticalPadding;
     property PreferredSize: TSize read GetPreferredSize;
     property PreferredSize: TSize read GetPreferredSize;
     property AllowedFillTypes: TVectorialFillTypes read FAllowedFillTypes write SetAllowedFillTypes;
     property AllowedFillTypes: TVectorialFillTypes read FAllowedFillTypes write SetAllowedFillTypes;
+    property AllowKeyInput: boolean read FAllowKeyInput write SetAllowKeyInput;
   end;
   end;
 
 
 implementation
 implementation
@@ -675,6 +678,7 @@ begin
   FUpDownSolidAlpha.Increment:= 15;
   FUpDownSolidAlpha.Increment:= 15;
   FUpDownSolidAlpha.OnChange:=@UpDownSolidAlphaChange;
   FUpDownSolidAlpha.OnChange:=@UpDownSolidAlphaChange;
   FUpDownSolidAlpha.Hint := rsOpacity;
   FUpDownSolidAlpha.Hint := rsOpacity;
+  FUpDownSolidAlpha.Enabled:= FAllowKeyInput;
   AddToolbarControl(FToolbar, FUpDownSolidAlpha);
   AddToolbarControl(FToolbar, FUpDownSolidAlpha);
   AttachMouseEvent(FUpDownSolidAlpha);
   AttachMouseEvent(FUpDownSolidAlpha);
 end;
 end;
@@ -707,6 +711,7 @@ begin
   FUpDownStartAlpha.Increment:= 15;
   FUpDownStartAlpha.Increment:= 15;
   FUpDownStartAlpha.OnChange:=@UpDownStartAlphaChange;
   FUpDownStartAlpha.OnChange:=@UpDownStartAlphaChange;
   FUpDownStartAlpha.Hint := rsStartOpacity;
   FUpDownStartAlpha.Hint := rsStartOpacity;
+  FUpDownStartAlpha.Enabled:= FAllowKeyInput;
   AddToolbarControl(FToolbar, FUpDownStartAlpha);
   AddToolbarControl(FToolbar, FUpDownStartAlpha);
   AttachMouseEvent(FUpDownStartAlpha);
   AttachMouseEvent(FUpDownStartAlpha);
   FButtonSwapColor := AddToolbarButton(FToolbar, rsSwapColors, 23, @ButtonSwapColorClick);
   FButtonSwapColor := AddToolbarButton(FToolbar, rsSwapColors, 23, @ButtonSwapColorClick);
@@ -725,6 +730,7 @@ begin
   FUpDownEndAlpha.Increment:= 15;
   FUpDownEndAlpha.Increment:= 15;
   FUpDownEndAlpha.OnChange:=@UpDownEndAlphaChange;
   FUpDownEndAlpha.OnChange:=@UpDownEndAlphaChange;
   FUpDownEndAlpha.Hint := rsEndOpacity;
   FUpDownEndAlpha.Hint := rsEndOpacity;
+  FUpDownEndAlpha.Enabled:= FAllowKeyInput;
   AddToolbarControl(FToolbar, FUpDownEndAlpha);
   AddToolbarControl(FToolbar, FUpDownEndAlpha);
   AttachMouseEvent(FUpDownEndAlpha);
   AttachMouseEvent(FUpDownEndAlpha);
 
 
@@ -767,6 +773,7 @@ begin
   FUpDownTexAlpha.Increment:= 15;
   FUpDownTexAlpha.Increment:= 15;
   FUpDownTexAlpha.OnChange:=@UpDownTexAlphaChange;
   FUpDownTexAlpha.OnChange:=@UpDownTexAlphaChange;
   FUpDownTexAlpha.Hint := rsOpacity;
   FUpDownTexAlpha.Hint := rsOpacity;
+  FUpDownTexAlpha.Enabled:= FAllowKeyInput;
   AddToolbarControl(FToolbar, FUpDownTexAlpha);
   AddToolbarControl(FToolbar, FUpDownTexAlpha);
   AttachMouseEvent(FUpDownTexAlpha);
   AttachMouseEvent(FUpDownTexAlpha);
   FButtonLoadTexture := AddToolbarButton(FToolbar, rsLoadTexture+'...', 22, @ButtonLoadTextureClick);
   FButtonLoadTexture := AddToolbarButton(FToolbar, rsLoadTexture+'...', 22, @ButtonLoadTextureClick);
@@ -819,6 +826,7 @@ var
 begin
 begin
   FContainer := nil;
   FContainer := nil;
 
 
+  FAllowKeyInput:= true;
   FAllowedFillTypes := [vftNone, vftSolid, vftGradient, vftTexture];
   FAllowedFillTypes := [vftNone, vftSolid, vftGradient, vftTexture];
   FFillType:= vftSolid;
   FFillType:= vftSolid;
   FSolidColor:= BGRAWhite;
   FSolidColor:= BGRAWhite;
@@ -1146,6 +1154,20 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TVectorialFillInterface.SetAllowKeyInput(AValue: boolean);
+begin
+  if FAllowKeyInput=AValue then Exit;
+  FAllowKeyInput:=AValue;
+  if Assigned(FUpDownStartAlpha) then
+    FUpDownStartAlpha.Enabled:= AValue;
+  if Assigned(FUpDownEndAlpha) then
+    FUpDownEndAlpha.Enabled:= AValue;
+  if Assigned(FUpDownSolidAlpha) then
+    FUpDownSolidAlpha.Enabled:= AValue;
+  if Assigned(FUpDownTexAlpha) then
+    FUpDownTexAlpha.Enabled:= AValue;
+end;
+
 procedure TVectorialFillInterface.EditGradTextPointsClick(Sender: TObject);
 procedure TVectorialFillInterface.EditGradTextPointsClick(Sender: TObject);
 begin
 begin
   if Assigned(FOnEditGradTexPoints) then FOnEditGradTexPoints(self);
   if Assigned(FOnEditGradTexPoints) then FOnEditGradTexPoints(self);

+ 1 - 0
lazpaintcontrols/lcvectororiginal.pas

@@ -2741,6 +2741,7 @@ var
   i: Integer;
   i: Integer;
 begin
 begin
   result := EmptyRectF;
   result := EmptyRectF;
+  if ACount = 0 then exit;
   if (AStartIndex < 0) or (AStartIndex+ACount > ShapeCount) then
   if (AStartIndex < 0) or (AStartIndex+ACount > ShapeCount) then
     raise exception.Create(rsIndexOutOfBounds);
     raise exception.Create(rsIndexOutOfBounds);
   for i := AStartIndex to AStartIndex+ACount-1 do
   for i := AStartIndex to AStartIndex+ACount-1 do

Some files were not shown because too many files changed in this diff