Răsfoiți Sursa

Merge branch 'dev-lazpaint' into master

circular17 1 an în urmă
părinte
comite
45a7a471d5
100 a modificat fișierele cu 3606 adăugiri și 4238 ștergeri
  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
   Left = 439
-  Height = 326
+  Height = 345
   Top = 193
   Width = 432
   BorderIcons = [biSystemMenu, biMinimize]
   Caption = 'Adjust curves'
-  ClientHeight = 326
+  ClientHeight = 345
   ClientWidth = 432
   KeyPreview = True
   OnCloseQuery = FormCloseQuery
@@ -15,7 +15,7 @@ object FAdjustCurves: TFAdjustCurves
   OnKeyDown = FormKeyDown
   OnShow = FormShow
   Position = poOwnerFormCenter
-  LCLVersion = '1.8.2.0'
+  LCLVersion = '2.2.4.0'
   object TabControl1: TTabControl
     Left = 0
     Height = 289
@@ -33,12 +33,11 @@ object FAdjustCurves: TFAdjustCurves
       'Alpha'
     )
     Align = alClient
-    Anchors = [akLeft, akTop, akRight, akBottom]
     TabOrder = 0
     object vsChart: TBGRAVirtualScreen
       Left = 2
-      Height = 230
-      Top = 57
+      Height = 239
+      Top = 48
       Width = 428
       OnRedraw = vsChartRedraw
       Align = alClient
@@ -53,7 +52,7 @@ object FAdjustCurves: TFAdjustCurves
     object Panel2: TPanel
       Left = 2
       Height = 25
-      Top = 32
+      Top = 23
       Width = 428
       Align = alTop
       ClientHeight = 25
@@ -65,7 +64,6 @@ object FAdjustCurves: TFAdjustCurves
         Top = 0
         Width = 90
         Align = alNone
-        Anchors = [akTop, akLeft]
         EdgeBorders = []
         Images = FMain.ImageList16
         ParentShowHint = False
@@ -98,50 +96,61 @@ object FAdjustCurves: TFAdjustCurves
   end
   object Panel1: TPanel
     Left = 0
-    Height = 37
+    Height = 56
     Top = 289
     Width = 432
     Align = alBottom
     BevelOuter = bvNone
-    ClientHeight = 37
+    ClientHeight = 56
     ClientWidth = 432
     TabOrder = 1
     object Button_Cancel: TButton
       Left = 213
       Height = 22
-      Top = 7
+      Top = 26
       Width = 72
       Anchors = [akLeft, akBottom]
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 0
     end
     object Button_OK: TButton
       Left = 149
       Height = 22
-      Top = 7
+      Top = 26
       Width = 59
       Anchors = [akLeft, akBottom]
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       ModalResult = 1
       OnClick = Button_OKClick
       TabOrder = 1
     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
   object Timer_Thread: TTimer
     Enabled = False
     Interval = 200
     OnTimer = Timer_ThreadTimer
-    left = 62
-    top = 466
+    Left = 62
+    Top = 466
   end
   object Timer_Chart: TTimer
     Enabled = False
     Interval = 20
     OnTimer = Timer_ChartTimer
-    left = 123
-    top = 467
+    Left = 123
+    Top = 467
   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":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":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 = class(TForm)
+    CheckBox_Preview: TCheckBox;
     Panel2: TPanel;
     Timer_Chart: TTimer;
     Timer_Thread: TTimer;
@@ -38,6 +39,7 @@ type
     Panel1: TPanel;
     TabControl1: TTabControl;
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormDestroy(Sender: TObject);
     procedure FormHide(Sender: TObject);
@@ -104,6 +106,11 @@ type
     procedure DiscardHistogram;
     procedure QueryHistogramRedraw;
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
+  private
+    FInitializingGui: boolean;
+    FComputedImage: TBGRABitmap;
+    procedure DisplayComputedImage;
+    procedure StoreComputedImage;
   public
     { public declarations }
     function ShowModal: integer; override;
@@ -336,6 +343,13 @@ procedure TFAdjustCurves.FormShow(Sender: TObject);
 begin
   vsChart.DiscardBitmap;
   DiscardHistogram;
+
+  FInitializingGui := True;
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
+  CheckBox_Preview.Caption := rsPreview;
+  CheckBox_Preview.Checked := True;
+  FInitializingGui := False;
 end;
 
 procedure TFAdjustCurves.TabControl1Change(Sender: TObject);
@@ -428,14 +442,29 @@ procedure TFAdjustCurves.FormDestroy(Sender: TObject);
 begin
   FreeAndNil(FGraphBackgroundLeft);
   FreeAndNil(FGraphBackgroundBottom);
+  FreeAndNil(FComputedImage);
 end;
 
 procedure TFAdjustCurves.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction;
   ModalResult := mrOK;
 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);
 begin
   FThreadManager.Quit;
@@ -947,7 +976,10 @@ begin
       if FThreadManager.ReadyToClose then
         Close
       else
-        if AEvent = tmeCompletedTask then Button_OK.Enabled := true;
+        if AEvent = tmeCompletedTask then begin
+          Button_OK.Enabled := true;
+          CheckBox_Preview.Enabled := true;
+        end;
     end;
   tmeStartingNewTask:
     begin
@@ -955,10 +987,27 @@ begin
       Timer_Thread.Interval := 100;
       Timer_Thread.Enabled := true;
       Button_OK.Enabled := false;
+      FInitializingGui := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FreeAndNil(FComputedImage);
+      FInitializingGui := False;
     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;
 begin
   if (FFilterConnector = nil) or (FFilterConnector.ActiveLayer = nil) then

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

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

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

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

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

+ 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":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":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":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_OK: TButton;
     CheckBox_GSBA: TCheckBox;
+    CheckBox_Preview: TCheckBox;
     Combo_Preset: TComboBox;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
@@ -32,6 +33,7 @@ type
     TrackBar_Saturation: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure Combo_PresetChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
@@ -114,6 +116,15 @@ begin
   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);
 begin
   if FInComboPreset then exit;
@@ -266,6 +277,12 @@ begin
   if AParams.IsDefined('Correction') then
     CheckBox_GSBA.Checked := AParams.Booleans['Correction'];
   UpdateSpinEdit;
+
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
+  CheckBox_Preview.Caption := rsPreview;
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Enabled := True;
   FInitialized := OldInitialized;
 end;
 
@@ -359,6 +376,10 @@ end;
 procedure TFColorize.ApplyChosenColor;
 begin
   Colorize(FFilterConnector, ChosenHueDegF, ChosenSatF, CheckBox_GSBA.Checked);
+
+  FInitialized := False;
+  CheckBox_Preview.Checked := True;
+  FInitialized := True;
 end;
 
 {$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":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":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_OK: TButton;
     CheckBox_GSBA: TCheckBox;
+    CheckBox_Preview: TCheckBox;
     FloatSpinEdit_Hue: TFloatSpinEdit;
     FloatSpinEdit_Saturation: TFloatSpinEdit;
     Label1: TLabel;
@@ -27,9 +28,11 @@ type
     TrackBar_Saturation: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_GSBAChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FloatSpinEdit_HueChange(Sender: TObject);
     procedure FloatSpinEdit_SaturationChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure TimerDrawPendingRowsTimer(Sender: TObject);
     procedure TrackBar_Change(Sender: TObject);
@@ -41,6 +44,7 @@ type
     FUpdatingSpinEdit: boolean;
     FOddRows: boolean;
     FPendingRows: boolean;
+    FComputedImage: TBGRABitmap;
     function GetChosenHueShiftF: single;
     function GetChosenSatShiftF: single;
     procedure SetChosenHueShiftF(AValue: single);
@@ -51,7 +55,9 @@ type
     procedure SetChosenHueShift(AValue: integer);
     procedure LoadParameters;
     procedure HalfApplyChosenShift;
-    procedure ParametersChanged;
+    procedure PreviewNeeded;
+    procedure DisplayComputedImage;
+    procedure StoreComputedImage;
   public
     { public declarations }
     function ShowModal: integer; override;
@@ -85,6 +91,11 @@ begin
   UpdateSpinEdit;
 end;
 
+procedure TFShiftColors.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FComputedImage);
+end;
+
 procedure TFShiftColors.FormShow(Sender: TObject);
 begin
   LoadParameters;
@@ -103,6 +114,7 @@ begin
     FPendingRows:= false;
   end;
   Button_OK.Enabled := true;
+  CheckBox_Preview.Enabled := true;
 end;
 
 procedure TFShiftColors.TrackBar_Change(Sender: TObject);
@@ -110,7 +122,7 @@ begin
   if FInitialized then
   begin
     UpdateSpinEdit;
-    ParametersChanged;
+    PreviewNeeded;
   end;
 end;
 
@@ -174,6 +186,14 @@ begin
     if FFilterConnector.Parameters.IsDefined('Correction') then
       CheckBox_GSBA.Checked := FFilterConnector.Parameters.Booleans['Correction'];
     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;
   end;
 end;
@@ -256,7 +276,11 @@ end;
 procedure TFShiftColors.Button_OKClick(Sender: TObject);
 begin
   Button_OK.Enabled := false;
-  if FPendingRows then
+  CheckBox_Preview.Enabled := false;
+
+  if not CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else if FPendingRows then
   begin
     HalfApplyChosenShift;
     FPendingRows := false;
@@ -269,7 +293,18 @@ end;
 
 procedure TFShiftColors.CheckBox_GSBAChange(Sender: TObject);
 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;
 
 procedure TFShiftColors.FloatSpinEdit_HueChange(Sender: TObject);
@@ -294,14 +329,33 @@ begin
   FOddRows:= not FOddRows;
 end;
 
-procedure TFShiftColors.ParametersChanged;
+procedure TFShiftColors.PreviewNeeded;
 begin
   Button_OK.Enabled := false;
+
+  FInitialized := false;
+  CheckBox_Preview.Enabled := false;
+  CheckBox_Preview.Checked := true;
+  FInitialized := true;
+  FreeAndNil(FComputedImage);
+
   HalfApplyChosenShift;
-  FPendingRows:= true;
+  FPendingRows := true;
   TimerDrawPendingRows.Enabled := true;
 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}
 
 end.

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

@@ -1,12 +1,12 @@
 object FCustomBlur: TFCustomBlur
-  Left = 672
-  Height = 300
-  Top = 158
+  Left = 646
+  Height = 319
+  Top = 261
   Width = 400
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
   Caption = 'Custom blur'
-  ClientHeight = 300
+  ClientHeight = 319
   ClientWidth = 400
   Font.Height = -12
   OnCloseQuery = FormCloseQuery
@@ -14,7 +14,7 @@ object FCustomBlur: TFCustomBlur
   OnDestroy = FormDestroy
   OnShow = FormShow
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Image1: TImage
     Left = 8
     Height = 216
@@ -27,9 +27,9 @@ object FCustomBlur: TFCustomBlur
   object Button_OK: TButton
     Left = 128
     Height = 22
-    Top = 272
+    Top = 288
     Width = 59
-    Caption = 'OK'
+    Caption = 'rsOK'
     Default = True
     OnClick = Button_OKClick
     TabOrder = 0
@@ -37,10 +37,10 @@ object FCustomBlur: TFCustomBlur
   object Button_Cancel: TButton
     Left = 194
     Height = 22
-    Top = 272
+    Top = 288
     Width = 81
     Cancel = True
-    Caption = 'Cancel'
+    Caption = 'rsCancel'
     ModalResult = 2
     TabOrder = 1
   end
@@ -62,18 +62,29 @@ object FCustomBlur: TFCustomBlur
     OnClick = Button_EditMaskClick
     TabOrder = 3
   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
     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'
     Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
-    left = 48
-    top = 248
+    Left = 232
+    Top = 232
   end
   object Timer1: TTimer
     Enabled = False
     Interval = 200
     OnTimer = Timer1Timer
-    left = 308
-    top = 230
+    Left = 328
+    Top = 232
   end
 end

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

@@ -1,8 +1,9 @@
 {"version":1,"strings":[
 {"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":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"}
 ]}

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

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

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

@@ -1,6 +1,6 @@
 object FEmboss: TFEmboss
   Left = 491
-  Height = 277
+  Height = 296
   Top = 168
   Width = 148
   AutoSize = True
@@ -13,18 +13,18 @@ object FEmboss: TFEmboss
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 277
+  ClientHeight = 296
   ClientWidth = 148
   Font.Height = -12
   OnCreate = FormCreate
   OnShow = FormShow
   Position = poMainFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Label_Direction: TLabel
     Left = 8
     Height = 15
     Top = 8
-    Width = 112
+    Width = 130
     Caption = 'Direction :'
     ParentColor = False
   end
@@ -32,7 +32,7 @@ object FEmboss: TFEmboss
     Left = 8
     Height = 105
     Top = 31
-    Width = 112
+    Width = 130
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseUp = PaintBox1MouseUp
@@ -40,18 +40,18 @@ object FEmboss: TFEmboss
   end
   object CheckBox_Transparent: TCheckBox
     Left = 8
-    Height = 23
+    Height = 19
     Top = 144
-    Width = 112
+    Width = 130
     Caption = 'Transparent'
     OnChange = CheckBox_Change
     TabOrder = 0
   end
   object CheckBox_PreserveColors: TCheckBox
     Left = 8
-    Height = 23
-    Top = 175
-    Width = 112
+    Height = 19
+    Top = 171
+    Width = 130
     Caption = 'Preserve colors'
     Checked = True
     OnChange = CheckBox_Change
@@ -61,17 +61,17 @@ object FEmboss: TFEmboss
   object Panel1: TPanel
     Left = 8
     Height = 25
-    Top = 206
-    Width = 112
+    Top = 198
+    Width = 130
     BevelOuter = bvNone
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 2
     object TrackBar_Strength: TTrackBar
       Left = 0
       Height = 25
       Top = 0
-      Width = 112
+      Width = 130
       Frequency = 64
       Max = 256
       OnChange = TrackBar_StrengthChange
@@ -80,37 +80,48 @@ object FEmboss: TFEmboss
       TabOrder = 0
     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
     Left = 8
     Height = 25
-    Top = 239
-    Width = 112
+    Top = 258
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 3
     object Button_OK: TButton
       Left = 0
       Height = 25
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     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":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":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)
     Button_OK: TButton;
     Button_Cancel: TButton;
+    CheckBox_Preview: TCheckBox;
     CheckBox_Transparent: TCheckBox;
     CheckBox_PreserveColors: TCheckBox;
     Label_Direction: TLabel;
@@ -26,6 +27,7 @@ type
     TrackBar_Strength: TTrackBar;
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_Change(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
@@ -45,7 +47,7 @@ type
     FInitializing: boolean;
     procedure ComputeAngle(X,Y: integer);
     function ComputeFilteredLayer: TBGRABitmap;
-    procedure PreviewNeeded;
+    procedure DisplayPreview;
     procedure InitParams;
   public
     FilterConnector: TFilterConnector;
@@ -56,7 +58,7 @@ function ShowEmbossDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses BGRABitmapTypes, math, ugraph, umac;
+uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings;
 
 { TFEmboss }
 
@@ -74,7 +76,7 @@ begin
         FEmboss.FilterConnector.Parameters.Booleans['Validate'] then
       begin
         FEmboss.InitParams;
-        FEmboss.PreviewNeeded;
+        FEmboss.DisplayPreview;
         FEmboss.FilterConnector.ValidateAction;
         result := srOk;
       end else
@@ -101,12 +103,14 @@ end;
 procedure TFEmboss.FormShow(Sender: TObject);
 begin
   InitParams;
-  PreviewNeeded;
+  DisplayPreview;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left
 end;
 
 procedure TFEmboss.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then DisplayPreview;
+
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultEmbossAngle(angle);
   ModalResult := mrOK;
@@ -114,7 +118,16 @@ end;
 
 procedure TFEmboss.CheckBox_Change(Sender: TObject);
 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;
 
 procedure TFEmboss.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
@@ -171,7 +184,7 @@ end;
 
 procedure TFEmboss.TrackBar_StrengthChange(Sender: TObject);
 begin
-  PreviewNeeded;
+  if CheckBox_Preview.Checked then DisplayPreview;
   PaintBox1.Repaint;
 end;
 
@@ -180,7 +193,7 @@ begin
   if selectingAngle then
   begin
     angle := ugraph.ComputeAngle(X-PaintBox1.Width/2,Y-PaintBox1.Height/2);
-    PreviewNeeded;
+    if CheckBox_Preview.Checked then DisplayPreview;
     PaintBox1.Repaint;
   end;
 end;
@@ -194,7 +207,7 @@ begin
   result := FilterConnector.BackupLayer.FilterEmboss(angle,FilterConnector.WorkArea,TrackBar_Strength.Position,options) as TBGRABitmap;
 end;
 
-procedure TFEmboss.PreviewNeeded;
+procedure TFEmboss.DisplayPreview;
 begin
   FilterConnector.PutImage(ComputeFilteredLayer,False,True);
 end;
@@ -211,6 +224,11 @@ begin
     if FVars.IsDefined('PreserveColors') then
       CheckBox_PreserveColors.Checked := FVars.Booleans['PreserveColors'];
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing:= false;
 end;
 

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

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

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

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

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

@@ -20,20 +20,20 @@ object FRain: TFRain
   OnHide = FormHide
   OnShow = FormShow
   Position = poMainFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Label_Wind: TLabel
     Left = 8
-    Height = 20
+    Height = 15
     Top = 8
-    Width = 124
+    Width = 130
     Caption = 'Wind :'
     ParentColor = False
   end
   object PaintBox_Wind: TPaintBox
     Left = 8
     Height = 105
-    Top = 36
-    Width = 124
+    Top = 31
+    Width = 130
     OnMouseDown = PaintBox_WindMouseDown
     OnMouseMove = PaintBox_WindMouseMove
     OnMouseUp = PaintBox_WindMouseUp
@@ -41,29 +41,30 @@ object FRain: TFRain
   end
   object Label_Quantity: TLabel
     Left = 8
-    Height = 20
-    Top = 149
-    Width = 124
+    Height = 15
+    Top = 144
+    Width = 130
     Caption = 'Quantity:'
     ParentColor = False
   end
   object Panel2: TPanel
     Left = 8
     Height = 25
-    Top = 177
-    Width = 124
+    Top = 167
+    Width = 130
     BevelOuter = bvNone
     ClientHeight = 25
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 1
     object TrackBar_Quantity: TTrackBar
       Left = 0
       Height = 25
       Top = 0
-      Width = 124
+      Width = 130
       Frequency = 100
       Max = 100
-      PageSize = 200
+      OnChange = TrackBar_QuantityChange
+      PageSize = 10
       Position = 0
       ScalePos = trRight
       Align = alClient
@@ -72,35 +73,35 @@ object FRain: TFRain
   end
   object Panel1: TPanel
     Left = 8
-    Height = 30
-    Top = 210
-    Width = 124
+    Height = 25
+    Top = 200
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 30
-    ClientWidth = 124
+    ClientHeight = 25
+    ClientWidth = 130
     TabOrder = 0
     object Button_OK: TButton
       Left = 0
-      Height = 30
+      Height = 25
       Top = 0
-      Width = 46
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 54
-      Height = 30
+      Left = 59
+      Height = 25
       Top = 0
-      Width = 70
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     end
@@ -109,7 +110,7 @@ object FRain: TFRain
     Enabled = False
     Interval = 100
     OnTimer = Timer1Timer
-    left = 96
-    top = 40
+    Left = 96
+    Top = 40
   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":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":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);
     procedure PaintBox_WindPaint(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
+    procedure TrackBar_QuantityChange(Sender: TObject);
   private
     { private declarations }
     wind: single;
@@ -64,7 +65,7 @@ function ShowRainDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses LCScaleDPI, umac, LazPaintType;
+uses LCScaleDPI, umac, LazPaintType, UResourceStrings;
 
 function ShowRainDlg(AFilterConnector: TObject): TScriptResult;
 var
@@ -128,6 +129,9 @@ begin
   PreviewNeeded;
   Left := FilterConnector.LazPaintInstance.MainFormBounds.Left;
   Timer1.Enabled := true;
+
+  Button_OK.Caption := rsOK;
+  Button_Cancel.Caption := rsCancel;
 end;
 
 procedure TFRain.PaintBox_WindMouseDown(Sender: TObject; Button: TMouseButton;
@@ -189,6 +193,12 @@ begin
   Timer1.Enabled:= true;
 end;
 
+procedure TFRain.TrackBar_QuantityChange(Sender: TObject);
+begin
+  FreeAndNil(FRenderer);
+  PreviewNeeded;
+end;
+
 function TFRain.GetRainRenderer: TRainRenderer;
 begin
   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
   Left = 438
-  Height = 217
+  Height = 236
   Top = 173
   Width = 148
   AutoSize = True
@@ -13,25 +13,26 @@ object FMotionBlur: TFMotionBlur
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 217
+  ClientHeight = 236
   ClientWidth = 148
   Font.Height = -12
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
+  OnDestroy = FormDestroy
   OnShow = FormShow
   Position = poScreenCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
     Left = 8
     Height = 23
     Top = 8
-    Width = 124
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 23
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 1
     object Label_Distance: TLabel
       Left = 0
@@ -51,7 +52,6 @@ object FMotionBlur: TFMotionBlur
       DecimalPlaces = 1
       Increment = 3
       MaxValue = 1000
-      MinValue = 0
       OnChange = SpinEdit_DistanceChange
       TabOrder = 0
       Value = 5
@@ -61,7 +61,7 @@ object FMotionBlur: TFMotionBlur
     Left = 8
     Height = 19
     Top = 39
-    Width = 124
+    Width = 130
     Caption = 'Oriented'
     Checked = True
     OnChange = Checkbox_OrientedChange
@@ -72,43 +72,54 @@ object FMotionBlur: TFMotionBlur
     Left = 8
     Height = 105
     Top = 66
-    Width = 124
+    Width = 130
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnMouseUp = PaintBox1MouseUp
     OnPaint = PaintBox1Paint
   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
     Left = 8
     Height = 25
-    Top = 179
-    Width = 124
+    Top = 206
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
-    ClientWidth = 124
+    ClientWidth = 130
     TabOrder = 2
     object Button_OK: TButton
       Left = 0
       Height = 25
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     end
@@ -117,7 +128,7 @@ object FMotionBlur: TFMotionBlur
     Enabled = False
     Interval = 200
     OnTimer = Timer1Timer
-    left = 112
-    top = 96
+    Left = 112
+    Top = 96
   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":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":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)
     Button_OK: TButton;
     Button_Cancel: TButton;
+    CheckBox_Preview: TCheckBox;
     Checkbox_Oriented: TCheckBox;
     Panel1: TPanel;
     Panel2: TPanel;
@@ -26,8 +27,10 @@ type
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
     procedure Checkbox_OrientedChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
       {%H-}Shift: TShiftState; X, Y: Integer);
@@ -47,11 +50,15 @@ type
     selectingAngle: boolean;
     InPaintBoxMouseMove: boolean;
     PaintBoxMouseMovePos: TPoint;
-    FQuitQuery: boolean;
+    FQuitQuery,
+    FInitializing, FComputed: boolean;
+    FComputedImage: TBGRABitmap;
     procedure UpdateStep;
     procedure ComputeAngle(X,Y: integer);
     procedure InitParams;
+    procedure DisplayComputedImage;
     procedure PreviewNeeded;
+    procedure StoreComputedImage;
     procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent);
   end;
 
@@ -59,7 +66,7 @@ function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses BGRABitmapTypes, math, ugraph, umac, BGRAFilters;
+uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings, BGRAFilters;
 
 function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult;
 var
@@ -186,6 +193,19 @@ begin
     angle := FVars.Floats['Angle']
   else
     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;
 
 procedure TFMotionBlur.PreviewNeeded;
@@ -195,6 +215,12 @@ begin
     Checkbox_Oriented.Checked));
 end;
 
+procedure TFMotionBlur.StoreComputedImage;
+begin
+  if FComputed and (FComputedImage = nil) then
+    FComputedImage := FFilterConnector.ActiveLayer.Duplicate;
+end;
+
 procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent
   );
 begin
@@ -205,7 +231,11 @@ begin
       if FThreadManager.ReadyToClose then
         Close
       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;
   tmeStartingNewTask:
     begin
@@ -213,6 +243,12 @@ begin
       Timer1.Interval := 100;
       Timer1.Enabled := true;
       Button_OK.Enabled := false;
+
+      FInitializing := True;
+      CheckBox_Preview.Enabled := false;
+      CheckBox_Preview.Checked := True;
+      FreeAndNil(FComputedImage);
+      FInitializing := False;
     end;
   end;
 end;
@@ -225,6 +261,14 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
   CheckFloatSpinEdit(SpinEdit_Distance);
   SpinEdit_Distance.Constraints.MinWidth := DoScaleX(70, OriginalDPI);
+
+  FComputed := false;
+  FComputedImage := nil;
+end;
+
+procedure TFMotionBlur.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FComputedImage);
 end;
 
 procedure TFMotionBlur.FormShow(Sender: TObject);
@@ -262,6 +306,8 @@ end;
 
 procedure TFMotionBlur.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   if not FFilterConnector.ActionDone then
   begin
     FFilterConnector.ValidateAction;
@@ -278,6 +324,18 @@ begin
   PreviewNeeded;
 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);
 begin
   FThreadManager.Quit;

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

@@ -1,6 +1,6 @@
 object FNoiseFilter: TFNoiseFilter
   Left = 367
-  Height = 125
+  Height = 144
   Top = 354
   Width = 154
   AutoSize = True
@@ -13,7 +13,7 @@ object FNoiseFilter: TFNoiseFilter
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 125
+  ClientHeight = 144
   ClientWidth = 154
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
@@ -21,31 +21,31 @@ object FNoiseFilter: TFNoiseFilter
   OnHide = FormHide
   OnShow = FormShow
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel3: TPanel
     Left = 8
-    Height = 48
+    Height = 38
     Top = 8
-    Width = 127
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 1
-    ClientHeight = 48
-    ClientWidth = 127
+    ClientHeight = 38
+    ClientWidth = 130
     TabOrder = 2
     object Radio_GrayscaleNoise: TRadioButton
       Left = 0
-      Height = 24
+      Height = 19
       Top = 0
-      Width = 126
+      Width = 101
       Caption = 'Grayscale noise'
       TabOrder = 0
     end
     object Radio_RGBNoise: TRadioButton
       Left = 0
-      Height = 24
-      Top = 24
-      Width = 126
+      Height = 19
+      Top = 19
+      Width = 101
       Caption = 'RGB noise'
       Checked = True
       OnChange = Radio_NoiseChange
@@ -55,29 +55,29 @@ object FNoiseFilter: TFNoiseFilter
   end
   object Panel1: TPanel
     Left = 8
-    Height = 28
-    Top = 64
-    Width = 127
+    Height = 23
+    Top = 54
+    Width = 130
     AutoSize = True
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 28
-    ClientWidth = 127
+    ClientHeight = 23
+    ClientWidth = 130
     TabOrder = 0
     object Label_Opacity: TLabel
       Left = 0
-      Height = 28
+      Height = 23
       Top = 0
-      Width = 54
+      Width = 44
       Caption = 'Opacity:'
       Layout = tlCenter
       ParentColor = False
     end
     object SpinEdit_Alpha: TSpinEdit
-      Left = 62
-      Height = 28
+      Left = 52
+      Height = 23
       Top = 0
       Width = 65
       Constraints.MinWidth = 65
@@ -89,38 +89,49 @@ object FNoiseFilter: TFNoiseFilter
       Value = 255
     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
     Left = 8
-    Height = 30
-    Top = 100
-    Width = 127
+    Height = 25
+    Top = 112
+    Width = 130
     AutoSize = True
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 30
-    ClientWidth = 127
+    ClientHeight = 25
+    ClientWidth = 130
     TabOrder = 1
     object Button_OK: TButton
       Left = 0
-      Height = 30
+      Height = 25
       Top = 0
-      Width = 46
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 54
-      Height = 30
+      Left = 59
+      Height = 25
       Top = 0
-      Width = 70
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     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":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":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)
     Button_Cancel: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Opacity: TLabel;
     Panel1: TPanel;
     Panel2: TPanel;
@@ -24,6 +25,7 @@ type
     Radio_RGBNoise: TRadioButton;
     SpinEdit_Alpha: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
     procedure FormDestroy(Sender: TObject);
     procedure FormHide(Sender: TObject);
@@ -36,18 +38,19 @@ type
     FComputedLayer: TBGRABitmap;
     FClosing: boolean;
     procedure InitParams;
+    procedure DisplayComputedImage;
   public
     FInitializing: boolean;
     FFilterConnector: TFilterConnector;
     procedure ComputeFilteredLayer;
-    procedure PreviewNeeded(ARecomputeRandom: boolean);
+    procedure DisplayPreview(ARecomputeRandom: boolean);
   end;
 
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType;
+uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType, UResourceStrings;
 
 function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult;
 var
@@ -62,7 +65,7 @@ begin
         FNoiseFilter.FFilterConnector.Parameters.Booleans['Validate'] then
       begin
         FNoiseFilter.InitParams;
-        FNoiseFilter.PreviewNeeded(true);
+        FNoiseFilter.DisplayPreview(true);
         FNoiseFilter.FFilterConnector.ValidateAction;
         result := srOk;
       end else
@@ -84,10 +87,22 @@ end;
 
 procedure TFNoiseFilter.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then
+    DisplayComputedImage;
+
   FFilterConnector.ValidateAction;
   ModalResult := mrOK;
 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);
 begin
   FClosing := true;
@@ -106,7 +121,7 @@ end;
 procedure TFNoiseFilter.Radio_NoiseChange(Sender: TObject);
 begin
   if FInitializing then exit;
-  PreviewNeeded(true);
+  DisplayPreview(true);
 end;
 
 procedure TFNoiseFilter.FormCreate(Sender: TObject);
@@ -124,7 +139,7 @@ begin
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
   FInitializing := false;
   InitParams;
-  PreviewNeeded(True);
+  DisplayPreview(True);
 end;
 
 procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject);
@@ -132,7 +147,7 @@ begin
   if FInitializing or FClosing then exit;
   if FComputedLayer = nil then ComputeFilteredLayer;
   FComputedLayer.AlphaFill(SpinEdit_Alpha.Value);
-  PreviewNeeded(False);
+  DisplayPreview(False);
 end;
 
 procedure TFNoiseFilter.InitParams;
@@ -153,9 +168,24 @@ begin
     if Booleans['Grayscale'] then Radio_GrayscaleNoise.Checked:= true;
     if IsDefined('Opacity') then SpinEdit_Alpha.Value := Integers['Opacity'];
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing:= false;
 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;
 var scan: TBGRARandomScanner;
 begin
@@ -166,15 +196,10 @@ begin
   scan.Free;
 end;
 
-procedure TFNoiseFilter.PreviewNeeded(ARecomputeRandom: boolean);
+procedure TFNoiseFilter.DisplayPreview(ARecomputeRandom: boolean);
 begin
   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.

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

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

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

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

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

@@ -1,6 +1,6 @@
 object FPixelate: TFPixelate
   Left = 607
-  Height = 125
+  Height = 144
   Top = 313
   Width = 179
   AutoSize = True
@@ -13,12 +13,12 @@ object FPixelate: TFPixelate
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 125
+  ClientHeight = 144
   ClientWidth = 179
   OnCreate = FormCreate
   OnShow = FormShow
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
     Left = 8
     Height = 23
@@ -35,13 +35,13 @@ object FPixelate: TFPixelate
       Left = 0
       Height = 23
       Top = 0
-      Width = 52
+      Width = 53
       Caption = 'Pixel size :'
       Layout = tlCenter
       ParentColor = False
     end
     object SpinEdit_PixelSize: TSpinEdit
-      Left = 60
+      Left = 61
       Height = 23
       Top = 0
       Width = 65
@@ -85,10 +85,21 @@ object FPixelate: TFPixelate
       TabOrder = 0
     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
     Left = 8
     Height = 25
-    Top = 70
+    Top = 97
     Width = 152
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
@@ -101,21 +112,21 @@ object FPixelate: TFPixelate
       Left = 0
       Height = 25
       Top = 0
-      Width = 42
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Top = 0
-      Width = 62
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     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":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":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)
     Button_Cancel: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     ComboBox_Quality: TComboBox;
     Label_Quality: TLabel;
     Label_PixelSize: TLabel;
@@ -25,6 +26,7 @@ type
     Panel3: TPanel;
     SpinEdit_PixelSize: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure ComboBox_QualityChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
@@ -97,6 +99,8 @@ procedure TFPixelate.Button_OKClick(Sender: TObject);
 var
   qualityStr: TCaption;
 begin
+  if not CheckBox_Preview.Checked then PreviewNeeded;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.LazPaintInstance.Config.SetDefaultPixelateSize(SpinEdit_PixelSize.Value);
   qualityStr := ComboBox_Quality.Text;
@@ -109,9 +113,19 @@ begin
   ModalResult := mrOK;
 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);
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then PreviewNeeded;
 end;
 
 procedure TFPixelate.FormShow(Sender: TObject);
@@ -123,7 +137,8 @@ end;
 
 procedure TFPixelate.SpinEdit_PixelSizeChange(Sender: TObject);
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then PreviewNeeded;
 end;
 
 function TFPixelate.ComputeFilteredLayer: TBGRABitmap;
@@ -155,6 +170,11 @@ begin
     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;
 end;
 

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

@@ -1,6 +1,6 @@
 object FPosterize: TFPosterize
   Left = 345
-  Height = 114
+  Height = 133
   Top = 163
   Width = 148
   AutoSize = True
@@ -13,23 +13,23 @@ object FPosterize: TFPosterize
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 114
+  ClientHeight = 133
   ClientWidth = 148
   OnCreate = FormCreate
   OnShow = FormShow
   Position = poScreenCenter
-  LCLVersion = '1.6.0.4'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
     Left = 8
     Height = 23
     Top = 8
-    Width = 112
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 23
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 1
     object Label_Levels: TLabel
       Left = 0
@@ -57,40 +57,51 @@ object FPosterize: TFPosterize
     Left = 8
     Height = 19
     Top = 39
-    Width = 112
+    Width = 130
     Caption = 'By lightness'
     OnChange = CheckBox_ByLightnessChange
     TabOrder = 0
   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
     Left = 8
     Height = 25
-    Top = 66
-    Width = 112
+    Top = 93
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
     ClientHeight = 25
-    ClientWidth = 112
+    ClientWidth = 130
     TabOrder = 2
     object Button_OK: TButton
       Left = 0
       Height = 25
       Top = 0
-      Width = 42
-      Caption = 'OK'
+      Width = 51
+      Caption = 'rsOK'
       Default = True
       OnClick = Button_OKClick
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 50
+      Left = 59
       Height = 25
       Top = 0
-      Width = 62
+      Width = 71
       Cancel = True
-      Caption = 'Cancel'
+      Caption = 'rsCancel'
       ModalResult = 2
       TabOrder = 1
     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":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":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)
     Button_Cancel: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     CheckBox_ByLightness: TCheckBox;
     Label_Levels: TLabel;
     Panel1: TPanel;
@@ -23,6 +24,7 @@ type
     SpinEdit_Levels: TSpinEdit;
     procedure Button_OKClick(Sender: TObject);
     procedure CheckBox_ByLightnessChange(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure SpinEdit_LevelsChange(Sender: TObject);
@@ -31,7 +33,7 @@ type
     FFilterConnector: TFilterConnector;
     procedure OnTryStopAction({%H-}sender: TFilterConnector);
     procedure InitParams;
-    procedure PreviewNeeded;
+    procedure DisplayPreview;
     { private declarations }
   public
     { public declarations }
@@ -41,7 +43,7 @@ function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVari
 
 implementation
 
-uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, math;
+uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, UResourceStrings, math;
 
 function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult;
 var FPosterize: TFPosterize;
@@ -65,7 +67,7 @@ begin
        FPosterize.FFilterConnector.Parameters.Booleans['Validate'] then
     begin
       FPosterize.InitParams;
-      FPosterize.PreviewNeeded;
+      FPosterize.DisplayPreview;
       FPosterize.FFilterConnector.ValidateAction;
       result := srOk;
     end else
@@ -95,6 +97,8 @@ end;
 
 procedure TFPosterize.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then DisplayPreview;
+
   FFilterConnector.ValidateAction;
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeLevels(SpinEdit_Levels.Value);
   FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeByLightness(CheckBox_ByLightness.Checked);
@@ -103,19 +107,30 @@ end;
 
 procedure TFPosterize.CheckBox_ByLightnessChange(Sender: TObject);
 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;
 
 procedure TFPosterize.FormShow(Sender: TObject);
 begin
   InitParams;
-  PreviewNeeded;
+  DisplayPreview;
   Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top;
 end;
 
 procedure TFPosterize.SpinEdit_LevelsChange(Sender: TObject);
 begin
-  if not FInitializing then PreviewNeeded;
+  if not FInitializing and
+    CheckBox_Preview.Checked then DisplayPreview;
 end;
 
 procedure TFPosterize.OnTryStopAction(sender: TFilterConnector);
@@ -136,10 +151,15 @@ begin
     CheckBox_ByLightness.Checked := FFilterConnector.Parameters.Booleans['ByLightness']
   else
     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;
 end;
 
-procedure TFPosterize.PreviewNeeded;
+procedure TFPosterize.DisplayPreview;
 var params:TVariableSet;
   levels: integer;
 

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

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

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

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

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

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

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

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

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

@@ -1,8 +1,8 @@
 object FTwirl: TFTwirl
   Left = 631
-  Height = 288
+  Height = 249
   Top = 173
-  Width = 173
+  Width = 142
   AutoSize = True
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
@@ -13,48 +13,47 @@ object FTwirl: TFTwirl
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 288
-  ClientWidth = 173
-  DesignTimePPI = 120
-  Font.Height = -15
+  ClientHeight = 249
+  ClientWidth = 142
+  Font.Height = -12
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnShow = FormShow
   Position = poScreenCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
     Left = 8
-    Height = 76
+    Height = 54
     Top = 8
-    Width = 143
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 76
-    ClientWidth = 143
-    Font.Height = -15
+    ClientHeight = 54
+    ClientWidth = 130
+    Font.Height = -12
     ParentFont = False
     TabOrder = 0
     object Label_Radius: TLabel
       Left = 0
-      Height = 34
+      Height = 23
       Top = 0
-      Width = 54
+      Width = 41
       Caption = 'Radius :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       ParentColor = False
       ParentFont = False
     end
     object SpinEdit_Radius: TSpinEdit
-      Left = 62
-      Height = 34
+      Left = 49
+      Height = 23
       Top = 0
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 10
       MaxValue = 10000
       MinValue = 1
@@ -65,22 +64,22 @@ object FTwirl: TFTwirl
     end
     object Label_Angle: TLabel
       Left = 0
-      Height = 34
-      Top = 42
-      Width = 54
+      Height = 23
+      Top = 31
+      Width = 41
       Caption = 'Angle :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       ParentColor = False
       ParentFont = False
     end
     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
       MaxValue = 10000
       MinValue = -10000
@@ -92,51 +91,62 @@ object FTwirl: TFTwirl
   end
   object PaintBox1: TPaintBox
     Left = 8
-    Height = 131
-    Top = 92
-    Width = 143
-    Font.Height = -15
+    Height = 105
+    Top = 70
+    Width = 130
+    Font.Height = -12
     ParentFont = False
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnPaint = PaintBox1Paint
   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
     Left = 8
-    Height = 36
-    Top = 231
-    Width = 143
+    Height = 25
+    Top = 210
+    Width = 130
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 36
-    ClientWidth = 143
-    Font.Height = -15
+    ClientHeight = 25
+    ClientWidth = 130
+    Font.Height = -12
     ParentFont = False
     TabOrder = 1
     object Button_OK: TButton
       Left = 0
-      Height = 36
+      Height = 25
       Top = 0
-      Width = 35
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
-      Font.Height = -15
+      Font.Height = -12
       OnClick = Button_OKClick
       ParentFont = False
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 43
-      Height = 36
+      Left = 59
+      Height = 25
       Top = 0
-      Width = 59
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
-      Font.Height = -15
+      Caption = 'rsCancel'
+      Font.Height = -12
       ModalResult = 2
       ParentFont = False
       TabOrder = 1
@@ -146,7 +156,7 @@ object FTwirl: TFTwirl
     Enabled = False
     Interval = 200
     OnTimer = Timer1Timer
-    left = 64
-    top = 120
+    Left = 51
+    Top = 96
   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":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":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)
     Button_Cancel: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Radius: TLabel;
     Label_Angle: TLabel;
     PaintBox1: TPaintBox;
@@ -26,6 +27,7 @@ type
     SpinEdit_Radius: TSpinEdit;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
@@ -41,8 +43,10 @@ type
     { private declarations }
     FInitializing: boolean;
     FCenter: TPointF;
+    FComputedImage: TBGRABitmap;
     procedure InitParams;
     procedure PreviewNeeded;
+    procedure DisplayComputedImage;
     function ComputeFilteredLayer: TBGRABitmap;
   public
     FilterConnector: TFilterConnector;
@@ -52,7 +56,7 @@ function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses umac;
+uses umac, UResourceStrings;
 
 function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult;
 var
@@ -96,6 +100,7 @@ end;
 
 procedure TFTwirl.FormDestroy(Sender: TObject);
 begin
+  if FComputedImage <> nil then FreeAndNil(FComputedImage);
 end;
 
 procedure TFTwirl.FormShow(Sender: TObject);
@@ -152,8 +157,11 @@ end;
 procedure TFTwirl.Timer1Timer(Sender: TObject);
 begin
   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;
+  CheckBox_Preview.Enabled := true;
 end;
 
 procedure TFTwirl.InitParams;
@@ -171,6 +179,11 @@ begin
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
 end;
 
@@ -179,6 +192,12 @@ begin
   Timer1.Enabled := false;
   Timer1.Enabled := True;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
+end;
+
+procedure TFTwirl.DisplayComputedImage;
+begin
+  FilterConnector.PutImage(FComputedImage,False,False);
 end;
 
 function TFTwirl.ComputeFilteredLayer: TBGRABitmap;
@@ -189,12 +208,23 @@ end;
 
 procedure TFTwirl.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then DisplayComputedImage;
+
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlRadius(SpinEdit_Radius.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultTwirlTurn(SpinEdit_Angle.Value/360);
   ModalResult := mrOK;
 end;
 
+procedure TFTwirl.CheckBox_PreviewChange(Sender: TObject);
+begin
+  if FInitializing then exit;
+  if CheckBox_Preview.Checked then
+    DisplayComputedImage
+  else
+    FilterConnector.RestoreBackup;
+end;
+
 {$R *.lfm}
 
 end.

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

@@ -1,8 +1,8 @@
 object FWaveDisplacement: TFWaveDisplacement
   Left = 306
-  Height = 356
+  Height = 285
   Top = 172
-  Width = 222
+  Width = 168
   AutoSize = True
   BorderIcons = [biSystemMenu]
   BorderStyle = bsDialog
@@ -13,47 +13,47 @@ object FWaveDisplacement: TFWaveDisplacement
   ChildSizing.VerticalSpacing = 8
   ChildSizing.Layout = cclLeftToRightThenTopToBottom
   ChildSizing.ControlsPerLine = 1
-  ClientHeight = 356
-  ClientWidth = 222
-  DesignTimePPI = 120
+  ClientHeight = 285
+  ClientWidth = 168
   OnCreate = FormCreate
+  OnDestroy = FormDestroy
   OnShow = FormShow
   Position = poScreenCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.2.4.0'
   object Panel1: TPanel
     Left = 8
-    Height = 118
+    Height = 85
     Top = 8
-    Width = 191
+    Width = 151
     AutoSize = True
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.VerticalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 118
-    ClientWidth = 191
-    Font.Height = -15
+    ClientHeight = 85
+    ClientWidth = 151
+    Font.Height = -12
     ParentFont = False
     TabOrder = 0
     object Label_Wavelength: TLabel
       Left = 0
-      Height = 34
+      Height = 23
       Top = 0
-      Width = 102
+      Width = 78
       Caption = 'Wavelength :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       ParentColor = False
       ParentFont = False
     end
     object SpinEdit_Wavelength: TSpinEdit
-      Left = 110
-      Height = 34
+      Left = 86
+      Height = 23
       Top = 0
-      Width = 81
-      Constraints.MinWidth = 81
-      Font.Height = -15
+      Width = 65
+      Constraints.MinWidth = 65
+      Font.Height = -12
       Increment = 10
       MaxValue = 10000
       MinValue = 1
@@ -64,22 +64,22 @@ object FWaveDisplacement: TFWaveDisplacement
     end
     object Label_Displacement: TLabel
       Left = 0
-      Height = 34
-      Top = 42
-      Width = 102
+      Height = 23
+      Top = 31
+      Width = 78
       Caption = 'Displacement :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       ParentColor = False
       ParentFont = False
     end
     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
       MaxValue = 1000
       OnChange = SpinEdit_DisplacementChange
@@ -89,22 +89,22 @@ object FWaveDisplacement: TFWaveDisplacement
     end
     object Label_Phase: TLabel
       Left = 0
-      Height = 34
-      Top = 84
-      Width = 102
+      Height = 23
+      Top = 62
+      Width = 78
       Caption = 'Phase :'
-      Font.Height = -15
+      Font.Height = -12
       Layout = tlCenter
       ParentColor = False
       ParentFont = False
     end
     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
       MaxValue = 360
       OnChange = SpinEdit_PhaseChange
@@ -113,52 +113,63 @@ object FWaveDisplacement: TFWaveDisplacement
     end
   end
   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
     OnMouseDown = PaintBox1MouseDown
     OnMouseMove = PaintBox1MouseMove
     OnPaint = PaintBox1Paint
   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
-    Left = 9
-    Height = 36
-    Top = 304
-    Width = 188
+    Left = 8
+    Height = 25
+    Top = 241
+    Width = 151
     BevelOuter = bvNone
     ChildSizing.HorizontalSpacing = 8
     ChildSizing.Layout = cclLeftToRightThenTopToBottom
     ChildSizing.ControlsPerLine = 2
-    ClientHeight = 36
-    ClientWidth = 188
-    Font.Height = -15
+    ClientHeight = 25
+    ClientWidth = 151
+    Font.Height = -12
     ParentFont = False
     TabOrder = 1
     object Button_OK: TButton
       Left = 0
-      Height = 36
+      Height = 25
       Top = 0
-      Width = 35
+      Width = 51
       AutoSize = True
-      Caption = 'OK'
+      Caption = 'rsOK'
       Default = True
-      Font.Height = -15
+      Font.Height = -12
       OnClick = Button_OKClick
       ParentFont = False
       TabOrder = 0
     end
     object Button_Cancel: TButton
-      Left = 43
-      Height = 36
+      Left = 59
+      Height = 25
       Top = 0
-      Width = 59
+      Width = 71
       AutoSize = True
       Cancel = True
-      Caption = 'Cancel'
-      Font.Height = -15
+      Caption = 'rsCancel'
+      Font.Height = -12
       ModalResult = 2
       ParentFont = False
       TabOrder = 1
@@ -168,7 +179,7 @@ object FWaveDisplacement: TFWaveDisplacement
     Enabled = False
     Interval = 200
     OnTimer = Timer1Timer
-    left = 48
-    top = 184
+    Left = 38
+    Top = 147
   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":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":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)
     Button_Cancel: TButton;
     Button_OK: TButton;
+    CheckBox_Preview: TCheckBox;
     Label_Displacement: TLabel;
     Label_Phase: TLabel;
     Label_Wavelength: TLabel;
@@ -28,7 +29,9 @@ type
     SpinEdit_Wavelength: TSpinEdit;
     Timer1: TTimer;
     procedure Button_OKClick(Sender: TObject);
+    procedure CheckBox_PreviewChange(Sender: TObject);
     procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
     procedure FormShow(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; {%H-}Button: TMouseButton;
       {%H-}Shift: TShiftState; X, Y: Integer);
@@ -43,6 +46,7 @@ type
     { private declarations }
     FInitializing: boolean;
     FCenter: TPointF;
+    FComputedImage: TBGRABitmap;
     procedure InitParams;
     procedure PreviewNeeded;
     function ComputeFilteredLayer: TBGRABitmap;
@@ -57,7 +61,7 @@ function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult;
 
 implementation
 
-uses umac, ugraph, LCScaleDPI;
+uses umac, ugraph, UResourceStrings, LCScaleDPI;
 
 function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult;
 var
@@ -100,6 +104,11 @@ begin
   CheckOKCancelBtns(Button_OK{,Button_Cancel});
 end;
 
+procedure TFWaveDisplacement.FormDestroy(Sender: TObject);
+begin
+  if FComputedImage <> nil then FreeAndNil(FComputedImage);
+end;
+
 procedure TFWaveDisplacement.FormShow(Sender: TObject);
 begin
   InitParams;
@@ -159,8 +168,12 @@ end;
 procedure TFWaveDisplacement.Timer1Timer(Sender: TObject);
 begin
   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;
+  CheckBox_Preview.Enabled := true;
 end;
 
 procedure TFWaveDisplacement.InitParams;
@@ -180,6 +193,11 @@ begin
     if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100;
     if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100;
   end;
+
+  CheckBox_Preview.Checked := True;
+  CheckBox_Preview.Caption := rsPreview;
+  Button_OK.Caption := rsOk;
+  Button_Cancel.Caption := rsCancel;
   FInitializing := false;
 end;
 
@@ -188,6 +206,7 @@ begin
   Timer1.Enabled := false;
   Timer1.Enabled := True;
   Button_OK.Enabled := false;
+  CheckBox_Preview.Enabled := false;
 end;
 
 function TFWaveDisplacement.ComputeFilteredLayer: TBGRABitmap;
@@ -199,6 +218,8 @@ end;
 
 procedure TFWaveDisplacement.Button_OKClick(Sender: TObject);
 begin
+  if not CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,false,false);
+
   FilterConnector.ValidateAction;
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementWavelength(SpinEdit_Wavelength.Value);
   FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementAmount(SpinEdit_Displacement.Value);
@@ -206,6 +227,15 @@ begin
   ModalResult := mrOK;
 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}
 
 end.

+ 18 - 1
lazpaint/dialog/uchoosecolorinterface.pas

@@ -122,6 +122,7 @@ type
     procedure HideEditor;
     function GetPreferredSize: TSize;
     procedure AdjustControlHeight;
+    procedure SimpleRedraw;
 
     property DarkTheme: boolean read FDarkTheme write SetDarkTheme;
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
@@ -211,7 +212,7 @@ var
   bmpRect: TRect;
   previewSize: single;
   previewRect: TRectF;
-  c: TBGRAPixel;
+  c, cDigit: TBGRAPixel;
   bmpColorXYSize: integer;
   bmpCursorWidth, i: integer;
   bmpCursorOpacity: byte;
@@ -297,8 +298,19 @@ begin
       c := GetCurrentColor;
       c.alpha := 255;
       with InterfaceToPixel(previewRect) do
+      begin
         Bitmap.RoundRectAntialias(Left, Top, Right - 1, Bottom - 1,
             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;
@@ -1172,5 +1184,10 @@ begin
   Container.Height := round(h + FTextAreaHeight + ExternalMargin);
 end;
 
+procedure TChooseColorInterface.SimpleRedraw;
+begin
+  UpdateColorview(False, False, True);
+end;
+
 end.
 

+ 27 - 6
lazpaint/image/uimage.pas

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

+ 6 - 1
lazpaint/image/uimagediff.pas

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

+ 27 - 0
lazpaint/image/ustatetype.pas

@@ -68,9 +68,12 @@ type
     function GetCount: integer;
     function GetItem(AIndex: integer): TCustomImageDifference;
     function GetTotalCount: integer;
+    procedure SetLockAgglutinate(AValue: boolean);
   protected
     FDiffs: TImageDifferenceList;
     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 GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetChangingBounds: TRect; override;
@@ -89,11 +92,13 @@ type
     procedure Clear;
     procedure Delete(AIndex: integer);
     procedure DeleteFrom(AIndex: integer);
+    function IndexOf(ADiff: TCustomImageDifference): integer;
     function GetLast: TCustomImageDifference;
     function ToString: ansistring; override;
     property Count: integer read GetCount;
     property TotalCount: integer read GetTotalCount;
     property Agglutinate: boolean read FAgglutinate;
+    property LockAgglutinate: boolean read FLockAgglutinate write SetLockAgglutinate;
     property Item[AIndex: integer]: TCustomImageDifference read GetItem; default;
   end;
 
@@ -223,6 +228,14 @@ begin
       inc(result, FDiffs[i].GetCost);
 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;
 var
   i: Integer;
@@ -290,8 +303,17 @@ begin
 end;
 
 procedure TComposedImageDifference.StopAgglutinate;
+var
+  last: TComposedImageDifference;
 begin
   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;
 
 destructor TComposedImageDifference.Destroy;
@@ -365,6 +387,11 @@ begin
     Delete(i);
 end;
 
+function TComposedImageDifference.IndexOf(ADiff: TCustomImageDifference): integer;
+begin
+  result := FDiffs.IndexOf(ADiff);
+end;
+
 function TComposedImageDifference.GetLast: TCustomImageDifference;
 begin
   if Count = 0 then result := nil

+ 14 - 2
lazpaint/lazpaint.lpi

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

+ 1 - 1
lazpaint/lazpaint.lpr

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

+ 12 - 0
lazpaint/lazpaintdialogs.inc

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

+ 28 - 1
lazpaint/lazpaintmainform.lfm

@@ -24,7 +24,7 @@ object FMain: TFMain
   OnUTF8KeyPress = FormUTF8KeyPress
   Position = poDefault
   ShowHint = True
-  LCLVersion = '2.2.0.1'
+  LCLVersion = '2.2.6.0'
   object Panel_ToolbarBackground: TPanel
     Left = 8
     Height = 36
@@ -35,6 +35,7 @@ object FMain: TFMain
     ParentColor = False
     ParentFont = False
     TabOrder = 8
+    OnClick = Panel_ToolbarBackgroundClick
   end
   object Panel_File: TPanel
     Left = 48
@@ -134,6 +135,7 @@ object FMain: TFMain
       Font.Color = clWindowText
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       Transparent = False
     end
@@ -212,6 +214,7 @@ object FMain: TFMain
       Caption = '100%'
       Font.Height = -10
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
   end
@@ -235,6 +238,7 @@ object FMain: TFMain
       Caption = 'Width'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object SpinEdit_PenWidth: TBCTrackbarUpdown
@@ -334,6 +338,7 @@ object FMain: TFMain
       Caption = 'Erase'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar19: TToolBar
@@ -487,6 +492,7 @@ object FMain: TFMain
       Caption = 'Tolerance'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar6: TToolBar
@@ -725,6 +731,7 @@ object FMain: TFMain
       Caption = '9999x9999'
       Font.Height = -10
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
   end
@@ -1327,6 +1334,7 @@ object FMain: TFMain
       Caption = 'Grid'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object Label_GridX: TLabel
@@ -1339,6 +1347,7 @@ object FMain: TFMain
       Caption = 'x'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar13: TToolBar
@@ -1554,6 +1563,7 @@ object FMain: TFMain
       Caption = 'Curve'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar20: TToolBar
@@ -1764,6 +1774,7 @@ object FMain: TFMain
       Caption = 'Text'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
       OnMouseMove = Panel_TextMouseMove
     end
@@ -1923,6 +1934,7 @@ object FMain: TFMain
       Caption = 'Shape'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object Label_PhongBorder: TLabel
@@ -1934,6 +1946,7 @@ object FMain: TFMain
       Caption = 'Border'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar16: TToolBar
@@ -2103,6 +2116,7 @@ object FMain: TFMain
       Caption = 'Altitude'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object SpinEdit_ShapeAltitude: TBCTrackbarUpdown
@@ -2202,6 +2216,7 @@ object FMain: TFMain
       Caption = 'Width'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar17: TToolBar
@@ -2360,6 +2375,7 @@ object FMain: TFMain
       Caption = 'Brush'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object Label_Spacing: TLabel
@@ -2371,6 +2387,7 @@ object FMain: TFMain
       Caption = 'Spacing'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object ToolBar21: TToolBar
@@ -2623,6 +2640,7 @@ object FMain: TFMain
       Caption = 'Ratio'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
   end
@@ -2730,6 +2748,7 @@ object FMain: TFMain
       Caption = 'Blur'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object SpinEdit_TextBlur: TBCTrackbarUpdown
@@ -2817,6 +2836,7 @@ object FMain: TFMain
       Caption = 'Offset'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object SpinEdit_TextShadowX: TBCTrackbarUpdown
@@ -2993,6 +3013,7 @@ object FMain: TFMain
       Caption = 'Pen'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object VectorialFill_Pen: TLCVectorialFillControl
@@ -3177,6 +3198,7 @@ object FMain: TFMain
       Caption = 'Back'
       Font.Height = -12
       Layout = tlCenter
+      ParentColor = False
       ParentFont = False
     end
     object VectorialFill_Back: TLCVectorialFillControl
@@ -5614,6 +5636,11 @@ object FMain: TFMain
       OnUpdate = FileSaveUpdate
       ShortCut = 16465
     end
+    object RenderHypocycloid: TAction
+      Category = 'Render'
+      Caption = 'Hypocycloid...'
+      OnExecute = RenderAnyExecute
+    end
   end
   object ColorDialog1: TColorDialog
     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 = class(TForm)
+    RenderHypocycloid: TAction;
     FileQuickSave: TAction;
     SVGRasterImageList1: TBGRAImageList;
     Panel_TextMore: TPanel;
@@ -521,6 +522,7 @@ type
       {%H-}Y: Integer);
     procedure Panel_TextMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
       {%H-}Y: Integer);
+    procedure Panel_ToolbarBackgroundClick(Sender: TObject);
     procedure PopupToolbarPopup(Sender: TObject);
     procedure PopupToolboxPopup(Sender: TObject);
     procedure SelectionHorizontalFlipUpdate(Sender: TObject);
@@ -782,7 +784,7 @@ type
     procedure UpdateFloodfillToolbar;
     procedure UpdatePerspectiveToolbar;
     function ShowOpenBrushDialog: boolean;
-    function TextSpinEditFocused: boolean;
+    function SpinEditFocused: boolean;
     procedure UpdateBrush;
     procedure UpdateBrushList;
     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_SHIFT then shiftPressed:= true;
     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
       PaintPictureLater;
     end else
@@ -2323,7 +2325,7 @@ begin
     toolProcessKey:= true;
     if (CurrentTool in[ptText,ptEditShape]) and ((UTF8Key = #8) or ((length(UTF8Key)=1) and (UTF8Key[1] in['-','0'..'9']))) then
     begin
-      if TextSpinEditFocused then
+      if SpinEditFocused then
          toolProcessKey:= false;
     end;
     if toolProcessKey and CatchToolKeyPress(UTF8Key) then
@@ -3913,12 +3915,12 @@ procedure TFMain.UpdateSpecialKeys(Shift: TShiftState);
   begin
     if (AShift in Shift) and not APressed then
     begin
-      if ToolManager.ToolKeyDown(ACode) then PaintPictureNow;
+      if CatchToolKeyDown(ACode) then PaintPictureNow;
       APressed:= true;
     end else
     if not (AShift in Shift) and APressed then
     begin
-      if ToolManager.ToolKeyUp(ACode) then PaintPictureNow;
+      if CatchToolKeyUp(ACode) then PaintPictureNow;
       APressed:= false;
     end;
   end;
@@ -4380,7 +4382,7 @@ begin
     else
       exit;
   end;
-  if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then Layout.FocusImage;
+  if SpinEditFocused then Layout.FocusImage;
 end;
 
 procedure TFMain.PictureOnPaint(Sender: TObject);

+ 14 - 5
lazpaint/lazpainttype.pas

@@ -7,7 +7,7 @@ interface
 
 uses
   Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, UConfig, UImage, UTool, Forms, BGRALayers, Graphics, Menus,
-  UScripting, Dialogs, Controls
+  UScripting, Dialogs, Controls, LCLType
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
 
 const
@@ -73,7 +73,8 @@ type
                     pfEmboss, pfPhong, pfContour, pfGrayscale, pfNegative, pfLinearNegative, pfComplementaryColor, pfNormalize,
                     pfSphere, pfTwirl, pfWaveDisplacement, pfCylinder, pfPlane,
                     pfPerlinNoise,pfCyclicPerlinNoise,pfClouds,pfCustomWater,pfWater,pfRain,pfWood,pfWoodVertical,pfPlastik,pfMetalFloor,pfCamouflage,
-                    pfSnowPrint,pfStone,pfRoundStone,pfMarble);
+                    pfSnowPrint,pfStone,pfRoundStone,pfMarble,
+                    pfHypocycloid);
 
 const
   PictureFilterStr : array[TPictureFilter] of string =
@@ -83,7 +84,8 @@ const
                     'Emboss', 'Phong', 'Contour', 'Grayscale', 'Negative', 'LinearNegative', 'ComplementaryColor', 'Normalize',
                     'Sphere', 'Twirl', 'WaveDisplacement', 'Cylinder', 'Plane',
                     '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 =
                    (false,
@@ -92,7 +94,8 @@ const
                     false, true, false, false, false, false, false, false,
                     false, false, false, false, false,
                     false,false,true,true,true,true,true,true,true,true,true,
-                    true,true,true,true);
+                    true,true,true,true,
+                    true);
 
 const
   MinZoomForGrid = 4;
@@ -268,6 +271,7 @@ type
     procedure ColorToFChooseColor; virtual; abstract;
     procedure ExitColorEditor; virtual; abstract;
     function ColorEditorActive: boolean; virtual; abstract;
+    procedure NotifyColorBinding; virtual; abstract;
     function GetColor(ATarget: TColorTarget): TBGRAPixel;
     procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel);
     function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string;
@@ -290,6 +294,7 @@ type
     function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract;
     function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
+    function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; virtual; abstract;
     procedure ShowPrintDlg; virtual; abstract;
     function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; 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 AddColorToPalette(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;
 
@@ -339,6 +345,9 @@ type
 
     procedure ImageListWindowVisibleKeyDown(var Key: Word; Shift: TShiftState); 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 ImageListWindowHeight: integer read GetImageListWindowHeight write SetImageListWindowHeight;
     property ImageListWindowVisible: boolean read GetImageListWindowVisible write SetImageListWindowVisible;
@@ -385,7 +394,7 @@ function CSSToPascalCase(AIdentifier: string): string;
 
 implementation
 
-uses LCLType, BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill;
+uses BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill;
 
 function LazPaintVersionStr: string;
 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);
   begin
     vf.PopupMenu := nil;
+    vf.AllowKeyInput:= false;
     vf.VerticalPadding:= DoScaleY(6, OriginalDPI);
     vf.OnChooseColor :=  @VectorialFill_ChooseColor;
     vf.OnTextureClick := @VectorialFill_TextureClick;
@@ -657,11 +658,13 @@ begin
   end;
 end;
 
-function TFMain.TextSpinEditFocused: boolean;
+function TFMain.SpinEditFocused: boolean;
+var ctrl: TWinControl;
 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;
 
 procedure TFMain.UpdateBrush;
@@ -695,14 +698,14 @@ end;
 
 function TFMain.CatchToolKeyDown(var AKey: Word): boolean;
 begin
-  if Assigned(FLayout) then
+  if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then
     result := FLayout.CatchToolKeyDown(AKey)
     else result := false;
 end;
 
 function TFMain.CatchToolKeyUp(var AKey: Word): boolean;
 begin
-  if Assigned(FLayout) then
+  if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then
     result := FLayout.CatchToolKeyUp(AKey)
     else result := false;
 end;
@@ -821,12 +824,15 @@ begin
   VectorialFill_Pen.Height := min(VectorialFill_Pen.ToolIconSize + VectorialFill_Pen.VerticalPadding,
                                Panel_SwapColor.ClientHeight - VectorialFill_Pen.Top - 1);
   VectorialFill_Pen.Tag := 0;
+  VectorialFill_Pen.AllowKeyInput:= false;
   VectorialFill_Back.Height := min(VectorialFill_Back.ToolIconSize + VectorialFill_Back.VerticalPadding,
                                Panel_SwapColor.ClientHeight - VectorialFill_Back.Top - 1);
   VectorialFill_Back.Tag := 0;
+  VectorialFill_Back.AllowKeyInput:= false;
   VectorialFill_Outline.Height := min(VectorialFill_Outline.ToolIconSize + VectorialFill_Outline.VerticalPadding,
                                   Panel_SwapColor.ClientHeight - VectorialFill_Outline.Top - 1);
   VectorialFill_Outline.Tag := 0;
+  VectorialFill_Outline.AllowKeyInput:= false;
   Panel_PenFill.Height := Panel_SwapColor.Height;
   Panel_BackFill.Height := Panel_SwapColor.Height;
   Panel_OutlineFill.Height := Panel_SwapColor.Height;
@@ -1612,6 +1618,7 @@ begin
   AFillControl.Height := AFillControl.PreferredSize.cy;
   APanel.Height := AFillControl.Top + AFillControl.Height + DoScaleY(3, OriginalDPI);
   AFillControl.Tag := 1;
+  AFillControl.AllowKeyInput:= true;
   HideFill(3000, true);
 end;
 
@@ -1691,6 +1698,11 @@ begin
   ShowTextMore;
 end;
 
+procedure TFMain.Panel_ToolbarBackgroundClick(Sender: TObject);
+begin
+  Layout.FocusImage;
+end;
+
 procedure TFMain.PopupToolbarPopup(Sender: TObject);
 begin
   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)"
 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
 msgid "Adjust curves"
 msgstr "ضبط المنحنيات"
@@ -245,16 +235,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "تدرج"
 msgid "Preset"
 msgstr "مسبقا"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "إلغاء"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "تحرير القناع"
@@ -317,11 +282,6 @@ msgstr "تحرير القناع"
 msgid "Load mask..."
 msgstr "تحميل قناع"
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "موافق"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "ضبابية مخصصة"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "تطبيق الوضيفة"
@@ -474,6 +414,14 @@ msgstr ""
 msgid "Number of sides:"
 msgstr ""
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "قائمة الصور"
@@ -1504,6 +1452,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "ضجيج بيرلين دائري"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "رخام"
@@ -2090,16 +2042,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2169,16 +2111,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "مرشح الضجيج"
@@ -2316,16 +2248,6 @@ msgstr ""
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2395,16 +2317,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2420,16 +2332,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2444,6 +2346,7 @@ msgid "Levels :"
 msgstr "المستوى :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr ""
 
@@ -2537,16 +2440,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2557,16 +2450,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr ""
@@ -2685,16 +2568,6 @@ msgstr ""
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr ""
@@ -2704,16 +2577,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2739,16 +2602,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2764,16 +2617,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr ""
@@ -3480,6 +3323,12 @@ msgstr "من غير المعقول حفظ الصورة الكبيرة في تن
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "موافق"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "حسنا"
@@ -3547,6 +3396,11 @@ msgstr ""
 msgid "Preset name"
 msgstr "الإسم مسبقا"
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "Настройка на кривите"
@@ -245,16 +235,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 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
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 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
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "Отенък"
 msgid "Preset"
 msgstr "Предварително зададени"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отказ"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Обработка на маска..."
@@ -317,11 +282,6 @@ msgstr "Обработка на маска..."
 msgid "Load mask..."
 msgstr "Зареждане на маска..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Добре"
-
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "Нагласено размиване"
 msgid "Open grayscale file"
 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
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Прилагане на функцията"
@@ -474,6 +414,14 @@ msgstr "Преливане на непрозрачността"
 msgid "Number of sides:"
 msgstr "Брой страни:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Списък с изображения"
@@ -1500,6 +1448,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgstr "Повтарящ пърлинов шум"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Мрамор"
@@ -2077,16 +2029,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
@@ -2156,16 +2098,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Шумов филтър"
@@ -2303,16 +2235,6 @@ msgstr ""
 msgid "Remove selected light"
 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
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
@@ -2382,16 +2304,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 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
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
@@ -2407,16 +2319,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2431,6 +2333,7 @@ msgid "Levels :"
 msgstr "Равнища:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Преглед"
 
@@ -2525,16 +2428,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
@@ -2545,16 +2438,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Дъжд"
@@ -2673,16 +2556,6 @@ msgstr "32 разряда"
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr "Изостряне/ Изглаждане"
@@ -2692,16 +2565,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 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
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
@@ -2727,16 +2590,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 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
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
@@ -2752,16 +2605,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr ""
@@ -3462,6 +3305,12 @@ msgstr ""
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Добре"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Добре"
@@ -3529,6 +3378,12 @@ msgstr ""
 msgid "Preset name"
 msgstr "Предварително зададено име"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Преглед"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "точки"

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

@@ -58,16 +58,6 @@ msgstr "Licence:"
 msgid "Open source (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
 msgid "Adjust curves"
 msgstr "Nastavit křivky"
@@ -231,16 +221,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -254,16 +234,6 @@ msgstr "Násobek"
 msgid "Shift"
 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
 msgid "Colorize"
 msgstr "Obarvení"
@@ -286,11 +256,6 @@ msgstr "Odstín"
 msgid "Preset"
 msgstr "Předvolba"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "tfcustomblur.button_cancel.caption"
-msgid "Cancel"
-msgstr "Zrušit"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Upravit masku..."
@@ -299,11 +264,6 @@ msgstr "Upravit masku..."
 msgid "Load mask..."
 msgstr "Načíst masku..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "tfcustomblur.button_ok.caption"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgid "Custom blur"
 msgstr "Vlastní rozmazání"
@@ -312,16 +272,6 @@ msgstr "Vlastní rozmazání"
 msgid "Open grayscale file"
 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
 msgid "Emboss"
 msgstr "Vytlačit"
@@ -338,16 +288,6 @@ msgstr "Průhledné"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Použít funkci"
@@ -450,6 +390,14 @@ msgstr "Gradient průhlednosti"
 msgid "Number of sides:"
 msgstr "Počet stran:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Seznam obrázků"
@@ -1421,6 +1369,10 @@ msgstr "Voda s vlastními barvami"
 msgid "Cyclic Perlin noise"
 msgstr "Kruhový Perlinův šum"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Mramor"
@@ -1951,16 +1903,6 @@ msgstr "Zvětšit na původní bodovou velikost"
 msgid "Zoom out"
 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
 msgid "Motion blur"
 msgstr "Pohybové rozmazání"
@@ -2028,16 +1970,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Šumový filtr"
@@ -2169,16 +2101,6 @@ msgstr "Přidat bodové světlo"
 msgid "Remove selected light"
 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
 msgid "Shaded map"
 msgstr "Stínová mapa"
@@ -2246,16 +2168,6 @@ msgstr "Barva pera"
 msgid "Current texture"
 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
 msgid "Pixelate"
 msgstr "Pixelizace"
@@ -2269,16 +2181,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2293,6 +2195,7 @@ msgid "Levels :"
 msgstr "Úrovně:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Náhled"
 
@@ -2386,16 +2289,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2406,16 +2299,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Déšť"
@@ -2533,16 +2416,6 @@ msgstr "32 bitů"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Ostření/Vyhlazení"
@@ -2551,16 +2424,6 @@ msgstr "Ostření/Vyhlazení"
 msgid "Amount :"
 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
 msgid "Shift colors"
 msgstr "Posunout barvy"
@@ -2585,16 +2448,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgid "Twirl"
 msgstr "Víření"
@@ -2608,16 +2461,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Posunutí vlny"
@@ -3313,6 +3156,12 @@ msgstr "Není rozumně ukládat tak velký obrázek v tomto formátu."
 msgid "№"
 msgstr "Č."
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Ok"
@@ -3379,6 +3228,12 @@ msgstr "Obarvit vrstvu použitím palety"
 msgid "Preset name"
 msgstr "Jméno předvolby"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Náhled"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"
@@ -3632,3 +3487,4 @@ msgstr "Přiblížit sadu vrstev"
 #: uresourcestrings.rszoomlayerstackout
 msgid "Zoom layer stack out"
 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)"
 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
 msgid "Adjust curves"
 msgstr "Farbkurven anpassen"
@@ -255,16 +245,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -280,16 +260,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -314,11 +284,6 @@ msgstr "Farbton"
 msgid "Preset"
 msgstr "Voreingestellt"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Abbruch"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Maske bearbeiten..."
@@ -327,11 +292,6 @@ msgstr "Maske bearbeiten..."
 msgid "Load mask..."
 msgstr "Maske laden..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -341,16 +301,6 @@ msgstr "Benutzerdefinierter Weichzeichner"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -369,16 +319,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Funktion anwenden"
@@ -484,6 +424,14 @@ msgstr "Deckkraft Verlauf"
 msgid "Number of sides:"
 msgstr "Anzahl der Seiten:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Bilderliste"
@@ -1515,6 +1463,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Perlin-Rauschen (zyklisch)"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmor"
@@ -2101,16 +2053,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2180,16 +2122,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Rauschfilter"
@@ -2327,16 +2259,6 @@ msgstr "Lichtpunkt hinzufügen"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2406,16 +2328,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2431,16 +2343,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2455,6 +2357,7 @@ msgid "Levels :"
 msgstr "Stufen:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Vorschau"
 
@@ -2548,16 +2451,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2568,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "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
 msgid "Rain"
 msgstr "Regen"
@@ -2696,16 +2579,6 @@ msgstr "32 bits"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Scharfzeichnen/Weichzeichnen"
@@ -2715,16 +2588,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2750,16 +2613,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2775,16 +2628,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "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
 msgid "Wave displacement"
 msgstr "Wellen-Wandel"
@@ -3491,6 +3334,12 @@ msgstr "Es wird nicht empfohlen, ein so großes Bild in diesem Dateiformat zu sp
 msgid "№"
 msgstr "Nr."
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "OK"
@@ -3558,6 +3407,12 @@ msgstr "Posterisierung der Ebene mit der Palette anwenden"
 msgid "Preset name"
 msgstr "Voreingestellter Name"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Vorschau"
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "Ajustar curvas"
@@ -247,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "Matiz"
 msgid "Preset"
 msgstr "Preajuste"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Editar máscara.."
@@ -319,11 +284,6 @@ msgstr "Editar máscara.."
 msgid "Load mask..."
 msgstr "Abrir máscara.."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Aceptar"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "Desenfoque personalizado"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Aplicar función"
@@ -473,6 +413,14 @@ msgstr "Opacidad de degradado"
 msgid "Number of sides:"
 msgstr "Número de lados:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Lista de imágenes"
@@ -1498,6 +1446,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Ruido Perlin Cíclico"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Mármol"
@@ -2083,16 +2035,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2162,16 +2104,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Ruido"
@@ -2309,16 +2241,6 @@ msgstr "Agregar una luz puntual"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2388,16 +2310,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2413,16 +2325,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2437,6 +2339,7 @@ msgid "Levels :"
 msgstr "Niveles:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Vista previa"
 
@@ -2530,16 +2433,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2550,16 +2443,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Lluvia"
@@ -2678,16 +2561,6 @@ msgstr "32 bits"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Nítido/Suave"
@@ -2697,16 +2570,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2732,16 +2595,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2757,16 +2610,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Desplazamiento de onda"
@@ -3486,6 +3329,12 @@ msgstr "No es razonable guardar una imagen tan grande con este formato."
 msgid "№"
 msgstr "Nº"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Aceptar"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "OK"
@@ -3553,6 +3402,12 @@ msgstr "Posterizar capa usando paleta"
 msgid "Preset name"
 msgstr "Nombre de preajuste"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Vista previa"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"
@@ -3813,3 +3668,4 @@ msgstr "Hacer zoom en capas"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 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)"
 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
 msgid "Adjust curves"
 msgstr "Muokkaa käyriä"
@@ -237,16 +227,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 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
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 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
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Värisävy"
 msgid "Preset"
 msgstr "Esiasetus"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Peru"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Muokkaa maskia"
@@ -309,11 +274,6 @@ msgstr "Muokkaa maskia"
 msgid "Load mask..."
 msgstr "Lataa maski"
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Maskin mukainen sumennus"
 msgid "Open grayscale file"
 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
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr ""
@@ -463,6 +403,14 @@ msgstr "Liukuva peittävyys"
 msgid "Number of sides:"
 msgstr "Sivujen määrä:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Kuvaluettelo"
@@ -1494,6 +1442,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgstr "Jaksottainen Perlin kohina"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmori"
@@ -2081,16 +2033,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
@@ -2160,16 +2102,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Kohinasuodatin"
@@ -2307,16 +2239,6 @@ msgstr ""
 msgid "Remove selected light"
 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
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
@@ -2387,16 +2309,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 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
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
@@ -2412,16 +2324,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 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
 msgctxt "TFPOSTERIZE.CAPTION"
 msgid "Posterize"
@@ -2436,6 +2338,7 @@ msgid "Levels :"
 msgstr ""
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr ""
 
@@ -2529,16 +2432,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
@@ -2550,16 +2443,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Sade"
@@ -2678,16 +2561,6 @@ msgstr ""
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr "Terävöitä/Pehmennä"
@@ -2697,16 +2570,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 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
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
@@ -2732,16 +2595,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 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
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
@@ -2757,16 +2610,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr ""
@@ -3472,6 +3315,11 @@ msgstr ""
 msgid "№"
 msgstr ""
 
+#: uresourcestrings.rsok
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr ""
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Ok"
@@ -3539,6 +3387,11 @@ msgstr ""
 msgid "Preset name"
 msgstr ""
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr ""

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

@@ -1,13 +1,15 @@
 msgid ""
 msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
 "PO-Revision-Date: \n"
 "Last-Translator: circular\n"
 "Language-Team: \n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
 
 #: tablet.getprocfailed
 #, object-pascal-format
@@ -62,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (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
 msgid "Adjust curves"
 msgstr "Ajuster les courbes"
@@ -245,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -270,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -304,11 +276,6 @@ msgstr "Nuances"
 msgid "Preset"
 msgstr "Prédéfini"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuler"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Éditer un masque..."
@@ -317,11 +284,6 @@ msgstr "Éditer un masque..."
 msgid "Load mask..."
 msgstr "Charger un masque..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -331,16 +293,6 @@ msgstr "Flou personnalisé"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -359,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "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
 msgid "Apply function"
 msgstr "Appliquer la fonction"
@@ -474,6 +416,15 @@ msgstr "Gradient d'opacité"
 msgid "Number of sides:"
 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
 msgid "Image List"
 msgstr "Liste d'images"
@@ -1506,6 +1457,11 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Bruit de Perlin cyclique"
 
+#: tfmain.renderhypocycloid.caption
+msgctxt "tfmain.renderhypocycloid.caption"
+msgid "Hypocycloid..."
+msgstr "Hypocycloïde..."
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marbre"
@@ -2092,16 +2048,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2171,16 +2117,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Bruit"
@@ -2318,16 +2254,6 @@ msgstr "Ajouter une lumière ponctuelle"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2397,16 +2323,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2422,16 +2338,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2446,6 +2352,7 @@ msgid "Levels :"
 msgstr "Niveaux :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Aperçu"
 
@@ -2539,16 +2446,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2559,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Pluie"
@@ -2687,16 +2574,6 @@ msgstr "32 bits"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Accentuer/Lisser"
@@ -2706,16 +2583,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2741,16 +2608,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2766,16 +2623,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 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 "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Ok"
@@ -3567,6 +3420,11 @@ msgstr "Postériser le calque en utilisant la palette"
 msgid "Preset name"
 msgstr "Nom"
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Aperçu"
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "Aggiusta curve"
@@ -237,16 +227,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Tonalità"
 msgid "Preset"
 msgstr "Predefinisci"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancella"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Edita maschera"
@@ -309,11 +274,6 @@ msgstr "Edita maschera"
 msgid "Load mask..."
 msgstr "Carica maschera"
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr ""
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Sfocatura ottimale"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Applica funzione"
@@ -463,6 +403,14 @@ msgstr "Gradiente di opacità"
 msgid "Number of sides:"
 msgstr ""
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr ""
@@ -1493,6 +1441,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr ""
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmo"
@@ -2079,16 +2031,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2158,16 +2100,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Filtro di rumore"
@@ -2305,16 +2237,6 @@ msgstr "Aggiungi punto luce"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2384,16 +2306,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2409,16 +2321,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2433,6 +2335,7 @@ msgid "Levels :"
 msgstr "Livelli"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Anteprima"
 
@@ -2526,16 +2429,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2546,16 +2439,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Pioggia"
@@ -2674,16 +2557,6 @@ msgstr ""
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr ""
@@ -2693,16 +2566,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2729,16 +2592,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2754,16 +2607,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr ""
@@ -3487,6 +3330,11 @@ msgstr ""
 msgid "№"
 msgstr ""
 
+#: uresourcestrings.rsok
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr ""
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr ""
@@ -3555,6 +3403,12 @@ msgstr ""
 msgid "Preset name"
 msgstr ""
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Anteprima"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr ""

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

@@ -62,16 +62,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "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
 msgid "Adjust curves"
 msgstr ""
@@ -245,16 +235,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -270,16 +250,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -304,11 +274,6 @@ msgstr "色相"
 msgid "Preset"
 msgstr ""
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "キャンセル"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "マスク編集"
@@ -317,11 +282,6 @@ msgstr "マスク編集"
 msgid "Load mask..."
 msgstr "マスク読み込み"
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -331,16 +291,6 @@ msgstr "カスタムブラー"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -359,16 +309,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr ""
@@ -471,6 +411,14 @@ msgstr ""
 msgid "Number of sides:"
 msgstr ""
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr ""
@@ -1501,6 +1449,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Cyclic Perlinノイズ"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "マーブル大理石"
@@ -2088,16 +2040,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2167,16 +2109,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr ""
@@ -2314,16 +2246,6 @@ msgstr ""
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2393,16 +2315,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2418,16 +2330,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2442,6 +2344,7 @@ msgid "Levels :"
 msgstr ""
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr ""
 
@@ -2535,16 +2438,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2555,16 +2448,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr ""
@@ -2683,16 +2566,6 @@ msgstr ""
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr ""
@@ -2702,16 +2575,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2737,16 +2600,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2762,16 +2615,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr ""
@@ -3477,6 +3320,12 @@ msgstr ""
 msgid "№"
 msgstr ""
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr ""
@@ -3544,6 +3393,11 @@ msgstr ""
 msgid "Preset name"
 msgstr ""
 
+#: uresourcestrings.rspreview
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr ""
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr ""

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

@@ -65,16 +65,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "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
 msgid "Adjust curves"
 msgstr "Sgaddi izligen"
@@ -248,16 +238,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -273,16 +253,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -307,11 +277,6 @@ msgstr "Tiɣmi"
 msgid "Preset"
 msgstr "Azwir-ɣewwar"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Sefsex"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Ẓreg tagelmust..."
@@ -320,11 +285,6 @@ msgstr "Ẓreg tagelmust..."
 msgid "Load mask..."
 msgstr "Sali-d tagelmust..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Ih"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -334,16 +294,6 @@ msgstr "Aluɣu yugnen"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -362,16 +312,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Snes tawuri"
@@ -477,6 +417,14 @@ msgstr "Tiḍullest n ufesniw"
 msgid "Number of sides:"
 msgstr "Amḍan n idisan:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Tabdart n tugniwin"
@@ -1507,6 +1455,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Asxerxec n Perlin s wallus"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Aṛxam"
@@ -2092,16 +2044,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2171,16 +2113,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Tastayt n usxerxec"
@@ -2318,16 +2250,6 @@ msgstr "Rnu tafat tunqiḍt"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2397,16 +2319,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2422,16 +2334,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2446,6 +2348,7 @@ msgid "Levels :"
 msgstr "Iswiren :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Tamuɣli"
 
@@ -2539,16 +2442,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2559,16 +2452,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Agfur"
@@ -2687,16 +2570,6 @@ msgstr "32 n ibiten"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Semsed/Mzi"
@@ -2706,16 +2579,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2741,16 +2604,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2766,16 +2619,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Asekḥer n tayyugt"
@@ -3499,6 +3342,12 @@ msgstr "Ur iwulem ara ad teskelseḍ tugna s umasal-agi n ufaylu."
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Ih"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Ih"
@@ -3567,6 +3416,12 @@ msgstr "Talɣa n ubeqqiḍ i tissi s useqdec n tpaliḍt"
 msgid "Preset name"
 msgstr "Sbadu isem"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Tamuɣli"
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "Mainīt līknes"
@@ -253,16 +243,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -278,16 +258,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -312,11 +282,6 @@ msgstr "Nokrāsa"
 msgid "Preset"
 msgstr "Iestatījumi"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Atcelt"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Labot masku ..."
@@ -325,11 +290,6 @@ msgstr "Labot masku ..."
 msgid "Load mask..."
 msgstr "Ielasīt masku ..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "Labi"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -339,16 +299,6 @@ msgstr "Pielāgota izpludināšana"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -367,16 +317,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Pielietot funkciju"
@@ -482,6 +422,14 @@ msgstr "Izgaišana uz malām"
 msgid "Number of sides:"
 msgstr "Malu skaits:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Attēlu saraksts"
@@ -1510,6 +1458,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Perlina troksnis flīzēm"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmors"
@@ -2095,16 +2047,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2174,16 +2116,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Trokšņu filtrs"
@@ -2322,16 +2254,6 @@ msgstr "Pievienot punktveida gaismas avotu"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2401,16 +2323,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2426,16 +2338,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2450,6 +2352,7 @@ msgid "Levels :"
 msgstr "Līmeņi:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Priekšskatījums"
 
@@ -2543,16 +2446,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2563,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Lietus"
@@ -2691,16 +2574,6 @@ msgstr "32 biti"
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr "Asināt/Nogludināt"
@@ -2710,16 +2583,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2745,16 +2608,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2770,16 +2623,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 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 "№"
 msgstr "Nr. "
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "Labi"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Labi"
@@ -3571,6 +3420,12 @@ msgstr "Samazināt krāsu skaitu izmantojot paleti"
 msgid "Preset name"
 msgstr "Iestatījumu vārds"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Priekšskatījums"
+
 #: uresourcestrings.rspx
 msgid "px"
 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)"
 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
 msgid "Adjust curves"
 msgstr "Krommen aanpassen"
@@ -171,9 +161,7 @@ msgstr "Basale SVG"
 
 #: tfblendop.label_svgover.hint
 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
 msgid "Browse images"
@@ -253,16 +241,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -278,16 +256,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -312,11 +280,6 @@ msgstr "Kleurtint"
 msgid "Preset"
 msgstr "Voorinstelling"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Annuleren"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Masker bewerken..."
@@ -325,11 +288,6 @@ msgstr "Masker bewerken..."
 msgid "Load mask..."
 msgstr "Masker laden..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -339,16 +297,6 @@ msgstr "Aangepaste vervaging"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -367,16 +315,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Functie toepassen"
@@ -482,6 +420,14 @@ msgstr "Dekkingsgradiënt"
 msgid "Number of sides:"
 msgstr "Aantal zijden:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Afbeeldingslijst"
@@ -1507,6 +1453,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Cyclische Perlin-ruis"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmer"
@@ -2091,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2170,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Ruisfilter"
@@ -2317,16 +2247,6 @@ msgstr "Voeg een puntlicht toe"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2396,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2421,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2445,6 +2345,7 @@ msgid "Levels :"
 msgstr "Niveaus :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Voorbeeld"
 
@@ -2538,16 +2439,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2558,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Regen"
@@ -2686,16 +2567,6 @@ msgstr "32 bits"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Verscherpen/Gladstrijken"
@@ -2705,16 +2576,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2740,16 +2601,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2765,16 +2616,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Golf verplaatsing"
@@ -2908,9 +2749,7 @@ msgstr "CMD"
 
 #: uresourcestrings.rscolordescription
 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
 msgid "Color overlay"
@@ -2931,8 +2770,7 @@ msgstr "Weet u zeker dat u deze %1-bestanden uit de container wilt verwijderen?"
 
 #: uresourcestrings.rsconfirmmovemultipletotrash
 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
 msgid "Are you sure you want to move this file to the trash?"
@@ -3044,8 +2882,7 @@ msgstr "Einde zonder begin"
 
 #: uresourcestrings.rsenterfolderorcontainername
 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
 msgid "Enter layer name:"
@@ -3410,9 +3247,7 @@ msgstr "Mitchell"
 
 #: uresourcestrings.rsmorethanonefile
 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
 msgid "Moving or rotating selection"
@@ -3477,14 +3312,18 @@ msgstr "Er is niets om op te halen"
 
 #: uresourcestrings.rsnotreasonableformat
 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
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "OK"
@@ -3551,6 +3390,12 @@ msgstr "Posterisatie laag met behulp palet"
 msgid "Preset name"
 msgstr "Voorinstellingsnaam"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Voorbeeld"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"
@@ -3710,14 +3555,11 @@ msgstr "Texture mapping"
 
 #: uresourcestrings.rstherearenocheckeditems
 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
 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
 msgid "To do"
@@ -3812,3 +3654,4 @@ msgstr "Inzoomen in lagenoverzicht"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 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)"
 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
 msgid "Adjust curves"
 msgstr "Dostosuj krzywe kolorów"
@@ -255,16 +245,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -280,16 +260,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -314,11 +284,6 @@ msgstr "Odcień"
 msgid "Preset"
 msgstr "Zalecany"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Anuluj"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Edytuj maskę..."
@@ -327,11 +292,6 @@ msgstr "Edytuj maskę..."
 msgid "Load mask..."
 msgstr "Ładuj maskę..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -341,16 +301,6 @@ msgstr "Rozmycie niestandardowe"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -369,16 +319,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Zastosuj funkcję"
@@ -484,6 +424,14 @@ msgstr "Gradient krycia"
 msgid "Number of sides:"
 msgstr "Liczba stron:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Lista obrazów"
@@ -1515,6 +1463,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Szum Perlina (cykliczny)"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmur"
@@ -2101,16 +2053,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2180,16 +2122,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Filtr szumu"
@@ -2327,16 +2259,6 @@ msgstr "Dodaj światło punktowe"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2406,16 +2328,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2431,16 +2343,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2455,6 +2357,7 @@ msgid "Levels :"
 msgstr "Poziomy:"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Podgląd"
 
@@ -2548,16 +2451,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2568,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Deszcz"
@@ -2696,16 +2579,6 @@ msgstr "32 bity"
 msgid "MioMap"
 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
 msgid "Sharpen/Smooth"
 msgstr "Wyostrz / Wygładź"
@@ -2715,16 +2588,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2750,16 +2613,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2775,16 +2628,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Przesunięcie fali"
@@ -3495,6 +3338,12 @@ msgstr "Nie zaleca się zapisywania tak dużego obrazu w tym formacie pliku."
 msgid "№"
 msgstr "Nr."
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "OK"
@@ -3562,6 +3411,12 @@ msgstr "Posteryzuj warstwę za pomocą palety"
 msgid "Preset name"
 msgstr "Wstępna nazwa"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Podgląd"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"

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

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

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

@@ -64,16 +64,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
 msgid "Open source (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
 msgid "Adjust curves"
 msgstr "Ajustar curvas"
@@ -247,16 +237,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 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
 msgctxt "TFCOLORINTENSITY.CAPTION"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
 msgid "Shift"
 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
 msgctxt "TFCOLORIZE.CAPTION"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "Tonalidade"
 msgid "Preset"
 msgstr "Predefinida"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Cancelar"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Editar máscara..."
@@ -319,11 +284,6 @@ msgstr "Editar máscara..."
 msgid "Load mask..."
 msgstr "Abrir máscara..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "TFCUSTOMBLUR.CAPTION"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "Desfoque personalizado"
 msgid "Open grayscale file"
 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
 msgctxt "TFEMBOSS.CAPTION"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Aplicar função"
@@ -473,6 +413,14 @@ msgstr "Gradiente de opacidade"
 msgid "Number of sides:"
 msgstr "Número de lados:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Lista de Imagens"
@@ -1502,6 +1450,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
 msgid "Cyclic Perlin noise"
 msgstr "Ruído Perlin cíclica"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Mármore"
@@ -2088,17 +2040,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "TFMOTIONBLUR.CAPTION"
 msgid "Motion blur"
@@ -2170,17 +2111,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Filtro de ruído"
@@ -2319,16 +2249,6 @@ msgstr "Adicione uma luz pontual"
 msgid "Remove selected light"
 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
 msgctxt "TFPHONGFILTER.CAPTION"
 msgid "Shaded map"
@@ -2398,17 +2318,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
 msgid "Current texture"
 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
 msgctxt "TFPIXELATE.CAPTION"
 msgid "Pixelate"
@@ -2424,17 +2333,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
 msgid "Quality :"
 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
 msgctxt "TFPOSTERIZE.CAPTION"
 msgid "Posterize"
@@ -2449,6 +2347,7 @@ msgid "Levels :"
 msgstr "Níveis :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Prévia"
 
@@ -2542,16 +2441,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "TFRADIALBLUR.CAPTION"
 msgid "Radial blur"
@@ -2562,17 +2451,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Chuva"
@@ -2693,16 +2571,6 @@ msgstr "32 bits"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Nitidez/Suave"
@@ -2712,17 +2580,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
 msgid "Amount :"
 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
 msgctxt "TFSHIFTCOLORS.CAPTION"
 msgid "Shift colors"
@@ -2748,17 +2605,6 @@ msgctxt "TFTOOLBOX.CAPTION"
 msgid "Tools"
 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
 msgctxt "TFTWIRL.CAPTION"
 msgid "Twirl"
@@ -2774,17 +2620,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Deslocamento de onda"
@@ -3491,6 +3326,12 @@ msgstr "Não é razoável salvar uma imagem grande neste formato de arquivo."
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "OK"
@@ -3559,6 +3400,12 @@ msgstr "Posterizar camada usando paleta"
 msgid "Preset name"
 msgstr "Nome predefinido"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Prévia"
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "Регулировка кривых"
@@ -242,16 +232,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -267,16 +247,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -301,11 +271,6 @@ msgstr "Оттенок"
 msgid "Preset"
 msgstr "Предустановка"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Отмена"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Редактировать маску..."
@@ -314,11 +279,6 @@ msgstr "Редактировать маску..."
 msgid "Load mask..."
 msgstr "Загрузить маску..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "ОК"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -328,16 +288,6 @@ msgstr "Пользовательское размытие"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -356,16 +306,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Применить функцию"
@@ -468,6 +408,14 @@ msgstr "Градиент непрозрачности"
 msgid "Number of sides:"
 msgstr "Кол-во сторон:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Список изображений"
@@ -1493,6 +1441,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Циклический шум Перлина"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Мрамор"
@@ -2076,16 +2028,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2155,16 +2097,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Фильтр шума"
@@ -2302,16 +2234,6 @@ msgstr "Добавить точечный свет"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2381,16 +2303,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2406,16 +2318,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2430,6 +2332,7 @@ msgid "Levels :"
 msgstr "Уровни :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Предварительный осмотр"
 
@@ -2523,16 +2426,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2543,16 +2436,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Дождь"
@@ -2671,16 +2554,6 @@ msgstr "32-битный"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Резкость/Сглаженность"
@@ -2690,16 +2563,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2725,16 +2588,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2750,16 +2603,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "Смещение волны"
@@ -3463,6 +3306,12 @@ msgstr "Не стоит сохранять такое большое изобр
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "ОК"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "ОК"
@@ -3529,6 +3378,12 @@ msgstr "Постеризовать слой используя палитру"
 msgid "Preset name"
 msgstr "Предустановленное имя"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Предварительный осмотр"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"
@@ -3787,3 +3642,4 @@ msgstr "Увеличить размер стопки слоёв"
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgstr "Увеличить размер стопки слоёв"
+

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

@@ -54,16 +54,6 @@ msgctxt "tfabout.label_opensource.caption"
 msgid "Open source (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
 msgid "Adjust curves"
 msgstr "Justera kurvor"
@@ -237,16 +227,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -262,16 +242,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -296,11 +266,6 @@ msgstr "Ton"
 msgid "Preset"
 msgstr "Förinställda val"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "Avbryt"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "Redigera mask..."
@@ -309,11 +274,6 @@ msgstr "Redigera mask..."
 msgid "Load mask..."
 msgstr "Ladda mask..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "OK"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -323,16 +283,6 @@ msgstr "Egen oskärpa"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -351,16 +301,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "Tillämpa funktion"
@@ -473,6 +413,14 @@ msgstr "Genomskinlig gradient"
 msgid "Number of sides:"
 msgstr "Antal sidor:"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "Bildlista"
@@ -1503,6 +1451,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "Cyklisk Perlinbrus"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "Marmor"
@@ -2089,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2168,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "Brusfilter:"
@@ -2315,16 +2247,6 @@ msgstr "Lägg till en punktljuskälla"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2394,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2419,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2443,6 +2345,7 @@ msgid "Levels :"
 msgstr "Nivåer :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "Förhandsvisning"
 
@@ -2540,16 +2443,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2560,16 +2453,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "Regn"
@@ -2688,16 +2571,6 @@ msgstr "32 bit"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "Gör skarpare/Gör mjukare"
@@ -2707,16 +2580,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2742,16 +2605,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2767,16 +2620,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 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 "№"
 msgstr ""
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "OK"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "Okej"
@@ -3550,6 +3399,12 @@ msgstr "Posterisera lager utifrån palett"
 msgid "Preset name"
 msgstr "Namn på förval"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "Förhandsvisning"
+
 #: uresourcestrings.rspx
 msgid "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)"
 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
 msgid "Adjust curves"
 msgstr "调整曲线"
@@ -247,16 +237,6 @@ msgctxt "tfchoosecolor.caption"
 msgid "Color"
 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
 msgctxt "tfcolorintensity.caption"
 msgid "Intensity"
@@ -272,16 +252,6 @@ msgctxt "tfcolorintensity.label_shift.caption"
 msgid "Shift"
 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
 msgctxt "tfcolorize.caption"
 msgid "Colorize"
@@ -306,11 +276,6 @@ msgstr "色调"
 msgid "Preset"
 msgstr "预设"
 
-#: tfcustomblur.button_cancel.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
-msgid "Cancel"
-msgstr "取消"
-
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
 msgstr "编辑蒙版..."
@@ -319,11 +284,6 @@ msgstr "编辑蒙版..."
 msgid "Load mask..."
 msgstr "加载蒙版..."
 
-#: tfcustomblur.button_ok.caption
-msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
-msgid "OK"
-msgstr "确定"
-
 #: tfcustomblur.caption
 msgctxt "tfcustomblur.caption"
 msgid "Custom blur"
@@ -333,16 +293,6 @@ msgstr "自定义模糊"
 msgid "Open grayscale file"
 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
 msgctxt "tfemboss.caption"
 msgid "Emboss"
@@ -361,16 +311,6 @@ msgctxt "tfemboss.label_direction.caption"
 msgid "Direction :"
 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
 msgid "Apply function"
 msgstr "应用函数"
@@ -476,6 +416,14 @@ msgstr "透明度渐变"
 msgid "Number of sides:"
 msgstr "边数 :"
 
+#: tfhypocycloid.caption
+msgid "Hypocycloid"
+msgstr ""
+
+#: tfhypocycloid.label_amount.caption
+msgid "Cusps:"
+msgstr ""
+
 #: tfimagelist.caption
 msgid "Image List"
 msgstr "图像列表"
@@ -1504,6 +1452,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgstr "环状佩林噪声"
 
+#: tfmain.renderhypocycloid.caption
+msgid "Hypocycloid..."
+msgstr ""
+
 #: tfmain.rendermarble.caption
 msgid "Marble"
 msgstr "大理石"
@@ -2089,16 +2041,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT"
 msgid "Zoom out"
 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
 msgctxt "tfmotionblur.caption"
 msgid "Motion blur"
@@ -2168,16 +2110,6 @@ msgctxt "tfnewimage.label_width.caption"
 msgid "Width :"
 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
 msgid "Noise filter"
 msgstr "噪声滤镜"
@@ -2315,16 +2247,6 @@ msgstr "添加点光源"
 msgid "Remove selected light"
 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
 msgctxt "tfphongfilter.caption"
 msgid "Shaded map"
@@ -2394,16 +2316,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption"
 msgid "Current texture"
 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
 msgctxt "tfpixelate.caption"
 msgid "Pixelate"
@@ -2419,16 +2331,6 @@ msgctxt "tfpixelate.label_quality.caption"
 msgid "Quality :"
 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
 msgctxt "tfposterize.caption"
 msgid "Posterize"
@@ -2443,6 +2345,7 @@ msgid "Levels :"
 msgstr "级别 :"
 
 #: tfpreviewdialog.caption
+msgctxt "tfpreviewdialog.caption"
 msgid "Preview"
 msgstr "预览"
 
@@ -2536,16 +2439,6 @@ msgctxt "tfquestion.label_message.caption"
 msgid "."
 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
 msgctxt "tfradialblur.caption"
 msgid "Radial blur"
@@ -2556,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Rain"
 msgstr "雨"
@@ -2684,16 +2567,6 @@ msgstr "32 位色"
 msgid "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
 msgid "Sharpen/Smooth"
 msgstr "锐化/平滑"
@@ -2703,16 +2576,6 @@ msgctxt "tfsharpen.label_amount.caption"
 msgid "Amount :"
 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
 msgctxt "tfshiftcolors.caption"
 msgid "Shift colors"
@@ -2738,16 +2601,6 @@ msgctxt "tftoolbox.caption"
 msgid "Tools"
 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
 msgctxt "tftwirl.caption"
 msgid "Twirl"
@@ -2763,16 +2616,6 @@ msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 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
 msgid "Wave displacement"
 msgstr "波形移位"
@@ -3496,6 +3339,12 @@ msgstr "此文件格式不适合保存如此大的图像。"
 msgid "№"
 msgstr "№"
 
+#: uresourcestrings.rsok
+#, fuzzy
+msgctxt "uresourcestrings.rsok"
+msgid "OK"
+msgstr "确定"
+
 #: uresourcestrings.rsokay
 msgid "Okay"
 msgstr "好"
@@ -3564,6 +3413,12 @@ msgstr "使用调色板对图层进行海报化"
 msgid "Preset name"
 msgstr "预设名称"
 
+#: uresourcestrings.rspreview
+#, fuzzy
+msgctxt "uresourcestrings.rspreview"
+msgid "Preview"
+msgstr "预览"
+
 #: uresourcestrings.rspx
 msgid "px"
 msgstr "px"

+ 11 - 9
lazpaint/uchoosecolor.lfm

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

+ 28 - 1
lazpaint/uchoosecolor.pas

@@ -8,7 +8,7 @@ interface
 uses
   Classes, SysUtils, FileUtil, LResources, Forms, Controls, ExtCtrls,
   BGRABitmap, BGRABitmapTypes,
-  LazPaintType, UChooseColorInterface;
+  LazPaintType, UChooseColorInterface, LCLType;
 
 type
 
@@ -19,7 +19,10 @@ type
     procedure FormCreate(Sender: TObject);
     procedure FormDeactivate(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 FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
   private
     function GetColorTarget: TColorTarget;
     function GetDarkTheme: boolean;
@@ -37,6 +40,7 @@ type
     function GetCurrentColor: TBGRAPixel;
     procedure AdjustControlHeight;
     procedure HideEditor;
+    procedure SimpleRedraw;
     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
     property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
     property EditorVisible: boolean read GetEditorVisible;
@@ -69,11 +73,29 @@ begin
   FreeAndNil(FInterface);
 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);
 begin
   self.EnsureVisible(False);
 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);
 begin
   if Assigned(FInterface) then
@@ -100,6 +122,11 @@ begin
     FInterface.HideEditor;
 end;
 
+procedure TFChooseColor.SimpleRedraw;
+begin
+  if Assigned(FInterface) then FInterface.SimpleRedraw;
+end;
+
 procedure TFChooseColor.SetDarkTheme(AValue: boolean);
 begin
   if Assigned(FInterface) then

+ 27 - 0
lazpaint/uconfig.pas

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

+ 3 - 0
lazpaint/ufilters.pas

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

+ 1 - 1
lazpaint/uimageview.pas

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

+ 11 - 4
lazpaint/umainformlayout.pas

@@ -126,6 +126,7 @@ type
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property ToolboxPopup: TPopupMenu read GetPopupToolbox write SetPopupToolbox;
     property PaletteVisible: boolean read GetPaletteVisible write SetPaletteVisible;
+    property PaletteToolbar: TPaletteToolbar read FPaletteToolbar;
     property StatusBarVisible: boolean read GetStatusBarVisible write SetStatusBarVisible;
     property StatusText: string read GetStatusText write SetStatusText;
     property DefaultToolboxDocking: TToolWindowDocking read GetDefaultToolboxDocking;
@@ -260,15 +261,21 @@ end;
 function TMainFormLayout.CatchToolKeyDown(var AKey: Word): boolean;
 begin
   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;
 
 function TMainFormLayout.CatchToolKeyUp(var AKey: Word): boolean;
 begin
   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;
 
 function TMainFormLayout.CatchToolKeyPress(var AKey: TUTF8Char): boolean;

+ 2 - 2
lazpaint/umenu.pas

@@ -305,7 +305,7 @@ begin
     items.Sorted := true;
     try
       repeat
-        fullname := path+PathDelim+searchRec.Name;
+        fullname := ConcatPaths([path, searchRec.Name]);
         if FileExistsUTF8(fullname) then
         begin
           title := GetScriptTitle(fullname);
@@ -484,7 +484,7 @@ begin
   AddMenus('MenuRadialBlur',  'FilterBlurBox,FilterBlurFast,FilterBlurRadial,FilterBlurCorona,FilterBlurDisk');
   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('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('MenuHelp',   'HelpIndex,-,HelpAbout');
   for i := 0 to high(FMainMenus) do

+ 214 - 45
lazpaint/upalettetoolbar.pas

@@ -10,11 +10,20 @@ uses
   BGRAVirtualScreen, BGRABitmap,
   LazPaintType, UVolatileScrollBar,
   BGRAPalette, BCButton, Menus,
-  Dialogs, BGRABitmapTypes;
+  Dialogs, BGRABitmapTypes, fgl;
 
 type
   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 = class
@@ -70,6 +79,7 @@ type
     procedure SetVisible(AValue: boolean);
     procedure TryLoadPaletteFrom(AFilename: string);
     procedure TrySavePaletteTo(AFilename: string);
+    procedure DoPickColor(Shift: TShiftState; AColor: TBGRAPixel);
   protected
     procedure PickColor(Shift: TShiftState; X, Y: Integer);
     procedure PaletteChanged;
@@ -85,6 +95,11 @@ type
     procedure ApplyTheme;
     procedure ComputeMenuButtonGlyph;
     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
     constructor Create;
     destructor Destroy; override;
@@ -92,6 +107,9 @@ type
     procedure AddColor(AColor: TBGRAPixel);
     procedure RemoveColor(AColor: TBGRAPixel);
     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 LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
     property Visible: boolean read FVisible write SetVisible;
@@ -106,7 +124,51 @@ implementation
 uses LCScaleDPI, Graphics, Forms, UGraph,
   UResourceStrings, BGRAColorQuantization,
   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 }
 
@@ -311,6 +373,89 @@ begin
   glyphBmp.Free;
 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);
 begin
   FColors.Clear;
@@ -573,6 +718,7 @@ begin
     FVisible := FLazPaintInstance.Config.DefaultPaletteToolbarVisible;
     PanelPalette.Visible := FVisible;
     FillPaletteWithDefault;
+    FColorsBindToKey.LoadContentFromString(FLazPaintInstance.Config.DefaultColorsBoundToKeys, FTransparentPalette);
   end else
   begin
     FColors.Clear;
@@ -641,10 +787,7 @@ begin
   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);
   begin
     if AFill = LazPaintInstance.ToolManager.ForeFill then
@@ -659,8 +802,8 @@ var idx: integer;
   begin
     NeedGradient(AFill);
     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
       LazPaintInstance.ChooseColorTarget := ctForeColorStartGrad else
     if AFill = LazPaintInstance.ToolManager.BackFill then
@@ -673,8 +816,8 @@ var idx: integer;
   begin
     NeedGradient(AFill);
     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
       LazPaintInstance.ChooseColorTarget := ctForeColorEndGrad else
     if AFill = LazPaintInstance.ToolManager.BackFill then
@@ -692,44 +835,50 @@ var idx: integer;
         result := LazPaintInstance.ToolManager.ForeFill;
     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
   if PtInRect(Point(X,Y),FPaletteColorRect) then
   begin
     idx := (Y-FPaletteColorRect.Top) div FPaletteColorItemHeight + FScrollPos;
     if (idx < 0) or (idx >= FColors.Count) then exit;
     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;
 
@@ -742,8 +891,9 @@ end;
 procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap);
 var i,x,y,w,aw,a,h: integer;
   c: TBGRAPixel;
-  nbVisible, maxScroll, availHeight: integer;
+  nbVisible, maxScroll, availHeight, minItemHeight, maxItemHeight: integer;
   clInterm, cSign: TBGRAPixel;
+  strKey: string;
 begin
   FCanvasScale := (Sender as TControl).GetCanvasScaleFactor;
   TVolatileScrollBar.InitDPI(FCanvasScale);
@@ -763,6 +913,10 @@ begin
   h := DoScaleY(round(FPaletteItemHeight*FCanvasScale), OriginalDPI);
   if h < 3 then h := 3;
   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);
   if nbVisible < 1 then nbVisible:= 1;
   maxScroll := FColors.Count-nbVisible;
@@ -779,8 +933,10 @@ begin
   if not Assigned(FScrollbar) then
     w := Bitmap.Width-2-x;
   FPaletteColorRect := rect(x,y,x+w,y);
-  FPaletteColorItemHeight := h-1;
+  h := FPaletteColorItemHeight+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
   if (i >= 0) and (i < FColors.Count) then
   begin
@@ -800,15 +956,25 @@ begin
     begin
       Bitmap.Rectangle(x,y,x+w,y+h,clInterm,c,dmSet);
     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
     begin
-      if GetLightness(c)/65535 > 0.5 then
-        cSign := BGRABlack else cSign := BGRAWhite;
       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),
             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);
     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;
   end;
   FPaletteColorRect.Bottom := y;
@@ -850,6 +1016,8 @@ constructor TPaletteToolbar.Create;
 begin
   FPanelPalette := nil;
   FLastAddedColor := BGRAPixelTransparent;
+  FColorsBindToKey := TBGRAPixelBinding.Create;
+  FColorsBindToKey.Duplicates := dupError;
 end;
 
 destructor TPaletteToolbar.Destroy;
@@ -858,6 +1026,7 @@ begin
   FreeAndNil(FScrollbar);
   FreeAndNil(FPanelPalette);
   FreeAndNil(FColors);
+  FreeAndNil(FColorsBindToKey);
   inherited Destroy;
 end;
 

+ 6 - 4
lazpaint/uprocessauto.pas

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

+ 375 - 10
lazpaint/upython.pas

@@ -10,21 +10,26 @@ uses
 
 const
   DefaultPythonBin = {$IFDEF WINDOWS}'pyw'{$ELSE}'python3'{$ENDIF};
+  {$IFDEF DARWIN}
+  UserPythonBin = '/usr/local/bin/python3';
+  {$ENDIF}
 
 type
   TReceiveLineEvent = procedure(ASender: TObject; ALine: 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 = class
   private
-    FOnBusy: TNotifyEvent;
     FPythonBin: string;
     FPythonVersion: string;
     FLinePrefix: RawByteString;
     FOnCommand: TCommandEvent;
     FOnError: TReceiveLineEvent;
+    FOnBusy: TNotifyEvent;
+    FOnWarning: TWarningEvent;
     FOnOutputLine: TReceiveLineEvent;
     FPythonSend: TSendLineMethod;
     FErrorText: UTF8String;
@@ -33,14 +38,16 @@ type
     procedure PythonError(ALine: RawByteString);
     procedure PythonOutput(ALine: RawByteString);
     procedure PythonBusy(var {%H-}ASleep: boolean);
+    function CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean;
   public
     constructor Create(APythonBin: string = DefaultPythonBin);
-    procedure Run(AScriptFilename: UTF8String; APythonVersion: integer = 3);
+    function Run(AScriptFilename: UTF8String; APythonVersion: integer = 3): boolean;
     class function DefaultScriptDirectory: string;
     property OnOutputLine: TReceiveLineEvent read FOnOutputLine write FOnOutputLine;
     property OnError: TReceiveLineEvent read FOnError write FOnError;
     property OnCommand: TCommandEvent read FOnCommand write FOnCommand;
     property OnBusy: TNotifyEvent read FOnBusy write FOnBusy;
+    property OnWarning: TWarningEvent read FOnWarning write FOnWarning;
     property PythonVersion: string read FPythonVersion;
     property PythonVersionMajor: integer read GetPythonVersionMajor;
     property ErrorText: UTF8String read FErrorText;
@@ -48,6 +55,7 @@ type
 
 function GetPythonVersion(APythonBin: string = DefaultPythonBin): string;
 function GetScriptTitle(AFilename: string): string;
+function CheckPythonScriptSafe(AFilename: string; out ASafeModules, AUnsafeModules: TStringList): boolean;
 
 var
   CustomScriptDirectory: string;
@@ -163,6 +171,277 @@ begin
   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 }
 
 procedure TPythonScript.PythonOutput(ALine: RawByteString);
@@ -257,9 +536,95 @@ begin
   if Assigned(FOnBusy) then FOnBusy(self);
 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);
 begin
   FPythonBin := APythonBin;
+  {$IFDEF DARWIN}
+  if (FPythonBin = 'python3') and FileExists(UserPythonBin) then
+    FPythonBin:= UserPythonBin;
+  {$ENDIF}
   FPythonVersion:= GetPythonVersion(FPythonBin);
 end;
 
@@ -283,23 +648,23 @@ begin
     val(copy(PythonVersion,1,posDot-1), result, errPos);
 end;
 
-procedure TPythonScript.Run(AScriptFilename: UTF8String;
-  APythonVersion: integer);
+function TPythonScript.Run(AScriptFilename: UTF8String;
+  APythonVersion: integer): boolean;
+var exitCode: integer;
 begin
+  result := false;
+  if not CheckScriptAndDependencySafe(AScriptFilename, APythonVersion) then exit;
   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;
   AutomationEnvironment.Values['PYTHONPATH'] := DefaultScriptDirectory;
+  AutomationEnvironment.Values['PYTHONIOENCODING'] := 'utf-8';
   try
-    RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy);
+    exitCode := RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy);
   finally
     AutomationEnvironment.Clear;
   end;
   FPythonSend := nil;
+  result := exitCode = 0;
 end;
 
 class function TPythonScript.DefaultScriptDirectory: string;

+ 3 - 0
lazpaint/uresourcestrings.pas

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

+ 6 - 6
lazpaint/uscripting.pas

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

+ 13 - 0
lazpaintcontrols/lcvectorialfillcontrol.pas

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

+ 22 - 0
lazpaintcontrols/lcvectorialfillinterface.pas

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

+ 1 - 0
lazpaintcontrols/lcvectororiginal.pas

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

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff