2
0
Эх сурвалжийг харах

Merge branch 'dev-lazpaint' of https://github.com/bgrabitmap/lazpaint into dev-lazpaint

Johann 6 жил өмнө
parent
commit
b9144f7fd6
75 өөрчлөгдсөн 17194 нэмэгдсэн , 1858 устгасан
  1. 3 0
      .gitignore
  2. 2 2
      README.md
  3. 13 0
      commit.sh
  4. 2 1
      lazpaint.logic
  5. 33 19
      lazpaint/dialog/ubrowseimages.pas
  6. 1 0
      lazpaint/dialog/umultiimage.pas
  7. 16 2
      lazpaint/dialog/upreviewdialog.pas
  8. 2 2
      lazpaint/dialog/usaveoption.pas
  9. 76 42
      lazpaint/image/uimage.pas
  10. 90 17
      lazpaint/image/uimageaction.pas
  11. 205 22
      lazpaint/image/uimagediff.pas
  12. 26 1
      lazpaint/image/uimagestate.pas
  13. 12 9
      lazpaint/image/ustatetype.pas
  14. 18 10
      lazpaint/lazpaint.lpi
  15. 25 0
      lazpaint/lazpaint.lpr
  16. 1 1
      lazpaint/lazpaintembeddedpack.lpk
  17. 4 4
      lazpaint/lazpaintinstance.pas
  18. 1 1
      lazpaint/lazpaintmainform.lfm
  19. 89 21
      lazpaint/lazpaintmainform.pas
  20. 4 11
      lazpaint/lazpainttype.pas
  21. 3 4
      lazpaint/maintoolbar.inc
  22. 1207 12
      lazpaint/release/bin/i18n/lazpaint.ar.po
  23. 1208 12
      lazpaint/release/bin/i18n/lazpaint.cs.po
  24. 160 140
      lazpaint/release/bin/i18n/lazpaint.de.po
  25. 1211 12
      lazpaint/release/bin/i18n/lazpaint.es.po
  26. 1203 8
      lazpaint/release/bin/i18n/lazpaint.fi.po
  27. 1227 12
      lazpaint/release/bin/i18n/lazpaint.fr.po
  28. 1208 8
      lazpaint/release/bin/i18n/lazpaint.ja.po
  29. 1208 12
      lazpaint/release/bin/i18n/lazpaint.lv.po
  30. 1210 12
      lazpaint/release/bin/i18n/lazpaint.nl.po
  31. 1330 94
      lazpaint/release/bin/i18n/lazpaint.po
  32. 0 707
      lazpaint/release/bin/i18n/lazpaint.pot
  33. 1211 12
      lazpaint/release/bin/i18n/lazpaint.pt_BR.po
  34. 1202 12
      lazpaint/release/bin/i18n/lazpaint.ru.po
  35. 1203 8
      lazpaint/release/bin/i18n/lazpaint.sv.po
  36. 38 0
      lazpaint/release/changelog
  37. 38 0
      lazpaint/release/debian/linux32/DEBIAN/changelog
  38. 1 1
      lazpaint/release/debian/linux32/DEBIAN/control
  39. 38 0
      lazpaint/release/debian/linux64/DEBIAN/changelog
  40. 1 1
      lazpaint/release/debian/linux64/DEBIAN/control
  41. 47 0
      lazpaint/release/macOS/LazPaint.app/Contents/Info.plist
  42. 0 0
      lazpaint/release/macOS/LazPaint.app/Contents/MacOS/delete.me
  43. 1 0
      lazpaint/release/macOS/LazPaint.app/Contents/PkgInfo
  44. BIN
      lazpaint/release/macOS/LazPaint.app/Contents/Resources/lazpaint.icns
  45. BIN
      lazpaint/release/macOS/background.png
  46. 10 0
      lazpaint/release/macOS/instructions.txt
  47. 30 29
      lazpaint/release/macOS/makedmg.sh
  48. 1 1
      lazpaint/release/stable/latest.txt
  49. 9 9
      lazpaint/release/stable/pad_file.xml
  50. BIN
      lazpaint/release/stable/pad_icon.gif
  51. BIN
      lazpaint/release/stable/pad_screenshot.png
  52. 1 1
      lazpaint/release/windows/lazpaint.iss
  53. 62 57
      lazpaint/tools/utool.pas
  54. 33 21
      lazpaint/tools/utoolbasic.pas
  55. 55 8
      lazpaint/tools/utooldeformationgrid.pas
  56. 81 30
      lazpaint/tools/utoollayer.pas
  57. 58 9
      lazpaint/tools/utoolpolygon.pas
  58. 54 16
      lazpaint/tools/utoolselect.pas
  59. 474 253
      lazpaint/tools/utoolvectorial.pas
  60. 15 12
      lazpaint/uchoosecolor.pas
  61. 104 74
      lazpaint/uclipboard.pas
  62. 143 17
      lazpaint/ufilesystem.pas
  63. 131 25
      lazpaint/uimagepreview.pas
  64. 8 1
      lazpaint/uimageview.pas
  65. 9 8
      lazpaint/ulayerstack.pas
  66. 1 1
      lazpaint/umenu.pas
  67. 9 4
      lazpaint/uresourcestrings.pas
  68. 22 0
      lazpaint/uscripting.pas
  69. 7 3
      lazpaint/utiff.pas
  70. 17 7
      lazpaintcontrols/lcvectorclipboard.pas
  71. 12 1
      lazpaintcontrols/lcvectorialfill.pas
  72. 61 7
      lazpaintcontrols/lcvectororiginal.pas
  73. 37 9
      lazpaintcontrols/lcvectorpolyshapes.pas
  74. 159 22
      lazpaintcontrols/lcvectorrectshapes.pas
  75. 13 1
      lazpaintcontrols/lcvectortextshapes.pas

+ 3 - 0
.gitignore

@@ -32,3 +32,6 @@ lazpaint/tools/backup/
 lazpaint/image/backup/
 lazpaint/image/backup/
 
 
 lazpaint/dialog/backup/
 lazpaint/dialog/backup/
+.DS_Store
+lazpaint/release/bin/lazpaint.app
+lazpaint/release/macOS/*.dmg

+ 2 - 2
README.md

@@ -2,9 +2,9 @@
 Image editor, like PaintBrush or Paint.Net, written in Lazarus (Free Pascal). Uses BGRABitmap library.
 Image editor, like PaintBrush or Paint.Net, written in Lazarus (Free Pascal). Uses BGRABitmap library.
 
 
 # Download
 # Download
-[Download LazPaint 6.4.1](https://github.com/bgrabitmap/lazpaint/releases/tag/v6.4.1) for Windows, Mac and Linux.
+[Download LazPaint](https://github.com/bgrabitmap/lazpaint/releases) for Windows, Mac and Linux.
 
 
-[Download LazPaint 6.4.1 Portable](https://framakey.org/Portables/LazPaintPortable) for Windows.
+[Download LazPaint Portable](https://framakey.org/Portables/LazPaintPortable) for Windows.
 
 
 # Official Sites
 # Official Sites
 [LazPaint Wiki](http://wiki.freepascal.org/LazPaint)
 [LazPaint Wiki](http://wiki.freepascal.org/LazPaint)

+ 13 - 0
commit.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+git checkout HEAD~ -- lazpaint/release/bin/i18n/*.po
+git add .
+git status
+echo "Type commit description (or press Enter to cancel):"
+read commitdesc
+if test -z "$commitdesc"
+then
+  git reset --
+else
+  git commit -m "$commitdesc"
+fi
+cd ..

+ 2 - 1
lazpaint.logic

@@ -9,4 +9,5 @@ echo "Don't forget to UPDATE changelog file"
 copy release/changelog release/debian/linux32/DEBIAN/changelog
 copy release/changelog release/debian/linux32/DEBIAN/changelog
 copy release/changelog release/debian/linux64/DEBIAN/changelog
 copy release/changelog release/debian/linux64/DEBIAN/changelog
 text release/macOS/makedmg.sh "appversion=$(Version)"
 text release/macOS/makedmg.sh "appversion=$(Version)"
-
+bundle release/macOS/LazPaint.app
+copy ../resources/icon/lazpaint.icns release/macOS/LazPaint.app/Contents/Resources/lazpaint.icns

+ 33 - 19
lazpaint/dialog/ubrowseimages.pas

@@ -67,6 +67,9 @@ type
     procedure ToolButton_ViewBigIconClick(Sender: TObject);
     procedure ToolButton_ViewBigIconClick(Sender: TObject);
     procedure Tool_SelectDriveClick(Sender: TObject);
     procedure Tool_SelectDriveClick(Sender: TObject);
     function OnDeleteConfirmation({%H-}AForm:TForm; const AFiles: array of string; AContained: boolean): boolean;
     function OnDeleteConfirmation({%H-}AForm:TForm; const AFiles: array of string; AContained: boolean): boolean;
+  private
+    function GetCurrentDirectory: string;
+    procedure SetCurrentDirectory(AValue: string);
   private
   private
     FLazPaintInstance: TLazPaintCustomInstance;
     FLazPaintInstance: TLazPaintCustomInstance;
     FDefaultExtension: string;
     FDefaultExtension: string;
@@ -124,6 +127,7 @@ type
     procedure DeleteSelectedFiles;
     procedure DeleteSelectedFiles;
     procedure SelectFile(AName: string);
     procedure SelectFile(AName: string);
     procedure PreviewValidate({%H-}ASender: TObject);
     procedure PreviewValidate({%H-}ASender: TObject);
+    property CurrentDirectory: string read GetCurrentDirectory write SetCurrentDirectory;
   public
   public
     { public declarations }
     { public declarations }
     ShowRememberStartupDirectory: boolean;
     ShowRememberStartupDirectory: boolean;
@@ -295,8 +299,7 @@ begin
   BGRAPaintNet.RegisterPaintNetFormat;
   BGRAPaintNet.RegisterPaintNetFormat;
   BGRAOpenRaster.RegisterOpenRasterFormat;
   BGRAOpenRaster.RegisterOpenRasterFormat;
 
 
-  FFileSystems := FileManager.GetFileSystems;
-  if length(FFileSystems)>0 then
+  if FileManager.CanGetFileSystems then
   begin
   begin
     Tool_SelectDrive.Visible := true;
     Tool_SelectDrive.Visible := true;
   end else
   end else
@@ -335,8 +338,8 @@ begin
   if not IsSaveDialog then FFilename:= FPreviewFilename;
   if not IsSaveDialog then FFilename:= FPreviewFilename;
   Timer1.Enabled := false;
   Timer1.Enabled := false;
   vsList.Anchors := [akLeft,akTop,akRight,akBottom];
   vsList.Anchors := [akLeft,akTop,akRight,akBottom];
-  FLastDirectory := DirectoryEdit1.Text;
-  DirectoryEdit1.Text := '';
+  FLastDirectory := CurrentDirectory;
+  CurrentDirectory := '';
   UpdatePreview('');
   UpdatePreview('');
 end;
 end;
 
 
@@ -403,9 +406,9 @@ begin
   end;
   end;
   if FLastBigIcon then ViewBigIcons;
   if FLastBigIcon then ViewBigIcons;
   if (FLastDirectory = '') or not FileManager.IsDirectory(FLastDirectory) then
   if (FLastDirectory = '') or not FileManager.IsDirectory(FLastDirectory) then
-    DirectoryEdit1.Text := DefaultPicturesDirectory
+    CurrentDirectory := DefaultPicturesDirectory
   else
   else
-    DirectoryEdit1.Text := FLastDirectory;
+    CurrentDirectory := FLastDirectory;
   Timer1.Enabled := true;
   Timer1.Enabled := true;
   vsList.Anchors := [akLeft,akTop];
   vsList.Anchors := [akLeft,akTop];
   ShellListView1.SetFocus;
   ShellListView1.SetFocus;
@@ -449,8 +452,8 @@ procedure TFBrowseImages.ListBox_RecentDirsClick(Sender: TObject);
 begin
 begin
   if ListBox_RecentDirs.ItemIndex <> -1 then
   if ListBox_RecentDirs.ItemIndex <> -1 then
   begin
   begin
-    if ChompPathDelim(DirectoryEdit1.Text) <> ChompPathDelim(ListBox_RecentDirs.Items[ListBox_RecentDirs.ItemIndex]) then
-      DirectoryEdit1.Text := AppendPathDelim(ListBox_RecentDirs.Items[ListBox_RecentDirs.ItemIndex]);
+    if ChompPathDelim(CurrentDirectory) <> ChompPathDelim(ListBox_RecentDirs.Items[ListBox_RecentDirs.ItemIndex]) then
+      CurrentDirectory := AppendPathDelim(ListBox_RecentDirs.Items[ListBox_RecentDirs.ItemIndex]);
   end;
   end;
 end;
 end;
 
 
@@ -604,13 +607,13 @@ var
   newName: String;
   newName: String;
   newFullname: string;
   newFullname: string;
 begin
 begin
-  if pos(PathDelim, DirectoryEdit1.Text) = 0 then exit;
+  if pos(PathDelim, CurrentDirectory) = 0 then exit;
   newName := InputBox(FCreateFolderOrContainerCaption, rsEnterFolderOrContainerName, '');
   newName := InputBox(FCreateFolderOrContainerCaption, rsEnterFolderOrContainerName, '');
   if newName = '' then exit;
   if newName = '' then exit;
   if (pos(':',newName) <> 0) or (pos('\',newName) <> 0) then
   if (pos(':',newName) <> 0) or (pos('\',newName) <> 0) then
     MessageDlg(rsInvalidName, mtError, [mbOK], 0) else
     MessageDlg(rsInvalidName, mtError, [mbOK], 0) else
   begin
   begin
-    newFullname := ChompPathDelim(DirectoryEdit1.Text)+PathDelim+newName;
+    newFullname := ChompPathDelim(CurrentDirectory)+PathDelim+newName;
     if FileManager.IsDirectory(newFullname) then
     if FileManager.IsDirectory(newFullname) then
       MessageDlg(rsFolderOrContainerAlreadyExists, mtInformation, [mbOK], 0)
       MessageDlg(rsFolderOrContainerAlreadyExists, mtInformation, [mbOK], 0)
     else
     else
@@ -667,7 +670,7 @@ end;
 
 
 procedure TFBrowseImages.Tool_SelectDriveClick(Sender: TObject);
 procedure TFBrowseImages.Tool_SelectDriveClick(Sender: TObject);
 begin
 begin
-  DirectoryEdit1.Text := ':';
+  CurrentDirectory := ':';
 end;
 end;
 
 
 function TFBrowseImages.OnDeleteConfirmation(AForm: TForm;
 function TFBrowseImages.OnDeleteConfirmation(AForm: TForm;
@@ -688,6 +691,17 @@ begin
     result := true;
     result := true;
 end;
 end;
 
 
+function TFBrowseImages.GetCurrentDirectory: string;
+begin
+  result := DirectoryEdit1.Text;
+end;
+
+procedure TFBrowseImages.SetCurrentDirectory(AValue: string);
+begin
+  DirectoryEdit1.Text := AValue;
+  ResetDirectory(False);
+end;
+
 procedure TFBrowseImages.UpdateToolButtonOpen;
 procedure TFBrowseImages.UpdateToolButtonOpen;
 var chosenFilename: string;
 var chosenFilename: string;
 begin
 begin
@@ -838,7 +852,7 @@ var I: integer;
 begin
 begin
   ListBox_RecentDirs.ItemIndex := -1;
   ListBox_RecentDirs.ItemIndex := -1;
   for I := 0 to ListBox_RecentDirs.Count-1 do
   for I := 0 to ListBox_RecentDirs.Count-1 do
-    if ChompPathDelim(ListBox_RecentDirs.Items[i]) = ChompPathDelim(DirectoryEdit1.Text) then
+    if ChompPathDelim(ListBox_RecentDirs.Items[i]) = ChompPathDelim(CurrentDirectory) then
     begin
     begin
       ListBox_RecentDirs.ItemIndex:= I;
       ListBox_RecentDirs.ItemIndex:= I;
       break;
       break;
@@ -936,7 +950,7 @@ begin
     fullName := ShellListView1.ItemFullName[ShellListView1.SelectedIndex];
     fullName := ShellListView1.ItemFullName[ShellListView1.SelectedIndex];
     if ShellListView1.ItemIsFolder[ShellListView1.SelectedIndex] then
     if ShellListView1.ItemIsFolder[ShellListView1.SelectedIndex] then
     begin
     begin
-      DirectoryEdit1.Text := fullName;
+      CurrentDirectory := fullName;
       InFilenameChange := true;
       InFilenameChange := true;
       Edit_Filename.text := '';
       Edit_Filename.text := '';
       InFilenameChange := false;
       InFilenameChange := false;
@@ -977,10 +991,10 @@ begin
       ModalResult:= mrOk;
       ModalResult:= mrOk;
     end;
     end;
   end else
   end else
-    if IsSaveDialog and (Trim(Edit_Filename.Text)<>'') and (DirectoryEdit1.Text <> ':') and
-      FileManager.IsDirectory(trim(DirectoryEdit1.Text)) then
+    if IsSaveDialog and (Trim(Edit_Filename.Text)<>'') and (CurrentDirectory <> ':') and
+      FileManager.IsDirectory(trim(CurrentDirectory)) then
     begin
     begin
-      FFilename:= IncludeTrailingPathDelimiter(trim(DirectoryEdit1.Text))+Edit_Filename.Text;
+      FFilename:= IncludeTrailingPathDelimiter(trim(CurrentDirectory))+Edit_Filename.Text;
       if (ExtractFileExt(FFilename)='') then
       if (ExtractFileExt(FFilename)='') then
       begin
       begin
         if (ComboBox_FileExtension.ItemIndex > 0) then
         if (ComboBox_FileExtension.ItemIndex > 0) then
@@ -1004,15 +1018,15 @@ procedure TFBrowseImages.GoDirUp;
 var dir: string;
 var dir: string;
   itemToSelect: string;
   itemToSelect: string;
 begin
 begin
-  dir := DirectoryEdit1.Text;
+  dir := CurrentDirectory;
   FileManager.RemoveLastPathElement(dir, itemToSelect);
   FileManager.RemoveLastPathElement(dir, itemToSelect);
   if dir = '' then
   if dir = '' then
   begin
   begin
     FFileSystems:= FileManager.GetFileSystems;
     FFileSystems:= FileManager.GetFileSystems;
-    if length(FFileSystems)>0 then DirectoryEdit1.Text := ':';
+    if length(FFileSystems)>0 then CurrentDirectory := ':';
     itemToSelect := '';
     itemToSelect := '';
   end else
   end else
-    DirectoryEdit1.Text := dir;
+    CurrentDirectory := dir;
   ShellListView1.SetFocus;
   ShellListView1.SetFocus;
   UpdatePreview('');
   UpdatePreview('');
   InFilenameChange := true;
   InFilenameChange := true;

+ 1 - 0
lazpaint/dialog/umultiimage.pas

@@ -111,6 +111,7 @@ begin
       result.bmp := images[selectedIndex].bmp.Duplicate(AFormat = ifCur,True) as TBGRABitmap;
       result.bmp := images[selectedIndex].bmp.Duplicate(AFormat = ifCur,True) as TBGRABitmap;
       result.bpp := images[selectedIndex].bpp;
       result.bpp := images[selectedIndex].bpp;
       result.frameIndex := images[selectedIndex].frameIndex;
       result.frameIndex := images[selectedIndex].frameIndex;
+      result.isDuplicate:= images[selectedIndex].isDuplicate;
     end;
     end;
   end;
   end;
 end;
 end;

+ 16 - 2
lazpaint/dialog/upreviewdialog.pas

@@ -20,9 +20,11 @@ type
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
   private
     FPreview: TImagePreview;
     FPreview: TImagePreview;
+    function GetDuplicateSourceIndex: integer;
     function GetEntryCount: integer;
     function GetEntryCount: integer;
     function GetFilename: string;
     function GetFilename: string;
     function GetLazPaintInstance: TLazPaintCustomInstance;
     function GetLazPaintInstance: TLazPaintCustomInstance;
+    procedure SetDuplicateSourceIndex(AValue: integer);
     procedure SetFilename(AValue: string);
     procedure SetFilename(AValue: string);
     procedure PreviewValidate(Sender: TObject);
     procedure PreviewValidate(Sender: TObject);
     procedure PreviewEscape(Sender: TObject);
     procedure PreviewEscape(Sender: TObject);
@@ -32,21 +34,23 @@ type
     property Filename: string read GetFilename write SetFilename;
     property Filename: string read GetFilename write SetFilename;
     property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
     property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
     property EntryCount: integer read GetEntryCount;
     property EntryCount: integer read GetEntryCount;
+    property DuplicateSourceIndex: integer read GetDuplicateSourceIndex write SetDuplicateSourceIndex;
   end;
   end;
 
 
 var
 var
   FPreviewDialog: TFPreviewDialog;
   FPreviewDialog: TFPreviewDialog;
 
 
 function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string = '';
 function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string = '';
-  ASkipIfSingleImage: boolean = false): TImageEntry;
+  ASkipIfSingleImage: boolean = false; ADuplicateSourceIndex: integer = -1): TImageEntry;
 
 
 implementation
 implementation
 
 
 function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string;
 function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string;
-  ASkipIfSingleImage: boolean): TImageEntry;
+  ASkipIfSingleImage: boolean; ADuplicateSourceIndex: integer): TImageEntry;
 var f: TFPreviewDialog;
 var f: TFPreviewDialog;
 begin
 begin
   f := TFPreviewDialog.Create(nil);
   f := TFPreviewDialog.Create(nil);
+  f.DuplicateSourceIndex := ADuplicateSourceIndex;
   f.LazPaintInstance := AInstance;
   f.LazPaintInstance := AInstance;
   if ATitle <> '' then f.Caption := ATitle;
   if ATitle <> '' then f.Caption := ATitle;
   f.Filename:= AFilename;
   f.Filename:= AFilename;
@@ -90,11 +94,21 @@ begin
     result := 0;
     result := 0;
 end;
 end;
 
 
+function TFPreviewDialog.GetDuplicateSourceIndex: integer;
+begin
+  result := FPreview.DuplicateEntrySourceIndex;
+end;
+
 function TFPreviewDialog.GetLazPaintInstance: TLazPaintCustomInstance;
 function TFPreviewDialog.GetLazPaintInstance: TLazPaintCustomInstance;
 begin
 begin
   result := FPreview.LazPaintInstance;
   result := FPreview.LazPaintInstance;
 end;
 end;
 
 
+procedure TFPreviewDialog.SetDuplicateSourceIndex(AValue: integer);
+begin
+  FPreview.DuplicateEntrySourceIndex:= AValue;
+end;
+
 procedure TFPreviewDialog.SetFilename(AValue: string);
 procedure TFPreviewDialog.SetFilename(AValue: string);
 begin
 begin
   FPreview.Filename := AValue;
   FPreview.Filename := AValue;

+ 2 - 2
lazpaint/dialog/usaveoption.pas

@@ -845,9 +845,9 @@ begin
   UpdateFileSize;
   UpdateFileSize;
   DrawHourglass(BGRAPreview.Bitmap);
   DrawHourglass(BGRAPreview.Bitmap);
   BGRAPreview.Repaint;
   BGRAPreview.Repaint;
-  {$IFDEF LINUX}
+  { $IFDEF LINUX}
   Application.ProcessMessages;
   Application.ProcessMessages;
-  {$ENDIF}
+  { $ENDIF}
   BGRAPreview.DiscardBitmap;
   BGRAPreview.DiscardBitmap;
 end;
 end;
 
 

+ 76 - 42
lazpaint/image/uimage.pas

@@ -182,12 +182,14 @@ type
     procedure MergeLayerOver;
     procedure MergeLayerOver;
     procedure MoveLayer(AFromIndex,AToIndex: integer);
     procedure MoveLayer(AFromIndex,AToIndex: integer);
     procedure RemoveLayer;
     procedure RemoveLayer;
+    procedure ClearLayer;
 
 
     procedure HorizontalFlip(ALayerIndex: integer); overload;
     procedure HorizontalFlip(ALayerIndex: integer); overload;
     procedure VerticalFlip(ALayerIndex: integer); overload;
     procedure VerticalFlip(ALayerIndex: integer); overload;
 
 
     // whole image
     // whole image
-    procedure Assign(const AValue: TBGRABitmap; AOwned: boolean; AUndoable: boolean); overload;
+    procedure Assign(const AValue: TBGRABitmap; AOwned: boolean; AUndoable: boolean;
+                     ACaption: string = ''; AOpacity: byte = 255); overload;
     procedure Assign(const AValue: TBGRALayeredBitmap; AOwned: boolean; AUndoable: boolean); overload;
     procedure Assign(const AValue: TBGRALayeredBitmap; AOwned: boolean; AUndoable: boolean); overload;
     procedure Assign(const AValue: TLayeredBitmapAndSelection; AOwned: boolean; AUndoable: boolean); overload;
     procedure Assign(const AValue: TLayeredBitmapAndSelection; AOwned: boolean; AUndoable: boolean); overload;
 
 
@@ -315,26 +317,41 @@ end;
 
 
 function TLazPaintImage.MakeCroppedLayer: TBGRABitmap;
 function TLazPaintImage.MakeCroppedLayer: TBGRABitmap;
 var r: TRect;
 var r: TRect;
+  cropped: TBGRABitmap;
+  ofs: TPoint;
 begin
 begin
+  ofs := Point(0,0);
   result := DuplicateBitmap(FCurrentState.SelectionLayer);
   result := DuplicateBitmap(FCurrentState.SelectionLayer);
   if (result <> nil) and (SelectionMask <> nil) then result.ApplyMask(SelectionMask);
   if (result <> nil) and (SelectionMask <> nil) then result.ApplyMask(SelectionMask);
   if (result <> nil) and result.Empty then FreeAndNil(result);
   if (result <> nil) and result.Empty then FreeAndNil(result);
   if result = nil then
   if result = nil then
   begin
   begin
+    ofs := LayerOffset[CurrentLayerIndex];
     result := DuplicateBitmap(GetSelectedImageLayer);
     result := DuplicateBitmap(GetSelectedImageLayer);
-    if (result <> nil) and (SelectionMask <> nil) then result.ApplyMask(SelectionMask);
+    if (result <> nil) and (SelectionMask <> nil) then
+      result.ApplyMask(SelectionMask, rect(0,0,result.Width,result.Height),
+                       Point(ofs.X,ofs.Y));
   end;
   end;
   if result <> nil then
   if result <> nil then
   begin
   begin
     if SelectionMask = nil then
     if SelectionMask = nil then
       r := result.GetImageBounds
       r := result.GetImageBounds
     else
     else
+    begin
       r := SelectionMaskBounds;
       r := SelectionMaskBounds;
+      OffsetRect(r, -ofs.x, -ofs.y);
+    end;
     if IsRectEmpty(r) then
     if IsRectEmpty(r) then
       FreeAndNil(result)
       FreeAndNil(result)
     else
     else
+    begin
       if (r.left <> 0) or (r.top <> 0) or (r.right <> result.Width) or (r.bottom <> result.Height) then
       if (r.left <> 0) or (r.top <> 0) or (r.right <> result.Width) or (r.bottom <> result.Height) then
-        BGRAReplace(result, result.GetPart(r));
+      begin
+        cropped := TBGRABitmap.Create(r.Width,r.Height);
+        cropped.PutImage(-r.Left, -r.Top, result, dmSet);
+        BGRAReplace(result, cropped);
+      end;
+    end;
   end;
   end;
 end;
 end;
 
 
@@ -465,6 +482,11 @@ end;
 
 
 procedure TLazPaintImage.UpdateMultiImage(AOutputFilename: string = '');
 procedure TLazPaintImage.UpdateMultiImage(AOutputFilename: string = '');
 begin
 begin
+  if not FileManager.FileExists(currentFilenameUTF8) then
+  begin
+    ShowMessage(rsFileNotFound + LineEnding + LineEnding + currentFilenameUTF8);
+    exit;
+  end;
   if IsIconCursor then
   if IsIconCursor then
     UpdateIconFileUTF8(currentFilenameUTF8, AOutputFilename)
     UpdateIconFileUTF8(currentFilenameUTF8, AOutputFilename)
   else if IsTiff then
   else if IsTiff then
@@ -557,7 +579,10 @@ begin
     else
     else
     begin
     begin
       newFrameIndex := FrameIndex;
       newFrameIndex := FrameIndex;
-      tiff.Delete(newFrameIndex);
+      if newFrameIndex >= tiff.Count then
+        newFrameIndex := tiff.Count
+      else
+        tiff.Delete(newFrameIndex);
       tiff.Move(addedTiff,0,newFrameIndex);
       tiff.Move(addedTiff,0,newFrameIndex);
     end;
     end;
 
 
@@ -956,11 +981,6 @@ begin
         ImageMayChange(ADiff.ChangingBounds)
         ImageMayChange(ADiff.ChangingBounds)
       else
       else
         ImageMayChangeCompletely;
         ImageMayChangeCompletely;
-  idkChangeLayer:
-      if ADiff.ChangingBoundsDefined then
-        LayerMayChange(CurrentLayerReadOnly, ADiff.ChangingBounds)
-      else
-        LayerMayChangeCompletely(CurrentLayerReadOnly);
   idkChangeSelection:
   idkChangeSelection:
       if ADiff.ChangingBoundsDefined then
       if ADiff.ChangingBoundsDefined then
         SelectionMaskMayChange(ADiff.ChangingBounds)
         SelectionMaskMayChange(ADiff.ChangingBounds)
@@ -1669,48 +1689,40 @@ begin
   if Assigned(Zoom) then result := Zoom.Factor else result := 1;
   if Assigned(Zoom) then result := Zoom.Factor else result := 1;
 end;
 end;
 
 
-procedure TLazPaintImage.Assign(const AValue: TBGRABitmap; AOwned: boolean; AUndoable: boolean);
+procedure TLazPaintImage.Assign(const AValue: TBGRABitmap; AOwned: boolean; AUndoable: boolean;
+  ACaption: string; AOpacity: byte);
 var layeredBmp: TBGRALayeredBitmap;
 var layeredBmp: TBGRALayeredBitmap;
   mask: TBGRABitmap;
   mask: TBGRABitmap;
 begin
 begin
   if not CheckNoAction then exit;
   if not CheckNoAction then exit;
   CursorHotSpot := AValue.HotSpot;
   CursorHotSpot := AValue.HotSpot;
-  if not AUndoable then
-  begin
-    FCurrentState.Assign(AValue, AOwned);
-    FCurrentState.RemoveSelection;
-    LayeredBitmapReplaced;
-    ImageMayChangeCompletely;
-    SelectionMaskMayChangeCompletely;
-    ClearUndo;
-  end else
+  layeredBmp := TBGRALayeredBitmap.Create(AValue.Width,AValue.Height);
+  if AOwned then
   begin
   begin
-    layeredBmp := TBGRALayeredBitmap.Create(AValue.Width,AValue.Height);
-    if AOwned then
+    layeredBmp.AddOwnedLayer(AValue);
+    if Assigned(AValue.XorMask) then
     begin
     begin
-      layeredBmp.AddOwnedLayer(AValue);
-      if Assigned(AValue.XorMask) then
-      begin
-        mask := AValue.XorMask.Duplicate as TBGRABitmap;
-        mask.AlphaFill(255);
-        mask.ReplaceColor(BGRABlack,BGRAPixelTransparent);
-        layeredBmp.LayerName[layeredBmp.AddOwnedLayer(mask,boXor)] := 'Xor';
-        AValue.DiscardXorMask;
-      end;
-    end
-    else
+      mask := AValue.XorMask.Duplicate as TBGRABitmap;
+      mask.AlphaFill(255);
+      mask.ReplaceColor(BGRABlack,BGRAPixelTransparent);
+      layeredBmp.LayerName[layeredBmp.AddOwnedLayer(mask,boXor)] := 'Xor';
+      AValue.DiscardXorMask;
+    end;
+  end
+  else
+  begin
+    layeredBmp.AddLayer(AValue);
+    if Assigned(AValue.XorMask) then
     begin
     begin
-      layeredBmp.AddLayer(AValue);
-      if Assigned(AValue.XorMask) then
-      begin
-        mask := AValue.XorMask.Duplicate as TBGRABitmap;
-        mask.AlphaFill(255);
-        mask.ReplaceColor(BGRABlack,BGRAPixelTransparent);
-        layeredBmp.LayerName[layeredBmp.AddOwnedLayer(mask,boXor)] := 'Xor';
-      end;
+      mask := AValue.XorMask.Duplicate as TBGRABitmap;
+      mask.AlphaFill(255);
+      mask.ReplaceColor(BGRABlack,BGRAPixelTransparent);
+      layeredBmp.LayerName[layeredBmp.AddOwnedLayer(mask,boXor)] := 'Xor';
     end;
     end;
-    Assign(layeredBmp,True,AUndoable);
   end;
   end;
+  layeredBmp.LayerName[0] := ACaption;
+  layeredBmp.LayerOpacity[0] := AOpacity;
+  Assign(layeredBmp,True,AUndoable);
 end;
 end;
 
 
 procedure TLazPaintImage.Assign(const AValue: TBGRALayeredBitmap;
 procedure TLazPaintImage.Assign(const AValue: TBGRALayeredBitmap;
@@ -1852,10 +1864,22 @@ begin
 end;
 end;
 
 
 procedure TLazPaintImage.MergeLayerOver;
 procedure TLazPaintImage.MergeLayerOver;
+var
+  remove: TCustomImageDifference;
+  nextId: LongInt;
 begin
 begin
+  if CurrentLayerIndex = 0 then exit;
   if not CheckNoAction then exit;
   if not CheckNoAction then exit;
   try
   try
-    AddUndo(FCurrentState.MergerLayerOver(CurrentLayerIndex));
+    if LayerBitmap[CurrentLayerIndex].Empty then
+    begin
+      nextId := LayerId[CurrentLayerIndex-1];
+      remove := FCurrentState.RemoveLayer;
+      if remove is TRemoveLayerStateDifference then
+        TRemoveLayerStateDifference(remove).nextActiveLayerId:= nextId;
+      AddUndo(remove);
+    end else
+      AddUndo(FCurrentState.MergerLayerOver(CurrentLayerIndex));
   except on ex: exception do NotifyException('MergeLayerOver',ex);
   except on ex: exception do NotifyException('MergeLayerOver',ex);
   end;
   end;
   ImageMayChangeCompletely;
   ImageMayChangeCompletely;
@@ -1901,6 +1925,16 @@ begin
   ImageMayChangeCompletely;
   ImageMayChangeCompletely;
 end;
 end;
 
 
+procedure TLazPaintImage.ClearLayer;
+begin
+  if not CheckNoAction then exit;
+  try
+    AddUndo(FCurrentState.ClearLayer);
+  except on ex: exception do NotifyException('ClearLayer',ex);
+  end;
+  ImageMayChangeCompletely;
+end;
+
 procedure TLazPaintImage.SaveOriginalToStream(AStream: TStream);
 procedure TLazPaintImage.SaveOriginalToStream(AStream: TStream);
 begin
 begin
   FCurrentState.LayeredBitmap.SaveOriginalToStream(
   FCurrentState.LayeredBitmap.SaveOriginalToStream(

+ 90 - 17
lazpaint/image/uimageaction.pas

@@ -30,7 +30,8 @@ type
     function SmartZoom3: boolean;
     function SmartZoom3: boolean;
     procedure Undo;
     procedure Undo;
     procedure Redo;
     procedure Redo;
-    procedure SetCurrentBitmap(bmp: TBGRABitmap; AUndoable: boolean);
+    procedure SetCurrentBitmap(bmp: TBGRABitmap; AUndoable: boolean;
+      ACaption: string = ''; AOpacity: byte = 255);
     procedure CropToSelectionAndLayer;
     procedure CropToSelectionAndLayer;
     procedure CropToSelection;
     procedure CropToSelection;
     procedure HorizontalFlip(AOption: TFlipOption);
     procedure HorizontalFlip(AOption: TFlipOption);
@@ -274,8 +275,8 @@ end;
 procedure TImageActions.Undo;
 procedure TImageActions.Undo;
 begin
 begin
   try
   try
-    if CurrentTool in[ptTextureMapping,ptLayerMapping,ptMoveSelection,ptRotateSelection] then
-      ChooseTool(ptHand);
+    if CurrentTool in[ptMoveSelection,ptRotateSelection] then ChooseTool(ptHand);
+    if ToolManager.ToolProvideCommand(tcFinish) then ToolManager.ToolCommand(tcFinish);
     if image.CanUndo then
     if image.CanUndo then
     begin
     begin
       ToolManager.ToolCloseDontReopen;
       ToolManager.ToolCloseDontReopen;
@@ -388,7 +389,7 @@ begin
           end;
           end;
           FInstance.ShowTopmost(top);
           FInstance.ShowTopmost(top);
         end;
         end;
-        SetCurrentBitmap(partial,true);
+        SetCurrentBitmap(partial,true,image.LayerName[image.CurrentLayerIndex],image.LayerOpacity[image.CurrentLayerIndex]);
       end
       end
       else
       else
         partial.Free;
         partial.Free;
@@ -401,15 +402,14 @@ end;
 
 
 procedure TImageActions.CropToSelection;
 procedure TImageActions.CropToSelection;
 var cropped: TLayeredBitmapAndSelection;
 var cropped: TLayeredBitmapAndSelection;
-    r: TRect;
+    r, subBounds: TRect;
     i,selectedLayer: integer;
     i,selectedLayer: integer;
+    ofs: TPoint;
+    tempLayer, flattened: TBGRABitmap;
+    selectionIsRect: Boolean;
+    top: TTopMostInfo;
 begin
 begin
   if not image.CheckNoAction then exit;
   if not image.CheckNoAction then exit;
-  if image.NbLayers = 1 then
-  begin
-    CropToSelectionAndLayer;
-    exit;
-  end;
   try
   try
     if image.SelectionMaskEmpty then
     if image.SelectionMaskEmpty then
     begin
     begin
@@ -421,15 +421,68 @@ begin
       r := image.SelectionMaskBounds;
       r := image.SelectionMaskBounds;
       if (r.left = 0) and (r.Top = 0) and (r.right = image.width) and (r.Bottom =image.height) then exit;
       if (r.left = 0) and (r.Top = 0) and (r.right = image.width) and (r.Bottom =image.height) then exit;
       cropped := image.MakeLayeredBitmapAndSelectionCopy;
       cropped := image.MakeLayeredBitmapAndSelectionCopy;
+      BGRAReplace(cropped.selection,cropped.selection.GetPart(r));
+      selectionIsRect := cropped.selection.Equals(BGRAWhite);
+      if cropped.selectionLayer <> nil then BGRAReplace(cropped.selectionLayer,cropped.selectionLayer.GetPart(r));
       selectedLayer := image.CurrentLayerIndex;
       selectedLayer := image.CurrentLayerIndex;
       for i := 0 to cropped.layeredBitmap.NbLayers-1 do
       for i := 0 to cropped.layeredBitmap.NbLayers-1 do
       begin
       begin
-        cropped.layeredBitmap.LayerBitmap[i].ApplyMask(cropped.selection);
-        cropped.layeredBitmap.SetLayerBitmap(i, cropped.layeredBitmap.LayerBitmap[i].GetPart(r) as TBGRABitmap, true);
+        tempLayer := TBGRABitmap.Create(r.Width,r.Height);
+        if selectionIsRect and (cropped.layeredBitmap.LayerOriginalGuid[i]<>GUID_NULL) and
+          cropped.layeredBitmap.LayerOriginalKnown[i] then
+        begin
+          ofs := cropped.layeredBitmap.LayerOffset[i];
+          cropped.layeredBitmap.LayerOriginalMatrix[i] :=
+             AffineMatrixTranslation(-r.Left, -r.Top)*
+             cropped.layeredBitmap.LayerOriginalMatrix[i];
+          cropped.layeredBitmap.RenderLayerFromOriginal(i);
+        end else
+        begin
+          ofs := cropped.layeredBitmap.LayerOffset[i];
+          tempLayer.PutImage(ofs.x-r.Left,ofs.y-r.Top, cropped.layeredBitmap.LayerBitmap[i], dmSet);
+          tempLayer.ApplyMask(cropped.selection);
+          cropped.layeredBitmap.SetLayerBitmap(i, tempLayer, true);
+          cropped.layeredBitmap.LayerOffset[i] := Point(0,0);
+        end;
+      end;
+      if cropped.selectionLayer = nil then
+      begin
+        FreeAndNil(cropped.selection);
+        if (CurrentTool in [ptMoveSelection,ptRotateSelection]) then
+          ChooseTool(ptHand);
       end;
       end;
       cropped.layeredBitmap.SetSize(r.right-r.left,r.Bottom-r.top);
       cropped.layeredBitmap.SetSize(r.right-r.left,r.Bottom-r.top);
-      BGRAReplace(cropped.selection,cropped.selection.GetPart(r));
-      if cropped.selectionLayer <> nil then BGRAReplace(cropped.selectionLayer,cropped.selectionLayer.GetPart(r));
+      cropped.layeredBitmap.RemoveUnusedOriginals;
+      flattened := cropped.layeredBitmap.ComputeFlatImage;
+      subBounds := flattened.GetImageBounds;
+      flattened.Free;
+      if cropped.selectionLayer<>nil then
+        subBounds := RectUnion(subBounds, cropped.selectionLayer.GetImageBounds);
+      if (subBounds.Left > 0) or (subBounds.Top > 0) or
+        (subBounds.Right < cropped.layeredBitmap.Width) or (subBounds.Bottom < cropped.layeredBitmap.Height) then
+      begin
+        top := FInstance.HideTopmost;
+        case MessageDlg(rsCrop,rsKeepEmptySpace,mtConfirmation,mbYesNo,0) of
+        mrNo: begin
+            for i := 0 to cropped.layeredBitmap.NbLayers-1 do
+            begin
+              if cropped.layeredBitmap.LayerOriginalGuid[i]=GUID_NULL then
+              begin
+                ofs := cropped.layeredBitmap.LayerOffset[i];
+                cropped.layeredBitmap.LayerOffset[i] := Point(ofs.x-subBounds.Left,ofs.y-subBounds.Top);
+              end else
+              begin
+                cropped.layeredBitmap.LayerOriginalMatrix[i] :=
+                  AffineMatrixTranslation(-subBounds.Left,-subBounds.Top)*
+                  cropped.layeredBitmap.LayerOriginalMatrix[i];
+                cropped.layeredBitmap.RenderLayerFromOriginal(i);
+              end;
+            end;
+            cropped.layeredBitmap.SetSize(subBounds.Width, subBounds.Height);
+          end;
+        end;
+        FInstance.ShowTopmost(top);
+      end;
       image.Assign(cropped,true,true);
       image.Assign(cropped,true,true);
       image.SetCurrentLayerByIndex(selectedLayer);
       image.SetCurrentLayerByIndex(selectedLayer);
     end;
     end;
@@ -439,11 +492,12 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TImageActions.SetCurrentBitmap(bmp: TBGRABitmap; AUndoable : boolean);
+procedure TImageActions.SetCurrentBitmap(bmp: TBGRABitmap; AUndoable : boolean;
+  ACaption: string; AOpacity: byte);
 begin
 begin
   ToolManager.ToolCloseDontReopen;
   ToolManager.ToolCloseDontReopen;
   try
   try
-    image.Assign(bmp,True,AUndoable);
+    image.Assign(bmp,True,AUndoable, ACaption,AOpacity);
   finally
   finally
     ToolManager.ToolOpen;
     ToolManager.ToolOpen;
   end;
   end;
@@ -962,7 +1016,11 @@ begin
   end;}
   end;}
   if image.NbLayers < MaxLayersToAdd then
   if image.NbLayers < MaxLayersToAdd then
   begin
   begin
+    if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping,ptTextureMapping,ptDeformation] then
+      ChooseTool(ptHand);
+    ToolManager.ToolCloseDontReopen;
     Image.AddNewLayer;
     Image.AddNewLayer;
+    ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
   end;
   end;
 end;
 end;
@@ -972,7 +1030,11 @@ function TImageActions.NewLayer(ALayer: TBGRABitmap; AName: string;
 begin
 begin
   if image.NbLayers < MaxLayersToAdd then
   if image.NbLayers < MaxLayersToAdd then
   begin
   begin
+    if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping,ptTextureMapping,ptDeformation] then
+      ChooseTool(ptHand);
+    ToolManager.ToolCloseDontReopen;
     Image.AddNewLayer(ALayer, AName, ABlendOp);
     Image.AddNewLayer(ALayer, AName, ABlendOp);
+    ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     result := true;
     result := true;
   end else
   end else
@@ -988,7 +1050,11 @@ function TImageActions.NewLayer(ALayer: TBGRALayerCustomOriginal;
 begin
 begin
   if image.NbLayers < MaxLayersToAdd then
   if image.NbLayers < MaxLayersToAdd then
   begin
   begin
+    if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping,ptTextureMapping,ptDeformation] then
+      ChooseTool(ptHand);
+    ToolManager.ToolCloseDontReopen;
     Image.AddNewLayer(ALayer, AName, ABlendOp, AMatrix);
     Image.AddNewLayer(ALayer, AName, ABlendOp, AMatrix);
+    ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     result := true;
     result := true;
   end else
   end else
@@ -1010,9 +1076,11 @@ end;
 
 
 procedure TImageActions.RasterizeLayer;
 procedure TImageActions.RasterizeLayer;
 begin
 begin
-  if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping] then
+  if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping,ptTextureMapping,ptDeformation] then
     ChooseTool(ptHand);
     ChooseTool(ptHand);
+  ToolManager.ToolCloseDontReopen;
   Image.RasterizeLayer;
   Image.RasterizeLayer;
+  ToolManager.ToolOpen;
   FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
   FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
 end;
 end;
 
 
@@ -1020,6 +1088,7 @@ procedure TImageActions.MergeLayerOver;
 begin
 begin
   if (Image.CurrentLayerIndex <> -1) and (image.NbLayers > 1) then
   if (Image.CurrentLayerIndex <> -1) and (image.NbLayers > 1) then
   begin
   begin
+    ChooseTool(ptHand);
     Image.MergeLayerOver;
     Image.MergeLayerOver;
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
     FInstance.ScrollLayerStackOnItem(Image.CurrentLayerIndex);
   end;
   end;
@@ -1031,7 +1100,11 @@ begin
   if (Image.CurrentLayerIndex <> -1) and (Image.NbLayers > 1) then
   if (Image.CurrentLayerIndex <> -1) and (Image.NbLayers > 1) then
   begin
   begin
     idx := Image.CurrentLayerIndex;
     idx := Image.CurrentLayerIndex;
+    if CurrentTool in[ptMoveLayer,ptRotateLayer,ptZoomLayer,ptLayerMapping,ptTextureMapping,ptDeformation] then
+      ChooseTool(ptHand);
+    ToolManager.ToolCloseDontReopen;
     Image.RemoveLayer;
     Image.RemoveLayer;
+    ToolManager.ToolOpen;
     FInstance.ScrollLayerStackOnItem(idx);
     FInstance.ScrollLayerStackOnItem(idx);
   end;
   end;
 end;
 end;

+ 205 - 22
lazpaint/image/uimagediff.pas

@@ -105,8 +105,11 @@ type
   private
   private
     previousOpacity,nextOpacity: byte;
     previousOpacity,nextOpacity: byte;
     layerId: integer;
     layerId: integer;
+    layerBounds: TRect;
   protected
   protected
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
+    function GetChangingBounds: TRect; override;
+    function GetChangingBoundsDefined: boolean; override;
     function GetIsIdentity: boolean; override;
     function GetIsIdentity: boolean; override;
   public
   public
     constructor Create(ADestination: TState; ALayerId: integer; ANewOpacity: byte);
     constructor Create(ADestination: TState; ALayerId: integer; ANewOpacity: byte);
@@ -202,8 +205,11 @@ type
   private
   private
     previousVisible,nextVisible: boolean;
     previousVisible,nextVisible: boolean;
     layerId: integer;
     layerId: integer;
+    layerBounds: TRect;
   protected
   protected
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
+    function GetChangingBounds: TRect; override;
+    function GetChangingBoundsDefined: boolean; override;
     function GetIsIdentity: boolean; override;
     function GetIsIdentity: boolean; override;
   public
   public
     constructor Create(ADestination: TState; ALayerId: integer; ANewVisible: boolean);
     constructor Create(ADestination: TState; ALayerId: integer; ANewVisible: boolean);
@@ -217,8 +223,11 @@ type
   private
   private
     previousBlendOp,nextBlendOp: TBlendOperation;
     previousBlendOp,nextBlendOp: TBlendOperation;
     layerId: integer;
     layerId: integer;
+    layerBounds: TRect;
   protected
   protected
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
+    function GetChangingBounds: TRect; override;
+    function GetChangingBoundsDefined: boolean; override;
     function GetIsIdentity: boolean; override;
     function GetIsIdentity: boolean; override;
   public
   public
     constructor Create(ADestination: TState; ALayerId: integer; ANewBlendOp: TBlendOperation);
     constructor Create(ADestination: TState; ALayerId: integer; ANewBlendOp: TBlendOperation);
@@ -272,8 +281,8 @@ type
 
 
   TRemoveLayerStateDifference = class(TCustomImageDifference)
   TRemoveLayerStateDifference = class(TCustomImageDifference)
   protected
   protected
-    content: TStoredLayer;
-    nextActiveLayerId: integer;
+    FContent: TStoredLayer;
+    FNextActiveLayerId: integer;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
     function GetImageDifferenceKind: TImageDifferenceKind; override;
   public
   public
     function UsedMemory: int64; override;
     function UsedMemory: int64; override;
@@ -282,6 +291,7 @@ type
     procedure UnapplyTo(AState: TState); override;
     procedure UnapplyTo(AState: TState); override;
     constructor Create(AState: TState);
     constructor Create(AState: TState);
     destructor Destroy; override;
     destructor Destroy; override;
+    property nextActiveLayerId: integer read FNextActiveLayerId write FNextActiveLayerId;
   end;
   end;
 
 
   { TReplaceLayerByOriginalDifference }
   { TReplaceLayerByOriginalDifference }
@@ -482,6 +492,8 @@ type
     layerOverIndex: integer;
     layerOverIndex: integer;
     layerOverCompressedBackup: TStoredLayer;
     layerOverCompressedBackup: TStoredLayer;
     layerUnderCompressedBackup: TStoredLayer;
     layerUnderCompressedBackup: TStoredLayer;
+    mergeVectorial: boolean;
+    mergeVectorialGuid: TGuid;
     constructor Create(ADestination: TState; ALayerOverIndex: integer);
     constructor Create(ADestination: TState; ALayerOverIndex: integer);
     function UsedMemory: int64; override;
     function UsedMemory: int64; override;
     function TryCompress: boolean; override;
     function TryCompress: boolean; override;
@@ -703,7 +715,9 @@ begin
   img := AState as TImageState;
   img := AState as TImageState;
   idxOrig := img.LayeredBitmap.IndexOfOriginal(FOriginalGuid);
   idxOrig := img.LayeredBitmap.IndexOfOriginal(FOriginalGuid);
   if idxOrig<>-1 then
   if idxOrig<>-1 then
-    FDiff.Apply(img.LayeredBitmap.Original[idxOrig]);
+    FDiff.Apply(img.LayeredBitmap.Original[idxOrig])
+  else
+    raise exception.Create('Cannot find original');
 end;
 end;
 
 
 procedure TVectorOriginalEmbeddedDifference.UnapplyTo(AState: TState);
 procedure TVectorOriginalEmbeddedDifference.UnapplyTo(AState: TState);
@@ -715,7 +729,9 @@ begin
   img := AState as TImageState;
   img := AState as TImageState;
   idxOrig := img.LayeredBitmap.IndexOfOriginal(FOriginalGuid);
   idxOrig := img.LayeredBitmap.IndexOfOriginal(FOriginalGuid);
   if idxOrig<>-1 then
   if idxOrig<>-1 then
-    FDiff.Unapply(img.LayeredBitmap.Original[idxOrig]);
+    FDiff.Unapply(img.LayeredBitmap.Original[idxOrig])
+  else
+    raise exception.Create('Cannot find original');
 end;
 end;
 
 
 { TDiscardOriginalDifference }
 { TDiscardOriginalDifference }
@@ -928,17 +944,40 @@ begin
     shape.BackFill.Transform(imgState.LayeredBitmap.LayerOriginalMatrix[ALayerIndex]);
     shape.BackFill.Transform(imgState.LayeredBitmap.LayerOriginalMatrix[ALayerIndex]);
     orig.AddShape(shape);
     orig.AddShape(shape);
   end else
   end else
+  if imgState.LayeredBitmap.LayerOriginalClass[ALayerIndex]=TBGRALayerImageOriginal then
+  begin
+    temp := (imgState.LayeredBitmap.LayerOriginal[ALayerIndex] as TBGRALayerImageOriginal).GetImageCopy;
+    if temp <> nil then
+    begin
+      if not temp.Empty then
+      begin
+        shape := TRectShape.Create(orig);
+        shape.QuickDefine(PointF(-0.5,-0.5),PointF(temp.Width-0.5,temp.Height-0.5));
+        shape.PenStyle := ClearPenStyle;
+        if temp.Equals(temp.GetPixel(0,0)) then
+          shape.BackFill.SetSolid(temp.GetPixel(0,0))
+          else shape.BackFill.SetTexture(temp,AffineMatrixIdentity,255,trNone);
+        shape.Transform(imgState.LayeredBitmap.LayerOriginalMatrix[ALayerIndex]);
+        with imgState.LayeredBitmap.LayerOffset[ALayerIndex] do
+          shape.Transform(AffineMatrixTranslation(-X-FSourceBounds.Left,-Y-FSourceBounds.Top));
+        orig.AddShape(shape);
+      end;
+      temp.FreeReference;
+    end;
+  end else
   begin
   begin
     source := imgState.LayeredBitmap.LayerBitmap[ALayerIndex];
     source := imgState.LayeredBitmap.LayerBitmap[ALayerIndex];
     if not source.Empty then
     if not source.Empty then
     begin
     begin
+      temp := source.GetPart(FSourceBounds) as TBGRABitmap;
       shape := TRectShape.Create(orig);
       shape := TRectShape.Create(orig);
       shape.QuickDefine(PointF(-0.5,-0.5),PointF(FSourceBounds.Width-0.5,FSourceBounds.Height-0.5));
       shape.QuickDefine(PointF(-0.5,-0.5),PointF(FSourceBounds.Width-0.5,FSourceBounds.Height-0.5));
       shape.PenStyle := ClearPenStyle;
       shape.PenStyle := ClearPenStyle;
-      temp := source.GetPart(FSourceBounds) as TBGRABitmap;
-      shape.BackFill.SetTexture(temp,AffineMatrixIdentity,255,trNone);
-      temp.FreeReference;
+      if temp.Equals(temp.GetPixel(0,0)) then
+        shape.BackFill.SetSolid(temp.GetPixel(0,0))
+        else shape.BackFill.SetTexture(temp,AffineMatrixIdentity,255,trNone);
       orig.AddShape(shape);
       orig.AddShape(shape);
+      temp.FreeReference;
     end;
     end;
   end;
   end;
   result := orig;
   result := orig;
@@ -1142,6 +1181,7 @@ begin
     imgState.LayeredBitmap.LayerOriginalRenderStatus[layerIdx] := orsNone;
     imgState.LayeredBitmap.LayerOriginalRenderStatus[layerIdx] := orsNone;
     imgState.LayeredBitmap.RenderLayerFromOriginal(layerIdx);
     imgState.LayeredBitmap.RenderLayerFromOriginal(layerIdx);
   end;
   end;
+  imgState.LayeredBitmap.RemoveUnusedOriginals;
 end;
 end;
 
 
 procedure TReplaceLayerByOriginalDifference.UnapplyTo(AState: TState);
 procedure TReplaceLayerByOriginalDifference.UnapplyTo(AState: TState);
@@ -1636,7 +1676,17 @@ end;
 
 
 function TSetLayerBlendOpStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 function TSetLayerBlendOpStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 begin
 begin
-  Result:= idkChangeLayer;
+  Result:= idkChangeImage;
+end;
+
+function TSetLayerBlendOpStateDifference.GetChangingBounds: TRect;
+begin
+  Result:= layerBounds;
+end;
+
+function TSetLayerBlendOpStateDifference.GetChangingBoundsDefined: boolean;
+begin
+  Result:= true;
 end;
 end;
 
 
 function TSetLayerBlendOpStateDifference.GetIsIdentity: boolean;
 function TSetLayerBlendOpStateDifference.GetIsIdentity: boolean;
@@ -1657,6 +1707,8 @@ begin
   if idx =-1 then
   if idx =-1 then
     raise exception.Create('Layer not found');
     raise exception.Create('Layer not found');
   previousBlendOp:= imgDest.BlendOperation[idx];
   previousBlendOp:= imgDest.BlendOperation[idx];
+  layerBounds := imgDest.LayerBitmap[idx].GetImageBounds;
+  with imgDest.LayerOffset[idx] do layerBounds.Offset(x,y);
   ApplyTo(imgDest);
   ApplyTo(imgDest);
 end;
 end;
 
 
@@ -1684,7 +1736,17 @@ end;
 
 
 function TSetLayerVisibleStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 function TSetLayerVisibleStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 begin
 begin
-  Result:= idkChangeLayer;
+  Result:= idkChangeImage;
+end;
+
+function TSetLayerVisibleStateDifference.GetChangingBounds: TRect;
+begin
+  Result:= layerBounds;
+end;
+
+function TSetLayerVisibleStateDifference.GetChangingBoundsDefined: boolean;
+begin
+  Result:= true;
 end;
 end;
 
 
 function TSetLayerVisibleStateDifference.GetIsIdentity: boolean;
 function TSetLayerVisibleStateDifference.GetIsIdentity: boolean;
@@ -1705,6 +1767,8 @@ begin
   if idx =-1 then
   if idx =-1 then
     raise exception.Create('Layer not found');
     raise exception.Create('Layer not found');
   previousVisible:= imgDest.LayerVisible[idx];
   previousVisible:= imgDest.LayerVisible[idx];
+  layerBounds := imgDest.LayerBitmap[idx].GetImageBounds;
+  with imgDest.LayerOffset[idx] do layerBounds.Offset(x,y);
   ApplyTo(imgDest);
   ApplyTo(imgDest);
 end;
 end;
 
 
@@ -1732,7 +1796,17 @@ end;
 
 
 function TSetLayerOpacityStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 function TSetLayerOpacityStateDifference.GetImageDifferenceKind: TImageDifferenceKind;
 begin
 begin
-  Result:= idkChangeLayer;
+  Result:= idkChangeImage;
+end;
+
+function TSetLayerOpacityStateDifference.GetChangingBounds: TRect;
+begin
+  Result:= layerBounds;
+end;
+
+function TSetLayerOpacityStateDifference.GetChangingBoundsDefined: boolean;
+begin
+  Result:= true;
 end;
 end;
 
 
 function TSetLayerOpacityStateDifference.GetIsIdentity: boolean;
 function TSetLayerOpacityStateDifference.GetIsIdentity: boolean;
@@ -1753,6 +1827,8 @@ begin
   if idx =-1 then
   if idx =-1 then
     raise exception.Create('Layer not found');
     raise exception.Create('Layer not found');
   previousOpacity:= imgDest.LayerOpacity[idx];
   previousOpacity:= imgDest.LayerOpacity[idx];
+  layerBounds := imgDest.LayerBitmap[idx].GetImageBounds;
+  with imgDest.LayerOffset[idx] do layerBounds.Offset(x,y);
   ApplyTo(imgDest);
   ApplyTo(imgDest);
 end;
 end;
 
 
@@ -2022,15 +2098,15 @@ end;
 
 
 function TRemoveLayerStateDifference.UsedMemory: int64;
 function TRemoveLayerStateDifference.UsedMemory: int64;
 begin
 begin
-  if Assigned(content) then
-    result := content.UsedMemory
+  if Assigned(FContent) then
+    result := FContent.UsedMemory
   else
   else
     result := 0;
     result := 0;
 end;
 end;
 
 
 function TRemoveLayerStateDifference.TryCompress: boolean;
 function TRemoveLayerStateDifference.TryCompress: boolean;
 begin
 begin
-  Result:= content.Compress;
+  Result:= FContent.Compress;
 end;
 end;
 
 
 procedure TRemoveLayerStateDifference.ApplyTo(AState: TState);
 procedure TRemoveLayerStateDifference.ApplyTo(AState: TState);
@@ -2039,10 +2115,10 @@ begin
   inherited ApplyTo(AState);
   inherited ApplyTo(AState);
   with AState as TImageState do
   with AState as TImageState do
   begin
   begin
-    idx := LayeredBitmap.GetLayerIndexFromId(content.LayerId);
+    idx := LayeredBitmap.GetLayerIndexFromId(FContent.LayerId);
     LayeredBitmap.RemoveLayer(idx);
     LayeredBitmap.RemoveLayer(idx);
     LayeredBitmap.RemoveUnusedOriginals;
     LayeredBitmap.RemoveUnusedOriginals;
-    SelectedImageLayerIndex := LayeredBitmap.GetLayerIndexFromId(self.nextActiveLayerId);
+    SelectedImageLayerIndex := LayeredBitmap.GetLayerIndexFromId(self.FNextActiveLayerId);
   end;
   end;
 end;
 end;
 
 
@@ -2051,8 +2127,8 @@ begin
   inherited UnapplyTo(AState);
   inherited UnapplyTo(AState);
   with AState as TImageState do
   with AState as TImageState do
   begin
   begin
-    content.Restore(LayeredBitmap);
-    SelectedImageLayerIndex := content.LayerIndex;
+    FContent.Restore(LayeredBitmap);
+    SelectedImageLayerIndex := FContent.LayerIndex;
   end;
   end;
 end;
 end;
 
 
@@ -2069,15 +2145,15 @@ begin
   idx := imgState.SelectedImageLayerIndex;
   idx := imgState.SelectedImageLayerIndex;
   if idx = -1 then
   if idx = -1 then
     raise exception.Create('No layer selected');
     raise exception.Create('No layer selected');
-  self.content := TStoredLayer.Create(imgState.LayeredBitmap, idx);
+  self.FContent := TStoredLayer.Create(imgState.LayeredBitmap, idx);
   if idx+1 < imgState.NbLayers then
   if idx+1 < imgState.NbLayers then
     nextIdx := idx+1 else nextIdx := idx-1;
     nextIdx := idx+1 else nextIdx := idx-1;
-  self.nextActiveLayerId := imgState.LayeredBitmap.LayerUniqueId[nextIdx];
+  self.FNextActiveLayerId := imgState.LayeredBitmap.LayerUniqueId[nextIdx];
 end;
 end;
 
 
 destructor TRemoveLayerStateDifference.Destroy;
 destructor TRemoveLayerStateDifference.Destroy;
 begin
 begin
-  self.content.Free;
+  self.FContent.Free;
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
@@ -2092,6 +2168,7 @@ constructor TMergeLayerOverStateDifference.Create(ADestination: TState;
   ALayerOverIndex: integer);
   ALayerOverIndex: integer);
 var
 var
   imgDest: TImageState;
   imgDest: TImageState;
+  totalCost: Integer;
 begin
 begin
   inherited Create(ADestination);
   inherited Create(ADestination);
   imgDest := ADestination as TImageState;
   imgDest := ADestination as TImageState;
@@ -2100,12 +2177,30 @@ begin
   if ALayerOverIndex = 0 then
   if ALayerOverIndex = 0 then
     raise exception.Create('First layer cannot be merged over');
     raise exception.Create('First layer cannot be merged over');
 
 
+  mergeVectorial := false;
+  mergeVectorialGuid := GUID_NULL;
   layerOverIndex := ALayerOverIndex;
   layerOverIndex := ALayerOverIndex;
   with imgDest.LayeredBitmap do
   with imgDest.LayeredBitmap do
   begin
   begin
     previousActiveLayerId:= LayerUniqueId[imgDest.SelectedImageLayerIndex];
     previousActiveLayerId:= LayerUniqueId[imgDest.SelectedImageLayerIndex];
     layerOverCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex, true);
     layerOverCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex, true);
     layerUnderCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex-1, true);
     layerUnderCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex-1, true);
+    if ((LayerOriginalClass[ALayerOverIndex] = TVectorOriginal) or
+       (LayerOriginalClass[ALayerOverIndex-1] = TVectorOriginal) or
+       (LayerOriginalClass[ALayerOverIndex] = TBGRALayerGradientOriginal) or
+       (LayerOriginalClass[ALayerOverIndex-1] = TBGRALayerGradientOriginal)) and
+       (BlendOperation[ALayerOverIndex] = boTransparent) and
+       (BlendOperation[ALayerOverIndex-1] = boTransparent) then
+    begin
+      totalCost := 0;
+      if LayerOriginalClass[ALayerOverIndex] = TVectorOriginal then
+        inc(totalCost, TVectorOriginal(LayerOriginal[ALayerOverIndex]).GetShapesCost)
+      else inc(totalCost, 10);
+      if LayerOriginalClass[ALayerOverIndex-1] = TVectorOriginal then
+        inc(totalCost, TVectorOriginal(LayerOriginal[ALayerOverIndex-1]).GetShapesCost)
+      else inc(totalCost, 10);
+      if totalCost <= MediumShapeCost then mergeVectorial := true;
+    end;
   end;
   end;
 
 
   //select layer under and merge
   //select layer under and merge
@@ -2127,6 +2222,80 @@ end;
 procedure TMergeLayerOverStateDifference.ApplyTo(AState: TState);
 procedure TMergeLayerOverStateDifference.ApplyTo(AState: TState);
 var
 var
   merged: TBGRABitmap;
   merged: TBGRABitmap;
+  mergedOriginal: TVectorOriginal;
+
+  procedure AppendToMergedOriginal(ALayeredBitmap: TBGRALayeredBitmap; ALayerIndex: integer);
+  var
+    vectOrig: TVectorOriginal;
+    m: TAffineMatrix;
+    i: Integer;
+    s: TVectorShape;
+    temp: TBGRABitmap;
+    b: TRect;
+    c: TBGRALayerOriginalAny;
+  begin
+    c := ALayeredBitmap.LayerOriginalClass[ALayerIndex];
+    m := ALayeredBitmap.LayerOriginalMatrix[ALayerIndex];
+    if c = TVectorOriginal then
+    begin
+      vectOrig := ALayeredBitmap.LayerOriginal[ALayerIndex] as TVectorOriginal;
+      for i := 0 to vectOrig.ShapeCount-1 do
+      begin
+        s := vectOrig.Shape[i].Duplicate;
+        s.Transform(m);
+        mergedOriginal.AddShape(s);
+      end;
+    end else
+    if c = TBGRALayerGradientOriginal then
+    begin
+      s := TRectShape.Create(mergedOriginal);
+      s.PenStyle := ClearPenStyle;
+      s.BackFill.SetGradient(ALayeredBitmap.LayerOriginal[ALayerIndex] as TBGRALayerGradientOriginal, false);
+      s.BackFill.Transform(m);
+      s.QuickDefine(PointF(-0.5,-0.5), PointF(ALayeredBitmap.width-0.5,ALayeredBitmap.Height-0.5));
+      mergedOriginal.AddShape(s);
+    end else
+    if c = TBGRALayerImageOriginal then
+    begin
+      temp := (ALayeredBitmap.LayerOriginal[ALayerIndex] as TBGRALayerImageOriginal).GetImageCopy;
+      if Assigned(temp) then
+      begin
+        if not temp.Empty then
+        begin
+          s := TRectShape.Create(mergedOriginal);
+          s.PenStyle := ClearPenStyle;
+          if temp.Equals(temp.GetPixel(0,0)) then
+            s.BackFill.SetSolid(temp.GetPixel(0,0))
+            else s.BackFill.SetTexture(temp, AffineMatrixIdentity, 255, trNone);
+          s.QuickDefine(PointF(-0.5,-0.5), PointF(temp.width-0.5,temp.Height-0.5));
+          s.Transform(m);
+          mergedOriginal.AddShape(s);
+        end;
+        temp.FreeReference;
+      end;
+    end else
+    begin
+      if Assigned(ALayeredBitmap.LayerBitmap[ALayerIndex]) then
+      begin
+        b := ALayeredBitmap.LayerBitmap[ALayerIndex].GetImageBounds;
+        if not b.IsEmpty then
+        begin
+          temp := ALayeredBitmap.LayerBitmap[ALayerIndex].GetPart(b) as TBGRABitmap;
+          s := TRectShape.Create(mergedOriginal);
+          s.PenStyle := ClearPenStyle;
+          if temp.Equals(temp.GetPixel(0,0)) then
+            s.BackFill.SetSolid(temp.GetPixel(0,0))
+            else s.BackFill.SetTexture(temp, AffineMatrixIdentity, 255, trNone);
+          s.QuickDefine(PointF(-0.5,-0.5), PointF(temp.width-0.5,temp.Height-0.5));
+          with ALayeredBitmap.LayerOffset[ALayerIndex] do
+            s.Transform(AffineMatrixTranslation(b.Left+X,b.Top+Y));
+          mergedOriginal.AddShape(s);
+          temp.FreeReference;
+        end;
+      end;
+    end;
+  end;
+
 begin
 begin
   inherited ApplyTo(AState);
   inherited ApplyTo(AState);
   with AState as TImageState do
   with AState as TImageState do
@@ -2134,6 +2303,18 @@ begin
     if layerOverIndex >= NbLayers then exit;
     if layerOverIndex >= NbLayers then exit;
 
 
      SelectedImageLayerIndex := layerOverIndex-1;
      SelectedImageLayerIndex := layerOverIndex-1;
+     if mergeVectorial then
+     begin
+       mergedOriginal := TVectorOriginal.Create;
+       mergedOriginal.Guid := mergeVectorialGuid;
+       AppendToMergedOriginal(LayeredBitmap, layerOverIndex-1);
+       AppendToMergedOriginal(LayeredBitmap, layerOverIndex);
+       LayeredBitmap.AddOriginal(mergedOriginal);
+       mergeVectorialGuid := mergedOriginal.Guid;
+       LayeredBitmap.LayerOriginalGuid[layerOverIndex-1] := mergedOriginal.Guid;
+       LayeredBitmap.LayerOriginalMatrix[layerOverIndex-1] := AffineMatrixIdentity;
+       LayeredBitmap.RenderLayerFromOriginal(layerOverIndex-1);
+     end else
      if (LayerBitmap[layerOverIndex-1].Width <> Width) or
      if (LayerBitmap[layerOverIndex-1].Width <> Width) or
         (LayerBitmap[layerOverIndex-1].Height <> Height) or
         (LayerBitmap[layerOverIndex-1].Height <> Height) or
         (LayerOffset[layerOverIndex-1].X <> 0) or
         (LayerOffset[layerOverIndex-1].X <> 0) or
@@ -2240,7 +2421,7 @@ begin
         if duplicateOriginal then
         if duplicateOriginal then
         begin
         begin
           stream:= TMemoryStream.Create;
           stream:= TMemoryStream.Create;
-          SaveOriginalToStream(sourceLayerIndex, stream);
+          SaveOriginalToStream(LayerOriginalGuid[sourceLayerIndex], stream);
           stream.Position:= 0;
           stream.Position:= 0;
           AddOriginalFromStream(stream, duplicateGuid, true);
           AddOriginalFromStream(stream, duplicateGuid, true);
           stream.Free;
           stream.Free;
@@ -2282,7 +2463,7 @@ begin
   begin
   begin
     self.sourceLayerId := LayeredBitmap.LayerUniqueId[SelectedImageLayerIndex];
     self.sourceLayerId := LayeredBitmap.LayerUniqueId[SelectedImageLayerIndex];
     self.duplicateId := LayeredBitmap.ProduceLayerUniqueId;
     self.duplicateId := LayeredBitmap.ProduceLayerUniqueId;
-    self.duplicateOriginal := useOriginal and (LayeredBitmap.OriginalClass[SelectedImageLayerIndex]=TVectorOriginal);
+    self.duplicateOriginal := useOriginal and (LayeredBitmap.LayerOriginalClass[SelectedImageLayerIndex]=TVectorOriginal);
     if self.duplicateOriginal then
     if self.duplicateOriginal then
       CreateGUID(duplicateGuid);
       CreateGUID(duplicateGuid);
   end;
   end;
@@ -2509,6 +2690,7 @@ begin
   begin
   begin
     idx := lState.LayeredBitmap.GetLayerIndexFromId(layerId);
     idx := lState.LayeredBitmap.GetLayerIndexFromId(layerId);
     if idx = -1 then raise exception.Create('Layer not found');
     if idx = -1 then raise exception.Create('Layer not found');
+    lState.LayeredBitmap.Unfreeze(idx);
     if ChangeImageLayer and (lState.LayeredBitmap.LayerOriginalGuid[idx] <> GUID_NULL) then raise exception.Create('Does not apply to originals');
     if ChangeImageLayer and (lState.LayeredBitmap.LayerOriginalGuid[idx] <> GUID_NULL) then raise exception.Create('Does not apply to originals');
     if ChangeImageLayer then
     if ChangeImageLayer then
     begin
     begin
@@ -2533,6 +2715,7 @@ begin
   begin
   begin
     idx := lState.LayeredBitmap.GetLayerIndexFromId(layerId);
     idx := lState.LayeredBitmap.GetLayerIndexFromId(layerId);
     if idx = -1 then raise exception.Create('Layer not found');
     if idx = -1 then raise exception.Create('Layer not found');
+    lState.LayeredBitmap.Unfreeze(idx);
     if ChangeImageLayer and (lState.LayeredBitmap.LayerOriginalGuid[idx] <> GUID_NULL) then raise exception.Create('Does not apply to originals');
     if ChangeImageLayer and (lState.LayeredBitmap.LayerOriginalGuid[idx] <> GUID_NULL) then raise exception.Create('Does not apply to originals');
     if ChangeImageLayer then
     if ChangeImageLayer then
     begin
     begin

+ 26 - 1
lazpaint/image/uimagestate.pas

@@ -124,6 +124,7 @@ type
     function SwapRedBlue: TCustomImageDifference;
     function SwapRedBlue: TCustomImageDifference;
     function LinearNegative: TCustomImageDifference;
     function LinearNegative: TCustomImageDifference;
     function Negative: TCustomImageDifference;
     function Negative: TCustomImageDifference;
+    function ClearLayer: TCustomImageDifference;
     function ComputeLayerOffsetDifference(AOffsetX, AOffsetY: integer): TCustomImageDifference;
     function ComputeLayerOffsetDifference(AOffsetX, AOffsetY: integer): TCustomImageDifference;
     function ComputeSelectionTransformDifference: TCustomImageDifference;
     function ComputeSelectionTransformDifference: TCustomImageDifference;
     function ComputeLayerMatrixDifference(AIndex: integer; APrevMatrix, ANewMatrix: TAffineMatrix): TCustomImageDifference;
     function ComputeLayerMatrixDifference(AIndex: integer; APrevMatrix, ANewMatrix: TAffineMatrix): TCustomImageDifference;
@@ -172,7 +173,7 @@ type
 implementation
 implementation
 
 
 uses BGRAStreamLayers, UImageDiff, BGRALzpCommon, UFileSystem, BGRATransform,
 uses BGRAStreamLayers, UImageDiff, BGRALzpCommon, UFileSystem, BGRATransform,
-  UResourceStrings;
+  UResourceStrings, LCVectorOriginal;
 
 
 { TImageState }
 { TImageState }
 
 
@@ -745,9 +746,21 @@ begin
 end;
 end;
 
 
 procedure TImageState.SaveToStreamAs(AStream: TStream; AFormat: TBGRAImageFormat);
 procedure TImageState.SaveToStreamAs(AStream: TStream; AFormat: TBGRAImageFormat);
+var
+  i: Integer;
+  curGuid: TGuid;
 begin
 begin
   if LayeredBitmap <> nil then
   if LayeredBitmap <> nil then
+  begin
+    if AFormat = ifLazPaint then
+    begin
+      curGuid := LayeredBitmap.LayerOriginalGuid[GetCurrentLayerIndex];
+      for i := 0 to LayeredBitmap.OriginalCount-1 do
+        if LayeredBitmap.OriginalGuid[i] <> curGuid then
+          LayeredBitmap.UnloadOriginal(i);
+    end;
     LayeredBitmap.SaveToStreamAs(AStream, SuggestImageExtension(AFormat));
     LayeredBitmap.SaveToStreamAs(AStream, SuggestImageExtension(AFormat));
+  end;
 end;
 end;
 
 
 procedure TImageState.SaveOriginalToStream(AStream: TStream);
 procedure TImageState.SaveOriginalToStream(AStream: TStream);
@@ -1027,6 +1040,18 @@ begin
   result := AssignWithUndo(newImg, true, SelectedImageLayerIndex);
   result := AssignWithUndo(newImg, true, SelectedImageLayerIndex);
 end;
 end;
 
 
+function TImageState.ClearLayer: TCustomImageDifference;
+begin
+  if (LayeredBitmap = nil) or SelectedImageLayer.Empty then
+    result := nil
+  else
+  begin
+    result := TReplaceLayerByCustomOriginalDifference.Create(self,
+                   SelectedImageLayerIndex, true,
+                   TVectorOriginal.Create);
+  end;
+end;
+
 function TImageState.RotateCW: TCustomImageDifference;
 function TImageState.RotateCW: TCustomImageDifference;
 begin
 begin
   if LayeredBitmap = nil then
   if LayeredBitmap = nil then

+ 12 - 9
lazpaint/image/ustatetype.pas

@@ -32,7 +32,7 @@ type
   end;
   end;
 
 
   TImageDifferenceKind = (idkChangeImageAndSelection, idkChangeStack, idkChangeSelection,
   TImageDifferenceKind = (idkChangeImageAndSelection, idkChangeStack, idkChangeSelection,
-                           idkChangeImage, idkChangeLayer);
+                           idkChangeImage);
 
 
   { TCustomImageDifference }
   { TCustomImageDifference }
 
 
@@ -205,6 +205,7 @@ type
     FOriginalRenderStatus: TOriginalRenderStatus;
     FOriginalRenderStatus: TOriginalRenderStatus;
     FOriginalMatrix: TAffineMatrix;
     FOriginalMatrix: TAffineMatrix;
     FOriginalDraft: boolean;
     FOriginalDraft: boolean;
+    FOriginalGuid: TGuid;
   public
   public
     constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer);
     constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer);
     constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer;
     constructor Create(ALayeredImage: TBGRALayeredBitmap; AIndex: integer;
@@ -416,16 +417,12 @@ begin
   for i := 0 to FDiffs.Count-1 do
   for i := 0 to FDiffs.Count-1 do
     case FDiffs[i].GetImageDifferenceKind of
     case FDiffs[i].GetImageDifferenceKind of
       idkChangeImageAndSelection: result := idkChangeImageAndSelection;
       idkChangeImageAndSelection: result := idkChangeImageAndSelection;
-      idkChangeSelection: if result in[idkChangeImage,idkChangeLayer,idkChangeImageAndSelection] then
+      idkChangeSelection: if result in[idkChangeImage,idkChangeImageAndSelection] then
                             result := idkChangeImageAndSelection
                             result := idkChangeImageAndSelection
                           else result := idkChangeSelection;
                           else result := idkChangeSelection;
       idkChangeImage: if result in[idkChangeImageAndSelection,idkChangeSelection] then
       idkChangeImage: if result in[idkChangeImageAndSelection,idkChangeSelection] then
                             result := idkChangeImageAndSelection
                             result := idkChangeImageAndSelection
                           else result := idkChangeImage;
                           else result := idkChangeImage;
-      idkChangeLayer: if result in[idkChangeImageAndSelection,idkChangeSelection] then
-                            result := idkChangeImageAndSelection
-                      else if result = idkChangeStack then
-                        result := idkChangeLayer;
     end;
     end;
 end;
 end;
 
 
@@ -1069,7 +1066,8 @@ begin
       inherited Create(ALayeredImage.LayerBitmap[AIndex]);
       inherited Create(ALayeredImage.LayerBitmap[AIndex]);
 
 
     FOriginalData := TMemoryStream.Create;
     FOriginalData := TMemoryStream.Create;
-    ALayeredImage.SaveOriginalToStream(ALayeredImage.LayerOriginalGuid[AIndex], FOriginalData);
+    FOriginalGuid := ALayeredImage.LayerOriginalGuid[AIndex];
+    ALayeredImage.SaveOriginalToStream(FOriginalGuid, FOriginalData);
     FOriginalMatrix := ALayeredImage.LayerOriginalMatrix[AIndex];
     FOriginalMatrix := ALayeredImage.LayerOriginalMatrix[AIndex];
     FOriginalDraft := ALayeredImage.LayerOriginalRenderStatus[AIndex] in[orsDraft,orsPartialDraft];
     FOriginalDraft := ALayeredImage.LayerOriginalRenderStatus[AIndex] in[orsDraft,orsPartialDraft];
   end else
   end else
@@ -1092,7 +1090,9 @@ begin
   if Assigned(FOriginalData) then
   if Assigned(FOriginalData) then
   begin
   begin
     FOriginalData.Position:= 0;
     FOriginalData.Position:= 0;
-    idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, true);
+    idxOrig := ALayeredImage.IndexOfOriginal(FOriginalGuid);
+    if idxOrig = -1 then
+      idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, FOriginalGuid, true);
 
 
     if not FOriginalBitmapStored then
     if not FOriginalBitmapStored then
     begin
     begin
@@ -1101,6 +1101,7 @@ begin
     end else
     end else
     begin
     begin
       tempIdx := ALayeredImage.AddOwnedLayer(GetBitmap);
       tempIdx := ALayeredImage.AddOwnedLayer(GetBitmap);
+      ALayeredImage.LayerOffset[tempIdx] := FInfo.Offset;
       ALayeredImage.LayerOriginalGuid[tempIdx] := ALayeredImage.OriginalGuid[idxOrig];
       ALayeredImage.LayerOriginalGuid[tempIdx] := ALayeredImage.OriginalGuid[idxOrig];
       ALayeredImage.LayerOriginalMatrix[tempIdx] := FOriginalMatrix;
       ALayeredImage.LayerOriginalMatrix[tempIdx] := FOriginalMatrix;
       ALayeredImage.LayerOriginalRenderStatus[tempIdx] := FOriginalRenderStatus;
       ALayeredImage.LayerOriginalRenderStatus[tempIdx] := FOriginalRenderStatus;
@@ -1119,7 +1120,9 @@ begin
   if Assigned(FOriginalData) then
   if Assigned(FOriginalData) then
   begin
   begin
     FOriginalData.Position:= 0;
     FOriginalData.Position:= 0;
-    idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, true);
+    idxOrig := ALayeredImage.IndexOfOriginal(FOriginalGuid);
+    if idxOrig = -1 then
+      idxOrig := ALayeredImage.AddOriginalFromStream(FOriginalData, FOriginalGuid, true);
     if not FOriginalBitmapStored then
     if not FOriginalBitmapStored then
     begin
     begin
       ALayeredImage.LayerOriginalGuid[FIndex] := ALayeredImage.OriginalGuid[idxOrig];
       ALayeredImage.LayerOriginalGuid[FIndex] := ALayeredImage.OriginalGuid[idxOrig];

+ 18 - 10
lazpaint/lazpaint.lpi

@@ -11,17 +11,19 @@
       <UseXPManifest Value="True"/>
       <UseXPManifest Value="True"/>
       <XPManifest>
       <XPManifest>
         <DpiAware Value="True"/>
         <DpiAware Value="True"/>
+        <TextName Value="LazPaint"/>
+        <TextDesc Value="Paint program made with Lazarus"/>
       </XPManifest>
       </XPManifest>
       <Icon Value="0"/>
       <Icon Value="0"/>
     </General>
     </General>
     <i18n>
     <i18n>
-      <EnableI18N Value="True"/>
+      <EnableI18N Value="True" LFM="False"/>
       <OutDir Value="release\bin\i18n"/>
       <OutDir Value="release\bin\i18n"/>
     </i18n>
     </i18n>
     <VersionInfo>
     <VersionInfo>
       <UseVersionInfo Value="True"/>
       <UseVersionInfo Value="True"/>
       <MajorVersionNr Value="7"/>
       <MajorVersionNr Value="7"/>
-      <RevisionNr Value="5"/>
+      <RevisionNr Value="7"/>
       <CharSet Value="04B0"/>
       <CharSet Value="04B0"/>
       <StringTable CompanyName="http://sourceforge.net/projects/lazpaint/" ProductName="LazPaint" InternalName="lazpaint" OriginalFilename="lazpaint.exe"/>
       <StringTable CompanyName="http://sourceforge.net/projects/lazpaint/" ProductName="LazPaint" InternalName="lazpaint" OriginalFilename="lazpaint.exe"/>
     </VersionInfo>
     </VersionInfo>
@@ -36,7 +38,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet;dialog;dialog\color;dialog\filter;tools;image"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -74,7 +76,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -114,7 +116,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -157,7 +159,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -197,7 +199,7 @@
           <PathDelim Value="\"/>
           <PathDelim Value="\"/>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="debug\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="debug\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <CodeGeneration>
           <CodeGeneration>
@@ -223,6 +225,9 @@
               </Win32>
               </Win32>
             </Options>
             </Options>
           </Linking>
           </Linking>
+          <Other>
+            <CustomOptions Value="-dDEBUG"/>
+          </Other>
         </CompilerOptions>
         </CompilerOptions>
       </Item6>
       </Item6>
       <Item7 Name="Release Linux32">
       <Item7 Name="Release Linux32">
@@ -234,7 +239,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -274,7 +279,7 @@
           </Target>
           </Target>
           <SearchPaths>
           <SearchPaths>
             <IncludeFiles Value="$(ProjOutDir)"/>
             <IncludeFiles Value="$(ProjOutDir)"/>
-            <OtherUnitFiles Value="buttons;tablet"/>
+            <OtherUnitFiles Value="tablet;tools;dialog;dialog\color;dialog\filter;image"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
             <UnitOutputDirectory Value="release\lib\$(TargetCPU)-$(TargetOS)"/>
           </SearchPaths>
           </SearchPaths>
           <Parsing>
           <Parsing>
@@ -325,7 +330,7 @@
       </Item1>
       </Item1>
       <Item2>
       <Item2>
         <PackageName Value="BGRABitmapPack"/>
         <PackageName Value="BGRABitmapPack"/>
-        <MinVersion Major="10" Minor="6" Release="2" Valid="True"/>
+        <MinVersion Major="10" Minor="6" Release="3" Valid="True"/>
       </Item2>
       </Item2>
       <Item3>
       <Item3>
         <PackageName Value="lazpaintcontrols"/>
         <PackageName Value="lazpaintcontrols"/>
@@ -954,6 +959,9 @@
         </Win32>
         </Win32>
       </Options>
       </Options>
     </Linking>
     </Linking>
+    <Other>
+      <CustomOptions Value="-dDEBUG"/>
+    </Other>
   </CompilerOptions>
   </CompilerOptions>
   <Debugging>
   <Debugging>
     <Exceptions Count="10">
     <Exceptions Count="10">

+ 25 - 0
lazpaint/lazpaint.lpr

@@ -93,7 +93,30 @@ end;
 
 
 {$R *.res}
 {$R *.res}
 
 
+{$IFDEF DARWIN}{$IFDEF DEBUG}
+var
+  OldOutput: TextFile;
+
+  procedure InitOutput;
+  begin
+    OldOutput := Output;
+    AssignFile(Output, '/dev/ttys000');
+    Append(Output);
+    Writeln;
+    Writeln('Debug started');
+  end;
+
+  procedure DoneOutput;
+  begin
+    Writeln('Debug ended');
+    CloseFile(Output);
+    Output := OldOutput;
+  end;
+{$ENDIF}{$ENDIF}
+
 begin
 begin
+  {$IFDEF DARWIN}{$IFDEF DEBUG}InitOutput;{$ENDIF}{$ENDIF}
+
   ActualConfig := GetActualConfig;
   ActualConfig := GetActualConfig;
   TranslateLazPaint(ActualConfig);
   TranslateLazPaint(ActualConfig);
 
 
@@ -121,5 +144,7 @@ begin
   RestartQuery := LazpaintApplication.RestartQuery;
   RestartQuery := LazpaintApplication.RestartQuery;
   LazpaintApplication.Free;
   LazpaintApplication.Free;
   if RestartQuery then RestartApplication;
   if RestartQuery then RestartApplication;
+
+  {$IFDEF DARWIN}{$IFDEF DEBUG}DoneOutput;{$ENDIF}{$ENDIF}
 end.
 end.
 
 

+ 1 - 1
lazpaint/lazpaintembeddedpack.lpk

@@ -26,7 +26,7 @@
         </Debugging>
         </Debugging>
       </Linking>
       </Linking>
     </CompilerOptions>
     </CompilerOptions>
-    <Version Major="7" Release="5"/>
+    <Version Major="7" Release="7"/>
     <Files Count="94">
     <Files Count="94">
       <Item1>
       <Item1>
         <Filename Value="lazpaintinstance.pas"/>
         <Filename Value="lazpaintinstance.pas"/>

+ 4 - 4
lazpaint/lazpaintinstance.pas

@@ -17,7 +17,7 @@ uses
   ULoading, UImage, UTool, uconfig, IniFiles, uresourcestrings, uscripting;
   ULoading, UImage, UTool, uconfig, IniFiles, uresourcestrings, uscripting;
 
 
 const
 const
-  MaxToolPopupShowCount = 2;
+  MaxToolPopupShowCount = 3;
 
 
 type
 type
   TImageListList = specialize TFPGObjectList<TImageList>;
   TImageListList = specialize TFPGObjectList<TImageList>;
@@ -113,7 +113,7 @@ type
     procedure Init(AEmbedded: boolean);
     procedure Init(AEmbedded: boolean);
     procedure SetBlackAndWhite(AValue: boolean); override;
     procedure SetBlackAndWhite(AValue: boolean); override;
     procedure OnStackChanged({%H-}sender: TLazPaintImage; AScrollIntoView: boolean);
     procedure OnStackChanged({%H-}sender: TLazPaintImage; AScrollIntoView: boolean);
-    procedure OnToolPopup({%H-}sender: TToolManager; AMessage: TToolPopupMessage);
+    procedure OnToolPopup({%H-}sender: TToolManager; AMessage: TToolPopupMessage; AKey: Word);
 
 
     function GetImageListWindowHeight: integer; override;
     function GetImageListWindowHeight: integer; override;
     function GetImageListWindowWidth: integer; override;
     function GetImageListWindowWidth: integer; override;
@@ -484,7 +484,7 @@ begin
     FLayerStack.InvalidateStack(AScrollIntoView);
     FLayerStack.InvalidateStack(AScrollIntoView);
 end;
 end;
 
 
-procedure TLazPaintInstance.OnToolPopup(sender: TToolManager; AMessage: TToolPopupMessage);
+procedure TLazPaintInstance.OnToolPopup(sender: TToolManager; AMessage: TToolPopupMessage; AKey: Word);
 var messageStr: string;
 var messageStr: string;
     idx: integer;
     idx: integer;
 begin
 begin
@@ -496,7 +496,7 @@ begin
     else
     else
       exit;
       exit;
   end;
   end;
-  messageStr := ToolPopupMessageToStr(AMessage);
+  messageStr := ToolPopupMessageToStr(AMessage, AKey);
   if messageStr <> '' then
   if messageStr <> '' then
     MessagePopup(messageStr,4000);
     MessagePopup(messageStr,4000);
 end;
 end;

+ 1 - 1
lazpaint/lazpaintmainform.lfm

@@ -7920,7 +7920,7 @@ object FMain: TFMain
       Caption = 'Shift colors...'
       Caption = 'Shift colors...'
       ImageIndex = 69
       ImageIndex = 69
       OnExecute = ScriptExecute
       OnExecute = ScriptExecute
-      ShortCut = 24576
+      ShortCut = 24648
     end
     end
     object ColorColorize: TAction
     object ColorColorize: TAction
       Category = 'Colors'
       Category = 'Colors'

+ 89 - 21
lazpaint/lazpaintmainform.pas

@@ -539,8 +539,7 @@ type
     procedure SpinEdit_TextureOpacityChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextureOpacityChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
     procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
     procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
-    procedure Image_CurrentTextureMouseDown(Sender: TObject;
-      {%H-}Button: TMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure Image_CurrentTextureClick(Sender: TObject);
     procedure PaintBox_PenPreviewPaint(Sender: TObject);
     procedure PaintBox_PenPreviewPaint(Sender: TObject);
     procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
     procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       Shift: TShiftState; X, Y: Integer);
@@ -715,7 +714,7 @@ type
     initialized: boolean;
     initialized: boolean;
     shouldArrangeOnResize: boolean;
     shouldArrangeOnResize: boolean;
     btnLeftDown, btnRightDown, btnMiddleDown: boolean;
     btnLeftDown, btnRightDown, btnMiddleDown: boolean;
-    spacePressed: boolean;
+    spacePressed, altPressed, snapPressed, shiftPressed: boolean;
     FormMouseMovePos: TPoint;
     FormMouseMovePos: TPoint;
     InFormMouseMove: boolean;
     InFormMouseMove: boolean;
     InFormPaint: boolean;
     InFormPaint: boolean;
@@ -796,6 +795,7 @@ type
     procedure LabelAutosize(ALabel: TLabel);
     procedure LabelAutosize(ALabel: TLabel);
     procedure AskMergeSelection(ACaption: string);
     procedure AskMergeSelection(ACaption: string);
     procedure ReleaseMouseButtons(Shift: TShiftState);
     procedure ReleaseMouseButtons(Shift: TShiftState);
+    procedure UpdateSpecialKeys({%H-}Shift: TShiftState);
     procedure UpdateCurveModeToolbar;
     procedure UpdateCurveModeToolbar;
     function ShowOpenTextureDialog: boolean;
     function ShowOpenTextureDialog: boolean;
     procedure ShowNoPicture;
     procedure ShowNoPicture;
@@ -836,8 +836,9 @@ type
 
 
     procedure PaintPictureNow;
     procedure PaintPictureNow;
     procedure InvalidatePicture;
     procedure InvalidatePicture;
-    function TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean=True; ALoadedImage: PImageEntry = nil;
-      ASkipDialogIfSingleImage: boolean = false): Boolean;
+    function TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean=True;
+      ALoadedImage: PImageEntry = nil; ASkipDialogIfSingleImage: boolean = false;
+      AAllowDuplicate: boolean = false): Boolean;
     function PictureCanvasOfs: TPoint;
     function PictureCanvasOfs: TPoint;
     procedure UpdateLineCapBar;
     procedure UpdateLineCapBar;
     procedure UpdateColorToolbar(AUpdateColorDiff: boolean);
     procedure UpdateColorToolbar(AUpdateColorDiff: boolean);
@@ -910,6 +911,10 @@ begin
   btnRightDown := false;
   btnRightDown := false;
   btnMiddleDown:= false;
   btnMiddleDown:= false;
   FTablet := TLazTablet.Create(self);
   FTablet := TLazTablet.Create(self);
+  spacePressed:= false;
+  altPressed:= false;
+  snapPressed:= false;
+  shiftPressed:= false;
 
 
   //recursive calls
   //recursive calls
   InFormMouseMove:= false;
   InFormMouseMove:= false;
@@ -1141,7 +1146,7 @@ procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
 begin
 begin
   if not Assigned(FImageView) then exit;
   if not Assigned(FImageView) then exit;
   ReleaseMouseButtons(Shift);
   ReleaseMouseButtons(Shift);
-  if not (Button in[mbLeft,mbRight,mbMiddle]) then exit;
+  if not (Button in[mbLeft,mbRight,mbMiddle]) or not FImageView.PictureCoordsDefined then exit;
   CanCompressOrUpdateStack := false;
   CanCompressOrUpdateStack := false;
   Image.OnImageChanged.DelayedStackUpdate := True;
   Image.OnImageChanged.DelayedStackUpdate := True;
 
 
@@ -1153,9 +1158,11 @@ begin
   if Button = mbMiddle then
   if Button = mbMiddle then
   begin
   begin
     btnMiddleDown:= true;
     btnMiddleDown:= true;
-    if not ToolManager.ToolSleeping then ToolManager.ToolSleep;
+    if not ToolManager.ToolSleeping and not (ssAlt in Shift) then ToolManager.ToolSleep;
   end;
   end;
-  if ToolManager.ToolDown(FImageView.FormToBitmap(X,Y),btnRightDown,CurrentPressure) then
+  if ToolManager.ToolDown(FImageView.FormToBitmap(X,Y),
+      btnRightDown{$IFDEF DARWIN} or (ssCtrl in Shift){$ENDIF},
+      CurrentPressure) then
       PaintPictureNow;
       PaintPictureNow;
   UpdateToolbar;
   UpdateToolbar;
 end;
 end;
@@ -1171,6 +1178,7 @@ begin
   if not Assigned(FImageView) then exit;
   if not Assigned(FImageView) then exit;
 
 
   ReleaseMouseButtons(Shift);
   ReleaseMouseButtons(Shift);
+  UpdateSpecialKeys(Shift);
   HidePenPreview;
   HidePenPreview;
   if LazPaintInstance.TopMostHasFocus then
   if LazPaintInstance.TopMostHasFocus then
   begin
   begin
@@ -1185,7 +1193,13 @@ begin
   FormMouseMovePos := Point(X,Y);
   FormMouseMovePos := Point(X,Y);
   if InFormMouseMove then exit;
   if InFormMouseMove then exit;
   InFormMouseMove := True;
   InFormMouseMove := True;
-  //Application.ProcessMessages; //empty message stack
+  if not FImageView.PictureCoordsDefined then
+    Application.ProcessMessages; //empty message stack
+  if not FImageView.PictureCoordsDefined then
+  begin
+    InFormMouseMove:= false;
+    exit;
+  end;
 
 
   BmpPos := FImageView.FormToBitmap(FormMouseMovePos);
   BmpPos := FImageView.FormToBitmap(FormMouseMovePos);
   FCoordinatesCaption := IntToStr(round(BmpPos.X))+','+IntToStr(round(BmpPos.Y));
   FCoordinatesCaption := IntToStr(round(BmpPos.X))+','+IntToStr(round(BmpPos.Y));
@@ -1201,7 +1215,6 @@ begin
   if ToolManager.ToolMove(BmpPos,CurrentPressure) then
   if ToolManager.ToolMove(BmpPos,CurrentPressure) then
   begin
   begin
     FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
     FImageView.UpdatePicture(PictureCanvasOfs, FLayout.WorkArea, self);
-    ToolManager.ToolMoveAfter(FImageView.FormToBitmap(FormMouseMovePos)); //new BmpPos after repaint
   end else
   end else
     updateForVSCursor := true;
     updateForVSCursor := true;
   UpdateToolbar;
   UpdateToolbar;
@@ -1229,7 +1242,9 @@ begin
   if (btnLeftDown and (Button = mbLeft)) or (btnRightDown and (Button=mbRight))
   if (btnLeftDown and (Button = mbLeft)) or (btnRightDown and (Button=mbRight))
     or (btnMiddleDown and (Button = mbMiddle)) then
     or (btnMiddleDown and (Button = mbMiddle)) then
   begin
   begin
-    redraw := ToolManager.ToolMove(FImageView.FormToBitmap(X,Y),CurrentPressure);
+    if FImageView.PictureCoordsDefined then
+      redraw := ToolManager.ToolMove(FImageView.FormToBitmap(X,Y),CurrentPressure)
+      else redraw := false;
     if ToolManager.ToolUp then redraw := true;
     if ToolManager.ToolUp then redraw := true;
     btnLeftDown := false;
     btnLeftDown := false;
     btnRightDown := false;
     btnRightDown := false;
@@ -1283,7 +1298,8 @@ begin
     if AVars.IsReferenceDefined(vFileName) then
     if AVars.IsReferenceDefined(vFileName) then
     begin
     begin
       FLazPaintInstance.ShowTopmost(topInfo);
       FLazPaintInstance.ShowTopmost(topInfo);
-      if TryOpenFileUTF8(AVars.GetString(vFilename), true, nil) then
+      if TryOpenFileUTF8(AVars.GetString(vFilename), true, nil,
+           false, AVars.Booleans['AllowDuplicate']) then
         result := srOk
         result := srOk
       else
       else
         result := srException;
         result := srException;
@@ -1638,6 +1654,9 @@ procedure TFMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
   );
   );
 begin
 begin
   try
   try
+    if Key = VK_MENU then altPressed:= true
+    else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= true
+    else if Key = VK_SHIFT then shiftPressed:= true;
     if Zoom.EditingZoom then exit;
     if Zoom.EditingZoom then exit;
     if not ((CurrentTool = ptText) and TextSpinEditFocused and (Key = VK_BACK)) and ToolManager.ToolKeyDown(Key) then
     if not ((CurrentTool = ptText) and TextSpinEditFocused and (Key = VK_BACK)) and ToolManager.ToolKeyDown(Key) then
     begin
     begin
@@ -1680,7 +1699,7 @@ end;
 
 
 procedure TFMain.EditUndoUpdate(Sender: TObject);
 procedure TFMain.EditUndoUpdate(Sender: TObject);
 begin
 begin
-  EditUndo.Enabled := image.CanUndo;
+  EditUndo.Enabled := image.CanUndo or ToolManager.ToolProvideCommand(tcFinish);
 end;
 end;
 
 
 procedure TFMain.EmbeddedCancelExecute(Sender: TObject);
 procedure TFMain.EmbeddedCancelExecute(Sender: TObject);
@@ -2023,6 +2042,9 @@ end;
 
 
 procedure TFMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
 procedure TFMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
 begin
 begin
+  if Key = VK_MENU then altPressed:= false
+  else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= false
+  else if Key = VK_SHIFT then shiftPressed:= false;
   if ToolManager.ToolKeyUp(Key) then
   if ToolManager.ToolKeyUp(Key) then
   begin
   begin
     DelayedPaintPicture := True;
     DelayedPaintPicture := True;
@@ -2345,7 +2367,7 @@ end;
 procedure TFMain.FormMouseWheel(Sender: TObject; Shift: TShiftState;
 procedure TFMain.FormMouseWheel(Sender: TObject; Shift: TShiftState;
   WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
   WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
 begin
 begin
-  if not Assigned(FImageView) then exit;
+  if not Assigned(FImageView) or not FImageView.PictureCoordsDefined then exit;
   Zoom.SetPosition(FImageView.FormToBitmap(MousePos.X,MousePos.Y), MousePos);
   Zoom.SetPosition(FImageView.FormToBitmap(MousePos.X,MousePos.Y), MousePos);
   if WheelDelta > 0 then Zoom.ZoomIn(ssCtrl in Shift) else
   if WheelDelta > 0 then Zoom.ZoomIn(ssCtrl in Shift) else
   if WheelDelta < 0 then Zoom.ZoomOut(ssCtrl in Shift);
   if WheelDelta < 0 then Zoom.ZoomOut(ssCtrl in Shift);
@@ -2507,7 +2529,8 @@ end;
 
 
 procedure TFMain.ToolNoTextureUpdate(Sender: TObject);
 procedure TFMain.ToolNoTextureUpdate(Sender: TObject);
 begin
 begin
-  ToolNoTexture.Enabled := ToolManager.GetTexture <> nil;
+  ToolNoTexture.Enabled := (ToolManager.GetTexture <> nil)
+    and (CurrentTool <> ptTextureMapping);
 end;
 end;
 
 
 procedure TFMain.ViewColorsExecute(Sender: TObject);
 procedure TFMain.ViewColorsExecute(Sender: TObject);
@@ -3002,6 +3025,7 @@ var
 begin
 begin
   openParams := TVariableSet.Create('FileOpen');
   openParams := TVariableSet.Create('FileOpen');
   openParams.AddString('FileName',Image.currentFilenameUTF8);
   openParams.AddString('FileName',Image.currentFilenameUTF8);
+  openParams.AddBoolean('AllowDuplicate',true);
   Scripting.CallScriptFunction(openParams);
   Scripting.CallScriptFunction(openParams);
   openParams.Free;
   openParams.Free;
 end;
 end;
@@ -3132,9 +3156,13 @@ begin
 end;
 end;
 
 
 procedure TFMain.ForgetDialogAnswersExecute(Sender: TObject);
 procedure TFMain.ForgetDialogAnswersExecute(Sender: TObject);
+var
+  m: TToolPopupMessage;
 begin
 begin
   Config.SetDefaultTransformSelectionAnswer(0);
   Config.SetDefaultTransformSelectionAnswer(0);
   Config.SetDefaultRetrieveSelectionAnswer(0);
   Config.SetDefaultRetrieveSelectionAnswer(0);
+  for m := low(TToolPopupMessage) to high(TToolPopupMessage) do
+    Config.SetToolPopupMessageShownCount(ord(m), 0);
 end;
 end;
 
 
 procedure TFMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 procedure TFMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
@@ -3307,6 +3335,28 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TFMain.UpdateSpecialKeys(Shift: TShiftState);
+  procedure UpdateKey(AShift: TShiftStateEnum; ACode: Word; var APressed: boolean);
+  begin
+    if (AShift in Shift) and not APressed then
+    begin
+      if ToolManager.ToolKeyDown(ACode) then PaintPictureNow;
+      APressed:= true;
+    end else
+    if not (AShift in Shift) and APressed then
+    begin
+      if ToolManager.ToolKeyUp(ACode) then PaintPictureNow;
+      APressed:= false;
+    end;
+  end;
+begin
+  {$IFDEF DARWIN}
+  UpdateKey(ssSnap, VK_SNAP, snapPressed);
+  UpdateKey(ssAlt, VK_MENU, altPressed);
+  UpdateKey(ssShift, VK_SHIFT, shiftPressed);
+  {$ENDIF}
+end;
+
 function TFMain.ShowOpenTextureDialog: boolean;
 function TFMain.ShowOpenTextureDialog: boolean;
 var newTex: TBGRABitmap;
 var newTex: TBGRABitmap;
   texFilename: string;
   texFilename: string;
@@ -3500,10 +3550,12 @@ begin
 end;
 end;
 
 
 function TFMain.TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean;
 function TFMain.TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean;
-     ALoadedImage: PImageEntry; ASkipDialogIfSingleImage: boolean): Boolean;
+     ALoadedImage: PImageEntry; ASkipDialogIfSingleImage: boolean;
+     AAllowDuplicate: boolean): Boolean;
 var
 var
   newPicture: TImageEntry;
   newPicture: TImageEntry;
   format: TBGRAImageFormat;
   format: TBGRAImageFormat;
+  dupIndex: Integer;
 
 
   procedure StartImport;
   procedure StartImport;
   begin
   begin
@@ -3584,14 +3636,30 @@ begin
     else
     else
     if format in[ifIco,ifTiff] then
     if format in[ifIco,ifTiff] then
     begin
     begin
-      newPicture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8, 'TIFF', ASkipDialogIfSingleImage);
-      ImportNewPicture;
+      if (format = ifTiff) and AAllowDuplicate and (Image.FrameIndex <> -1) then dupIndex := Image.FrameIndex else dupIndex := -1;
+      newPicture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8, 'TIFF',
+        ASkipDialogIfSingleImage, dupIndex);
+      if newPicture.isDuplicate then
+      begin
+        newPicture.FreeAndNil;
+        Image.FrameIndex:= newPicture.frameIndex;
+        Image.OnImageChanged.NotifyObservers;
+      end
+      else ImportNewPicture;
     end
     end
     else
     else
     if format = ifGif then
     if format = ifGif then
     begin
     begin
-      newPicture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8, rsAnimatedGIF, ASkipDialogIfSingleImage);
-      ImportNewPicture;
+      if AAllowDuplicate and (Image.FrameIndex <> -1) then dupIndex := Image.FrameIndex else dupIndex := -1;
+      newPicture := ShowPreviewDialog(LazPaintInstance, FilenameUTF8, rsAnimatedGIF,
+        ASkipDialogIfSingleImage, dupIndex);
+      if newPicture.isDuplicate then
+      begin
+        newPicture.FreeAndNil;
+        Image.FrameIndex:= newPicture.frameIndex;
+        Image.OnImageChanged.NotifyObservers;
+      end
+      else ImportNewPicture;
     end else
     end else
     begin
     begin
       StartImport;
       StartImport;
@@ -3814,7 +3882,7 @@ end;
 procedure TFMain.InvalidatePicture;
 procedure TFMain.InvalidatePicture;
 begin
 begin
   if Assigned(FImageView) and Assigned(FLayout) then
   if Assigned(FImageView) and Assigned(FLayout) then
-    FImageView.InvalidatePicture(False, FLayout.WorkArea, Point(0,0), self);
+    FImageView.InvalidatePicture(True, FLayout.WorkArea, Point(0,0), self);
 end;
 end;
 
 
 function TFMain.GetUseImageBrowser: boolean;
 function TFMain.GetUseImageBrowser: boolean;

+ 4 - 11
lazpaint/lazpainttype.pas

@@ -10,7 +10,7 @@ uses
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
 
 
 const
 const
-  LazPaintVersion = 7000500;
+  LazPaintVersion = 7000700;
 
 
   function LazPaintVersionStr: string;
   function LazPaintVersionStr: string;
 
 
@@ -19,22 +19,14 @@ const
   Improvements accepted:
   Improvements accepted:
   ----------------------
   ----------------------
   Mac:
   Mac:
-  - Combobox ownerdrawn (brush, arrow)
-  - update image preview when saving
-  - filename fix
-  - ctrl shortcut to change
+  - combobox dropdown rect without scrollbar
   Scripting
   Scripting
   Color picker
   Color picker
   - From final image
   - From final image
   - With radius
   - With radius
   Translation of curve modes (in dropdown)
   Translation of curve modes (in dropdown)
   Lasso
   Lasso
-  Raccourcis clavier pour utiliser le bouton droit
   Utiliser les touches de direction
   Utiliser les touches de direction
-  Indiquer l'outil actif
-  Rotation des objets des outils
-  Afficher les coordonnees des points (snap de la valeur en haut?)
-  Ajout barre d'outils pour les coordonnees de la selection 
   Mettre a jour le curseur quand on change d'outil (notamment avec Espace)
   Mettre a jour le curseur quand on change d'outil (notamment avec Espace)
 
 
   Possible improvements:
   Possible improvements:
@@ -49,7 +41,6 @@ const
   - load/save RAW
   - load/save RAW
 
 
   Filters:
   Filters:
-  - filtre de vagues concentriques
   - filtre de vagues en translation
   - filtre de vagues en translation
   - filtre pontillisme
   - filtre pontillisme
   - G'MIC filters
   - G'MIC filters
@@ -127,6 +118,7 @@ type
       bmp: TBGRABitmap;
       bmp: TBGRABitmap;
       bpp: integer;
       bpp: integer;
       frameIndex: integer;
       frameIndex: integer;
+      isDuplicate: boolean;
       class function Empty: TImageEntry; static;
       class function Empty: TImageEntry; static;
       class function NewFrameIndex: integer; static;
       class function NewFrameIndex: integer; static;
       procedure FreeAndNil;
       procedure FreeAndNil;
@@ -536,6 +528,7 @@ begin
   result.bmp := nil;
   result.bmp := nil;
   result.bpp := 0;
   result.bpp := 0;
   result.frameIndex := 0;
   result.frameIndex := 0;
+  result.isDuplicate:= false;
 end;
 end;
 
 
 class function TImageEntry.NewFrameIndex: integer;
 class function TImageEntry.NewFrameIndex: integer;

+ 3 - 4
lazpaint/maintoolbar.inc

@@ -5,12 +5,13 @@ begin
   if FToolbarElementsInitDone then exit;
   if FToolbarElementsInitDone then exit;
   FToolbarElementsInitDone:= true;
   FToolbarElementsInitDone:= true;
 
 
+  Panel_ToolbarBackground.PopupMenu := PopupToolbar;
   Perspective_Repeat.OnClick := @Perspective_RepeatClick;
   Perspective_Repeat.OnClick := @Perspective_RepeatClick;
   Perspective_TwoPlanes.OnClick := @Perspective_TwoPlanesClick;
   Perspective_TwoPlanes.OnClick := @Perspective_TwoPlanesClick;
   Shape_PenColor.OnMouseDown := @Shape_PenColorMouseDown;
   Shape_PenColor.OnMouseDown := @Shape_PenColorMouseDown;
   Shape_BackColor.OnMouseDown := @Shape_BackColorMouseDown;
   Shape_BackColor.OnMouseDown := @Shape_BackColorMouseDown;
   Image_SwapColors.OnMouseDown := @Image_SwapColorsMouseDown;
   Image_SwapColors.OnMouseDown := @Image_SwapColorsMouseDown;
-  Image_CurrentTexture.OnMouseDown := @Image_CurrentTextureMouseDown;
+  Image_CurrentTexture.OnClick := @Image_CurrentTextureClick;
   Tool_DrawShapeBorder.OnClick := @Tool_DrawShapeBorderClick;
   Tool_DrawShapeBorder.OnClick := @Tool_DrawShapeBorderClick;
   Tool_Aliasing.OnClick := @Tool_AliasingClick;
   Tool_Aliasing.OnClick := @Tool_AliasingClick;
   Tool_FillShape.OnClick := @Tool_FillShapeClick;
   Tool_FillShape.OnClick := @Tool_FillShapeClick;
@@ -546,7 +547,6 @@ begin
       Image_CurrentTool.Picture.Clear;
       Image_CurrentTool.Picture.Clear;
     previousToolImg := img;
     previousToolImg := img;
   end;
   end;
-  Panel_Texture.Enabled := (CurrentTool <> ptTextureMapping);
 end;
 end;
 
 
 procedure TFMain.NoTextureIcon;
 procedure TFMain.NoTextureIcon;
@@ -815,8 +815,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFMain.Image_CurrentTextureMouseDown(Sender: TObject;
-  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+procedure TFMain.Image_CurrentTextureClick(Sender: TObject);
 begin
 begin
   LazPaintInstance.EditTexture;
   LazPaintInstance.EditTexture;
   UpdateEditPicture;
   UpdateEditPicture;

+ 1207 - 12
lazpaint/release/bin/i18n/lazpaint.ar.po

@@ -1558,9 +1558,9 @@ msgstr "الكل"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "كل الملفات المدعمة"
 msgstr "كل الملفات المدعمة"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "إضغط ALT او SHIFT للتحريف"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "إضغط %1 او %2 للتحريف"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1675,9 +1675,9 @@ msgstr "جيب التمام"
 msgid "Crop"
 msgid "Crop"
 msgstr "محصول"
 msgstr "محصول"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "إضغط CTRL لتقييد زاوية الدوران"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "إضغط %1 لتقييد زاوية الدوران"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1840,13 +1840,13 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "نصف - جيب التمام"
 msgstr "نصف - جيب التمام"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "إضغط CTRL لالتقاط إلى بكسل"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "إضغط %1 لالتقاط إلى بكسل"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "إضغط على SHIFT لرسم مربع او دائرة"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "إضغط على %1 لرسم مربع او دائرة"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2309,3 +2309,1198 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr "نعم"
 msgstr "نعم"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "تبرع..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "عنا"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "مؤلفون:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, FabienWang, Lainz"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "الصفحة الرئيسة"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "المكتبات المستعملة"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "الرخصة"
+
+#: tfabout.label_opensource.caption
+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 "ضبط المنحنيات"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "تجاهل المنحنى الحالي و البدء من جديدة"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "قسلمة"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "حذف النقطة المحددة (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "موافق"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "عملية المزج"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr "فئة عملية المزج"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "مزيج من عمليات Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr "آخر"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "مزيج من عمليات LazPaint وPaint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr "نمط علوي"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr " معاينة عملية المزيج  مع الصورة المحددة في الأعلى"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr "نمط سفلي"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "معاينة عملية المزيج  مع الصورة المحددة في الأسفل"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr "معاينة مع"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "عملية المزج المحددة :"
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr "اساس SVG"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "  عمليات المزج الأساسية المتاحة تقريبا في جميع برامج تحرير الصور"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "تصفح الصور"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "الصعود بمجلد"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "عرض إيقونات كبيرة"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "عرض التفاصيل و المعاينة"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "موافق"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "حجم الصورة"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "نمط الإستدارة "
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "مرسي :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "الطول :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+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"
+msgstr "حدة"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "تضاعف"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "تلوين"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "تصحيح درجة اللون و الخفة"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "الألوان"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "تدرج"
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr "مسبقا"
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr "تحرير القناع"
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr "تحميل قناع"
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "موافق"
+
+#: tfcustomblur.caption
+msgctxt "tfcustomblur.caption"
+msgid "Custom blur"
+msgstr "ضبابية مخصصة"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "زخرف"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 "تطبيق الوضيفة"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "تصحيح درجة اللون و الخفة"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "."
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "موافق"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "قائمة الصور"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "تعيين آلي للملفات عند فتحها"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "تعيين آلي للملفات عند التحرير و الحفظ"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "قائمة الصور فارغة"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "حذف الصور الغير موجودة"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "حذف الصور الغير معينة"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "إزالة تعيين الملفات الغير موجودة"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "إضافة الصورة الى القائمة"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "تفعيل/تعطيل التعيين الآلي للملفات المعالجة "
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "تفعيل/تعطيل التناسب الآلي في نافذة LazPaint"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "تعيين كل الملفات للمعالجة"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "التبديل إلى النافذة الصغيرة "
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "تحريك العناصر المحددة للأسفل"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "تحريك العناصر المحددة للاعلى"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "التبديل الى النافذة العادية"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "فتح الصورة الحالية"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr " فتح الصورة التالية (Alt-Right)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr "فتح الصورة التالية"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "فتح الصورة السابقة (Alt-Left)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr "فتح الصورة السابقة"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "حذف الصور المحددة من القائمة"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "عدم تعيين كل الملفات للمعالجة"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+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"
+msgstr "ضبابية الحركة"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "منحى"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "المدى :"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "موافق"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "إنتقاء الصورة"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "موافق"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "صورة جديدة"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "الطول :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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 "مرشح الضجيج"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "العتمة :"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "ضجيج تدرج رمادي"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "ضجيج لوني RGB"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "نسيج..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "موافق"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "جسم ثلاثي الابعاد"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "ضد الإسترداف"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "وجه بجهتين"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "نسيج متولد"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "المادة المحددة"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "اللون :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "اللون :"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "الطول :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "إضاءة طبيعية"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "المواد :"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "العتمة :"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "فهرس :"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "عرض"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "زوم"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "المواد :"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "فتح نسيج"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "تصيير"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr "خارطة التظليل"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "لون"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "خارطة الإرتفاع"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "الإرتفاع الشامل"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "موقع الضوء"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "ألفا"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "إضاءة"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "الخفة الخطية"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "التشبيع"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "لون الخلفية"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "احتفظ"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "لون القلم"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "تأخير البكس"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "حجم البيكسل :"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr "قسلمة"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "حسب الضوء"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "المستوى :"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "تكوين..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "طباعة!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "زووم مناسب"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "طباعة"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "إبقاء نسبة الجانب"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "حجم الصورة"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "هوامش"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "أسفل"
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "إرتفاع:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "اليسار:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "توجه:"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "طابعات و اوراق"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "اليمين:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "الأعلى"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "العرض:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "ضباب شعاعي"
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "موافق"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "إعادة تشكيل"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "إبقاء نسبة الجانب"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "الطول :"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "الجودة :"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "عرض"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "موافق"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "حفظ"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+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 ""
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "سحب الألوان  "
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "تصحيح درجة اللون و الخفة"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "تدرج"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "التشبيع"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr " الأدوات "
+

+ 1208 - 12
lazpaint/release/bin/i18n/lazpaint.cs.po

@@ -1555,9 +1555,9 @@ msgstr "všechny"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Všechny podporované formáty souborů"
 msgstr "Všechny podporované formáty souborů"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Držte ALT nebo SHIFT pro měřítko "
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Držte %1 nebo %2 pro měřítko "
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1672,9 +1672,9 @@ msgstr "Kosinus"
 msgid "Crop"
 msgid "Crop"
 msgstr "Oříznout"
 msgstr "Oříznout"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Přidržte CTRL pro omezení úhlu otočení"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Přidržte %1 pro omezení úhlu otočení"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1837,13 +1837,13 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Poloviční-kosinus"
 msgstr "Poloviční-kosinus"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Přidržte CTRL pro přichycení k bodům"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Přidržte %1 pro přichycení k bodům"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Přidržte SHIFT pro kreslení čtverce nebo kruhu"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Přidržte %1 pro kreslení čtverce nebo kruhu"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2306,3 +2306,1199 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr "Ano"
 msgstr "Ano"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Přispět..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "O programu"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Autoři:"
+
+#: tfabout.label_authorsvalue.caption
+#| msgid "Circular help by FabienWang and Lainz"
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular s pomocí FabienWang, Lainz a dalších"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Domovská stránka:"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Použité knihovny:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Licence:"
+
+#: tfabout.label_opensource.caption
+msgctxt "tfabout.label_opensource.caption"
+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"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Zahodit aktuální křivku a začít novou"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Posterizace"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Odebrat vybrané body (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Operace míchání"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr "Kategorie operace mísení"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Operace mísení jsou dostupné v Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr "Jiné"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "Operace mísení LazPaint a Paint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr "Vzor přes"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Náhled operace mísení se zadaným obrázkem nahoře"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr "Vzor pod"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Náhled operace mísení se zadaným obrázkem pod"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr "Náhled s"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Vybraná operace míchání :"
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr "Základní SVG"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "Základní operace mísení, který je dostupná prakticky ve všech editorech obrázků"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Procházet obrázky"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Jít o adresář výše"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "Ukázat velké ikony"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "Ukázat podrobnosti a náhled"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Velikost plátna"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Převrácený režim"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Kotva :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Výška :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+msgstr "Šířka :"
+
+#: 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"
+msgstr "Jas"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Násobek"
+
+#: tfcolorintensity.label_shift.caption
+msgctxt "tfcolorintensity.label_shift.caption"
+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
+msgctxt "tfcolorize.caption"
+msgid "Colorize"
+msgstr "Obarvení"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Opravený odstín a světlost"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Barevný"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Odstín"
+
+#: tfcolorize.label_preset.caption
+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..."
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr "Načíst masku..."
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcustomblur.caption
+msgctxt "tfcustomblur.caption"
+msgid "Custom blur"
+msgstr "Vlastní rozostření"
+
+#: tfcustomblur.openpicturedialog1.title
+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
+msgctxt "tfemboss.caption"
+msgid "Emboss"
+msgstr "Vytlačit"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+msgctxt "tfemboss.label_direction.caption"
+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"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Opravný odstín a světlost"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Proměnné :"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Seznam obrázků"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "Samo odškrtnutí souborů po otevření"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "Samo odškrtnutí souborů po úpravě a uložení"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Prázdný seznam obrázků"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "Odebrat neexistující obrázky"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "Odstranit nezaškrtnuté soubory"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "Odškrtnout neexistující soubory"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Přidat obrázek do seznamu"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "Povolení/zakázaní samo zaškrtnutí pro zpracované soubory"
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "Povolit/zakázat samopřiblížení obrázků v okně LazPaint"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "Zaškrtněte všechny soubory ke zpracování"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Přepnout na malé okno"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Přesunout vybrané položky dolů"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Přesunout vybrané položky nahoru"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Přepnout na normální okno"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Otevřít aktuální obrázek"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Otevřít další soubor (Alt+Right)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr "Otevřít další soubor"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Otevřít předchozí obrázek (Alt-Left)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr "Otevřít předchozí obrázek"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Odebrat vybrané obrázky ze seznamu"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "Odškrtnout všechny soubory pro zpracování"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Načítání..."
+
+#: 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
+msgctxt "tfmotionblur.caption"
+msgid "Motion blur"
+msgstr "Pohybové rozostření"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Orientovaný"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Vzdálenost :"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Vybrat obrázek"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Nový obrázek"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Výška :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Průhlednost:"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Šedý šum"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "RBG šum"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Textura..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr "Ne tex."
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "3D objekt"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Antialiasing"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "2-stranné povrchy"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Interpolace textury"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "Vybraný materiál"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "Barva :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Barva :"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Výška :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "Světelné normály :"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "Materiály:"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "Průhlednost :"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "Zrcadl. index :"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Šířka :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "Měřítko"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Materiály"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Otevřít texturu"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Vykreslení"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+msgid "Remove selected light"
+msgstr ""
+
+#: 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
+msgctxt "tfphongfilter.caption"
+msgid "Shaded map"
+msgstr "Stínová mapa"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Barva"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Výšková mapa"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Celková výška :"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Pozice světla :"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Alfa"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Světlost"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Lineární světlost"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Barevnost"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Barva pozadí"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Ponechat"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Barva pera"
+
+#: tfphongfilter.radio_usetexture.caption
+msgctxt "tfphongfilter.radio_usetexture.caption"
+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
+msgctxt "tfpixelate.caption"
+msgid "Pixelate"
+msgstr "Pixelizace"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Velikost bodu :"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr "Posterizace"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Podle světlosti"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Úrovně:"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Nastavit..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Tisk!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Přizpůsobit zvětšení"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Tisk"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Udržovat poměr"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Velikost obrázku"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Okraje"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Dole:"
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Výška:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Vlevo:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Otočení:"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Tiskárna a papír:"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Vpravo:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Nahoře:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Šířka:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Radiální rozmazání"
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Převzorkovat"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Udržovat poměr"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Výška :"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Kvalita :"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Šířka :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Uložit"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+msgid "MioMap"
+msgstr ""
+
+#: 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í"
+
+#: tfsharpen.label_amount.caption
+msgctxt "tfsharpen.label_amount.caption"
+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
+msgctxt "tfshiftcolors.caption"
+msgid "Shift colors"
+msgstr "Posunout barvy"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Opravený odstín a světlost"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Odstín"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Barevnost"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Nástroje"
+

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 160 - 140
lazpaint/release/bin/i18n/lazpaint.de.po


+ 1211 - 12
lazpaint/release/bin/i18n/lazpaint.es.po

@@ -1549,9 +1549,9 @@ msgstr "todo"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Todos los tipos soportados"
 msgstr "Todos los tipos soportados"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Manten ALT o SHIFT para escalar"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Manten %1 o %2 para escalar"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1669,9 +1669,9 @@ msgstr "Coseno"
 msgid "Crop"
 msgid "Crop"
 msgstr "Cortar"
 msgstr "Cortar"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Manten CTRL para restringir el ángulo de rotación"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Manten %1 para restringir el ángulo de rotación"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1698,6 +1698,10 @@ msgstr "El directorio no esta vacío"
 msgid "Dither layer using palette"
 msgid "Dither layer using palette"
 msgstr "Entramado de capa usando paleta"
 msgstr "Entramado de capa usando paleta"
 
 
+#: uresourcestrings.rsduplicateimage
+msgid "Duplicate image"
+msgstr "Duplicar imagen"
+
 #: uresourcestrings.rseditmask
 #: uresourcestrings.rseditmask
 msgctxt "uresourcestrings.rseditmask"
 msgctxt "uresourcestrings.rseditmask"
 msgid "Edit mask"
 msgid "Edit mask"
@@ -1840,13 +1844,13 @@ msgctxt "uresourcestrings.rshalfcosine"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Medio-coseno"
 msgstr "Medio-coseno"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Manten CTRL para ajustar a los pixeles"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Manten %1 para ajustar a los pixeles"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Manten SHIFT para dibujar un cuadrado o un circulo"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Manten %1 para dibujar un cuadrado o un circulo"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2320,3 +2324,1198 @@ msgstr "Capa vectorial"
 msgid "Yes"
 msgid "Yes"
 msgstr "Sí"
 msgstr "Sí"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr "Procedimiento %s falló al cargar."
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr "Falló la apertura del contexto de Tableta."
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Donar..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "Acerca de"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Autores:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular ayudado por FabienWang, Lainz y otros"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Sitio Web:"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Librerías usadas:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Licencia:"
+
+#: tfabout.label_opensource.caption
+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"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Desechar esta curva y empezar una nueva"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Posterizar"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Sacar punto seleccionado (Supr)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Operación de mezcla"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr "Categoría de operación de mezcla"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Operaciónes de mezcla disponibles en Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr "Otra"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "Operaciónes de mezcla disponibles en LazPaint y Paint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr "Patrón sobre"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Previsualización de la operación de mezcla con la imagen seleccionada encima"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr "Patrón debajo"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Previsualización de la operación de mezcla con la imagen seleccionada debajo"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr "Previsualización con"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Operación seleccionada:"
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr "SVG Básico"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "Operaciónes de mezcla disponibles en casi todos los programas"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Explorar imágenes"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr "Utilizar esta carpeta al encendido"
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr "Crear carpeta o contenedor"
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Ir a la carpeta raíz"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr "Abrir archivos seleccionados"
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "Icono grandes"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "Detalles y previsualización"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr "Seleccionar unidad"
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Tamaño de papel"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Modo de volteo"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Anclaje:"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Alto:"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+msgstr "Ancho:"
+
+#: 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"
+msgstr "Intensidad"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Multiplicar"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "Colorizar"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Corregir matiz e iluminación"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Saturación"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Matiz"
+
+#: tfcolorize.label_preset.caption
+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.."
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "Desenfoque personalizado"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "Realzar"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr "Preservar colores"
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr "Transparente"
+
+#: tfemboss.label_direction.caption
+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"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Corregido matiz e iluminación"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Variables:"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr "Pincel geométrico"
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr "Opacidad de degradado"
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr "Número de lados:"
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Lista de imágenes"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "Desactivar automáticamente la casilla del fichero cuando está abierto"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "Desactivar automáticamente la casilla del fichero cuando está modificado y guardado"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Llenar la lista de imágenes"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "Sacar imágenes que no existan"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "Sacar imágenes con la casilla deactivada"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "Deactivar las casillas de los ficheros que no existan"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Añadir imágenes a la lista"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "Deactivar automáticamente o no las casillas de los ficheros"
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "Si se debe encajar la imagen en la ventana"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "Activar todas las casillas para procesamiento"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Cambiar a ventanita"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Mover el elemento seleccionado abajo"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Mover el elemento seleccionado encima"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Cambiar a ventana normal"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Abrir la imagen seleccionada"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Abrir la imagen siguiente (Alt-Derecha)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr "Abrir la imagen siguiente"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Abrir la imagen anterior (Alt-Izquierda)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr "Abrir la imagen anterior"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Sacar imágenes selectadas de la lista"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "Desactivar las casillas de todos los ficheros"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Cargando..."
+
+#: 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"
+msgstr "Desenfoque de movimiento"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Orientado"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Distancia:"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Eligir imagen"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Nueva imágen"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr "32"
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr "Profundidad de bit:"
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Alto:"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr "Proporción:"
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr "Memoria requerida:"
+
+#: tfnewimage.label_width.caption
+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"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Opacidad:"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Ruido con escala de grises"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "Ruido con colores"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Textura..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr "No text."
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "Objeto 3D"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Antiafilado"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "2 caras"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Interpolación de textura"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr "Luz seleccionada"
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "Material seleccionado"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "Color:"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Color:"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Alto:"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "Iluminaciónes normales:"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr "Luces:"
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "Materiales:"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "Opacidad:"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "Índice esp.:"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Ancho:"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "Zoom"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr "Luces"
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Materiales"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Abrir textura"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Renderizado"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr "Agregar una luz direccional"
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr "Agregar una luz puntual"
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr "Mapa sombreado"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Color"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Mapa de altitud"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Altitud global:"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Posición de la luz:"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Alfa"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Luminosidad"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Iluminación linear"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Saturación"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Color de fondo"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Mantener"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Color de pluma"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "Pixelar"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Tamaño de píxel:"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr "Posterizar"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Por claridad"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Niveles:"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr "Vista previa"
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Configurar..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "¡Imprimir!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Encajar zoom"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Imprimir"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Mantener aspecto"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Tamaño de imagen"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Margen"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Inferior:"
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Alto:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Izquierda:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Orientación:"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Impresora y papel:"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Derecha:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Superior:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Ancho:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr "Pregunta"
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr "Recordar esta opción"
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Desenfoque radial"
+
+#: tfradialblur.label_radius.caption
+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"
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr "Cantidad:"
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr "Viento:"
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Redimensionar"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Mantener aspecto"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Alto:"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Calidad:"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Ancho:"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "Aceptar"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Guardar"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr "Entramado"
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr "Calidad:"
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr "0"
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr "100"
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr "50"
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr "Profundidad de color:"
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr "Tamaño:"
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr "16 colores"
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr "24 bits"
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr "256 colores"
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr "2 colores"
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr "32 bits"
+
+#: tfsaveoption.radiobutton_miomap.caption
+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"
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "Intercambiar colores"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Corregido matiz e iluminación"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Matiz"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Saturación"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Herramientas"
+

+ 1203 - 8
lazpaint/release/bin/i18n/lazpaint.fi.po

@@ -1546,8 +1546,8 @@ msgstr "kaikki"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Kaikki tuetut tiedostotyypit"
 msgstr "Kaikki tuetut tiedostotyypit"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %A to scale"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
@@ -1663,8 +1663,8 @@ msgstr ""
 msgid "Crop"
 msgid "Crop"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
@@ -1828,12 +1828,12 @@ msgstr "Vihreä"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
@@ -2297,3 +2297,1198 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr "Kyllä"
 msgstr "Kyllä"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "TFABOUT.BUTTON_DONATE.CAPTION"
+msgid "Donate..."
+msgstr ""
+
+#: tfabout.caption
+msgctxt "TFABOUT.CAPTION"
+msgid "About"
+msgstr "Tietoja"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr ""
+
+#: tfabout.label_authors.caption
+msgctxt "TFABOUT.LABEL_AUTHORS.CAPTION"
+msgid "Authors:"
+msgstr "Tekijät:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "TFABOUT.LABEL_AUTHORSVALUE.CAPTION"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular jota on avustaneet FabienWang, Lainz ja muut"
+
+#: tfabout.label_homepage.caption
+msgctxt "TFABOUT.LABEL_HOMEPAGE.CAPTION"
+msgid "Homepage:"
+msgstr "Kotisivu:"
+
+#: tfabout.label_libraries.caption
+msgctxt "TFABOUT.LABEL_LIBRARIES.CAPTION"
+msgid "Libraries used:"
+msgstr "Käytetyt kirjastot:"
+
+#: tfabout.label_licence.caption
+msgctxt "TFABOUT.LABEL_LICENCE.CAPTION"
+msgid "Licence:"
+msgstr "Lisenssi:"
+
+#: tfabout.label_opensource.caption
+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ä"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Hylkää nykyinen käyrä ja aloita uusi"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Poista valittu piste (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "TFBLENDOP.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfblendop.button_ok.caption
+msgctxt "TFBLENDOP.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "TFBLENDOP.LABEL_BLENDOPCATEGORY.CAPTION"
+msgid "Category of blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr ""
+
+#: tfblendop.label_kritaover.caption
+msgctxt "TFBLENDOP.LABEL_KRITAOVER.CAPTION"
+msgid "Krita"
+msgstr ""
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr ""
+
+#: tfblendop.label_otherover.caption
+msgctxt "TFBLENDOP.LABEL_OTHEROVER.CAPTION"
+msgid "Other"
+msgstr ""
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr ""
+
+#: tfblendop.label_patternover.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNOVER.CAPTION"
+msgid "Pattern over"
+msgstr ""
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr ""
+
+#: tfblendop.label_patternunder.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNUNDER.CAPTION"
+msgid "Pattern under"
+msgstr ""
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr ""
+
+#: tfblendop.label_previewwith.caption
+msgctxt "TFBLENDOP.LABEL_PREVIEWWITH.CAPTION"
+msgid "Preview with"
+msgstr ""
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr ""
+
+#: tfblendop.label_svgover.caption
+msgctxt "TFBLENDOP.LABEL_SVGOVER.CAPTION"
+msgid "Basic SVG"
+msgstr ""
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr ""
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Selaa kuvia"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr ""
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Siirry yksi kansio ylöspäin"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr "Avaa valitut tiedostot"
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "TFBROWSEIMAGES.TOOLBUTTON_VIEWBIGICON.HINT"
+msgid "Show big icons"
+msgstr "Näytä isot kuvakkeet"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "TFBROWSEIMAGES.TOOLBUTTON_VIEWDETAILS.HINT"
+msgid "Show details and preview"
+msgstr "Näytä tiedoston tiedot ja esikatselu"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr "Valitse asema"
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfcanvassize.caption
+msgctxt "TFCANVASSIZE.CAPTION"
+msgid "Canvas size"
+msgstr "Kuva-alueen koko"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr ""
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "TFCANVASSIZE.LABEL_ANCHOR.CAPTION"
+msgid "Anchor :"
+msgstr ""
+
+#: tfcanvassize.label_height.caption
+msgctxt "TFCANVASSIZE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Korkeus :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "TFCANVASSIZE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Leveys :"
+
+#: 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"
+msgstr "Voimakkuus"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "TFCOLORINTENSITY.LABEL_MULTIPLY.CAPTION"
+msgid "Multiply"
+msgstr ""
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr ""
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "TFCOLORIZE.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfcolorize.label_colorness.caption
+msgctxt "TFCOLORIZE.LABEL_COLORNESS.CAPTION"
+msgid "Colorness"
+msgstr ""
+
+#: tfcolorize.label_hue.caption
+msgctxt "TFCOLORIZE.LABEL_HUE.CAPTION"
+msgid "Hue"
+msgstr "Värisävy"
+
+#: tfcolorize.label_preset.caption
+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"
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "Maskin mukainen sumennus"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "Kohokuviointi"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 ""
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "TFFILTERFUNCTION.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr ""
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr ""
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr ""
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "TFGEOMETRICBRUSH.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "TFGEOMETRICBRUSH.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr "Sudin geometria"
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr "Liukuva peittävyys"
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr "Sivujen määrä:"
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Kuvaluettelo"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Tyhjä kuvaluettelo"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[1].TITLE.CAPTION"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[2].TITLE.CAPTION"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[3].TITLE.CAPTION"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Lisää kuvat luetteloon"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Muuta ikkuna minikokoiseksi"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Siirrä valitut alaspäin"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Siirrä valitut ylöspäin"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Muuta ikkuna normaalikokoon"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Avaa valittu kuva"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Avaa seuraava kuva (Alt-Right)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "TFIMAGELIST.TBOPENNEXTSW.HINT"
+msgid "Open next image"
+msgstr "Avaa kuvaluettelon seuraava kuva"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Avaa edellinen kuva (Alt-Left)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "TFIMAGELIST.TBOPENPREVSW.HINT"
+msgid "Open previous image"
+msgstr "Avaa kuvaluettelon edellinen kuva"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Poista valitut kuvat luettelosta"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr ""
+
+#: 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"
+msgstr "Liikesumennus"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Suunnattu"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "TFMOTIONBLUR.LABEL_DISTANCE.CAPTION"
+msgid "Distance :"
+msgstr ""
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "TFMULTIIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "TFMULTIIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr ""
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfnewimage.caption
+msgctxt "TFNEWIMAGE.CAPTION"
+msgid "New image"
+msgstr "Uusi kuva"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "TFNEWIMAGE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Korkeus :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Läpikuultavuus:"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Harmaasävykohina"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "RGB-kohina"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "TFOBJECT3D.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr ""
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "TFOBJECT3D.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr ""
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr ""
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr ""
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "TFOBJECT3D.GROUPBOX_SELECTEDMATERIAL.CAPTION"
+msgid "Selected material"
+msgstr ""
+
+#: tfobject3d.label_color.caption
+msgctxt "TFOBJECT3D.LABEL_COLOR.CAPTION"
+msgid "Color :"
+msgstr "Väri :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "TFOBJECT3D.LABEL_COLOR1.CAPTION"
+msgid "Color :"
+msgstr "Väri :"
+
+#: tfobject3d.label_height.caption
+msgctxt "TFOBJECT3D.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Korkeus :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "TFOBJECT3D.LABEL_LIGHTINGNORMALS.CAPTION"
+msgid "Lighting normals :"
+msgstr ""
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "TFOBJECT3D.LABEL_MATERIALS.CAPTION"
+msgid "Materials :"
+msgstr ""
+
+#: tfobject3d.label_opacity.caption
+msgctxt "TFOBJECT3D.LABEL_OPACITY.CAPTION"
+msgid "Opacity :"
+msgstr ""
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "TFOBJECT3D.LABEL_SPECULARINDEX.CAPTION"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "TFOBJECT3D.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Leveys :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "TFOBJECT3D.LABEL_ZOOM.CAPTION"
+msgid "Zoom"
+msgstr ""
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr ""
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "TFOBJECT3D.OPENTEXTUREDIALOG.TITLE"
+msgid "Open texture"
+msgstr ""
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr ""
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr "Varjostettu kartta"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "TFPHONGFILTER.GROUPBOX_COLOR.CAPTION"
+msgid "Color"
+msgstr "Väri"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr ""
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr ""
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Valon paikka :"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr ""
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr ""
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr ""
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPLIGHTNESS.CAPTION"
+msgid "Lightness"
+msgstr ""
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr ""
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr ""
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPSATURATION.CAPTION"
+msgid "Saturation"
+msgstr "Kylläisyys"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Taustan väri"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Säilytä värit"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Kynän väri"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "Pikselöinti"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "TFPIXELATE.LABEL_PIXELSIZE.CAPTION"
+msgid "Pixel size :"
+msgstr "Pkselin koko :"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr ""
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr ""
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr ""
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Muokkaa asetuksia"
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Tulosta!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "TFPRINT.BUTTON_ZOOMFIT.CAPTION"
+msgid "Zoom fit"
+msgstr "Sovita"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Tulosta"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "TFPRINT.CHECKBOX_RATIO.CAPTION"
+msgid "Keep aspect ratio"
+msgstr ""
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Kuvan koko"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Marginaalit"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Alaosa:"
+
+#: tfprint.label_dpix.caption
+msgctxt "TFPRINT.LABEL_DPIX.CAPTION"
+msgid "."
+msgstr ""
+
+#: tfprint.label_dpiy.caption
+msgctxt "TFPRINT.LABEL_DPIY.CAPTION"
+msgid "."
+msgstr ""
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Korkeus:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Vasen reuna"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Tulosteen asettelusuunta"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Tulostin ja paperikoko"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Oikea reuna:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Yläreuna:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Leveys:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Säteittäinen sumennus"
+
+#: tfradialblur.label_radius.caption
+msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
+msgid "Radius :"
+msgstr ""
+
+#: 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"
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr "Määrä:"
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr "Tuuli"
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfresample.caption
+msgctxt "TFRESAMPLE.CAPTION"
+msgid "Resample"
+msgstr ""
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr ""
+
+#: tfresample.label_height.caption
+msgctxt "TFRESAMPLE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Korkeus :"
+
+#: tfresample.label_quality.caption
+msgctxt "TFRESAMPLE.LABEL_QUALITY.CAPTION"
+msgid "Quality :"
+msgstr ""
+
+#: tfresample.label_width.caption
+msgctxt "TFRESAMPLE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Leveys :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "TFSAVEOPTION.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Peru"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "TFSAVEOPTION.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfsaveoption.caption
+msgctxt "TFSAVEOPTION.CAPTION"
+msgid "Save"
+msgstr "Tallenna"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr "Rasterointi"
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr "16 väriä"
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr "256 väriä"
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr "2 väriä"
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+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ä"
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr ""
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Värisävy"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Kylläisyys"
+
+#: tftoolbox.caption
+msgctxt "TFTOOLBOX.CAPTION"
+msgid "Tools"
+msgstr "Työkalut"
+

+ 1227 - 12
lazpaint/release/bin/i18n/lazpaint.fr.po

@@ -1559,9 +1559,13 @@ msgstr "tout"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Tous les formats connus"
 msgstr "Tous les formats connus"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Appuyez sur ALT et MAJ pour étirer"
+#: uresourcestrings.rsalt
+msgid "ALT"
+msgstr "ALT"
+
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Appuyez sur %1 et %2 pour étirer"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1679,9 +1683,17 @@ msgstr "Cosinus"
 msgid "Crop"
 msgid "Crop"
 msgstr "Recadrer"
 msgstr "Recadrer"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Maintenir CTRL pour restreindre l'angle de rotation"
+#: uresourcestrings.rsctrl
+msgid "CTRL"
+msgstr "CTRL"
+
+#: uresourcestrings.rscmd
+msgid "CMD"
+msgstr "CMD"
+
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Maintenir %1 pour restreindre l'angle de rotation"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1708,6 +1720,10 @@ msgstr "Le dossier n'est pas vide"
 msgid "Dither layer using palette"
 msgid "Dither layer using palette"
 msgstr "Tramer le calque en utilisant la palette"
 msgstr "Tramer le calque en utilisant la palette"
 
 
+#: uresourcestrings.rsduplicateimage
+msgid "Duplicate image"
+msgstr "Dupliquer l'image"
+
 #: uresourcestrings.rseditmask
 #: uresourcestrings.rseditmask
 msgctxt "uresourcestrings.rseditmask"
 msgctxt "uresourcestrings.rseditmask"
 msgid "Edit mask"
 msgid "Edit mask"
@@ -1850,13 +1866,17 @@ msgctxt "uresourcestrings.rshalfcosine"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Semi-cosinus"
 msgstr "Semi-cosinus"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Maintenir CTRL pour aligner aux pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Maintenir %1 pour aligner aux pixels"
+
+#: uresourcestrings.rsshift
+msgid "SHIFT"
+msgstr "MAJ"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Maintenir MAJ pour dessiner un carré ou un cercle"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Maintenir %1 pour dessiner un carré ou un cercle"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2330,3 +2350,1198 @@ msgstr "Calque vectoriel"
 msgid "Yes"
 msgid "Yes"
 msgstr "Oui"
 msgstr "Oui"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr "La procédure %s n'a pas réussi à se charger correctement."
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr "Le contexte de la tablette ne s'est pas ouvert."
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Faire un don..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "À propos"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Auteurs :"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular aidé par FabienWang, Lainz et autres"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Site Web :"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Bibliothèques :"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Licence :"
+
+#: tfabout.label_opensource.caption
+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"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Effacer et commencer une nouvelle courbe"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Niveaux"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Supprimer le point (Suppr)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Mode de fusion"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr "Catégorie de mode de fusion"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Modes de fusion disponibles dans le logiciel Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr "Autre"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "Modes de fusion de LazPaint et de Paint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr "Texture au-dessus"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Aperçu du mode de fusion avec l'image donnée au-dessus"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr "Texture en-dessous"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Aperçu du mode de fusion avec l'image donnée en-dessous"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr "Aperçu avec"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Mode de fusion choisi :"
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr "SVG basique"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "Modes de fusion de base disponibles dans presque tous les logiciels"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Parcourir les images"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr "Utiliser ce dossier au démarrage"
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr "Créer dossier ou conteneur"
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Répertoire parent"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr "Ouvrir les fichiers sélectionnés"
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "Grandes icônes"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "Détails et aperçu"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr "Choisir le support"
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Taille du canevas"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Retourner"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Ancre :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Hauteur :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+msgstr "Largeur :"
+
+#: 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"
+msgstr "Intensifier"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Multiplier"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "Coloriser"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Teinte et luminosité corrigées"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Couleurs"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Nuances"
+
+#: tfcolorize.label_preset.caption
+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..."
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "Flou personnalisé"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "Embosser"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr "Conserver les couleurs"
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr "Transparent"
+
+#: tfemboss.label_direction.caption
+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"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Teinte et luminosité corrigées"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Variables :"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr "Pinceau géométrique"
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr "Gradient d'opacité"
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr "Nombre de côtés :"
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Liste d'images"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "Décocher automatiquement les fichiers lors de l'ouverture"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "Décocher automatiquement les fichiers après édition et sauvegarde"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Vider la liste d'images"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "Enlever les images inexistantes"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "Enlever les images non cochées"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "Décocher les images inexistantes"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Ajouter des images"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "Activer/désactiver le décochage automatique des fichiers déjà ouverts"
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "Activer l'ajustement du zoom automatique dans la fenêtre principale"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "Cocher tous les fichiers pour traitement"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Passer en mode mini-fenêtre"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Faire descendre l'élément sélectionné"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Faire monter l'élément sélectionné"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Passer en mode fenêtre normale"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Ouvrir l'image en cours"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Ouvrir l'image suivante (Alt-Droite)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr "Ouvrir l'image suivante"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Ouvrir l'image précédente (Alt-Gauche)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr "Ouvrir l'image précédente"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Retirer les images sélectionnées de la liste"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "Décocher toutes les images pour traitement"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Chargement..."
+
+#: 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"
+msgstr "Flou de mouvement"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Orienté"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Distance :"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Choisir une image"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Nouvelle image"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr "Bits par pixel :"
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Hauteur :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr "Rapport :"
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr "Mémoire nécessaire :"
+
+#: tfnewimage.label_width.caption
+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"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Opacité :"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Bruit en tons de gris"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "Bruit R/V/B"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Texture..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr "Aucune"
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "Objet 3D"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Anticrénelage"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "Faces avec 2 côtés"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Interpolation de texture"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr "Source lumineuse"
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "Matériau sélectionné"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "Couleur :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Couleur :"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Hauteur :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "Perp. pour éclairage :"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr "Sources lumineuses :"
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "Matériaux :"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "Opacité :"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "Indice spéc. :"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Largeur :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "Zoom"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr "Lumières"
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Matériaux"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Ouvrir une texture"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Rendu"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr "Ajouter une lumière directionnelle"
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr "Ajouter une lumière ponctuelle"
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr "Carte éclairée"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Couleur"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Carte d'altitude"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Altitude globale :"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Position de la lumière :"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Canal alpha"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "V"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Clarté"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Clarté linéaire"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Saturation"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Couleur de fond"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Conserver"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Couleur de crayon"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "Pixéliser"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Taille pixel :"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr "Niveaux"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Par intensité"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Niveaux :"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr "Aperçu"
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Configurer..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Imprimer !"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Ajuster le zoom"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Imprimer"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Maintenir le ratio"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Taille de l'image"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Marges"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Bas :"
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Hauteur :"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Gauche :"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Orientation :"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Imprimante et papier :"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Droite :"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Haute :"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Largeur :"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr "Question"
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr "Se souvenir du choix"
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Flou radial"
+
+#: tfradialblur.label_radius.caption
+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"
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr "Quantité :"
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr "Vent :"
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Redimensionner"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Maintenir le ratio"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Hauteur :"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Qualité :"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Largeur :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuler"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Enregistrer"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr "Tramage"
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr "Qualité :"
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr "0"
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr "100"
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr "50"
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr "Couleurs :"
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr "Taille :"
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr "16 couleurs"
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr "24 bits"
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr "256 coul."
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr "2 couleurs"
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr "32 bits"
+
+#: tfsaveoption.radiobutton_miomap.caption
+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"
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "Décaler les couleurs"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Teinte et luminosité corrigées"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Teinte"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Saturation"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Outils"
+

+ 1208 - 8
lazpaint/release/bin/i18n/lazpaint.ja.po

@@ -1558,8 +1558,8 @@ msgstr ""
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
@@ -1675,8 +1675,8 @@ msgstr "コサイン"
 msgid "Crop"
 msgid "Crop"
 msgstr "切り抜く"
 msgstr "切り抜く"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
@@ -1840,12 +1840,12 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Half-cosine"
 msgstr "Half-cosine"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
@@ -2309,3 +2309,1203 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "寄付する..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "About"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Authors"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, FabienWang, Lainz"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Homepage"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "使用しているライブラリ:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "ライセンス:"
+
+#: tfabout.label_opensource.caption
+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 ""
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr ""
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr ""
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr ""
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr ""
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr ""
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr ""
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr ""
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr ""
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr ""
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr ""
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr ""
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr ""
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr ""
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr ""
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr ""
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr ""
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr ""
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "キャンバスのサイズ"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "フリップモード"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "アンカー:"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "高さ:"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+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"
+msgstr "輝度"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "乗算"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "Colorize"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "濃淡"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "色相"
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr ""
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr "マスク編集"
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "カスタムブラー"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "エンボス"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 ""
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr ""
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr ""
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr ""
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr ""
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr ""
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr ""
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr ""
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr ""
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr ""
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr ""
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr ""
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr ""
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr ""
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr ""
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr ""
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+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"
+msgstr "モーションブラー"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "両方向にのばす"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "距離:"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "距離:"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr ""
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "新規画像"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "高さ:"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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 ""
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr ""
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr ""
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr ""
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr ""
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr ""
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr ""
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr ""
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr ""
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "高さ:"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr ""
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr ""
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr ""
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "幅:"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr ""
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr ""
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "テクスチャを開く"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr ""
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr ""
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "色"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr ""
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr ""
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr ""
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr ""
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr ""
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr ""
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "明度"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr ""
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr ""
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "濃淡"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr ""
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr ""
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr ""
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "モザイク"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "画素のサイズ:"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr ""
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr ""
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr ""
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr ""
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr ""
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "ズームfit"
+
+#: tfprint.caption
+msgid "Print"
+msgstr ""
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "アスペクト比を保持する"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr ""
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr ""
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr ""
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr ""
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr ""
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr ""
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr ""
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr ""
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr ""
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr ""
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Radialブラー"
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "再サンプル"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "アスペクト比を保持する"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "高さ:"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "精度:"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "幅:"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "保存"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+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 ""
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "色合いをずらす"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "色相"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "濃淡"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "ツール"
+

+ 1208 - 12
lazpaint/release/bin/i18n/lazpaint.lv.po

@@ -1556,9 +1556,9 @@ msgstr "visi"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Visi atbalstītie failu formāti"
 msgstr "Visi atbalstītie failu formāti"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Turi [ALT] vai [SHIFT] lai mērogotu"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Turi %1 vai %2 lai mērogotu"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1673,9 +1673,9 @@ msgstr ""
 msgid "Crop"
 msgid "Crop"
 msgstr "Apcirpt"
 msgstr "Apcirpt"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Turi [CTRL] lai izmantotu noteiktus leņķus"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Turi %1 lai izmantotu noteiktus leņķus"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1838,13 +1838,13 @@ msgstr "Zaļš"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Turi [CTRL], lai pieliptu pikseļiem"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Turi %1, lai pieliptu pikseļiem"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Turi [SHIFT} lai zīmētu kvadrātu vai apli"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Turi %1 lai zīmētu kvadrātu vai apli"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2307,3 +2307,1199 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr "Jā"
 msgstr "Jā"
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "TFABOUT.BUTTON_DONATE.CAPTION"
+msgid "Donate..."
+msgstr "Ziedot ..."
+
+#: tfabout.caption
+msgctxt "TFABOUT.CAPTION"
+msgid "About"
+msgstr "Par LazPaint"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "TFABOUT.LABEL_AUTHORS.CAPTION"
+msgid "Authors:"
+msgstr "Autori:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "TFABOUT.LABEL_AUTHORSVALUE.CAPTION"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, kuram palīdzēja FabienWang, Lainz un citi"
+
+#: tfabout.label_homepage.caption
+msgctxt "TFABOUT.LABEL_HOMEPAGE.CAPTION"
+msgid "Homepage:"
+msgstr "Mājas lapa:"
+
+#: tfabout.label_libraries.caption
+msgctxt "TFABOUT.LABEL_LIBRARIES.CAPTION"
+msgid "Libraries used:"
+msgstr "Izmantotās bibliotēkas:"
+
+#: tfabout.label_licence.caption
+msgctxt "TFABOUT.LABEL_LICENCE.CAPTION"
+msgid "Licence:"
+msgstr "Licence"
+
+#: tfabout.label_opensource.caption
+msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
+msgid "Open source (GPLv3)"
+msgstr "Atklātā pirmkoda programmatūra (GPLv3)"
+
+#: tfadjustcurves.button_cancel.caption
+msgctxt "TFADJUSTCURVES.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfadjustcurves.button_ok.caption
+msgctxt "TFADJUSTCURVES.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfadjustcurves.caption
+msgid "Adjust curves"
+msgstr "Mainīt līknes"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Dzēst patreizējo un sākt jaunu līkni"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Plakāta efekts"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Dzēst izvēlēto punktu (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "TFBLENDOP.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfblendop.button_ok.caption
+msgctxt "TFBLENDOP.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Sapludināšana"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "TFBLENDOP.LABEL_BLENDOPCATEGORY.CAPTION"
+msgid "Category of blend operation"
+msgstr "Sapludināšanas veids"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "TFBLENDOP.LABEL_KRITAOVER.CAPTION"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Sapludināšana kāda iespējama programmā Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "TFBLENDOP.LABEL_OTHEROVER.CAPTION"
+msgid "Other"
+msgstr "Cits"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "LazPant un Paint.NET sapludināšanas darbības"
+
+#: tfblendop.label_patternover.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNOVER.CAPTION"
+msgid "Pattern over"
+msgstr "Raksts pa virsu"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Sapludināsanas priekšapskate ar izvēlēto attēlu augšpusē"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNUNDER.CAPTION"
+msgid "Pattern under"
+msgstr "Raksts apakšā"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Sapludināsanas priekšapskate ar izvēlēto attēlu apakšpusē"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "TFBLENDOP.LABEL_PREVIEWWITH.CAPTION"
+msgid "Preview with"
+msgstr "Priekšskatīt ar"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Izvēlētā sapludināšana"
+
+#: tfblendop.label_svgover.caption
+msgctxt "TFBLENDOP.LABEL_SVGOVER.CAPTION"
+msgid "Basic SVG"
+msgstr "PamatSVG"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "Sapludunāšana veidi, kuri pieejami gandrīz visos attēlu redaktoros"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Caurskatīt attēlus"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Vienu direktoriju augšup"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr "Atvērt izvēlētos failus"
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "TFBROWSEIMAGES.TOOLBUTTON_VIEWBIGICON.HINT"
+msgid "Show big icons"
+msgstr "Rādīt lielas ikonas"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "TFBROWSEIMAGES.TOOLBUTTON_VIEWDETAILS.HINT"
+msgid "Show details and preview"
+msgstr "Ziņas un priekšapskate"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr "Izvēlies disku"
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfcanvassize.caption
+msgctxt "TFCANVASSIZE.CAPTION"
+msgid "Canvas size"
+msgstr "Audekla izmērs"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Spoguļot"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "TFCANVASSIZE.LABEL_ANCHOR.CAPTION"
+msgid "Anchor :"
+msgstr "Slāņa novietojums:"
+
+#: tfcanvassize.label_height.caption
+msgctxt "TFCANVASSIZE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Augstums:"
+
+#: tfcanvassize.label_width.caption
+msgctxt "TFCANVASSIZE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Platums:"
+
+#: tfcolorintensity.button_cancel.caption
+msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfcolorintensity.button_ok.caption
+msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfcolorintensity.caption
+msgctxt "TFCOLORINTENSITY.CAPTION"
+msgid "Intensity"
+msgstr "Spilgtums"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "TFCOLORINTENSITY.LABEL_MULTIPLY.CAPTION"
+msgid "Multiply"
+msgstr "Reizinātājs"
+
+#: tfcolorintensity.label_shift.caption
+msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION"
+msgid "Shift"
+msgstr "Novirze"
+
+#: tfcolorize.button_cancel.caption
+msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfcolorize.button_ok.caption
+msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfcolorize.caption
+msgctxt "TFCOLORIZE.CAPTION"
+msgid "Colorize"
+msgstr "Iekrāsot"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "TFCOLORIZE.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr "Izlabot nokrāsu un gaišumu"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "TFCOLORIZE.LABEL_COLORNESS.CAPTION"
+msgid "Colorness"
+msgstr "Piesātinājums"
+
+#: tfcolorize.label_hue.caption
+msgctxt "TFCOLORIZE.LABEL_HUE.CAPTION"
+msgid "Hue"
+msgstr "Nokrāsa"
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr "Iestatījumi"
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr "Labot masku ..."
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "Pielāgota aizmiglošana"
+
+#: tfcustomblur.openpicturedialog1.title
+msgid "Open grayscale file"
+msgstr "Atvērt pelēktoņu attēlu"
+
+#: tfemboss.button_cancel.caption
+msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfemboss.button_ok.caption
+msgctxt "TFEMBOSS.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfemboss.caption
+msgctxt "TFEMBOSS.CAPTION"
+msgid "Emboss"
+msgstr "Gofrēt"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION"
+msgid "Direction :"
+msgstr "Virziens:"
+
+#: tffilterfunction.button_cancel.caption
+msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tffilterfunction.button_ok.caption
+msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tffilterfunction.caption
+msgid "Apply function"
+msgstr "Pielietot funkciju"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "TFFILTERFUNCTION.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr "Izlabota nokrāsa un gaišums"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Mainīgie:"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "Labi"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr "Simetriska ota"
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr "Izgaišana uz malām"
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr "Malu skaits"
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Attēlu saraksts"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "Noņemt ķeksi, kad attēls atvērts"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "Noņemt ķeksi, kad attēls labots un saglabāts"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Tukšs attēlu saraksts"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "Izņemt neesošus attēlus"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "Izņemt neatzīmētus attēlus"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "Izņemt atzīmējumu neesošiem failiem"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[1].TITLE.CAPTION"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[2].TITLE.CAPTION"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "TFIMAGELIST.STRINGGRID1.COLUMNS[3].TITLE.CAPTION"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Pievienot attēlu sarakstam"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "Iespējot ķekšu noņemšanu no apstrādātiem attēliem"
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "Iespējot attēlu pielāgošanu „LazPaint” logam"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "Atzīmēt visus failus apstrādei"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Pārslēgties uz mazo lodziņu"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Pavirzīt atzīmētos attēlus uz leju"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Pavirzīt atzīmētos attēlus uz augšu"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Pārslēgties uz parasto logu"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Atvērt doto attēlu"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Atvērt sarakstā esošo nākamo attēlu (Alt-Pa_labi)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "TFIMAGELIST.TBOPENNEXTSW.HINT"
+msgid "Open next image"
+msgstr "Atvērt nākamo attēlu"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Atvērt sarakstā esošo iepriekšējo attēlu (Alt-Pa_kreisi)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "TFIMAGELIST.TBOPENPREVSW.HINT"
+msgid "Open previous image"
+msgstr "Atvērt iepriekšējo attēlu"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Izņemt atzīmētos attēlus no saraksta"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "Noņemt visus ķekšus"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Ielasu ..."
+
+#: tfmotionblur.button_cancel.caption
+msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfmotionblur.button_ok.caption
+msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfmotionblur.caption
+msgctxt "TFMOTIONBLUR.CAPTION"
+msgid "Motion blur"
+msgstr "Kustības izplūdums"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Virzīts"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "TFMOTIONBLUR.LABEL_DISTANCE.CAPTION"
+msgid "Distance :"
+msgstr "Attālums:"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "TFMULTIIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "TFMULTIIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Izvēlies attēlu"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfnewimage.caption
+msgctxt "TFNEWIMAGE.CAPTION"
+msgid "New image"
+msgstr "Jauns attēls"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "TFNEWIMAGE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Augstums:"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Platums:"
+
+#: tfnoisefilter.button_cancel.caption
+msgctxt "TFNOISEFILTER.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfnoisefilter.button_ok.caption
+msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfnoisefilter.caption
+msgid "Noise filter"
+msgstr "Trokšņu filtrs"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Redzamība"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Pelēko toņu troksnis"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "RGB troksnis"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "TFOBJECT3D.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Virsmas raksts ..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "TFOBJECT3D.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "3D veidojums"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Kropļojumnovērse"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "Divpusējas virsmas"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Iestarpinājumi virsmas rakstā"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr "Izvēlētā gaisma"
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "TFOBJECT3D.GROUPBOX_SELECTEDMATERIAL.CAPTION"
+msgid "Selected material"
+msgstr "Izvēlētais materiāls"
+
+#: tfobject3d.label_color.caption
+msgctxt "TFOBJECT3D.LABEL_COLOR.CAPTION"
+msgid "Color :"
+msgstr "Krāsa:"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Krāsa:"
+
+#: tfobject3d.label_height.caption
+msgctxt "TFOBJECT3D.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Augstums:"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "TFOBJECT3D.LABEL_LIGHTINGNORMALS.CAPTION"
+msgid "Lighting normals :"
+msgstr "Apgaismojuma normāles:"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr "Gaismas:"
+
+#: tfobject3d.label_materials.caption
+msgctxt "TFOBJECT3D.LABEL_MATERIALS.CAPTION"
+msgid "Materials :"
+msgstr "Materiāli:"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "TFOBJECT3D.LABEL_OPACITY.CAPTION"
+msgid "Opacity :"
+msgstr "Redzamība:"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "TFOBJECT3D.LABEL_SPECULARINDEX.CAPTION"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "TFOBJECT3D.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Platums:"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "TFOBJECT3D.LABEL_ZOOM.CAPTION"
+msgid "Zoom"
+msgstr "Tuvinājums"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr "Gaismas"
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Materiāli"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "TFOBJECT3D.OPENTEXTUREDIALOG.TITLE"
+msgid "Open texture"
+msgstr "Atvērt virsmas rakstu"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Atveidošana"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr "Pievinot virzītu gaismu"
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr "Pievienot punktveida gaismas avotu"
+
+#: tfobject3d.toolremoveselectedlight.hint
+msgid "Remove selected light"
+msgstr "Izmest doto gaismu"
+
+#: tfphongfilter.button_cancel.caption
+msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfphongfilter.button_ok.caption
+msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfphongfilter.caption
+msgctxt "TFPHONGFILTER.CAPTION"
+msgid "Shaded map"
+msgstr "Ēnota virsma"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "TFPHONGFILTER.GROUPBOX_COLOR.CAPTION"
+msgid "Color"
+msgstr "Krāsa"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Virsmas pacēlums"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Kopējais pacēlums"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Gaismas avots"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Caurspīdīgums"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPLIGHTNESS.CAPTION"
+msgid "Lightness"
+msgstr "Gaišums"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Tiešs gaišums"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPSATURATION.CAPTION"
+msgid "Saturation"
+msgstr "Piesātinājums"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Pamatnes krāsa"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Saglabāt"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Otas krāsa"
+
+#: tfphongfilter.radio_usetexture.caption
+msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION"
+msgid "Current texture"
+msgstr "Virsmas raksts"
+
+#: tfpixelate.button_cancel.caption
+msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfpixelate.button_ok.caption
+msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfpixelate.caption
+msgctxt "TFPIXELATE.CAPTION"
+msgid "Pixelate"
+msgstr ""
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "TFPIXELATE.LABEL_PIXELSIZE.CAPTION"
+msgid "Pixel size :"
+msgstr ""
+
+#: tfpixelate.label_quality.caption
+msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION"
+msgid "Quality :"
+msgstr ""
+
+#: tfposterize.button_cancel.caption
+msgctxt "TFPOSTERIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfposterize.button_ok.caption
+msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfposterize.caption
+msgctxt "TFPOSTERIZE.CAPTION"
+msgid "Posterize"
+msgstr "Samazināts krāsu daudzums"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Pēc gaišuma"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Līmeņi:"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Iestatījumi ..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Drukāt!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "TFPRINT.BUTTON_ZOOMFIT.CAPTION"
+msgid "Zoom fit"
+msgstr "Pielāgot lapai"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Drukāt"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "TFPRINT.CHECKBOX_RATIO.CAPTION"
+msgid "Keep aspect ratio"
+msgstr "Saglabāt attiecību"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Attēla izmērs"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Malas"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Apakšā:"
+
+#: tfprint.label_dpix.caption
+msgctxt "TFPRINT.LABEL_DPIX.CAPTION"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "TFPRINT.LABEL_DPIY.CAPTION"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Augstums"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Kreisā pusē:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Orientācija"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Drukas iekārta un papīrs"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Labā pusē:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Augšā:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Platums"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+msgctxt "tfquestion.label_message.caption"
+msgid "."
+msgstr "."
+
+#: tfradialblur.button_cancel.caption
+msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfradialblur.button_ok.caption
+msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfradialblur.caption
+msgctxt "TFRADIALBLUR.CAPTION"
+msgid "Radial blur"
+msgstr "Izpludināšana"
+
+#: tfradialblur.label_radius.caption
+msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION"
+msgid "Radius :"
+msgstr "Rādiuss:"
+
+#: tfrain.button_cancel.caption
+msgctxt "tfrain.button_cancel.caption"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfrain.button_ok.caption
+msgctxt "tfrain.button_ok.caption"
+msgid "OK"
+msgstr "Labi"
+
+#: tfrain.caption
+msgid "Rain"
+msgstr "Lietus"
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr "Stiprums"
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr "Vējš"
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfresample.caption
+msgctxt "TFRESAMPLE.CAPTION"
+msgid "Resample"
+msgstr "Izmēra maiņa"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Saglabāt attiecību"
+
+#: tfresample.label_height.caption
+msgctxt "TFRESAMPLE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Augstums:"
+
+#: tfresample.label_quality.caption
+msgctxt "TFRESAMPLE.LABEL_QUALITY.CAPTION"
+msgid "Quality :"
+msgstr ""
+
+#: tfresample.label_width.caption
+msgctxt "TFRESAMPLE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Platums:"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "Labi"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Saglabāt"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr "Neīstā tonēšana"
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr "0"
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr "100"
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr "50"
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr "Krasu dziļums:"
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr "Izmērs:"
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr "16 krāsas"
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr "24 bitu"
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr "256 krāsas"
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr "2 krāsas"
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+msgid "MioMap"
+msgstr ""
+
+#: tfsharpen.button_cancel.caption
+msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfsharpen.button_ok.caption
+msgctxt "TFSHARPEN.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfsharpen.caption
+msgid "Sharpen/Smooth"
+msgstr "Asināt/Nogludināt"
+
+#: tfsharpen.label_amount.caption
+msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION"
+msgid "Amount :"
+msgstr ""
+
+#: tfshiftcolors.button_cancel.caption
+msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Atsaukt"
+
+#: tfshiftcolors.button_ok.caption
+msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "Labi"
+
+#: tfshiftcolors.caption
+msgctxt "TFSHIFTCOLORS.CAPTION"
+msgid "Shift colors"
+msgstr "Nobīdīt krāsas"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Pielāgot nokrāsas un gaišumu"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Nokrāsa"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Piesātinājums"
+
+#: tftoolbox.caption
+msgctxt "TFTOOLBOX.CAPTION"
+msgid "Tools"
+msgstr "Rīki"
+
+

+ 1210 - 12
lazpaint/release/bin/i18n/lazpaint.nl.po

@@ -1588,9 +1588,9 @@ msgstr "alles"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr "Alle ondersteunde bestandstypes"
 msgstr "Alle ondersteunde bestandstypes"
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Houd ALT of SHIFT vast om te schalen"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Houd %1 of %2 vast om te schalen"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1705,9 +1705,9 @@ msgstr "Cosinus"
 msgid "Crop"
 msgid "Crop"
 msgstr "Bijsnijden"
 msgstr "Bijsnijden"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Houd CTRL ingedrukt om rotatiehoek te beperken"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Houd %2 ingedrukt om rotatiehoek te beperken"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1870,13 +1870,13 @@ msgstr "Groen"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Half-cosinus"
 msgstr "Half-cosinus"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Houd CTRL ingedrukt om op pixels vast te kleven"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Houd %1 ingedrukt om op pixels vast te kleven"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Houd SHIFT ingedrukt om een vierkant of cirkel te tekenen"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Houd %1 ingedrukt om een vierkant of cirkel te tekenen"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2338,3 +2338,1201 @@ msgstr "Vector laag"
 #: uresourcestrings.rsyes
 #: uresourcestrings.rsyes
 msgid "Yes"
 msgid "Yes"
 msgstr "Ja"
 msgstr "Ja"
+
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Doneren..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "Over"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Auteurs:"
+
+#: tfabout.label_authorsvalue.caption
+#| msgid "Circular help by FabienWang and Lainz"
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular geholpen door FabienWang, Lainz en anderen"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Homepage:"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Gebruikte libraries:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Licentie:"
+
+#: tfabout.label_opensource.caption
+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"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Huidige kromme weggooien en een nieuwe beginnen"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Posterize"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Verwijder geselecteerd punt (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Mengoperatie"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr "Categorie van mengoperatie"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Mengoperaties die beschikbaar zijn in Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr "Overig"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "Mengoperaties van LazPaint en Paint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr "Patroon over"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Voorvertoning van mengoperatie met gekozen afbeelding boven"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr "Patroon onder"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Voorvertoning van mengoperatie met gekozen afbeelding onder"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr "Voorvertoning met"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Gekozen mengoperatie :"
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+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"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Blader door beelden"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Een directory omhoog gaan"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "Toon grote iconen"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "Toon details en voorvertoning"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Canvasgrootte"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Spiegelmodus"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Anker :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Hoogte :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+msgstr "Breedte :"
+
+#: 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"
+msgstr "Intensiteit"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Vermenigvuldigen"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "Inkleuren"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Gecorrigeerde tint en helderheid"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Kleuring"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Kleurtint"
+
+#: tfcolorize.label_preset.caption
+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 "Bewerkingsmasker..."
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr "Laad masker..."
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcustomblur.caption
+msgctxt "tfcustomblur.caption"
+msgid "Custom blur"
+msgstr "Aangepaste vervaging"
+
+#: tfcustomblur.openpicturedialog1.title
+msgid "Open grayscale file"
+msgstr "Open grijstinten-bestand"
+
+#: 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"
+msgstr "Reliëf"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Gecorrigeerde tint en helderheid"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Variabelen :"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr "Afbeeldingslijst"
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr "Automatisch bestanden uitvinken na openen"
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr "Automatisch bestanden uitvinken na bewerking en opslag"
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr "Schoon beeldlijst op"
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr "Verwijder niet-bestaande beelden"
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr "Verwijder uitgevinkte beelden"
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr "Vink niet-bestaande bestanden uit"
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr "-"
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr "Voeg beelden to aan lijst"
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr "Auto-uitvinken aan/uitzetten voor verwerkte bestanden"
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr "Afbeelding autofit in LazPaint venster aan/uitzetten"
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr "Controleer alle bestanden voor verwerking"
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr "Schakel naar minivenster"
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr "Verplaats geselecteerde items omlaag"
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr "Verplaats geselecteerde items omhoog"
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr "Schakel naar normaal venster"
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr "Open huidige afbeelding"
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr "Open volgende afbeelding (Alt-Rechts)"
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr "Open volgende afbeelding"
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr "Open vorige afbeelding (Alt-Links)"
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr "Open vorige afbeelding"
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr "Verwijder geselecteerde afbeeldingen uit lijst"
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr "Vink alle bestanden uit voor verwerking"
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Bezig met laden..."
+
+#: 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"
+msgstr "Bewegingsvervaging"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Oriëntatie"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Afstand :"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Afbeelding kiezen"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Nieuwe afbeelding"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Hoogte :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Dekking:"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Grijstint ruis"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "RGB ruis"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Tekstuur..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr "Geen tex."
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "3d object"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Antialiasing"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "2-zijdige vlakken"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Texture interpolatie"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "Geselecteerd materiaal"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "Kleur :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Kleur :"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Hoogte :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "Belichting normalen :"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "Materialen :"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "Dekking :"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "Spec. index :"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Breedte :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "Zoomen"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Materialen"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Textuur openen"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Renderen"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+msgid "Remove selected light"
+msgstr ""
+
+#: 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"
+msgstr "Shaded map"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Kleur"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Hoogte map"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Algemene hoogte :"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Lichtpositie :"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Alpha"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Lichtheid"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Lineaire lichtheid"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Verzadiging"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Achtergrondkleur"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Behouden"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Penkleur"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "In pixels tonen"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Pixelgrootte :"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr "Posterize"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Middels lichtheid"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Niveaus :"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Instellen..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Druk af!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Passend maken"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Druk af"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Aspectverhouding behouden"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Afbeeldingsgrootte"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Marges"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Onderkant:"
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Hoogte:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Links:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Oriëntatie:"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Printer en papier:"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Rechts:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Bovenkant:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Breedte:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Radiale vervaging"
+
+#: tfradialblur.label_radius.caption
+msgctxt "tfradialblur.label_radius.caption"
+msgid "Radius :"
+msgstr "Radius :"
+
+#: 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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Opnieuw samplen"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Aspectverhouding behouden"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Hoogte :"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Kwaliteit :"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Breedte :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Opslaan"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+msgid "MioMap"
+msgstr ""
+
+#: 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"
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "Kleuren verschuiven"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Gecorrigeerde tint en helderheid"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Kleurtint"
+
+#: tfshiftcolors.label2.caption
+#| msgid "Colorness"
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Verzadiging"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Gereedschappen"
+

+ 1330 - 94
lazpaint/release/bin/i18n/lazpaint.po

@@ -10,7 +10,7 @@ msgid "Remove color from palette"
 msgstr ""
 msgstr ""
 
 
 #: tfchoosecolor.caption
 #: tfchoosecolor.caption
-msgctxt "TFCHOOSECOLOR.CAPTION"
+msgctxt "tfchoosecolor.caption"
 msgid "Color"
 msgid "Color"
 msgstr ""
 msgstr ""
 
 
@@ -19,7 +19,7 @@ msgid "Color description: click to type in a color with the keyboard using color
 msgstr ""
 msgstr ""
 
 
 #: tflayerstack.caption
 #: tflayerstack.caption
-msgctxt "TFLAYERSTACK.CAPTION"
+msgctxt "tflayerstack.caption"
 msgid "Layers"
 msgid "Layers"
 msgstr ""
 msgstr ""
 
 
@@ -38,12 +38,12 @@ msgid "Zoom layer stack out"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.brushcreategeometric.hint
 #: tfmain.brushcreategeometric.hint
-msgctxt "TFMAIN.BRUSHCREATEGEOMETRIC.HINT"
+msgctxt "tfmain.brushcreategeometric.hint"
 msgid "Create geometric brush"
 msgid "Create geometric brush"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.brushloadfromfile.hint
 #: tfmain.brushloadfromfile.hint
-msgctxt "TFMAIN.BRUSHLOADFROMFILE.HINT"
+msgctxt "tfmain.brushloadfromfile.hint"
 msgid "Load brush from file..."
 msgid "Load brush from file..."
 msgstr ""
 msgstr ""
 
 
@@ -52,7 +52,7 @@ msgid "Remove current brush"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.caption
 #: tfmain.caption
-msgctxt "TFMAIN.CAPTION"
+msgctxt "tfmain.caption"
 msgid "LazPaint"
 msgid "LazPaint"
 msgstr ""
 msgstr ""
 
 
@@ -81,7 +81,7 @@ msgid "Posterize..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.colorshiftcolors.caption
 #: tfmain.colorshiftcolors.caption
-msgctxt "TFMAIN.COLORSHIFTCOLORS.CAPTION"
+msgctxt "tfmain.colorshiftcolors.caption"
 msgid "Shift colors..."
 msgid "Shift colors..."
 msgstr ""
 msgstr ""
 
 
@@ -272,7 +272,7 @@ msgid "Quit"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filereload.caption
 #: tfmain.filereload.caption
-msgctxt "TFMAIN.FILERELOAD.CAPTION"
+msgctxt "tfmain.filereload.caption"
 msgid "Reload"
 msgid "Reload"
 msgstr ""
 msgstr ""
 
 
@@ -316,37 +316,37 @@ msgid "Box blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurcorona.caption
 #: tfmain.filterblurcorona.caption
-msgctxt "TFMAIN.FILTERBLURCORONA.CAPTION"
+msgctxt "tfmain.filterblurcorona.caption"
 msgid "Corona blur..."
 msgid "Corona blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurcustom.caption
 #: tfmain.filterblurcustom.caption
-msgctxt "TFMAIN.FILTERBLURCUSTOM.CAPTION"
+msgctxt "tfmain.filterblurcustom.caption"
 msgid "Custom blur..."
 msgid "Custom blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurdisk.caption
 #: tfmain.filterblurdisk.caption
-msgctxt "TFMAIN.FILTERBLURDISK.CAPTION"
+msgctxt "tfmain.filterblurdisk.caption"
 msgid "Disk blur..."
 msgid "Disk blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurfast.caption
 #: tfmain.filterblurfast.caption
-msgctxt "TFMAIN.FILTERBLURFAST.CAPTION"
+msgctxt "tfmain.filterblurfast.caption"
 msgid "Fast blur..."
 msgid "Fast blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurmotion.caption
 #: tfmain.filterblurmotion.caption
-msgctxt "TFMAIN.FILTERBLURMOTION.CAPTION"
+msgctxt "tfmain.filterblurmotion.caption"
 msgid "Motion blur..."
 msgid "Motion blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurprecise.caption
 #: tfmain.filterblurprecise.caption
-msgctxt "TFMAIN.FILTERBLURPRECISE.CAPTION"
+msgctxt "tfmain.filterblurprecise.caption"
 msgid "Precise blur..."
 msgid "Precise blur..."
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterblurradial.caption
 #: tfmain.filterblurradial.caption
-msgctxt "TFMAIN.FILTERBLURRADIAL.CAPTION"
+msgctxt "tfmain.filterblurradial.caption"
 msgid "Gaussian blur..."
 msgid "Gaussian blur..."
 msgstr ""
 msgstr ""
 
 
@@ -383,7 +383,7 @@ msgid "Grayscale"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.filterlinearnegative.caption
 #: tfmain.filterlinearnegative.caption
-msgctxt "TFMAIN.FILTERLINEARNEGATIVE.CAPTION"
+msgctxt "tfmain.filterlinearnegative.caption"
 msgid "Linear negative"
 msgid "Linear negative"
 msgstr ""
 msgstr ""
 
 
@@ -493,12 +493,12 @@ msgid "Flip image horizontally"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.imagelinearnegative.caption
 #: tfmain.imagelinearnegative.caption
-msgctxt "TFMAIN.IMAGELINEARNEGATIVE.CAPTION"
+msgctxt "tfmain.imagelinearnegative.caption"
 msgid "Linear negative"
 msgid "Linear negative"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.imagenegative.caption
 #: tfmain.imagenegative.caption
-msgctxt "TFMAIN.IMAGENEGATIVE.CAPTION"
+msgctxt "tfmain.imagenegative.caption"
 msgid "Negative"
 msgid "Negative"
 msgstr ""
 msgstr ""
 
 
@@ -550,7 +550,7 @@ msgid "Selected tool"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.image_swapcolors.hint
 #: tfmain.image_swapcolors.hint
-msgctxt "TFMAIN.IMAGE_SWAPCOLORS.HINT"
+msgctxt "tfmain.image_swapcolors.hint"
 msgid "Switch color"
 msgid "Switch color"
 msgstr ""
 msgstr ""
 
 
@@ -559,7 +559,7 @@ msgid "Dock layers and colors"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.itemdonate.caption
 #: tfmain.itemdonate.caption
-msgctxt "TFMAIN.ITEMDONATE.CAPTION"
+msgctxt "tfmain.itemdonate.caption"
 msgid "Donate..."
 msgid "Donate..."
 msgstr ""
 msgstr ""
 
 
@@ -568,7 +568,7 @@ msgid "Fullscreen"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.itemuseimagebrowser.caption
 #: tfmain.itemuseimagebrowser.caption
-msgctxt "TFMAIN.ITEMUSEIMAGEBROWSER.CAPTION"
+msgctxt "tfmain.itemuseimagebrowser.caption"
 msgid "Use image browser"
 msgid "Use image browser"
 msgstr ""
 msgstr ""
 
 
@@ -585,7 +585,7 @@ msgid "Back"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_brush.caption
 #: tfmain.label_brush.caption
-msgctxt "TFMAIN.LABEL_BRUSH.CAPTION"
+msgctxt "tfmain.label_brush.caption"
 msgid "Brush"
 msgid "Brush"
 msgstr ""
 msgstr ""
 
 
@@ -621,7 +621,7 @@ msgid "Curve"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_eraser.caption
 #: tfmain.label_eraser.caption
-msgctxt "TFMAIN.LABEL_ERASER.CAPTION"
+msgctxt "tfmain.label_eraser.caption"
 msgid "Erase"
 msgid "Erase"
 msgstr ""
 msgstr ""
 
 
@@ -631,12 +631,12 @@ msgid "Grid"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_gridx.caption
 #: tfmain.label_gridx.caption
-msgctxt "TFMAIN.LABEL_GRIDX.CAPTION"
+msgctxt "tfmain.label_gridx.caption"
 msgid "x"
 msgid "x"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_outlinewidth.caption
 #: tfmain.label_outlinewidth.caption
-msgctxt "TFMAIN.LABEL_OUTLINEWIDTH.CAPTION"
+msgctxt "tfmain.label_outlinewidth.caption"
 msgid "Width"
 msgid "Width"
 msgstr ""
 msgstr ""
 
 
@@ -646,12 +646,12 @@ msgid "Pen"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_penwidth.caption
 #: tfmain.label_penwidth.caption
-msgctxt "TFMAIN.LABEL_PENWIDTH.CAPTION"
+msgctxt "tfmain.label_penwidth.caption"
 msgid "Width"
 msgid "Width"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_phongborder.caption
 #: tfmain.label_phongborder.caption
-msgctxt "TFMAIN.LABEL_PHONGBORDER.CAPTION"
+msgctxt "tfmain.label_phongborder.caption"
 msgid "Border"
 msgid "Border"
 msgstr ""
 msgstr ""
 
 
@@ -684,7 +684,7 @@ msgid "Blur"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.label_tolerance.caption
 #: tfmain.label_tolerance.caption
-msgctxt "TFMAIN.LABEL_TOLERANCE.CAPTION"
+msgctxt "tfmain.label_tolerance.caption"
 msgid "Tolerance"
 msgid "Tolerance"
 msgstr ""
 msgstr ""
 
 
@@ -699,7 +699,7 @@ msgid "Duplicate selected layer"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.layerfromfile.hint
 #: tfmain.layerfromfile.hint
-msgctxt "TFMAIN.LAYERFROMFILE.HINT"
+msgctxt "tfmain.layerfromfile.hint"
 msgid "Import layer from file..."
 msgid "Import layer from file..."
 msgstr ""
 msgstr ""
 
 
@@ -708,12 +708,12 @@ msgid "Flip layer horizontally"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.layermergeover.hint
 #: tfmain.layermergeover.hint
-msgctxt "TFMAIN.LAYERMERGEOVER.HINT"
+msgctxt "tfmain.layermergeover.hint"
 msgid "Merge layer over"
 msgid "Merge layer over"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.layermove.hint
 #: tfmain.layermove.hint
-msgctxt "TFMAIN.LAYERMOVE.HINT"
+msgctxt "tfmain.layermove.hint"
 msgid "Move layer"
 msgid "Move layer"
 msgstr ""
 msgstr ""
 
 
@@ -722,12 +722,12 @@ msgid "Rasterize layer"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.layerremovecurrent.hint
 #: tfmain.layerremovecurrent.hint
-msgctxt "TFMAIN.LAYERREMOVECURRENT.HINT"
+msgctxt "tfmain.layerremovecurrent.hint"
 msgid "Remove layer"
 msgid "Remove layer"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.layerrotate.hint
 #: tfmain.layerrotate.hint
-msgctxt "TFMAIN.LAYERROTATE.HINT"
+msgctxt "tfmain.layerrotate.hint"
 msgid "Rotate layer"
 msgid "Rotate layer"
 msgstr ""
 msgstr ""
 
 
@@ -745,7 +745,7 @@ msgid "Load selection"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menucolors.caption
 #: tfmain.menucolors.caption
-msgctxt "TFMAIN.MENUCOLORS.CAPTION"
+msgctxt "tfmain.menucolors.caption"
 msgid "Colors"
 msgid "Colors"
 msgstr ""
 msgstr ""
 
 
@@ -766,7 +766,7 @@ msgid "Dock right"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuedit.caption
 #: tfmain.menuedit.caption
-msgctxt "TFMAIN.MENUEDIT.CAPTION"
+msgctxt "tfmain.menuedit.caption"
 msgid "Edit"
 msgid "Edit"
 msgstr ""
 msgstr ""
 
 
@@ -779,57 +779,57 @@ msgid "Show file toolbar"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menufilter.caption
 #: tfmain.menufilter.caption
-msgctxt "TFMAIN.MENUFILTER.CAPTION"
+msgctxt "tfmain.menufilter.caption"
 msgid "Filter"
 msgid "Filter"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuhelp.caption
 #: tfmain.menuhelp.caption
-msgctxt "TFMAIN.MENUHELP.CAPTION"
+msgctxt "tfmain.menuhelp.caption"
 msgid "Help"
 msgid "Help"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuimage.caption
 #: tfmain.menuimage.caption
-msgctxt "TFMAIN.MENUIMAGE.CAPTION"
+msgctxt "tfmain.menuimage.caption"
 msgid "Image"
 msgid "Image"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menulanguage.caption
 #: tfmain.menulanguage.caption
-msgctxt "TFMAIN.MENULANGUAGE.CAPTION"
+msgctxt "tfmain.menulanguage.caption"
 msgid "Language"
 msgid "Language"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuradialblur.caption
 #: tfmain.menuradialblur.caption
-msgctxt "TFMAIN.MENURADIALBLUR.CAPTION"
+msgctxt "tfmain.menuradialblur.caption"
 msgid "Radial blur"
 msgid "Radial blur"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menurecentfiles.caption
 #: tfmain.menurecentfiles.caption
-msgctxt "TFMAIN.MENURECENTFILES.CAPTION"
+msgctxt "tfmain.menurecentfiles.caption"
 msgid "Recent files"
 msgid "Recent files"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuremovetransparency.caption
 #: tfmain.menuremovetransparency.caption
-msgctxt "TFMAIN.MENUREMOVETRANSPARENCY.CAPTION"
+msgctxt "tfmain.menuremovetransparency.caption"
 msgid "Remove transparency"
 msgid "Remove transparency"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menurender.caption
 #: tfmain.menurender.caption
-msgctxt "TFMAIN.MENURENDER.CAPTION"
+msgctxt "tfmain.menurender.caption"
 msgid "Render"
 msgid "Render"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuselect.caption
 #: tfmain.menuselect.caption
-msgctxt "TFMAIN.MENUSELECT.CAPTION"
+msgctxt "tfmain.menuselect.caption"
 msgid "Select"
 msgid "Select"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menushowpalette.caption
 #: tfmain.menushowpalette.caption
-msgctxt "TFMAIN.MENUSHOWPALETTE.CAPTION"
+msgctxt "tfmain.menushowpalette.caption"
 msgid "Show palette"
 msgid "Show palette"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menutool.caption
 #: tfmain.menutool.caption
-msgctxt "TFMAIN.MENUTOOL.CAPTION"
+msgctxt "tfmain.menutool.caption"
 msgid "Tools"
 msgid "Tools"
 msgstr ""
 msgstr ""
 
 
@@ -842,7 +842,7 @@ msgid "Show undo/redo toolbar"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.menuview.caption
 #: tfmain.menuview.caption
-msgctxt "TFMAIN.MENUVIEW.CAPTION"
+msgctxt "tfmain.menuview.caption"
 msgid "View"
 msgid "View"
 msgstr ""
 msgstr ""
 
 
@@ -851,7 +851,7 @@ msgid "Show zoom toolbar"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.open3dobjectdialog.title
 #: tfmain.open3dobjectdialog.title
-msgctxt "TFMAIN.OPEN3DOBJECTDIALOG.TITLE"
+msgctxt "tfmain.open3dobjectdialog.title"
 msgid "Import 3D object"
 msgid "Import 3D object"
 msgstr ""
 msgstr ""
 
 
@@ -860,6 +860,7 @@ msgid "Open brush"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.openpicturedialog1.title
 #: tfmain.openpicturedialog1.title
+msgctxt "TFMAIN.OPENPICTUREDIALOG1.TITLE"
 msgid "Open existing image"
 msgid "Open existing image"
 msgstr ""
 msgstr ""
 
 
@@ -869,12 +870,12 @@ msgid "Open texture"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.perspective_repeat.hint
 #: tfmain.perspective_repeat.hint
-msgctxt "TFMAIN.PERSPECTIVE_REPEAT.HINT"
+msgctxt "tfmain.perspective_repeat.hint"
 msgid "Repeat image"
 msgid "Repeat image"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.perspective_twoplanes.hint
 #: tfmain.perspective_twoplanes.hint
-msgctxt "TFMAIN.PERSPECTIVE_TWOPLANES.HINT"
+msgctxt "tfmain.perspective_twoplanes.hint"
 msgid "Draw opposite plane too"
 msgid "Draw opposite plane too"
 msgstr ""
 msgstr ""
 
 
@@ -891,7 +892,7 @@ msgid "Water with custom colors"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.rendercyclicperlinnoise.caption
 #: tfmain.rendercyclicperlinnoise.caption
-msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION"
+msgctxt "tfmain.rendercyclicperlinnoise.caption"
 msgid "Cyclic Perlin noise"
 msgid "Cyclic Perlin noise"
 msgstr ""
 msgstr ""
 
 
@@ -924,7 +925,7 @@ msgid "Stone"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.renderwater.caption
 #: tfmain.renderwater.caption
-msgctxt "TFMAIN.RENDERWATER.CAPTION"
+msgctxt "tfmain.renderwater.caption"
 msgid "Water"
 msgid "Water"
 msgstr ""
 msgstr ""
 
 
@@ -1043,7 +1044,7 @@ msgid "Brush"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toolchangedocking.hint
 #: tfmain.toolchangedocking.hint
-msgctxt "TFMAIN.TOOLCHANGEDOCKING.HINT"
+msgctxt "tfmain.toolchangedocking.hint"
 msgid "Change docking"
 msgid "Change docking"
 msgstr ""
 msgstr ""
 
 
@@ -1099,7 +1100,7 @@ msgid "Move and scroll picture"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toolhotspot.caption
 #: tfmain.toolhotspot.caption
-msgctxt "TFMAIN.TOOLHOTSPOT.CAPTION"
+msgctxt "tfmain.toolhotspot.caption"
 msgid "Hot spot"
 msgid "Hot spot"
 msgstr ""
 msgstr ""
 
 
@@ -1108,7 +1109,7 @@ msgid "Choose hot spot of a cursor"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toollayermapping.hint
 #: tfmain.toollayermapping.hint
-msgctxt "TFMAIN.TOOLLAYERMAPPING.HINT"
+msgctxt "tfmain.toollayermapping.hint"
 msgid "Layer perspective"
 msgid "Layer perspective"
 msgstr ""
 msgstr ""
 
 
@@ -1173,12 +1174,12 @@ msgid "Select ellipse"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toolselectpen.caption
 #: tfmain.toolselectpen.caption
-msgctxt "TFMAIN.TOOLSELECTPEN.CAPTION"
+msgctxt "tfmain.toolselectpen.caption"
 msgid "Selection pen"
 msgid "Selection pen"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toolselectpen.hint
 #: tfmain.toolselectpen.hint
-msgctxt "TFMAIN.TOOLSELECTPEN.HINT"
+msgctxt "tfmain.toolselectpen.hint"
 msgid "Draw selection with pen"
 msgid "Draw selection with pen"
 msgstr ""
 msgstr ""
 
 
@@ -1193,7 +1194,7 @@ msgid "Select rectangle"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.toolselectspline.hint
 #: tfmain.toolselectspline.hint
-msgctxt "TFMAIN.TOOLSELECTSPLINE.HINT"
+msgctxt "tfmain.toolselectspline.hint"
 msgid "Select curve"
 msgid "Select curve"
 msgstr ""
 msgstr ""
 
 
@@ -1237,7 +1238,7 @@ msgid "Square cap"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_closeshape.hint
 #: tfmain.tool_closeshape.hint
-msgctxt "TFMAIN.TOOL_CLOSESHAPE.HINT"
+msgctxt "tfmain.tool_closeshape.hint"
 msgid "Close shape"
 msgid "Close shape"
 msgstr ""
 msgstr ""
 
 
@@ -1246,7 +1247,7 @@ msgid "Draw an angle"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_curvemodeauto.hint
 #: tfmain.tool_curvemodeauto.hint
-msgctxt "TFMAIN.TOOL_CURVEMODEAUTO.HINT"
+msgctxt "tfmain.tool_curvemodeauto.hint"
 msgid "Autodetect angles"
 msgid "Autodetect angles"
 msgstr ""
 msgstr ""
 
 
@@ -1259,32 +1260,32 @@ msgid "Move point"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_diamondgradient.hint
 #: tfmain.tool_diamondgradient.hint
-msgctxt "TFMAIN.TOOL_DIAMONDGRADIENT.HINT"
+msgctxt "tfmain.tool_diamondgradient.hint"
 msgid "Diamond gradient"
 msgid "Diamond gradient"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_drawshapeborder.hint
 #: tfmain.tool_drawshapeborder.hint
-msgctxt "TFMAIN.TOOL_DRAWSHAPEBORDER.HINT"
+msgctxt "tfmain.tool_drawshapeborder.hint"
 msgid "Draw border"
 msgid "Draw border"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_erasealpha.hint
 #: tfmain.tool_erasealpha.hint
-msgctxt "TFMAIN.TOOL_ERASEALPHA.HINT"
+msgctxt "tfmain.tool_erasealpha.hint"
 msgid "Make transparent"
 msgid "Make transparent"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_eraseblur.hint
 #: tfmain.tool_eraseblur.hint
-msgctxt "TFMAIN.TOOL_ERASEBLUR.HINT"
+msgctxt "tfmain.tool_eraseblur.hint"
 msgid "Soften"
 msgid "Soften"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_fillshape.hint
 #: tfmain.tool_fillshape.hint
-msgctxt "TFMAIN.TOOL_FILLSHAPE.HINT"
+msgctxt "tfmain.tool_fillshape.hint"
 msgid "Fill shape"
 msgid "Fill shape"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_gridmovewithoutdeformation.hint
 #: tfmain.tool_gridmovewithoutdeformation.hint
-msgctxt "TFMAIN.TOOL_GRIDMOVEWITHOUTDEFORMATION.HINT"
+msgctxt "tfmain.tool_gridmovewithoutdeformation.hint"
 msgid "Move grid without deformation"
 msgid "Move grid without deformation"
 msgstr ""
 msgstr ""
 
 
@@ -1304,67 +1305,67 @@ msgid "Round join"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_lineargradient.hint
 #: tfmain.tool_lineargradient.hint
-msgctxt "TFMAIN.TOOL_LINEARGRADIENT.HINT"
+msgctxt "tfmain.tool_lineargradient.hint"
 msgid "Linear gradient"
 msgid "Linear gradient"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshapecone.hint
 #: tfmain.tool_phongshapecone.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPECONE.HINT"
+msgctxt "tfmain.tool_phongshapecone.hint"
 msgid "Cone"
 msgid "Cone"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshapehorizontalcylinder.hint
 #: tfmain.tool_phongshapehorizontalcylinder.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPEHORIZONTALCYLINDER.HINT"
+msgctxt "tfmain.tool_phongshapehorizontalcylinder.hint"
 msgid "Horizontal cylinder"
 msgid "Horizontal cylinder"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshaperectangle.hint
 #: tfmain.tool_phongshaperectangle.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPERECTANGLE.HINT"
+msgctxt "tfmain.tool_phongshaperectangle.hint"
 msgid "Rectangle"
 msgid "Rectangle"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshaperoundrect.hint
 #: tfmain.tool_phongshaperoundrect.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPEROUNDRECT.HINT"
+msgctxt "tfmain.tool_phongshaperoundrect.hint"
 msgid "Rounded rectangle"
 msgid "Rounded rectangle"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshapesphere.hint
 #: tfmain.tool_phongshapesphere.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPESPHERE.HINT"
+msgctxt "tfmain.tool_phongshapesphere.hint"
 msgid "Sphere"
 msgid "Sphere"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshapeverticalcone.hint
 #: tfmain.tool_phongshapeverticalcone.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPEVERTICALCONE.HINT"
+msgctxt "tfmain.tool_phongshapeverticalcone.hint"
 msgid "Vertical cone"
 msgid "Vertical cone"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_phongshapeverticalcylinder.hint
 #: tfmain.tool_phongshapeverticalcylinder.hint
-msgctxt "TFMAIN.TOOL_PHONGSHAPEVERTICALCYLINDER.HINT"
+msgctxt "tfmain.tool_phongshapeverticalcylinder.hint"
 msgid "Vertical cylinder"
 msgid "Vertical cylinder"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_progressivefloodfill.caption
 #: tfmain.tool_progressivefloodfill.caption
-msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.CAPTION"
+msgctxt "tfmain.tool_progressivefloodfill.caption"
 msgid "Progressive floodfill"
 msgid "Progressive floodfill"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_progressivefloodfill.hint
 #: tfmain.tool_progressivefloodfill.hint
-msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
+msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgid "Progressive floodfill"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_radialgradient.hint
 #: tfmain.tool_radialgradient.hint
-msgctxt "TFMAIN.TOOL_RADIALGRADIENT.HINT"
+msgctxt "tfmain.tool_radialgradient.hint"
 msgid "Radial gradient"
 msgid "Radial gradient"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_reflectedgradient.hint
 #: tfmain.tool_reflectedgradient.hint
-msgctxt "TFMAIN.TOOL_REFLECTEDGRADIENT.HINT"
+msgctxt "tfmain.tool_reflectedgradient.hint"
 msgid "Reflected gradient"
 msgid "Reflected gradient"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.tool_singradient.hint
 #: tfmain.tool_singradient.hint
-msgctxt "TFMAIN.TOOL_SINGRADIENT.HINT"
+msgctxt "tfmain.tool_singradient.hint"
 msgid "Sine gradient"
 msgid "Sine gradient"
 msgstr ""
 msgstr ""
 
 
@@ -1412,17 +1413,17 @@ msgid "Layers"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.viewlayerstackbutton.caption
 #: tfmain.viewlayerstackbutton.caption
-msgctxt "TFMAIN.VIEWLAYERSTACKBUTTON.CAPTION"
+msgctxt "tfmain.viewlayerstackbutton.caption"
 msgid "Show layers"
 msgid "Show layers"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.viewlayerstackbutton.hint
 #: tfmain.viewlayerstackbutton.hint
-msgctxt "TFMAIN.VIEWLAYERSTACKBUTTON.HINT"
+msgctxt "tfmain.viewlayerstackbutton.hint"
 msgid "Show or hide layer stack window"
 msgid "Show or hide layer stack window"
 msgstr ""
 msgstr ""
 
 
 #: tfmain.viewpalette.caption
 #: tfmain.viewpalette.caption
-msgctxt "TFMAIN.VIEWPALETTE.CAPTION"
+msgctxt "tfmain.viewpalette.caption"
 msgid "Palette"
 msgid "Palette"
 msgstr ""
 msgstr ""
 
 
@@ -1478,17 +1479,17 @@ msgid "OK"
 msgstr ""
 msgstr ""
 
 
 #: tftwirl.caption
 #: tftwirl.caption
-msgctxt "TFTWIRL.CAPTION"
+msgctxt "tftwirl.caption"
 msgid "Twirl"
 msgid "Twirl"
 msgstr ""
 msgstr ""
 
 
 #: tftwirl.label_angle.caption
 #: tftwirl.label_angle.caption
-msgctxt "TFTWIRL.LABEL_ANGLE.CAPTION"
+msgctxt "tftwirl.label_angle.caption"
 msgid "Angle :"
 msgid "Angle :"
 msgstr ""
 msgstr ""
 
 
 #: tftwirl.label_radius.caption
 #: tftwirl.label_radius.caption
-msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION"
+msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
 msgid "Radius :"
 msgstr ""
 msgstr ""
 
 
@@ -1538,8 +1539,12 @@ msgstr ""
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
+#: uresourcestrings.rsalt
+msgid "ALT"
+msgstr ""
+
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
@@ -1555,6 +1560,7 @@ msgid "Press BACKSPACE to remove last point"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsbestquality
 #: uresourcestrings.rsbestquality
+msgctxt "uresourcestrings.rsbestquality"
 msgid "Best quality"
 msgid "Best quality"
 msgstr ""
 msgstr ""
 
 
@@ -1605,6 +1611,7 @@ msgid "Clear palette"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscloserequest
 #: uresourcestrings.rscloserequest
+msgctxt "uresourcestrings.rscloserequest"
 msgid "Close request"
 msgid "Close request"
 msgstr ""
 msgstr ""
 
 
@@ -1648,6 +1655,7 @@ msgid "Corr. Hue CW"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscosine
 #: uresourcestrings.rscosine
+msgctxt "uresourcestrings.rscosine"
 msgid "Cosine"
 msgid "Cosine"
 msgstr ""
 msgstr ""
 
 
@@ -1655,8 +1663,16 @@ msgstr ""
 msgid "Crop"
 msgid "Crop"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
+#: uresourcestrings.rsctrl
+msgid "CTRL"
+msgstr ""
+
+#: uresourcestrings.rscmd
+msgid "CMD"
+msgstr ""
+
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
@@ -1684,7 +1700,12 @@ msgstr ""
 msgid "Dither layer using palette"
 msgid "Dither layer using palette"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsduplicateimage
+msgid "Duplicate image"
+msgstr ""
+
 #: uresourcestrings.rseditmask
 #: uresourcestrings.rseditmask
+msgctxt "uresourcestrings.rseditmask"
 msgid "Edit mask"
 msgid "Edit mask"
 msgstr ""
 msgstr ""
 
 
@@ -1693,6 +1714,7 @@ msgid "Edit selection"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsedittexture
 #: uresourcestrings.rsedittexture
+msgctxt "uresourcestrings.rsedittexture"
 msgid "Edit texture"
 msgid "Edit texture"
 msgstr ""
 msgstr ""
 
 
@@ -1726,9 +1748,10 @@ msgstr ""
 
 
 #: uresourcestrings.rserroronopeningfile
 #: uresourcestrings.rserroronopeningfile
 msgid "Error on opening file \"%1\""
 msgid "Error on opening file \"%1\""
-msgstr ""
+msgstr ""%1\""
 
 
 #: uresourcestrings.rsexitrequest
 #: uresourcestrings.rsexitrequest
+msgctxt "uresourcestrings.rsexitrequest"
 msgid "Exit request"
 msgid "Exit request"
 msgstr ""
 msgstr ""
 
 
@@ -1745,6 +1768,7 @@ msgid "expects N parameters : "
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsfast
 #: uresourcestrings.rsfast
+msgctxt "uresourcestrings.rsfast"
 msgid "Fast"
 msgid "Fast"
 msgstr ""
 msgstr ""
 
 
@@ -1757,6 +1781,7 @@ msgid "Date"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsfileextensionnotsupported
 #: uresourcestrings.rsfileextensionnotsupported
+msgctxt "uresourcestrings.rsfileextensionnotsupported"
 msgid "This file extension is not supported."
 msgid "This file extension is not supported."
 msgstr ""
 msgstr ""
 
 
@@ -1817,15 +1842,20 @@ msgid "Green"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rshalfcosine
 #: uresourcestrings.rshalfcosine
+msgctxt "uresourcestrings.rshalfcosine"
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr ""
+
+#: uresourcestrings.rsshift
+msgid "SHIFT"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
@@ -1900,6 +1930,7 @@ msgid "Invalid size for new : "
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rskeepchanges
 #: uresourcestrings.rskeepchanges
+msgctxt "uresourcestrings.rskeepchanges"
 msgid "Do you want to keep changes?"
 msgid "Do you want to keep changes?"
 msgstr ""
 msgstr ""
 
 
@@ -1938,6 +1969,7 @@ msgid "LazPaint only"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rslight
 #: uresourcestrings.rslight
+msgctxt "uresourcestrings.rslight"
 msgid "Light"
 msgid "Light"
 msgstr ""
 msgstr ""
 
 
@@ -1951,6 +1983,7 @@ msgid "Light position"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rslinear
 #: uresourcestrings.rslinear
+msgctxt "uresourcestrings.rslinear"
 msgid "Linear"
 msgid "Linear"
 msgstr ""
 msgstr ""
 
 
@@ -1983,6 +2016,7 @@ msgid "Do you want to merge selection?"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsmitchell
 #: uresourcestrings.rsmitchell
+msgctxt "uresourcestrings.rsmitchell"
 msgid "Mitchell"
 msgid "Mitchell"
 msgstr ""
 msgstr ""
 
 
@@ -1991,6 +2025,7 @@ msgid "You are trying to open more than one file. How would you like these files
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsmovingorrotatingselection
 #: uresourcestrings.rsmovingorrotatingselection
+msgctxt "uresourcestrings.rsmovingorrotatingselection"
 msgid "Moving or rotating selection"
 msgid "Moving or rotating selection"
 msgstr ""
 msgstr ""
 
 
@@ -2028,6 +2063,7 @@ msgid "Do not save and open another file"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsnoname
 #: uresourcestrings.rsnoname
+msgctxt "uresourcestrings.rsnoname"
 msgid "noname"
 msgid "noname"
 msgstr ""
 msgstr ""
 
 
@@ -2036,10 +2072,12 @@ msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsnothingtobedeformed
 #: uresourcestrings.rsnothingtobedeformed
+msgctxt "uresourcestrings.rsnothingtobedeformed"
 msgid "There is nothing to be deformed"
 msgid "There is nothing to be deformed"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsnothingtoberetrieved
 #: uresourcestrings.rsnothingtoberetrieved
+msgctxt "uresourcestrings.rsnothingtoberetrieved"
 msgid "There is nothing to be retrieved"
 msgid "There is nothing to be retrieved"
 msgstr ""
 msgstr ""
 
 
@@ -2056,6 +2094,7 @@ msgid "Okay"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsopacity
 #: uresourcestrings.rsopacity
+msgctxt "uresourcestrings.rsopacity"
 msgid "Opacity"
 msgid "Opacity"
 msgstr ""
 msgstr ""
 
 
@@ -2151,6 +2190,7 @@ msgid "Repeat image"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsretrieveselectedarea
 #: uresourcestrings.rsretrieveselectedarea
+msgctxt "uresourcestrings.rsretrieveselectedarea"
 msgid "Do you want to retrieve selected area?"
 msgid "Do you want to retrieve selected area?"
 msgstr ""
 msgstr ""
 
 
@@ -2183,6 +2223,7 @@ msgid "Save with specified filename"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rssavechanges
 #: uresourcestrings.rssavechanges
+msgctxt "uresourcestrings.rssavechanges"
 msgid "Current bitmap has been modified. Do you want to save changes?"
 msgid "Current bitmap has been modified. Do you want to save changes?"
 msgstr ""
 msgstr ""
 
 
@@ -2223,7 +2264,7 @@ msgstr ""
 
 
 #: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
 #: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
 msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
 msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
-msgstr ""
+msgstr ""Enregistrer sous...\" depuis le menu principal."
 
 
 #: uresourcestrings.rstodo
 #: uresourcestrings.rstodo
 msgid "To do"
 msgid "To do"
@@ -2289,3 +2330,1198 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr ""
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr ""
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr ""
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr ""
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr ""
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr ""
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr ""
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr ""
+
+#: tfabout.label_opensource.caption
+msgctxt "tfabout.label_opensource.caption"
+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 ""
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr ""
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr ""
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr ""
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr ""
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr ""
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr ""
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr ""
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr ""
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr ""
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr ""
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr ""
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr ""
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr ""
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr ""
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr ""
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr ""
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr ""
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr ""
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr ""
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr ""
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr ""
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+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"
+msgstr ""
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr ""
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr ""
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr ""
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr ""
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr ""
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr ""
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr ""
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfcustomblur.caption
+msgctxt "tfcustomblur.caption"
+msgid "Custom blur"
+msgstr ""
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr ""
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 ""
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr ""
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr ""
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr ""
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr ""
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr ""
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr ""
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr ""
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr ""
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr ""
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr ""
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr ""
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr ""
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr ""
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr ""
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr ""
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+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"
+msgstr ""
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr ""
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr ""
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr ""
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr ""
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr ""
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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 ""
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr ""
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr ""
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr ""
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr ""
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr ""
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr ""
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr ""
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr ""
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr ""
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr ""
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr ""
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr ""
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr ""
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr ""
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr ""
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr ""
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr ""
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr ""
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr ""
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr ""
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr ""
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr ""
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr ""
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr ""
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr ""
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr ""
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr ""
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr ""
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr ""
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr ""
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr ""
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr ""
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr ""
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr ""
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr ""
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr ""
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr ""
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr ""
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr ""
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr ""
+
+#: tfprint.caption
+msgid "Print"
+msgstr ""
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr ""
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr ""
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr ""
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr ""
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr ""
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr ""
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr ""
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr ""
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr ""
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr ""
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr ""
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr ""
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr ""
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr ""
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr ""
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr ""
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr ""
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr ""
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+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 ""
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr ""
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr ""
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr ""
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr ""
+

+ 0 - 707
lazpaint/release/bin/i18n/lazpaint.pot

@@ -1,707 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-#: uresourcestrings.rsactioninprogress
-msgid "Action in progress"
-msgstr ""
-
-#: uresourcestrings.rsaddtoimagelist
-msgid "Add files to the image processing list"
-msgstr ""
-
-#: uresourcestrings.rsallapplications
-msgid "all"
-msgstr ""
-
-#: uresourcestrings.rsallsupportedfiletypes
-msgid "All supported filetypes"
-msgstr ""
-
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr ""
-
-#: uresourcestrings.rsanimatedgif
-msgid "Animated GIF"
-msgstr ""
-
-#: uresourcestrings.rsbackspaceremovelastpoint
-msgid "Press BACKSPACE to remove last point"
-msgstr ""
-
-#: uresourcestrings.rsbestquality
-msgid "Best quality"
-msgstr ""
-
-#: uresourcestrings.rsbitmap
-msgid "Bitmap"
-msgstr ""
-
-#: uresourcestrings.rsblendopnotusedforbackground
-msgid "The blend operation is applied only if there is a layer underneath"
-msgstr ""
-
-#: uresourcestrings.rsblue
-msgid "Blue"
-msgstr ""
-
-#: uresourcestrings.rsbrightness
-msgid "Brightness"
-msgstr ""
-
-#: uresourcestrings.rsbytes
-msgid "Bytes"
-msgstr ""
-
-#: uresourcestrings.rscancel
-msgid "Cancel"
-msgstr ""
-
-#: uresourcestrings.rscannotopenfile
-msgid "Cannot open file"
-msgstr ""
-
-#: uresourcestrings.rscanvassize
-msgid "Canvas size"
-msgstr ""
-
-#: uresourcestrings.rscdrom
-msgid "CD"
-msgstr ""
-
-#: uresourcestrings.rsclearpalette
-msgid "Clear palette"
-msgstr ""
-
-#: uresourcestrings.rscloserequest
-msgid "Close request"
-msgstr ""
-
-#: uresourcestrings.rscolors
-msgid "Colors"
-msgstr ""
-
-#: uresourcestrings.rsconfirmdeletefromcontainer
-msgid "Are you sure you want to delete this file from the container?"
-msgstr ""
-
-#: uresourcestrings.rsconfirmdeletemultiplefromcontainer
-msgid "Are you sure you want to delete these %1 files from the container?"
-msgstr ""
-
-#: uresourcestrings.rsconfirmmovemultipletotrash
-msgid "Are you sure you want to move these %1 files to the trash?"
-msgstr ""
-
-#: uresourcestrings.rsconfirmmovetotrash
-msgid "Are you sure you want to move this file to the trash?"
-msgstr ""
-
-#: uresourcestrings.rsconflictingactions
-msgid "Conflicting actions"
-msgstr ""
-
-#: uresourcestrings.rscontrast
-msgid "Contrast"
-msgstr ""
-
-#: uresourcestrings.rscorrectedhueccw
-msgid "Corr. Hue CCW"
-msgstr ""
-
-#: uresourcestrings.rscorrectedhuecw
-msgid "Corr. Hue CW"
-msgstr ""
-
-#: uresourcestrings.rscosine
-msgid "Cosine"
-msgstr ""
-
-#: uresourcestrings.rscrop
-msgid "Crop"
-msgstr ""
-
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr ""
-
-#: uresourcestrings.rscurvemodehint
-msgid "Press S or X to set the curve mode of the last point"
-msgstr ""
-
-#: uresourcestrings.rsdefaultpalette
-msgid "Default palette"
-msgstr ""
-
-#: uresourcestrings.rsdeletefile
-msgid "Delete"
-msgstr ""
-
-#: uresourcestrings.rsdeleteimageentry
-msgid "Delete selected image entry?"
-msgstr ""
-
-#: uresourcestrings.rsdirectorynotempty
-msgid "Directory is not empty"
-msgstr ""
-
-#: uresourcestrings.rsditherlayerusingpalette
-msgid "Dither layer using palette"
-msgstr ""
-
-#: uresourcestrings.rseditmask
-msgid "Edit mask"
-msgstr ""
-
-#: uresourcestrings.rseditselection
-msgid "Edit selection"
-msgstr ""
-
-#: uresourcestrings.rsedittexture
-msgid "Edit texture"
-msgstr ""
-
-#: uresourcestrings.rsemptylayer
-msgid "Layer is empty"
-msgstr ""
-
-#: uresourcestrings.rsemptyselection
-msgid "Selection is empty"
-msgstr ""
-
-#: uresourcestrings.rsenterfolderorcontainername
-msgid "Enter name for new folder or container (using RES or LRS extension):"
-msgstr ""
-
-#: uresourcestrings.rsenterlayername
-msgid "Enter layer name:"
-msgstr ""
-
-#: uresourcestrings.rsentries
-msgid "Entries"
-msgstr ""
-
-#: uresourcestrings.rserror
-msgid "Error"
-msgstr ""
-
-#: uresourcestrings.rserroronopeningfile
-msgid "Error on opening file \"%1\""
-msgstr ""
-
-#: uresourcestrings.rsexitrequest
-msgid "Exit request"
-msgstr ""
-
-#: uresourcestrings.rsexpect1parameter
-msgid "expects one parameter : "
-msgstr ""
-
-#: uresourcestrings.rsexpect2parameters
-msgid "expects two parameters : "
-msgstr ""
-
-#: uresourcestrings.rsexpectnparameters
-msgid "expects N parameters : "
-msgstr ""
-
-#: uresourcestrings.rsfast
-msgid "Fast"
-msgstr ""
-
-#: uresourcestrings.rsfilecannotbeempty
-msgid "File cannot be empty"
-msgstr ""
-
-#: uresourcestrings.rsfiledate
-msgid "Date"
-msgstr ""
-
-#: uresourcestrings.rsfileextensionnotsupported
-msgid "This file extension is not supported."
-msgstr ""
-
-#: uresourcestrings.rsfileformatnotrecognized
-msgid "The file format has not been recognized."
-msgstr ""
-
-#: uresourcestrings.rsfilename
-msgid "Filename"
-msgstr ""
-
-#: uresourcestrings.rsfilenotfound
-msgid "File not found!"
-msgstr ""
-
-#: uresourcestrings.rsfilenotsaved
-msgid "File not saved"
-msgstr ""
-
-#: uresourcestrings.rsfilesize
-msgid "Size"
-msgstr ""
-
-#: uresourcestrings.rsfilesystem
-msgid "File system"
-msgstr ""
-
-#: uresourcestrings.rsfiletype
-msgid "Type"
-msgstr ""
-
-#: uresourcestrings.rsfixeddrive
-msgid "Fixed"
-msgstr ""
-
-#: uresourcestrings.rsfolder
-msgid "Folder"
-msgstr ""
-
-#: uresourcestrings.rsfolderorcontaineralreadyexists
-msgid "Folder or container already exists."
-msgstr ""
-
-#: uresourcestrings.rsfollowingerrorsoccured
-msgid "Following errors occured:"
-msgstr ""
-
-#: uresourcestrings.rsframes
-msgid "Frames"
-msgstr ""
-
-#: uresourcestrings.rsfunctionnotdefined
-msgid "The function %1 is not defined."
-msgstr ""
-
-#: uresourcestrings.rsgreen
-msgid "Green"
-msgstr ""
-
-#: uresourcestrings.rshalfcosine
-msgid "Half-cosine"
-msgstr ""
-
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr ""
-
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr ""
-
-#: uresourcestrings.rshotspot
-msgid "Hot spot"
-msgstr ""
-
-#: uresourcestrings.rshue
-msgid "Hue"
-msgstr ""
-
-#: uresourcestrings.rshueccw
-msgid "Hue CCW"
-msgstr ""
-
-#: uresourcestrings.rshuecw
-msgid "Hue CW"
-msgstr ""
-
-#: uresourcestrings.rsiconimagealreadyexists
-msgid "There is already an image with this size and depth."
-msgstr ""
-
-#: uresourcestrings.rsiconorcursor
-msgid "Icon/cursor"
-msgstr ""
-
-#: uresourcestrings.rsimagetoobig
-msgid "Image is too big"
-msgstr ""
-
-#: uresourcestrings.rsinfinity
-msgid "Infinity"
-msgstr ""
-
-#: uresourcestrings.rsinformation
-msgid "Information"
-msgstr ""
-
-#: uresourcestrings.rsintensity
-msgid "Intensity"
-msgstr ""
-
-#: uresourcestrings.rsinternalerror
-msgid "Internal error"
-msgstr ""
-
-#: uresourcestrings.rsinvalidname
-msgid "Invalid name"
-msgstr ""
-
-#: uresourcestrings.rsinvalidopacity
-msgid "Invalid opacity : "
-msgstr ""
-
-#: uresourcestrings.rsinvalidresamplesize
-msgid "Invalid resample size : "
-msgstr ""
-
-#: uresourcestrings.rsinvalidsizefornew
-msgid "Invalid size for new : "
-msgstr ""
-
-#: uresourcestrings.rskeepchanges
-msgid "Do you want to keep changes?"
-msgstr ""
-
-#: uresourcestrings.rskeepemptyspace
-msgid "Keep empty space around opaque pixels?"
-msgstr ""
-
-#: uresourcestrings.rslanczos
-msgid "Lanczos %1"
-msgstr ""
-
-#: uresourcestrings.rslandscape
-msgid "Landscape"
-msgstr ""
-
-#: uresourcestrings.rslatestversion
-msgid "The latest version of LazPaint available online is"
-msgstr ""
-
-#: uresourcestrings.rslayeredimage
-msgid "Layered image"
-msgstr ""
-
-#: uresourcestrings.rslayers
-msgid "Layers"
-msgstr ""
-
-#: uresourcestrings.rslazpaint
-msgid "LazPaint"
-msgstr ""
-
-#: uresourcestrings.rslazpaintonly
-msgid "LazPaint only"
-msgstr ""
-
-#: uresourcestrings.rslight
-msgid "Light"
-msgstr ""
-
-#: uresourcestrings.rslightness
-msgid "Lightness"
-msgstr ""
-
-#: uresourcestrings.rslightposition
-msgid "Light position"
-msgstr ""
-
-#: uresourcestrings.rslinear
-msgid "Linear"
-msgstr ""
-
-#: uresourcestrings.rslinearrgb
-msgid "Linear RGB"
-msgstr ""
-
-#: uresourcestrings.rsloadandmergepalette
-msgid "Load and merge palette..."
-msgstr ""
-
-#: uresourcestrings.rsloading
-msgid "Loading"
-msgstr ""
-
-#: uresourcestrings.rsloadpalette
-msgid "Load palette..."
-msgstr ""
-
-#: uresourcestrings.rsloopcount
-msgid "Loop count"
-msgstr ""
-
-#: uresourcestrings.rsmakencolorspalettefrombitmap
-msgid "Make %1-colors palette from image"
-msgstr ""
-
-#: uresourcestrings.rsmergeselection
-msgid "Do you want to merge selection?"
-msgstr ""
-
-#: uresourcestrings.rsmitchell
-msgid "Mitchell"
-msgstr ""
-
-#: uresourcestrings.rsmorethanonefile
-msgid "You are trying to open more than one file. How would you like these files to be opened?"
-msgstr ""
-
-#: uresourcestrings.rsmovingorrotatingselection
-msgid "Moving or rotating selection"
-msgstr ""
-
-#: uresourcestrings.rsmustreleaseselection
-msgid "You must first release the selection"
-msgstr ""
-
-#: uresourcestrings.rsmustshowlayer
-msgid "You must first make the layer visible"
-msgstr ""
-
-#: uresourcestrings.rsnetworkdrive
-msgid "Network"
-msgstr ""
-
-#: uresourcestrings.rsnewimage
-msgid "New image"
-msgstr ""
-
-#: uresourcestrings.rsno
-msgid "No"
-msgstr ""
-
-#: uresourcestrings.rsnoactivelayer
-msgid "No active layer"
-msgstr ""
-
-#: uresourcestrings.rsnoactiveselection
-msgid "There is no active selection"
-msgstr ""
-
-#: uresourcestrings.rsnoandproceedtonext
-msgid "Do not save and open another file"
-msgstr ""
-
-#: uresourcestrings.rsnoname
-msgid "noname"
-msgstr ""
-
-#: uresourcestrings.rsnormalblendop
-msgid "Normal"
-msgstr ""
-
-#: uresourcestrings.rsnothingtobedeformed
-msgid "There is nothing to be deformed"
-msgstr ""
-
-#: uresourcestrings.rsnothingtoberetrieved
-msgid "There is nothing to be retrieved"
-msgstr ""
-
-#: uresourcestrings.rsnotreasonableformat
-msgid "It is not reasonable to save such a big image in this file format."
-msgstr ""
-
-#: uresourcestrings.rsnumber
-msgid "№"
-msgstr ""
-
-#: uresourcestrings.rsokay
-msgid "Okay"
-msgstr ""
-
-#: uresourcestrings.rsopacity
-msgid "Opacity"
-msgstr ""
-
-#: uresourcestrings.rsopen
-msgid "Open"
-msgstr ""
-
-#: uresourcestrings.rsopenfilesaslayers
-msgid "Open files as layers in a single image"
-msgstr ""
-
-#: uresourcestrings.rsopenfirstfileonly
-msgid "Open the first file only"
-msgstr ""
-
-#: uresourcestrings.rsopening
-msgid "Opening"
-msgstr ""
-
-#: uresourcestrings.rsopenmultipleimagefiles
-msgid "Open multiple image files"
-msgstr ""
-
-#: uresourcestrings.rsotherblendop
-msgid "Other..."
-msgstr ""
-
-#: uresourcestrings.rsoverwritefile
-msgid "File already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: uresourcestrings.rspaletteincludesalphachannel
-msgid "Palette includes alpha channel"
-msgstr ""
-
-#: uresourcestrings.rspaletteoptions
-msgid "Palette options"
-msgstr ""
-
-#: uresourcestrings.rspercent
-msgid "%"
-msgstr ""
-
-#: uresourcestrings.rsportait
-msgid "Portrait"
-msgstr ""
-
-#: uresourcestrings.rsposterizelayerusingpalette
-msgid "Posterize layer using palette"
-msgstr ""
-
-#: uresourcestrings.rspresetname
-msgid "Preset name"
-msgstr ""
-
-#: uresourcestrings.rspx
-msgid "px"
-msgstr ""
-
-#: uresourcestrings.rsramdisk
-msgid "RAM disk"
-msgstr ""
-
-#: uresourcestrings.rsrecentdirectories
-msgid "Recent directories:"
-msgstr ""
-
-#: uresourcestrings.rsred
-msgid "Red"
-msgstr ""
-
-#: uresourcestrings.rsreload
-msgid "Reload"
-msgstr ""
-
-#: uresourcestrings.rsreloadchanged
-msgid "Bitmap has been modified. Do you really want to reload?"
-msgstr ""
-
-#: uresourcestrings.rsremovabledrive
-msgid "Removable"
-msgstr ""
-
-#: uresourcestrings.rsrepeatimage
-msgid "Repeat image"
-msgstr ""
-
-#: uresourcestrings.rsretrieveselectedarea
-msgid "Do you want to retrieve selected area?"
-msgstr ""
-
-#: uresourcestrings.rsreturnvalides
-msgid "Press ENTER to validate"
-msgstr ""
-
-#: uresourcestrings.rsrgb
-msgid "RGB"
-msgstr ""
-
-#: uresourcestrings.rsrightclickforsource
-msgid "Use RIGHT click to define source"
-msgstr ""
-
-#: uresourcestrings.rssaturation
-msgid "Saturation"
-msgstr ""
-
-#: uresourcestrings.rssave
-msgid "Save"
-msgstr ""
-
-#: uresourcestrings.rssaveasbuttonhint
-msgid "Save with specified filename"
-msgstr ""
-
-#: uresourcestrings.rssavechanges
-msgid "Current bitmap has been modified. Do you want to save changes?"
-msgstr ""
-
-#: uresourcestrings.rssavepaletteas
-msgid "Save palette as..."
-msgstr ""
-
-#: uresourcestrings.rsscript
-msgid "Script"
-msgstr ""
-
-#: uresourcestrings.rsshowpalette
-msgid "Show palette"
-msgstr ""
-
-#: uresourcestrings.rssourceposition
-msgid "Source position"
-msgstr ""
-
-#: uresourcestrings.rsspline
-msgid "Spline"
-msgstr ""
-
-#: uresourcestrings.rsstoragedevice
-msgid "Device"
-msgstr ""
-
-#: uresourcestrings.rstexturemapping
-msgid "Texture mapping"
-msgstr ""
-
-#: uresourcestrings.rstherearenocheckeditems
-msgid "There are no checked items. Check some items or add some new ones."
-msgstr ""
-
-#: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
-msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
-msgstr ""
-
-#: uresourcestrings.rstodo
-msgid "To do"
-msgstr ""
-
-#: uresourcestrings.rstodoimages
-msgid "Images left: %1"
-msgstr ""
-
-#: uresourcestrings.rstooloninvisiblelayer
-msgid "Tool cannot be used on an invisible layer"
-msgstr ""
-
-#: uresourcestrings.rstoomanylayers
-msgid "Too many layers"
-msgstr ""
-
-#: uresourcestrings.rstotalimages
-msgid "Total images: %1"
-msgstr ""
-
-#: uresourcestrings.rstransferselectiontootherlayer
-msgid "Transfer selection to other layer?"
-msgstr ""
-
-#: uresourcestrings.rstransformselectioncontent
-msgid "Do you want to transform content of the selection?"
-msgstr ""
-
-#: uresourcestrings.rsunabletoapplyfilter
-msgid "Unable to apply filter : "
-msgstr ""
-
-#: uresourcestrings.rsunabletoloadfile
-msgid "Unable to load file : "
-msgstr ""
-
-#: uresourcestrings.rsunabletosavefile
-msgid "Unable to save file : "
-msgstr ""
-
-#: uresourcestrings.rsunknowncommand
-msgid "Unknown command : "
-msgstr ""
-
-#: uresourcestrings.rsyes
-msgid "Yes"
-msgstr ""
-

+ 1211 - 12
lazpaint/release/bin/i18n/lazpaint.pt_BR.po

@@ -1560,9 +1560,9 @@ msgstr "todos"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Pressione ALT ou SHIFT para alongar"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Pressione %1 ou %2 para alongar"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1677,9 +1677,9 @@ msgstr "Co-seno"
 msgid "Crop"
 msgid "Crop"
 msgstr "Cortar"
 msgstr "Cortar"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Segurar Ctrl para restringir o ângulo de rotação"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Segurar %1 para restringir o ângulo de rotação"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1706,6 +1706,10 @@ msgstr ""
 msgid "Dither layer using palette"
 msgid "Dither layer using palette"
 msgstr ""
 msgstr ""
 
 
+#: uresourcestrings.rsduplicateimage
+msgid "Duplicate image"
+msgstr "Duplicar imagem"
+
 #: uresourcestrings.rseditmask
 #: uresourcestrings.rseditmask
 msgid "Edit mask"
 msgid "Edit mask"
 msgstr "Editar máscara"
 msgstr "Editar máscara"
@@ -1842,13 +1846,13 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Meio-cosseno"
 msgstr "Meio-cosseno"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Segurar CTRL para tirar pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Segurar %1 para tirar pixels"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Segurar SHIFT para desenhar um quadrado ou um círculo"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Segurar %1 para desenhar um quadrado ou um círculo"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2311,3 +2315,1198 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Doar..."
+
+#: tfabout.caption
+msgctxt "TFABOUT.CAPTION"
+msgid "About"
+msgstr "Sobre"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr ""
+
+#: tfabout.label_authors.caption
+msgctxt "TFABOUT.LABEL_AUTHORS.CAPTION"
+msgid "Authors:"
+msgstr "Autores:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "TFABOUT.LABEL_AUTHORSVALUE.CAPTION"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, ajuda por FabienWang e Lainz"
+
+#: tfabout.label_homepage.caption
+msgctxt "TFABOUT.LABEL_HOMEPAGE.CAPTION"
+msgid "Homepage:"
+msgstr "Página Inicial:"
+
+#: tfabout.label_libraries.caption
+msgctxt "TFABOUT.LABEL_LIBRARIES.CAPTION"
+msgid "Libraries used:"
+msgstr "Bibliotecas usadas:"
+
+#: tfabout.label_licence.caption
+msgctxt "TFABOUT.LABEL_LICENCE.CAPTION"
+msgid "Licence:"
+msgstr "Licença:"
+
+#: tfabout.label_opensource.caption
+msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION"
+msgid "Open source (GPLv3)"
+msgstr ""
+
+#: 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 ""
+
+#: tfadjustcurves.caption
+msgid "Adjust curves"
+msgstr "Ajustar curvas"
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr "Descartar curva atual e iniciar uma nova"
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr "Posterizar"
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr "Remover ponto selecionado (Del)"
+
+#: tfblendop.button_cancel.caption
+msgctxt "TFBLENDOP.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfblendop.button_ok.caption
+msgctxt "TFBLENDOP.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "operação de mesclagem"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "TFBLENDOP.LABEL_BLENDOPCATEGORY.CAPTION"
+msgid "Category of blend operation"
+msgstr "Categoria de operação de mesclagem"
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr ""
+
+#: tfblendop.label_kritaover.caption
+msgctxt "TFBLENDOP.LABEL_KRITAOVER.CAPTION"
+msgid "Krita"
+msgstr ""
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr "Mesclar operações que estão disponíveis em Krita"
+
+#: tfblendop.label_otherover.caption
+msgctxt "TFBLENDOP.LABEL_OTHEROVER.CAPTION"
+msgid "Other"
+msgstr "Outro"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr "Operações de mesclagem de LazPaint e Paint.NET"
+
+#: tfblendop.label_patternover.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNOVER.CAPTION"
+msgid "Pattern over"
+msgstr "Padrão sobre"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr "Pré-operação de mesclagem com a imagem especificada no topo"
+
+#: tfblendop.label_patternunder.caption
+msgctxt "TFBLENDOP.LABEL_PATTERNUNDER.CAPTION"
+msgid "Pattern under"
+msgstr "Padrão sob"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr "Pré-operação de mesclagem com a imagem especificada por baixo"
+
+#: tfblendop.label_previewwith.caption
+msgctxt "TFBLENDOP.LABEL_PREVIEWWITH.CAPTION"
+msgid "Preview with"
+msgstr "Pré-visualização com"
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Operação de mesclagem selecionada :"
+
+#: tfblendop.label_svgover.caption
+msgctxt "TFBLENDOP.LABEL_SVGOVER.CAPTION"
+msgid "Basic SVG"
+msgstr "SVG Básico"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr "Operações de mesclagem básicas que estão disponíveis em praticamente todos os editores de imagem"
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr "Navegue nas imagens"
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr ""
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr "Ir para um diretório acima"
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr "Mostrar ícones grandes"
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr "Mostrar detalhes e pré-visualização"
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfcanvassize.caption
+msgctxt "TFCANVASSIZE.CAPTION"
+msgid "Canvas size"
+msgstr "Tamanho da Tela da Imagem"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "modo de inversão"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "TFCANVASSIZE.LABEL_ANCHOR.CAPTION"
+msgid "Anchor :"
+msgstr "Âncora :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "TFCANVASSIZE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Altura :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "TFCANVASSIZE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Largura :"
+
+#: 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 ""
+
+#: tfcolorintensity.caption
+msgctxt "TFCOLORINTENSITY.CAPTION"
+msgid "Intensity"
+msgstr "Intensidade"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "TFCOLORINTENSITY.LABEL_MULTIPLY.CAPTION"
+msgid "Multiply"
+msgstr "Multiplicar"
+
+#: tfcolorintensity.label_shift.caption
+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 ""
+
+#: tfcolorize.caption
+msgctxt "TFCOLORIZE.CAPTION"
+msgid "Colorize"
+msgstr "Colorir"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "TFCOLORIZE.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr "Corrigida a tonalidade e luminosidade"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "TFCOLORIZE.LABEL_COLORNESS.CAPTION"
+msgid "Colorness"
+msgstr "Saturação"
+
+#: tfcolorize.label_hue.caption
+msgctxt "TFCOLORIZE.LABEL_HUE.CAPTION"
+msgid "Hue"
+msgstr "Tonalidade"
+
+#: tfcolorize.label_preset.caption
+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..."
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr "Abrir máscara..."
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfcustomblur.caption
+msgctxt "TFCUSTOMBLUR.CAPTION"
+msgid "Custom blur"
+msgstr "Desfoque personalizado"
+
+#: tfcustomblur.openpicturedialog1.title
+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 ""
+
+#: tfemboss.caption
+msgctxt "TFEMBOSS.CAPTION"
+msgid "Emboss"
+msgstr "Realçar"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 ""
+
+#: tffilterfunction.caption
+msgid "Apply function"
+msgstr "Aplicar função"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "TFFILTERFUNCTION.CHECKBOX_GSBA.CAPTION"
+msgid "Corrected hue and lightness"
+msgstr "Corrigida a tonalidade e luminosidade"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Variáveis :"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr ""
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr ""
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr ""
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr ""
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr ""
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr ""
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr ""
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr ""
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr ""
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr ""
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr ""
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr ""
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr ""
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr ""
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr "Carregando..."
+
+#: 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 ""
+
+#: tfmotionblur.caption
+msgctxt "TFMOTIONBLUR.CAPTION"
+msgid "Motion blur"
+msgstr "Borrão de movimento"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Orientado"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "TFMOTIONBLUR.LABEL_DISTANCE.CAPTION"
+msgid "Distance :"
+msgstr "Distância:"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "TFMULTIIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "TFMULTIIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr "Escolher imagem"
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfnewimage.caption
+msgctxt "TFNEWIMAGE.CAPTION"
+msgid "New image"
+msgstr "Nova imagem"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "TFNEWIMAGE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Altura :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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
+msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfnoisefilter.caption
+msgid "Noise filter"
+msgstr "Filtro de ruído"
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr "Opacidade:"
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr "Ruído em tons de cinza"
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr "Ruído em RGB"
+
+#: tfobject3d.button_cancel.caption
+msgctxt "TFOBJECT3D.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr "Textura..."
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "TFOBJECT3D.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "Objeto 3D"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Suavização"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "Superfície dupla face"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Interpolação da textura"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "TFOBJECT3D.GROUPBOX_SELECTEDMATERIAL.CAPTION"
+msgid "Selected material"
+msgstr "Material selecionado"
+
+#: tfobject3d.label_color.caption
+msgctxt "TFOBJECT3D.LABEL_COLOR.CAPTION"
+msgid "Color :"
+msgstr "Cor :"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Cor :"
+
+#: tfobject3d.label_height.caption
+msgctxt "TFOBJECT3D.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Altura :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "TFOBJECT3D.LABEL_LIGHTINGNORMALS.CAPTION"
+msgid "Lighting normals :"
+msgstr "Normais de iluminação :"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "TFOBJECT3D.LABEL_MATERIALS.CAPTION"
+msgid "Materials :"
+msgstr "Materiais :"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "TFOBJECT3D.LABEL_OPACITY.CAPTION"
+msgid "Opacity :"
+msgstr "Opacidade :"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "TFOBJECT3D.LABEL_SPECULARINDEX.CAPTION"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "TFOBJECT3D.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Largura :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "TFOBJECT3D.LABEL_ZOOM.CAPTION"
+msgid "Zoom"
+msgstr ""
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Materiais"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "TFOBJECT3D.OPENTEXTUREDIALOG.TITLE"
+msgid "Open texture"
+msgstr "Abrir textura"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Renderização"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+msgid "Remove selected light"
+msgstr ""
+
+#: 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 ""
+
+#: tfphongfilter.caption
+msgctxt "TFPHONGFILTER.CAPTION"
+msgid "Shaded map"
+msgstr "Mapa sombreado"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "TFPHONGFILTER.GROUPBOX_COLOR.CAPTION"
+msgid "Color"
+msgstr "Cor"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Altura do mapa"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Altura global :"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Posição de luz :"
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr ""
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr ""
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr ""
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPLIGHTNESS.CAPTION"
+msgid "Lightness"
+msgstr "Luminosidade"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Luminosidade linear"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr ""
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "TFPHONGFILTER.RADIO_MAPSATURATION.CAPTION"
+msgid "Saturation"
+msgstr "Saturação"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Cor de fundo"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Manter"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "cor da caneta"
+
+#: tfphongfilter.radio_usetexture.caption
+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
+msgctxt "TFPIXELATE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfpixelate.caption
+msgctxt "TFPIXELATE.CAPTION"
+msgid "Pixelate"
+msgstr "Pixelizar"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "TFPIXELATE.LABEL_PIXELSIZE.CAPTION"
+msgid "Pixel size :"
+msgstr "Tamanho do pixel :"
+
+#: tfpixelate.label_quality.caption
+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
+msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfposterize.caption
+msgctxt "TFPOSTERIZE.CAPTION"
+msgid "Posterize"
+msgstr "Posterizar"
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr "Por luminosidade"
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr "Níveis :"
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr "Configurar..."
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr "Imprimir!"
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Ajuste de zoom"
+
+#: tfprint.caption
+msgid "Print"
+msgstr "Imprimir"
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "TFPRINT.CHECKBOX_RATIO.CAPTION"
+msgid "Keep aspect ratio"
+msgstr "Manter a proporção"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr "Tamanho da imagem"
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr "Margens"
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr "Botão:"
+
+#: tfprint.label_dpix.caption
+msgctxt "TFPRINT.LABEL_DPIX.CAPTION"
+msgid "."
+msgstr ""
+
+#: tfprint.label_dpiy.caption
+msgctxt "TFPRINT.LABEL_DPIY.CAPTION"
+msgid "."
+msgstr ""
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr "Altura:"
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr "Esquerda:"
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr "Orientação:"
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr "Impressora e papel:"
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr "Direita:"
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr "Acima:"
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr "Largura:"
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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 ""
+
+#: tfradialblur.caption
+msgctxt "TFRADIALBLUR.CAPTION"
+msgid "Radial blur"
+msgstr "Desfoque radial"
+
+#: tfradialblur.label_radius.caption
+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
+msgctxt "tfrain.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfrain.caption
+msgid "Rain"
+msgstr ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfresample.caption
+msgctxt "TFRESAMPLE.CAPTION"
+msgid "Resample"
+msgstr "Reamostrar"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Manter a proporção"
+
+#: tfresample.label_height.caption
+msgctxt "TFRESAMPLE.LABEL_HEIGHT.CAPTION"
+msgid "Height :"
+msgstr "Altura :"
+
+#: tfresample.label_quality.caption
+msgctxt "TFRESAMPLE.LABEL_QUALITY.CAPTION"
+msgid "Quality :"
+msgstr "Qualidade :"
+
+#: tfresample.label_width.caption
+msgctxt "TFRESAMPLE.LABEL_WIDTH.CAPTION"
+msgid "Width :"
+msgstr "Largura :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr ""
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Salvar"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+msgid "MioMap"
+msgstr ""
+
+#: 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 ""
+
+#: tfsharpen.caption
+msgid "Sharpen/Smooth"
+msgstr "Nitidez/Suave"
+
+#: tfsharpen.label_amount.caption
+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
+msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr ""
+
+#: tfshiftcolors.caption
+msgctxt "TFSHIFTCOLORS.CAPTION"
+msgid "Shift colors"
+msgstr "Mudar as cores"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Correção de tonalidade e luminosidade"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Tonalidade"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Saturação"
+
+#: tftoolbox.caption
+msgctxt "TFTOOLBOX.CAPTION"
+msgid "Tools"
+msgstr "Ferramentas"
+

+ 1202 - 12
lazpaint/release/bin/i18n/lazpaint.ru.po

@@ -1556,9 +1556,9 @@ msgstr "все"
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
-msgstr "Удерживайте ALT или SHIFT для масштабирования"
+#: uresourcestrings.rsohldkeysscalemode
+msgid "Hold %1 or %2 to scale"
+msgstr "Удерживайте %1 или %2 для масштабирования"
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
 msgid "Animated GIF"
 msgid "Animated GIF"
@@ -1673,9 +1673,9 @@ msgstr "Косинус"
 msgid "Crop"
 msgid "Crop"
 msgstr "Обрезать"
 msgstr "Обрезать"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
-msgstr "Удерживайте CTRL для ограничения угла поворота"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
+msgstr "Удерживайте %1 для ограничения угла поворота"
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
 msgid "Press S or X to set the curve mode of the last point"
@@ -1838,13 +1838,13 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Полу-косинус"
 msgstr "Полу-косинус"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
-msgstr "Удерживайте CTRL для привязки к пикселям"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
+msgstr "Удерживайте %1 для привязки к пикселям"
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
-msgstr "Удерживайте SHIFT для рисования квадрата или круга"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
+msgstr "Удерживайте %1 для рисования квадрата или круга"
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
 msgctxt "uresourcestrings.rshotspot"
 msgctxt "uresourcestrings.rshotspot"
@@ -2307,3 +2307,1193 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Пожертвования ..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "О программе"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Авторы:"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, FabienWang и Lainz"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Сайт:"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Библиотеки:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Лицензия:"
+
+#: tfabout.label_opensource.caption
+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 ""
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr ""
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "ОК"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr "Операции наложения"
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr "."
+
+#: tfblendop.label_kritaover.caption
+msgid "Krita"
+msgstr "Krita"
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr ""
+
+#: tfblendop.label_otherover.caption
+msgid "Other"
+msgstr "Другое"
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr ""
+
+#: tfblendop.label_patternover.caption
+msgid "Pattern over"
+msgstr "Узор над"
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr ""
+
+#: tfblendop.label_patternunder.caption
+msgid "Pattern under"
+msgstr "Узор под"
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr ""
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr ""
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr "Выбранная операц. налож.:"
+
+#: tfblendop.label_svgover.caption
+msgid "Basic SVG"
+msgstr "Базов. SVG"
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr ""
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr ""
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr "."
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr ""
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "ОК"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Размер холста"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Режим отражения"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Привязка:"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Высота:"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+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"
+msgstr "Интенсивность"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Умножить"
+
+#: tfcolorintensity.label_shift.caption
+msgctxt "tfcolorintensity.label_shift.caption"
+msgid "Shift"
+msgstr "Shift"
+
+#: 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"
+msgstr "Раскрасить"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Исправить оттенок и освещение"
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Цветность"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Оттенок"
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr ""
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr "Редактировать маску ..."
+
+#: tfcustomblur.button_loadmask.caption
+msgid "Load mask..."
+msgstr "Загрузить маску ..."
+
+#: tfcustomblur.button_ok.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "ОК"
+
+#: tfcustomblur.caption
+msgctxt "tfcustomblur.caption"
+msgid "Custom blur"
+msgstr "Пользовательское размытие"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "Тиснение"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 "Применить функц"
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Исправить оттенок и освещение"
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr "."
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr "Переменные :"
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr "HSL"
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr "RGB"
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "ОК"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr ""
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr ""
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr ""
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr ""
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr ""
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr ""
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr ""
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr ""
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr ""
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr ""
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr ""
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr ""
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+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"
+msgstr "Размытие в движении"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Ориентированный"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Расстояние:"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "ОК"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr ""
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "ОК"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Новое изображение"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Высота:"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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 ""
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr ""
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr ""
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr ""
+
+#: tfobject3d.button_cancel.caption
+msgctxt "TFOBJECT3D.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr ""
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "TFOBJECT3D.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "ОК"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr "3D-объект"
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr "Сглаживание"
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr "Двухсторонние грани"
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr "Текстурная интерполяция"
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr "Выбор материала"
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr "Цвет:"
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr "Цвет:"
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Высота:"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr "Освещение нормалей:"
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr "Материалы:"
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr "Непрозрачность:"
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr "Специальный индекс:"
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Ширина:"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr "Увеличить"
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr "Материалы"
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Открыть текстуру"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr "Визуализация"
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+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"
+msgstr "Затененная карта"
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Цвет"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr "Карта высот"
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr "Глобальная высота:"
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr "Позиция света: "
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr "Alpha"
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr "B"
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr "G"
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Освещение"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr "Линейное освещение"
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr "R"
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Насыщенность"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr "Цвет фона"
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr "Придержать"
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr "Цвет пера"
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "Растрировать"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Размер пикселя:"
+
+#: tfpixelate.label_quality.caption
+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"
+msgstr ""
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr ""
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr ""
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr ""
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr ""
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Увеличить, полностью вписав"
+
+#: tfprint.caption
+msgid "Print"
+msgstr ""
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Сохранять пропорции"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr ""
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr ""
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr ""
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr "."
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr ""
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr ""
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr ""
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr ""
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr ""
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr ""
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr ""
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Радиальное размытие"
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "ОК"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Ресэмпл"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Сохранять пропорции"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Высота:"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Качество:"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Ширина:"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Отменить"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "ОК"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Сохранить"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+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 "Заострить/Сгладить"
+
+#: tfsharpen.label_amount.caption
+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"
+msgstr "Сдвиг цвета"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr "Исправить оттенок и освещение"
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Оттенок"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Насыщенность"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Инструменты"
+

+ 1203 - 8
lazpaint/release/bin/i18n/lazpaint.sv.po

@@ -1542,8 +1542,8 @@ msgstr ""
 msgid "All supported filetypes"
 msgid "All supported filetypes"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsaltshiftscalemode
-msgid "Hold ALT or SHIFT to scale"
+#: uresourcestrings.rsholdkeysscalemode
+msgid "Hold %1 or %2 to scale"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rsanimatedgif
 #: uresourcestrings.rsanimatedgif
@@ -1659,8 +1659,8 @@ msgstr "Cosine"
 msgid "Crop"
 msgid "Crop"
 msgstr "Beskär"
 msgstr "Beskär"
 
 
-#: uresourcestrings.rsctrlrestrictrotation
-msgid "Hold CTRL to restrict rotation angle"
+#: uresourcestrings.rsholdkeyrestrictrotation
+msgid "Hold %1 to restrict rotation angle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rscurvemodehint
 #: uresourcestrings.rscurvemodehint
@@ -1824,12 +1824,12 @@ msgstr ""
 msgid "Half-cosine"
 msgid "Half-cosine"
 msgstr "Halv-cosine"
 msgstr "Halv-cosine"
 
 
-#: uresourcestrings.rsholdctrlsnaptopixel
-msgid "Hold CTRL to snap to pixels"
+#: uresourcestrings.rsholdkeysnaptopixel
+msgid "Hold %1 to snap to pixels"
 msgstr ""
 msgstr ""
 
 
-#: uresourcestrings.rsholdshiftforsquare
-msgid "Hold SHIFT to draw a square or a circle"
+#: uresourcestrings.rsholdkeyforsquare
+msgid "Hold %1 to draw a square or a circle"
 msgstr ""
 msgstr ""
 
 
 #: uresourcestrings.rshotspot
 #: uresourcestrings.rshotspot
@@ -2293,3 +2293,1198 @@ msgstr ""
 msgid "Yes"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
+#: tablet.getprocfailed
+msgid "Procedure %s failed to load properly."
+msgstr ""
+
+#: tablet.openfailed
+msgid "Tablet context failed to open."
+msgstr ""
+
+#: tfabout.button_donate.caption
+msgctxt "tfabout.button_donate.caption"
+msgid "Donate..."
+msgstr "Donera..."
+
+#: tfabout.caption
+msgctxt "tfabout.caption"
+msgid "About"
+msgstr "Om"
+
+#: tfabout.labelurl.caption
+msgid "http://sourceforge.net/projects/lazpaint/"
+msgstr "http://sourceforge.net/projects/lazpaint/"
+
+#: tfabout.label_authors.caption
+msgctxt "tfabout.label_authors.caption"
+msgid "Authors:"
+msgstr "Upphovsman"
+
+#: tfabout.label_authorsvalue.caption
+msgctxt "tfabout.label_authorsvalue.caption"
+msgid "Circular helped by FabienWang, Lainz and others"
+msgstr "Circular, FabienWang och Lainz"
+
+#: tfabout.label_homepage.caption
+msgctxt "tfabout.label_homepage.caption"
+msgid "Homepage:"
+msgstr "Hemsidan"
+
+#: tfabout.label_libraries.caption
+msgctxt "tfabout.label_libraries.caption"
+msgid "Libraries used:"
+msgstr "Använda bibliotek:"
+
+#: tfabout.label_licence.caption
+msgctxt "tfabout.label_licence.caption"
+msgid "Licence:"
+msgstr "Licens:"
+
+#: tfabout.label_opensource.caption
+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 ""
+
+#: tfadjustcurves.toolbutton_newcurve.hint
+msgid "Discard current curve and start a new one"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_posterize.hint
+msgctxt "tfadjustcurves.toolbutton_posterize.hint"
+msgid "Posterize"
+msgstr ""
+
+#: tfadjustcurves.toolbutton_removepoint.hint
+msgid "Remove selected point (Del)"
+msgstr ""
+
+#: tfblendop.button_cancel.caption
+msgctxt "tfblendop.button_cancel.caption"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfblendop.button_ok.caption
+msgctxt "tfblendop.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfblendop.caption
+msgid "Blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopcategory.caption
+msgctxt "tfblendop.label_blendopcategory.caption"
+msgid "Category of blend operation"
+msgstr ""
+
+#: tfblendop.label_blendopvalue.caption
+msgctxt "tfblendop.label_blendopvalue.caption"
+msgid "."
+msgstr ""
+
+#: tfblendop.label_kritaover.caption
+msgctxt "tfblendop.label_kritaover.caption"
+msgid "Krita"
+msgstr ""
+
+#: tfblendop.label_kritaover.hint
+msgid "Blend operations that are available in Krita"
+msgstr ""
+
+#: tfblendop.label_otherover.caption
+msgctxt "tfblendop.label_otherover.caption"
+msgid "Other"
+msgstr ""
+
+#: tfblendop.label_otherover.hint
+msgid "Blend operations of LazPaint and Paint.NET"
+msgstr ""
+
+#: tfblendop.label_patternover.caption
+msgctxt "tfblendop.label_patternover.caption"
+msgid "Pattern over"
+msgstr ""
+
+#: tfblendop.label_patternover.hint
+msgid "Preview blend operation with the specified image on top"
+msgstr ""
+
+#: tfblendop.label_patternunder.caption
+msgctxt "tfblendop.label_patternunder.caption"
+msgid "Pattern under"
+msgstr ""
+
+#: tfblendop.label_patternunder.hint
+msgid "Preview blend operation with the specified image underneath"
+msgstr ""
+
+#: tfblendop.label_previewwith.caption
+msgctxt "tfblendop.label_previewwith.caption"
+msgid "Preview with"
+msgstr ""
+
+#: tfblendop.label_selectedblendop.caption
+msgid "Selected blend operation :"
+msgstr ""
+
+#: tfblendop.label_svgover.caption
+msgctxt "tfblendop.label_svgover.caption"
+msgid "Basic SVG"
+msgstr ""
+
+#: tfblendop.label_svgover.hint
+msgid "Basic blend operations that are available in virtually all image editors"
+msgstr ""
+
+#: tfbrowseimages.caption
+msgid "Browse images"
+msgstr ""
+
+#: tfbrowseimages.checkbox_usedirectoryonstartup.caption
+msgid "Use this directory on startup"
+msgstr ""
+
+#: tfbrowseimages.label_status.caption
+msgctxt "tfbrowseimages.label_status.caption"
+msgid "."
+msgstr ""
+
+#: tfbrowseimages.toolbutton_createfolderorcontainer.hint
+msgid "Create folder or container"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_goup.hint
+msgid "Go one directory up"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_openselectedfiles.hint
+msgid "Open selected files"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewbigicon.hint
+msgctxt "tfbrowseimages.toolbutton_viewbigicon.hint"
+msgid "Show big icons"
+msgstr ""
+
+#: tfbrowseimages.toolbutton_viewdetails.hint
+msgctxt "tfbrowseimages.toolbutton_viewdetails.hint"
+msgid "Show details and preview"
+msgstr ""
+
+#: tfbrowseimages.tool_selectdrive.hint
+msgid "Select drive"
+msgstr ""
+
+#: tfcanvassize.button_cancel.caption
+msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfcanvassize.button_ok.caption
+msgctxt "TFCANVASSIZE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfcanvassize.caption
+msgctxt "tfcanvassize.caption"
+msgid "Canvas size"
+msgstr "Storlek på rityta"
+
+#: tfcanvassize.checkbox_flipmode.caption
+msgid "Flip mode"
+msgstr "Vändläge"
+
+#: tfcanvassize.label_anchor.caption
+msgctxt "tfcanvassize.label_anchor.caption"
+msgid "Anchor :"
+msgstr "Ankare :"
+
+#: tfcanvassize.label_height.caption
+msgctxt "tfcanvassize.label_height.caption"
+msgid "Height :"
+msgstr "Höjd :"
+
+#: tfcanvassize.label_width.caption
+msgctxt "tfcanvassize.label_width.caption"
+msgid "Width :"
+msgstr "Bredd :"
+
+#: 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"
+msgstr "Intensitet"
+
+#: tfcolorintensity.label_multiply.caption
+msgctxt "tfcolorintensity.label_multiply.caption"
+msgid "Multiply"
+msgstr "Multiplicera"
+
+#: tfcolorintensity.label_shift.caption
+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"
+msgstr "Färgsätt"
+
+#: tfcolorize.checkbox_gsba.caption
+msgctxt "tfcolorize.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfcolorize.label_colorness.caption
+msgctxt "tfcolorize.label_colorness.caption"
+msgid "Colorness"
+msgstr "Intensitet"
+
+#: tfcolorize.label_hue.caption
+msgctxt "tfcolorize.label_hue.caption"
+msgid "Hue"
+msgstr "Ton"
+
+#: tfcolorize.label_preset.caption
+msgid "Preset"
+msgstr ""
+
+#: tfcustomblur.button_cancel.caption
+msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfcustomblur.button_editmask.caption
+msgid "Edit mask..."
+msgstr "Redigera mask..."
+
+#: tfcustomblur.button_loadmask.caption
+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"
+msgstr "Egen oskärpa"
+
+#: tfcustomblur.openpicturedialog1.title
+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"
+msgstr "Ciselera"
+
+#: tfemboss.checkbox_preservecolors.caption
+msgid "Preserve colors"
+msgstr ""
+
+#: tfemboss.checkbox_transparent.caption
+msgid "Transparent"
+msgstr ""
+
+#: tfemboss.label_direction.caption
+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 ""
+
+#: tffilterfunction.checkbox_gsba.caption
+msgctxt "tffilterfunction.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tffilterfunction.label_alphaequals.caption
+msgctxt "tffilterfunction.label_alphaequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_blueequals.caption
+msgctxt "tffilterfunction.label_blueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_greenequals.caption
+msgctxt "tffilterfunction.label_greenequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_hueequals.caption
+msgctxt "tffilterfunction.label_hueequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_lightnessequals.caption
+msgctxt "tffilterfunction.label_lightnessequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_redequals.caption
+msgctxt "tffilterfunction.label_redequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_saturationequals.caption
+msgctxt "tffilterfunction.label_saturationequals.caption"
+msgid "."
+msgstr ""
+
+#: tffilterfunction.label_variables.caption
+msgid "Variables :"
+msgstr ""
+
+#: tffilterfunction.tabsheet_hsl.caption
+msgid "HSL"
+msgstr ""
+
+#: tffilterfunction.tabsheet_rgb.caption
+msgctxt "tffilterfunction.tabsheet_rgb.caption"
+msgid "RGB"
+msgstr ""
+
+#: tfgeometricbrush.button_cancel.caption
+msgctxt "tfgeometricbrush.button_cancel.caption"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfgeometricbrush.button_ok.caption
+msgctxt "tfgeometricbrush.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfgeometricbrush.caption
+msgid "Geometric brush"
+msgstr ""
+
+#: tfgeometricbrush.checkbox_isgradient.caption
+msgid "Opacity gradient"
+msgstr ""
+
+#: tfgeometricbrush.label1.caption
+msgid "Number of sides:"
+msgstr ""
+
+#: tfimagelist.caption
+msgid "Image List"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonopen.caption
+msgid "Autouncheck files after being open"
+msgstr ""
+
+#: tfimagelist.pmautouncheckonsave.caption
+msgid "Autouncheck files after being edited and saved"
+msgstr ""
+
+#: tfimagelist.pmremoveall.caption
+msgid "Empty image list"
+msgstr ""
+
+#: tfimagelist.pmremovenonexisting.caption
+msgid "Remove nonexisting images"
+msgstr ""
+
+#: tfimagelist.pmremoveunchecked.caption
+msgid "Remove unchecked images"
+msgstr ""
+
+#: tfimagelist.pmunchecknonexisting.caption
+msgid "Uncheck nonexisting files"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[0].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[1].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[2].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.stringgrid1.columns[3].title.caption
+msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
+msgid "-"
+msgstr ""
+
+#: tfimagelist.tbaddfiles.hint
+msgid "Add images to list"
+msgstr ""
+
+#: tfimagelist.tbautouncheck.hint
+msgid "Enable/disable autounchecking for processed files"
+msgstr ""
+
+#: tfimagelist.tbautozoomfit.hint
+msgid "Enable/disable autofitting images in the LazPaint window"
+msgstr ""
+
+#: tfimagelist.tbcheckall.hint
+msgid "Check all files for processing"
+msgstr ""
+
+#: tfimagelist.tbminiwindow.hint
+msgid "Switch to miniwindow"
+msgstr ""
+
+#: tfimagelist.tbmovedown.hint
+msgid "Move selected items down"
+msgstr ""
+
+#: tfimagelist.tbmoveup.hint
+msgid "Move selected items up"
+msgstr ""
+
+#: tfimagelist.tbnormalwindows.hint
+msgid "Switch to normal window"
+msgstr ""
+
+#: tfimagelist.tbopenimage.hint
+msgid "Open current image"
+msgstr ""
+
+#: tfimagelist.tbopennext.hint
+msgctxt "tfimagelist.tbopennext.hint"
+msgid "Open next image (Alt-Right)"
+msgstr ""
+
+#: tfimagelist.tbopennextsw.hint
+msgctxt "tfimagelist.tbopennextsw.hint"
+msgid "Open next image"
+msgstr ""
+
+#: tfimagelist.tbopenprev.hint
+msgctxt "tfimagelist.tbopenprev.hint"
+msgid "Open previous image (Alt-Left)"
+msgstr ""
+
+#: tfimagelist.tbopenprevsw.hint
+msgctxt "tfimagelist.tbopenprevsw.hint"
+msgid "Open previous image"
+msgstr ""
+
+#: tfimagelist.tbremoveitem.hint
+msgid "Remove selected images from list"
+msgstr ""
+
+#: tfimagelist.tbuncheckall.hint
+msgid "Uncheck all files for processing"
+msgstr ""
+
+#: tfloading.caption
+msgctxt "tfloading.caption"
+msgid "Loading..."
+msgstr ""
+
+#: 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"
+msgstr "Rörelseoskärpa"
+
+#: tfmotionblur.checkbox_oriented.caption
+msgid "Oriented"
+msgstr "Orientering"
+
+#: tfmotionblur.label_distance.caption
+msgctxt "tfmotionblur.label_distance.caption"
+msgid "Distance :"
+msgstr "Avstånd :"
+
+#: tfmultiimage.button_cancel.caption
+msgctxt "tfmultiimage.button_cancel.caption"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfmultiimage.button_ok.caption
+msgctxt "tfmultiimage.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfmultiimage.caption
+msgid "Choose image"
+msgstr ""
+
+#: tfnewimage.button_cancel.caption
+msgctxt "TFNEWIMAGE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfnewimage.button_ok.caption
+msgctxt "TFNEWIMAGE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfnewimage.caption
+msgctxt "tfnewimage.caption"
+msgid "New image"
+msgstr "Ny bild"
+
+#: tfnewimage.combobox_bitdepth.text
+msgid "32"
+msgstr ""
+
+#: tfnewimage.label_bitdepth.caption
+msgid "Bit depth :"
+msgstr ""
+
+#: tfnewimage.label_height.caption
+msgctxt "tfnewimage.label_height.caption"
+msgid "Height :"
+msgstr "Höjd :"
+
+#: tfnewimage.label_height1.caption
+msgid "Ratio :"
+msgstr ""
+
+#: tfnewimage.label_memoryrequired.caption
+msgid "Memory required :"
+msgstr ""
+
+#: tfnewimage.label_width.caption
+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 ""
+
+#: tfnoisefilter.label_opacity.caption
+msgid "Opacity:"
+msgstr ""
+
+#: tfnoisefilter.radio_grayscalenoise.caption
+msgid "Grayscale noise"
+msgstr ""
+
+#: tfnoisefilter.radio_rgbnoise.caption
+msgid "RGB noise"
+msgstr ""
+
+#: tfobject3d.button_cancel.caption
+msgctxt "tfobject3d.button_cancel.caption"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfobject3d.button_loadtex.caption
+msgid "Texture..."
+msgstr ""
+
+#: tfobject3d.button_notex.caption
+msgid "No tex."
+msgstr ""
+
+#: tfobject3d.button_ok.caption
+msgctxt "tfobject3d.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfobject3d.caption
+msgid "3D object"
+msgstr ""
+
+#: tfobject3d.checkbox_antialiasing.caption
+msgid "Antialiasing"
+msgstr ""
+
+#: tfobject3d.checkbox_biface.caption
+msgid "2-sided faces"
+msgstr ""
+
+#: tfobject3d.checkbox_textureinterp.caption
+msgid "Texture interpolation"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedlight.caption
+msgid "Selected light"
+msgstr ""
+
+#: tfobject3d.groupbox_selectedmaterial.caption
+msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
+msgid "Selected material"
+msgstr ""
+
+#: tfobject3d.label_color.caption
+msgctxt "tfobject3d.label_color.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_color1.caption
+msgctxt "tfobject3d.label_color1.caption"
+msgid "Color :"
+msgstr ""
+
+#: tfobject3d.label_height.caption
+msgctxt "tfobject3d.label_height.caption"
+msgid "Height :"
+msgstr "Höjd :"
+
+#: tfobject3d.label_lightingnormals.caption
+msgctxt "tfobject3d.label_lightingnormals.caption"
+msgid "Lighting normals :"
+msgstr ""
+
+#: tfobject3d.label_lights.caption
+msgid "Lights :"
+msgstr ""
+
+#: tfobject3d.label_materials.caption
+msgctxt "tfobject3d.label_materials.caption"
+msgid "Materials :"
+msgstr ""
+
+#: tfobject3d.label_opacity.caption
+msgctxt "tfobject3d.label_opacity.caption"
+msgid "Opacity :"
+msgstr ""
+
+#: tfobject3d.label_specularindex.caption
+msgctxt "tfobject3d.label_specularindex.caption"
+msgid "Spec. index :"
+msgstr ""
+
+#: tfobject3d.label_width.caption
+msgctxt "tfobject3d.label_width.caption"
+msgid "Width :"
+msgstr "Bredd :"
+
+#: tfobject3d.label_zoom.caption
+msgctxt "tfobject3d.label_zoom.caption"
+msgid "Zoom"
+msgstr ""
+
+#: tfobject3d.lights.caption
+msgid "Lights"
+msgstr ""
+
+#: tfobject3d.materials.caption
+msgid "Materials"
+msgstr ""
+
+#: tfobject3d.opentexturedialog.title
+msgctxt "tfobject3d.opentexturedialog.title"
+msgid "Open texture"
+msgstr "Öppna textur"
+
+#: tfobject3d.rendering.caption
+msgid "Rendering"
+msgstr ""
+
+#: tfobject3d.tooladddirectional.hint
+msgid "Add a directional light"
+msgstr ""
+
+#: tfobject3d.toolpointlight.hint
+msgid "Add a point light"
+msgstr ""
+
+#: tfobject3d.toolremoveselectedlight.hint
+msgid "Remove selected light"
+msgstr ""
+
+#: 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"
+msgstr ""
+
+#: tfphongfilter.groupbox_color.caption
+msgctxt "tfphongfilter.groupbox_color.caption"
+msgid "Color"
+msgstr "Färg"
+
+#: tfphongfilter.groupbox_color1.caption
+msgid "Altitude map"
+msgstr ""
+
+#: tfphongfilter.label_altitude.caption
+msgid "Global altitude :"
+msgstr ""
+
+#: tfphongfilter.label_lightposition.caption
+msgid "Light position :"
+msgstr ""
+
+#: tfphongfilter.radio_mapalpha.caption
+msgid "Alpha"
+msgstr ""
+
+#: tfphongfilter.radio_mapblue.caption
+msgid "B"
+msgstr ""
+
+#: tfphongfilter.radio_mapgreen.caption
+msgid "G"
+msgstr ""
+
+#: tfphongfilter.radio_maplightness.caption
+msgctxt "tfphongfilter.radio_maplightness.caption"
+msgid "Lightness"
+msgstr "Ljusstyrka"
+
+#: tfphongfilter.radio_maplinearlightness.caption
+msgid "Linear lightness"
+msgstr ""
+
+#: tfphongfilter.radio_mapred.caption
+msgid "R"
+msgstr ""
+
+#: tfphongfilter.radio_mapsaturation.caption
+msgctxt "tfphongfilter.radio_mapsaturation.caption"
+msgid "Saturation"
+msgstr "Intensitet"
+
+#: tfphongfilter.radio_usebackcolor.caption
+msgid "Back color"
+msgstr ""
+
+#: tfphongfilter.radio_usekeep.caption
+msgid "Keep"
+msgstr ""
+
+#: tfphongfilter.radio_usepencolor.caption
+msgid "Pen color"
+msgstr ""
+
+#: tfphongfilter.radio_usetexture.caption
+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"
+msgstr "Pixelera"
+
+#: tfpixelate.label_pixelsize.caption
+msgctxt "tfpixelate.label_pixelsize.caption"
+msgid "Pixel size :"
+msgstr "Pixelstorlek :"
+
+#: tfpixelate.label_quality.caption
+msgctxt "tfpixelate.label_quality.caption"
+msgid "Quality :"
+msgstr "Kvaltiet :"
+
+#: 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"
+msgstr ""
+
+#: tfposterize.checkbox_bylightness.caption
+msgid "By lightness"
+msgstr ""
+
+#: tfposterize.label_levels.caption
+msgid "Levels :"
+msgstr ""
+
+#: tfpreviewdialog.caption
+msgid "Preview"
+msgstr ""
+
+#: tfpreviewdialog.lstatus.caption
+msgctxt "tfpreviewdialog.lstatus.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.button_configureprinter.caption
+msgid "Configure..."
+msgstr ""
+
+#: tfprint.button_print.caption
+msgid "Print!"
+msgstr ""
+
+#: tfprint.button_zoomfit.caption
+msgctxt "tfprint.button_zoomfit.caption"
+msgid "Zoom fit"
+msgstr "Anpassad zoom"
+
+#: tfprint.caption
+msgid "Print"
+msgstr ""
+
+#: tfprint.checkbox_ratio.caption
+msgctxt "tfprint.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Behåll bildformat"
+
+#: tfprint.groupbox_imagesize.caption
+msgid "Image size"
+msgstr ""
+
+#: tfprint.groupbox_margins.caption
+msgid "Margins"
+msgstr ""
+
+#: tfprint.label_bottom.caption
+msgid "Bottom:"
+msgstr ""
+
+#: tfprint.label_dpix.caption
+msgctxt "tfprint.label_dpix.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_dpiy.caption
+msgctxt "tfprint.label_dpiy.caption"
+msgid "."
+msgstr ""
+
+#: tfprint.label_height.caption
+msgid "Height:"
+msgstr ""
+
+#: tfprint.label_left.caption
+msgid "Left:"
+msgstr ""
+
+#: tfprint.label_orientation.caption
+msgid "Orientation:"
+msgstr ""
+
+#: tfprint.label_printerandpaper.caption
+msgid "Printer and paper:"
+msgstr ""
+
+#: tfprint.label_right.caption
+msgid "Right:"
+msgstr ""
+
+#: tfprint.label_top.caption
+msgid "Top:"
+msgstr ""
+
+#: tfprint.label_width.caption
+msgid "Width:"
+msgstr ""
+
+#: tfquestion.caption
+msgid "Question"
+msgstr ""
+
+#: tfquestion.checkbox_rememberchoice.caption
+msgid "Remember this choice"
+msgstr ""
+
+#: tfquestion.label_message.caption
+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"
+msgstr "Cirkulär oskärpa"
+
+#: tfradialblur.label_radius.caption
+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 ""
+
+#: tfrain.label_quantity.caption
+msgid "Quantity:"
+msgstr ""
+
+#: tfrain.label_wind.caption
+msgid "Wind :"
+msgstr ""
+
+#: tfresample.button_cancel.caption
+msgctxt "TFRESAMPLE.BUTTON_CANCEL.CAPTION"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfresample.button_ok.caption
+msgctxt "TFRESAMPLE.BUTTON_OK.CAPTION"
+msgid "OK"
+msgstr "OK"
+
+#: tfresample.caption
+msgctxt "tfresample.caption"
+msgid "Resample"
+msgstr "Omsampling"
+
+#: tfresample.checkbox_ratio.caption
+msgctxt "tfresample.checkbox_ratio.caption"
+msgid "Keep aspect ratio"
+msgstr "Behåll bildformat"
+
+#: tfresample.label_height.caption
+msgctxt "tfresample.label_height.caption"
+msgid "Height :"
+msgstr "Höjd :"
+
+#: tfresample.label_quality.caption
+msgctxt "tfresample.label_quality.caption"
+msgid "Quality :"
+msgstr "Kvalitet :"
+
+#: tfresample.label_width.caption
+msgctxt "tfresample.label_width.caption"
+msgid "Width :"
+msgstr "Bredd :"
+
+#: tfsaveoption.button_cancel.caption
+msgctxt "tfsaveoption.button_cancel.caption"
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: tfsaveoption.button_ok.caption
+msgctxt "tfsaveoption.button_ok.caption"
+msgid "OK"
+msgstr "OK"
+
+#: tfsaveoption.caption
+msgctxt "tfsaveoption.caption"
+msgid "Save"
+msgstr "Spara"
+
+#: tfsaveoption.checkbox_dithering.caption
+msgid "Dithering"
+msgstr ""
+
+#: tfsaveoption.label1.caption
+msgid "Quality:"
+msgstr ""
+
+#: tfsaveoption.label_0.caption
+msgid "0"
+msgstr ""
+
+#: tfsaveoption.label_1.caption
+msgid "100"
+msgstr ""
+
+#: tfsaveoption.label_50.caption
+msgid "50"
+msgstr ""
+
+#: tfsaveoption.label_colordepth.caption
+msgid "Color depth:"
+msgstr ""
+
+#: tfsaveoption.label_size.caption
+msgid "Size:"
+msgstr ""
+
+#: tfsaveoption.radiobutton_16colors.caption
+msgid "16 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_24bitsperpixel.caption
+msgid "24 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_256colors.caption
+msgid "256 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_2colors.caption
+msgid "2 colors"
+msgstr ""
+
+#: tfsaveoption.radiobutton_32bitsperpixel.caption
+msgid "32 bits"
+msgstr ""
+
+#: tfsaveoption.radiobutton_miomap.caption
+msgid "MioMap"
+msgstr ""
+
+#: 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 ""
+
+#: tfsharpen.label_amount.caption
+msgctxt "tfsharpen.label_amount.caption"
+msgid "Amount :"
+msgstr ""
+
+#: 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"
+msgstr "Skifta färger"
+
+#: tfshiftcolors.checkbox_gsba.caption
+msgctxt "tfshiftcolors.checkbox_gsba.caption"
+msgid "Corrected hue and lightness"
+msgstr ""
+
+#: tfshiftcolors.label1.caption
+msgctxt "TFSHIFTCOLORS.LABEL1.CAPTION"
+msgid "Hue"
+msgstr "Färgton"
+
+#: tfshiftcolors.label2.caption
+msgctxt "TFSHIFTCOLORS.LABEL2.CAPTION"
+msgid "Saturation"
+msgstr "Intensitet"
+
+#: tftoolbox.caption
+msgctxt "tftoolbox.caption"
+msgid "Tools"
+msgstr "Verktyg"
+

+ 38 - 0
lazpaint/release/changelog

@@ -67,6 +67,44 @@ lazpaint (7.0.5) stable; urgency=low
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * dutch translation
   * dutch translation
   * filling of workarea with maximum zoom
   * filling of workarea with maximum zoom
+  * paste vector shape on empty layer
+  * alignment of vector shapes to pixels with CTRL
+  * return key to finish polygon shape
+  * reset counter of popups on "forget dialogs"
+  * fix TIFF loading error on some systems
 
 
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 
 
+lazpaint (7.0.6) stable; urgency=low
+
+  * fix merge bitmap layer
+  * fix mouse scroll on MacOS
+  * clipboard image format with transparency
+  * allow undo when creating shape
+  * fix texture panel
+  * merging empty layer simply deletes it
+  * fix layer offset after undoing merge layer
+
+-- circular <[email protected]>  Wed, 11 Sep 2019 18:20:00 +0100
+
+lazpaint (7.0.7) stable; urgency=low
+
+  * polygon: clicking first point closes the polygon, holding Shift while inserting new point will align it on segment
+  * rectangular shape: right-clicking on border will rotate/shear the shape as with Alt key  * clipboard image format with transparency
+  * merging vector layers will make a vector layer if possible
+  * merging a vector with a raster layer will convert the latter to a vector shape
+  * transform texture when modifying rectangular shape
+  * select vector shape even if clicking a bit aside
+  * allow Space key when editing text object
+  * update contextual toolbar when selecting shape with edit shape tool
+  * context menu of toolbar in the upper toolbar background
+  * handling case when saving current file that has been renamed/deleted
+  * faster saving of layers with vectors
+  * fix bug with undo of deleted vector layer
+  * fix transform when copying shapes between layers
+  * fix crop layer with layer offset
+  * clear layer when deleting it in shape editor
+  * duplicate entry in GIF or TIFF
+
+-- circular <[email protected]>  Wed, 10 Oct 2019 17:37:00 +0100
+

+ 38 - 0
lazpaint/release/debian/linux32/DEBIAN/changelog

@@ -67,6 +67,44 @@ lazpaint (7.0.5) stable; urgency=low
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * dutch translation
   * dutch translation
   * filling of workarea with maximum zoom
   * filling of workarea with maximum zoom
+  * paste vector shape on empty layer
+  * alignment of vector shapes to pixels with CTRL
+  * return key to finish polygon shape
+  * reset counter of popups on "forget dialogs"
+  * fix TIFF loading error on some systems
 
 
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 
 
+lazpaint (7.0.6) stable; urgency=low
+
+  * fix merge bitmap layer
+  * fix mouse scroll on MacOS
+  * clipboard image format with transparency
+  * allow undo when creating shape
+  * fix texture panel
+  * merging empty layer simply deletes it
+  * fix layer offset after undoing merge layer
+
+-- circular <[email protected]>  Wed, 11 Sep 2019 18:20:00 +0100
+
+lazpaint (7.0.7) stable; urgency=low
+
+  * polygon: clicking first point closes the polygon, holding Shift while inserting new point will align it on segment
+  * rectangular shape: right-clicking on border will rotate/shear the shape as with Alt key  * clipboard image format with transparency
+  * merging vector layers will make a vector layer if possible
+  * merging a vector with a raster layer will convert the latter to a vector shape
+  * transform texture when modifying rectangular shape
+  * select vector shape even if clicking a bit aside
+  * allow Space key when editing text object
+  * update contextual toolbar when selecting shape with edit shape tool
+  * context menu of toolbar in the upper toolbar background
+  * handling case when saving current file that has been renamed/deleted
+  * faster saving of layers with vectors
+  * fix bug with undo of deleted vector layer
+  * fix transform when copying shapes between layers
+  * fix crop layer with layer offset
+  * clear layer when deleting it in shape editor
+  * duplicate entry in GIF or TIFF
+
+-- circular <[email protected]>  Wed, 10 Oct 2019 17:37:00 +0100
+

+ 1 - 1
lazpaint/release/debian/linux32/DEBIAN/control

@@ -1,5 +1,5 @@
 Package: lazpaint
 Package: lazpaint
-Version: 7.0.5
+Version: 7.0.7
 Section: base
 Section: base
 Priority: optional
 Priority: optional
 Architecture: i386
 Architecture: i386

+ 38 - 0
lazpaint/release/debian/linux64/DEBIAN/changelog

@@ -67,6 +67,44 @@ lazpaint (7.0.5) stable; urgency=low
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * shortcuts for colorpicker is "C", for curve move point "Z", for curve insert point "I" as well of Insert
   * dutch translation
   * dutch translation
   * filling of workarea with maximum zoom
   * filling of workarea with maximum zoom
+  * paste vector shape on empty layer
+  * alignment of vector shapes to pixels with CTRL
+  * return key to finish polygon shape
+  * reset counter of popups on "forget dialogs"
+  * fix TIFF loading error on some systems
 
 
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 -- circular <[email protected]>  Sun, 24 Aug 2019 11:46:00 +0100
 
 
+lazpaint (7.0.6) stable; urgency=low
+
+  * fix merge bitmap layer
+  * fix mouse scroll on MacOS
+  * clipboard image format with transparency
+  * allow undo when creating shape
+  * fix texture panel
+  * merging empty layer simply deletes it
+  * fix layer offset after undoing merge layer
+
+-- circular <[email protected]>  Wed, 11 Sep 2019 18:20:00 +0100
+
+lazpaint (7.0.7) stable; urgency=low
+
+  * polygon: clicking first point closes the polygon, holding Shift while inserting new point will align it on segment
+  * rectangular shape: right-clicking on border will rotate/shear the shape as with Alt key  * clipboard image format with transparency
+  * merging vector layers will make a vector layer if possible
+  * merging a vector with a raster layer will convert the latter to a vector shape
+  * transform texture when modifying rectangular shape
+  * select vector shape even if clicking a bit aside
+  * allow Space key when editing text object
+  * update contextual toolbar when selecting shape with edit shape tool
+  * context menu of toolbar in the upper toolbar background
+  * handling case when saving current file that has been renamed/deleted
+  * faster saving of layers with vectors
+  * fix bug with undo of deleted vector layer
+  * fix transform when copying shapes between layers
+  * fix crop layer with layer offset
+  * clear layer when deleting it in shape editor
+  * duplicate entry in GIF or TIFF
+
+-- circular <[email protected]>  Wed, 10 Oct 2019 17:37:00 +0100
+

+ 1 - 1
lazpaint/release/debian/linux64/DEBIAN/control

@@ -1,5 +1,5 @@
 Package: lazpaint
 Package: lazpaint
-Version: 7.0.5
+Version: 7.0.7
 Section: base
 Section: base
 Priority: optional
 Priority: optional
 Architecture: amd64
 Architecture: amd64

+ 47 - 0
lazpaint/release/macOS/LazPaint.app/Contents/Info.plist

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+  <dict>
+    <key>CFBundleIconFile</key>
+    <string>lazpaint</string>
+    <key>CFBundleDevelopmentRegion</key>
+    <string>English</string>
+    <key>CFBundleExecutable</key>
+    <string>lazpaint</string>
+    <key>CFBundleName</key>
+    <string>LazPaint</string>
+    <key>CFBundleIdentifier</key>
+    <string>com.company.lazpaint</string>
+    <key>CFBundleInfoDictionaryVersion</key>
+    <string>6.0</string>
+    <key>CFBundlePackageType</key>
+    <string>APPL</string>
+    <key>CFBundleSignature</key>
+    <string>lazp</string>
+    <key>CFBundleShortVersionString</key>
+    <string>7.0.7</string>
+    <key>CFBundleVersion</key>
+    <string>7.0.7</string>
+    <key>CSResourcesFileMapped</key>
+    <true/>
+    <key>CFBundleDocumentTypes</key>
+    <array>
+      <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Viewer</string>
+        <key>CFBundleTypeExtensions</key>
+        <array>
+          <string>*</string>
+        </array>
+        <key>CFBundleTypeOSTypes</key>
+        <array>
+          <string>fold</string>
+          <string>disk</string>
+          <string>****</string>
+        </array>
+      </dict>
+    </array>
+    <key>NSHighResolutionCapable</key>
+    <true/>
+  </dict>
+</plist>

+ 0 - 0
lazpaint/release/macOS/LazPaint.app/Contents/MacOS/delete.me


+ 1 - 0
lazpaint/release/macOS/LazPaint.app/Contents/PkgInfo

@@ -0,0 +1 @@
+APPL????

BIN
lazpaint/release/macOS/LazPaint.app/Contents/Resources/lazpaint.icns


BIN
lazpaint/release/macOS/background.png


+ 10 - 0
lazpaint/release/macOS/instructions.txt

@@ -0,0 +1,10 @@
+To make the DMG file:
+- compile the program in release mode for a CPU target (32 or 64)
+- open a shell in this macOS folder and run ./makedmg.sh
+- rename the created DMG file by appending the CPU target
+
+Alternatively, you can make an application bundle by hand:
+- make copy the LazPaint.app folder
+- copy "lazpaint" executable file into subfolder /Contents/MacOS
+- copy aditionnal files into subfolder /Contents/Resources
+(readme file, i18n and models folders, but not the auto-created application bundle)

+ 30 - 29
lazpaint/release/macOS/makedmg.sh

@@ -2,7 +2,7 @@
 set -e
 set -e
 
 
 if ! [ ${OSTYPE:0:6} = "darwin" ]; then
 if ! [ ${OSTYPE:0:6} = "darwin" ]; then
-  echo " This script is for OS X only"
+  echo "This script is for OS X only"
   exit 1
   exit 1
 fi
 fi
 
 
@@ -12,21 +12,17 @@ fi
 
 
 
 
 appname=LazPaint
 appname=LazPaint
-appversion=7.0.5
+appversion=7.0.7
 pkgversion=0
 pkgversion=0
-
-appnamenospaces=LazPaint
-dskimage="$appnamenospaces"
+appnamenospaces=lazpaint
 appbundle="$appname.app"
 appbundle="$appname.app"
 
 
 DMG_BACKGROUND_IMG="background.png"
 DMG_BACKGROUND_IMG="background.png"
-
-
-
-VOL_NAME="${appname}"   
+VOL_NAME="$appnamenospaces${appversion}_macos"   
 DMG_TMP="${VOL_NAME}-temp.dmg"
 DMG_TMP="${VOL_NAME}-temp.dmg"
 DMG_FINAL="${VOL_NAME}.dmg"         
 DMG_FINAL="${VOL_NAME}.dmg"         
-STAGING_DIR="./macOS"             # we copy all our stuff into this dir
+STAGING_DIR="./staging"             # we copy all our stuff into this dir
+SOURCE_DIR="$(cd ../bin; pwd)"
 
 
 # Check the background image DPI and convert it if it isn't 72x72
 # Check the background image DPI and convert it if it isn't 72x72
 _BACKGROUND_IMAGE_DPI_H=`sips -g dpiHeight ${DMG_BACKGROUND_IMG} | grep -Eo '[0-9]+\.[0-9]+'`
 _BACKGROUND_IMAGE_DPI_H=`sips -g dpiHeight ${DMG_BACKGROUND_IMG} | grep -Eo '[0-9]+\.[0-9]+'`
@@ -48,15 +44,25 @@ rm -rf "${STAGING_DIR}" "${DMG_TMP}" "${DMG_FINAL}"
 
 
 # copy over the stuff we want in the final disk image to our staging dir
 # copy over the stuff we want in the final disk image to our staging dir
 mkdir -p "${STAGING_DIR}"
 mkdir -p "${STAGING_DIR}"
-cp -rpf ./LazPaint.app "${STAGING_DIR}"
+cp -rpf "./$appbundle" "${STAGING_DIR}"
 # ... cp anything else you want in the DMG - documentation, etc.
 # ... cp anything else you want in the DMG - documentation, etc.
 
 
-pushd "${STAGING_DIR}"
-
-# ... perform any other stripping/compressing of libs and executables
-
-popd
-
+echo Staging files...
+pushd "${STAGING_DIR}/${appbundle}" >/dev/null
+ pushd Contents >/dev/null
+  pushd MacOS >/dev/null
+   unlink delete.me
+   cp "${SOURCE_DIR}/${appnamenospaces}" .
+  popd >/dev/null
+  pushd Resources >/dev/null
+   cp -r "${SOURCE_DIR}/i18n" .
+   cp -r "${SOURCE_DIR}/models" .
+   cp "${SOURCE_DIR}/readme.txt" .
+  popd >/dev/null
+ popd >/dev/null
+popd >/dev/null
+
+echo Making uncompressed DMG
 # figure out how big our DMG needs to be
 # figure out how big our DMG needs to be
 #  assumes our contents are at least 1M!
 #  assumes our contents are at least 1M!
 SIZE=`du -sh "${STAGING_DIR}" | sed 's/\([0-9\.]*\)M\(.*\)/\1/'`
 SIZE=`du -sh "${STAGING_DIR}" | sed 's/\([0-9\.]*\)M\(.*\)/\1/'`
@@ -71,8 +77,7 @@ fi
 hdiutil create -srcfolder "${STAGING_DIR}" -volname "${VOL_NAME}" -fs HFS+ \
 hdiutil create -srcfolder "${STAGING_DIR}" -volname "${VOL_NAME}" -fs HFS+ \
       -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}M "${DMG_TMP}"
       -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}M "${DMG_TMP}"
 
 
-echo "Created DMG: ${DMG_TMP}"
-
+echo Mounting DMG...
 # mount it and save the device
 # mount it and save the device
 DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP}" | \
 DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP}" | \
          egrep '^/dev/' | sed 1q | awk '{print $1}')
          egrep '^/dev/' | sed 1q | awk '{print $1}')
@@ -80,12 +85,13 @@ DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP}" | \
 sleep 2
 sleep 2
 
 
 # add a link to the Applications dir
 # add a link to the Applications dir
-echo "Add link to /Applications"
-pushd /Volumes/"${VOL_NAME}"
+echo "Adding link to Applications..."
+pushd /Volumes/"${VOL_NAME}" >/dev/null
 ln -s /Applications
 ln -s /Applications
-popd
+popd >/dev/null
 
 
 # add a background image
 # add a background image
+echo "Adding background image..."
 mkdir /Volumes/"${VOL_NAME}"/.background
 mkdir /Volumes/"${VOL_NAME}"/.background
 cp "${DMG_BACKGROUND_IMG}" /Volumes/"${VOL_NAME}"/.background/
 cp "${DMG_BACKGROUND_IMG}" /Volumes/"${VOL_NAME}"/.background/
 
 
@@ -103,7 +109,7 @@ echo '
            set arrangement of viewOptions to not arranged
            set arrangement of viewOptions to not arranged
            set icon size of viewOptions to 72
            set icon size of viewOptions to 72
            set background picture of viewOptions to file ".background:'${DMG_BACKGROUND_IMG}'"
            set background picture of viewOptions to file ".background:'${DMG_BACKGROUND_IMG}'"
-           set position of item "'${appname}'.app" of container window to {160, 205}
+           set position of item "'$appbundle'" of container window to {160, 205}
            set position of item "Applications" of container window to {360, 205}
            set position of item "Applications" of container window to {360, 205}
            close
            close
            open
            open
@@ -123,13 +129,8 @@ echo "Creating compressed image"
 hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
 hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
 
 
 # clean up
 # clean up
+echo Cleaning up...
 rm -rf "${DMG_TMP}"
 rm -rf "${DMG_TMP}"
 rm -rf "${STAGING_DIR}"
 rm -rf "${STAGING_DIR}"
 
 
 echo 'Done.'
 echo 'Done.'
-
-if [ -e "debian/$bindir" ]; then
-  rm -R debian
-fi
-
-exit

+ 1 - 1
lazpaint/release/stable/latest.txt

@@ -1,2 +1,2 @@
-6.4.1
+7.0.7
 lang_update=
 lang_update=

+ 9 - 9
lazpaint/release/stable/pad_file.xml

@@ -34,10 +34,10 @@
 	</Company_Info>
 	</Company_Info>
 	<Program_Info>
 	<Program_Info>
 		<Program_Name>LazPaint</Program_Name>
 		<Program_Name>LazPaint</Program_Name>
-		<Program_Version>6.4.1</Program_Version>
-		<Program_Release_Month>04</Program_Release_Month>
-		<Program_Release_Day>07</Program_Release_Day>
-		<Program_Release_Year>2015</Program_Release_Year>
+		<Program_Version>7.0.7</Program_Version>
+		<Program_Release_Month>10</Program_Release_Month>
+		<Program_Release_Day>14</Program_Release_Day>
+		<Program_Release_Year>2019</Program_Release_Year>
 		<Program_Cost_Dollars />
 		<Program_Cost_Dollars />
 		<Program_Cost_Other_Code />
 		<Program_Cost_Other_Code />
 		<Program_Cost_Other />
 		<Program_Cost_Other />
@@ -46,14 +46,14 @@
 		<Program_Install_Support>Install and Uninstall</Program_Install_Support>
 		<Program_Install_Support>Install and Uninstall</Program_Install_Support>
 		<Program_OS_Support>Mac OSX,Linux,Win7 x32,Win7 x64,WinVista,WinVista x64,WinXP</Program_OS_Support>
 		<Program_OS_Support>Mac OSX,Linux,Win7 x32,Win7 x64,WinVista,WinVista x64,WinXP</Program_OS_Support>
 		<Program_Language>English</Program_Language>
 		<Program_Language>English</Program_Language>
-		<Program_Change_Info>added brush tool, clone tool, palette toolbar, docking of toolbox, choice of quality when saving PNG/JPG/BMP files, rain rendering, improved 3d object importation (texture, vertex normals)</Program_Change_Info>
+		<Program_Change_Info>vectorial shapes and layers, dark theme, align and move shapes up and down, frame edition for ICO/GIF/TIFF, SVG as vectorial, resources files LRS/RES, ratio for selection rectangle/ellipse</Program_Change_Info>
 		<Program_Specific_Category>Graphics</Program_Specific_Category>
 		<Program_Specific_Category>Graphics</Program_Specific_Category>
 		<Program_Category_Class>Graphic Apps::Editors</Program_Category_Class>
 		<Program_Category_Class>Graphic Apps::Editors</Program_Category_Class>
 		<Program_System_Requirements>Pentium, 32-bit processor, 200 Mbytes RAM</Program_System_Requirements>
 		<Program_System_Requirements>Pentium, 32-bit processor, 200 Mbytes RAM</Program_System_Requirements>
 		<File_Info>
 		<File_Info>
-			<File_Size_Bytes>3321446</File_Size_Bytes>
-			<File_Size_K>3244</File_Size_K>
-			<File_Size_MB>3.16</File_Size_MB>
+			<File_Size_Bytes>5434703</File_Size_Bytes>
+			<File_Size_K>5307</File_Size_K>
+			<File_Size_MB>5.18</File_Size_MB>
 		</File_Info>
 		</File_Info>
 		<Expire_Info>
 		<Expire_Info>
 			<Has_Expire_Info>N</Has_Expire_Info>
 			<Has_Expire_Info>N</Has_Expire_Info>
@@ -116,7 +116,7 @@
 			<Application_XML_File_URL>http://lazpaint.sourceforge.net/pad_file.xml</Application_XML_File_URL>
 			<Application_XML_File_URL>http://lazpaint.sourceforge.net/pad_file.xml</Application_XML_File_URL>
 		</Application_URLs>
 		</Application_URLs>
 		<Download_URLs>
 		<Download_URLs>
-			<Primary_Download_URL>https://github.com/bgrabitmap/lazpaint/releases/download/v6.4.1/lazpaint6.4.1_setup_win32_win64.exe</Primary_Download_URL>
+			<Primary_Download_URL>https://github.com/bgrabitmap/lazpaint/releases/download/v7.0.7/lazpaint7.0.7_setup_win32_win64.exe</Primary_Download_URL>
 			<Secondary_Download_URL />
 			<Secondary_Download_URL />
 			<Additional_Download_URL_1 />
 			<Additional_Download_URL_1 />
 			<Additional_Download_URL_2 />
 			<Additional_Download_URL_2 />

BIN
lazpaint/release/stable/pad_icon.gif


BIN
lazpaint/release/stable/pad_screenshot.png


+ 1 - 1
lazpaint/release/windows/lazpaint.iss

@@ -1,7 +1,7 @@
 #define MyAppName "LazPaint"
 #define MyAppName "LazPaint"
 #define MyAppOutputName "lazpaint"
 #define MyAppOutputName "lazpaint"
 #define MyInstallerSuffix "_setup_win32_win64"
 #define MyInstallerSuffix "_setup_win32_win64"
-#define MyAppVersion "7.0.5"
+#define MyAppVersion "7.0.7"
 #define MyAppPublisher "Circular, Fabien Wang, Lainz and others"
 #define MyAppPublisher "Circular, Fabien Wang, Lainz and others"
 #define MyAppURL "http://sourceforge.net/projects/lazpaint/"
 #define MyAppURL "http://sourceforge.net/projects/lazpaint/"
 #define MyAppExeName "lazpaint.exe"
 #define MyAppExeName "lazpaint.exe"

+ 62 - 57
lazpaint/tools/utool.pas

@@ -5,9 +5,14 @@ unit UTool;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, uimage,
-  UImageType, ULayerAction, LCLType, Controls, UBrushType, UConfig,
-  LCVectorPolyShapes, BGRAGradientScanner, LCVectorRectShapes;
+  Classes, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, uimage, UImageType,
+  ULayerAction, LCLType, Controls, UBrushType, UConfig, LCVectorPolyShapes,
+  BGRAGradientScanner, BGRALayerOriginal, LCVectorRectShapes;
+
+const
+  VK_SNAP = {$IFDEF DARWIN}VK_LWIN{$ELSE}VK_CONTROL{$ENDIF};
+  VK_SNAP2 = {$IFDEF DARWIN}VK_RWIN{$ELSE}VK_CONTROL{$ENDIF};
+  ssSnap = {$IFDEF DARWIN}ssMeta{$ELSE}ssCtrl{$ENDIF};
 
 
 type TPaintToolType = (ptHand,ptHotSpot, ptMoveLayer,ptRotateLayer,ptZoomLayer,
 type TPaintToolType = (ptHand,ptHotSpot, ptMoveLayer,ptRotateLayer,ptZoomLayer,
                    ptPen, ptBrush, ptClone, ptColorPicker, ptEraser,
                    ptPen, ptBrush, ptClone, ptColorPicker, ptEraser,
@@ -39,7 +44,7 @@ type
   TBitmapToVirtualScreenFunction = function(PtF: TPointF): TPointF of object;
   TBitmapToVirtualScreenFunction = function(PtF: TPointF): TPointF of object;
 
 
   TEraserMode = (emEraseAlpha, emSoften);
   TEraserMode = (emEraseAlpha, emSoften);
-  TToolCommand = (tcCut, tcCopy, tcPaste, tcDelete, tcMoveUp, tcMoveDown, tcMoveToFront, tcMoveToBack,
+  TToolCommand = (tcCut, tcCopy, tcPaste, tcDelete, tcFinish, tcMoveUp, tcMoveDown, tcMoveToFront, tcMoveToBack,
     tcAlignLeft, tcCenterHorizontally, tcAlignRight, tcAlignTop, tcCenterVertically, tcAlignBottom,
     tcAlignLeft, tcCenterHorizontally, tcAlignRight, tcAlignTop, tcCenterVertically, tcAlignBottom,
     tcShapeToSpline);
     tcShapeToSpline);
 
 
@@ -47,6 +52,8 @@ function GradientColorSpaceToDisplay(AValue: TBGRAColorInterpolation): string;
 function DisplayToGradientColorSpace(AValue: string): TBGRAColorInterpolation;
 function DisplayToGradientColorSpace(AValue: string): TBGRAColorInterpolation;
 
 
 type
 type
+  TLayerKind = (lkUnknown, lkEmpty, lkBitmap, lkTransformedBitmap, lkGradient, lkVectorial, lkSVG, lkOther);
+
   { TGenericTool }
   { TGenericTool }
 
 
   TGenericTool = class
   TGenericTool = class
@@ -64,12 +71,12 @@ type
     function FixLayerOffset: boolean; virtual;
     function FixLayerOffset: boolean; virtual;
     function DoToolDown(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF; rightBtn: boolean): TRect; virtual;
     function DoToolDown(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF; rightBtn: boolean): TRect; virtual;
     function DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect; virtual;
     function DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect; virtual;
-    procedure DoToolMoveAfter(pt: TPoint; ptF: TPointF); virtual;
     function DoToolUpdate(toolDest: TBGRABitmap): TRect; virtual;
     function DoToolUpdate(toolDest: TBGRABitmap): TRect; virtual;
     procedure OnTryStop(sender: TCustomLayerAction); virtual;
     procedure OnTryStop(sender: TCustomLayerAction); virtual;
     function SelectionMaxPointDistance: single;
     function SelectionMaxPointDistance: single;
     function GetStatusText: string; virtual;
     function GetStatusText: string; virtual;
     function DoGetToolDrawingLayer: TBGRABitmap; virtual;
     function DoGetToolDrawingLayer: TBGRABitmap; virtual;
+    function GetCurrentLayerKind: TLayerKind;
   public
   public
     ToolUpdateNeeded: boolean;
     ToolUpdateNeeded: boolean;
     Cursor: TCursor;
     Cursor: TCursor;
@@ -84,7 +91,6 @@ type
     function ToolUpdate: TRect;
     function ToolUpdate: TRect;
     function ToolDown(X,Y: single; rightBtn: boolean): TRect;
     function ToolDown(X,Y: single; rightBtn: boolean): TRect;
     function ToolMove(X,Y: single): TRect;
     function ToolMove(X,Y: single): TRect;
-    procedure ToolMoveAfter(X,Y: single);
     function ToolKeyDown(var key: Word): TRect; virtual;
     function ToolKeyDown(var key: Word): TRect; virtual;
     function ToolKeyUp(var key: Word): TRect; virtual;
     function ToolKeyUp(var key: Word): TRect; virtual;
     function ToolKeyPress(var key: TUTF8Char): TRect; virtual;
     function ToolKeyPress(var key: TUTF8Char): TRect; virtual;
@@ -117,13 +123,13 @@ type
 
 
   TToolClass = class of TGenericTool;
   TToolClass = class of TGenericTool;
 
 
-  TToolPopupMessage= (tpmNone,tpmHoldShiftForSquare, tpmHoldCtrlSnapToPixel,
-    tpmReturnValides, tpmBackspaceRemoveLastPoint, tpmCtrlRestrictRotation,
-    tpmAltShiftScaleMode, tpmCurveModeHint, tpmBlendOpBackground,
+  TToolPopupMessage= (tpmNone,tpmHoldKeyForSquare, tpmHoldKeySnapToPixel,
+    tpmReturnValides, tpmBackspaceRemoveLastPoint, tpmHoldKeyRestrictRotation,
+    tpmHoldKeysScaleMode, tpmCurveModeHint, tpmBlendOpBackground,
     tpmRightClickForSource);
     tpmRightClickForSource);
 
 
   TOnToolChangedHandler = procedure(sender: TToolManager; ANewToolType: TPaintToolType) of object;
   TOnToolChangedHandler = procedure(sender: TToolManager; ANewToolType: TPaintToolType) of object;
-  TOnPopupToolHandler = procedure(sender: TToolManager; APopupMessage: TToolPopupMessage) of object;
+  TOnPopupToolHandler = procedure(sender: TToolManager; APopupMessage: TToolPopupMessage; AKey: Word) of object;
 
 
   TShapeOption = (toAliasing, toDrawShape, toFillShape, toCloseShape);
   TShapeOption = (toAliasing, toDrawShape, toFillShape, toCloseShape);
   TShapeOptions = set of TShapeOption;
   TShapeOptions = set of TShapeOption;
@@ -272,10 +278,8 @@ type
 
 
     function ToolDown(X,Y: single; ARightBtn: boolean; APressure: single): boolean; overload;
     function ToolDown(X,Y: single; ARightBtn: boolean; APressure: single): boolean; overload;
     function ToolMove(X,Y: single; APressure: single): boolean; overload;
     function ToolMove(X,Y: single; APressure: single): boolean; overload;
-    procedure ToolMoveAfter(X,Y: single); overload;
     function ToolDown(ACoord: TPointF; ARightBtn: boolean; APressure: single): boolean; overload;
     function ToolDown(ACoord: TPointF; ARightBtn: boolean; APressure: single): boolean; overload;
     function ToolMove(ACoord: TPointF; APressure: single): boolean; overload;
     function ToolMove(ACoord: TPointF; APressure: single): boolean; overload;
-    procedure ToolMoveAfter(coord: TPointF); overload;
     function ToolKeyDown(var key: Word): boolean;
     function ToolKeyDown(var key: Word): boolean;
     function ToolKeyUp(var key: Word): boolean;
     function ToolKeyUp(var key: Word): boolean;
     function ToolKeyPress(var key: TUTF8Char): boolean;
     function ToolKeyPress(var key: TUTF8Char): boolean;
@@ -286,7 +290,7 @@ type
     procedure ToolOpen;
     procedure ToolOpen;
     function ToolUpdate: boolean;
     function ToolUpdate: boolean;
     function ToolUpdateNeeded: boolean;
     function ToolUpdateNeeded: boolean;
-    procedure ToolPopup(AMessage: TToolPopupMessage);
+    procedure ToolPopup(AMessage: TToolPopupMessage; AKey: Word = 0);
     procedure HintReturnValidates;
     procedure HintReturnValidates;
 
 
     function IsSelectingTool: boolean;
     function IsSelectingTool: boolean;
@@ -368,12 +372,12 @@ type
    end;
    end;
 
 
 procedure RegisterTool(ATool: TPaintToolType; AClass: TToolClass);
 procedure RegisterTool(ATool: TPaintToolType; AClass: TToolClass);
-function ToolPopupMessageToStr(AMessage :TToolPopupMessage): string;
+function ToolPopupMessageToStr(AMessage :TToolPopupMessage; AKey: Word = 0): string;
 
 
 implementation
 implementation
 
 
 uses Types, ugraph, LCScaleDPI, LazPaintType, UCursors, BGRATextFX, ULoading, uresourcestrings,
 uses Types, ugraph, LCScaleDPI, LazPaintType, UCursors, BGRATextFX, ULoading, uresourcestrings,
-  BGRATransform;
+  BGRATransform, LCVectorOriginal, BGRAGradientOriginal, BGRASVGOriginal;
 
 
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 var pt: TPaintToolType;
 var pt: TPaintToolType;
@@ -421,15 +425,25 @@ begin
   PaintTools[ATool] := AClass;
   PaintTools[ATool] := AClass;
 end;
 end;
 
 
-function ToolPopupMessageToStr(AMessage: TToolPopupMessage): string;
+function ReplaceKey(AText: string; AKey: Word; AParam: integer = 1): string;
+begin
+  if AKey = VK_SHIFT then result := StringReplace(AText, '%'+inttostr(AParam), rsShift, []) else
+  if AKey = VK_CONTROL then result := StringReplace(AText, '%'+inttostr(AParam), rsCtrl, []) else
+  if AKey = VK_MENU then result := StringReplace(AText, '%'+inttostr(AParam), rsAlt, []) else
+  if AKey = VK_LWIN then result := StringReplace(AText, '%'+inttostr(AParam), rsCmd, []) else
+    result := AText;
+
+end;
+
+function ToolPopupMessageToStr(AMessage: TToolPopupMessage; AKey: Word = 0): string;
 begin
 begin
   case AMessage of
   case AMessage of
-  tpmHoldShiftForSquare: result := rsHoldShiftForSquare;
-  tpmHoldCtrlSnapToPixel: result := rsHoldCtrlSnapToPixel;
+  tpmHoldKeyForSquare: result := ReplaceKey(rsHoldKeyForSquare, AKey);
+  tpmHoldKeySnapToPixel: result := ReplaceKey(rsHoldKeySnapToPixel, AKey);
   tpmReturnValides: result := rsReturnValides;
   tpmReturnValides: result := rsReturnValides;
   tpmBackspaceRemoveLastPoint: result := rsBackspaceRemoveLastPoint;
   tpmBackspaceRemoveLastPoint: result := rsBackspaceRemoveLastPoint;
-  tpmCtrlRestrictRotation: result := rsCtrlRestrictRotation;
-  tpmAltShiftScaleMode: result := rsAltShiftScaleMode;
+  tpmHoldKeyRestrictRotation: result := ReplaceKey(rsHoldKeyRestrictRotation, AKey);
+  tpmHoldKeysScaleMode: result := ReplaceKey(ReplaceKey(rsHoldKeysScaleMode, AKey, 2), VK_MENU);
   tpmCurveModeHint: result := rsCurveModeHint;
   tpmCurveModeHint: result := rsCurveModeHint;
   tpmBlendOpBackground: result := rsBlendOpNotUsedForBackground;
   tpmBlendOpBackground: result := rsBlendOpNotUsedForBackground;
   tpmRightClickForSource: result := rsRightClickForSource;
   tpmRightClickForSource: result := rsRightClickForSource;
@@ -502,6 +516,28 @@ begin
     result := Action.DrawingLayer;
     result := Action.DrawingLayer;
 end;
 end;
 
 
+function TGenericTool.GetCurrentLayerKind: TLayerKind;
+var
+  c: TBGRALayerOriginalAny;
+begin
+  if not Manager.Image.LayerOriginalDefined[Manager.Image.CurrentLayerIndex] then
+  begin
+    if Manager.Image.CurrentLayerEmpty then exit(lkEmpty)
+    else exit(lkBitmap);
+  end else
+  if not Manager.Image.LayerOriginalKnown[Manager.Image.CurrentLayerIndex] then
+   exit(lkUnknown)
+  else
+  begin
+    c := Manager.Image.LayerOriginalClass[Manager.Image.CurrentLayerIndex];
+    if c = TVectorOriginal then exit(lkVectorial) else
+    if c = TBGRALayerImageOriginal then exit(lkTransformedBitmap) else
+    if c = TBGRALayerGradientOriginal then exit(lkGradient) else
+    if c = TBGRALayerSVGOriginal then exit(lkSVG) else
+      exit(lkOther);
+  end;
+end;
+
 function TGenericTool.GetAction: TLayerAction;
 function TGenericTool.GetAction: TLayerAction;
 begin
 begin
   if not Assigned(FAction) then
   if not Assigned(FAction) then
@@ -549,14 +585,6 @@ begin
 end;
 end;
 {$hints on}
 {$hints on}
 
 
-{$hints off}
-procedure TGenericTool.DoToolMoveAfter(pt: TPoint; ptF: TPointF);
-begin
-  //nothing
-end;
-
-{$hints on}
-
 constructor TGenericTool.Create(AManager: TToolManager);
 constructor TGenericTool.Create(AManager: TToolManager);
 begin
 begin
   inherited Create;
   inherited Create;
@@ -712,21 +740,6 @@ begin
   result := DoToolMove(toolDest,ptF.Round,ptF);
   result := DoToolMove(toolDest,ptF.Round,ptF);
 end;
 end;
 
 
-procedure TGenericTool.ToolMoveAfter(X, Y: single);
-var
-  pt: TPoint;
-  ptF: TPointF;
-begin
-  if FixLayerOffset then
-  begin
-    x -= LayerOffset.x;
-    y -= LayerOffset.y;
-  end;
-  pt := Point(round(x),round(y));
-  ptF := PointF(x,y);
-  DoToolMoveAfter(pt,ptF);
-end;
-
 {$hints off}
 {$hints off}
 function TGenericTool.ToolKeyDown(var key: Word): TRect;
 function TGenericTool.ToolKeyDown(var key: Word): TRect;
 begin
 begin
@@ -1674,12 +1687,6 @@ begin
   if result then NotifyImageOrSelectionChanged(currentTool.LastToolDrawingLayer, changed);
   if result then NotifyImageOrSelectionChanged(currentTool.LastToolDrawingLayer, changed);
 end;
 end;
 
 
-procedure TToolManager.ToolMoveAfter(X, Y: single); overload;
-begin
-  if ToolCanBeUsed then
-    currentTool.ToolMoveAfter(X,Y);
-end;
-
 function TToolManager.ToolKeyDown(var key: Word): boolean;
 function TToolManager.ToolKeyDown(var key: Word): boolean;
 var changed: TRect;
 var changed: TRect;
 begin
 begin
@@ -1725,7 +1732,10 @@ end;
 function TToolManager.ToolCommand(ACommand: TToolCommand): boolean;
 function TToolManager.ToolCommand(ACommand: TToolCommand): boolean;
 begin
 begin
   if Assigned(FCurrentTool) then
   if Assigned(FCurrentTool) then
-    result := FCurrentTool.ToolCommand(ACommand)
+  begin
+    result := FCurrentTool.ToolCommand(ACommand);
+    CheckExitTool;
+  end
   else
   else
     result := false;
     result := false;
 end;
 end;
@@ -1797,10 +1807,10 @@ begin
     result := true;
     result := true;
 end;
 end;
 
 
-procedure TToolManager.ToolPopup(AMessage: TToolPopupMessage);
+procedure TToolManager.ToolPopup(AMessage: TToolPopupMessage; AKey: Word = 0);
 begin
 begin
   if Assigned(FOnPopupToolHandler) then
   if Assigned(FOnPopupToolHandler) then
-    FOnPopupToolHandler(self, AMessage);
+    FOnPopupToolHandler(self, AMessage, AKey);
 end;
 end;
 
 
 function TToolManager.IsSelectingTool: boolean;
 function TToolManager.IsSelectingTool: boolean;
@@ -1846,11 +1856,6 @@ begin
   result := ToolMove(ACoord.x,ACoord.y,APressure)
   result := ToolMove(ACoord.x,ACoord.y,APressure)
 end;
 end;
 
 
-procedure TToolManager.ToolMoveAfter(coord: TPointF); overload;
-begin
-  ToolMoveAfter(coord.x,coord.y);
-end;
-
 initialization
 initialization
   fillchar({%H-}PaintTools,sizeof(PaintTools),0);
   fillchar({%H-}PaintTools,sizeof(PaintTools),0);
 
 

+ 33 - 21
lazpaint/tools/utoolbasic.pas

@@ -15,14 +15,15 @@ type
   TToolHand = class(TReadonlyTool)
   TToolHand = class(TReadonlyTool)
   protected
   protected
     handMoving: boolean;
     handMoving: boolean;
-    handOrigin: TPoint;
+    handOriginF: TPointF;
     function FixSelectionTransform: boolean; override;
     function FixSelectionTransform: boolean; override;
+    function FixLayerOffset: boolean; override;
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
       {%H-}rightBtn: boolean): TRect; override;
       {%H-}rightBtn: boolean): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
-    procedure DoToolMoveAfter(pt: TPoint; {%H-}ptF: TPointF); override;
     function GetStatusText: string; override;
     function GetStatusText: string; override;
   public
   public
+    constructor Create(AManager: TToolManager); override;
     function ToolUp: TRect; override;
     function ToolUp: TRect; override;
   end;
   end;
 
 
@@ -305,12 +306,11 @@ begin
     result := EmptyRect;
     result := EmptyRect;
 end;
 end;
 
 
-function TToolPen.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF
-  ): TRect;
+function TToolPen.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect;
 begin
 begin
   if (manager.PenWidth <= 3) and not HintShowed then
   if (manager.PenWidth <= 3) and not HintShowed then
   begin
   begin
-    Manager.ToolPopup(tpmHoldCtrlSnapToPixel);
+    Manager.ToolPopup(tpmHoldKeySnapToPixel, VK_SNAP);
     HintShowed:= true;
     HintShowed:= true;
   end;
   end;
   if snapToPixel then ptF := PointF(pt.X,pt.Y);
   if snapToPixel then ptF := PointF(pt.X,pt.Y);
@@ -326,11 +326,12 @@ end;
 constructor TToolPen.Create(AManager: TToolManager);
 constructor TToolPen.Create(AManager: TToolManager);
 begin
 begin
   inherited Create(AManager);
   inherited Create(AManager);
+  snapToPixel:= false;
 end;
 end;
 
 
 function TToolPen.ToolKeyDown(var key: Word): TRect;
 function TToolPen.ToolKeyDown(var key: Word): TRect;
 begin
 begin
-  if key = VK_CONTROL then
+  if key = VK_SNAP then
   begin
   begin
     snapToPixel := true;
     snapToPixel := true;
     Key := 0;
     Key := 0;
@@ -340,7 +341,7 @@ end;
 
 
 function TToolPen.ToolKeyUp(var key: Word): TRect;
 function TToolPen.ToolKeyUp(var key: Word): TRect;
 begin
 begin
-  if key = VK_CONTROL then
+  if key = VK_SNAP then
   begin
   begin
     snapToPixel := false;
     snapToPixel := false;
     key := 0;
     key := 0;
@@ -415,6 +416,11 @@ begin
   Result:= false;
   Result:= false;
 end;
 end;
 
 
+function TToolHand.FixLayerOffset: boolean;
+begin
+  Result:= false;
+end;
+
 function TToolHand.DoToolDown(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF;
 function TToolHand.DoToolDown(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF;
   rightBtn: boolean): TRect;
   rightBtn: boolean): TRect;
 begin
 begin
@@ -422,25 +428,25 @@ begin
   if not handMoving then
   if not handMoving then
   begin
   begin
     handMoving := true;
     handMoving := true;
-    handOrigin := pt;
+    handOriginF := ptF;
   end;
   end;
 end;
 end;
 
 
-function TToolHand.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF
-  ): TRect;
+function TToolHand.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect;
+var
+  newOfs: TPoint;
 begin
 begin
-  if handMoving and ((handOrigin.X <> pt.X) or (handOrigin.Y <> pt.Y)) then
+  result := EmptyRect;
+  if handMoving then
   begin
   begin
-    Manager.Image.ImageOffset := Point(Manager.Image.ImageOffset.X+pt.X-HandOrigin.X,
-                                       Manager.Image.ImageOffset.Y+pt.Y-HandOrigin.Y);
-    result := OnlyRenderChange;
-  end else
-    result := EmptyRect;
-end;
-
-procedure TToolHand.DoToolMoveAfter(pt: TPoint; ptF: TPointF);
-begin
-  if handMoving then handOrigin := pt;
+    newOfs := Point(Manager.Image.ImageOffset.X+round(ptF.X-HandOriginF.X),
+                    Manager.Image.ImageOffset.Y+round(ptF.Y-HandOriginF.Y));
+    if newOfs <> Manager.Image.ImageOffset then
+    begin
+      Manager.Image.ImageOffset := newOfs;
+      result := OnlyRenderChange;
+    end;
+  end;
 end;
 end;
 
 
 function TToolHand.GetStatusText: string;
 function TToolHand.GetStatusText: string;
@@ -479,6 +485,12 @@ begin
   end;
   end;
 end;
 end;
 
 
+constructor TToolHand.Create(AManager: TToolManager);
+begin
+  inherited Create(AManager);
+  handMoving := false;
+end;
+
 function TToolHand.ToolUp: TRect;
 function TToolHand.ToolUp: TRect;
 begin
 begin
   handMoving := false;
   handMoving := false;

+ 55 - 8
lazpaint/tools/utooldeformationgrid.pas

@@ -36,7 +36,9 @@ type
     function GetContextualToolbars: TContextualToolbars; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
     procedure BeforeGridSizeChange; override;
     procedure BeforeGridSizeChange; override;
-    procedure AfterGridSizeChange(NewNbX,NewNbY: Integer); override;
+    procedure AfterGridSizeChange({%H-}NewNbX,{%H-}NewNbY: Integer); override;
+    function ToolCommand(ACommand: TToolCommand): boolean; override;
+    function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
 
 
@@ -84,6 +86,8 @@ type
     function ToolUp: TRect; override;
     function ToolUp: TRect; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
+    function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
+    function ToolCommand(ACommand: TToolCommand): boolean; override;
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
 
 
@@ -398,7 +402,7 @@ var n: integer;
 begin
 begin
   if not FHintShowed then
   if not FHintShowed then
   begin
   begin
-    Manager.ToolPopup(tpmAltShiftScaleMode);
+    Manager.ToolPopup(tpmHoldKeysScaleMode, VK_SHIFT);
     FHintShowed:= true;
     FHintShowed:= true;
   end;
   end;
   result := EmptyRect;
   result := EmptyRect;
@@ -576,7 +580,7 @@ begin
     key := 0;
     key := 0;
   end
   end
   else
   else
-  if Key = VK_CONTROL then
+  if Key = VK_SNAP then
   begin
   begin
     snapToPixel:= true;
     snapToPixel:= true;
     key := 0;
     key := 0;
@@ -614,7 +618,7 @@ end;
 function TToolTextureMapping.ToolKeyUp(var key: Word): TRect;
 function TToolTextureMapping.ToolKeyUp(var key: Word): TRect;
 begin
 begin
   result := EmptyRect;
   result := EmptyRect;
-  if Key = VK_CONTROL then
+  if Key = VK_SNAP then
   begin
   begin
     snapToPixel:= false;
     snapToPixel:= false;
     key := 0;
     key := 0;
@@ -717,6 +721,29 @@ begin
     DrawPoints(quad,192);
     DrawPoints(quad,192);
 end;
 end;
 
 
+function TToolTextureMapping.ToolProvideCommand(ACommand: TToolCommand
+  ): boolean;
+begin
+  case ACommand of
+    tcFinish: result := quadDefined;
+  else result := false;
+  end;
+end;
+
+function TToolTextureMapping.ToolCommand(ACommand: TToolCommand): boolean;
+begin
+  case ACommand of
+    tcFinish: if quadDefined then
+      begin
+        ValidateQuad;
+        Manager.QueryExitTool;
+        result := true;
+      end  else
+        result := false;
+  else result := false;
+  end;
+end;
+
 destructor TToolTextureMapping.Destroy;
 destructor TToolTextureMapping.Destroy;
 begin
 begin
   ValidateAction;
   ValidateAction;
@@ -758,12 +785,32 @@ begin
   DeformationGridTexCoord := nil;
   DeformationGridTexCoord := nil;
 end;
 end;
 
 
-{$hints off}
 procedure TToolDeformationGrid.AfterGridSizeChange(NewNbX,NewNbY: Integer);
 procedure TToolDeformationGrid.AfterGridSizeChange(NewNbX,NewNbY: Integer);
 begin
 begin
   //grid will be created when needed
   //grid will be created when needed
 end;
 end;
-{$hints on}
+
+function TToolDeformationGrid.ToolCommand(ACommand: TToolCommand): boolean;
+begin
+  case ACommand of
+    tcFinish: if DoingDeformation then
+      begin
+        ValidateDeformationGrid;
+        result := true;
+      end
+      else result := false;
+  else result := false;
+  end;
+end;
+
+function TToolDeformationGrid.ToolProvideCommand(ACommand: TToolCommand
+  ): boolean;
+begin
+  case ACommand of
+    tcFinish: result := DoingDeformation;
+  else result := false;
+  end;
+end;
 
 
 destructor TToolDeformationGrid.Destroy;
 destructor TToolDeformationGrid.Destroy;
 begin
 begin
@@ -1012,7 +1059,7 @@ begin
   result := EmptyRect;
   result := EmptyRect;
   if Key = VK_RETURN then
   if Key = VK_RETURN then
   begin
   begin
-    if Action <> nil then
+    if DoingDeformation then
     begin
     begin
       ValidateDeformationGrid;
       ValidateDeformationGrid;
       result := EmptyRect;
       result := EmptyRect;
@@ -1022,7 +1069,7 @@ begin
   end else
   end else
   if Key = VK_ESCAPE then
   if Key = VK_ESCAPE then
   begin
   begin
-    if Action <> nil then
+    if DoingDeformation then
     begin
     begin
       CancelActionPartially;
       CancelActionPartially;
       result := OnlyRenderChange;
       result := OnlyRenderChange;

+ 81 - 30
lazpaint/tools/utoollayer.pas

@@ -15,7 +15,10 @@ type
   TToolMoveLayer = class(TGenericTool)
   TToolMoveLayer = class(TGenericTool)
   protected
   protected
     handMoving: boolean;
     handMoving: boolean;
-    handOrigin: TPoint;
+    handOriginF: TPointF;
+    originalTransformBefore: TAffineMatrix;
+    layerOffsetBefore: TPoint;
+    snapToPixel: boolean;
     FStartLayerOffset: TPoint;
     FStartLayerOffset: TPoint;
     FStartLayerMatrix: TAffineMatrix;
     FStartLayerMatrix: TAffineMatrix;
     FStartLayerOffsetDefined: boolean;
     FStartLayerOffsetDefined: boolean;
@@ -25,15 +28,17 @@ type
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
       {%H-}rightBtn: boolean): TRect; override;
       {%H-}rightBtn: boolean): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
-    procedure DoToolMoveAfter(pt: TPoint; {%H-}ptF: TPointF); override;
     function UseOriginal: boolean;
     function UseOriginal: boolean;
     procedure NeedLayerBounds;
     procedure NeedLayerBounds;
     function GetAction: TLayerAction; override;
     function GetAction: TLayerAction; override;
     function DoGetToolDrawingLayer: TBGRABitmap; override;
     function DoGetToolDrawingLayer: TBGRABitmap; override;
     procedure OnTryStop({%H-}sender: TCustomLayerAction); override;
     procedure OnTryStop({%H-}sender: TCustomLayerAction); override;
+    function FixLayerOffset: boolean; override;
   public
   public
+    constructor Create(AManager: TToolManager); override;
     function ToolUp: TRect; override;
     function ToolUp: TRect; override;
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolKeyDown(var key: Word): TRect; override;
+    function ToolKeyUp(var key: Word): TRect; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
@@ -63,7 +68,7 @@ type
     FPreviousFilter: TResampleFilter;
     FPreviousFilter: TResampleFilter;
     FTransforming: boolean;
     FTransforming: boolean;
     FPreviousMousePos: TPointF;
     FPreviousMousePos: TPointF;
-    FCtrlDown: boolean;
+    FSnapDown: boolean;
     FLastUpdateRect: TRect;
     FLastUpdateRect: TRect;
     FLastUpdateRectDefined: boolean;
     FLastUpdateRectDefined: boolean;
     FOriginalBounds: TRect;
     FOriginalBounds: TRect;
@@ -152,46 +157,62 @@ begin
   if not handMoving then
   if not handMoving then
   begin
   begin
     handMoving := true;
     handMoving := true;
-    handOrigin := pt;
+    handOriginF := ptF;
+    idx := Manager.Image.CurrentLayerIndex;
     if not FStartLayerOffsetDefined then
     if not FStartLayerOffsetDefined then
     begin
     begin
       FStartLayerOffsetDefined := true;
       FStartLayerOffsetDefined := true;
-      idx := Manager.Image.CurrentLayerIndex;
       NeedLayerBounds;
       NeedLayerBounds;
       FStartLayerOffset := Manager.Image.LayerOffset[idx];
       FStartLayerOffset := Manager.Image.LayerOffset[idx];
       FStartLayerMatrix := Manager.Image.LayerOriginalMatrix[idx];
       FStartLayerMatrix := Manager.Image.LayerOriginalMatrix[idx];
     end;
     end;
-    if UseOriginal then Manager.Image.DraftOriginal := true;
+    if UseOriginal then
+    begin
+      Manager.Image.DraftOriginal := true;
+      originalTransformBefore := Manager.Image.LayerOriginalMatrix[idx];
+    end else
+      originalTransformBefore := AffineMatrixIdentity;
+    layerOffsetBefore := Manager.Image.LayerOffset[idx];
   end;
   end;
 end;
 end;
 
 
 function TToolMoveLayer.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
 function TToolMoveLayer.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
   ptF: TPointF): TRect;
   ptF: TPointF): TRect;
 var idx: integer;
 var idx: integer;
-  prev: TPoint;
+  dx, dy: Single;
+  newTransform: TAffineMatrix;
+  newOfs: TPoint;
 begin
 begin
-  if handMoving and ((handOrigin.X <> pt.X) or (handOrigin.Y <> pt.Y)) then
+  result := EmptyRect;
+  if handMoving then
   begin
   begin
     idx := Manager.Image.CurrentLayerIndex;
     idx := Manager.Image.CurrentLayerIndex;
+    dx := ptF.X-HandOriginF.X;
+    dy := ptF.Y-HandOriginF.Y;
+    if snapToPixel then
+    begin
+      dx := round(dx);
+      dy := round(dy);
+    end;
     if UseOriginal then
     if UseOriginal then
     begin
     begin
-      Manager.Image.LayerOriginalMatrix[idx] :=
-          AffineMatrixTranslation(pt.X-HandOrigin.X,pt.Y-HandOrigin.Y)*Manager.Image.LayerOriginalMatrix[idx];
-      result := OnlyRenderChange;
+      newTransform := AffineMatrixTranslation(dx,dy)*originalTransformBefore;
+      if Manager.Image.LayerOriginalMatrix[idx] <> newTransform then
+      begin
+        Manager.Image.LayerOriginalMatrix[idx] := newTransform;
+        result := OnlyRenderChange;
+      end;
     end else
     end else
     begin
     begin
-      prev := Manager.Image.LayerOffset[idx];
-      Manager.Image.SetLayerOffset(idx, Point(prev.X+pt.X-HandOrigin.X,
-                                         prev.Y+pt.Y-HandOrigin.Y), FLayerBounds);
-      result := OnlyRenderChange;
+      newOfs := Point(layerOffsetBefore.X+round(dx),
+                      layerOffsetBefore.Y+round(dy));
+      if Manager.Image.LayerOffset[idx]<>newOfs then
+      begin
+        Manager.Image.SetLayerOffset(idx, newOfs, FLayerBounds);
+        result := OnlyRenderChange;
+      end;
     end;
     end;
-  end else
-    result := EmptyRect;
-end;
-
-procedure TToolMoveLayer.DoToolMoveAfter(pt: TPoint; ptF: TPointF);
-begin
-  if handMoving then handOrigin := pt;
+  end;
 end;
 end;
 
 
 function TToolMoveLayer.UseOriginal: boolean;
 function TToolMoveLayer.UseOriginal: boolean;
@@ -240,6 +261,19 @@ begin
   //nothing
   //nothing
 end;
 end;
 
 
+function TToolMoveLayer.FixLayerOffset: boolean;
+begin
+  Result:= false;
+end;
+
+constructor TToolMoveLayer.Create(AManager: TToolManager);
+begin
+  inherited Create(AManager);
+  handMoving := false;
+  FStartLayerOffsetDefined:= false;
+  snapToPixel:= false;
+end;
+
 function TToolMoveLayer.ToolUp: TRect;
 function TToolMoveLayer.ToolUp: TRect;
 begin
 begin
   handMoving := false;
   handMoving := false;
@@ -256,6 +290,12 @@ begin
     result := EmptyRect;
     result := EmptyRect;
     Key := 0;
     Key := 0;
   end
   end
+  else if (key = VK_SNAP) or (key = VK_SNAP2) then
+  begin
+    snapToPixel:= true;
+    result := EmptyRect;
+    key := 0;
+  end
   else if key = VK_ESCAPE then
   else if key = VK_ESCAPE then
   begin
   begin
     if FStartLayerOffsetDefined then
     if FStartLayerOffsetDefined then
@@ -274,6 +314,17 @@ begin
     Result:=inherited ToolKeyDown(key);
     Result:=inherited ToolKeyDown(key);
 end;
 end;
 
 
+function TToolMoveLayer.ToolKeyUp(var key: Word): TRect;
+begin
+  if (key = VK_SNAP) or (key = VK_SNAP2) then
+  begin
+    snapToPixel:= false;
+    result := EmptyRect;
+    key := 0;
+  end
+  else Result:=inherited ToolKeyUp(key);
+end;
+
 function TToolMoveLayer.GetContextualToolbars: TContextualToolbars;
 function TToolMoveLayer.GetContextualToolbars: TContextualToolbars;
 begin
 begin
   Result:= [];
   Result:= [];
@@ -402,7 +453,7 @@ begin
   begin
   begin
     FTransforming := true;
     FTransforming := true;
     FPreviousMousePos := ptF;
     FPreviousMousePos := ptF;
-    if FCtrlDown then
+    if FSnapDown then
     begin
     begin
       result := UpdateTransform;
       result := UpdateTransform;
       if IsRectEmpty(result) then result := OnlyRenderChange;
       if IsRectEmpty(result) then result := OnlyRenderChange;
@@ -491,7 +542,7 @@ end;
 constructor TToolTransformLayer.Create(AManager: TToolManager);
 constructor TToolTransformLayer.Create(AManager: TToolManager);
 begin
 begin
   inherited Create(AManager);
   inherited Create(AManager);
-  FCtrlDown:= false;
+  FSnapDown:= false;
   FTransformCenterDefined := false;
   FTransformCenterDefined := false;
   FLastUpdateRectDefined:= false;
   FLastUpdateRectDefined:= false;
 end;
 end;
@@ -531,9 +582,9 @@ end;
 
 
 function TToolTransformLayer.ToolKeyDown(var key: Word): TRect;
 function TToolTransformLayer.ToolKeyDown(var key: Word): TRect;
 begin
 begin
-  if key = VK_CONTROL then
+  if (key = VK_SNAP) or (KEY = VK_SNAP2) then
   begin
   begin
-    FCtrlDown:= true;
+    FSnapDown:= true;
     if FTransforming and CtrlChangesTransform then
     if FTransforming and CtrlChangesTransform then
     begin
     begin
       result := UpdateTransform;
       result := UpdateTransform;
@@ -560,9 +611,9 @@ end;
 
 
 function TToolTransformLayer.ToolKeyUp(var key: Word): TRect;
 function TToolTransformLayer.ToolKeyUp(var key: Word): TRect;
 begin
 begin
-  if key = VK_CONTROL then
+  if (key = VK_SNAP) or (KEY = VK_SNAP2) then
   begin
   begin
-    FCtrlDown := false;
+    FSnapDown := false;
     if FTransforming and CtrlChangesTransform then
     if FTransforming and CtrlChangesTransform then
     begin
     begin
       result := UpdateTransform;
       result := UpdateTransform;
@@ -652,7 +703,7 @@ var
   baseZoom: single;
   baseZoom: single;
   invZoom: boolean;
   invZoom: boolean;
 begin
 begin
-  if FCtrlDown then
+  if FSnapDown then
   begin
   begin
     logZoom := ln(FZoom)/ln(2);
     logZoom := ln(FZoom)/ln(2);
     if logZoom < 0 then
     if logZoom < 0 then
@@ -742,7 +793,7 @@ end;
 
 
 function TToolRotateLayer.GetActualAngle: single;
 function TToolRotateLayer.GetActualAngle: single;
 begin
 begin
-  if FCtrlDown then
+  if FSnapDown then
     result := round(FAngle/15)*15
     result := round(FAngle/15)*15
   else
   else
     result := FAngle;
     result := FAngle;

+ 58 - 9
lazpaint/tools/utoolpolygon.pas

@@ -34,10 +34,15 @@ type
 
 
   TToolPolygon = class(TVectorialTool)
   TToolPolygon = class(TVectorialTool)
   protected
   protected
+    initiallyClosed : boolean;
     function CreateShape: TVectorShape; override;
     function CreateShape: TVectorShape; override;
     procedure AssignShapeStyle(AMatrix: TAffineMatrix); override;
     procedure AssignShapeStyle(AMatrix: TAffineMatrix); override;
     procedure UpdateUserMode; virtual;
     procedure UpdateUserMode; virtual;
+    procedure ShapeValidated; override;
   public
   public
+    function ToolUp: TRect; override;
+    function ToolKeyPress(var key: TUTF8Char): TRect; override;
+    function ToolKeyDown(var key: Word): TRect; override;
     function GetContextualToolbars: TContextualToolbars; override;
     function GetContextualToolbars: TContextualToolbars; override;
   end;
   end;
 
 
@@ -152,7 +157,6 @@ begin
 end;
 end;
 
 
 function TToolSpline.ToolKeyPress(var key: TUTF8Char): TRect;
 function TToolSpline.ToolKeyPress(var key: TUTF8Char): TRect;
-var keyCode: Word;
 begin
 begin
   if (Key='z') or (Key = 'Z') then
   if (Key='z') or (Key = 'Z') then
   begin
   begin
@@ -160,14 +164,6 @@ begin
     result := OnlyRenderChange;
     result := OnlyRenderChange;
     Key := #0;
     Key := #0;
   end else
   end else
-  if (Key='i') or (Key='I') then
-  begin
-    keyCode := VK_INSERT;
-    ToolKeyDown(keyCode);
-    keyCode := VK_INSERT;
-    ToolKeyUp(keyCode);
-    result := EmptyRect;
-  end else
   begin
   begin
     Result:=inherited ToolKeyPress(key);
     Result:=inherited ToolKeyPress(key);
     if Key='x' then Key := #0;
     if Key='x' then Key := #0;
@@ -184,6 +180,7 @@ end;
 function TToolPolygon.CreateShape: TVectorShape;
 function TToolPolygon.CreateShape: TVectorShape;
 begin
 begin
   result := TPolylineShape.Create(nil);
   result := TPolylineShape.Create(nil);
+  initiallyClosed := toCloseShape in Manager.ShapeOptions;
 end;
 end;
 
 
 procedure TToolPolygon.AssignShapeStyle(AMatrix: TAffineMatrix);
 procedure TToolPolygon.AssignShapeStyle(AMatrix: TAffineMatrix);
@@ -203,6 +200,58 @@ begin
   if FQuickDefine then FShape.Usermode := vsuCreate;
   if FQuickDefine then FShape.Usermode := vsuCreate;
 end;
 end;
 
 
+procedure TToolPolygon.ShapeValidated;
+begin
+  inherited ShapeValidated;
+  if not initiallyClosed then
+    Manager.ShapeOptions := Manager.ShapeOptions - [toCloseShape];
+end;
+
+function TToolPolygon.ToolUp: TRect;
+var
+  opt: TShapeOptions;
+begin
+  Result:=inherited ToolUp;
+  if Assigned(FShape) then
+  begin
+    opt := Manager.ShapeOptions;
+    if (FShape as TCustomPolypointShape).Closed then
+      include(opt, toCloseShape)
+    else
+      exclude(opt, toCloseShape);
+    Manager.ShapeOptions:= opt;
+  end;
+end;
+
+function TToolPolygon.ToolKeyPress(var key: TUTF8Char): TRect;
+var
+  keyCode: Word;
+begin
+  if (Key='i') or (Key='I') then
+  begin
+    keyCode := VK_INSERT;
+    ToolKeyDown(keyCode);
+    if keyCode = 0 then key := #0;
+    keyCode := VK_INSERT;
+    ToolKeyUp(keyCode);
+    result := EmptyRect;
+  end else
+    Result:=inherited ToolKeyPress(key);
+end;
+
+function TToolPolygon.ToolKeyDown(var key: Word): TRect;
+begin
+  if (key = VK_RETURN) and Assigned(FShape)
+   and (FShape.Usermode = vsuCreate) then
+  begin
+    FShape.Usermode:= vsuEdit;
+    result := OnlyRenderChange;
+    key := 0;
+    exit;
+  end else
+    Result:=inherited ToolKeyDown(key);
+end;
+
 function TToolPolygon.GetContextualToolbars: TContextualToolbars;
 function TToolPolygon.GetContextualToolbars: TContextualToolbars;
 begin
 begin
   Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle,ctLineCap];
   Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle,ctLineCap];

+ 54 - 16
lazpaint/tools/utoolselect.pas

@@ -100,14 +100,17 @@ type
 
 
   TToolMoveSelection = class(TTransformSelectionTool)
   TToolMoveSelection = class(TTransformSelectionTool)
   protected
   protected
-    handMoving: boolean;
-    handOrigin: TPoint;
+    handMoving, snapToPixel: boolean;
+    handOriginF: TPointF;
+    selectionTransformBefore: TAffineMatrix;
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
     function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
       {%H-}rightBtn: boolean): TRect; override;
       {%H-}rightBtn: boolean): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
     function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
-    procedure DoToolMoveAfter(pt: TPoint; {%H-}ptF: TPointF); override;
   public
   public
+    constructor Create(AManager: TToolManager); override;
     function ToolUp: TRect; override;
     function ToolUp: TRect; override;
+    function ToolKeyDown(var key: Word): TRect; override;
+    function ToolKeyUp(var key: Word): TRect; override;
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
 
 
@@ -395,7 +398,7 @@ var angleDiff: single;
 begin
 begin
   if not HintShowed then
   if not HintShowed then
   begin
   begin
-    Manager.ToolPopup(tpmCtrlRestrictRotation);
+    Manager.ToolPopup(tpmHoldKeyRestrictRotation, VK_SNAP);
     HintShowed:= true;
     HintShowed:= true;
   end;
   end;
   if handMoving and ((handOrigin.X <> ptF.X) or (handOrigin.Y <> ptF.Y)) then
   if handMoving and ((handOrigin.X <> ptF.X) or (handOrigin.Y <> ptF.Y)) then
@@ -439,7 +442,7 @@ end;
 function TToolRotateSelection.ToolKeyDown(var key: Word): TRect;
 function TToolRotateSelection.ToolKeyDown(var key: Word): TRect;
 begin
 begin
   result := EmptyRect;
   result := EmptyRect;
-  if key = VK_CONTROL then
+  if key = VK_SNAP then
   begin
   begin
     if not snapRotate then
     if not snapRotate then
     begin
     begin
@@ -469,7 +472,7 @@ end;
 
 
 function TToolRotateSelection.ToolKeyUp(var key: Word): TRect;
 function TToolRotateSelection.ToolKeyUp(var key: Word): TRect;
 begin
 begin
-  if key = VK_CONTROL then
+  if key = VK_SNAP then
   begin
   begin
     snapRotate := false;
     snapRotate := false;
     Key := 0;
     Key := 0;
@@ -502,31 +505,44 @@ end;
 function TToolMoveSelection.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
 function TToolMoveSelection.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
   ptF: TPointF; rightBtn: boolean): TRect;
   ptF: TPointF; rightBtn: boolean): TRect;
 begin
 begin
-  if not handMoving then
+  if not handMoving and not Manager.Image.SelectionMaskEmpty then
   begin
   begin
     handMoving := true;
     handMoving := true;
-    handOrigin := pt;
+    handOriginF := ptF;
+    selectionTransformBefore := Manager.Image.SelectionTransform;
   end;
   end;
   result := EmptyRect;
   result := EmptyRect;
 end;
 end;
 
 
 function TToolMoveSelection.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
 function TToolMoveSelection.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
   ptF: TPointF): TRect;
   ptF: TPointF): TRect;
-var dx,dy: integer;
+var dx,dy: single;
+  newSelTransform: TAffineMatrix;
 begin
 begin
   result := EmptyRect;
   result := EmptyRect;
-  if handMoving and ((handOrigin.X <> pt.X) or (handOrigin.Y <> pt.Y)) then
+  if handMoving then
   begin
   begin
-    dx := pt.X-HandOrigin.X;
-    dy := pt.Y-HandOrigin.Y;
-    Manager.Image.SelectionTransform := AffineMatrixTranslation(dx,dy) * Manager.Image.SelectionTransform;
-    result := OnlyRenderChange;
+    dx := ptF.X-HandOriginF.X;
+    dy := ptF.Y-HandOriginF.Y;
+    if snapToPixel then
+    begin
+      dx := round(dx);
+      dy := round(dy);
+    end;
+    newSelTransform := AffineMatrixTranslation(dx,dy) * selectionTransformBefore;
+    if Manager.Image.SelectionTransform <> newSelTransform then
+    begin
+      Manager.Image.SelectionTransform := newSelTransform;
+      result := OnlyRenderChange;
+    end;
   end;
   end;
 end;
 end;
 
 
-procedure TToolMoveSelection.DoToolMoveAfter(pt: TPoint; ptF: TPointF);
+constructor TToolMoveSelection.Create(AManager: TToolManager);
 begin
 begin
-  if handMoving then handOrigin := pt;
+  inherited Create(AManager);
+  handMoving := false;
+  snapToPixel:= false;
 end;
 end;
 
 
 function TToolMoveSelection.ToolUp: TRect;
 function TToolMoveSelection.ToolUp: TRect;
@@ -535,6 +551,28 @@ begin
   result := EmptyRect;
   result := EmptyRect;
 end;
 end;
 
 
+function TToolMoveSelection.ToolKeyDown(var key: Word): TRect;
+begin
+  if (Key = VK_SNAP) or (Key = VK_SNAP2) then
+  begin
+    result := EmptyRect;
+    snapToPixel:= true;
+    key := 0;
+  end else
+    Result:=inherited ToolKeyDown(key);
+end;
+
+function TToolMoveSelection.ToolKeyUp(var key: Word): TRect;
+begin
+  if (Key = VK_SNAP) or (Key = VK_SNAP2) then
+  begin
+    result := EmptyRect;
+    snapToPixel:= false;
+    key := 0;
+  end else
+    Result:=inherited ToolKeyUp(key);
+end;
+
 destructor TToolMoveSelection.Destroy;
 destructor TToolMoveSelection.Destroy;
 begin
 begin
   if handMoving then handMoving := false;
   if handMoving then handMoving := false;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 474 - 253
lazpaint/tools/utoolvectorial.pas


+ 15 - 12
lazpaint/uchoosecolor.pas

@@ -59,8 +59,10 @@ type
                         bmp,bmpMaxlight: TBGRABitmap; end;
                         bmp,bmpMaxlight: TBGRABitmap; end;
     Lightscale: record bounds: TRect;
     Lightscale: record bounds: TRect;
                       bmp: TBGRABitmap; end;
                       bmp: TBGRABitmap; end;
+    LightCursorRect: TRect;
     Alphascale: record bounds: TRect;
     Alphascale: record bounds: TRect;
                        bmp: TBGRABitmap; end;
                        bmp: TBGRABitmap; end;
+    AlphaCursorRect: TRect;
     function GetAvailableBmpHeight: integer;
     function GetAvailableBmpHeight: integer;
     function GetAvailableBmpWidth: integer;
     function GetAvailableBmpWidth: integer;
     procedure SetAvailableBmpHeight(AValue: integer);
     procedure SetAvailableBmpHeight(AValue: integer);
@@ -70,7 +72,7 @@ type
     function ColorWithLight(c: TBGRAPixel; light: word): TBGRAPixel;
     function ColorWithLight(c: TBGRAPixel; light: word): TBGRAPixel;
     function BitmapWithLight(bmpsrc: TBGRABitmap; light: word; lookFor: TBGRAPixel; var pColorX,pColorY: integer): TBGRABitmap;
     function BitmapWithLight(bmpsrc: TBGRABitmap; light: word; lookFor: TBGRAPixel; var pColorX,pColorY: integer): TBGRABitmap;
     function ColorLightOf(c: TBGRAPixel): word;
     function ColorLightOf(c: TBGRAPixel): word;
-    procedure DrawTriangleCursor(dest: TBGRABitmap; bounds: TRect; value: byte);
+    function DrawTriangleCursor(dest: TBGRABitmap; bounds: TRect; value: byte): TRect;
     procedure DoSelect(X,Y: integer);
     procedure DoSelect(X,Y: integer);
     function MakeIconBase(size: integer): TBitmap;
     function MakeIconBase(size: integer): TBitmap;
     function MakeAddIcon(size: integer): TBitmap;
     function MakeAddIcon(size: integer): TBitmap;
@@ -271,12 +273,12 @@ begin
       SelectZone := szColorCircle;
       SelectZone := szColorCircle;
       DoSelect(X,Y);
       DoSelect(X,Y);
     end else
     end else
-    if PtInRect(Point(X,Y),Alphascale.Bounds) then
+    if PtInRect(Point(X,Y),Alphascale.Bounds) or PtInRect(Point(X,Y),AlphaCursorRect) then
     begin
     begin
       SelectZone := szAlphascale;
       SelectZone := szAlphascale;
       DoSelect(X,Y);
       DoSelect(X,Y);
     end else
     end else
-    if PtInRect(Point(X,Y),lightscale.Bounds) then
+    if PtInRect(Point(X,Y),lightscale.Bounds) or PtInRect(Point(X,Y),LightCursorRect) then
     begin
     begin
       SelectZone := szLightscale;
       SelectZone := szLightscale;
       DoSelect(X,Y);
       DoSelect(X,Y);
@@ -322,8 +324,8 @@ begin
     boundRight := x-4;
     boundRight := x-4;
     Bitmap.PutImage(alphascale.bounds.Left,alphascale.bounds.top,alphascale.Bmp,dmDrawWithTransparency);
     Bitmap.PutImage(alphascale.bounds.Left,alphascale.bounds.top,alphascale.Bmp,dmDrawWithTransparency);
     Bitmap.Rectangle(alphascale.bounds,BGRA(FormTextColor.red,FormTextColor.green,FormTextColor.Blue,128),dmDrawWithTransparency);
     Bitmap.Rectangle(alphascale.bounds,BGRA(FormTextColor.red,FormTextColor.green,FormTextColor.Blue,128),dmDrawWithTransparency);
-    DrawTriangleCursor(Bitmap, alphascale.bounds, currentColor.alpha);
-  end;
+    AlphaCursorRect := DrawTriangleCursor(Bitmap, alphascale.bounds, currentColor.alpha);
+  end else AlphaCursorRect := EmptyRect;
   if Lightscale.Bmp<>nil then
   if Lightscale.Bmp<>nil then
   begin
   begin
     w := Bitmap.TextSize(rsLight).cx;
     w := Bitmap.TextSize(rsLight).cx;
@@ -334,8 +336,8 @@ begin
     boundRight := x-4;
     boundRight := x-4;
     Bitmap.PutImage(Lightscale.bounds.Left,Lightscale.bounds.top,Lightscale.Bmp,dmFastBlend);
     Bitmap.PutImage(Lightscale.bounds.Left,Lightscale.bounds.top,Lightscale.Bmp,dmFastBlend);
     Bitmap.Rectangle(Lightscale.bounds,BGRA(FormTextColor.red,FormTextColor.green,FormTextColor.Blue,128),dmDrawWithTransparency);
     Bitmap.Rectangle(Lightscale.bounds,BGRA(FormTextColor.red,FormTextColor.green,FormTextColor.Blue,128),dmDrawWithTransparency);
-    DrawTriangleCursor(Bitmap, Lightscale.bounds, colorLight div 256);
-  end;
+    LightCursorRect := DrawTriangleCursor(Bitmap, Lightscale.bounds, colorLight div 256);
+  end else LightCursorRect := EmptyRect;
   if (colorCircle.Bmp<>nil) and not LazPaintInstance.BlackAndWhite then
   if (colorCircle.Bmp<>nil) and not LazPaintInstance.BlackAndWhite then
   begin
   begin
     w := Bitmap.TextSize(rsColors).cx;
     w := Bitmap.TextSize(rsColors).cx;
@@ -357,13 +359,14 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFChooseColor.DrawTriangleCursor(dest: TBGRABitmap; bounds: TRect;
-  value: byte);
+function TFChooseColor.DrawTriangleCursor(dest: TBGRABitmap; bounds: TRect;
+  value: byte): TRect;
 var x,y: integer;
 var x,y: integer;
 begin
 begin
-     x := bounds.right+cursormargin;
-     y := bounds.bottom-1 + integer(round(value/255*(bounds.top-(bounds.bottom-1))));
-     dest.FillPolyAntialias([pointF(x,y),pointF(x+cursorsize,y-cursorsize),pointF(x+cursorsize,y+cursorsize)],FormTextColor);
+  x := bounds.right+cursormargin;
+  y := bounds.bottom-1 + integer(round(value/255*(bounds.top-(bounds.bottom-1))));
+  dest.FillPolyAntialias([pointF(x,y),pointF(x+cursorsize,y-cursorsize),pointF(x+cursorsize,y+cursorsize)],FormTextColor);
+  result := rect(floor(x-cursorsize/2),floor(y-cursorsize*1.5),ceil(x+cursorsize*1.5),ceil(y+cursorsize*1.5));
 end;
 end;
 
 
 procedure TFChooseColor.DoSelect(X, Y: integer);
 procedure TFChooseColor.DoSelect(X, Y: integer);

+ 104 - 74
lazpaint/uclipboard.pas

@@ -1,10 +1,19 @@
 unit UClipboard;
 unit UClipboard;
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
-{ $DEFINE DEBUG_CLIPBOARD}
+{$IFDEF DEBUG}
+  {$DEFINE DEBUG_CLIPBOARD}
+{$ENDIF}
 
 
+{$DEFINE HTML_CLIPBOARD_FORMAT}
 {$IFDEF DARWIN}
 {$IFDEF DARWIN}
   {$DEFINE TIFF_CLIPBOARD_FORMAT}
   {$DEFINE TIFF_CLIPBOARD_FORMAT}
+{$ELSE}
+  {$DEFINE BMP_CLIPBOARD_FORMAT}
+  {$DEFINE PNG_CLIPBOARD_FORMAT}
+{$ENDIF}
+{$IFDEF WINDOWS}
+  {$DEFINE PDN_CLIPBOARD_FORMAT}
 {$ENDIF}
 {$ENDIF}
 
 
 interface
 interface
@@ -18,8 +27,10 @@ function ClipboardContainsBitmap: boolean;
 
 
 implementation
 implementation
 
 
-uses Dialogs, BGRABitmapTypes, Clipbrd, Graphics, LCLIntf, LCLType,
-    BGRADNetDeserial, math, GraphType, fphttpclient, FPWriteBMP;
+uses Dialogs, BGRABitmapTypes, Clipbrd, Graphics, LCLIntf, LCLType, GraphType
+    {$IFDEF PDN_CLIPBOARD_FORMAT}, math, BGRADNetDeserial{$ENDIF}
+    {$IFDEF BMP_CLIPBOARD_FORMAT}, FPWriteBMP{$ENDIF}
+    {$IFDEF HTML_CLIPBOARD_FORMAT}, fphttpclient{$ENDIF};
 
 
 {$IFDEF DEBUG_CLIPBOARD}
 {$IFDEF DEBUG_CLIPBOARD}
 const
 const
@@ -31,9 +42,13 @@ const
 var
 var
   tiffClipboardFormat: TClipboardFormat;
   tiffClipboardFormat: TClipboardFormat;
 {$ENDIF}
 {$ENDIF}
-
+{$IFDEF PNG_CLIPBOARD_FORMAT}
+var
+  pngClipboardFormat: TClipboardFormat;
+{$ENDIF}
+{$IFDEF PDN_CLIPBOARD_FORMAT}
 var
 var
-  bgraClipboardFormat: TClipboardFormat;
+  pdnClipboardFormat: TClipboardFormat;
 
 
 function GetBitmapFromPaintDotNetMaskedSurface(deserial: TDotNetDeserialization): TBGRABitmap;
 function GetBitmapFromPaintDotNetMaskedSurface(deserial: TDotNetDeserialization): TBGRABitmap;
 var width,height: integer;
 var width,height: integer;
@@ -121,6 +136,11 @@ begin
     end;
     end;
   end;
   end;
 end;
 end;
+{$ENDIF}
+
+{$IFDEF HTML_CLIPBOARD_FORMAT}
+var
+  htmlClipboardFormat: TClipboardFormat;
 
 
 function WideStringToStr(data: string): string;
 function WideStringToStr(data: string): string;
 var
 var
@@ -330,38 +350,31 @@ begin
   end;
   end;
   tagTokens.Free;
   tagTokens.Free;
 end;
 end;
-
-function SafeClipboardFormatToMimeType(FormatID: TClipboardFormat): string;
-begin
-  try
-    result := ClipboardFormatToMimeType(FormatID);
-  except
-    on ex: Exception do
-      result := '';
-  end;
-end;
+{$ENDIF}
 
 
 function GetBitmapFromClipboard: TBGRABitmap;
 function GetBitmapFromClipboard: TBGRABitmap;
 var i: integer;
 var i: integer;
     Stream: TMemoryStream;
     Stream: TMemoryStream;
+    data: string;
 
 
 {$IFDEF DEBUG_CLIPBOARD}
 {$IFDEF DEBUG_CLIPBOARD}
     j: integer;
     j: integer;
     pcf: TPredefinedClipboardFormat;
     pcf: TPredefinedClipboardFormat;
-    str: string;
+    mime, str: string;
 
 
     c: char;
     c: char;
     prevCok: boolean;
     prevCok: boolean;
 {$ENDIF}
 {$ENDIF}
 
 
+{$IFDEF PDN_CLIPBOARD_FORMAT}
     deserial: TDotNetDeserialization;
     deserial: TDotNetDeserialization;
-    mime, data: string;
+{$ENDIF}
 
 
 begin
 begin
   result := nil;
   result := nil;
 
 
   {$IFDEF DEBUG_CLIPBOARD}
   {$IFDEF DEBUG_CLIPBOARD}
-  str := '';
+  str := 'clipboard.FormatCount = '+inttostr(clipboard.FormatCount)+lineending;
   for i := 0 to clipboard.FormatCount-1 do
   for i := 0 to clipboard.FormatCount-1 do
   begin
   begin
     if str <> '' then str += ', ';
     if str <> '' then str += ', ';
@@ -408,15 +421,13 @@ begin
       str += ']'+lineending;
       str += ']'+lineending;
     end;
     end;
     stream.Free;
     stream.Free;
-
   end;
   end;
   ShowMessage(str);
   ShowMessage(str);
   {$ENDIF}
   {$ENDIF}
 
 
+  {$IFDEF PDN_CLIPBOARD_FORMAT}
   for i := 0 to clipboard.FormatCount-1 do
   for i := 0 to clipboard.FormatCount-1 do
-  begin
-    mime := SafeClipboardFormatToMimeType(Clipboard.Formats[i]);
-    if mime = 'PaintDotNet.MaskedSurface' then
+    if Clipboard.Formats[i] = pdnClipboardFormat then
     begin
     begin
        Stream := TMemoryStream.Create;
        Stream := TMemoryStream.Create;
        Clipboard.GetFormat(Clipboard.Formats[i],Stream);
        Clipboard.GetFormat(Clipboard.Formats[i],Stream);
@@ -430,8 +441,55 @@ begin
        end;
        end;
        deserial.Free;
        deserial.Free;
        if result <> nil then exit;
        if result <> nil then exit;
-    end else
-    if mime = 'text/html' then
+    end;
+  {$ENDIF}
+
+  {$IFDEF TIFF_CLIPBOARD_FORMAT}
+  for i := 0 to clipboard.FormatCount-1 do
+    if Clipboard.Formats[i] = tiffClipboardFormat then
+    begin
+      Stream := TMemoryStream.Create;
+      Clipboard.GetFormat(Clipboard.Formats[i],Stream);
+      Stream.Position := 0;
+      try
+        result := TBGRABitmap.Create;
+        result.LoadFromStream(Stream);
+        if result.Empty then result.AlphaFill(255);
+      except
+        on ex:exception do
+        begin
+          result := nil;
+        end;
+      end;
+      Stream.Free;
+      if result <> nil then exit;
+    end;
+  {$ENDIF}
+
+  {$IFDEF PNG_CLIPBOARD_FORMAT}
+  for i := 0 to clipboard.FormatCount-1 do
+    if Clipboard.Formats[i] = pngClipboardFormat then
+    begin
+      Stream := TMemoryStream.Create;
+      Clipboard.GetFormat(Clipboard.Formats[i],Stream);
+      Stream.Position := 0;
+      try
+        result := TBGRABitmap.Create;
+        result.LoadFromStream(Stream);
+        if result.Empty then result.AlphaFill(255);
+      except
+        on ex:exception do
+        begin
+          result := nil;
+        end;
+      end;
+      Stream.Free;
+      if result <> nil then exit;
+    end;
+  {$ENDIF}
+
+  for i := 0 to clipboard.FormatCount-1 do
+    if Clipboard.Formats[i] = htmlClipboardFormat then
     begin
     begin
        Stream := TMemoryStream.Create;
        Stream := TMemoryStream.Create;
        Clipboard.GetFormat(Clipboard.Formats[i],Stream);
        Clipboard.GetFormat(Clipboard.Formats[i],Stream);
@@ -447,26 +505,6 @@ begin
        end;
        end;
        if result <> nil then exit;
        if result <> nil then exit;
     end;
     end;
-  end;
-
-  for i := 0 to clipboard.FormatCount-1 do
-    if Clipboard.Formats[i] = bgraClipboardFormat then
-    begin
-       Stream := TMemoryStream.Create;
-       Clipboard.GetFormat(Clipboard.Formats[i],Stream);
-       stream.Position := 0;
-       result := TBGRABitmap.Create;
-       try
-         result.Deserialize(Stream);
-       except
-         on ex:exception do
-         begin
-           FreeAndNil(result);
-         end;
-       end;
-       Stream.Free;
-       if result <> nil then exit;
-    end;
 
 
   for i := 0 to clipboard.FormatCount-1 do
   for i := 0 to clipboard.FormatCount-1 do
     if (Clipboard.Formats[i] = PredefinedClipboardFormat(pcfBitmap)) then
     if (Clipboard.Formats[i] = PredefinedClipboardFormat(pcfBitmap)) then
@@ -486,28 +524,6 @@ begin
        Stream.Free;
        Stream.Free;
        if result <> nil then exit;
        if result <> nil then exit;
     end;
     end;
-
-  {$IFDEF TIFF_CLIPBOARD_FORMAT}
-  for i := 0 to clipboard.FormatCount-1 do
-    if Clipboard.Formats[i] = tiffClipboardFormat then
-    begin
-      Stream := TMemoryStream.Create;
-      Clipboard.GetFormat(Clipboard.Formats[i],Stream);
-      Stream.Position := 0;
-      try
-        result := TBGRABitmap.Create;
-        result.LoadFromStream(Stream);
-        if result.Empty then result.AlphaFill(255);
-      except
-        on ex:exception do
-        begin
-          result := nil;
-        end;
-      end;
-      Stream.Free;
-      if result <> nil then exit;
-    end;
-  {$ENDIF}
 end;
 end;
 
 
 function ClipboardContainsBitmap: boolean;
 function ClipboardContainsBitmap: boolean;
@@ -522,10 +538,13 @@ end;
 procedure CopyToClipboard(bmp: TBGRABitmap);
 procedure CopyToClipboard(bmp: TBGRABitmap);
 var
 var
   stream: TMemoryStream;
   stream: TMemoryStream;
+  {$IFDEF BMP_CLIPBOARD_FORMAT}
   bmpWriter: TFPWriterBMP;
   bmpWriter: TFPWriterBMP;
+  {$ENDIF}
 begin
 begin
   Clipboard.Clear;
   Clipboard.Clear;
 
 
+  {$IFDEF BMP_CLIPBOARD_FORMAT}
   stream := TMemoryStream.Create;
   stream := TMemoryStream.Create;
   bmpWriter := TFPWriterBMP.Create;
   bmpWriter := TFPWriterBMP.Create;
   bmpWriter.BitsPerPixel := 32;
   bmpWriter.BitsPerPixel := 32;
@@ -533,11 +552,7 @@ begin
   bmpWriter.Free;
   bmpWriter.Free;
   Clipboard.AddFormat(PredefinedClipboardFormat(pcfBitmap), stream);
   Clipboard.AddFormat(PredefinedClipboardFormat(pcfBitmap), stream);
   stream.Free;
   stream.Free;
-
-  stream := TMemoryStream.Create;
-  bmp.Serialize(stream);
-  Clipboard.AddFormat(bgraClipboardFormat, stream);
-  stream.Free;
+  {$ENDIF}
 
 
   {$IFDEF TIFF_CLIPBOARD_FORMAT}
   {$IFDEF TIFF_CLIPBOARD_FORMAT}
   stream := TMemoryStream.Create;
   stream := TMemoryStream.Create;
@@ -545,15 +560,30 @@ begin
   Clipboard.AddFormat(tiffClipboardFormat, stream);
   Clipboard.AddFormat(tiffClipboardFormat, stream);
   stream.Free;
   stream.Free;
   {$ENDIF}
   {$ENDIF}
+
+  {$IFDEF PNG_CLIPBOARD_FORMAT}
+  stream := TMemoryStream.Create;
+  bmp.SaveToStreamAs(stream, ifPng);
+  Clipboard.AddFormat(pngClipboardFormat, stream);
+  stream.Free;
+  {$ENDIF}
 end;
 end;
 
 
 initialization
 initialization
 
 
-  bgraClipboardFormat := RegisterClipboardFormat('TBGRABitmap');
-
 {$IFDEF TIFF_CLIPBOARD_FORMAT}
 {$IFDEF TIFF_CLIPBOARD_FORMAT}
-  tiffClipboardFormat := RegisterClipboardFormat('image/tiff');
+  tiffClipboardFormat := RegisterClipboardFormat({$IFDEF DARWIN}'public.tiff'{$ELSE}'image/tiff'{$ENDIF});
+{$ENDIF}
+{$IFDEF PNG_CLIPBOARD_FORMAT}
+  pngClipboardFormat := RegisterClipboardFormat({$IFDEF DARWIN}'public.png'{$ELSE}{$IFDEF WINDOWS}'PNG'{$ELSE}'image/png'{$ENDIF}{$ENDIF});
 {$ENDIF}
 {$ENDIF}
+{$IFDEF HTML_CLIPBOARD_FORMAT}
+  htmlClipboardFormat := RegisterClipboardFormat({$IFDEF DARWIN}'public.html'{$ELSE}'text/html'{$ENDIF});
+{$ENDIF}
+{$IFDEF PDN_CLIPBOARD_FORMAT}
+  pdnClipboardFormat := RegisterClipboardFormat('PaintDotNet.MaskedSurface');
+{$ENDIF}
+
 
 
 end.
 end.
 
 

+ 143 - 17
lazpaint/ufilesystem.pas

@@ -28,11 +28,15 @@ const
 
 
   //more Linux file systems
   //more Linux file systems
   fsSysV = 'sysv';     // Unix System V
   fsSysV = 'sysv';     // Unix System V
-  rsXFS = 'XFS';       //IRIX
-  rsJFS = 'JFS';       //AIX journaled file system
-  rsXiaFS = 'xiafs';   //extension of Minix file system
+  fsXFS = 'XFS';       //IRIX
+  fsJFS = 'JFS';       //AIX journaled file system
+  fsXiaFS = 'xiafs';   //extension of Minix file system
   fsReiserFS = 'Reiserfs';  //ReiserFS
   fsReiserFS = 'Reiserfs';  //ReiserFS
 
 
+  //Apple file systems
+  fsAPFS = 'APFS';
+  fsHFS = 'HFS';
+
   //Misc
   //Misc
   fsHPFS = 'HPFS';     // OS/2 'High Performance File System'
   fsHPFS = 'HPFS';     // OS/2 'High Performance File System'
   fsNWFS = 'NWFS';     // Novel NetWare File System
   fsNWFS = 'NWFS';     // Novel NetWare File System
@@ -73,6 +77,7 @@ type
     function RemovePathTrail(ADir: string): string;
     function RemovePathTrail(ADir: string): string;
     procedure RemoveLastPathElement(var ADir: string; out ALastElement: string);
     procedure RemoveLastPathElement(var ADir: string; out ALastElement: string);
     function GetFileSystems: TFileSystemArray;
     function GetFileSystems: TFileSystemArray;
+    function CanGetFileSystems: boolean;
     function MoveToTrash(AForm: TForm; const AFilenamesUTF8: array of string; AConfirmationCallback: TDeleteConfirmationFunction): boolean;
     function MoveToTrash(AForm: TForm; const AFilenamesUTF8: array of string; AConfirmationCallback: TDeleteConfirmationFunction): boolean;
     function CreateFileStream(AFilenameUTF8: string; AMode: Word): TStream; overload;
     function CreateFileStream(AFilenameUTF8: string; AMode: Word): TStream; overload;
     procedure CancelStreamAndFree(AStream: TStream);
     procedure CancelStreamAndFree(AStream: TStream);
@@ -96,7 +101,7 @@ implementation
 uses BGRAUTF8, BGRAWinResource, BGRALazResource, LazFileUtils, Dialogs
 uses BGRAUTF8, BGRAWinResource, BGRALazResource, LazFileUtils, Dialogs
 {$IFDEF WINDOWS}, Windows{$ENDIF}
 {$IFDEF WINDOWS}, Windows{$ENDIF}
 {$IFDEF LINUX}, Process{$ENDIF}
 {$IFDEF LINUX}, Process{$ENDIF}
-;
+{$IFDEF DARWIN}, Process{$ENDIF};
 
 
 type
 type
   TExtendedFilename = record
   TExtendedFilename = record
@@ -104,11 +109,29 @@ type
     SubFilename: string;
     SubFilename: string;
   end;
   end;
 
 
+procedure LinuxBundleToFileSystem(ABundle: string; out AFilesystem: string;
+      out ALongFilenames: boolean; out ACaseSensitive: boolean);
+begin
+  if (ABundle = 'ntfs') or (ABundle = 'fuseblk') then AFilesystem := fsNTFS else
+  if (ABundle = 'msdos') or (ABundle = 'umsdos') or (ABundle='vfat') then AFilesystem := fsFAT else
+  if ABundle = 'iso9660' then AFilesystem:= fsCDFS else
+  if ABundle = 'hpfs' then AFilesystem := fsHPFS else
+  if ABundle = 'udf' then AFilesystem := fsUDF else
+  if ABundle = 'ncp' then AFilesystem := fsNWFS else
+  if ABundle = 'apfs' then AFilesystem := fsAPFS else
+  if ABundle = 'hfs' then AFilesystem := fsHFS else
+  if ABundle = 'exfat' then AFilesystem := fsExFAT else
+    AFilesystem := ABundle;
+  ALongFilenames := (ABundle <> 'minix') and (ABundle <> 'msdos');
+  ACaseSensitive := (ABundle <> 'msdos') and (ABundle <> 'umsdos') and (ABundle <> 'vfat')
+                and (ABundle <> 'exfat');
+end;
+
 {$IFDEF LINUX}
 {$IFDEF LINUX}
-const LinuxFileSystems: array[0..20] of string =
+const LinuxFileSystems: array[0..21] of string =
  ('minix', 'ext2', 'ext3', 'ext4',
  ('minix', 'ext2', 'ext3', 'ext4',
   'sysv', 'XFS', 'JFS', 'xiafs', 'Reiserfs',
   'sysv', 'XFS', 'JFS', 'xiafs', 'Reiserfs',
-  {FAT} 'msdos', 'umsdos', 'vfat', {NTFS} 'ntfs', 'fuseblk',
+  {FAT} 'msdos', 'umsdos', 'vfat', 'exfat', {NTFS} 'ntfs', 'fuseblk',
   {CDFS} 'iso9660', {UDF} 'udf',
   {CDFS} 'iso9660', {UDF} 'udf',
   {HPFS} 'hpfs', {NWFS} 'ncp',
   {HPFS} 'hpfs', {NWFS} 'ncp',
   'nfs', 'smb', 'ncpfs');
   'nfs', 'smb', 'ncpfs');
@@ -179,10 +202,6 @@ begin
               fileSystem := lFileSystem;
               fileSystem := lFileSystem;
               path := UnespacePath(parsedDesc[1]);
               path := UnespacePath(parsedDesc[1]);
               device := parsedDesc[0];
               device := parsedDesc[0];
-              longFilenames := (fileSystem <> 'minix') and
-                (fileSystem <> 'msdos');
-              caseSensitive := (fileSystem <> 'msdos') and
-                (fileSystem <> 'umsdos') and (fileSystem <> 'vfat');
               readonly:= (copy(parsedDesc[3],1,3) <> 'rw,') and (parsedDesc[3]<>'rw');
               readonly:= (copy(parsedDesc[3],1,3) <> 'rw,') and (parsedDesc[3]<>'rw');
 
 
               //detecting device type
               //detecting device type
@@ -221,12 +240,7 @@ begin
                 name := ExtractFileName(path);
                 name := ExtractFileName(path);
 
 
               //formatting file system
               //formatting file system
-              if (fileSystem = 'ntfs') or (fileSystem = 'fuseblk') then fileSystem := fsNTFS else
-              if (fileSystem = 'msdos') or (fileSystem = 'umsdos') or (fileSystem='vfat') then fileSystem := fsFAT else
-              if fileSystem = 'iso9660' then fileSystem:= fsCDFS else
-              if fileSystem = 'hpfs' then fileSystem := fsHPFS else
-              if fileSystem = 'udf' then fileSystem := fsUDF else
-              if fileSystem = 'ncp' then fileSystem := fsNWFS;
+              LinuxBundleToFileSystem(fileSystem, fileSystem, longFilenames, caseSensitive);
             end;
             end;
           end;
           end;
         end;
         end;
@@ -294,6 +308,105 @@ begin
 end;
 end;
 {$ENDIF}
 {$ENDIF}
 
 
+{$IFDEF DARWIN}
+var
+  darwinFilesystemsDate: TDateTime;
+  darwinFilesystemsCached: TFileSystemArray;
+
+function GetDarwinFileSystems: TFileSystemArray;
+  procedure FindDevices;
+  var
+    runResult, headers, curLine, fs, mountPath: string;
+    lines: TStringList;
+    blocksPos, mountedPos, i, endFS: integer;
+    count: integer;
+  begin
+    if not RunCommand('df',['-P'],runResult) then exit;
+    lines := TStringList.Create;
+    lines.Text:= runResult;
+    headers := lines[0];
+    blocksPos := pos('-blocks', headers);
+    mountedPos := pos('Mounted on', headers);
+    if (blocksPos <> 0) and (mountedPos <> 0) then
+    begin
+      inc(blocksPos, 5);
+      count := 0;
+      setlength(result, lines.Count-1);
+      for i := 1 to lines.Count-1 do
+      begin
+        curLine := lines[i];
+        endFS := blocksPos;
+        if endFS > length(curLine) then continue;
+        while (endFS > 1) and (curLine[endFS] in['0'..'9']) do dec(endFS);
+        while (endFS > 1) and (curLine[endFS] in[#0..#32]) do dec(endFS);
+        fs := copy(curLine,1,endFS);
+        if fs.StartsWith('/dev/') then
+        begin
+          mountPath := copy(curLine, mountedPos, length(curLine)-mountedPos+1);
+          if (mountPath <> '/var/vm') and (mountPath <> '/private/var/vm') then
+          begin
+            result[count].path := mountPath;
+            inc(count);
+          end;
+        end;
+      end;
+      setlength(result, count);
+    end;
+    lines.Free;
+  end;
+
+  procedure FetchDiskInfo(var fsi: TFileSystemInfo);
+  var
+    runResult, curLine, key, value: string;
+    lines: TStringList;
+    posColon: SizeInt;
+    i: Integer;
+  begin
+    if not RunCommand('diskutil',['info',fsi.path],runResult) then exit;
+    lines := TStringList.Create;
+    lines.Text:= runResult;
+    fsi.name:= '';
+    fsi.device := '?';
+    fsi.fileSystem := '?';
+    fsi.longFilenames:= true;
+    for i := 0 to lines.Count-1 do
+    begin
+      curLine := lines[i];
+      posColon := pos(':',curLine);
+      if posColon <> 0 then
+      begin
+        key := copy(curLine,1,posColon-1).TrimLeft;
+        value := copy(curLine,posColon+1,length(curLine)-posColon).Trim;
+        if key = 'Optical Drive Type' then fsi.device := rsCdRom else
+        if (key = 'Removable Media') and (fsi.device = '?') then
+        begin
+          if value = 'Fixed' then fsi.device := rsFixedDrive
+          else fsi.device := rsRemovableDrive;
+        end else
+        if key = 'Type (Bundle)' then
+        begin
+          LinuxBundleToFileSystem(value, fsi.fileSystem, fsi.longFilenames, fsi.caseSensitive);
+        end else
+        if key = 'Volume Name' then fsi.name:= value else
+        if key = 'Read-Only Volume' then fsi.readonly:= value='Yes';
+      end;
+    end;
+    lines.Free;
+  end;
+
+var i: integer;
+begin
+  if (darwinFilesystemsDate <> 0) and (Now < darwinFilesystemsDate + (10/(60*60*24))) then
+    exit(darwinFilesystemsCached);
+  result := nil;
+  FindDevices;
+  for i := 0 to high(result) do
+    FetchDiskInfo(result[i]);
+  darwinFilesystemsCached := result;
+  darwinFilesystemsDate:= Now;
+end;
+{$ENDIF}
+
 function TFileManager.RemovePathTrail(ADir: string): string;
 function TFileManager.RemovePathTrail(ADir: string): string;
 begin
 begin
   if (length(ADir)>=1) and (ADir[length(ADir)]=PathDelim) then
   if (length(ADir)>=1) and (ADir[length(ADir)]=PathDelim) then
@@ -328,11 +441,24 @@ begin
     {$IFDEF WINDOWS}
     {$IFDEF WINDOWS}
     result := GetWindowsFileSystems;
     result := GetWindowsFileSystems;
     {$ELSE}
     {$ELSE}
-    result := nil;
+      {$IFDEF DARWIN}
+      result := GetDarwinFileSystems;
+      {$ELSE}
+      result := nil;
+      {$ENDIF}
     {$ENDIF}
     {$ENDIF}
   {$ENDIF}
   {$ENDIF}
 end;
 end;
 
 
+function TFileManager.CanGetFileSystems: boolean;
+begin
+  {$IFDEF DARWIN}
+  result := true;
+  {$ELSE}
+  result := length(GetFileSystems)>0;
+  {$ENDIF}
+end;
+
 {$IFDEF WINDOWS}
 {$IFDEF WINDOWS}
 type
 type
   {$PUSH}{$PACKRECORDS C}
   {$PUSH}{$PACKRECORDS C}

+ 131 - 25
lazpaint/uimagepreview.pas

@@ -33,13 +33,14 @@ type
     FTiff: TTiff;                     //has entries
     FTiff: TTiff;                     //has entries
     FIconCursor: TBGRAIconCursor;     //has entries
     FIconCursor: TBGRAIconCursor;     //has entries
     FThumbnails: TBGRABitmapList;
     FThumbnails: TBGRABitmapList;
+    FDuplicateEntrySourceIndex: integer;
 
 
     FSelectedMenuIndex: integer;
     FSelectedMenuIndex: integer;
     FImageMenu: array of record
     FImageMenu: array of record
                  Area, IconArea: TRect;
                  Area, IconArea: TRect;
                  DeleteArea: TRect;
                  DeleteArea: TRect;
                  FrameIndex: integer;
                  FrameIndex: integer;
-                 IsNew,IsLoopCount: boolean;
+                 IsNew,IsDuplicate,IsLoopCount: boolean;
                end;
                end;
 
 
     FOnValidate: TNotifyEvent;
     FOnValidate: TNotifyEvent;
@@ -63,6 +64,7 @@ type
     procedure ScrollToSelectedMenu;
     procedure ScrollToSelectedMenu;
 
 
     function CanAddNewEntry: boolean;
     function CanAddNewEntry: boolean;
+    function CanDuplicateEntry: boolean;
     function CanDeleteEntry(index: integer): boolean;
     function CanDeleteEntry(index: integer): boolean;
     procedure DeleteEntry(i: integer);
     procedure DeleteEntry(i: integer);
     function GetEntryCount: integer;
     function GetEntryCount: integer;
@@ -70,6 +72,7 @@ type
     function GetEntryHeight(index: integer): integer;
     function GetEntryHeight(index: integer): integer;
     function GetEntryBitDepth(index: integer): integer;
     function GetEntryBitDepth(index: integer): integer;
     function GetEntryBitmap(index: integer): TImageEntry;
     function GetEntryBitmap(index: integer): TImageEntry;
+    procedure SetEntryBitmap(var AEntry: TImageEntry);
     function GetEntryThumbnail(index: integer; stretchWidth, stretchHeight: integer): TBGRABitmap;
     function GetEntryThumbnail(index: integer; stretchWidth, stretchHeight: integer): TBGRABitmap;
 
 
     procedure DrawCurrentFrame(Bitmap: TBGRABitmap);
     procedure DrawCurrentFrame(Bitmap: TBGRABitmap);
@@ -91,6 +94,7 @@ type
     property OnEscape: TNotifyEvent read FOnEscape write FOnEscape;
     property OnEscape: TNotifyEvent read FOnEscape write FOnEscape;
     property EntryCount: integer read GetEntryCount;
     property EntryCount: integer read GetEntryCount;
     function GetPreviewBitmap: TImageEntry;
     function GetPreviewBitmap: TImageEntry;
+    property DuplicateEntrySourceIndex: integer read FDuplicateEntrySourceIndex write FDuplicateEntrySourceIndex;
   end;
   end;
 
 
 implementation
 implementation
@@ -265,7 +269,8 @@ begin
   begin
   begin
     Key := 0;
     Key := 0;
     if (FSelectedMenuIndex >= 0) and (FSelectedMenuIndex <= high(FImageMenu)) and
     if (FSelectedMenuIndex >= 0) and (FSelectedMenuIndex <= high(FImageMenu)) and
-      not FImageMenu[FSelectedMenuIndex].IsNew then
+      not FImageMenu[FSelectedMenuIndex].IsNew and
+      not FImageMenu[FSelectedMenuIndex].IsDuplicate then
     begin
     begin
       DeleteEntry(FImageMenu[FSelectedMenuIndex].FrameIndex);
       DeleteEntry(FImageMenu[FSelectedMenuIndex].FrameIndex);
     end;
     end;
@@ -309,16 +314,31 @@ begin
 end;
 end;
 
 
 procedure TImagePreview.DrawMenu(Bitmap: TBGRABitmap);
 procedure TImagePreview.DrawMenu(Bitmap: TBGRABitmap);
+
+  procedure DrawSheet(x,y,sw,sh: single);
+  var
+    ptsF,ptsF2: ArrayOfTPointF;
+    j: integer;
+  begin
+    ptsF := PointsF([PointF(x+sw*0.20,y+sh*0.1),PointF(x+sw*0.55,y+sh*0.1),PointF(x+sw*0.75,y+sh*0.3),
+                     PointF(x+sw*0.75,y+sh*0.9),PointF(x+sw*0.20,y+sh*0.9)]);
+    setlength(ptsF2,length(ptsF));
+    for j := 0 to high(ptsF) do
+        ptsF2[j] := ptsF[j] + PointF(3,3);
+    bitmap.FillPolyAntialias(ptsF2, BGRA(0,0,0,96));
+    bitmap.FillPolyAntialias(ptsF, BGRAWhite);
+    bitmap.DrawPolygonAntialias(ptsF, BGRABlack, 1.5);
+    bitmap.DrawPolyLineAntialias([PointF(x+sw*0.55,y+sh*0.1),PointF(x+sw*0.55,y+sh*0.3),PointF(x+sw*0.75,y+sh*0.3)], BGRABlack,1.5);
+  end;
+
 var scrollPos, totalHeight, maxScroll, availableWidth: integer;
 var scrollPos, totalHeight, maxScroll, availableWidth: integer;
-  i,j: integer;
+  i: integer;
   x,y,sw,sh: integer;
   x,y,sw,sh: integer;
   textRight, bpp: integer;
   textRight, bpp: integer;
   iconCaption: string;
   iconCaption: string;
-  ptsF,ptsF2: ArrayOfTPointF;
   scrolledArea, inter: TRect;
   scrolledArea, inter: TRect;
 begin
 begin
   if (Bitmap.Width < 8) or (Bitmap.Height < 8) or (GetEntryCount = 0) then exit;
   if (Bitmap.Width < 8) or (Bitmap.Height < 8) or (GetEntryCount = 0) then exit;
-
   if Assigned(FScrollbar) then
   if Assigned(FScrollbar) then
   begin
   begin
     scrollPos := FScrollbar.Position;
     scrollPos := FScrollbar.Position;
@@ -364,10 +384,12 @@ begin
     FSelectedMenuIndex:= -1;
     FSelectedMenuIndex:= -1;
   if (FSelectedMenuIndex = -1) and (length(FImageMenu) > 0) then
   if (FSelectedMenuIndex = -1) and (length(FImageMenu) > 0) then
   begin
   begin
-    if (length(FImageMenu)>=2) and FImageMenu[0].IsNew then
-      FSelectedMenuIndex:= 1 //do not select "add new" entry by default
-    else
-      FSelectedMenuIndex:= 0;
+    FSelectedMenuIndex:= 0;
+    while (FSelectedMenuIndex < length(FImageMenu)) and
+      (FImageMenu[FSelectedMenuIndex].IsNew or FImageMenu[FSelectedMenuIndex].IsDuplicate
+       or FImageMenu[FSelectedMenuIndex].IsLoopCount) do
+      inc(FSelectedMenuIndex);
+    //do not select special entries by default
   end;
   end;
 
 
   for i := 0 to high(FImageMenu) do
   for i := 0 to high(FImageMenu) do
@@ -382,7 +404,7 @@ begin
     if i = FSelectedMenuIndex then
     if i = FSelectedMenuIndex then
     begin
     begin
       bitmap.FillRect(scrolledArea, ColorToRGB(clHighlight));
       bitmap.FillRect(scrolledArea, ColorToRGB(clHighlight));
-      if not IsNew and not IsLoopCount and (Area.Right - IconArea.Right > 32) and CanDeleteEntry(FrameIndex) then
+      if not IsNew and not IsLoopCount and not IsDuplicate and (Area.Right - IconArea.Right > 32) and CanDeleteEntry(FrameIndex) then
       begin
       begin
         sh := (Area.Right - IconArea.Right - 8) div 4;
         sh := (Area.Right - IconArea.Right - 8) div 4;
         if sh < 16 then sh := 16;
         if sh < 16 then sh := 16;
@@ -416,15 +438,13 @@ begin
     end else
     end else
     if IsNew then
     if IsNew then
     begin
     begin
-      ptsF := PointsF([PointF(x+sw*0.20,y+sh*0.1),PointF(x+sw*0.55,y+sh*0.1),PointF(x+sw*0.75,y+sh*0.3),
-                       PointF(x+sw*0.75,y+sh*0.9),PointF(x+sw*0.20,y+sh*0.9)]);
-      setlength(ptsF2,length(ptsF));
-      for j := 0 to high(ptsF) do
-          ptsF2[j] := ptsF[j] + PointF(3,3);
-      bitmap.FillPolyAntialias(ptsF2, BGRA(0,0,0,96));
-      bitmap.FillPolyAntialias(ptsF, BGRAWhite);
-      bitmap.DrawPolygonAntialias(ptsF, BGRABlack, 1.5);
-      bitmap.DrawPolyLineAntialias([PointF(x+sw*0.55,y+sh*0.1),PointF(x+sw*0.55,y+sh*0.3),PointF(x+sw*0.75,y+sh*0.3)], BGRABlack,1.5);
+      DrawSheet(x,y,sw,sh);
+    end else
+    if IsDuplicate then
+    begin
+      DrawSheet(x-sw*0.15,y-sh*0.1,sw,sh*0.9);
+      DrawSheet(x+sw*0.1,y+sh*0.1,sw,sh*0.9);
+      bitmap.FontFullHeight:= round(sh*0.7);
     end else
     end else
     begin
     begin
       bitmap.FillRect(rect(x+2,y+2, x+sw+2,y+sh+2), BGRA(0,0,0,96), dmDrawWithTransparency);
       bitmap.FillRect(rect(x+2,y+2, x+sw+2,y+sh+2), BGRA(0,0,0,96), dmDrawWithTransparency);
@@ -432,6 +452,7 @@ begin
     end;
     end;
 
 
     if IsNew then iconCaption := rsNewImage else
     if IsNew then iconCaption := rsNewImage else
+    if IsDuplicate then iconCaption := rsDuplicateImage else
     if IsLoopCount then
     if IsLoopCount then
     begin
     begin
       iconCaption:= rsLoopCount+': ';
       iconCaption:= rsLoopCount+': ';
@@ -466,7 +487,8 @@ end;
 
 
 function TImagePreview.TryMenuLayout(AWidth: integer; AColCount, ABottom: integer): integer;
 function TImagePreview.TryMenuLayout(AWidth: integer; AColCount, ABottom: integer): integer;
 var x,y,i,frameIndex,h,w,sw,sh: integer;
 var x,y,i,frameIndex,h,w,sw,sh: integer;
-  newItem, LoopCountItem, colLeft,colRight, maxWidth, maxHeight: integer;
+  newItem, LoopCountItem, DuplicateItem,
+  colLeft,colRight, maxWidth, maxHeight: integer;
   currentCol: integer;
   currentCol: integer;
 
 
   procedure ComputeColumn;
   procedure ComputeColumn;
@@ -490,8 +512,9 @@ begin
 
 
   if Assigned(FAnimatedGif) then LoopCountItem := 1 else LoopCountItem:= 0;
   if Assigned(FAnimatedGif) then LoopCountItem := 1 else LoopCountItem:= 0;
   if CanAddNewEntry then NewItem := 1 else NewItem := 0;
   if CanAddNewEntry then NewItem := 1 else NewItem := 0;
-  setlength(FImageMenu, GetEntryCount + NewItem + LoopCountItem);
-  for i := 0 to GetEntryCount-1 + NewItem + LoopCountItem do
+  if CanDuplicateEntry then DuplicateItem := 1 else DuplicateItem := 0;
+  setlength(FImageMenu, GetEntryCount + LoopCountItem + NewItem + DuplicateItem);
+  for i := 0 to high(FImageMenu) do
   begin
   begin
     if (LoopCountItem = 1) and (i = 0) then
     if (LoopCountItem = 1) and (i = 0) then
     begin
     begin
@@ -508,8 +531,16 @@ begin
       h := 32;
       h := 32;
     end
     end
     else
     else
+    if (DuplicateItem = 1) and (i = LoopCountItem + NewItem) then
     begin
     begin
-      frameIndex := i-NewItem-LoopCountItem;
+      frameIndex := GetEntryCount;
+      FImageMenu[i].IsDuplicate := true;
+      w := 32;
+      h := 32;
+    end
+    else
+    begin
+      frameIndex := i-NewItem-LoopCountItem-DuplicateItem;
       w := GetEntryWidth(frameIndex);
       w := GetEntryWidth(frameIndex);
       h := GetEntryHeight(frameIndex);
       h := GetEntryHeight(frameIndex);
     end;
     end;
@@ -549,6 +580,12 @@ begin
   result := Assigned(FIconCursor) or Assigned(FTiff) or Assigned(FAnimatedGif);
   result := Assigned(FIconCursor) or Assigned(FTiff) or Assigned(FAnimatedGif);
 end;
 end;
 
 
+function TImagePreview.CanDuplicateEntry: boolean;
+begin
+  result := (Assigned(FTiff) or Assigned(FAnimatedGif)) and
+    (FDuplicateEntrySourceIndex >= 0) and (FDuplicateEntrySourceIndex < EntryCount);
+end;
+
 function TImagePreview.GetEntryCount: integer;
 function TImagePreview.GetEntryCount: integer;
 begin
 begin
   if Assigned(FIconCursor) then
   if Assigned(FIconCursor) then
@@ -641,6 +678,56 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TImagePreview.SetEntryBitmap(var AEntry: TImageEntry);
+var
+  sAddedTiff: TMemoryStream;
+  addedTiff: TTiff;
+  sOut: TStream;
+begin
+  if (AEntry.frameIndex < 0) or (AEntry.frameIndex > GetEntryCount) then
+    raise exception.Create('Index out of bounds');
+  if Filename = '' then raise exception.create('Filename undefined');
+
+  if Assigned(FTiff) then
+  begin
+    addedTiff := TTiff.Create;
+    sAddedTiff := TMemoryStream.Create;
+    try
+      AEntry.bmp.SaveToStreamAs(sAddedTiff, ifTiff);
+      sAddedTiff.Position:= 0;
+      if addedTiff.LoadFromStream(sAddedTiff) <> teNone then
+        raise Exception.Create(rsInternalError);
+      if AEntry.frameIndex > FTiff.Count then
+        AEntry.frameIndex := FTiff.Count;
+      FTiff.Move(addedTiff,0, AEntry.frameIndex);
+
+      sOut := FileManager.CreateFileStream(Filename,fmCreate);
+      try
+        FTiff.SaveToStream(sOut);
+      finally
+        sOut.Free;
+      end;
+    finally
+      sAddedTiff.Free;
+      addedTiff.Free;
+    end;
+  end else
+  if Assigned(FAnimatedGif) then
+  begin
+    if AEntry.frameIndex >= FAnimatedGif.Count then
+      AEntry.frameIndex := FAnimatedGif.AddFullFrame(AEntry.bmp, FAnimatedGif.AverageDelayMs)
+    else
+      FAnimatedGif.ReplaceFullFrame(AEntry.frameIndex, AEntry.bmp, FAnimatedGif.FrameDelayMs[AEntry.frameIndex]);
+
+    sOut := FileManager.CreateFileStream(Filename,fmCreate);
+    try
+      FAnimatedGif.SaveToStream(sOut);
+    finally
+      sOut.Free;
+    end;
+  end;
+end;
+
 function TImagePreview.GetEntryThumbnail(index: integer; stretchWidth, stretchHeight: integer): TBGRABitmap;
 function TImagePreview.GetEntryThumbnail(index: integer; stretchWidth, stretchHeight: integer): TBGRABitmap;
 var
 var
   entry: TImageEntry;
   entry: TImageEntry;
@@ -749,6 +836,7 @@ var reader: TFPCustomImageReader;
   jpegReader: TBGRAReaderJpeg;
   jpegReader: TBGRAReaderJpeg;
   source: TStream;
   source: TStream;
   svg: TBGRASVG;
   svg: TBGRASVG;
+  tr: TTiffError;
 begin
 begin
   if FInUpdatePreview then
   if FInUpdatePreview then
   begin
   begin
@@ -775,8 +863,9 @@ begin
         begin
         begin
           try
           try
             FTiff := TTiff.Create;
             FTiff := TTiff.Create;
-            if FTiff.LoadFromStream(source) <> teNone then
-              raise exception.Create(rsCannotOpenFile);
+            tr := FTiff.LoadFromStream(source);
+            if tr <> teNone then
+              raise exception.Create(rsCannotOpenFile+' (TIFF '+inttostr(ord(tr))+')');
 
 
             FImageNbLayers := 1;
             FImageNbLayers := 1;
             if FTiff.Count = 0 then
             if FTiff.Count = 0 then
@@ -978,6 +1067,7 @@ begin
   FStatus := AStatus;
   FStatus := AStatus;
   FAnimate:= AAnimate;
   FAnimate:= AAnimate;
   FSelectedMenuIndex := -1;
   FSelectedMenuIndex := -1;
+  FDuplicateEntrySourceIndex := -1;
   {$IFDEF WINDOWS}
   {$IFDEF WINDOWS}
   ASurface.Color := clAppWorkspace;
   ASurface.Color := clAppWorkspace;
   {$ENDIF}
   {$ENDIF}
@@ -1093,6 +1183,14 @@ begin
             result.frameIndex:= TImageEntry.NewFrameIndex;
             result.frameIndex:= TImageEntry.NewFrameIndex;
           end;
           end;
         end else
         end else
+        if FImageMenu[FSelectedMenuIndex].IsDuplicate then
+        begin
+          result := GetEntryBitmap(DuplicateEntrySourceIndex);
+          result.frameIndex:= GetEntryCount;
+          result.isDuplicate:= true;
+          SetEntryBitmap(result);
+        end
+        else
           result := GetEntryBitmap(FImageMenu[FSelectedMenuIndex].FrameIndex);
           result := GetEntryBitmap(FImageMenu[FSelectedMenuIndex].FrameIndex);
       end;
       end;
     end else
     end else
@@ -1120,6 +1218,14 @@ begin
               result.bmp := TBGRABitmap.Create(FAnimatedGif.Width,FAnimatedGif.Height,BGRAPixelTransparent);
               result.bmp := TBGRABitmap.Create(FAnimatedGif.Width,FAnimatedGif.Height,BGRAPixelTransparent);
               result.frameIndex:= TImageEntry.NewFrameIndex;
               result.frameIndex:= TImageEntry.NewFrameIndex;
           end else
           end else
+          if FImageMenu[FSelectedMenuIndex].IsDuplicate then
+          begin
+            result := GetEntryBitmap(DuplicateEntrySourceIndex);
+            result.frameIndex:= GetEntryCount;
+            result.isDuplicate:= true;
+            SetEntryBitmap(result);
+          end
+          else
             result := GetEntryBitmap(FImageMenu[FSelectedMenuIndex].FrameIndex);
             result := GetEntryBitmap(FImageMenu[FSelectedMenuIndex].FrameIndex);
         end;
         end;
       end else
       end else

+ 8 - 1
lazpaint/uimageview.pas

@@ -49,6 +49,7 @@ type
     procedure PictureSelectionChanged({%H-}sender: TLazPaintImage; const ARect: TRect);
     procedure PictureSelectionChanged({%H-}sender: TLazPaintImage; const ARect: TRect);
     procedure PaintVirtualScreenCursor({%H-}ACanvasOfs: TPoint; {%H-}AWorkArea: TRect; {%H-}AWinControlOfs: TPoint; {%H-}AWinControl: TWinControl);
     procedure PaintVirtualScreenCursor({%H-}ACanvasOfs: TPoint; {%H-}AWorkArea: TRect; {%H-}AWinControlOfs: TPoint; {%H-}AWinControl: TWinControl);
     function GetRectToInvalidate(AInvalidateAll: boolean; AWorkArea: TRect): TRect;
     function GetRectToInvalidate(AInvalidateAll: boolean; AWorkArea: TRect): TRect;
+    function GetPictureCoordsDefined: boolean;
   public
   public
     constructor Create(AInstance: TLazPaintCustomInstance; AZoom: TZoom; ACanvas: TCanvas);
     constructor Create(AInstance: TLazPaintCustomInstance; AZoom: TZoom; ACanvas: TCanvas);
     destructor Destroy; override;
     destructor Destroy; override;
@@ -71,6 +72,7 @@ type
     property FillSelectionHighlight: boolean read GetFillSelectionHighlight write SetFillSelectionHighlight;
     property FillSelectionHighlight: boolean read GetFillSelectionHighlight write SetFillSelectionHighlight;
     property ShowSelection: boolean read FShowSelection write SetShowSelection;
     property ShowSelection: boolean read FShowSelection write SetShowSelection;
     property WorkspaceColor: TColor read GetWorkspaceColor;
     property WorkspaceColor: TColor read GetWorkspaceColor;
+    property PictureCoordsDefined: boolean read GetPictureCoordsDefined;
   end;
   end;
 
 
 implementation
 implementation
@@ -101,6 +103,11 @@ begin
   Image.ImageMayChangeCompletely;
   Image.ImageMayChangeCompletely;
 end;
 end;
 
 
+function TImageView.GetPictureCoordsDefined: boolean;
+begin
+  result := FLastPictureParameters.defined;
+end;
+
 function TImageView.GetImage: TLazPaintImage;
 function TImageView.GetImage: TLazPaintImage;
 begin
 begin
   result := FInstance.Image;
   result := FInstance.Image;
@@ -531,7 +538,7 @@ var virtualScreenPenCursorBefore: boolean;
       PtInRect(FLastPictureParameters.scaledArea, Point(X,Y)) then
       PtInRect(FLastPictureParameters.scaledArea, Point(X,Y)) then
     begin
     begin
       FPenCursorVisible := True;
       FPenCursorVisible := True;
-      wantedCursor := crNone;
+      {$IFNDEF DARWIN}wantedCursor := crNone;{$ENDIF}
       result := true;
       result := true;
     end else
     end else
       result := false;
       result := false;

+ 9 - 8
lazpaint/ulayerstack.pas

@@ -167,24 +167,25 @@ begin
   if ASelected then
   if ASelected then
   begin
   begin
     result.NameRect := rect(layerpos.X+round(LayerRectWidth*0.95),layerpos.Y,layerpos.X+StackWidth,layerPos.Y+LayerRectHeight div 2);
     result.NameRect := rect(layerpos.X+round(LayerRectWidth*0.95),layerpos.Y,layerpos.X+StackWidth,layerPos.Y+LayerRectHeight div 2);
-    barwidth := StackWidth-InterruptorWidth-Int32or64(round(LayerRectWidth*1.1));
-    if barwidth > LayerRectWidth then barwidth := LayerRectWidth;
-    result.OpacityBar := rect(layerpos.X+LayerRectWidth,layerpos.Y+LayerRectHeight div 2,layerpos.X+LayerRectWidth+barwidth,layerpos.Y+LayerRectHeight);
-    rOpacity := rect(result.OpacityBar.left,(result.OpacityBar.top*7+result.OpacityBar.bottom) div 8,result.OpacityBar.right,
-        (result.OpacityBar.top+result.OpacityBar.bottom*7) div 8);
+    barwidth := StackWidth-InterruptorWidth-round(LayerRectWidth*0.92)-ABitmap.FontFullHeight div 2;
+    result.OpacityBar := rect(layerpos.X+round(LayerRectWidth*0.92),layerpos.Y+LayerRectHeight div 2,
+                              layerpos.X+round(LayerRectWidth*0.92)+barwidth,layerpos.Y+LayerRectHeight);
+    rOpacity := rect(result.OpacityBar.left,(result.OpacityBar.top*7+result.OpacityBar.bottom) div 8,
+                     result.OpacityBar.right,(result.OpacityBar.top+result.OpacityBar.bottom*7) div 8);
     ABitmap.Rectangle(rOpacity,lColor,dmSet);
     ABitmap.Rectangle(rOpacity,lColor,dmSet);
     rOpacity.Inflate(-1,-1);
     rOpacity.Inflate(-1,-1);
     bmpOpacity := TBGRABitmap.Create(rOpacity.Width,rOpacity.Height,BGRABlack);
     bmpOpacity := TBGRABitmap.Create(rOpacity.Width,rOpacity.Height,BGRABlack);
     rFill := rect(0,0,round(bmpOpacity.Width*LazPaintInstance.Image.LayerOpacity[LayerIndex]/255),bmpOpacity.Height);
     rFill := rect(0,0,round(bmpOpacity.Width*LazPaintInstance.Image.LayerOpacity[LayerIndex]/255),bmpOpacity.Height);
     bmpOpacity.ClipRect := rFill;
     bmpOpacity.ClipRect := rFill;
     bmpOpacity.FillRect(rFill, CSSSilver,dmSet);
     bmpOpacity.FillRect(rFill, CSSSilver,dmSet);
-    bmpOpacity.FontFullHeight := bmpOpacity.Height;
+    bmpOpacity.FontFullHeight := min(bmpOpacity.Height, ABitmap.FontFullHeight*2);
     bmpOpacity.FontName := ABitmap.FontName;
     bmpOpacity.FontName := ABitmap.FontName;
     bmpOpacity.FontStyle:= [fsBold];
     bmpOpacity.FontStyle:= [fsBold];
+    bmpOpacity.FontVerticalAnchor:= fvaCenter;
     percentStr := IntToStr(round(LazPaintInstance.Image.LayerOpacity[LayerIndex]*100/255))+'%';
     percentStr := IntToStr(round(LazPaintInstance.Image.LayerOpacity[LayerIndex]*100/255))+'%';
-    bmpOpacity.TextOut(bmpOpacity.Width/2,0, percentStr, BGRABlack, taCenter);
+    bmpOpacity.TextOut(bmpOpacity.Width/2,bmpOpacity.Height/2, percentStr, BGRABlack, taCenter);
     bmpOpacity.ClipRect := rect(rFill.Right,rFill.Top,bmpOpacity.Width,rFill.Bottom);
     bmpOpacity.ClipRect := rect(rFill.Right,rFill.Top,bmpOpacity.Width,rFill.Bottom);
-    bmpOpacity.TextOut(bmpOpacity.Width/2,0, percentStr, BGRAWhite, taCenter);
+    bmpOpacity.TextOut(bmpOpacity.Width/2,bmpOpacity.Height/2, percentStr, BGRAWhite, taCenter);
     ABitmap.FillMask(rOpacity.Left,rOpacity.Top,bmpOpacity, lColor, dmDrawWithTransparency);
     ABitmap.FillMask(rOpacity.Left,rOpacity.Top,bmpOpacity, lColor, dmDrawWithTransparency);
     bmpOpacity.Free;
     bmpOpacity.Free;
   end
   end

+ 1 - 1
lazpaint/umenu.pas

@@ -372,7 +372,7 @@ begin
 end;
 end;
 
 
 procedure TMainFormMenu.Apply;
 procedure TMainFormMenu.Apply;
-const ImageBrowser = {$IFNDEF DARWIN}'FileUseImageBrowser,'{$ELSE}''{$ENDIF};
+const ImageBrowser = 'FileUseImageBrowser,';
 var i,j,tbHeight,tbHeightOrig: NativeInt;
 var i,j,tbHeight,tbHeightOrig: NativeInt;
 begin
 begin
   for i := 0 to FActionList.ActionCount-1 do
   for i := 0 to FActionList.ActionCount-1 do

+ 9 - 4
lazpaint/uresourcestrings.pas

@@ -63,6 +63,7 @@ resourcestring
   rsMergeSelection='Do you want to merge selection?';
   rsMergeSelection='Do you want to merge selection?';
   rsSave='Save';
   rsSave='Save';
   rsNewImage='New image';
   rsNewImage='New image';
+  rsDuplicateImage='Duplicate image';
   rsOpen='Open';
   rsOpen='Open';
   rsReload='Reload';
   rsReload='Reload';
   rsReloadChanged='Bitmap has been modified. Do you really want to reload?';
   rsReloadChanged='Bitmap has been modified. Do you really want to reload?';
@@ -73,12 +74,16 @@ resourcestring
   rsLatestVersion = 'The latest version of LazPaint available online is';
   rsLatestVersion = 'The latest version of LazPaint available online is';
   rsMustReleaseSelection = 'You must first release the selection';
   rsMustReleaseSelection = 'You must first release the selection';
   rsMustShowLayer = 'You must first make the layer visible';
   rsMustShowLayer = 'You must first make the layer visible';
-  rsHoldShiftForSquare = 'Hold SHIFT to draw a square or a circle';
-  rsHoldCtrlSnapToPixel = 'Hold CTRL to snap to pixels';
+  rsCtrl = 'CTRL';
+  rsAlt = 'ALT';
+  rsShift = 'SHIFT';
+  rsCmd = 'CMD';
+  rsHoldKeyForSquare = 'Hold %1 to draw a square or a circle';
+  rsHoldKeySnapToPixel = 'Hold %1 to snap to pixels';
   rsReturnValides = 'Press ENTER to validate';
   rsReturnValides = 'Press ENTER to validate';
   rsBackspaceRemoveLastPoint = 'Press BACKSPACE to remove last point';
   rsBackspaceRemoveLastPoint = 'Press BACKSPACE to remove last point';
-  rsCtrlRestrictRotation = 'Hold CTRL to restrict rotation angle';
-  rsAltShiftScaleMode = 'Hold ALT or SHIFT to scale';
+  rsHoldKeyRestrictRotation = 'Hold %1 to restrict rotation angle';
+  rsHoldKeysScaleMode = 'Hold %1 or %2 to scale';
   rsCurveModeHint = 'Press S or X to set the curve mode of the last point';
   rsCurveModeHint = 'Press S or X to set the curve mode of the last point';
   rsBlendOpNotUsedForBackground = 'The blend operation is applied only if there is a layer underneath';
   rsBlendOpNotUsedForBackground = 'The blend operation is applied only if there is a layer underneath';
   rsRightClickForSource = 'Use RIGHT click to define source';
   rsRightClickForSource = 'Use RIGHT click to define source';

+ 22 - 0
lazpaint/uscripting.pas

@@ -51,6 +51,7 @@ type
     function GetSubsetByName(const AName: string): TVariableSet;
     function GetSubsetByName(const AName: string): TVariableSet;
     function GetListByName(const AName: string): string;
     function GetListByName(const AName: string): string;
     function GetVariablesAsString: string;
     function GetVariablesAsString: string;
+    function GetVarName(AIndex: integer): string;
     procedure SetBooleanByName(const AName: string; AValue: boolean);
     procedure SetBooleanByName(const AName: string; AValue: boolean);
     procedure SetFloatByName(const AName: string; AValue: double);
     procedure SetFloatByName(const AName: string; AValue: double);
     procedure SetIntegerByName(const AName: string; AValue: TScriptInteger);
     procedure SetIntegerByName(const AName: string; AValue: TScriptInteger);
@@ -126,6 +127,7 @@ type
     function CopyValuesTo(ASet: TVariableSet): boolean;
     function CopyValuesTo(ASet: TVariableSet): boolean;
     property FunctionName: string read FFunctionName;
     property FunctionName: string read FFunctionName;
     property Count: NativeInt read GetCount;
     property Count: NativeInt read GetCount;
+    property VariableName[AIndex: integer]: string read GetVarName;
     property VariablesAsString: string read GetVariablesAsString;
     property VariablesAsString: string read GetVariablesAsString;
     property Floats[const AName: string]: double read GetFloatByName write SetFloatByName;
     property Floats[const AName: string]: double read GetFloatByName write SetFloatByName;
     property Integers[const AName: string]: TScriptInteger read GetIntegerByName write SetIntegerByName;
     property Integers[const AName: string]: TScriptInteger read GetIntegerByName write SetIntegerByName;
@@ -386,6 +388,26 @@ begin
 
 
 end;
 end;
 
 
+function TVariableSet.GetVarName(AIndex: integer): string;
+begin
+  if AIndex < 0 then raise exception.Create('Index out of bounds');
+
+  if AIndex < FNbScalars then exit(FScalars[AIndex].name)
+  else dec(AIndex, FNbScalars);
+  if AIndex < FNbStrings then exit(FStrings[AIndex].name)
+  else dec(AIndex, FNbStrings);
+  if AIndex < FNbBoolLists then exit(FBoolLists[AIndex].name)
+  else dec(AIndex, FNbBoolLists);
+  if AIndex < FNbScalarLists then exit(FScalarLists[AIndex].name)
+  else dec(AIndex, FNbScalarLists);
+  if AIndex < FNbStrLists then exit(FStrLists[AIndex].name)
+  else dec(AIndex, FNbStrLists);
+  if AIndex < FNbSubsets then exit(FSubsets[AIndex].name)
+  else dec(AIndex, FNbSubsets);
+
+  raise exception.Create('Index out of bounds');
+end;
+
 function TVariableSet.LoadFromVariablesAsString(AVariablesAsString: string
 function TVariableSet.LoadFromVariablesAsString(AVariablesAsString: string
   ): TInterpretationErrors;
   ): TInterpretationErrors;
 var varName: string;
 var varName: string;

+ 7 - 3
lazpaint/utiff.pas

@@ -466,6 +466,8 @@ begin
 
 
   subError := LoadChunkList(AInput, TiffTagFreeOffsets, TiffTagFreeByteCounts, FFreeChunks);
   subError := LoadChunkList(AInput, TiffTagFreeOffsets, TiffTagFreeByteCounts, FFreeChunks);
   if subError <> teNone then Exit(subError);
   if subError <> teNone then Exit(subError);
+
+  result := teNone;
 end;
 end;
 
 
 procedure TTiffImageDirectory.SaveChunks(AOutput: TTiffIO);
 procedure TTiffImageDirectory.SaveChunks(AOutput: TTiffIO);
@@ -1143,6 +1145,7 @@ begin
         AList.Add(mem);
         AList.Add(mem);
     end;
     end;
   end;
   end;
+  result := teNone;
 end;
 end;
 
 
 procedure TTiffDirectory.SaveChunkList(AOutput: TTiffIO; ATagOffsets,
 procedure TTiffDirectory.SaveChunkList(AOutput: TTiffIO; ATagOffsets,
@@ -1365,15 +1368,15 @@ end;
 
 
 function TTiff.LoadImageEntries(var AInput: TTiffIO; AFirstImagePos: LongWord
 function TTiff.LoadImageEntries(var AInput: TTiffIO; AFirstImagePos: LongWord
   ): TTiffError;
   ): TTiffError;
-type TIntegerList = specialize TFPGList<integer>;
+type TLongwordList = specialize TFPGList<Longword>;
 var
 var
   curImagePos, nextImagePos: LongWord;
   curImagePos, nextImagePos: LongWord;
-  previousPositions: TIntegerList;
+  previousPositions: TLongwordList;
   newEntry: TTiffImageDirectory;
   newEntry: TTiffImageDirectory;
   i: Integer;
   i: Integer;
   subError: TTiffError;
   subError: TTiffError;
 begin
 begin
-  previousPositions := TIntegerList.Create;
+  previousPositions := TLongwordList.Create;
   try
   try
     curImagePos := AFirstImagePos;
     curImagePos := AFirstImagePos;
     repeat
     repeat
@@ -1403,6 +1406,7 @@ begin
   finally
   finally
     previousPositions.Free;
     previousPositions.Free;
   end;
   end;
+  result := teNone;
 end;
 end;
 
 
 constructor TTiff.Create;
 constructor TTiff.Create;

+ 17 - 7
lazpaintcontrols/lcvectorclipboard.pas

@@ -5,10 +5,10 @@ unit LCVectorClipboard;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, Clipbrd, LCLType, LCVectorOriginal;
+  Classes, SysUtils, Clipbrd, LCLType, LCVectorOriginal, BGRATransform;
 
 
-function CopyShapesToClipboard(AShapes: array of TVectorShape): boolean;
-procedure PasteShapesFromClipboard(ATargetContainer: TVectorOriginal);
+function CopyShapesToClipboard(AShapes: array of TVectorShape; const AMatrix: TAffineMatrix): boolean;
+procedure PasteShapesFromClipboard(ATargetContainer: TVectorOriginal; const ATargetMatrix: TAffineMatrix);
 function ClipboardHasShapes: boolean;
 function ClipboardHasShapes: boolean;
 
 
 implementation
 implementation
@@ -16,11 +16,12 @@ implementation
 var
 var
   vectorClipboardFormat : TClipboardFormat;
   vectorClipboardFormat : TClipboardFormat;
 
 
-function CopyShapesToClipboard(AShapes: array of TVectorShape): boolean;
+function CopyShapesToClipboard(AShapes: array of TVectorShape; const AMatrix: TAffineMatrix): boolean;
 var
 var
   tempContainer: TVectorOriginal;
   tempContainer: TVectorOriginal;
   mem: TMemoryStream;
   mem: TMemoryStream;
   i: Integer;
   i: Integer;
+  s: TVectorShape;
 begin
 begin
   result:= false;
   result:= false;
   if length(AShapes)=0 then exit;
   if length(AShapes)=0 then exit;
@@ -28,7 +29,11 @@ begin
   mem := TMemoryStream.Create;
   mem := TMemoryStream.Create;
   try
   try
     for i := 0 to high(AShapes) do
     for i := 0 to high(AShapes) do
-      tempContainer.AddShape(AShapes[i].Duplicate);
+    begin
+      s := AShapes[i].Duplicate;
+      s.Transform(AMatrix);
+      tempContainer.AddShape(s);
+    end;
     tempContainer.SaveToStream(mem);
     tempContainer.SaveToStream(mem);
     Clipboard.Clear;
     Clipboard.Clear;
     mem.Position:= 0;
     mem.Position:= 0;
@@ -39,13 +44,16 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure PasteShapesFromClipboard(ATargetContainer: TVectorOriginal);
+procedure PasteShapesFromClipboard(ATargetContainer: TVectorOriginal; const ATargetMatrix: TAffineMatrix);
 var
 var
   tempContainer: TVectorOriginal;
   tempContainer: TVectorOriginal;
   mem: TMemoryStream;
   mem: TMemoryStream;
   i: Integer;
   i: Integer;
   pastedShape: TVectorShape;
   pastedShape: TVectorShape;
+  invMatrix: TAffineMatrix;
 begin
 begin
+  if not IsAffineMatrixInversible(ATargetMatrix) then exit;
+  invMatrix := AffineMatrixInverse(ATargetMatrix);
   if Clipboard.HasFormat(vectorClipboardFormat) then
   if Clipboard.HasFormat(vectorClipboardFormat) then
   begin
   begin
     mem := TMemoryStream.Create;
     mem := TMemoryStream.Create;
@@ -58,8 +66,10 @@ begin
         for i := 0 to tempContainer.ShapeCount-1 do
         for i := 0 to tempContainer.ShapeCount-1 do
         begin
         begin
           pastedShape := tempContainer.Shape[i].Duplicate;
           pastedShape := tempContainer.Shape[i].Duplicate;
+          pastedShape.Transform(invMatrix);
           ATargetContainer.AddShape(pastedShape);
           ATargetContainer.AddShape(pastedShape);
-          ATargetContainer.SelectShape(pastedShape);
+          if i = tempContainer.ShapeCount-1 then
+            ATargetContainer.SelectShape(pastedShape);
         end;
         end;
       end;
       end;
     finally
     finally

+ 12 - 1
lazpaintcontrols/lcvectorialfill.pas

@@ -109,6 +109,7 @@ type
     function Duplicate: TVectorialFill; virtual;
     function Duplicate: TVectorialFill; virtual;
     destructor Destroy; override;
     destructor Destroy; override;
     function Equals(Obj: TObject): boolean; override;
     function Equals(Obj: TObject): boolean; override;
+    class function Equal(AFill1, AFill2: TVectorialFill): boolean;
     procedure Assign(Obj: TObject);
     procedure Assign(Obj: TObject);
     property FillType: TVectorialFillType read GetFillType;
     property FillType: TVectorialFillType read GetFillType;
     property IsEditable: boolean read GetIsEditable;
     property IsEditable: boolean read GetIsEditable;
@@ -171,7 +172,7 @@ end;
 
 
 function TVectorialFillDiff.IsIdentity: boolean;
 function TVectorialFillDiff.IsIdentity: boolean;
 begin
 begin
-  result := FStart.Equals(FEnd);
+  result := TVectorialFill.Equal(FStart,FEnd);
 end;
 end;
 
 
 function TVectorialFillDiff.CanAppend(ADiff: TCustomVectorialFillDiff
 function TVectorialFillDiff.CanAppend(ADiff: TCustomVectorialFillDiff
@@ -615,6 +616,16 @@ begin
     result:= false;
     result:= false;
 end;
 end;
 
 
+class function TVectorialFill.Equal(AFill1, AFill2: TVectorialFill): boolean;
+begin
+  if AFill1 = nil then
+  begin
+    if AFill2 = nil then result := true
+    else result := (AFill2.FillType = vftNone);
+  end else
+    result := AFill1.Equals(AFill2);
+end;
+
 procedure TVectorialFill.Assign(Obj: TObject);
 procedure TVectorialFill.Assign(Obj: TObject);
 var
 var
   other: TVectorialFill;
   other: TVectorialFill;

+ 61 - 7
lazpaintcontrols/lcvectororiginal.pas

@@ -15,6 +15,7 @@ const
   InfiniteRect : TRect = (Left: -MaxLongInt; Top: -MaxLongInt; Right: MaxLongInt; Bottom: MaxLongInt);
   InfiniteRect : TRect = (Left: -MaxLongInt; Top: -MaxLongInt; Right: MaxLongInt; Bottom: MaxLongInt);
   EmptyTextureId = 0;
   EmptyTextureId = 0;
   DefaultShapeOutlineWidth = 2;
   DefaultShapeOutlineWidth = 2;
+  MediumShapeCost = 100;
 
 
 type
 type
   TVectorOriginal = class;
   TVectorOriginal = class;
@@ -179,6 +180,7 @@ type
     procedure LoadFill(AStorage: TBGRACustomOriginalStorage; AObjectName: string; var AValue: TVectorialFill);
     procedure LoadFill(AStorage: TBGRACustomOriginalStorage; AObjectName: string; var AValue: TVectorialFill);
     procedure SaveFill(AStorage: TBGRACustomOriginalStorage; AObjectName: string; AValue: TVectorialFill);
     procedure SaveFill(AStorage: TBGRACustomOriginalStorage; AObjectName: string; AValue: TVectorialFill);
     function ComputeStroke(APoints: ArrayOfTPointF; AClosed: boolean; AStrokeMatrix: TAffineMatrix): ArrayOfTPointF; virtual;
     function ComputeStroke(APoints: ArrayOfTPointF; AClosed: boolean; AStrokeMatrix: TAffineMatrix): ArrayOfTPointF; virtual;
+    function ComputeStrokeEnvelope(APoints: ArrayOfTPointF; AClosed: boolean; AWidth: single): ArrayOfTPointF; virtual;
     function GetStroker: TBGRAPenStroker;
     function GetStroker: TBGRAPenStroker;
     property Stroker: TBGRAPenStroker read GetStroker;
     property Stroker: TBGRAPenStroker read GetStroker;
     procedure FillChange({%H-}ASender: TObject; var ADiff: TCustomVectorialFillDiff); virtual;
     procedure FillChange({%H-}ASender: TObject; var ADiff: TCustomVectorialFillDiff); virtual;
@@ -201,7 +203,8 @@ type
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); virtual;
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); virtual;
     function GetRenderBounds(ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; virtual; abstract;
     function GetRenderBounds(ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; virtual; abstract;
     function SuggestGradientBox(AMatrix: TAffineMatrix): TAffineBox; virtual;
     function SuggestGradientBox(AMatrix: TAffineMatrix): TAffineBox; virtual;
-    function PointInShape(APoint: TPointF): boolean; virtual; abstract;
+    function PointInShape(APoint: TPointF): boolean; overload; virtual; abstract;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; virtual; abstract;
     procedure ConfigureCustomEditor(AEditor: TBGRAOriginalEditor); virtual; abstract;
     procedure ConfigureCustomEditor(AEditor: TBGRAOriginalEditor); virtual; abstract;
     procedure ConfigureEditor(AEditor: TBGRAOriginalEditor); virtual;
     procedure ConfigureEditor(AEditor: TBGRAOriginalEditor); virtual;
     procedure LoadFromStorage(AStorage: TBGRACustomOriginalStorage); virtual;
     procedure LoadFromStorage(AStorage: TBGRACustomOriginalStorage); virtual;
@@ -224,6 +227,7 @@ type
     function Duplicate: TVectorShape;
     function Duplicate: TVectorShape;
     class function StorageClassName: RawByteString; virtual; abstract;
     class function StorageClassName: RawByteString; virtual; abstract;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; virtual;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; virtual;
+    function GetGenericCost: integer; virtual;
     function GetUsedTextures: ArrayOfBGRABitmap; virtual;
     function GetUsedTextures: ArrayOfBGRABitmap; virtual;
     procedure Transform(const AMatrix: TAffineMatrix); virtual;
     procedure Transform(const AMatrix: TAffineMatrix); virtual;
     class function Fields: TVectorShapeFields; virtual;
     class function Fields: TVectorShapeFields; virtual;
@@ -359,7 +363,8 @@ type
     procedure SelectShape(AIndex: integer); overload;
     procedure SelectShape(AIndex: integer); overload;
     procedure SelectShape(AShape: TVectorShape); overload;
     procedure SelectShape(AShape: TVectorShape); overload;
     procedure DeselectShape;
     procedure DeselectShape;
-    procedure MouseClick(APoint: TPointF);
+    function GetShapesCost: integer;
+    procedure MouseClick(APoint: TPointF; ARadius: single);
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure ConfigureEditor(AEditor: TBGRAOriginalEditor); override;
     procedure ConfigureEditor(AEditor: TBGRAOriginalEditor); override;
     function CreateEditor: TBGRAOriginalEditor; override;
     function CreateEditor: TBGRAOriginalEditor; override;
@@ -601,9 +606,9 @@ end;
 
 
 function TVectorShapeCommonFillDiff.IsIdentity: boolean;
 function TVectorShapeCommonFillDiff.IsIdentity: boolean;
 begin
 begin
-  result := FStartPenFill.Equals(FEndPenFill) and
-    FStartBackFill.Equals(FEndBackFill) and
-    FStartOutlineFill.Equals(FEndOutlineFill);
+  result := TVectorialFill.Equal(FStartPenFill, FEndPenFill) and
+    TVectorialFill.Equal(FStartBackFill, FEndBackFill) and
+    TVectorialFill.Equal(FStartOutlineFill, FEndOutlineFill);
 end;
 end;
 
 
 { TVectorOriginalShapeRangeDiff }
 { TVectorOriginalShapeRangeDiff }
@@ -1204,6 +1209,28 @@ begin
   result := false;
   result := false;
 end;
 end;
 
 
+function TVectorShape.GetGenericCost: integer;
+begin
+  if vsfBackFill in Fields then
+  begin
+    case BackFill.FillType of
+    vftGradient: result := 25;
+    vftTexture: result := 10;
+    vftSolid: result := 4;
+    else {vftNone} result := 1;
+    end
+  end else
+  if vsfPenStyle in Fields then
+  begin
+    if PenStyleEqual(PenStyle, SolidPenStyle) or
+       PenStyleEqual(PenStyle, ClearPenStyle) then
+       result := 1
+    else
+      result := 2;
+  end else
+    result := 1;
+end;
+
 function TVectorShape.GetUsedTextures: ArrayOfBGRABitmap;
 function TVectorShape.GetUsedTextures: ArrayOfBGRABitmap;
 var
 var
   f: TVectorShapeFields;
   f: TVectorShapeFields;
@@ -1280,7 +1307,8 @@ begin
     result := nil;
     result := nil;
     pointerData := AStorage.RawString[AName+'-ptr'];
     pointerData := AStorage.RawString[AName+'-ptr'];
     if length(pointerData)<>sizeof(result) then
     if length(pointerData)<>sizeof(result) then
-      raise exception.Create('Invalid stored pointer');
+      raise exception.Create('Invalid stored pointer (expected size '+
+        inttostr(sizeof(result))+' but encountered '+inttostr(length(pointerData))+')');
     move(pointerData[1],result,sizeof(result));
     move(pointerData[1],result,sizeof(result));
   end else
   end else
   if Assigned(Container) then
   if Assigned(Container) then
@@ -1632,6 +1660,16 @@ begin
     result := Stroker.ComputePolyline(APoints, PenWidth, PenColor);
     result := Stroker.ComputePolyline(APoints, PenWidth, PenColor);
 end;
 end;
 
 
+function TVectorShape.ComputeStrokeEnvelope(APoints: ArrayOfTPointF;
+  AClosed: boolean; AWidth: single): ArrayOfTPointF;
+var
+  opt: TBGRAPolyLineOptions;
+begin
+  opt := [];
+  if AClosed then include(opt, plCycle);
+  result := ComputeWidePolyPolylinePoints(APoints, AWidth, BGRABlack, pecRound, pjsMiter, SolidPenStyle, opt);
+end;
+
 function TVectorShape.GetStroker: TBGRAPenStroker;
 function TVectorShape.GetStroker: TBGRAPenStroker;
 begin
 begin
   if FStroker = nil then
   if FStroker = nil then
@@ -2477,6 +2515,7 @@ begin
   idx := FShapes.IndexOf(AShape);
   idx := FShapes.IndexOf(AShape);
   if idx = -1 then exit(false);
   if idx = -1 then exit(false);
   DeleteShapeRange(idx, 1);
   DeleteShapeRange(idx, 1);
+  result := true;
 end;
 end;
 
 
 procedure TVectorOriginal.DeleteShape(AIndex: integer);
 procedure TVectorOriginal.DeleteShape(AIndex: integer);
@@ -2575,7 +2614,16 @@ begin
   SelectShape(nil);
   SelectShape(nil);
 end;
 end;
 
 
-procedure TVectorOriginal.MouseClick(APoint: TPointF);
+function TVectorOriginal.GetShapesCost: integer;
+var
+  i: Integer;
+begin
+  result := 0;
+  for i := 0 to ShapeCount-1 do
+    inc(result, Shape[i].GetGenericCost);
+end;
+
+procedure TVectorOriginal.MouseClick(APoint: TPointF; ARadius: single);
 var
 var
   i: LongInt;
   i: LongInt;
 begin
 begin
@@ -2585,6 +2633,12 @@ begin
       SelectShape(i);
       SelectShape(i);
       exit;
       exit;
     end;
     end;
+  for i:= FShapes.Count-1 downto 0 do
+    if FShapes[i].PointInShape(APoint, ARadius) then
+    begin
+      SelectShape(i);
+      exit;
+    end;
   DeselectShape;
   DeselectShape;
 end;
 end;
 
 

+ 37 - 9
lazpaintcontrols/lcvectorpolyshapes.pas

@@ -90,7 +90,7 @@ type
     procedure OnClickPoint({%H-}ASender: TObject; APointIndex: integer; {%H-}AShift: TShiftState); virtual;
     procedure OnClickPoint({%H-}ASender: TObject; APointIndex: integer; {%H-}AShift: TShiftState); virtual;
     procedure DoClickPoint({%H-}APointIndex: integer; {%H-}AShift: TShiftState); virtual;
     procedure DoClickPoint({%H-}APointIndex: integer; {%H-}AShift: TShiftState); virtual;
     function CanMovePoints: boolean; virtual;
     function CanMovePoints: boolean; virtual;
-    procedure InsertPointAuto;
+    procedure InsertPointAuto(AShift: TShiftState);
     function ComputeStroke(APoints: ArrayOfTPointF; AClosed: boolean;
     function ComputeStroke(APoints: ArrayOfTPointF; AClosed: boolean;
       AStrokeMatrix: TAffineMatrix): ArrayOfTPointF; override;
       AStrokeMatrix: TAffineMatrix): ArrayOfTPointF; override;
   public
   public
@@ -130,7 +130,8 @@ type
     class function Fields: TVectorShapeFields; override;
     class function Fields: TVectorShapeFields; override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
-    function PointInShape(APoint: TPointF): boolean; override;
+    function PointInShape(APoint: TPointF): boolean; overload; override;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; override;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; override;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; override;
     class function StorageClassName: RawByteString; override;
     class function StorageClassName: RawByteString; override;
   end;
   end;
@@ -637,7 +638,18 @@ end;
 procedure TCustomPolypointShape.DoClickPoint(APointIndex: integer;
 procedure TCustomPolypointShape.DoClickPoint(APointIndex: integer;
   AShift: TShiftState);
   AShift: TShiftState);
 begin
 begin
-  //nothing
+  if (APointIndex = 0) and (UserMode = vsuCreate) and not Closed then
+  begin
+    if PointCount > 2 then
+    begin
+      RemovePoint(PointCount-1);
+      Closed := true;
+      UserMode := vsuEdit;
+    end else
+    begin
+      Remove;
+    end;
+  end;
 end;
 end;
 
 
 function TCustomPolypointShape.CanMovePoints: boolean;
 function TCustomPolypointShape.CanMovePoints: boolean;
@@ -645,11 +657,12 @@ begin
   result := true;
   result := true;
 end;
 end;
 
 
-procedure TCustomPolypointShape.InsertPointAuto;
+procedure TCustomPolypointShape.InsertPointAuto(AShift: TShiftState);
 var
 var
   bestSegmentIndex, i: Integer;
   bestSegmentIndex, i: Integer;
-  bestSegmentDist, segmentLen, segmentPos: single;
-  u, n: TPointF;
+  bestSegmentDist,
+  segmentLen, segmentPos: single;
+  u, n, bestProjection: TPointF;
   segmentDist: single;
   segmentDist: single;
 begin
 begin
   if isEmptyPointF(FMousePos) then exit;
   if isEmptyPointF(FMousePos) then exit;
@@ -659,6 +672,7 @@ begin
 
 
   bestSegmentIndex := -1;
   bestSegmentIndex := -1;
   bestSegmentDist := MaxSingle;
   bestSegmentDist := MaxSingle;
+  bestProjection := EmptyPointF;
   for i := 0 to PointCount-1 do
   for i := 0 to PointCount-1 do
   if FAddingPoint and (i >= PointCount-2) then break else
   if FAddingPoint and (i >= PointCount-2) then break else
   begin
   begin
@@ -677,13 +691,17 @@ begin
         begin
         begin
           bestSegmentDist := segmentDist;
           bestSegmentDist := segmentDist;
           bestSegmentIndex := i;
           bestSegmentIndex := i;
+          bestProjection := Points[i]+segmentPos*u;
         end;
         end;
       end;
       end;
     end;
     end;
   end;
   end;
   if bestSegmentIndex <> -1 then
   if bestSegmentIndex <> -1 then
   begin
   begin
-    InsertPoint(bestSegmentIndex+1, FMousePos);
+    if ssShift in AShift then
+      InsertPoint(bestSegmentIndex+1, bestProjection)
+    else
+      InsertPoint(bestSegmentIndex+1, FMousePos);
     FHoverPoint:= bestSegmentIndex+1;
     FHoverPoint:= bestSegmentIndex+1;
   end;
   end;
 end;
 end;
@@ -816,7 +834,7 @@ begin
       RemovePoint(PointCount-2);
       RemovePoint(PointCount-2);
     AHandled:= true;
     AHandled:= true;
   end else
   end else
-  if (Key = skInsert) then InsertPointAuto else
+  if (Key = skInsert) then InsertPointAuto(Shift) else
     inherited KeyDown(Shift, Key, AHandled);
     inherited KeyDown(Shift, Key, AHandled);
 end;
 end;
 
 
@@ -1038,7 +1056,7 @@ function TPolylineShape.PointInShape(APoint: TPointF): boolean;
 var
 var
   pts: ArrayOfTPointF;
   pts: ArrayOfTPointF;
 begin
 begin
-  if not BackVisible and not PenVisible then exit;
+  if not BackVisible and not PenVisible then exit(false);
   pts := GetCurve(AffineMatrixIdentity);
   pts := GetCurve(AffineMatrixIdentity);
   if BackVisible and IsPointInPolygon(pts, APoint, true) then exit(true);
   if BackVisible and IsPointInPolygon(pts, APoint, true) then exit(true);
   if PenVisible then
   if PenVisible then
@@ -1049,6 +1067,16 @@ begin
   result := false;
   result := false;
 end;
 end;
 
 
+function TPolylineShape.PointInShape(APoint: TPointF; ARadius: single): boolean;
+var
+  pts: ArrayOfTPointF;
+begin
+  if not BackVisible and not PenVisible then exit(false);
+  pts := GetCurve(AffineMatrixIdentity);
+  pts := ComputeStrokeEnvelope(pts, Closed, ARadius*2);
+  result := IsPointInPolygon(pts, APoint, true);
+end;
+
 function TPolylineShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 function TPolylineShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 begin
 begin
   Result:= PointCount > 40;
   Result:= PointCount > 40;

+ 159 - 22
lazpaintcontrols/lcvectorrectshapes.pas

@@ -39,6 +39,7 @@ type
     FOriginBackup,FXUnitBackup,FYUnitBackup,
     FOriginBackup,FXUnitBackup,FYUnitBackup,
     FXAxisBackup,FYAxisBackup: TPointF;
     FXAxisBackup,FYAxisBackup: TPointF;
     FXSizeBackup,FYSizeBackup: single;
     FXSizeBackup,FYSizeBackup: single;
+    FMatrixBackup: TAffineMatrix;
     FFixedRatio: single;
     FFixedRatio: single;
     procedure DoMoveXAxis(ANewCoord: TPointF; AShift: TShiftState; AFactor: single);
     procedure DoMoveXAxis(ANewCoord: TPointF; AShift: TShiftState; AFactor: single);
     procedure DoMoveYAxis(ANewCoord: TPointF; AShift: TShiftState; AFactor: single);
     procedure DoMoveYAxis(ANewCoord: TPointF; AShift: TShiftState; AFactor: single);
@@ -48,11 +49,20 @@ type
     procedure OnMoveYAxis({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveYAxis({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXAxisNeg({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXAxisNeg({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveYAxisNeg({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveYAxisNeg({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXAxisAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveYAxisAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXAxisNegAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveYAxisNegAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXYCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXYCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXNegYCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXNegYCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXYNegCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXYNegCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXNegYNegCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnMoveXNegYNegCorner({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXYCornerAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXNegYCornerAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXYNegCornerAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+    procedure OnMoveXNegYNegCornerAlt({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
     procedure OnStartMove({%H-}ASender: TObject; {%H-}APointIndex: integer; {%H-}AShift: TShiftState);
     procedure OnStartMove({%H-}ASender: TObject; {%H-}APointIndex: integer; {%H-}AShift: TShiftState);
+    procedure UpdateFillMatrixFromRect;
     function GetCornerPositition: single; virtual; abstract;
     function GetCornerPositition: single; virtual; abstract;
     function GetOrthoRect(AMatrix: TAffineMatrix; out ARect: TRectF): boolean;
     function GetOrthoRect(AMatrix: TAffineMatrix; out ARect: TRectF): boolean;
     function AllowShearTransform: boolean; virtual;
     function AllowShearTransform: boolean; virtual;
@@ -93,7 +103,8 @@ type
     class function Fields: TVectorShapeFields; override;
     class function Fields: TVectorShapeFields; override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
-    function PointInShape(APoint: TPointF): boolean; override;
+    function PointInShape(APoint: TPointF): boolean; overload; override;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
     class function StorageClassName: RawByteString; override;
     class function StorageClassName: RawByteString; override;
   end;
   end;
@@ -111,7 +122,8 @@ type
     function GetAlignBounds(const {%H-}ALayoutRect: TRect; const AMatrix: TAffineMatrix): TRectF; override;
     function GetAlignBounds(const {%H-}ALayoutRect: TRect; const AMatrix: TAffineMatrix): TRectF; override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
-    function PointInShape(APoint: TPointF): boolean; override;
+    function PointInShape(APoint: TPointF): boolean; overload; override;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
     class function StorageClassName: RawByteString; override;
     class function StorageClassName: RawByteString; override;
   end;
   end;
@@ -160,6 +172,7 @@ type
     procedure SetShapeAltitudePercent(AValue: single);
     procedure SetShapeAltitudePercent(AValue: single);
     procedure SetShapeKind(AValue: TPhongShapeKind);
     procedure SetShapeKind(AValue: TPhongShapeKind);
     function BackVisible: boolean;
     function BackVisible: boolean;
+    function GetEnvelope: ArrayOfTPointF;
   protected
   protected
     function AllowShearTransform: boolean; override;
     function AllowShearTransform: boolean; override;
   public
   public
@@ -175,8 +188,10 @@ type
     procedure SaveToStorage(AStorage: TBGRACustomOriginalStorage); override;
     procedure SaveToStorage(AStorage: TBGRACustomOriginalStorage); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
-    function PointInShape(APoint: TPointF): boolean; override;
+    function PointInShape(APoint: TPointF): boolean; overload; override;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
     function GetIsSlow(const AMatrix: TAffineMatrix): boolean; override;
+    function GetGenericCost: integer; override;
     procedure Transform(const AMatrix: TAffineMatrix); override;
     procedure Transform(const AMatrix: TAffineMatrix); override;
     class function StorageClassName: RawByteString; override;
     class function StorageClassName: RawByteString; override;
     property ShapeKind: TPhongShapeKind read FShapeKind write SetShapeKind;
     property ShapeKind: TPhongShapeKind read FShapeKind write SetShapeKind;
@@ -484,6 +499,7 @@ begin
     end;
     end;
   end;
   end;
   EnsureRatio(-AFactor,0);
   EnsureRatio(-AFactor,0);
+  UpdateFillMatrixFromRect;
   EndUpdate;
   EndUpdate;
 end;
 end;
 
 
@@ -522,6 +538,7 @@ begin
     end;
     end;
   end;
   end;
   EnsureRatio(0,-AFactor);
   EnsureRatio(0,-AFactor);
+  UpdateFillMatrixFromRect;
   EndUpdate;
   EndUpdate;
 end;
 end;
 
 
@@ -581,6 +598,7 @@ begin
     end;
     end;
   end;
   end;
   EnsureRatio(-AFactorX,-AFactorY);
   EnsureRatio(-AFactorX,-AFactorY);
+  UpdateFillMatrixFromRect;
   EndUpdate;
   EndUpdate;
 end;
 end;
 
 
@@ -614,6 +632,30 @@ begin
   DoMoveYAxis(ANewCoord, AShift, -1);
   DoMoveYAxis(ANewCoord, AShift, -1);
 end;
 end;
 
 
+procedure TCustomRectShape.OnMoveXAxisAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXAxis(ANewCoord, AShift+[ssAlt], 1);
+end;
+
+procedure TCustomRectShape.OnMoveYAxisAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveYAxis(ANewCoord, AShift+[ssAlt], 1);
+end;
+
+procedure TCustomRectShape.OnMoveXAxisNegAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXAxis(ANewCoord, AShift+[ssAlt], -1);
+end;
+
+procedure TCustomRectShape.OnMoveYAxisNegAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveYAxis(ANewCoord, AShift+[ssAlt], -1);
+end;
+
 procedure TCustomRectShape.OnMoveXYCorner(ASender: TObject; APrevCoord,
 procedure TCustomRectShape.OnMoveXYCorner(ASender: TObject; APrevCoord,
   ANewCoord: TPointF; AShift: TShiftState);
   ANewCoord: TPointF; AShift: TShiftState);
 begin
 begin
@@ -638,6 +680,30 @@ begin
   DoMoveXYCorner(ANewCoord, AShift, -1, -1);
   DoMoveXYCorner(ANewCoord, AShift, -1, -1);
 end;
 end;
 
 
+procedure TCustomRectShape.OnMoveXYCornerAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXYCorner(ANewCoord, AShift+[ssAlt], 1, 1);
+end;
+
+procedure TCustomRectShape.OnMoveXNegYCornerAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXYCorner(ANewCoord, AShift+[ssAlt], -1, 1);
+end;
+
+procedure TCustomRectShape.OnMoveXYNegCornerAlt(ASender: TObject; APrevCoord,
+  ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXYCorner(ANewCoord, AShift+[ssAlt], 1, -1);
+end;
+
+procedure TCustomRectShape.OnMoveXNegYNegCornerAlt(ASender: TObject;
+  APrevCoord, ANewCoord: TPointF; AShift: TShiftState);
+begin
+  DoMoveXYCorner(ANewCoord, AShift+[ssAlt], -1, -1);
+end;
+
 procedure TCustomRectShape.OnStartMove(ASender: TObject; APointIndex: integer;
 procedure TCustomRectShape.OnStartMove(ASender: TObject; APointIndex: integer;
   AShift: TShiftState);
   AShift: TShiftState);
 begin
 begin
@@ -650,6 +716,23 @@ begin
   FYUnitBackup := FYAxis-FOrigin;
   FYUnitBackup := FYAxis-FOrigin;
   FYSizeBackup := VectLen(FYUnitBackup);
   FYSizeBackup := VectLen(FYUnitBackup);
   if FYSizeBackup <> 0 then FYUnitBackup := (1/FYSizeBackup)*FYUnitBackup;
   if FYSizeBackup <> 0 then FYUnitBackup := (1/FYSizeBackup)*FYUnitBackup;
+  FMatrixBackup := AffineMatrix(FXAxis-FOrigin, FYAxis-FOrigin, FOrigin);
+end;
+
+procedure TCustomRectShape.UpdateFillMatrixFromRect;
+var
+  newMatrix, matrixDiff: TAffineMatrix;
+begin
+  newMatrix := AffineMatrix(FXAxis-FOrigin, FYAxis-FOrigin, FOrigin);
+  if IsAffineMatrixInversible(newMatrix) and IsAffineMatrixInversible(FMatrixBackup) then
+  begin
+    if vsfBackFill in Fields then
+    begin
+      matrixDiff := newMatrix*AffineMatrixInverse(FMatrixBackup);
+      BackFill.Transform(matrixDiff);
+    end;
+    FMatrixBackup := newMatrix;
+  end;
 end;
 end;
 
 
 function TCustomRectShape.GetAffineBox(const AMatrix: TAffineMatrix; APixelCentered: boolean): TAffineBox;
 function TCustomRectShape.GetAffineBox(const AMatrix: TAffineMatrix; APixelCentered: boolean): TAffineBox;
@@ -759,7 +842,7 @@ procedure TCustomRectShape.ConfigureCustomEditor(AEditor: TBGRAOriginalEditor);
 var
 var
   d: Single;
   d: Single;
   u, v: TPointF;
   u, v: TPointF;
-  idxOrig, idxX,idxY,idxXNeg,idxYNeg: Integer;
+  idx,idxOrig, idxX,idxY,idxXNeg,idxYNeg: Integer;
 begin
 begin
   u := FXAxis - FOrigin;
   u := FXAxis - FOrigin;
   v := FYAxis - FOrigin;
   v := FYAxis - FOrigin;
@@ -767,10 +850,14 @@ begin
   d := GetCornerPositition;
   d := GetCornerPositition;
   if d <> 0 then
   if d <> 0 then
   begin
   begin
-    AEditor.AddPoint(FOrigin + (u+v)*d, @OnMoveXYCorner, false);
-    AEditor.AddPoint(FOrigin + (-u+v)*d, @OnMoveXNegYCorner, false);
-    AEditor.AddPoint(FOrigin + (u-v)*d, @OnMoveXYNegCorner, false);
-    AEditor.AddPoint(FOrigin + (-u-v)*d, @OnMoveXNegYNegCorner, false);
+    idx := AEditor.AddPoint(FOrigin + (u+v)*d, @OnMoveXYCorner, false);
+    AEditor.AddPointAlternateMove(idx, @OnMoveXYCornerAlt);
+    idx := AEditor.AddPoint(FOrigin + (-u+v)*d, @OnMoveXNegYCorner, false);
+    AEditor.AddPointAlternateMove(idx, @OnMoveXNegYCornerAlt);
+    idx := AEditor.AddPoint(FOrigin + (u-v)*d, @OnMoveXYNegCorner, false);
+    AEditor.AddPointAlternateMove(idx, @OnMoveXYNegCornerAlt);
+    idx := AEditor.AddPoint(FOrigin + (-u-v)*d, @OnMoveXNegYNegCorner, false);
+    AEditor.AddPointAlternateMove(idx, @OnMoveXNegYNegCornerAlt);
   end;
   end;
   if ShowArrows then
   if ShowArrows then
   begin
   begin
@@ -785,6 +872,10 @@ begin
     idxXNeg := AEditor.AddPoint(FOrigin - u, @OnMoveXAxisNeg);
     idxXNeg := AEditor.AddPoint(FOrigin - u, @OnMoveXAxisNeg);
     idxYNeg := AEditor.AddPoint(FOrigin - v, @OnMoveYAxisNeg);
     idxYNeg := AEditor.AddPoint(FOrigin - v, @OnMoveYAxisNeg);
   end;
   end;
+  AEditor.AddPointAlternateMove(idxX, @OnMoveXAxisAlt);
+  AEditor.AddPointAlternateMove(idxY, @OnMoveYAxisAlt);
+  AEditor.AddPointAlternateMove(idxXNeg, @OnMoveXAxisNegAlt);
+  AEditor.AddPointAlternateMove(idxYNeg, @OnMoveYAxisNegAlt);
   idxOrig := AEditor.AddPoint(FOrigin, @OnMoveOrigin, true);
   idxOrig := AEditor.AddPoint(FOrigin, @OnMoveOrigin, true);
   if ShowArrows then
   if ShowArrows then
   begin
   begin
@@ -1004,6 +1095,20 @@ begin
     result := false;
     result := false;
 end;
 end;
 
 
+function TRectShape.PointInShape(APoint: TPointF; ARadius: single): boolean;
+var
+  pts: ArrayOfTPointF;
+  box: TAffineBox;
+begin
+  if PenVisible or BackVisible then
+  begin
+    box := GetAffineBox(AffineMatrixIdentity, true);
+    pts := ComputeStrokeEnvelope(box.AsPolygon, true, ARadius*2);
+    result:= IsPointInPolygon(pts, APoint, true);
+  end
+  else result := false;
+end;
+
 class function TRectShape.StorageClassName: RawByteString;
 class function TRectShape.StorageClassName: RawByteString;
 begin
 begin
   result := 'rect';
   result := 'rect';
@@ -1236,6 +1341,19 @@ begin
     result := false;
     result := false;
 end;
 end;
 
 
+function TEllipseShape.PointInShape(APoint: TPointF; ARadius: single): boolean;
+var
+  pts: ArrayOfTPointF;
+begin
+  if PenVisible or BackVisible then
+  begin
+    pts := ComputeEllipse(FOrigin, FXAxis, FYAxis);
+    pts := ComputeStrokeEnvelope(pts, true, ARadius*2);
+    result:= IsPointInPolygon(pts, APoint, true);
+  end else
+    result := false;
+end;
+
 function TEllipseShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 function TEllipseShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 var
 var
   ab: TAffineBox;
   ab: TAffineBox;
@@ -1310,6 +1428,21 @@ begin
   result := not BackFill.IsFullyTransparent;
   result := not BackFill.IsFullyTransparent;
 end;
 end;
 
 
+function TPhongShape.GetEnvelope: ArrayOfTPointF;
+var
+  box: TAffineBox;
+begin
+  case ShapeKind of
+    pskHalfSphere, pskConeTop: result := ComputeEllipse(FOrigin, FXAxis, FYAxis);
+    pskConeSide: result := PointsF([FOrigin - (FYAxis-FOrigin), FYAxis + (FXAxis-FOrigin), FYAxis - (FXAxis-FOrigin)]);
+  else
+    begin
+      box := GetAffineBox(AffineMatrixIdentity, true);
+      result := box.AsPolygon;
+    end;
+  end;
+end;
+
 function TPhongShape.AllowShearTransform: boolean;
 function TPhongShape.AllowShearTransform: boolean;
 begin
 begin
   Result:= false;
   Result:= false;
@@ -1604,24 +1737,23 @@ end;
 
 
 function TPhongShape.PointInShape(APoint: TPointF): boolean;
 function TPhongShape.PointInShape(APoint: TPointF): boolean;
 var
 var
-  box: TAffineBox;
   pts: ArrayOfTPointF;
   pts: ArrayOfTPointF;
 begin
 begin
   if not BackVisible then exit(false);
   if not BackVisible then exit(false);
-  if ShapeKind in [pskHalfSphere, pskConeTop] then
-  begin
-    pts := ComputeEllipse(FOrigin, FXAxis, FYAxis);
-    result := IsPointInPolygon(pts, APoint, true);
-  end else
-  if ShapeKind = pskConeSide then
-  begin
-    pts:= PointsF([FOrigin - (FYAxis-FOrigin), FYAxis + (FXAxis-FOrigin), FYAxis - (FXAxis-FOrigin)]);
-    result := IsPointInPolygon(pts, APoint, true);
-  end else
+  pts := GetEnvelope;
+  result := IsPointInPolygon(pts, APoint, true);
+end;
+
+function TPhongShape.PointInShape(APoint: TPointF; ARadius: single): boolean;
+var
+  pts: ArrayOfTPointF;
+begin
+  if BackVisible then
   begin
   begin
-    box := GetAffineBox(AffineMatrixIdentity, true);
-    result:= box.Contains(APoint);
-  end;
+    pts := ComputeStrokeEnvelope(GetEnvelope, true, ARadius*2);
+    result:= IsPointInPolygon(pts, APoint, true);
+  end
+    else result := false;
 end;
 end;
 
 
 function TPhongShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 function TPhongShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
@@ -1633,6 +1765,11 @@ begin
   result := ab.Surface > 320*240;
   result := ab.Surface > 320*240;
 end;
 end;
 
 
+function TPhongShape.GetGenericCost: integer;
+begin
+  Result:= 10;
+end;
+
 procedure TPhongShape.Transform(const AMatrix: TAffineMatrix);
 procedure TPhongShape.Transform(const AMatrix: TAffineMatrix);
 begin
 begin
   BeginUpdate(TPhongShapeDiff);
   BeginUpdate(TPhongShapeDiff);

+ 13 - 1
lazpaintcontrols/lcvectortextshapes.pas

@@ -151,8 +151,10 @@ type
     procedure ConfigureCustomEditor(AEditor: TBGRAOriginalEditor); override;
     procedure ConfigureCustomEditor(AEditor: TBGRAOriginalEditor); override;
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); override;
     procedure Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix: TAffineMatrix; ADraft: boolean); override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
     function GetRenderBounds({%H-}ADestRect: TRect; AMatrix: TAffineMatrix; AOptions: TRenderBoundsOptions = []): TRectF; override;
-    function PointInShape(APoint: TPointF): boolean; override;
+    function PointInShape(APoint: TPointF): boolean; overload; override;
+    function PointInShape(APoint: TPointF; ARadius: single): boolean; overload; override;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; override;
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; override;
+    function GetGenericCost: integer; override;
     procedure MouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseDown({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseDown({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseUp({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseUp({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
@@ -1467,11 +1469,21 @@ begin
   result := GetAffineBox(AffineMatrixIdentity,true).Contains(APoint);
   result := GetAffineBox(AffineMatrixIdentity,true).Contains(APoint);
 end;
 end;
 
 
+function TTextShape.PointInShape(APoint: TPointF; ARadius: single): boolean;
+begin
+  result := false;
+end;
+
 function TTextShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 function TTextShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
 begin
 begin
   Result:= true;
   Result:= true;
 end;
 end;
 
 
+function TTextShape.GetGenericCost: integer;
+begin
+  Result:= 10;
+end;
+
 procedure TTextShape.MouseMove(Shift: TShiftState; X, Y: single;
 procedure TTextShape.MouseMove(Shift: TShiftState; X, Y: single;
   var ACursor: TOriginalEditorCursor; var AHandled: boolean);
   var ACursor: TOriginalEditorCursor; var AHandled: boolean);
 begin
 begin

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно