diff --git a/lazpaint/dialog/filter/umotionblur.pas b/lazpaint/dialog/filter/umotionblur.pas
index 2d7ddf63..50d49716 100644
--- a/lazpaint/dialog/filter/umotionblur.pas
+++ b/lazpaint/dialog/filter/umotionblur.pas
@@ -245,6 +245,7 @@ procedure TFMotionBlur.PaintBox1MouseDown(Sender: TObject;
procedure TFMotionBlur.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
+ if not (ssLeft in Shift) then selectingAngle:= false;
PaintBoxMouseMovePos := Point(X,Y);
if InPaintBoxMouseMove then Exit;
InPaintBoxMouseMove := True;
diff --git a/lazpaint/dialog/filter/utwirl.lfm b/lazpaint/dialog/filter/utwirl.lfm
index 016bc2cd..3a6bdc08 100644
--- a/lazpaint/dialog/filter/utwirl.lfm
+++ b/lazpaint/dialog/filter/utwirl.lfm
@@ -83,7 +83,7 @@ object FTwirl: TFTwirl
Font.Height = -15
Increment = 30
MaxValue = 10000
- MinValue = 1
+ MinValue = -10000
OnChange = SpinEdit_AngleChange
ParentFont = False
TabOrder = 1
diff --git a/lazpaint/dialog/ublendop.lfm b/lazpaint/dialog/ublendop.lfm
index 2f0b00ae..f73f9739 100644
--- a/lazpaint/dialog/ublendop.lfm
+++ b/lazpaint/dialog/ublendop.lfm
@@ -12,7 +12,7 @@ object FBlendOp: TFBlendOp
OnResize = FormResize
OnShow = FormShow
Position = poMainFormCenter
- LCLVersion = '1.6.0.4'
+ LCLVersion = '2.2.0.1'
object ListBox_PatternUnder: TListBox
Left = 8
Height = 248
@@ -39,7 +39,6 @@ object FBlendOp: TFBlendOp
OnDrawItem = ListBox_DrawPatternItem
OnMeasureItem = ListBox_MeasureItem
OnSelectionChange = ListBox_PatternSelectionChange
- ScrollWidth = 149
Style = lbOwnerDrawFixed
TabOrder = 0
end
@@ -52,7 +51,6 @@ object FBlendOp: TFBlendOp
Alignment = taCenter
AutoSize = False
Caption = 'Pattern under'
- ParentColor = False
ParentShowHint = False
ShowHint = True
end
@@ -82,7 +80,6 @@ object FBlendOp: TFBlendOp
OnDrawItem = ListBox_DrawPatternItem
OnMeasureItem = ListBox_MeasureItem
OnSelectionChange = ListBox_PatternSelectionChange
- ScrollWidth = 149
Style = lbOwnerDrawFixed
TabOrder = 1
end
@@ -95,7 +92,6 @@ object FBlendOp: TFBlendOp
Alignment = taCenter
AutoSize = False
Caption = 'Pattern over'
- ParentColor = False
ParentShowHint = False
ShowHint = True
end
@@ -124,7 +120,6 @@ object FBlendOp: TFBlendOp
OnDrawItem = ListBox_DrawBlendItem
OnMeasureItem = ListBox_MeasureItem
OnSelectionChange = ListBox_BlendSelectionChange
- ScrollWidth = 120
Style = lbOwnerDrawFixed
TabOrder = 2
end
@@ -137,7 +132,6 @@ object FBlendOp: TFBlendOp
Alignment = taCenter
AutoSize = False
Caption = 'Basic SVG'
- ParentColor = False
ParentShowHint = False
ShowHint = True
end
@@ -174,7 +168,6 @@ object FBlendOp: TFBlendOp
OnDrawItem = ListBox_DrawBlendItem
OnMeasureItem = ListBox_MeasureItem
OnSelectionChange = ListBox_BlendSelectionChange
- ScrollWidth = 156
Style = lbOwnerDrawFixed
TabOrder = 3
end
@@ -187,7 +180,6 @@ object FBlendOp: TFBlendOp
Alignment = taCenter
AutoSize = False
Caption = 'Krita'
- ParentColor = False
ParentShowHint = False
ShowHint = True
end
@@ -220,7 +212,6 @@ object FBlendOp: TFBlendOp
OnDrawItem = ListBox_DrawBlendItem
OnMeasureItem = ListBox_MeasureItem
OnSelectionChange = ListBox_BlendSelectionChange
- ScrollWidth = 114
Style = lbOwnerDrawFixed
TabOrder = 4
end
@@ -233,7 +224,6 @@ object FBlendOp: TFBlendOp
Alignment = taCenter
AutoSize = False
Caption = 'Other'
- ParentColor = False
ParentShowHint = False
ShowHint = True
end
@@ -244,7 +234,6 @@ object FBlendOp: TFBlendOp
Width = 137
Anchors = [akLeft, akBottom]
Caption = 'Selected blend operation :'
- ParentColor = False
end
object Label_BlendOpValue: TLabel
Left = 152
@@ -253,7 +242,6 @@ object FBlendOp: TFBlendOp
Width = 3
Anchors = [akLeft, akBottom]
Caption = '.'
- ParentColor = False
end
object Button_OK: TButton
Left = 192
@@ -286,7 +274,6 @@ object FBlendOp: TFBlendOp
AutoSize = False
Caption = 'Preview with'
Font.Style = [fsBold]
- ParentColor = False
ParentFont = False
end
object Label_BlendOpCategory: TLabel
@@ -299,7 +286,6 @@ object FBlendOp: TFBlendOp
AutoSize = False
Caption = 'Category of blend operation'
Font.Style = [fsBold]
- ParentColor = False
ParentFont = False
end
object ScrollBar1: TScrollBar
@@ -315,7 +301,7 @@ object FBlendOp: TFBlendOp
Enabled = False
Interval = 100
OnTimer = TimerResizeTimer
- left = 382
- top = 288
+ Left = 382
+ Top = 288
end
end
diff --git a/lazpaint/dialog/ubrowseimages.pas b/lazpaint/dialog/ubrowseimages.pas
index d3a8530a..32af2615 100644
--- a/lazpaint/dialog/ubrowseimages.pas
+++ b/lazpaint/dialog/ubrowseimages.pas
@@ -194,10 +194,26 @@ procedure TFBrowseImages.Edit_FilenameChange(Sender: TObject);
begin
if InFilenameChange then exit;
InFilenameChange := true;
+ txt := trim(Edit_Filename.Text);
+ {$IFDEF WINDOWS}
+ if (length(txt) >= 3) and (upcase(txt[1]) in ['A'..'Z']) and (txt[2]=':') and (txt[3]='\') then
+ {$ELSE}
+ if (length(txt) >= 1) and (txt[1] = PathDelim) then
+ {$ENDIF}
+ begin
+ DirectoryEdit1.Text := ExtractFilePath(txt);
+ txt := ExtractFileName(txt);
+ Edit_Filename.Text := txt;
+ end else
+ if pos(PathDelim, txt) > 1 then
+ begin
+ DirectoryEdit1.Text := ConcatPaths([DirectoryEdit1.Text,ExtractFilePath(txt)]);
+ txt := ExtractFileName(txt);
+ Edit_Filename.Text := txt;
+ end;
ShellListView1.DeselectAll;
UpdatePreview('');
first := true;
- txt := trim(Edit_Filename.Text);
for i := 0 to ShellListView1.ItemCount-1 do
if UTF8CompareText(ShellListView1.ItemName[i],txt) = 0 then
begin
@@ -1128,6 +1144,11 @@ procedure TFBrowseImages.ValidateFileOrDir;
if DefaultExtension <> '' then
FFilename += DefaultExtension;
end;
+ if not FileManager.IsValidFileName(ExtractFileName(FFilename)) and IsSaveDialog then
+ begin
+ ShowMessage(rsInvalidName);
+ exit;
+ end;
if FileManager.FileExists(FFilename) and IsSaveDialog and OverwritePrompt then
begin
if QuestionDlg(rsSave, rsOverwriteFile, mtConfirmation, [mrOk, rsOkay, mrCancel, rsCancel],0) <> mrOk then exit;
diff --git a/lazpaint/dialog/ucanvassize.pas b/lazpaint/dialog/ucanvassize.pas
index 42b26b3a..1977892e 100644
--- a/lazpaint/dialog/ucanvassize.pas
+++ b/lazpaint/dialog/ucanvassize.pas
@@ -213,7 +213,7 @@ procedure TFCanvasSize.Button_OKClick(Sender: TObject);
begin
case FMUnit of
0: begin //pixels
- tx:=SpinEdit_Width.Value;
+ tx:= SpinEdit_Width.Value;
ty:= SpinEdit_Height.Value;
end;
1: begin //percent
@@ -246,18 +246,26 @@ procedure TFCanvasSize.ComboBox_AnchorChange(Sender: TObject);
end;
procedure TFCanvasSize.ComboBox_MUnitChange(Sender: TObject);
+var
+ curWidth, curHeight: Integer;
begin
if FMUnit= ComboBox_MUnit.ItemIndex then exit;
FMUnit:= ComboBox_MUnit.ItemIndex;
FIgnoreInput:=True;
+ curWidth := SpinEdit_Width.Value;
+ curHeight := SpinEdit_Height.Value;
case FMUnit of
- 0: begin //pixels
- SpinEdit_Width.Value:= round (LazPaintInstance.Image.Width*SpinEdit_Width.Value/100);
- SpinEdit_Height.Value:= round (LazPaintInstance.Image.Height*SpinEdit_Height.Value/100);
+ 0: begin //percent -> pixels
+ SpinEdit_Width.MaxValue := MaxImageWidth;
+ SpinEdit_Height.MaxValue := MaxImageHeight;
+ SpinEdit_Width.Value:= round (LazPaintInstance.Image.Width*curWidth/100);
+ SpinEdit_Height.Value:= round (LazPaintInstance.Image.Height*curHeight/100);
end;
- 1: begin //percent
- SpinEdit_Width.Value:= round (SpinEdit_Width.Value/ LazPaintInstance.Image.Width*100);
- SpinEdit_Height.Value:= round (SpinEdit_Height.Value/ LazPaintInstance.Image.Height*100);
+ 1: begin //pixels -> percent
+ SpinEdit_Width.MaxValue := round(MaxImageWidth / LazPaintInstance.Image.Width * 100);
+ SpinEdit_Height.MaxValue := round(MaxImageHeight / LazPaintInstance.Image.Height * 100);
+ SpinEdit_Width.Value:= round (curWidth/ LazPaintInstance.Image.Width*100);
+ SpinEdit_Height.Value:= round (curHeight/ LazPaintInstance.Image.Height*100);
end;
end;
FIgnoreInput:=False;
diff --git a/lazpaint/dialog/uchoosecolorinterface.pas b/lazpaint/dialog/uchoosecolorinterface.pas
index 9d39a826..6791d2f3 100644
--- a/lazpaint/dialog/uchoosecolorinterface.pas
+++ b/lazpaint/dialog/uchoosecolorinterface.pas
@@ -579,7 +579,9 @@ function TChooseColorInterface.DrawTriangleCursor(dest: TBGRABitmap;
procedure TChooseColorInterface.DoClick(X, Y: single);
begin
- if FColorCircle.Bounds.Contains(PointF(X,Y)) then
+ if FColorCircle.Bounds.Contains(PointF(X,Y)) and
+ (VectLen(PointF(X,Y) - FColorCircle.center) <=
+ max(FColorCircle.bounds.Width, FColorCircle.bounds.Height)/2 + DoScaleX(14, 96)) then
begin
FSelectZone := szColorCircle;
DoSelect(X,Y);
@@ -1072,6 +1074,7 @@ constructor TChooseColorInterface.Create(AContainer: TWinControl; ADPI: integer)
EColor.Text:= '#FFFFFF';
LColor.Visible := true;
LColor.Caption := '#FFFFFF';
+ LColor.Hint := rsColorDescription;
FCurrentColorFormatError:= false;
vsColorView.Left := ExternalMargin;
vsColorView.Top := 0;
diff --git a/lazpaint/dialog/ulayerstackinterface.pas b/lazpaint/dialog/ulayerstackinterface.pas
index 5f047593..247b7059 100644
--- a/lazpaint/dialog/ulayerstackinterface.pas
+++ b/lazpaint/dialog/ulayerstackinterface.pas
@@ -200,13 +200,16 @@ procedure TLayerStackInterface.BGRALayerStack_MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var i: integer;
str: string;
+ isRightClick: boolean;
begin
if Assigned(LazPaintInstance) then LazPaintInstance.ExitColorEditor;
X := round(X*FScaling);
Y := round(Y*FScaling);
if PtInRect(Point(X,Y),FScrollButtonRect) then exit;
- If (Button = mbLeft) then
+ isRightClick := (Button = mbRight) {$IFDEF DARWIN}or ((Button = mbLeft) and (ssCtrl in Shift)){$ENDIF};
+ If (Button = mbLeft) and not isRightClick then
begin
+ FRightClickOrigin := EmptyPoint;
if ((VolatileHorzScrollBar <> nil) and VolatileHorzScrollBar.MouseDown(X,Y)) or
((VolatileVertScrollBar <> nil) and VolatileVertScrollBar.MouseDown(X,Y)) then
begin
@@ -266,7 +269,7 @@ procedure TLayerStackInterface.BGRALayerStack_MouseDown(Sender: TObject;
exit;
end;
end else
- if Button = mbRight then
+ if isRightClick then
FRightClickOrigin := Point(X,Y);
end;
@@ -302,6 +305,18 @@ procedure TLayerStackInterface.BGRALayerStack_MouseMove(Sender: TObject;
BGRALayerStack.Hint := FLayerInfo[i].KindIconHint;
BGRALayerStack.ShowHint:= true;
exit;
+ end else
+ if FLayerInfo[i].VisibleCheckbox.Contains(Point(X,Y)) then
+ begin
+ BGRALayerStack.Hint := rsVisible;
+ BGRALayerStack.ShowHint:= true;
+ exit;
+ end else
+ if FLayerInfo[i].RightPart.OpacityBar.Contains(Point(X,Y)) then
+ begin
+ BGRALayerStack.Hint := rsOpacity;
+ BGRALayerStack.ShowHint:= true;
+ exit;
end;
BGRALayerStack.ShowHint:= false;
end;
@@ -312,10 +327,12 @@ procedure TLayerStackInterface.BGRALayerStack_MouseUp(Sender: TObject;
indexF: single;
res: TModalResult;
topmostInfo: TTopMostInfo;
+ isRightClick: Boolean;
begin
X := round(X*FScaling);
Y := round(Y*FScaling);
- if Button = mbLeft then
+ isRightClick := (Button = mbRight) {$IFDEF DARWIN}or ((Button = mbLeft) and not IsEmptyPoint(FRightClickOrigin)){$ENDIF};
+ if (Button = mbLeft) and not isRightClick then
begin
FMovingItemStart := false;
if FMovingItemBitmap <> nil then
@@ -362,7 +379,7 @@ procedure TLayerStackInterface.BGRALayerStack_MouseUp(Sender: TObject;
FAskTransferSelectionLayerIndex := -1;
end;
end else
- if (Button = mbRight) and (Abs(X - FRightClickOrigin.X) <= 2) and
+ if isRightClick and (Abs(X - FRightClickOrigin.X) <= 2) and
(Abs(Y - FRightClickOrigin.Y) <= 2) then
begin
for i := 0 to high(FLayerInfo) do
diff --git a/lazpaint/dialog/unewimage.lfm b/lazpaint/dialog/unewimage.lfm
index a85c7c99..cf3aef87 100644
--- a/lazpaint/dialog/unewimage.lfm
+++ b/lazpaint/dialog/unewimage.lfm
@@ -116,22 +116,6 @@ object FNewImage: TFNewImage
Top = 103
Width = 63
ItemHeight = 15
- Items.Strings = (
- ''
- '1:1'
- '6:5'
- '5:4'
- '4:3'
- '11:8'
- '1.414:1'
- '1.43:1'
- '3:2'
- '8:5'
- '1.618:1'
- '5:3'
- '16:9'
- '2:1'
- )
MaxLength = 12
OnChange = ComboBox_RatioChange
OnEnter = ComboBox_RatioEnter
diff --git a/lazpaint/dialog/unewimage.pas b/lazpaint/dialog/unewimage.pas
index e09035ff..d3954657 100644
--- a/lazpaint/dialog/unewimage.pas
+++ b/lazpaint/dialog/unewimage.pas
@@ -14,6 +14,10 @@ interface
shadowOffsetX = 3;
shadowOffsetY = 3;
shadowBlur= 3;
+ defaultAspectRatios: array[0..12] of string =
+ ('1:1', '6:5', '5:4', '4:3', '11:8',
+ '1.414:1', '1.43:1', '3:2', '8:5',
+ '1.618:1', '5:3', '16:9', '2:1');
type
TLastEnteredValue = (valWidth,valHeight,valRatio);
@@ -73,6 +77,7 @@ TFNewImage = class(TForm)
procedure ThemeChanged(Sender: TObject);
procedure UpdatePreview;
function GetBitDepth: integer;
+ procedure FillAspectRatios;
public
ForIcon: boolean;
newImageResult: TBGRABitmap;
@@ -184,8 +189,6 @@ procedure TFNewImage.vsPreviewRedraw(Sender: TObject;
procedure TFNewImage.ToolButton_RotateClick(Sender: TObject);
var tx,ty: integer;
- s: string;
- idxCol: integer;
begin
if FRecomputing then exit;
FRecomputing:= true;
@@ -196,13 +199,7 @@ procedure TFNewImage.ToolButton_RotateClick(Sender: TObject);
if FRatio <> 0 then
begin
FRatio := 1/FRatio;
- s := ComboBox_Ratio.Text;
- idxCol := pos(':',s);
- if idxCol <> 0 then
- begin
- s := copy(s,idxCol+1,length(s)-idxCol)+':'+ copy(s,1,idxCol-1);
- ComboBox_Ratio.Text := s;
- end;
+ ComboBox_Ratio.Text := InverseRatio(ComboBox_Ratio.Text);
end;
FRecomputing:= false;
if FLastEnteredValue = valWidth then
@@ -210,6 +207,7 @@ procedure TFNewImage.ToolButton_RotateClick(Sender: TObject);
if FLastEnteredValue = valHeight then
FLastEnteredValue:= valWidth;
UpdatePreview;
+ FillAspectRatios;
end;
procedure TFNewImage.ComboBox_RatioChange(Sender: TObject);
@@ -268,11 +266,12 @@ procedure TFNewImage.SpinEdit_HeightChange(Sender: TObject);
end;
FRecomputing:= false;
UpdatePreview;
+ FillAspectRatios;
end;
procedure TFNewImage.ToolButton_ClearRatioClick(Sender: TObject);
begin
- ComboBox_Ratio.ItemIndex:= 0;
+ ComboBox_Ratio.Text := '';
ComboBox_RatioChange(ComboBox_Ratio);
end;
@@ -293,6 +292,10 @@ procedure TFNewImage.FormCreate(Sender: TObject);
end;
procedure TFNewImage.FormShow(Sender: TObject);
+var
+ currentRatio: single;
+ currentRatioStr: String;
+ currentRatioIdx, i: Integer;
begin
ToolBar_Rotate.Images := LazPaintInstance.Icons[DoScaleY(16,OriginalDPI)];
ToolBar_Ratio.Images := ToolBar_Rotate.Images;
@@ -322,11 +325,34 @@ procedure TFNewImage.FormShow(Sender: TObject);
ComboBox_BitDepth.Visible := false;
ComboBox_BitDepth.Text := '32';
end;
- if SpinEdit_Width.Value = SpinEdit_Height.Value then
+ FillAspectRatios;
+ FRatio := 0;
+ if SpinEdit_Height.Value <> 0 then
begin
- ComboBox_Ratio.Text := '1:1';
- FRatio := ComputeRatio(ComboBox_Ratio.Text);
- FLastEnteredValue := valRatio;
+ currentRatio := SpinEdit_Width.Value/SpinEdit_Height.Value;
+ currentRatioStr := RatioToStr(currentRatio);
+ currentRatioIdx := ComboBox_Ratio.Items.IndexOf(currentRatioStr);
+ if currentRatioIdx <> -1 then
+ begin
+ ComboBox_Ratio.Text := currentRatioStr;
+ FRatio := currentRatio;
+ FLastEnteredValue := valRatio;
+ end else
+ begin
+ for i := 0 to ComboBox_Ratio.Items.Count-1 do
+ begin
+ currentRatioStr := ComboBox_Ratio.Items[i];
+ currentRatio := ComputeRatio(currentRatioStr);
+ if (SpinEdit_Width.Value = round(SpinEdit_Height.Value*currentRatio)) or
+ (SpinEdit_Height.Value = round(SpinEdit_Width.Value/currentRatio)) then
+ begin
+ ComboBox_Ratio.Text := currentRatioStr;
+ FRatio := currentRatio;
+ FLastEnteredValue := valRatio;
+ break;
+ end;
+ end;
+ end;
end;
FRecomputing := false;
@@ -350,6 +376,7 @@ procedure TFNewImage.SpinEdit_WidthChange(Sender: TObject);
end;
FRecomputing:= false;
UpdatePreview;
+ FillAspectRatios;
end;
procedure TFNewImage.UpdatePreview;
@@ -381,6 +408,21 @@ function TFNewImage.GetBitDepth: integer;
result := StrToInt(ComboBox_BitDepth.Text);
end;
+procedure TFNewImage.FillAspectRatios;
+var
+ aspect, rotatedAspect: String;
+begin
+ ComboBox_Ratio.Items.Clear;
+ for aspect in defaultAspectRatios do
+ begin
+ if SpinEdit_Width.Value >= SpinEdit_Height.Value then
+ rotatedAspect := aspect
+ else
+ rotatedAspect := InverseRatio(aspect);
+ ComboBox_Ratio.Items.add(rotatedAspect);
+ end;
+end;
+
destructor TFNewImage.Destroy;
begin
if Assigned(FLazPaintInstance) then
diff --git a/lazpaint/dialog/uprint.lfm b/lazpaint/dialog/uprint.lfm
index 6a710f60..cf979db9 100644
--- a/lazpaint/dialog/uprint.lfm
+++ b/lazpaint/dialog/uprint.lfm
@@ -13,7 +13,7 @@ object FPrint: TFPrint
OnShow = FormShow
Position = poMainFormCenter
ShowInTaskBar = stAlways
- LCLVersion = '1.0.10.0'
+ LCLVersion = '2.2.0.1'
object Label_PrinterAndPaper: TLabel
Left = 9
Height = 25
@@ -22,7 +22,6 @@ object FPrint: TFPrint
AutoSize = False
Caption = 'Printer and paper:'
Layout = tlCenter
- ParentColor = False
end
object Label_SelectedPrinterAndPaper: TLabel
Cursor = crHandPoint
@@ -35,7 +34,6 @@ object FPrint: TFPrint
Color = clWindow
Font.Color = clWindowText
Layout = tlCenter
- ParentColor = False
ParentFont = False
Transparent = False
OnClick = Label_SelectedPrinterAndPaperClick
@@ -51,39 +49,37 @@ object FPrint: TFPrint
TabOrder = 0
end
object Label_Orientation: TLabel
- Left = 12
- Height = 16
+ Left = 9
+ Height = 15
Top = 37
- Width = 64
+ Width = 63
Caption = 'Orientation:'
- ParentColor = False
end
object ComboBox_Orientation: TComboBox
- Left = 12
+ Left = 9
Height = 23
Top = 53
- Width = 172
+ Width = 175
ItemHeight = 15
OnChange = ComboBox_OrientationChange
Style = csDropDownList
TabOrder = 1
end
object GroupBox_Margins: TGroupBox
- Left = 12
+ Left = 8
Height = 119
Top = 79
- Width = 174
+ Width = 178
Caption = 'Margins'
- ClientHeight = 101
- ClientWidth = 170
+ ClientHeight = 99
+ ClientWidth = 174
TabOrder = 2
object Label_Left: TLabel
- Left = 10
- Height = 16
+ Left = 7
+ Height = 15
Top = 27
- Width = 24
+ Width = 23
Caption = 'Left:'
- ParentColor = False
end
object Label_Top: TLabel
Left = 2
@@ -93,15 +89,13 @@ object FPrint: TFPrint
Alignment = taRightJustify
AutoSize = False
Caption = 'Top:'
- ParentColor = False
end
object Label_Right: TLabel
- Left = 106
- Height = 16
+ Left = 110
+ Height = 15
Top = 27
- Width = 32
+ Width = 31
Caption = 'Right:'
- ParentColor = False
end
object Label_Bottom: TLabel
Left = 2
@@ -111,7 +105,6 @@ object FPrint: TFPrint
Alignment = taRightJustify
AutoSize = False
Caption = 'Bottom:'
- ParentColor = False
end
object SpinEdit_Top: TSpinEdit
Left = 66
@@ -132,7 +125,7 @@ object FPrint: TFPrint
Value = 10
end
object SpinEdit_Left: TSpinEdit
- Left = 10
+ Left = 7
Height = 23
Top = 43
Width = 56
@@ -141,7 +134,7 @@ object FPrint: TFPrint
Value = 10
end
object SpinEdit_Right: TSpinEdit
- Left = 106
+ Left = 110
Height = 23
Top = 43
Width = 56
@@ -167,16 +160,16 @@ object FPrint: TFPrint
OnResize = BGRAVirtualScreen1Resize
end
object GroupBox_ImageSize: TGroupBox
- Left = 12
+ Left = 8
Height = 157
Top = 202
- Width = 175
+ Width = 179
Caption = 'Image size'
- ClientHeight = 139
- ClientWidth = 171
+ ClientHeight = 137
+ ClientWidth = 175
TabOrder = 4
object SpinEdit_DpiX: TSpinEdit
- Left = 10
+ Left = 7
Height = 23
Top = 38
Width = 56
@@ -188,23 +181,21 @@ object FPrint: TFPrint
Value = 96
end
object Label_DpiX: TLabel
- Left = 10
- Height = 16
+ Left = 7
+ Height = 15
Top = 22
- Width = 4
+ Width = 3
Caption = '.'
- ParentColor = False
end
object Label_Width: TLabel
- Left = 10
- Height = 16
+ Left = 7
+ Height = 15
Top = 63
- Width = 36
+ Width = 35
Caption = 'Width:'
- ParentColor = False
end
object SpinEdit_Width: TSpinEdit
- Left = 10
+ Left = 7
Height = 23
Top = 79
Width = 72
@@ -215,15 +206,14 @@ object FPrint: TFPrint
Value = 10
end
object Label_Height: TLabel
- Left = 90
- Height = 16
+ Left = 94
+ Height = 15
Top = 63
- Width = 40
+ Width = 39
Caption = 'Height:'
- ParentColor = False
end
object SpinEdit_Height: TSpinEdit
- Left = 90
+ Left = 94
Height = 23
Top = 79
Width = 72
@@ -234,16 +224,15 @@ object FPrint: TFPrint
Value = 10
end
object Label_DpiY: TLabel
- Left = 90
- Height = 16
+ Left = 94
+ Height = 15
Top = 22
- Width = 4
+ Width = 3
Caption = '.'
- ParentColor = False
Visible = False
end
object SpinEdit_DpiY: TSpinEdit
- Left = 90
+ Left = 94
Height = 23
Top = 38
Width = 56
@@ -256,7 +245,7 @@ object FPrint: TFPrint
Visible = False
end
object CheckBox_Ratio: TCheckBox
- Left = 10
+ Left = 7
Height = 19
Top = 3
Width = 110
@@ -270,7 +259,7 @@ object FPrint: TFPrint
Left = 7
Height = 25
Top = 110
- Width = 155
+ Width = 161
Caption = 'Zoom fit'
OnClick = Button_ZoomFitClick
TabOrder = 5
@@ -286,7 +275,7 @@ object FPrint: TFPrint
TabOrder = 5
end
object PrinterSetupDialog1: TPrinterSetupDialog
- left = 288
- top = 120
+ Left = 288
+ Top = 120
end
end
diff --git a/lazpaint/image/uimage.pas b/lazpaint/image/uimage.pas
index d611064d..527ed4cc 100644
--- a/lazpaint/image/uimage.pas
+++ b/lazpaint/image/uimage.pas
@@ -31,6 +31,7 @@ TLazPaintImage = class;
TOnStackChanged = procedure(ASender: TLazPaintImage; AScrollIntoView: boolean) of object;
TImageExceptionHandler = procedure(AFunctionName: string; AException: Exception) of object;
TOnCurrentFilenameChanged = procedure(ASender: TLazPaintImage) of object;
+ TOnRenderChanged = procedure(ASender: TLazPaintImage; AInvalidateAll: boolean) of object;
TOnQueryExitToolHandler = procedure(sender: TLazPaintImage) of object;
@@ -39,6 +40,7 @@ TLazPaintImage = class;
TLazPaintImage = class
private
FLazPaintInstance: TObject;
+ FZoom: TZoom;
FActionInProgress: TCustomLayerAction;
FOnActionProgress: TLayeredActionProgressEvent;
FOnSelectedLayerIndexChanging: TOnCurrentLayerIndexChanged;
@@ -51,7 +53,7 @@ TLazPaintImage = class
FRenderedImage: TBGRABitmap;
FRenderedImageInvalidated: TRect;
FOnImageChanged, FOnImageSaving, FOnImageExport: TLazPaintImageObservable;
- FOnImageRenderChanged: TNotifyEvent;
+ FOnImageRenderChanged: TOnRenderChanged;
FUndoList: TComposedImageDifference;
FUndoPos: integer;
FRenderUpdateRectInPicCoord, FRenderUpdateRectInVSCoord: TRect;
@@ -126,6 +128,7 @@ TLazPaintImage = class
procedure SetOnActionProgress(AValue: TLayeredActionProgressEvent);
procedure SetOnSizeChanged(AValue: TNotifyEvent);
procedure SetSelectionTransform(ATransform: TAffineMatrix);
+ procedure SetZoom(AValue: TZoom);
procedure UpdateIconFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
procedure UpdateTiffFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
procedure UpdateGifFileUTF8(AFilename: string; AOutputFilename: string = ''; AExport: boolean = false);
@@ -133,10 +136,10 @@ TLazPaintImage = class
procedure LayerActionNotifyChange({%H-}ASender: TObject; ALayer: TBGRABitmap; ARect: TRect);
procedure LayerActionDestroy(Sender: TObject);
procedure LayerActionNotifyUndo({%H-}ASender: TObject; AUndo: TCustomImageDifference; var Owned: boolean);
+ procedure ZoomOnCenterQuery(Sender: TObject);
public
OnException: TImageExceptionHandler;
ImageOffset: TPoint;
- Zoom: TZoom;
CursorHotSpot: TPoint;
BPP, FrameIndex, FrameCount: integer;
VisibleArea: TRectF;
@@ -169,6 +172,7 @@ TLazPaintImage = class
procedure SelectionMaskMayChange(ARect: TRect);
procedure SelectionMaskMayChangeCompletely;
procedure RenderMayChange(ARect: TRect; APicCoords: boolean = false; ANotify: boolean = true);
+ procedure RenderMayChangeCompletely(ANotify: boolean = true);
procedure ResetRenderUpdateRect;
// selection mask
@@ -267,7 +271,7 @@ TLazPaintImage = class
property OnSelectedLayerIndexChanged: TOnCurrentLayerIndexChanged read FOnSelectedLayerIndexChanged write FOnSelectedLayerIndexChanged;
property OnStackChanged: TOnStackChanged read FOnStackChanged write FOnStackChanged;
property OnImageChanged: TLazPaintImageObservable read FOnImageChanged;
- property OnImageRenderChanged: TNotifyEvent read FOnImageRenderChanged write FOnImageRenderChanged;
+ property OnImageRenderChanged: TOnRenderChanged read FOnImageRenderChanged write FOnImageRenderChanged;
property OnImageSaving: TLazPaintImageObservable read FOnImageSaving;
property OnImageExport: TLazPaintImageObservable read FOnImageExport;
property OnSizeChanged: TNotifyEvent read FOnSizeChanged write SetOnSizeChanged;
@@ -298,6 +302,7 @@ TLazPaintImage = class
property RenderUpdateRectInPicCoord: TRect read FRenderUpdateRectInPicCoord;
property RenderUpdateRectInVSCoord: TRect read FRenderUpdateRectInVSCoord;
property SelectionTransform: TAffineMatrix read GetSelectionTransform write SetSelectionTransform;
+ property Zoom: TZoom read FZoom write SetZoom;
property ZoomFactor: single read GetZoomFactor;
property DraftOriginal: boolean read FDraftOriginal write SetDraftOriginal;
property IsIconCursor: boolean read GetIsIconCursor;
@@ -352,6 +357,11 @@ procedure TLazPaintImage.LayerActionNotifyUndo(ASender: TObject; AUndo: TCustomI
OnImageChanged.NotifyObservers;
end;
+procedure TLazPaintImage.ZoomOnCenterQuery(Sender: TObject);
+begin
+ ImageOffset := Point(0,0);
+end;
+
function TLazPaintImage.MakeCroppedLayer: TBGRABitmap;
var r: TRect;
cropped: TBGRABitmap;
@@ -964,6 +974,14 @@ procedure TLazPaintImage.SetSelectionTransform(ATransform: TAffineMatrix);
end;
end;
+procedure TLazPaintImage.SetZoom(AValue: TZoom);
+begin
+ if FZoom=AValue then Exit;
+ if Assigned(FZoom) then FZoom.OnCenterQuery:= nil;
+ FZoom:=AValue;
+ if Assigned(FZoom) then FZoom.OnCenterQuery:=@ZoomOnCenterQuery;
+end;
+
procedure TLazPaintImage.SetLayerName(AIndex: integer; AValue: string);
begin
AddUndo(FCurrentState.SetLayerName(AIndex,Avalue));
@@ -1253,6 +1271,7 @@ procedure TLazPaintImage.ImageMayChange(ARect: TRect;
procedure TLazPaintImage.ImageMayChangeCompletely;
begin
ImageMayChange(rect(0,0,Width,Height));
+ RenderMayChangeCompletely;
end;
procedure TLazPaintImage.LayerMayChange(ALayer: TBGRABitmap; ARect: TRect);
@@ -1325,7 +1344,14 @@ procedure TLazPaintImage.RenderMayChange(ARect: TRect; APicCoords: boolean; ANot
else
FRenderUpdateRectInVSCoord := RectUnion(FRenderUpdateRectInVSCoord,ARect);
if ANotify and Assigned(OnImageRenderChanged) then
- OnImageRenderChanged(self);
+ OnImageRenderChanged(self, false);
+end;
+
+procedure TLazPaintImage.RenderMayChangeCompletely(ANotify: boolean);
+begin
+ FRenderUpdateRectInPicCoord := rect(-MaxLongint div 2,-MaxLongint div 2,MaxLongint div 2,MaxLongint div 2);
+ if ANotify and Assigned(OnImageRenderChanged) then
+ OnImageRenderChanged(self, true);
end;
procedure TLazPaintImage.LayerBlendMayChange(AIndex: integer);
diff --git a/lazpaint/image/uimageaction.pas b/lazpaint/image/uimageaction.pas
index 13c62335..3c13be8d 100644
--- a/lazpaint/image/uimageaction.pas
+++ b/lazpaint/image/uimageaction.pas
@@ -20,7 +20,7 @@ TImageActions = class
function GetCurrentTool: TPaintToolType;
function GetImage: TLazPaintImage;
function GetToolManager: TToolManager;
- procedure ChooseTool(ATool: TPaintToolType);
+ procedure ChooseTool(ATool: TPaintToolType; AAsFromGui: boolean = true);
procedure RegisterScripts(ARegister: Boolean);
function GenericScriptFunction(AVars: TVariableSet): TScriptResult;
function ScriptGetAllLayersId(AVars: TVariableSet): TScriptResult;
@@ -131,9 +131,9 @@ function TImageActions.GetToolManager: TToolManager;
result := FInstance.ToolManager;
end;
-procedure TImageActions.ChooseTool(ATool: TPaintToolType);
+procedure TImageActions.ChooseTool(ATool: TPaintToolType; AAsFromGui: boolean);
begin
- FInstance.ChooseTool(ATool);
+ FInstance.ChooseTool(ATool, AAsFromGui);
end;
procedure TImageActions.RegisterScripts(ARegister: Boolean);
@@ -805,8 +805,11 @@ function TImageActions.SmartZoom3: boolean;
end;
procedure TImageActions.Undo;
+var
+ prevTool: TPaintToolType;
begin
try
+ prevTool := CurrentTool;
if CurrentTool in[ptMoveSelection,ptRotateSelection] then ChooseTool(ptHand);
if ToolManager.ToolProvideCommand(tcFinish) then ToolManager.ToolCommand(tcFinish);
if image.CanUndo then
@@ -815,6 +818,9 @@ procedure TImageActions.Undo;
image.Undo;
ToolManager.ToolOpen;
end;
+ if (prevTool in[ptMoveSelection,ptRotateSelection]) and
+ not image.SelectionMaskEmpty then
+ ChooseTool(prevTool, false);
except
on ex:Exception do
FInstance.ShowError('Undo',ex.Message);
@@ -822,8 +828,11 @@ procedure TImageActions.Undo;
end;
procedure TImageActions.Redo;
+var
+ prevTool: TPaintToolType;
begin
try
+ prevTool := CurrentTool;
if CurrentTool in[ptLayerMapping,ptMoveSelection,ptRotateSelection] then
ChooseTool(ptHand);
if image.CanRedo then
@@ -832,6 +841,9 @@ procedure TImageActions.Redo;
image.Redo;
ToolManager.ToolOpen;
end;
+ if (prevTool in[ptMoveSelection,ptRotateSelection]) and
+ not image.SelectionMaskEmpty then
+ ChooseTool(prevTool, false);
except
on ex:Exception do
FInstance.ShowError('Redo',ex.Message);
@@ -938,7 +950,7 @@ function TImageActions.LoadSelection(AFilenameUTF8: string; ALoadedImage: PImage
if Assigned(ALoadedImage) and Assigned(ALoadedImage^.bmp) then
begin
newSelection := ALoadedImage^.bmp;
- ALoadedImage^.FreeAndNil;
+ ALoadedImage^.Release;
end
else
newSelection := LoadFlatImageUTF8(AFilenameUTF8).bmp;
@@ -952,7 +964,7 @@ function TImageActions.LoadSelection(AFilenameUTF8: string; ALoadedImage: PImage
LayerAction.RemoveSelection;
LayerAction.QuerySelection;
LayerAction.CurrentSelection.PutImage(0,0,newSelection,dmSet);
- LayerAction.NotifyChange(Image.SelectionMask,Image.SelectionMaskBounds);
+ LayerAction.NotifyChange(Image.SelectionMask,rect(0,0,newSelection.Width,newSelection.Height));
LayerAction.Validate;
result := true;
end;
@@ -1541,10 +1553,24 @@ procedure TImageActions.RetrieveSelection;
procedure TImageActions.DeleteSelection;
var LayerAction: TLayerAction;
- doErase: Boolean;
+ doErase, wasSelecting: Boolean;
+ prevTool: TPaintToolType;
begin
- if image.SelectionMaskEmpty then exit;
- if not image.CheckNoAction then exit;
+ if image.SelectionMaskEmpty then
+ begin
+ prevTool := ToolManager.GetCurrentToolType;
+ if (prevTool in [ptMoveLayer, ptZoomLayer, ptRotateLayer])
+ and (image.NbLayers > 1) then
+ begin
+ ChooseTool(ptHand, false);
+ Image.RemoveLayer;
+ ChooseTool(prevTool, false);
+ end;
+ exit;
+ end;
+ wasSelecting := ToolManager.GetCurrentToolType in [ptSelectPen..ptSelectSpline];
+ if wasSelecting then ToolManager.ToolCloseDontReopen
+ else if not image.CheckNoAction then exit;
LayerAction := nil;
try
doErase := Image.SelectionLayerIsEmpty;
@@ -1557,7 +1583,8 @@ procedure TImageActions.DeleteSelection;
FInstance.ShowError('DeleteSelection',ex.Message);
end;
LayerAction.Free;
- if (CurrentTool = ptRotateSelection) or
+ if wasSelecting then ToolManager.ToolOpen
+ else if (CurrentTool = ptRotateSelection) or
(CurrentTool = ptMoveSelection) then
ChooseTool(ptHand);
end;
diff --git a/lazpaint/lazpaint.lpi b/lazpaint/lazpaint.lpi
index 0472c82a..fd387764 100644
--- a/lazpaint/lazpaint.lpi
+++ b/lazpaint/lazpaint.lpi
@@ -25,8 +25,7 @@
-
-
+
@@ -413,14 +412,15 @@
-
+
-
+
+
@@ -429,7 +429,7 @@
-
+
@@ -1052,6 +1052,10 @@
+
+
+
+
diff --git a/lazpaint/lazpaintdialogs.inc b/lazpaint/lazpaintdialogs.inc
index 6e508ad2..bf83676a 100644
--- a/lazpaint/lazpaintdialogs.inc
+++ b/lazpaint/lazpaintdialogs.inc
@@ -123,7 +123,7 @@ begin
ScriptContext.RecordingFunctionParameters.AddPixel('BackColor', bitmapRepl.GetPixel(0,0));
end;
end;
- ChooseTool(ptHand);
+ ChooseTool(ptHand, true);
image.Assign(bitmapRepl, True, False);
Image.CurrentFilenameUTF8 := '';
image.SetSavedFlag(0,-1,0);
diff --git a/lazpaint/lazpaintembeddedpack.lpk b/lazpaint/lazpaintembeddedpack.lpk
index db02b4d0..5183b090 100644
--- a/lazpaint/lazpaintembeddedpack.lpk
+++ b/lazpaint/lazpaintembeddedpack.lpk
@@ -26,7 +26,7 @@
-
+
diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas
index 870b5b97..720a54a4 100644
--- a/lazpaint/lazpaintinstance.pas
+++ b/lazpaint/lazpaintinstance.pas
@@ -213,7 +213,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance)
procedure Show; override;
function Hide: boolean; override;
procedure Run; override;
- procedure Restart; override;
+ function Restart: boolean; override;
procedure CancelRestart; override;
destructor Destroy; override;
procedure NotifyImageChange(RepaintNow: boolean; ARect: TRect); override;
@@ -268,7 +268,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance)
procedure InvalidateLayerStack; override;
procedure UpdateLayerStackOnTimer; override;
function MakeNewBitmapReplacement(AWidth, AHeight: integer; AColor: TBGRAPixel): TBGRABitmap; override;
- procedure ChooseTool(Tool : TPaintToolType); override;
+ procedure ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean); override;
function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; override;
procedure AddToImageList(const FileNames: array of String); override;
procedure UpdateToolbar; override;
@@ -1263,6 +1263,7 @@ procedure TLazPaintInstance.EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStre
if bmp <> nil then subLaz.AssignBitmap(bmp);
subLaz.AboutText := AboutText;
subLaz.EmbeddedImageBackup := bmp;
+ subLaz.FMain.BorderIcons := subLaz.FMain.BorderIcons - [biMinimize];
if AOnRun <> nil then
AOnRun(subLaz);
subLaz.Run;
@@ -1283,7 +1284,11 @@ procedure TLazPaintInstance.EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStre
ShowError('EditBitmap',ex.Message);
end;
ShowTopmost(topmostInfo);
- if FMain <> nil then FMain.Enabled := true;
+ if FMain <> nil then
+ begin
+ FMain.Enabled := true;
+ FMain.BringToFront;
+ end;
subLaz.Free;
end;
@@ -1521,11 +1526,15 @@ function TLazPaintInstance.ProcessCommands(commands: TStringList): boolean;
end;
procedure TLazPaintInstance.ChangeIconSize(size: integer);
+var
+ prevSize: Integer;
begin
if Config.DefaultIconSize(0)<>size then
begin
+ prevSize := Config.DefaultIconSize(0);
Config.SetDefaultIconSize(size);
- Restart;
+ if not Restart then
+ Config.SetDefaultIconSize(prevSize);
end;
end;
@@ -1550,18 +1559,20 @@ procedure TLazPaintInstance.Run;
begin
if not MainFormVisible then Show;
repeat
- application.ProcessMessages;
- Sleep(10);
- until not MainFormVisible;
+ Application.ProcessMessages;
+ if not Application.Terminated then Application.Idle(True);
+ until not MainFormVisible or Application.Terminated;
end;
-procedure TLazPaintInstance.Restart;
+function TLazPaintInstance.Restart: boolean;
begin
if FMain <> nil then
begin
FRestartQuery := true;
FMain.Close;
- end;
+ result := FRestartQuery;
+ end else
+ result := true;
end;
procedure TLazPaintInstance.CancelRestart;
@@ -1598,7 +1609,9 @@ destructor TLazPaintInstance.Destroy;
begin
Config.SetDefaultToolboxWindowVisible(ToolboxVisible or (FTopMostInfo.toolboxHidden > 0));
Config.SetDefaultToolboxWindowPosition(FFormToolbox.BoundsRect);
- end;
+ end else
+ if Assigned(FMain) then
+ Config.SetDefaultToolboxWindowVisible(FMain.Layout.ToolBoxVisible);
ToolManager.SaveToConfig;
BGRALayers.UnregisterLoadingHandler(@OnLayeredBitmapLoadStartHandler,@OnLayeredBitmapLoadProgressHandler,@OnLayeredBitmapLoadedHandler);
@@ -1875,9 +1888,17 @@ procedure TLazPaintInstance.ColorFromFChooseColor;
end;
procedure TLazPaintInstance.ColorToFChooseColor;
+var
+ c: TBGRAPixel;
begin
if not Assigned(FChooseColor) or InColorFromFChooseColor then exit;
- FChooseColor.SetCurrentColor(GetColor(FChooseColor.ColorTarget));
+ c := GetColor(FChooseColor.ColorTarget);
+ if (c.alpha = 0) and (FChooseColor.ColorTarget in [ctForeColorSolid, ctBackColorSolid, ctOutlineColorSolid]) then
+ begin
+ c := FChooseColor.GetCurrentColor;
+ c.alpha := 0;
+ end;
+ FChooseColor.SetCurrentColor(c);
end;
procedure TLazPaintInstance.ExitColorEditor;
@@ -1983,10 +2004,10 @@ function TLazPaintInstance.MakeNewBitmapReplacement(AWidth, AHeight: integer; AC
result := TBGRABitmap.Create(AWidth,AHeight, AColor);
end;
-procedure TLazPaintInstance.ChooseTool(Tool: TPaintToolType);
+procedure TLazPaintInstance.ChooseTool(Tool: TPaintToolType; AAsFromGui: boolean);
begin
FormsNeeded;
- if Assigned(FMain) then FMain.ChooseTool(Tool);
+ if Assigned(FMain) then FMain.ChooseTool(Tool, AAsFromGui);
end;
function TLazPaintInstance.GetToolboxHeight: integer;
diff --git a/lazpaint/lazpaintmainform.lfm b/lazpaint/lazpaintmainform.lfm
index 79266289..a2dffa16 100644
--- a/lazpaint/lazpaintmainform.lfm
+++ b/lazpaint/lazpaintmainform.lfm
@@ -218,7 +218,7 @@ object FMain: TFMain
object Panel_PenWidth: TPanel
Left = 608
Height = 36
- Top = 144
+ Top = 56
Width = 105
ClientHeight = 36
ClientWidth = 105
@@ -470,7 +470,7 @@ object FMain: TFMain
object Panel_Tolerance: TPanel
Left = 279
Height = 36
- Top = 296
+ Top = 336
Width = 140
ClientHeight = 36
ClientWidth = 140
@@ -932,6 +932,7 @@ object FMain: TFMain
object ComboBox_ArrowStart: TBCComboBox
Left = 2
Height = 21
+ Hint = 'Starting arrow'
Top = 1
Width = 43
ItemIndex = -1
@@ -1036,6 +1037,7 @@ object FMain: TFMain
object ComboBox_ArrowEnd: TBCComboBox
Left = 47
Height = 21
+ Hint = 'Ending arrow'
Top = 1
Width = 43
ItemIndex = -1
@@ -1308,7 +1310,7 @@ object FMain: TFMain
object Panel_Grid: TPanel
Left = 424
Height = 36
- Top = 296
+ Top = 336
Width = 172
ClientHeight = 36
ClientWidth = 172
@@ -1513,7 +1515,7 @@ object FMain: TFMain
object Panel_PenWidthPreview: TPanel
Left = 608
Height = 104
- Top = 176
+ Top = 92
Width = 106
BevelOuter = bvNone
ClientHeight = 104
@@ -1526,7 +1528,7 @@ object FMain: TFMain
object PaintBox_PenPreview: TPaintBox
Left = 6
Height = 91
- Top = 6
+ Top = 7
Width = 93
Font.Height = -12
ParentFont = False
@@ -1752,6 +1754,7 @@ object FMain: TFMain
ParentColor = False
ParentFont = False
TabOrder = 19
+ OnMouseMove = Panel_TextMouseMove
object Label_Text: TLabel
Left = 4
Height = 22
@@ -1762,6 +1765,7 @@ object FMain: TFMain
Font.Height = -12
Layout = tlCenter
ParentFont = False
+ OnMouseMove = Panel_TextMouseMove
end
object ToolBar15: TToolBar
Left = 85
@@ -1775,17 +1779,20 @@ object FMain: TFMain
Images = ImageList16
ParentFont = False
TabOrder = 0
+ OnMouseMove = Panel_TextMouseMove
object Tool_TextFont: TToolButton
Left = 1
Hint = 'Choose font...'
Top = 0
ImageIndex = 61
+ OnMouseMove = Panel_TextMouseMove
end
object Tool_TextPhong: TToolButton
Left = 93
Hint = 'Text phong shading'
Top = 0
ImageIndex = 74
+ OnMouseMove = Panel_TextMouseMove
Style = tbsCheck
end
object Tool_TextAlignLeft: TToolButton
@@ -1795,6 +1802,7 @@ object FMain: TFMain
Down = True
Grouped = True
ImageIndex = 84
+ OnMouseMove = Panel_TextMouseMove
Style = tbsCheck
end
object Tool_TextAlignCenter: TToolButton
@@ -1803,6 +1811,7 @@ object FMain: TFMain
Top = 0
Grouped = True
ImageIndex = 85
+ OnMouseMove = Panel_TextMouseMove
Style = tbsCheck
end
object Tool_TextAlignRight: TToolButton
@@ -1811,6 +1820,7 @@ object FMain: TFMain
Top = 0
Grouped = True
ImageIndex = 86
+ OnMouseMove = Panel_TextMouseMove
Style = tbsCheck
end
end
@@ -1889,12 +1899,13 @@ object FMain: TFMain
TabOrder = 1
TabStop = True
UseDockManager = False
+ OnMouseMove = Panel_TextMouseMove
end
end
object Panel_PhongShape: TPanel
Left = 8
Height = 36
- Top = 248
+ Top = 288
Width = 306
ClientHeight = 36
ClientWidth = 306
@@ -2075,7 +2086,7 @@ object FMain: TFMain
object Panel_Altitude: TPanel
Left = 331
Height = 36
- Top = 248
+ Top = 288
Width = 111
ClientHeight = 36
ClientWidth = 111
@@ -2332,7 +2343,7 @@ object FMain: TFMain
object Panel_Brush: TPanel
Left = 8
Height = 36
- Top = 296
+ Top = 336
Width = 266
ClientHeight = 36
ClientWidth = 266
@@ -3324,9 +3335,131 @@ object FMain: TFMain
EditingGradTexPoints = False
end
end
+ object Panel_TextMore: TPanel
+ Left = 9
+ Height = 30
+ Top = 243
+ Width = 265
+ ClientHeight = 30
+ ClientWidth = 265
+ TabOrder = 34
+ Visible = False
+ OnMouseMove = Panel_TextMoreMouseMove
+ object ToolBar25: TToolBar
+ Left = 1
+ Height = 22
+ Top = 1
+ Width = 247
+ Align = alNone
+ AutoSize = True
+ EdgeBorders = []
+ Font.Height = -12
+ Images = SVGRasterImageList1
+ ParentFont = False
+ TabOrder = 0
+ OnMouseMove = Panel_TextMoreMouseMove
+ object Tool_TextBold: TToolButton
+ Left = 1
+ Hint = 'Bold'
+ Top = 0
+ ImageIndex = 0
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextItalic: TToolButton
+ Left = 24
+ Hint = 'Italic'
+ Top = 0
+ ImageIndex = 1
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextUnderline: TToolButton
+ Left = 47
+ Hint = 'Underline'
+ Top = 0
+ ImageIndex = 2
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextStrikeout: TToolButton
+ Left = 70
+ Hint = 'Strikeout'
+ Top = 0
+ ImageIndex = 3
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextBidirectional: TToolButton
+ Left = 101
+ Hint = 'Bidirectional'
+ Top = 0
+ Down = True
+ Grouped = True
+ ImageIndex = 4
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextLTR: TToolButton
+ Left = 124
+ Hint = 'Left to right'
+ Top = 0
+ Grouped = True
+ ImageIndex = 5
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextRTL: TToolButton
+ Left = 147
+ Hint = 'Right to left'
+ Top = 0
+ Grouped = True
+ ImageIndex = 6
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextAlignTop: TToolButton
+ Left = 178
+ Hint = 'Align top'
+ Top = 0
+ Down = True
+ ImageIndex = 7
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextAlignMiddle: TToolButton
+ Left = 201
+ Hint = 'Center vertically'
+ Top = 0
+ ImageIndex = 8
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object Tool_TextAlignBottom: TToolButton
+ Left = 224
+ Hint = 'Align bottom'
+ Top = 0
+ ImageIndex = 9
+ OnMouseMove = Panel_TextMoreMouseMove
+ Style = tbsCheck
+ end
+ object ToolButton1: TToolButton
+ Left = 170
+ Height = 22
+ Top = 0
+ Style = tbsSeparator
+ end
+ object ToolButton2: TToolButton
+ Left = 93
+ Height = 22
+ Top = 0
+ Style = tbsSeparator
+ end
+ end
+ end
object ImageList16: TBGRAImageList
- Left = 40
- Top = 496
+ Left = 27
+ Top = 514
Bitmap = {
4C7A8600000010000000100000006A8300000000000078DAEC5D07581457D71E
EC5D6CB1A112628D359AA8B1A22696C45E63C70662895DB18205411101A5AB34
@@ -4384,8 +4517,8 @@ object FMain: TFMain
end
object ActionList1: TActionList
Images = ImageList16
- Left = 43
- Top = 427
+ Left = 30
+ Top = 449
object FileNew: TAction
Category = 'File'
Caption = 'New...'
@@ -5407,6 +5540,7 @@ object FMain: TFMain
Hint = 'Center shape horizontally'
OnExecute = EditShapeCenterHorizontallyExecute
OnUpdate = EditShapeCenterHorizontallyUpdate
+ ShortCut = 32840
end
object EditShapeAlignRight: TAction
Category = 'Edit'
@@ -5427,6 +5561,7 @@ object FMain: TFMain
Hint = 'Center shape vertically'
OnExecute = EditShapeCenterVerticallyExecute
OnUpdate = EditShapeCenterVerticallyUpdate
+ ShortCut = 32854
end
object EditShapeAlignBottom: TAction
Category = 'Edit'
@@ -5471,6 +5606,14 @@ object FMain: TFMain
ImageIndex = 3
OnExecute = LayerExportExecute
end
+ object FileQuickSave: TAction
+ Category = 'File'
+ Caption = 'Quick save'
+ Hint = 'Save current file without dialogs'
+ OnExecute = FileQuickSaveExecute
+ OnUpdate = FileSaveUpdate
+ ShortCut = 16465
+ end
end
object ColorDialog1: TColorDialog
Title = 'Choose color'
@@ -5497,13 +5640,13 @@ object FMain: TFMain
'ColorS=F0FBFF'
'ColorT=A4A0A0'
)
- Left = 219
- Top = 427
+ Left = 204
+ Top = 385
end
object MainMenu1: TMainMenu
Images = ImageList16
- Left = 43
- Top = 363
+ Left = 30
+ Top = 385
object MenuFile: TMenuItem
Caption = 'File'
OnClick = MenuFileClick
@@ -5537,11 +5680,9 @@ object FMain: TFMain
end
object MenuEdit: TMenuItem
Caption = 'Edit'
- Visible = False
end
object MenuSelect: TMenuItem
Caption = 'Select'
- Visible = False
end
object MenuView: TMenuItem
Caption = 'View'
@@ -5562,7 +5703,6 @@ object FMain: TFMain
end
object MenuImage: TMenuItem
Caption = 'Image'
- Visible = False
object MenuRemoveTransparency: TMenuItem
Caption = 'Remove transparency'
Visible = False
@@ -5570,15 +5710,12 @@ object FMain: TFMain
end
object MenuColors: TMenuItem
Caption = 'Colors'
- Visible = False
end
object MenuTool: TMenuItem
Caption = 'Tools'
- Visible = False
end
object MenuFilter: TMenuItem
Caption = 'Filter'
- Visible = False
object MenuRadialBlur: TMenuItem
Caption = 'Radial blur'
Visible = False
@@ -5586,23 +5723,20 @@ object FMain: TFMain
end
object MenuRender: TMenuItem
Caption = 'Render'
- Visible = False
end
object MenuScript: TMenuItem
Caption = 'Script'
- Visible = False
end
object MenuHelp: TMenuItem
Caption = 'Help'
- Visible = False
end
end
object TimerHidePenPreview: TTimer
Enabled = False
Interval = 3000
OnTimer = TimerHidePenPreviewTimer
- Left = 646
- Top = 288
+ Left = 653
+ Top = 514
end
object FontDialog1: TFontDialog
Font.CharSet = ANSI_CHARSET
@@ -5612,73 +5746,73 @@ object FMain: TFMain
Font.Quality = fqDraft
MinFontSize = 0
MaxFontSize = 0
- Left = 216
- Top = 496
+ Left = 204
+ Top = 449
end
object LoadSelectionDialog: TOpenPictureDialog
Title = 'Load selection'
Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
- Left = 335
- Top = 363
+ Left = 306
+ Top = 385
end
object OpenPictureDialog1: TOpenDialog
Title = 'Open existing image'
Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
- Left = 456
- Top = 363
+ Left = 427
+ Top = 385
end
object OpenTextureDialog: TOpenDialog
Title = 'Open texture'
DefaultExt = '.png'
Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
- Left = 332
- Top = 496
+ Left = 303
+ Top = 514
end
object TimerUpdate: TTimer
Interval = 50
OnTimer = TimerUpdateTimer
- Left = 219
- Top = 363
+ Left = 653
+ Top = 328
end
object Open3DObjectDialog: TOpenDialog
Title = 'Import 3D object'
DefaultExt = '.obj'
Filter = 'Wavefront Object file (*.obj)|*.obj;*.Obj;*.OBJ'
Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
- Left = 453
- Top = 496
+ Left = 424
+ Top = 514
end
object SavePictureDialog1: TSaveDialog
Title = 'Save file as...'
DefaultExt = '.png'
Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail]
- Left = 456
- Top = 427
+ Left = 427
+ Top = 449
end
object TimerLoadToolWin: TTimer
Interval = 200
OnTimer = TimerLoadToolWinTimer
- Left = 680
- Top = 427
+ Left = 653
+ Top = 385
end
object SaveSelectionDialog: TSaveDialog
Title = 'Save selection as...'
DefaultExt = '.lzp'
Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail]
- Left = 335
- Top = 427
+ Left = 306
+ Top = 449
end
object OpenBrushDialog: TOpenDialog
Title = 'Open brush'
DefaultExt = '.lzp'
Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail]
- Left = 578
- Top = 363
+ Left = 544
+ Top = 385
end
object PopupToolbar: TPopupMenu
OnPopup = PopupToolbarPopup
- Left = 130
- Top = 427
+ Left = 115
+ Top = 449
object MenuFileToolbar: TMenuItem
Caption = 'Show file toolbar'
OnClick = MenuFileToolbarClick
@@ -5706,8 +5840,8 @@ object FMain: TFMain
end
object PopupToolbox: TPopupMenu
OnPopup = PopupToolboxPopup
- Left = 130
- Top = 363
+ Left = 115
+ Top = 385
object MenuDockToolboxLeft: TMenuItem
Caption = 'Dock left'
OnClick = MenuDockToolboxLeftClick
@@ -5724,8 +5858,8 @@ object FMain: TFMain
object ImageList48: TBGRAImageList
Height = 48
Width = 48
- Left = 127
- Top = 496
+ Left = 112
+ Top = 514
Bitmap = {
4C7A860000003000000030000000756303000000000078DAEC9D057C1457F7F7
135CFA94FAD33E155ADA52A0B4B8BBBBBBBBBB3B418B1477777709094112E2EE
@@ -12674,21 +12808,663 @@ object FMain: TFMain
Enabled = False
Interval = 50
OnTimer = TimerArrangeTimer
- Left = 578
- Top = 496
+ Left = 544
+ Top = 514
end
object TimerHideFill: TTimer
Enabled = False
Interval = 3000
OnTimer = TimerHideFillTimer
- Left = 680
- Top = 496
+ Left = 653
+ Top = 449
end
object ExportPictureDialog: TSaveDialog
Title = 'Export as...'
DefaultExt = '.png'
Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail]
- Left = 578
- Top = 427
+ Left = 544
+ Top = 449
+ end
+ object SVGImageList1: TBGRASVGImageList
+ Width = 16
+ Height = 16
+ TargetRasterImageList = SVGRasterImageList1
+ Left = 200
+ Top = 514
+ Items = {
+ 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574
+ 662D38223F3E0D0A3C434F4E46494720436F756E743D223130223E0D0A20203C
+ 4974656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F
+ 743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D38
+ 2671756F743B3F2667743B262378443B262378413B266C743B73766720776964
+ 74683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B6874
+ 74703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068
+ 65696768743D2671756F743B33322671756F743B2076696577426F783D267175
+ 6F743B3020302033322033322671756F743B20786D6C6E733A696E6B73636170
+ 653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F
+ 6E616D657370616365732F696E6B73636170652671756F743B2667743B262378
+ 443B262378413B2020266C743B67206F7061636974793D2671756F743B312671
+ 756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F7769
+ 6B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F66
+ 6F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F74
+ 3B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F6465
+ 3D2671756F743B6C617965722671756F743B20626772613A6F726967696E616C
+ 56696577426F783D2671756F743B3020302032392032382671756F743B266774
+ 3B262378443B262378413B20202020266C743B7061746820643D2671756F743B
+ 4D32382E383433373520362E353933373520302E303933373520302E30333132
+ 352671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073
+ 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163
+ 6974793D2671756F743B312671756F743B2F2667743B262378443B262378413B
+ 20202020266C743B7061746820643D2671756F743B4D39203238203920332031
+ 352033203135203238207A2671756F743B2066696C6C3D2671756F743B626C61
+ 636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B
+ 2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175
+ 6F743B2F2667743B262378443B262378413B20202020266C743B706174682064
+ 3D2671756F743B4D31352032382031382E38383436312032372E393434373120
+ 5132322E37363932332032372E38383934322032342E38363239382032352E36
+ 303831372032362E39353637332032332E33323639322032362E393738333620
+ 32302E31363334362032372031372032352E37352031352E32352032342E3520
+ 31332E352032322E32352031322E37352032302031322031372E35203132204C
+ 3135203132203135203136203137203136205131392031362032302E35203137
+ 2032322031382032312E38323231312032302E30333834362032312E36343432
+ 332032322E30373639322032302E32363932332032322E39383331372031382E
+ 38393432332032332E38383934322031362E39343731312032332E3934343731
+ 204C3135203234207A2671756F743B2066696C6C3D2671756F743B626C61636B
+ 2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066
+ 696C6C2D6F7061636974793D2671756F743B302E373932313536392671756F74
+ 3B2F2667743B262378443B262378413B2020266C743B2F672667743B26237844
+ 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D
+ 0A20203C4974656D31205356473D22266C743B3F786D6C2076657273696F6E3D
+ 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75
+ 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667
+ 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F
+ 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F
+ 743B206865696768743D2671756F743B33322671756F743B2076696577426F78
+ 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B
+ 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E
+ 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774
+ 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74
+ 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A
+ 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53
+ 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26
+ 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570
+ 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967
+ 696E616C56696577426F783D2671756F743B3020302032392032382671756F74
+ 3B2667743B262378443B262378413B20202020266C743B7061746820643D2671
+ 756F743B4D32382E383433373520362E353933373520302E303933373520302E
+ 30333132352671756F743B2066696C6C3D2671756F743B626C61636B2671756F
+ 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D
+ 6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B26
+ 2378413B20202020266C743B7061746820643D2671756F743B4D313120323820
+ 31362E352031332032302E35203133203135203238207A2671756F743B206669
+ 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+ 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+ 302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+ 2020266C743B7061746820643D2671756F743B4D313820313020313920362032
+ 3320362032312E37313837352031302E3039333735207A2671756F743B206669
+ 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+ 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+ 302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+ 2020266C743B7061746820643D2671756F743B4D32342E34303632352031342E
+ 333433373520312E303933373520302E3033313235207A2671756F743B206669
+ 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+ 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+ 302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+ 266C743B2F672667743B262378443B262378413B266C743B2F7376672667743B
+ 262378443B262378413B222F3E0D0A20203C4974656D32205356473D22266C74
+ 3B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B20656E
+ 636F64696E673D2671756F743B7574662D382671756F743B3F2667743B262378
+ 443B262378413B266C743B7376672077696474683D2671756F743B3332267175
+ 6F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72
+ 672F323030302F7376672671756F743B206865696768743D2671756F743B3332
+ 2671756F743B2076696577426F783D2671756F743B3020302033322033322671
+ 756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F
+ 2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B
+ 73636170652671756F743B2667743B262378443B262378413B2020266C743B67
+ 206F7061636974793D2671756F743B312671756F743B20786D6C6E733A626772
+ 613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C2E
+ 6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20696E
+ 6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B20
+ 696E6B73636170653A67726F75706D6F64653D2671756F743B6C617965722671
+ 756F743B20626772613A6F726967696E616C56696577426F783D2671756F743B
+ 2D3331202D352039342033352671756F743B2667743B262378443B262378413B
+ 20202020266C743B7465787420783D2671756F743B302671756F743B20793D26
+ 71756F743B2D352671756F743B2066696C6C3D2671756F743B626C61636B2671
+ 756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E
+ 742D73697A653D2671756F743B33312671756F743B20666F6E742D7374796C65
+ 3D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D
+ 2671756F743B4672656553616E732671756F743B20666F6E742D776569676874
+ 3D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F706163697479
+ 3D2671756F743B302E373932313536392671756F743B20746578742D6465636F
+ 726174696F6E3D2671756F743B2671756F743B2667743B262378443B26237841
+ 3B202020202020266C743B747370616E20783D2671756F743B372E3337373836
+ 372671756F743B20793D2671756F743B32332671756F743B2064697265637469
+ 6F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D2671
+ 756F743B31372E32343432372671756F743B2667743B75266C743B2F74737061
+ 6E2667743B262378443B262378413B20202020266C743B2F746578742667743B
+ 262378443B262378413B20202020266C743B7061746820643D2671756F743B4D
+ 362E3520333020362E352032362032352E352032362032352E35203330207A26
+ 71756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20737472
+ 6F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974
+ 793D2671756F743B302E373932313536392671756F743B2F2667743B26237844
+ 3B262378413B2020266C743B2F672667743B262378443B262378413B266C743B
+ 2F7376672667743B262378443B262378413B222F3E0D0A20203C4974656D3320
+ 5356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E3026
+ 71756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B
+ 3F2667743B262378443B262378413B266C743B7376672077696474683D267175
+ 6F743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F77
+ 77772E77332E6F72672F323030302F7376672671756F743B206865696768743D
+ 2671756F743B33322671756F743B2076696577426F783D2671756F743B302030
+ 2033322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F
+ 743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D657370
+ 616365732F696E6B73636170652671756F743B2667743B262378443B26237841
+ 3B2020266C743B67206F7061636974793D2671756F743B312671756F743B2078
+ 6D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E667265
+ 6570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D617426
+ 71756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61796572
+ 312671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F74
+ 3B6C617965722671756F743B20626772613A6F726967696E616C56696577426F
+ 783D2671756F743B3520392032322031392671756F743B2667743B262378443B
+ 262378413B20202020266C743B7061746820643D2671756F743B4D352E352032
+ 3020352E352031362032362E352031362032362E35203230207A2671756F743B
+ 2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26
+ 71756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D267175
+ 6F743B302E373932313536392671756F743B2F2667743B262378443B26237841
+ 3B20202020266C743B7061746820643D2671756F743B4D31322E373532353120
+ 32322E30343231372031332E30393533342032332E3139313232205131332E34
+ 333831372032342E33343032372031342E38373239312032342E363838343620
+ 31362E33303736352032352E30333636352031372E37323138372032352E3030
+ 3331382031392E31333630382032342E39363937312031392E36323232322032
+ 342E32313834312032302E31303833352032332E34363731312031392E383433
+ 31392032322E30393730392031392E35373830322032302E3732373037203137
+ 2E36333334382032302E31353235342031352E36383839332031392E35373830
+ 322031332E3635362031392E30343736392031312E36323330372031382E3531
+ 3733362031302E363530382031372E353839323820392E363738353235203136
+ 2E3636313220392E3731353133372031352E303138343420392E373531373439
+ 2031332E33373536372031302E33373439312031322E33353639392031302E39
+ 393830372031312E333338332031322E34303639322031302E36343935203133
+ 2E383135373720392E3936303639342031362E303732383220392E3930353737
+ 372031382E333239383620392E38353038362031392E35303730322031302E33
+ 393633352032302E36383431382031302E39343138352032312E343832383120
+ 31312E37353437332032322E32383134352031322E35363736312032322E3432
+ 3437352031332E3235363431204C32322E35363830362031332E393435323220
+ 31392E33363436332031342E30353530352031382E383334332031332E343532
+ 3432205131382E33303339372031322E38343937382031362E36393639203132
+ 2E39313030362031352E30383938322031322E39373033342031342E30363335
+ 352031332E35393434322031332E30333732382031342E323138352031322E39
+ 3438392031342E38363533332031322E38363035312031352E35313231362031
+ 352E35353633352031362E33393630342031382E32353231392031372E323739
+ 39322031392E35333338332031372E37323138362032302E3831353436203138
+ 2E31363338312032312E37343335342031382E39313531312032322E36373136
+ 312031392E36363634312032322E38393235382032312E31323438322032332E
+ 31313335362032322E35383332332032322E37362032332E3930393035203232
+ 2E34303634352032352E32333438382032302E35383530362032362E36323633
+ 342031382E37363336382032382E30313738312031362E33353739372032372E
+ 39393633362031332E39353232362032372E39373439312031322E3930333234
+ 2032372E34353433392031312E38353432332032362E39333338362031302E38
+ 353437362032362E303834333720392E3835353330322032352E323334383820
+ 392E3732303439382032332E3632303232204C392E3538353639342032322E30
+ 30353536207A2671756F743B2066696C6C3D2671756F743B626C61636B267175
+ 6F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C
+ 2D6F7061636974793D2671756F743B302E373932313536392671756F743B2F26
+ 67743B262378443B262378413B2020266C743B2F672667743B262378443B2623
+ 78413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A2020
+ 3C4974656D34205356473D22266C743B3F786D6C2076657273696F6E3D267175
+ 6F743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D
+ 382671756F743B3F2667743B262378443B262378413B266C743B737667207769
+ 6474683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68
+ 7474703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20
+ 6865696768743D2671756F743B33322671756F743B2076696577426F783D2671
+ 756F743B3020302033322033322671756F743B20786D6C6E733A696E6B736361
+ 70653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F7267
+ 2F6E616D657370616365732F696E6B73636170652671756F743B2667743B2623
+ 78443B262378413B2020266C743B67206F7061636974793D2671756F743B3126
+ 71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77
+ 696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F
+ 666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F
+ 743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64
+ 653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61
+ 6C56696577426F783D2671756F743B2D313520302036322032392671756F743B
+ 2667743B262378443B262378413B20202020266C743B7061746820643D267175
+ 6F743B4D332E352032322031302031352E352031302032302032322032302032
+ 322031352E352032382E352032322032322032382E3520323220323420313020
+ 32342031302032382E35207A2671756F743B2066696C6C3D2671756F743B626C
+ 61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F74
+ 3B2066696C6C2D6F7061636974793D2671756F743B302E373932313536392671
+ 756F743B2F2667743B262378443B262378413B20202020266C743B7465787420
+ 783D2671756F743B302671756F743B20793D2671756F743B302671756F743B20
+ 66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671
+ 756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B31
+ 352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C26
+ 71756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E73
+ 2671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C26
+ 71756F743B2066696C6C2D6F7061636974793D2671756F743B302E3936383632
+ 37352671756F743B20746578742D6465636F726174696F6E3D2671756F743B26
+ 71756F743B2667743B262378443B262378413B202020202020266C743B747370
+ 616E20783D2671756F743B31312E3832382671756F743B20793D2671756F743B
+ 31342671756F743B20646972656374696F6E3D2671756F743B6C74722671756F
+ 743B20746578744C656E6774683D2671756F743B382E3334343030312671756F
+ 743B2667743B3F266C743B2F747370616E2667743B262378443B262378413B20
+ 202020266C743B2F746578742667743B262378443B262378413B2020266C743B
+ 2F672667743B262378443B262378413B266C743B2F7376672667743B26237844
+ 3B262378413B222F3E0D0A20203C4974656D35205356473D22266C743B3F786D
+ 6C2076657273696F6E3D2671756F743B312E302671756F743B20656E636F6469
+ 6E673D2671756F743B7574662D382671756F743B3F2667743B262378443B2623
+ 78413B266C743B7376672077696474683D2671756F743B33322671756F743B20
+ 786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F3230
+ 30302F7376672671756F743B206865696768743D2671756F743B33322671756F
+ 743B2076696577426F783D2671756F743B3020302033322033322671756F743B
+ 20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F777777
+ 2E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73636170
+ 652671756F743B2667743B262378443B262378413B2020266C743B67206F7061
+ 636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671
+ 756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F
+ 4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361
+ 70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73
+ 636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B
+ 20626772613A6F726967696E616C56696577426F783D2671756F743B2D313020
+ 2D312035362033302671756F743B2667743B262378443B262378413B20202020
+ 266C743B7061746820643D2671756F743B4D3420323020323220323020323220
+ 31352E352032382E352032322032322032382E35203232203234203420323420
+ 7A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073
+ 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163
+ 6974793D2671756F743B302E373932313536392671756F743B2F2667743B2623
+ 78443B262378413B20202020266C743B7465787420783D2671756F743B342671
+ 756F743B20793D2671756F743B2D312671756F743B2066696C6C3D2671756F74
+ 3B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671
+ 756F743B20666F6E742D73697A653D2671756F743B31342671756F743B20666F
+ 6E742D7374796C653D2671756F743B6E6F726D616C2671756F743B20666F6E74
+ 2D66616D696C793D2671756F743B4672656553616E732671756F743B20666F6E
+ 742D7765696768743D2671756F743B6E6F726D616C2671756F743B2066696C6C
+ 2D6F7061636974793D2671756F743B302E393638363237352671756F743B2074
+ 6578742D6465636F726174696F6E3D2671756F743B2671756F743B2667743B26
+ 2378443B262378413B202020202020266C743B747370616E20783D2671756F74
+ 3B342671756F743B20793D2671756F743B31322671756F743B20646972656374
+ 696F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D26
+ 71756F743B32332E31353431332671756F743B2667743BCEB1CEB2CEB3266C74
+ 3B2F747370616E2667743B262378443B262378413B20202020266C743B2F7465
+ 78742667743B262378443B262378413B2020266C743B2F672667743B26237844
+ 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D
+ 0A20203C4974656D36205356473D22266C743B3F786D6C2076657273696F6E3D
+ 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75
+ 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667
+ 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F
+ 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F
+ 743B206865696768743D2671756F743B33322671756F743B2076696577426F78
+ 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B
+ 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E
+ 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774
+ 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74
+ 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A
+ 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53
+ 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26
+ 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570
+ 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967
+ 696E616C56696577426F783D2671756F743B2D31352030203539203239267175
+ 6F743B2667743B262378443B262378413B20202020266C743B7061746820643D
+ 2671756F743B4D332E352032322031302031352E352031302032302032382032
+ 302032382032342031302032342031302032382E35207A2671756F743B206669
+ 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+ 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+ 302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+ 2020266C743B7465787420783D2671756F743B302671756F743B20793D267175
+ 6F743B302671756F743B2066696C6C3D2671756F743B626C61636B2671756F74
+ 3B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73
+ 697A653D2671756F743B31352671756F743B20666F6E742D7374796C653D2671
+ 756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D267175
+ 6F743B4672656553616E732671756F743B20666F6E742D7765696768743D2671
+ 756F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671
+ 756F743B302E393638363237352671756F743B20746578742D6465636F726174
+ 696F6E3D2671756F743B2671756F743B2667743B262378443B262378413B2020
+ 20202020266C743B747370616E20783D2671756F743B32392671756F743B2079
+ 3D2671756F743B31342671756F743B20646972656374696F6E3D2671756F743B
+ 72746C2671756F743B20746578744C656E6774683D2671756F743B32322E3536
+ 382671756F743B2667743BD790D791D792266C743B2F747370616E2667743B26
+ 2378443B262378413B20202020266C743B2F746578742667743B262378443B26
+ 2378413B2020266C743B2F672667743B262378443B262378413B266C743B2F73
+ 76672667743B262378443B262378413B222F3E0D0A20203C4974656D37205356
+ 473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175
+ 6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26
+ 67743B262378443B262378413B266C743B7376672077696474683D2671756F74
+ 3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777
+ 2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671
+ 756F743B33322671756F743B2076696577426F783D2671756F743B3020302033
+ 322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B
+ 687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163
+ 65732F696E6B73636170652671756F743B2667743B262378443B262378413B20
+ 20266C743B67206F7061636974793D2671756F743B312671756F743B20786D6C
+ 6E733A626772613D2671756F743B68747470733A2F2F77696B692E6672656570
+ 617363616C2E6F72672F4C617A5061696E745F5356475F666F726D6174267175
+ 6F743B20696E6B73636170653A6C6162656C3D2671756F743B4C617965723126
+ 71756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C
+ 617965722671756F743B20626772613A6F726967696E616C56696577426F783D
+ 2671756F743B3220342032382031342671756F743B2667743B262378443B2623
+ 78413B20202020266C743B646566732667743B262378443B262378413B202020
+ 202020266C743B6C696E6561724772616469656E742069643D2671756F743B6C
+ 61796572312D66696C6C67726164312671756F743B2078313D2671756F743B31
+ 352671756F743B2078323D2671756F743B31352671756F743B2079313D267175
+ 6F743B322E352671756F743B2079323D2671756F743B362E352671756F743B20
+ 7370726561644D6574686F643D2671756F743B7265706561742671756F743B20
+ 6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55
+ 73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175
+ 6F743B6C696E6561725247422671756F743B2667743B262378443B262378413B
+ 2020202020202020266C743B73746F70206F66667365743D2671756F743B3026
+ 71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F
+ 743B2073746F702D6F7061636974793D2671756F743B302E3439383033393226
+ 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B
+ 73746F70206F66667365743D2671756F743B302E303632352671756F743B2073
+ 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+ 2D6F7061636974793D2671756F743B302E333039383033392671756F743B2F26
+ 67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+ 667365743D2671756F743B302E3132352671756F743B2073746F702D636F6C6F
+ 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+ 3D2671756F743B302E3134353039382671756F743B2F2667743B262378443B26
+ 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F
+ 743B302E313837352671756F743B2073746F702D636F6C6F723D2671756F743B
+ 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+ 2E30333532393431322671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3235
+ 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175
+ 6F743B2073746F702D6F7061636974793D2671756F743B302671756F743B2F26
+ 67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+ 667365743D2671756F743B302E333132352671756F743B2073746F702D636F6C
+ 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+ 793D2671756F743B302E30333532393431322671756F743B2F2667743B262378
+ 443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+ 71756F743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F
+ 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74
+ 3B302E3134353039382671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3433
+ 37352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+ 71756F743B2073746F702D6F7061636974793D2671756F743B302E3330393830
+ 33392671756F743B2F2667743B262378443B262378413B202020202020202026
+ 6C743B73746F70206F66667365743D2671756F743B302E352671756F743B2073
+ 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+ 2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26
+ 67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+ 667365743D2671756F743B302E353632352671756F743B2073746F702D636F6C
+ 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+ 793D2671756F743B302E363930313936312671756F743B2F2667743B26237844
+ 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+ 756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 302E3835343930322671756F743B2F2667743B262378443B262378413B202020
+ 2020202020266C743B73746F70206F66667365743D2671756F743B302E363837
+ 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+ 756F743B2073746F702D6F7061636974793D2671756F743B302E393634373035
+ 392671756F743B2F2667743B262378443B262378413B2020202020202020266C
+ 743B73746F70206F66667365743D2671756F743B302E37352671756F743B2073
+ 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+ 2D6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B
+ 262378413B2020202020202020266C743B73746F70206F66667365743D267175
+ 6F743B302E383132352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 302E393634373035392671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3837
+ 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+ 756F743B2073746F702D6F7061636974793D2671756F743B302E383534393032
+ 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+ 3B73746F70206F66667365743D2671756F743B302E393337352671756F743B20
+ 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+ 702D6F7061636974793D2671756F743B302E363930313936312671756F743B2F
+ 2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+ 66667365743D2671756F743B312671756F743B2073746F702D636F6C6F723D26
+ 71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671
+ 756F743B302E343938303339322671756F743B2F2667743B262378443B262378
+ 413B202020202020266C743B2F6C696E6561724772616469656E742667743B26
+ 2378443B262378413B20202020266C743B2F646566732667743B262378443B26
+ 2378413B20202020266C743B7061746820643D2671756F743B4D352E35203420
+ 352E352036203720382037203130203220313220322031382033302031382033
+ 3020313220323520313020323520382032362E3520362032362E352034207A26
+ 71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C
+ 6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526
+ 71756F743B2F2667743B262378443B262378413B2020266C743B2F672667743B
+ 262378443B262378413B266C743B2F7376672667743B262378443B262378413B
+ 222F3E0D0A20203C4974656D38205356473D22266C743B3F786D6C2076657273
+ 696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D267175
+ 6F743B7574662D382671756F743B3F2667743B262378443B262378413B266C74
+ 3B7376672077696474683D2671756F743B33322671756F743B20786D6C6E733D
+ 2671756F743B687474703A2F2F7777772E77332E6F72672F323030302F737667
+ 2671756F743B206865696768743D2671756F743B33322671756F743B20766965
+ 77426F783D2671756F743B3020302033322033322671756F743B20786D6C6E73
+ 3A696E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B7363
+ 6170652E6F72672F6E616D657370616365732F696E6B73636170652671756F74
+ 3B2667743B262378443B262378413B2020266C743B67206F7061636974793D26
+ 71756F743B312671756F743B20786D6C6E733A626772613D2671756F743B6874
+ 7470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A506169
+ 6E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C6162
+ 656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A67
+ 726F75706D6F64653D2671756F743B6C617965722671756F743B20626772613A
+ 6F726967696E616C56696577426F783D2671756F743B32203920323820313426
+ 71756F743B2667743B262378443B262378413B20202020266C743B6465667326
+ 67743B262378443B262378413B202020202020266C743B6C696E656172477261
+ 6469656E742069643D2671756F743B6C61796572312D66696C6C677261643126
+ 71756F743B2078313D2671756F743B31352671756F743B2078323D2671756F74
+ 3B31352671756F743B2079313D2671756F743B372E352671756F743B2079323D
+ 2671756F743B31312E352671756F743B207370726561644D6574686F643D2671
+ 756F743B7265706561742671756F743B206772616469656E74556E6974733D26
+ 71756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D
+ 696E746572706F6C6174696F6E3D2671756F743B6C696E656172524742267175
+ 6F743B2667743B262378443B262378413B2020202020202020266C743B73746F
+ 70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F
+ 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+ 3D2671756F743B302E343938303339322671756F743B2F2667743B262378443B
+ 262378413B2020202020202020266C743B73746F70206F66667365743D267175
+ 6F743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 302E333039383033392671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3132
+ 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+ 756F743B2073746F702D6F7061636974793D2671756F743B302E313435303938
+ 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+ 3B73746F70206F66667365743D2671756F743B302E313837352671756F743B20
+ 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+ 702D6F7061636974793D2671756F743B302E30333532393431322671756F743B
+ 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+ 6F66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C
+ 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+ 793D2671756F743B302671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3331
+ 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+ 71756F743B2073746F702D6F7061636974793D2671756F743B302E3033353239
+ 3431322671756F743B2F2667743B262378443B262378413B2020202020202020
+ 266C743B73746F70206F66667365743D2671756F743B302E3337352671756F74
+ 3B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073
+ 746F702D6F7061636974793D2671756F743B302E3134353039382671756F743B
+ 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+ 6F66667365743D2671756F743B302E343337352671756F743B2073746F702D63
+ 6F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F706163
+ 6974793D2671756F743B302E333039383033392671756F743B2F2667743B2623
+ 78443B262378413B2020202020202020266C743B73746F70206F66667365743D
+ 2671756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 302E343938303339322671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B302E3536
+ 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+ 71756F743B2073746F702D6F7061636974793D2671756F743B302E3639303139
+ 36312671756F743B2F2667743B262378443B262378413B202020202020202026
+ 6C743B73746F70206F66667365743D2671756F743B302E3632352671756F743B
+ 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+ 6F702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F
+ 2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+ 66667365743D2671756F743B302E363837352671756F743B2073746F702D636F
+ 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+ 74793D2671756F743B302E393634373035392671756F743B2F2667743B262378
+ 443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+ 71756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 312671756F743B2F2667743B262378443B262378413B2020202020202020266C
+ 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B
+ 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+ 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B
+ 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+ 6F66667365743D2671756F743B302E3837352671756F743B2073746F702D636F
+ 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+ 74793D2671756F743B302E3835343930322671756F743B2F2667743B26237844
+ 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+ 756F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F
+ 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74
+ 3B302E363930313936312671756F743B2F2667743B262378443B262378413B20
+ 20202020202020266C743B73746F70206F66667365743D2671756F743B312671
+ 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74
+ 3B2073746F702D6F7061636974793D2671756F743B302E343938303339322671
+ 756F743B2F2667743B262378443B262378413B202020202020266C743B2F6C69
+ 6E6561724772616469656E742667743B262378443B262378413B20202020266C
+ 743B2F646566732667743B262378443B262378413B20202020266C743B706174
+ 6820643D2671756F743B4D352E35203920352E35203131203720313320372031
+ 3520322031372032203233203330203233203330203137203235203135203235
+ 2031332032362E352031312032362E352039207A2671756F743B2066696C6C3D
+ 2671756F743B75726C28236C61796572312D66696C6C6772616431292671756F
+ 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B26
+ 2378443B262378413B2020266C743B2F672667743B262378443B262378413B26
+ 6C743B2F7376672667743B262378443B262378413B222F3E0D0A20203C497465
+ 6D39205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31
+ 2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175
+ 6F743B3F2667743B262378443B262378413B266C743B7376672077696474683D
+ 2671756F743B33322671756F743B20786D6C6E733D2671756F743B687474703A
+ 2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068656967
+ 68743D2671756F743B33322671756F743B2076696577426F783D2671756F743B
+ 3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D26
+ 71756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D
+ 657370616365732F696E6B73636170652671756F743B2667743B262378443B26
+ 2378413B2020266C743B67206F7061636974793D2671756F743B312671756F74
+ 3B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E
+ 6672656570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D
+ 61742671756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61
+ 796572312671756F743B20696E6B73636170653A67726F75706D6F64653D2671
+ 756F743B6C617965722671756F743B20626772613A6F726967696E616C566965
+ 77426F783D2671756F743B322031362032382031352671756F743B2667743B26
+ 2378443B262378413B20202020266C743B646566732667743B262378443B2623
+ 78413B202020202020266C743B6C696E6561724772616469656E742069643D26
+ 71756F743B6C61796572312D66696C6C67726164312671756F743B2078313D26
+ 71756F743B31352671756F743B2078323D2671756F743B31352671756F743B20
+ 79313D2671756F743B31342E35343136372671756F743B2079323D2671756F74
+ 3B31382E35343136372671756F743B207370726561644D6574686F643D267175
+ 6F743B7265706561742671756F743B206772616469656E74556E6974733D2671
+ 756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D69
+ 6E746572706F6C6174696F6E3D2671756F743B6C696E6561725247422671756F
+ 743B2667743B262378443B262378413B2020202020202020266C743B73746F70
+ 206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F72
+ 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D
+ 2671756F743B302E343938303339322671756F743B2F2667743B262378443B26
+ 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F
+ 743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F743B
+ 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+ 2E333039383033392671756F743B2F2667743B262378443B262378413B202020
+ 2020202020266C743B73746F70206F66667365743D2671756F743B302E313235
+ 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175
+ 6F743B2073746F702D6F7061636974793D2671756F743B302E31343530393826
+ 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B
+ 73746F70206F66667365743D2671756F743B302E313837352671756F743B2073
+ 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+ 2D6F7061636974793D2671756F743B302E30333532393431322671756F743B2F
+ 2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+ 66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C6F
+ 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+ 3D2671756F743B302671756F743B2F2667743B262378443B262378413B202020
+ 2020202020266C743B73746F70206F66667365743D2671756F743B302E333132
+ 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+ 756F743B2073746F702D6F7061636974793D2671756F743B302E303335323934
+ 31322671756F743B2F2667743B262378443B262378413B202020202020202026
+ 6C743B73746F70206F66667365743D2671756F743B302E3337352671756F743B
+ 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+ 6F702D6F7061636974793D2671756F743B302E3134353039382671756F743B2F
+ 2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+ 66667365743D2671756F743B302E343337352671756F743B2073746F702D636F
+ 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+ 74793D2671756F743B302E333039383033392671756F743B2F2667743B262378
+ 443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+ 71756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F743B
+ 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+ 2E343938303339322671756F743B2F2667743B262378443B262378413B202020
+ 2020202020266C743B73746F70206F66667365743D2671756F743B302E353632
+ 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+ 756F743B2073746F702D6F7061636974793D2671756F743B302E363930313936
+ 312671756F743B2F2667743B262378443B262378413B2020202020202020266C
+ 743B73746F70206F66667365743D2671756F743B302E3632352671756F743B20
+ 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+ 702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F26
+ 67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+ 667365743D2671756F743B302E363837352671756F743B2073746F702D636F6C
+ 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+ 793D2671756F743B302E393634373035392671756F743B2F2667743B26237844
+ 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+ 756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F743B
+ 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B31
+ 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+ 3B73746F70206F66667365743D2671756F743B302E383132352671756F743B20
+ 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+ 702D6F7061636974793D2671756F743B302E393634373035392671756F743B2F
+ 2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+ 66667365743D2671756F743B302E3837352671756F743B2073746F702D636F6C
+ 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+ 793D2671756F743B302E3835343930322671756F743B2F2667743B262378443B
+ 262378413B2020202020202020266C743B73746F70206F66667365743D267175
+ 6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74
+ 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+ 302E363930313936312671756F743B2F2667743B262378443B262378413B2020
+ 202020202020266C743B73746F70206F66667365743D2671756F743B31267175
+ 6F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B
+ 2073746F702D6F7061636974793D2671756F743B302E34393830333932267175
+ 6F743B2F2667743B262378443B262378413B202020202020266C743B2F6C696E
+ 6561724772616469656E742667743B262378443B262378413B20202020266C74
+ 3B2F646566732667743B262378443B262378413B20202020266C743B70617468
+ 20643D2671756F743B4D352E352031362E303431363620352E352031382E3034
+ 31363620372032302E303431363620372032322E303431363620322032342E30
+ 3431363620322033302E30343136362033302033302E30343136362033302032
+ 342E30343136362032352032322E30343136362032352032302E303431363620
+ 32362E352031382E30343136362032362E352031362E3034313636207A267175
+ 6F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C6C67
+ 72616431292671756F743B207374726F6B653D2671756F743B6E6F6E65267175
+ 6F743B2F2667743B262378443B262378413B2020266C743B2F672667743B2623
+ 78443B262378413B266C743B2F7376672667743B262378443B262378413B222F
+ 3E0D0A3C2F434F4E4649473E0D0A
+ }
+ end
+ object SVGRasterImageList1: TBGRAImageList
+ Scaled = True
+ Left = 653
+ Top = 216
+ Bitmap = {
+ 4C7A0A0000001000000010000000D90300000000000078DAED9AEB4B145118C6
+ 77575D3745BBA1959154BA84A56592D98D0AA220A80F29DDCBB2302FA4D03D2A
+ A3AB9154DA05CC2222A1A2E80A417401A53B5B7D32128CBEF4298220A83FA0E7
+ D0B3701866C63367B6B5705EF831EC719E3967CE9CF73DEF7BD0E78BB915814A
+ 52A4A117BA08A9ECE7FA765E3BC165B01C2469E8659A81DFC1F81340189C97DA
+ 8B35DE7F8CD4BE5A435F20B5AF70A04F0685E0AAD49EE762FE0E6ACCFF73700D
+ 94733E3D8BAF35F03BCCD7D4DF032F40AA8B318434754BB9A6066968878337E0
+ 7E2F3E6F65EB396F559A63BF497DB6867602B59734FBDE417D998636113CE637
+ 4FD7D0CF61DFC73DD78BBBD5839986F5BE1DCC50D43FA2BF05A4B667A04251DF
+ 01AA0D7A27B9C0BFA0DF2CED53E90EF54F4093A45FE0502F7CE6153802F682EB
+ 0EF503C13EEEB7621C59A011CC8BC3DA6B35C9178CB4FE45BD67B135BF42BE6D
+ 6622BFBCC0752CBED91DEE09AA7BCF43F01AEC67DC69E75E94A5A0CF649F270D
+ 3140A56E13BAB7E03BF8057E802FE083610D16D9E805EFC027F015FCE4B3BE81
+ F7367A2B0B329E09DD1285FBA37546BD212688B6950A7A11B71EF0DB1D039B58
+ 333D653EA562D9D47490168EAB3F59126BAF10D7B4134B609C1375EF477E4B27
+ 6B7928D80546D1173F731D39B561E0369FA553B7AD03A7C000CD395CC6BA37E0
+ D05FE49A3953CA85820ADA169BBFB7D83C23AA8DD8E82316CF90B52A189FE156
+ EF76FCB1983F9FC2370AC6D17727B1762A5058FB41D66B22EF1E0F66315F6BE4
+ B5803E99225D659B0E6A402D3804CE809DCC051B78DEB3182CE235D3A017FBC3
+ 36309BDA5BFC5DCF3DB49A35C00DB015A419F41BC11E500A2E527F94E735A2FF
+ 0D6037BF7FB9C9FB17B25DF473009CA3DF8B3ED7704EAAF8EC628B3C6304C805
+ A3390E113B4AD8EE67FEBA4A710F1279C25843DC116DE35CC422D5F5EBD3F49F
+ 884BFF75AB773BFE78CC5FBCFCBFAF4CC499C1CC19C43A1DC233B7007388E8FB
+ A758E847B27EAFA5AF74B20614EDF9602D7392C336F9BEC84D4FF0BE0C709AB9
+ 7B1ACF0116829716FA14F6D12CE53C15F4DD69E02EEBE3B316EF3E155CE13A99
+ CB7C57C4912D7CA732B637999C4526307E4C061379DE51CA9C57C4CC299C073F
+ DF215563FF52C91D222EB5AAC452EF76FCB198BFFEE2E35626F6BA1E454A2C7C
+ 57D45DE15EC8F6599F85D729F45D67A24B664E92A3D07F0EEF4D96F43D9A442D
+ AC49ACFAF7CCB3FFDD12996FA860769E21F6DE6E059FE9E6BD6696A1E0B31916
+ 5A5127B429F4DFC67B8DDA5C077123D7F08CBE8E5F759A78E699677F4C9C4B74
+ 2962768611A04FE6F742D8E63CB346A1EF1A135D88F1284FA1FF3CDE2BFF3F46
+ 972651CBD72456FD6BDB6F31F08DBA
+ }
+ end
+ object TimerHideTextMore: TTimer
+ Enabled = False
+ Interval = 3000
+ OnTimer = TimerHideFillTimer
+ Left = 653
+ Top = 272
end
end
diff --git a/lazpaint/lazpaintmainform.lrj b/lazpaint/lazpaintmainform.lrj
index b8e7975e..2f7417d2 100644
--- a/lazpaint/lazpaintmainform.lrj
+++ b/lazpaint/lazpaintmainform.lrj
@@ -26,6 +26,8 @@
{"hash":142786864,"name":"tfmain.tool_capsquare.hint","sourcebytes":[83,113,117,97,114,101,32,99,97,112],"value":"Square cap"},
{"hash":224157463,"name":"tfmain.spinedit_arrowsizex.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Horizontal size of the arrow"},
{"hash":47574855,"name":"tfmain.spinedit_arrowsizey.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Vertical size of the arrow"},
+{"hash":65090695,"name":"tfmain.combobox_arrowstart.hint","sourcebytes":[83,116,97,114,116,105,110,103,32,97,114,114,111,119],"value":"Starting arrow"},
+{"hash":229386535,"name":"tfmain.combobox_arrowend.hint","sourcebytes":[69,110,100,105,110,103,32,97,114,114,111,119],"value":"Ending arrow"},
{"hash":199465278,"name":"tfmain.tool_joinbevel.hint","sourcebytes":[66,101,118,101,108,32,106,111,105,110],"value":"Bevel join"},
{"hash":73704254,"name":"tfmain.tool_joinround.hint","sourcebytes":[82,111,117,110,100,32,106,111,105,110],"value":"Round join"},
{"hash":205804894,"name":"tfmain.tool_joinmiter.hint","sourcebytes":[77,105,116,101,114,32,106,111,105,110],"value":"Miter join"},
@@ -78,6 +80,16 @@
{"hash":264792562,"name":"tfmain.image_swapcolors.hint","sourcebytes":[83,119,105,116,99,104,32,99,111,108,111,114],"value":"Switch color"},
{"hash":296859,"name":"tfmain.label_back.caption","sourcebytes":[66,97,99,107],"value":"Back"},
{"hash":76172398,"name":"tfmain.button_donate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."},
+{"hash":300580,"name":"tfmain.tool_textbold.hint","sourcebytes":[66,111,108,100],"value":"Bold"},
+{"hash":84574963,"name":"tfmain.tool_textitalic.hint","sourcebytes":[73,116,97,108,105,99],"value":"Italic"},
+{"hash":180974597,"name":"tfmain.tool_textunderline.hint","sourcebytes":[85,110,100,101,114,108,105,110,101],"value":"Underline"},
+{"hash":151125108,"name":"tfmain.tool_textstrikeout.hint","sourcebytes":[83,116,114,105,107,101,111,117,116],"value":"Strikeout"},
+{"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"},
+{"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"},
+{"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"},
+{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"},
+{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"},
+{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"},
{"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."},
{"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"},
{"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."},
@@ -279,6 +291,8 @@
{"hash":51121525,"name":"tfmain.toolopenedcurve.hint","sourcebytes":[79,112,101,110,101,100,32,99,117,114,118,101],"value":"Opened curve"},
{"hash":124337662,"name":"tfmain.fileexport.caption","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
{"hash":124337662,"name":"tfmain.layerexport.hint","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."},
+{"hash":164762421,"name":"tfmain.filequicksave.caption","sourcebytes":[81,117,105,99,107,32,115,97,118,101],"value":"Quick save"},
+{"hash":215358547,"name":"tfmain.filequicksave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101,32,119,105,116,104,111,117,116,32,100,105,97,108,111,103,115],"value":"Save current file without dialogs"},
{"hash":66536946,"name":"tfmain.colordialog1.title","sourcebytes":[67,104,111,111,115,101,32,99,111,108,111,114],"value":"Choose color"},
{"hash":315429,"name":"tfmain.menufile.caption","sourcebytes":[70,105,108,101],"value":"File"},
{"hash":167619026,"name":"tfmain.itemuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"},
diff --git a/lazpaint/lazpaintmainform.pas b/lazpaint/lazpaintmainform.pas
index 1a87b6f6..cb5716d3 100644
--- a/lazpaint/lazpaintmainform.pas
+++ b/lazpaint/lazpaintmainform.pas
@@ -8,13 +8,15 @@ interface
uses
Classes, LMessages, SysUtils, LazFileUtils, LResources, Forms, Controls,
Graphics, Dialogs, Menus, ExtDlgs, ComCtrls, ActnList, StdCtrls, ExtCtrls,
- Buttons, types, LCLType, BGRAImageList, BCTrackbarUpdown, BCComboBox, BCButton,
+ Buttons, types, LCLType, BGRAImageList, BCTrackbarUpdown, BCComboBox,
+ BCButton, BGRASVGImageList,
BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal, BGRAGradientScanner, BGRAGradientOriginal,
LazPaintType, UMainFormLayout, UTool, UImage, UImageAction, UZoom,
UImageObservation, UConfig, LCScaleDPI, UResourceStrings, UMenu, uscripting,
- ubrowseimages, UToolPolygon, UToolVectorial, LCVectorRectShapes,
+ ubrowseimages, UToolPolygon, UToolVectorial, UToolDeformationGrid, UToolSelect,
+ UToolBasic, UToolBrush, LCVectorRectShapes,
LCVectorialFillControl, LCVectorialFill,
udarktheme, UScriptType;
@@ -23,6 +25,10 @@ interface
{ TFMain }
TFMain = class(TForm)
+ FileQuickSave: TAction;
+ SVGRasterImageList1: TBGRAImageList;
+ Panel_TextMore: TPanel;
+ SVGImageList1: TBGRASVGImageList;
Button_Donate: TBCButton;
LayerExport: TAction;
FileExport: TAction;
@@ -30,6 +36,19 @@ TFMain = class(TForm)
MenuScript: TMenuItem;
Panel_OutlineFill: TPanel;
Panel_Donate: TPanel;
+ TimerHideTextMore: TTimer;
+ ToolBar25: TToolBar;
+ ToolButton1: TToolButton;
+ ToolButton2: TToolButton;
+ Tool_TextAlignBottom: TToolButton;
+ Tool_TextAlignMiddle: TToolButton;
+ Tool_TextAlignTop: TToolButton;
+ Tool_TextRTL: TToolButton;
+ Tool_TextBidirectional: TToolButton;
+ Tool_TextLTR: TToolButton;
+ Tool_TextItalic: TToolButton;
+ Tool_TextUnderline: TToolButton;
+ Tool_TextStrikeout: TToolButton;
ToolOpenedCurve: TAction;
ToolPolyline: TAction;
FileRunScript: TAction;
@@ -56,6 +75,7 @@ TFMain = class(TForm)
Tool_EraseSharpen: TToolButton;
Tool_EraseLighten: TToolButton;
Tool_EraseDarken: TToolButton;
+ Tool_TextBold: TToolButton;
VectorialFill_Outline: TLCVectorialFillControl;
VectorialFill_Pen: TLCVectorialFillControl;
VectorialFill_Back: TLCVectorialFillControl;
@@ -468,6 +488,7 @@ TFMain = class(TForm)
procedure FileExportExecute(Sender: TObject);
procedure FileImport3DUpdate(Sender: TObject);
procedure FilePrintExecute(Sender: TObject);
+ procedure FileQuickSaveExecute(Sender: TObject);
procedure FileRememberSaveFormatExecute(Sender: TObject);
procedure FileRunScriptExecute(Sender: TObject);
procedure FileSaveAsInSameFolderExecute(Sender: TObject);
@@ -496,6 +517,10 @@ TFMain = class(TForm)
procedure MenuZoomToolbarClick(Sender: TObject);
procedure PaintBox_PenPreviewMouseDown(Sender: TObject;
{%H-}Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer);
+ procedure Panel_TextMoreMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
+ {%H-}Y: Integer);
+ procedure Panel_TextMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
+ {%H-}Y: Integer);
procedure PopupToolbarPopup(Sender: TObject);
procedure PopupToolboxPopup(Sender: TObject);
procedure SelectionHorizontalFlipUpdate(Sender: TObject);
@@ -564,6 +589,7 @@ TFMain = class(TForm)
procedure SpinEdit_TextShadowYChange(Sender: TObject; AByUser: boolean);
procedure TimerUpdateTimer(Sender: TObject);
procedure TimerHidePenPreviewTimer(Sender: TObject);
+ procedure TimerHideTextMoreTimer(Sender: TObject);
procedure ToolChangeDockingExecute(Sender: TObject);
procedure ToolHotSpotUpdate(Sender: TObject);
procedure ToolRotateSelectionUpdate(Sender: TObject);
@@ -577,6 +603,8 @@ TFMain = class(TForm)
procedure Tool_PhongShapeVerticalCylinderClick(Sender: TObject);
procedure ToolLayerMappingUpdate(Sender: TObject);
procedure Tool_TextAlignClick(Sender: TObject);
+ procedure Tool_TextBidiModeClick(Sender: TObject);
+ procedure Tool_TextStyleClick(Sender: TObject);
procedure Tool_TextPhongClick(Sender: TObject);
procedure Tool_GridMoveWithoutDeformationClick(Sender: TObject);
procedure Tool_PhongShapeConeClick(Sender: TObject);
@@ -675,6 +703,7 @@ TFMain = class(TForm)
procedure VectorialFill_Change(Sender: TObject);
procedure vectorialFill_ClickLabel(Sender: TObject);
procedure VectorialFill_TypeChange(Sender: TObject);
+ procedure VectorialFill_OpacityChange(Sender: TObject);
procedure VectorialFill_Resize(Sender: TObject);
procedure VectorialFill_EditGradTexPoints(Sender: TObject);
procedure VectorialFill_AdjustToShape(Sender: TObject);
@@ -781,11 +810,13 @@ TFMain = class(TForm)
procedure ToggleLayersVisible;
function ShowColorDialogFor(ATarget: TColorTarget): boolean;
procedure ShowPenPreview(ShouldRepaint: boolean= False);
+ procedure ShowTextMore;
procedure HidePenPreview(ATimeMs: Integer = 300; AClearTime: boolean = false);
+ procedure HideTextMore(ATimeMs: Integer = 300; AClearTime: boolean = false);
procedure ShowFill(AFillControl: TLCVectorialFillControl; APanel: TPanel);
procedure HideFill(ATimeMs: Integer = 300; AClearTime: boolean = false);
procedure OnImageChangedHandler({%H-}AEvent: TLazPaintImageObservationEvent);
- procedure OnImageRenderChanged({%H-}Sender: TObject);
+ procedure OnImageRenderChanged({%H-}Sender: TLazPaintImage; AInvalidateAll: boolean);
procedure LabelAutosize(ALabel: TLabel; ATargetDPI: integer);
procedure AskMergeSelection(ACaption: string);
procedure UpdateSpecialKeys({%H-}Shift: TShiftState);
@@ -825,12 +856,14 @@ TFMain = class(TForm)
procedure CallScriptFunction(AName:string); overload;
procedure CallScriptFunction(AParams:TVariableSet); overload;
procedure ZoomFitIfTooBig;
+ function RunToolCommand(AToolCommand: TToolCommand): boolean;
property Scripting: TScriptContext read GetScriptContext;
property Image: TLazPaintImage read GetImage;
public
{ public declarations }
Zoom: TZoom;
+ Closing: boolean;
procedure PaintPictureNow;
procedure PaintPictureLater;
@@ -845,7 +878,7 @@ TFMain = class(TForm)
procedure AddDockedControl(AControl: TControl);
procedure RemoveDockedControl(AControl: TControl);
procedure QueryArrange;
- function ChooseTool(Tool : TPaintToolType): boolean;
+ function ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean = true): boolean;
procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
procedure PictureSelectedLayerIndexChanging({%H-}sender: TLazPaintImage);
property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
@@ -1097,6 +1130,10 @@ procedure TFMain.Init;
Panel_Coordinates.Visible := Config.DefaultCoordinatesToolbarVisible;
FLayout.ToolBoxPopup := PopupToolbox;
+ {$IFDEF DARWIN}
+ ImageHorizontalFlip.ShortCut := ShortCut(VK_H, [ssMeta, ssCtrl]);
+ {$ENDIF}
+
if not LazPaintInstance.Embedded then
begin
FOnlineUpdater := LazPaintInstance.GetOnlineUpdater;
@@ -1163,6 +1200,8 @@ procedure TFMain.FormShow(Sender: TObject);
m.Apply;
FLayout.Menu := m;
+ SVGImageList1.Width := iconSize;
+ SVGImageList1.Height := iconSize;
Button_Donate.Images := m.ImageList;
w := Button_Donate.Width; h := Button_Donate.Height;
Button_Donate.GetPreferredSize(w, h);
@@ -1481,7 +1520,6 @@ function TFMain.ScriptFileSaveAs(AVars: TVariableSet): TScriptResult;
{$WARNINGS ON}
filename := ExtractFileName(filename);
end else initialDir:= '';
- if filename = '' then filename := rsNoName;
if initialDir = '' then
begin
if AVars.Booleans['Export'] then
@@ -1489,6 +1527,11 @@ function TFMain.ScriptFileSaveAs(AVars: TVariableSet): TScriptResult;
else
initialDir:= FSaveInitialDir;
end;
+ if filename = '' then
+ begin
+ if initialDir = '' then initialDir := DefaultPicturesDirectory;
+ filename := FileManager.GetDefaultFilename(initialDir);
+ end;
if saveDlg.FilterIndex > 1 then
filename := ApplySelectedFilterExtension(filename,saveDlg.Filter,saveDlg.FilterIndex);
if not Image.AbleToSaveAsUTF8(filename) then
@@ -1568,7 +1611,7 @@ function TFMain.ScriptFileSaveAs(AVars: TVariableSet): TScriptResult;
function TFMain.ScriptFileSave(AVars: TVariableSet): TScriptResult;
begin
if (Image.CurrentFilenameUTF8 = '') or not Image.AbleToSaveAsUTF8(Image.CurrentFilenameUTF8) then
- result := Scripting.CallScriptFunction('FileSaveAs', True) else
+ result := Scripting.CallScriptFunction('FileSaveAs', True, AVars) else
begin
AskMergeSelection(rsSave);
try
@@ -1708,6 +1751,7 @@ function TFMain.ScriptFileGetFilename(AVars: TVariableSet): TScriptResult;
procedure TFMain.FileSaveUpdate(Sender: TObject);
begin
FileSave.Enabled := image.IsFileModified;
+ FileQuickSave.Enabled := image.IsFileModified;
end;
procedure TFMain.FilterAnyExecute(Sender: TObject);
@@ -1839,6 +1883,12 @@ procedure TFMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState)
Key := 0;
if not ToolManager.ToolSleeping and ([ssLeft,ssRight] * FLayout.MouseButtonState = []) then ToolManager.ToolSleep;
end else
+ If (Key = VK_ESCAPE) and not Image.SelectionMaskEmpty and Image.SelectionLayerIsEmpty
+ and EditDeselect.Enabled then
+ begin
+ if EditDeselect.Execute then
+ Key := 0;
+ end else
if LazPaintInstance.ImageListWindowVisible then
LazPaintInstance.ImageListWindowVisibleKeyDown(Key,Shift);
If Key = 0 then UpdateToolbar;
@@ -2126,8 +2176,15 @@ procedure TFMain.FormDropFiles(Sender: TObject; const FileNames: array of String
svgOrig: TBGRALayerSVGOriginal;
begin
if Length(FileNames)<1 then exit;
- if Length(FileNames)= 1
- then TryOpenFileUTF8(FileNames[0])
+ if Length(FileNames)= 1 then
+ begin
+ if Image.IsFileModified then
+ case LazPaintInstance.SaveQuestion(rsOpen) of
+ IDYES: Scripting.CallScriptFunction('FileSave');
+ IDCANCEL: exit;
+ end;
+ TryOpenFileUTF8(FileNames[0]);
+ end
else
begin
{$IFNDEF LINUX}
@@ -2274,7 +2331,7 @@ procedure TFMain.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
end else
if UTF8Key <> '' then
begin
- if UTF8UpperCase(UTF8Key) = 'X' then
+ if UTF8UpperCase(UTF8Key) = SwitchColorShortcut then
begin
SwitchColors;
UTF8Key:= '';
@@ -2484,6 +2541,7 @@ procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
if ToolManager.ToolSleeping then
begin
CanClose := false;
+ LazPaintInstance.CancelRestart;
exit;
end;
if CurrentTool in [ptDeformation,ptLayerMapping] then
@@ -2492,6 +2550,7 @@ procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
if not Image.CheckNoAction then
begin
CanClose := false;
+ LazPaintInstance.CancelRestart;
exit;
end;
if not LazPaintInstance.Embedded and image.IsFileModified and not image.Empty then
@@ -2499,12 +2558,19 @@ procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
topmostInfo:= LazPaintInstance.HideTopmost;
case LazPaintInstance.SaveQuestion(rsExitRequest) of
- IDYES: FileSave.Execute;
+ IDYES: if scripting.CallScriptFunction('FileSave') <> srOk then
+ begin
+ CanClose := false;
+ LazPaintInstance.CancelRestart;
+ LazPaintInstance.ShowTopmost(topmostInfo);
+ exit;
+ end;
IDNO: ;
IDCANCEL: begin
CanClose := false;
LazPaintInstance.CancelRestart;
LazPaintInstance.ShowTopmost(topmostInfo);
+ exit;
end;
end;
end else
@@ -2611,15 +2677,17 @@ procedure TFMain.RecentFileClick(Sender: TObject);
end;
procedure TFMain.LanguageClick(Sender: TObject);
-var language: string;
+var language, prevLanguage: string;
begin
if Sender is TMenuItem then
begin
language := (Sender as TMenuItem).Caption;
if Config.DefaultLangage <> language then
begin
+ prevLanguage := Config.DefaultLangage;
Config.SetDefaultLangage(language);
- LazPaintInstance.Restart;
+ if not LazPaintInstance.Restart then
+ Config.SetDefaultLangage(prevLanguage);
end;
end;
end;
@@ -2802,12 +2870,12 @@ function TFMain.ScriptEditPasteAsNew(AVars: TVariableSet): TScriptResult;
end;
end;
-function TFMain.ChooseTool(Tool: TPaintToolType): boolean;
+function TFMain.ChooseTool(Tool: TPaintToolType; AAsFromGui: boolean): boolean;
var params: TVariableSet;
begin
params := TVariableSet.Create('ChooseTool');
params.AddString('Name', PaintToolTypeStr[Tool]);
- params.AddBoolean('FromGUI', true);
+ params.AddBoolean('FromGUI', AAsFromGui);
result := Scripting.CallScriptFunction(params) = srOk;
params.Free;
end;
@@ -3329,7 +3397,7 @@ procedure TFMain.EditSelectionUpdate(Sender: TObject);
procedure TFMain.EditShapeAlignBottomExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcAlignBottom);
+ RunToolCommand(tcAlignBottom);
end;
procedure TFMain.EditShapeAlignBottomUpdate(Sender: TObject);
@@ -3339,7 +3407,7 @@ procedure TFMain.EditShapeAlignBottomUpdate(Sender: TObject);
procedure TFMain.EditShapeAlignLeftExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcAlignLeft);
+ RunToolCommand(tcAlignLeft);
end;
procedure TFMain.EditShapeAlignLeftUpdate(Sender: TObject);
@@ -3349,7 +3417,7 @@ procedure TFMain.EditShapeAlignLeftUpdate(Sender: TObject);
procedure TFMain.EditShapeAlignRightExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcAlignRight);
+ RunToolCommand(tcAlignRight);
end;
procedure TFMain.EditShapeAlignRightUpdate(Sender: TObject);
@@ -3359,7 +3427,7 @@ procedure TFMain.EditShapeAlignRightUpdate(Sender: TObject);
procedure TFMain.EditShapeAlignTopExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcAlignTop);
+ RunToolCommand(tcAlignTop);
end;
procedure TFMain.EditShapeAlignTopUpdate(Sender: TObject);
@@ -3369,7 +3437,7 @@ procedure TFMain.EditShapeAlignTopUpdate(Sender: TObject);
procedure TFMain.EditShapeCenterHorizontallyExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcCenterHorizontally);
+ RunToolCommand(tcCenterHorizontally);
end;
procedure TFMain.EditShapeCenterHorizontallyUpdate(Sender: TObject);
@@ -3379,7 +3447,7 @@ procedure TFMain.EditShapeCenterHorizontallyUpdate(Sender: TObject);
procedure TFMain.EditShapeCenterVerticallyExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcCenterVertically);
+ RunToolCommand(tcCenterVertically);
end;
procedure TFMain.EditShapeCenterVerticallyUpdate(Sender: TObject);
@@ -3390,7 +3458,7 @@ procedure TFMain.EditShapeCenterVerticallyUpdate(Sender: TObject);
procedure TFMain.EditShapeToCurveExecute(Sender: TObject);
begin
if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
- ToolManager.ToolCommand(tcShapeToSpline);
+ RunToolCommand(tcShapeToSpline);
end;
procedure TFMain.EditShapeToCurveUpdate(Sender: TObject);
@@ -3424,7 +3492,7 @@ procedure TFMain.FileExportExecute(Sender: TObject);
procedure TFMain.EditCopyExecute(Sender: TObject);
begin
- if not ToolManager.ToolCommand(tcCopy) then
+ if not RunToolCommand(tcCopy) then
Scripting.CallScriptFunction('EditCopy');
end;
@@ -3435,7 +3503,7 @@ procedure TFMain.EditCopyUpdate(Sender: TObject);
procedure TFMain.EditCutExecute(Sender: TObject);
begin
- if not ToolManager.ToolCommand(tcCut) then
+ if not RunToolCommand(tcCut) then
Scripting.CallScriptFunction('EditCut');
end;
@@ -3448,19 +3516,22 @@ procedure TFMain.EditCutUpdate(Sender: TObject);
procedure TFMain.EditDeleteSelectionExecute(Sender: TObject);
begin
- if not ToolManager.ToolCommand(tcDelete) then
+ if not RunToolCommand(tcDelete) then
Scripting.CallScriptFunction('EditDeleteSelection');
end;
procedure TFMain.EditDeleteSelectionUpdate(Sender: TObject);
begin
- EditDeleteSelection.Enabled := ToolManager.ToolProvideCommand(tcDelete) or not image.SelectionMaskEmpty;
+ EditDeleteSelection.Enabled := ToolManager.ToolProvideCommand(tcDelete)
+ or not image.SelectionMaskEmpty
+ or ((ToolManager.GetCurrentToolType in [ptMoveLayer,
+ ptZoomLayer, ptRotateLayer]) and (image.NbLayers > 1));
end;
procedure TFMain.EditMoveDownExecute(Sender: TObject);
begin
if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
- ToolManager.ToolCommand(tcMoveDown);
+ RunToolCommand(tcMoveDown);
end;
procedure TFMain.EditMoveDownUpdate(Sender: TObject);
@@ -3471,7 +3542,7 @@ procedure TFMain.EditMoveDownUpdate(Sender: TObject);
procedure TFMain.EditMoveToBackExecute(Sender: TObject);
begin
if ToolManager.CurrentTool is TVectorialTool then ChooseTool(ptEditShape);
- ToolManager.ToolCommand(tcMoveToBack);
+ RunToolCommand(tcMoveToBack);
end;
procedure TFMain.EditMoveToBackUpdate(Sender: TObject);
@@ -3481,7 +3552,7 @@ procedure TFMain.EditMoveToBackUpdate(Sender: TObject);
procedure TFMain.EditMoveToFrontExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcMoveToFront);
+ RunToolCommand(tcMoveToFront);
end;
procedure TFMain.EditMoveToFrontUpdate(Sender: TObject);
@@ -3491,7 +3562,7 @@ procedure TFMain.EditMoveToFrontUpdate(Sender: TObject);
procedure TFMain.EditMoveUpExecute(Sender: TObject);
begin
- ToolManager.ToolCommand(tcMoveUp);
+ RunToolCommand(tcMoveUp);
end;
procedure TFMain.EditMoveUpUpdate(Sender: TObject);
@@ -3501,7 +3572,7 @@ procedure TFMain.EditMoveUpUpdate(Sender: TObject);
procedure TFMain.EditPasteExecute(Sender: TObject);
begin
- if not ToolManager.ToolCommand(tcPaste) then
+ if not RunToolCommand(tcPaste) then
Scripting.CallScriptFunction('EditPaste');
end;
@@ -3520,6 +3591,15 @@ procedure TFMain.FilePrintExecute(Sender: TObject);
LazPaintInstance.ShowPrintDlg;
end;
+procedure TFMain.FileQuickSaveExecute(Sender: TObject);
+var params: TVariableSet;
+begin
+ params := TVariableSet.Create('FileSave');
+ params.Booleans['SkipOptions'] := true;
+ Scripting.CallScriptFunction(params);
+ params.Free;
+end;
+
procedure TFMain.FileRememberSaveFormatExecute(Sender: TObject);
begin
FileRememberSaveFormat.Checked := not FileRememberSaveFormat.Checked;
@@ -3590,6 +3670,13 @@ procedure TFMain.ForgetDialogAnswersExecute(Sender: TObject);
Config.SetDefaultRetrieveSelectionAnswer(0);
for m := low(TToolPopupMessage) to high(TToolPopupMessage) do
Config.SetToolPopupMessageShownCount(ord(m), 0);
+ UToolPolygon.TToolPolygon.ForgetHintShown;
+ UToolVectorial.TVectorialTool.ForgetHintShown;
+ UToolDeformationGrid.TToolTextureMapping.ForgetHintShown;
+ UToolDeformationGrid.TToolDeformationGrid.ForgetHintShown;
+ UToolSelect.TToolRotateSelection.ForgetHintShown;
+ UToolBasic.TToolPen.ForgetHintShown;
+ UToolBrush.TToolBrush.ForgetHintShown;
end;
procedure TFMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
@@ -4056,6 +4143,17 @@ procedure TFMain.ZoomFitIfTooBig;
end;
end;
+function TFMain.RunToolCommand(AToolCommand: TToolCommand): boolean;
+begin
+ if ToolManager.ToolCommand(AToolCommand) then
+ begin
+ PaintPictureNow;
+ UpdateToolbar;
+ result := true;
+ end
+ else result := false;
+end;
+
function TFMain.TryOpenFileUTF8(filenameUTF8: string; AddToRecent: Boolean;
ALoadedImage: PImageEntry; ASkipDialogIfSingleImage: boolean;
AAllowDuplicate: boolean; AEntryToLoad: integer): Boolean;
@@ -4214,9 +4312,9 @@ procedure TFMain.OnImageChangedHandler(AEvent: TLazPaintImageObservationEvent);
end;
end;
-procedure TFMain.OnImageRenderChanged(Sender: TObject);
+procedure TFMain.OnImageRenderChanged(Sender: TLazPaintImage; AInvalidateAll: boolean);
begin
- InvalidatePicture(false);
+ InvalidatePicture(AInvalidateAll);
end;
procedure TFMain.UpdateEditPicture(ADelayed: boolean = false);
@@ -4255,6 +4353,7 @@ procedure TFMain.PictureMouseBefore(Sender: TObject; AShift: TShiftState);
procedure TFMain.PictureMouseMove(Sender: TObject; APosition: TPointF);
begin
HidePenPreview;
+ HideTextMore;
HideFill;
FCoordinatesCaption := IntToStr(round(APosition.X))+','+IntToStr(round(APosition.Y));
@@ -4469,6 +4568,7 @@ procedure TFMain.SetDarkTheme(AValue: boolean);
begin
Layout.DarkTheme := AValue;
DarkThemeInstance.Apply(Panel_PenWidthPreview, AValue);
+ DarkThemeInstance.Apply(Panel_TextMore, AValue);
Invalidate;
UpdateToolImage(true);
end;
diff --git a/lazpaint/lazpainttype.pas b/lazpaint/lazpainttype.pas
index 5b00037c..d61e854e 100644
--- a/lazpaint/lazpainttype.pas
+++ b/lazpaint/lazpainttype.pas
@@ -11,7 +11,7 @@ interface
{$IFDEF LINUX}, InterfaceBase{$ENDIF};
const
- LazPaintVersion = 7010600;
+ LazPaintVersion = 7020000;
function LazPaintVersionStr: string;
@@ -129,6 +129,7 @@ function IsOnlyRenderChange(const ARect:TRect): boolean;
class function Empty: TImageEntry; static;
class function NewFrameIndex: integer; static;
procedure FreeAndNil;
+ procedure Release;
end;
ArrayOfImageEntry = array of TImageEntry;
@@ -244,7 +245,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider)
procedure Show; virtual; abstract;
function Hide: boolean; virtual; abstract;
procedure Run; virtual; abstract;
- procedure Restart; virtual; abstract;
+ function Restart: boolean; virtual; abstract;
procedure CancelRestart; virtual; abstract;
procedure NotifyImageChange(RepaintNow: boolean; ARect: TRect); virtual; abstract;
procedure NotifyImageChangeCompletely(RepaintNow: boolean); virtual; abstract;
@@ -306,7 +307,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider)
procedure InvalidateLayerStack; virtual; abstract;
procedure UpdateLayerStackOnTimer; virtual; abstract;
function MakeNewBitmapReplacement(AWidth, AHeight: integer; AColor: TBGRAPixel): TBGRABitmap; virtual; abstract;
- procedure ChooseTool(Tool : TPaintToolType); virtual; abstract;
+ procedure ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean); virtual; abstract;
function GetOnlineUpdater: TLazPaintCustomOnlineUpdater; virtual;
property GridVisible: boolean read GetGridVisible write SetGridVisible;
@@ -603,6 +604,12 @@ procedure TImageEntry.FreeAndNil;
bpp := 0;
end;
+procedure TImageEntry.Release;
+begin
+ bmp := nil;
+ bpp := 0;
+end;
+
function TLazPaintCustomInstance.GetDarkTheme: boolean;
begin
if Assigned(Config) then
diff --git a/lazpaint/maintoolbar.inc b/lazpaint/maintoolbar.inc
index 3db0c488..16095102 100644
--- a/lazpaint/maintoolbar.inc
+++ b/lazpaint/maintoolbar.inc
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
+const SwitchColorShortcut = 'R';
+
procedure TFMain.CreateToolbarElements;
procedure InitVectorialFill(vf: TLCVectorialFillControl; grad: TBGRALayerGradientOriginal;
@@ -11,6 +13,7 @@ procedure TFMain.CreateToolbarElements;
vf.OnFillChange:= @VectorialFill_Change;
vf.AutoSize := False;
vf.OnFillTypeChange:= @VectorialFill_TypeChange;
+ vf.OnOpacityChange:= @VectorialFill_OpacityChange;
vf.OnAdjustToShape:= @VectorialFill_AdjustToShape;
vf.OnEditGradTexPoints:= @VectorialFill_EditGradTexPoints;
vf.OnResize:= @VectorialFill_Resize;
@@ -110,15 +113,28 @@ begin
Tool_TextAlignLeft.OnClick := @Tool_TextAlignClick;
Tool_TextAlignCenter.OnClick := @Tool_TextAlignClick;
Tool_TextAlignRight.OnClick := @Tool_TextAlignClick;
+ Tool_TextBidirectional.OnClick := @Tool_TextBidiModeClick;
+ Tool_TextLTR.OnClick := @Tool_TextBidiModeClick;
+ Tool_TextRTL.OnClick := @Tool_TextBidiModeClick;
+ Tool_TextAlignTop.OnClick := @Tool_TextAlignClick;
+ Tool_TextAlignMiddle.OnClick := @Tool_TextAlignClick;
+ Tool_TextAlignBottom.OnClick := @Tool_TextAlignClick;
+ Tool_TextBold.OnClick := @Tool_TextStyleClick;
+ Tool_TextItalic.OnClick := @Tool_TextStyleClick;
+ Tool_TextUnderline.OnClick := @Tool_TextStyleClick;
+ Tool_TextStrikeout.OnClick := @Tool_TextStyleClick;
Tool_TextPhong.OnClick := @Tool_TextPhongClick;
Tool_TextShadow.OnClick := @Tool_TextShadowClick;
Tool_TextOutline.OnClick := @Tool_TextOutlineClick;
+ Panel_TextMore.AutoSize := true;
Panel_ToolbarBackground.OnMouseMove := @Panel_ToolbarBackgroundMouseMove;
TimerHidePenPreview.OnTimer := @TimerHidePenPreviewTimer;
+ TimerHideTextMore.OnTimer := @TimerHideTextMoreTimer;
ComboBox_BrushSelect.OnChange := @ComboBox_BrushSelectChange;
ComboBox_BrushSelect.OnDrawItem := @ComboBox_BrushSelectDrawItem;
ComboBox_BrushSelect.OnDrawSelectedItem:= @ComboBox_BrushSelectDrawSelectedItem;
ComboBox_BrushSelect.CanvasScaleMode:= csmFullResolution;
+ Combo_Ratio.Items.Add(rsImage);
Combo_Ratio.OnChange := @Combo_RatioChange;
Panel_LineCap_FullSize := Panel_LineCap.Width;
@@ -225,7 +241,7 @@ begin
Label_Coordinates.Caption := '';
FCoordinatesCaption:= '';
FCoordinatesCaptionCount := 0;
- Image_SwapColors.Hint := Image_SwapColors.Hint + ' (X)';
+ Image_SwapColors.Hint := Image_SwapColors.Hint + ' (' + SwitchColorShortcut + ')';
Tool_CurveModeAuto.Hint := Tool_CurveModeAuto.Hint + ' (A)';
Tool_CurveModeAngle.Hint := Tool_CurveModeAngle.Hint + ' (X)';
@@ -418,6 +434,10 @@ begin
if FInTextFont and not AForce then exit;
SpinEdit_TextSize.Value := round(ToolManager.TextFontSize);
UpdateTextSizeIncrement;
+ Tool_TextBold.Down := fsBold in ToolManager.TextFontStyle;
+ Tool_TextItalic.Down := fsItalic in ToolManager.TextFontStyle;
+ Tool_TextUnderline.Down := fsUnderline in ToolManager.TextFontStyle;
+ Tool_TextStrikeout.Down := fsStrikeOut in ToolManager.TextFontStyle;
end;
procedure TFMain.UpdateTextAlign;
@@ -428,6 +448,9 @@ begin
taCenter: Tool_TextAlignCenter.Down := true;
taRightJustify: Tool_TextAlignRight.Down := true;
end;
+ Tool_TextAlignTop.Down := ToolManager.TextVerticalAlign = tlTop;
+ Tool_TextAlignMiddle.Down := ToolManager.TextVerticalAlign = tlCenter;
+ Tool_TextAlignBottom.Down := ToolManager.TextVerticalAlign = tlBottom;
end;
procedure TFMain.UpdateTextOutlineToolbar;
@@ -1050,6 +1073,11 @@ begin
vf.Width := vf.PreferredSize.cx;
end;
+procedure TFMain.VectorialFill_OpacityChange(Sender: TObject);
+begin
+ HideFill(3000, true);
+end;
+
procedure TFMain.VectorialFill_ShowBackFill(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
ShowFill(VectorialFill_Back, Panel_BackFill);
@@ -1120,7 +1148,7 @@ end;
procedure TFMain.Image_SwapColorsMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
- SwitchColors;
+ if Button = mbLeft then SwitchColors;
end;
procedure TFMain.SpinEdit_ToleranceChange(Sender: TObject; AByUser: boolean);
@@ -1547,6 +1575,17 @@ begin
HidePenPreview(3000, true);
end;
+procedure TFMain.ShowTextMore;
+begin
+ if not Panel_TextMore.Visible then
+ begin
+ Panel_TextMore.Left := min(Panel_Text.Left, ClientWidth-Panel_TextMore.Width);
+ Panel_TextMore.Top := Panel_Text.Top+Panel_Text.Height;
+ Panel_TextMore.Visible := True;
+ end;
+ HideTextMore(3000, true);
+end;
+
procedure TFMain.HidePenPreview(ATimeMs: Integer; AClearTime: boolean);
begin
if AClearTime then TimerHidePenPreview.Enabled := false;
@@ -1557,6 +1596,16 @@ begin
end;
end;
+procedure TFMain.HideTextMore(ATimeMs: Integer; AClearTime: boolean);
+begin
+ if AClearTime then TimerHideTextMore.Enabled := false;
+ if Panel_TextMore.Visible then
+ begin
+ TimerHideTextMore.Interval := ATimeMs;
+ TimerHideTextMore.Enabled := true;
+ end;
+end;
+
procedure TFMain.ShowFill(AFillControl: TLCVectorialFillControl; APanel: TPanel);
begin
AFillControl.BringToFront;
@@ -1581,6 +1630,7 @@ procedure TFMain.Panel_ToolbarBackgroundMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
HidePenPreview;
+ HideTextMore;
HideFill;
end;
@@ -1629,6 +1679,18 @@ begin
ShowPenPreview(False);
end;
+procedure TFMain.Panel_TextMoreMouseMove(Sender: TObject; Shift: TShiftState;
+ X, Y: Integer);
+begin
+ ShowTextMore;
+end;
+
+procedure TFMain.Panel_TextMouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ ShowTextMore;
+end;
+
procedure TFMain.PopupToolbarPopup(Sender: TObject);
begin
MenuFileToolbar.Checked := Config.DefaultFileToolbarVisible;
@@ -1716,6 +1778,12 @@ begin
TimerHidePenPreview.Enabled := false;
end;
+procedure TFMain.TimerHideTextMoreTimer(Sender: TObject);
+begin
+ Panel_TextMore.Visible := False;
+ TimerHideTextMore.Enabled := false;
+end;
+
procedure TFMain.ToolChangeDockingExecute(Sender: TObject);
begin
if Layout.ToolBoxDocking = twLeft then
@@ -1823,17 +1891,66 @@ end;
procedure TFMain.Tool_TextAlignClick(Sender: TObject);
var newAlign: TAlignment;
+ newVAlign: TTextLayout;
begin
if initialized then
begin
newAlign := taLeftJustify;
+ newVAlign:= ToolManager.TextVerticalAlign;
if Tool_TextAlignCenter.Down then newAlign:= taCenter;
if Tool_TextAlignRight.Down then newAlign := taRightJustify;
- if newAlign <> ToolManager.TextAlign then
+ if Tool_TextAlignTop.Down and (sender = Tool_TextAlignTop) then newVAlign := tlTop;
+ if Tool_TextAlignMiddle.Down and (sender = Tool_TextAlignMiddle) then newVAlign := tlCenter;
+ if Tool_TextAlignBottom.Down and (sender = Tool_TextAlignBottom) then newVAlign := tlBottom;
+ FInTextAlign := true;
+ Tool_TextAlignTop.Down := newVAlign = tlTop;
+ Tool_TextAlignMiddle.Down := newVAlign = tlCenter;
+ Tool_TextAlignBottom.Down := newVAlign = tlBottom;
+ FInTextAlign := false;
+ if (newAlign <> ToolManager.TextAlign) or (newVAlign <> ToolManager.TextVerticalAlign) then
begin
FInTextAlign := true;
ToolManager.TextAlign := newAlign;
+ ToolManager.TextVerticalAlign := newVAlign;
+ FInTextAlign := false;
+ UpdateEditPicture;
+ end;
+ end;
+end;
+
+procedure TFMain.Tool_TextBidiModeClick(Sender: TObject);
+var newMode: TFontBidiMode;
+begin
+ if initialized then
+ begin
+ newMode := fbmAuto;
+ if Tool_TextLTR.Down then newMode:= fbmLeftToRight;
+ if Tool_TextRTL.Down then newMode:= fbmRightToLeft;
+ if newMode <> ToolManager.TextBidiMode then
+ begin
+ FInTextAlign := true;
+ ToolManager.TextBidiMode := newMode;
FInTextAlign := false;
+ UpdateTextAlign;
+ end;
+ end;
+end;
+
+procedure TFMain.Tool_TextStyleClick(Sender: TObject);
+var newStyle: TFontStyles;
+begin
+ if initialized then
+ begin
+ newStyle := [];
+ if Tool_TextBold.Down then include(newStyle, fsBold);
+ if Tool_TextItalic.Down then include(newStyle, fsItalic);
+ if Tool_TextUnderline.Down then include(newStyle, fsUnderline);
+ if Tool_TextStrikeout.Down then include(newStyle, fsStrikeOut);
+ if newStyle <> ToolManager.TextFontStyle then
+ begin
+ FInTextFont := true;
+ ToolManager.TextFontStyle := newStyle;
+ FInTextFont := false;
UpdateEditPicture;
end;
end;
@@ -1951,7 +2068,10 @@ var
begin
if initialized then
begin
- newRatio := ComputeRatio(Combo_Ratio.Text);
+ if CompareText(Combo_Ratio.Text, rsImage)=0 then
+ newRatio := Image.Width/Image.Height
+ else
+ newRatio := ComputeRatio(Combo_Ratio.Text);
if newRatio <> ToolManager.ShapeRatio then
begin
FInShapeRatio := true;
diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po
index 83a76f38..93713075 100644
--- a/lazpaint/release/bin/i18n/lazpaint.ar.po
+++ b/lazpaint/release/bin/i18n/lazpaint.ar.po
@@ -650,6 +650,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "سحب اللون..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr ""
@@ -841,6 +849,14 @@ msgstr "فتح ملف موجود"
msgid "Print..."
msgstr "طباعة..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1923,6 +1939,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "ملء متدرج"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1931,15 +1951,39 @@ msgstr ""
msgid "Align left"
msgstr ""
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr ""
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "اختيار الخط..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1950,11 +1994,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "نص بتظليل فونغ"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "ظل النص"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2850,6 +2906,10 @@ msgstr "طلب الغلق"
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "وصف اللون : انقر في اللون مع لوحة المفاتيح باستخدام أسماء الألوان أو بتدوين CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3163,6 +3223,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr ""
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "صورة"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "الصورة كبيرة جدا"
@@ -3550,6 +3616,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr ""
@@ -3717,6 +3787,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po
index 0364b964..c7f029ec 100644
--- a/lazpaint/release/bin/i18n/lazpaint.bg.po
+++ b/lazpaint/release/bin/i18n/lazpaint.bg.po
@@ -648,6 +648,14 @@ msgctxt "TFMAIN.COLORSHIFTCOLORS.CAPTION"
msgid "Shift colors..."
msgstr "Цветово разместване..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Вид на чертата"
@@ -838,6 +846,14 @@ msgstr "Отварянето на съществуващ файл"
msgid "Print..."
msgstr "Разпечатване..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1910,6 +1926,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
msgid "Progressive floodfill"
msgstr ""
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1918,15 +1938,39 @@ msgstr ""
msgid "Align left"
msgstr "Подравняване вляво"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Подравняване вдясно"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Избор на шрифт..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1937,11 +1981,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr ""
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Сянка на текста"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2838,6 +2894,10 @@ msgstr "Заявка за затваряне"
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Описание на цвета: цъкнете, за да напишете цвят по име или по CSS означение."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3146,6 +3206,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Размер на значетата"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Изображение"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Изображението е твърде голямо"
@@ -3534,6 +3600,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "ЧЗС"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Укажете източника с ДЕСЕН цък"
@@ -3699,6 +3769,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po
index 11b2b7f2..d0f45237 100644
--- a/lazpaint/release/bin/i18n/lazpaint.cs.po
+++ b/lazpaint/release/bin/i18n/lazpaint.cs.po
@@ -653,6 +653,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Posunutí barev..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Styl pera"
@@ -843,6 +851,14 @@ msgstr "Otevřít existující soubor"
msgid "Print..."
msgstr "Tisk..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1923,6 +1939,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Vzrůstající výplň"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Centrovat"
@@ -1931,15 +1951,39 @@ msgstr "Centrovat"
msgid "Align left"
msgstr "Zarovnat vlevo"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Zarovnat vpravo"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Vyberte písmo..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1950,11 +1994,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Phongové stínování textu"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Stín textu"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2852,6 +2908,10 @@ msgstr "Uzavřít požadavek"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Popis barvy: klikněte pro zadání barvy klávesnicí pomocí jména barvy nebo zápisu CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3172,6 +3232,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Velikost ikony"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Obrázek"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Obrázek je příliš velký"
@@ -3569,6 +3635,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Použijte PRAVÝ klik k určení zdroje"
@@ -3736,6 +3806,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po
index 9bfc69fd..4d0bd3ef 100644
--- a/lazpaint/release/bin/i18n/lazpaint.de.po
+++ b/lazpaint/release/bin/i18n/lazpaint.de.po
@@ -660,6 +660,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Farben tauschen..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Stiftstil"
@@ -851,6 +859,14 @@ msgstr "Datei öffnen"
msgid "Print..."
msgstr "Drucken..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1934,6 +1950,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Progressive Füllung"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Zentrieren"
@@ -1942,15 +1962,39 @@ msgstr "Zentrieren"
msgid "Align left"
msgstr "Links angleichen"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Rechts angleichen"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Schriftart auswählen..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1961,11 +2005,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Text Phong-Schattierung"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Textschatten"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2861,6 +2917,10 @@ msgstr "Anforderung schließen"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Farbbeschreibung: Anklicken, um Farbnamen oder CSS Farbcode mit der Tastatur einzugeben."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr "Farbüberlagerung"
@@ -3174,6 +3234,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Ikongröße"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Bild"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Bild ist zu groß"
@@ -3379,7 +3445,7 @@ msgstr "Neues Bild"
#: uresourcestrings.rsnewmask
msgid "New mask"
-msgstr "Neue Maske"
+msgstr "Neue Maske\" "
#: uresourcestrings.rsno
msgid "No"
@@ -3561,6 +3627,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "RECHTS-Klick um die Quelle zu wählen"
@@ -3728,6 +3798,10 @@ msgstr "Version"
msgid "Vertical size"
msgstr "Vertikal Größe"
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Sichtbar"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr "Gelb"
diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po
index c1692fd9..c9434dd3 100644
--- a/lazpaint/release/bin/i18n/lazpaint.es.po
+++ b/lazpaint/release/bin/i18n/lazpaint.es.po
@@ -652,6 +652,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Intercambiar colores..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr "Flecha final"
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr "Flecha inicial"
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Estilo de lápiz"
@@ -842,6 +850,14 @@ msgstr "Abrir archivo existente"
msgid "Print..."
msgstr "Imprimir..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1927,6 +1943,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Relleno de flujo progresivo"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Centrar"
@@ -1935,15 +1955,39 @@ msgstr "Centrar"
msgid "Align left"
msgstr "Alinear a la izquierda"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Alinear a la derecha"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Elegir fuente..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1954,11 +1998,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Texto sombreado Phong"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Sombra de Texto"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2856,6 +2912,10 @@ msgstr "Solicitud de cierre"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Descripción del color: hacer clic para escribir el nombre de un color o usar notación CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr "Color superpuesto"
@@ -3176,6 +3236,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Tamaño de ícono"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Imágen"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "La imágen es muy grande"
@@ -3573,6 +3639,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr "Usa clic DERECHO para acabar la forma"
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Usa clic DERECHO para definir fuente"
@@ -3741,6 +3811,10 @@ msgstr "Versión"
msgid "Vertical size"
msgstr "Tamaño vertical"
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr "Amarillo"
diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po
index 7e64b8dd..9e055478 100644
--- a/lazpaint/release/bin/i18n/lazpaint.fi.po
+++ b/lazpaint/release/bin/i18n/lazpaint.fi.po
@@ -639,6 +639,14 @@ msgctxt "TFMAIN.COLORSHIFTCOLORS.CAPTION"
msgid "Shift colors..."
msgstr ""
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr ""
@@ -830,6 +838,14 @@ msgstr "Avaa tiedosto"
msgid "Print..."
msgstr "Tulosta..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1913,6 +1929,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
msgid "Progressive floodfill"
msgstr ""
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1921,15 +1941,39 @@ msgstr ""
msgid "Align left"
msgstr ""
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr ""
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Valitse kirjaisin..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1940,11 +1984,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr ""
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr ""
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2843,6 +2899,10 @@ msgstr ""
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr ""
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3155,6 +3215,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr ""
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Kuva"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Kuva on liian iso"
@@ -3542,6 +3608,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr ""
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr ""
@@ -3708,6 +3778,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po
index 1e65064d..e7121928 100644
--- a/lazpaint/release/bin/i18n/lazpaint.fr.po
+++ b/lazpaint/release/bin/i18n/lazpaint.fr.po
@@ -650,6 +650,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Décaler les couleurs..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr "Flèche de fin"
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr "Flèche de départ"
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Style de pinceau"
@@ -841,6 +849,14 @@ msgstr "Ouvrir un fichier existant"
msgid "Print..."
msgstr "Imprimer..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1925,6 +1941,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Pot de peinture progressif"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr "Aligner en bas"
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Centrer"
@@ -1933,15 +1953,39 @@ msgstr "Centrer"
msgid "Align left"
msgstr "Aligner à gauche"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr "Centrer verticallement"
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Aligner à droite"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr "Aligner en haut"
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr "Bidirectionnel"
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr "Gras"
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Choisir la police..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr "Italique"
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr "Gauche à droite"
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1952,11 +1996,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Texte avec ombrage Phong"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr "Droite à gauche"
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Ombre de texte"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr "Barré"
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr "Souligné"
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2854,6 +2910,10 @@ msgstr "Fermeture"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Description de la couleur : cliquez pour entrer une couleur avec le clavier en utilisant les noms de couleurs ou la notation CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr "Couleur superposée"
@@ -3174,6 +3234,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Taille d'icône"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Image"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Image trop grande"
@@ -3571,6 +3637,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Utiliser le clic DROIT pour définir la source"
@@ -3739,6 +3809,10 @@ msgstr "Version"
msgid "Vertical size"
msgstr "Taille verticale"
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Visible"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr "Jaune"
diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po
index 9a466ac9..7f5944e3 100644
--- a/lazpaint/release/bin/i18n/lazpaint.it.po
+++ b/lazpaint/release/bin/i18n/lazpaint.it.po
@@ -639,6 +639,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Cambia colori..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Penna"
@@ -829,6 +837,14 @@ msgstr "Apri un file esistente"
msgid "Print..."
msgstr "Stampa"
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1912,6 +1928,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Riempimento progressivo"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1920,15 +1940,39 @@ msgstr ""
msgid "Align left"
msgstr "Allinea a sinistra"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Allinea a destra"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Scegli carattere"
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1939,11 +1983,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr ""
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Testo ombrato"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2842,6 +2898,10 @@ msgstr ""
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr ""
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3161,6 +3221,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr ""
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Immagine"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "L'immagine è troppo grande"
@@ -3558,6 +3624,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr ""
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr ""
@@ -3725,6 +3795,10 @@ msgstr "Versione"
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Visibile"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po
index 2297a423..b56246e6 100644
--- a/lazpaint/release/bin/i18n/lazpaint.ja.po
+++ b/lazpaint/release/bin/i18n/lazpaint.ja.po
@@ -648,6 +648,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "色シフト..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr ""
@@ -839,6 +847,14 @@ msgstr "既存ファイルを開く"
msgid "Print..."
msgstr ""
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1920,6 +1936,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "プログレッシブで塗りつぶす"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1928,15 +1948,39 @@ msgstr ""
msgid "Align left"
msgstr ""
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr ""
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "フォント選択..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1947,11 +1991,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr ""
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "テキストシャドゥ"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2848,6 +2904,10 @@ msgstr "Close request"
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr ""
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3160,6 +3220,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr ""
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "イメージ"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr ""
@@ -3547,6 +3613,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr ""
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr ""
@@ -3713,6 +3783,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po
index 1503abc1..8a9d81d6 100644
--- a/lazpaint/release/bin/i18n/lazpaint.kab.po
+++ b/lazpaint/release/bin/i18n/lazpaint.kab.po
@@ -653,6 +653,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Sekḥer initen..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Aɣanib n yimru"
@@ -843,6 +851,14 @@ msgstr "Ldi afaylu yellan"
msgid "Print..."
msgstr "Siggez..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1925,6 +1941,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Taqbuct n teklut tafarayt"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Talemmast"
@@ -1933,15 +1953,39 @@ msgstr "Talemmast"
msgid "Align left"
msgstr "Derrec s azelmaḍ"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Derrec s ayfus"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Fren tasefsit..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1952,11 +1996,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Aḍris s tili Phong"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Tili n uḍris"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2854,6 +2910,10 @@ msgstr "Mdel asuter"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Aglam n yini: sit iwakken ad teskecmeḍ ini s unasiw s yismawen-nnsen neɣ s tira n CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3174,6 +3234,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Tiddi n tignit"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Tugna"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Tugna temeqqer aṭas"
@@ -3573,6 +3639,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Seqdec asiti ayfus iwakken ad tesbaduḍ aɣbalu"
@@ -3740,6 +3810,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po
index 24b7e6e5..25ddfa06 100644
--- a/lazpaint/release/bin/i18n/lazpaint.lv.po
+++ b/lazpaint/release/bin/i18n/lazpaint.lv.po
@@ -658,6 +658,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Nobīdīt krāsas ..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Līnijas veids"
@@ -848,6 +856,14 @@ msgstr "Atvērt esošu attēlu"
msgid "Print..."
msgstr "Izdrukāt ..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1928,6 +1944,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Vienmērīgs aizpildījums"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Iecentrēt"
@@ -1936,15 +1956,39 @@ msgstr "Iecentrēt"
msgid "Align left"
msgstr "Līdzināt pa kreisi"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Līdzināt pa labi"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Izvēlies fontu ..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1955,11 +1999,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Telpiski burti"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Teksta ēna"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2858,6 +2914,10 @@ msgstr "Aizvērt pieprasījumu"
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Krāsas apraksts: ieklikškini, lai ierakstītu krāsas vārdu angliski vai CSS pierakstā."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3178,6 +3238,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Ikonas izmērs"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Attēls"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Attēls ir par lielu"
@@ -3575,6 +3641,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Ar peles labo pogu norādi avotu"
@@ -3745,6 +3815,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po
index f6c63495..0a66e4f8 100644
--- a/lazpaint/release/bin/i18n/lazpaint.nl.po
+++ b/lazpaint/release/bin/i18n/lazpaint.nl.po
@@ -676,6 +676,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Kleuren verschuiven..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Penstijl"
@@ -866,6 +874,14 @@ msgstr "Bestaand bestand openen"
msgid "Print..."
msgstr "Print..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1946,6 +1962,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Progressieve vloedvulling"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Middelste"
@@ -1954,15 +1974,39 @@ msgstr "Middelste"
msgid "Align left"
msgstr "Links uitlijnen"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Rechts uitlijnen"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Lettertype kiezen..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1973,11 +2017,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Tekst phong shading"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Tekstschaduw"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2872,6 +2928,10 @@ msgstr "Verzoek om te sluiten"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Kleurbeschrijving: klik om een kleur in te typen met het toetsenbord middels kleurnamen of CSS notatie."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3185,6 +3245,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Ikoon grootte"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Afbeelding"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Afbeelding is te groot"
@@ -3572,6 +3638,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Gebruik RECHTS klikken om de bron te definiëren"
@@ -3739,6 +3809,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Zichtbaar"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po
index 7d24fb28..87f2603a 100644
--- a/lazpaint/release/bin/i18n/lazpaint.pl.po
+++ b/lazpaint/release/bin/i18n/lazpaint.pl.po
@@ -660,6 +660,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Zmień kolory..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Styl pióra"
@@ -851,6 +859,14 @@ msgstr "Otwórz istniejący plik"
msgid "Print..."
msgstr "Drukuj..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1934,6 +1950,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Wypełnienie progresywne"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Wyśrodkuj"
@@ -1942,15 +1962,39 @@ msgstr "Wyśrodkuj"
msgid "Align left"
msgstr "Wyrównaj do lewej"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Wyrównaj do prawej"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Wybierz czcionkę..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1961,11 +2005,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Cień tekstu phong"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Cień tekstu"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2863,6 +2919,10 @@ msgstr "Zamknij polecenie"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Opis koloru: kliknij, aby wpisać kolor za pomocą klawiatury, używając nazw kolorów lub notacji CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3176,6 +3236,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Rozmiar ikon"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Obraz"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Obraz jest za duży"
@@ -3567,6 +3633,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Użyj prawokliku, aby zdefiniować źródło"
@@ -3734,6 +3804,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Widoczna"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot
index 67a0aa18..4a5d9adb 100644
--- a/lazpaint/release/bin/i18n/lazpaint.pot
+++ b/lazpaint/release/bin/i18n/lazpaint.pot
@@ -606,6 +606,14 @@ msgstr ""
msgid "Shift colors..."
msgstr ""
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr ""
@@ -791,6 +799,14 @@ msgstr ""
msgid "Print..."
msgstr ""
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgid "Quit"
msgstr ""
@@ -1291,6 +1307,7 @@ msgid "Help"
msgstr ""
#: tfmain.menuimage.caption
+msgctxt "tfmain.menuimage.caption"
msgid "Image"
msgstr ""
@@ -1782,6 +1799,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr ""
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr ""
@@ -1790,14 +1811,38 @@ msgstr ""
msgid "Align left"
msgstr ""
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr ""
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgid "Choose font..."
msgstr ""
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "tfmain.tool_textoutline.hint"
msgid "Text outline"
@@ -1807,10 +1852,22 @@ msgstr ""
msgid "Text phong shading"
msgstr ""
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgid "Text shadow"
msgstr ""
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "tfmain.viewcolors.caption"
msgid "Colors"
@@ -2681,6 +2738,10 @@ msgstr ""
msgid "CMD"
msgstr ""
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr ""
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -2987,6 +3048,11 @@ msgstr ""
msgid "Icon size"
msgstr ""
+#: uresourcestrings.rsimage
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr ""
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr ""
@@ -3370,6 +3436,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr ""
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr ""
@@ -3532,6 +3602,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po
index aaa16dfc..1ad8bb9f 100644
--- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po
+++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po
@@ -649,6 +649,14 @@ msgctxt "TFMAIN.COLORSHIFTCOLORS.CAPTION"
msgid "Shift colors..."
msgstr "Mudar as cores..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Estilo caneta"
@@ -840,6 +848,14 @@ msgstr "Abrir arquivo existente"
msgid "Print..."
msgstr "Imprimir..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1921,6 +1937,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
msgid "Progressive floodfill"
msgstr "Preenchimento progressivo"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Centrar"
@@ -1929,15 +1949,39 @@ msgstr "Centrar"
msgid "Align left"
msgstr "Alinhar à esquerda"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Alinhar à direita"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Escolher tipo de letra..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1948,11 +1992,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Texto Phong de sombreamento"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Sombra do texto"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2861,6 +2917,10 @@ msgstr "Solicitação de fechar"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Descrição cor: clique para digitar uma cor com o teclado usando nomes de cores ou a notação CSS."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3174,6 +3234,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Tamanho do ícone"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Imagem"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Imagem é muito grande"
@@ -3562,6 +3628,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Use o botão DIREITO para definir a origem"
@@ -3729,6 +3799,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr "Visível"
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po
index 9178640e..5c407773 100644
--- a/lazpaint/release/bin/i18n/lazpaint.ru.po
+++ b/lazpaint/release/bin/i18n/lazpaint.ru.po
@@ -4,10 +4,12 @@ msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
-"Last-Translator: Ser83-png; AlexL \n"
+"Last-Translator: Ser82-png\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"X-Generator: Poedit 2.3\n"
#: tablet.getprocfailed
#, object-pascal-format
@@ -156,7 +158,7 @@ msgstr "Выбранная операц. налож.:"
#: tfblendop.label_svgover.caption
msgid "Basic SVG"
-msgstr "Базов. SVG"
+msgstr "Базовый SVG"
#: tfblendop.label_svgover.hint
msgid "Basic blend operations that are available in virtually all image editors"
@@ -199,7 +201,7 @@ msgstr "Детали и просмотр"
#: tfbrowseimages.tool_selectdrive.hint
msgid "Select drive"
-msgstr "Выбор диска"
+msgstr "Выбрать диск"
#: tfcanvassize.button_cancel.caption
msgctxt "TFCANVASSIZE.BUTTON_CANCEL.CAPTION"
@@ -235,14 +237,6 @@ msgctxt "tfcanvassize.label_width.caption"
msgid "Width :"
msgstr "Ширина:"
-#: uresourcestrings.rsaddtopalette
-msgid "Add color to palette"
-msgstr "Добавить цвет в палитру"
-
-#: uresourcestrings.rsremovefrompalette
-msgid "Remove color from palette"
-msgstr "Удилить цвет из палитры"
-
#: tfchoosecolor.caption
msgctxt "TFCHOOSECOLOR.CAPTION"
msgid "Color"
@@ -266,7 +260,7 @@ msgstr "Интенсивность"
#: tfcolorintensity.label_multiply.caption
msgctxt "tfcolorintensity.label_multiply.caption"
msgid "Multiply"
-msgstr "Умножиение"
+msgstr "Умножение"
#: tfcolorintensity.label_shift.caption
msgctxt "tfcolorintensity.label_shift.caption"
@@ -286,7 +280,7 @@ msgstr "ОК"
#: tfcolorize.caption
msgctxt "tfcolorize.caption"
msgid "Colorize"
-msgstr "Раскрасить"
+msgstr "Колоризация"
#: tfcolorize.checkbox_gsba.caption
msgctxt "tfcolorize.checkbox_gsba.caption"
@@ -332,7 +326,7 @@ msgstr "Пользовательское размытие"
#: tfcustomblur.openpicturedialog1.title
msgid "Open grayscale file"
-msgstr "Открытие файла оттенков серого"
+msgstr "Открыть файл в оттенках серого"
#: tfemboss.button_cancel.caption
msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
@@ -386,7 +380,6 @@ msgid "Corrected hue and lightness"
msgstr "Исправлять оттенок и яркость"
#: tffilterfunction.label_aequals.caption
-#, fuzzy
msgctxt "tffilterfunction.label_aequals.caption"
msgid "."
msgstr "."
@@ -397,7 +390,6 @@ msgid "."
msgstr "."
#: tffilterfunction.label_bequals.caption
-#, fuzzy
msgctxt "tffilterfunction.label_bequals.caption"
msgid "."
msgstr "."
@@ -418,7 +410,6 @@ msgid "."
msgstr "."
#: tffilterfunction.label_lequals.caption
-#, fuzzy
msgctxt "tffilterfunction.label_lequals.caption"
msgid "."
msgstr "."
@@ -448,7 +439,7 @@ msgstr "HSL"
#: tffilterfunction.tabsheet_lab.caption
msgid "Lab"
-msgstr ""
+msgstr "Lab"
#: tffilterfunction.tabsheet_rgb.caption
msgctxt "tffilterfunction.tabsheet_rgb.caption"
@@ -508,22 +499,22 @@ msgstr "Снять отметки с несуществующих файлов"
#: tfimagelist.stringgrid1.columns[0].title.caption
msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
msgid "-"
-msgstr ""
+msgstr "-"
#: tfimagelist.stringgrid1.columns[1].title.caption
msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
msgid "-"
-msgstr ""
+msgstr "-"
#: tfimagelist.stringgrid1.columns[2].title.caption
msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
msgid "-"
-msgstr ""
+msgstr "-"
#: tfimagelist.stringgrid1.columns[3].title.caption
msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
msgid "-"
-msgstr ""
+msgstr "-"
#: tfimagelist.tbaddfiles.hint
msgid "Add images to list"
@@ -587,7 +578,7 @@ msgstr "Удалить выбранное изображение из списк
#: tfimagelist.tbuncheckall.hint
msgid "Uncheck all files for processing"
-msgstr "Снять выделение со всех файлов для обработки"
+msgstr "Снять со всех файлов отметку для обработки"
#: tflayerstack.caption
msgctxt "tflayerstack.caption"
@@ -614,10 +605,9 @@ msgid "Remove current brush"
msgstr "Удалить текущую кисть"
#: tfmain.button_donate.caption
-#, fuzzy
msgctxt "tfmain.button_donate.caption"
msgid "Donate..."
-msgstr "Пожертвования ..."
+msgstr "Пожертвования..."
#: tfmain.caption
msgctxt "TFMAIN.CAPTION"
@@ -626,7 +616,7 @@ msgstr "LazPaint"
#: tfmain.colorcolorize.caption
msgid "Colorize..."
-msgstr "Раскрасить..."
+msgstr "Колоризация..."
#: tfmain.colorcurves.caption
msgid "Curves..."
@@ -653,6 +643,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Сдвиг цвета..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Стиль пера"
@@ -663,7 +661,7 @@ msgstr "Копировать"
#: tfmain.editcopy.hint
msgid "Copy selection"
-msgstr "Копировать область выделения"
+msgstr "Копировать выделение"
#: tfmain.editcut.caption
msgid "Cut"
@@ -671,7 +669,7 @@ msgstr "Вырезать"
#: tfmain.editcut.hint
msgid "Cut selection"
-msgstr "Вырезать область выделения"
+msgstr "Вырезать выделение"
#: tfmain.editdeleteselection.caption
msgctxt "tfmain.editdeleteselection.caption"
@@ -680,7 +678,7 @@ msgstr "Удалить"
#: tfmain.editdeleteselection.hint
msgid "Delete selection"
-msgstr "Удалить область выделения"
+msgstr "Удалить выделение"
#: tfmain.editdeselect.hint
msgctxt "TFMAIN.EDITDESELECT.HINT"
@@ -690,7 +688,7 @@ msgstr "Снять выделение"
#: tfmain.editinvertselection.hint
msgctxt "TFMAIN.EDITINVERTSELECTION.HINT"
msgid "Invert selection"
-msgstr "Обратить выделение"
+msgstr "Инвертировать выделение"
#: tfmain.editmovedown.hint
msgid "Move down"
@@ -729,16 +727,16 @@ msgstr "Вернуть"
#: tfmain.editselectall.caption
msgctxt "tfmain.editselectall.caption"
msgid "Select all"
-msgstr "Выбрать все"
+msgstr "Выделить всё"
#: tfmain.editselectall.hint
msgctxt "tfmain.editselectall.hint"
msgid "Select all"
-msgstr "Выбрать все"
+msgstr "Выделить всё"
#: tfmain.editselection.caption
msgid "Edit selection..."
-msgstr "Редактировать область выделения..."
+msgstr "Редактировать выделение..."
#: tfmain.editselectionfit.caption
msgid "Selection fit"
@@ -807,7 +805,7 @@ msgstr "Выбрать запись..."
#: tfmain.filechooseentry.hint
msgid "Choose entry within file"
-msgstr "Выбрать запись в файле..."
+msgstr "Выбрать запись внутри файла"
#: tfmain.fileexport.caption
msgctxt "tfmain.fileexport.caption"
@@ -820,7 +818,7 @@ msgstr "Импорт 3D-объекта..."
#: tfmain.fileloadselection.caption
msgid "Load selection..."
-msgstr "Загрузить область выделения..."
+msgstr "Загрузить выделение..."
#: tfmain.filenew.caption
msgid "New..."
@@ -843,6 +841,14 @@ msgstr "Открыть существующий файл"
msgid "Print..."
msgstr "Печать..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -885,7 +891,7 @@ msgstr "Сохранить в той же папке..."
#: tfmain.filesaveselectionas.caption
msgctxt "TFMAIN.FILESAVESELECTIONAS.CAPTION"
msgid "Save selection as..."
-msgstr "Сохранить выделенную область как..."
+msgstr "Сохранить выделение как..."
#: tfmain.fileuseimagebrowser.caption
msgctxt "tfmain.fileuseimagebrowser.caption"
@@ -1053,7 +1059,7 @@ msgstr "Обрезать по выделенному"
#: tfmain.imagecroplayer.caption
msgid "Crop to selection and current layer"
-msgstr "Обрезать по выделенному и текущему слою"
+msgstr "Обрезать по выделению и текущему слою"
#: tfmain.imagefillbackground.caption
msgid "Fill background with antialiasing"
@@ -1172,7 +1178,6 @@ msgid "Brush"
msgstr "Кисть"
#: tfmain.label_coordinates.caption
-#| msgid "99999x99999"
msgid "9999x9999"
msgstr "9999x9999"
@@ -1236,7 +1241,7 @@ msgstr "Ширина"
#: tfmain.label_phongborder.caption
msgctxt "tfmain.label_phongborder.caption"
msgid "Border"
-msgstr "Граница"
+msgstr "Кромка"
#: tfmain.label_ratio.caption
msgid "Ratio"
@@ -1284,7 +1289,7 @@ msgstr "Дублировать выделенный слой"
#: tfmain.layerexport.hint
msgctxt "tfmain.layerexport.hint"
msgid "Export..."
-msgstr ""
+msgstr "Экспорт..."
#: tfmain.layerfromfile.hint
msgctxt "tfmain.layerfromfile.hint"
@@ -1330,7 +1335,7 @@ msgstr "Увеличить слой"
#: tfmain.loadselectiondialog.title
msgid "Load selection"
-msgstr "Загрузить выделенную область"
+msgstr "Загрузить выделение"
#: tfmain.menucolors.caption
msgctxt "tfmain.menucolors.caption"
@@ -1536,15 +1541,15 @@ msgstr "Сохранить файл как..."
#: tfmain.saveselectiondialog.title
msgctxt "TFMAIN.SAVESELECTIONDIALOG.TITLE"
msgid "Save selection as..."
-msgstr "Сохранить выделенную область как..."
+msgstr "Сохранить выделение как..."
#: tfmain.selectionhorizontalflip.hint
msgid "Flip selection horizontally"
-msgstr "Отразить выделенную область по горизонтали"
+msgstr "Отразить выделение по горизонтали"
#: tfmain.selectionverticalflip.hint
msgid "Flip selection vertically"
-msgstr "Отразить выделенную область по вертикали"
+msgstr "Отразить выделение по вертикали"
#: tfmain.spinedit_arrowsizex.hint
msgctxt "tfmain.spinedit_arrowsizex.hint"
@@ -1574,12 +1579,12 @@ msgstr "Ширина пера"
#: tfmain.spinedit_phongbordersize.hint
msgctxt "tfmain.spinedit_phongbordersize.hint"
msgid "Border size"
-msgstr "Размер границы"
+msgstr "Размер кромки"
#: tfmain.spinedit_shapealtitude.hint
msgctxt "tfmain.spinedit_shapealtitude.hint"
msgid "Shape altitude"
-msgstr "Форма высоты"
+msgstr "Высота фигуры"
#: tfmain.spinedit_textblur.hint
msgctxt "tfmain.spinedit_textblur.hint"
@@ -1665,7 +1670,7 @@ msgstr "Рука"
#: tfmain.toolhand.hint
msgid "Move and scroll picture"
-msgstr "Переместить и прокрутить изображение"
+msgstr "Перемещение и прокрутка рисунка"
#: tfmain.toolhotspot.caption
msgctxt "tfmain.toolhotspot.caption"
@@ -1722,7 +1727,7 @@ msgstr "Многоугольник или ломаная"
#: tfmain.toolpolyline.hint
msgid "Polyline"
-msgstr "Ломанная"
+msgstr "Ломаная"
#: tfmain.toolrect.hint
msgctxt "TFMAIN.TOOLRECT.HINT"
@@ -1732,7 +1737,7 @@ msgstr "Прямоугольник"
#: tfmain.toolrotateselection.hint
msgctxt "TFMAIN.TOOLROTATESELECTION.HINT"
msgid "Rotate selection"
-msgstr "Повернуть выделенную область"
+msgstr "Повернуть выделение"
#: tfmain.toolselectellipse.hint
msgctxt "TFMAIN.TOOLSELECTELLIPSE.HINT"
@@ -1747,7 +1752,7 @@ msgstr "Выделить пером"
#: tfmain.toolselectpen.hint
msgctxt "tfmain.toolselectpen.hint"
msgid "Draw selection with pen"
-msgstr "Выделить область пером"
+msgstr "Нарисовать выделение пером"
#: tfmain.toolselectpoly.hint
msgctxt "TFMAIN.TOOLSELECTPOLY.HINT"
@@ -1806,7 +1811,7 @@ msgstr "Квадратное окончание"
#: tfmain.tool_closeshape.hint
msgctxt "tfmain.tool_closeshape.hint"
msgid "Close shape"
-msgstr "Закрытая фигура"
+msgstr "Закрытая форма"
#: tfmain.tool_curvemodeangle.hint
msgid "Draw an angle"
@@ -1828,7 +1833,7 @@ msgstr "Переместить точку"
#: tfmain.tool_drawshapeborder.hint
msgctxt "tfmain.tool_drawshapeborder.hint"
msgid "Draw border"
-msgstr "Рисовать границу"
+msgstr "Рисовать кромку"
#: tfmain.tool_erasealpha.hint
msgctxt "tfmain.tool_erasealpha.hint"
@@ -1922,23 +1927,51 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Прогрессивная заливка"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
-msgstr "В центре"
+msgstr "По центру"
#: tfmain.tool_textalignleft.hint
msgid "Align left"
msgstr "По левому краю"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "По правому краю"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Выбрать шрифт..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1949,11 +1982,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Затенение текста по Фонгу"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Тень текста"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2086,7 +2131,7 @@ msgstr "Новое изображение"
#: tfnewimage.combobox_bitdepth.text
msgid "32"
-msgstr ""
+msgstr "32"
#: tfnewimage.label_bitdepth.caption
msgid "Bit depth :"
@@ -2172,7 +2217,7 @@ msgstr "Текстурная интерполяция"
#: tfobject3d.groupbox_selectedlight.caption
msgid "Selected light"
-msgstr "Источник света"
+msgstr "Выбранный свет"
#: tfobject3d.groupbox_selectedmaterial.caption
msgctxt "tfobject3d.groupbox_selectedmaterial.caption"
@@ -2321,7 +2366,7 @@ msgstr "Насыщенность"
#: tfphongfilter.radio_usebackcolor.caption
msgid "Back color"
-msgstr "Цвет фона"
+msgstr "Дополнит."
#: tfphongfilter.radio_usekeep.caption
msgid "Keep"
@@ -2329,7 +2374,7 @@ msgstr "Как есть"
#: tfphongfilter.radio_usepencolor.caption
msgid "Pen color"
-msgstr "Цвет пера"
+msgstr "Основной"
#: tfphongfilter.radio_usetexture.caption
msgctxt "tfphongfilter.radio_usetexture.caption"
@@ -2378,7 +2423,7 @@ msgstr "Постеризация"
#: tfposterize.checkbox_bylightness.caption
msgid "By lightness"
-msgstr ""
+msgstr "С осветлением"
#: tfposterize.label_levels.caption
msgid "Levels :"
@@ -2404,7 +2449,7 @@ msgstr "Печать!"
#: tfprint.button_zoomfit.caption
msgctxt "tfprint.button_zoomfit.caption"
msgid "Zoom fit"
-msgstr "Увеличить до размера окна"
+msgstr "По размеру листа"
#: tfprint.caption
msgid "Print"
@@ -2439,7 +2484,7 @@ msgstr "."
#: tfprint.label_height.caption
msgid "Height:"
-msgstr "Height:"
+msgstr "Высота:"
#: tfprint.label_left.caption
msgid "Left:"
@@ -2459,7 +2504,7 @@ msgstr "Справа:"
#: tfprint.label_top.caption
msgid "Top:"
-msgstr "Снизу:"
+msgstr "Сверху:"
#: tfprint.label_width.caption
msgid "Width:"
@@ -2576,7 +2621,7 @@ msgstr "Дизеринг"
#: tfsaveoption.checkbox_lossless.caption
msgid "Lossless"
-msgstr ""
+msgstr "Без потерь"
#: tfsaveoption.label1.caption
msgid "Quality:"
@@ -2584,15 +2629,15 @@ msgstr "Качество:"
#: tfsaveoption.label_0.caption
msgid "0"
-msgstr ""
+msgstr "0"
#: tfsaveoption.label_1.caption
msgid "100"
-msgstr ""
+msgstr "100"
#: tfsaveoption.label_50.caption
msgid "50"
-msgstr ""
+msgstr "50"
#: tfsaveoption.label_colordepth.caption
msgid "Color depth:"
@@ -2624,7 +2669,7 @@ msgstr "32-битный"
#: tfsaveoption.radiobutton_miomap.caption
msgid "MioMap"
-msgstr ""
+msgstr "MioMap"
#: tfsharpen.button_cancel.caption
msgctxt "tfsharpen.button_cancel.caption"
@@ -2643,7 +2688,7 @@ msgstr "Резкость/Сглаженность"
#: tfsharpen.label_amount.caption
msgctxt "tfsharpen.label_amount.caption"
msgid "Amount :"
-msgstr "Кол-во:"
+msgstr "Эффект:"
#: tfshiftcolors.button_cancel.caption
msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION"
@@ -2739,6 +2784,10 @@ msgstr "Действие в процессе"
msgid "Add files to the image processing list"
msgstr "Добавить файлы в список обработки изображений"
+#: uresourcestrings.rsaddtopalette
+msgid "Add color to palette"
+msgstr "Добавить цвет в палитру"
+
#: uresourcestrings.rsalignshape
msgid "Align shape"
msgstr "Выровнять фигуру"
@@ -2753,7 +2802,7 @@ msgstr "Все поддерживаемые типы файлов"
#: uresourcestrings.rsalt
msgid "ALT"
-msgstr ""
+msgstr "ALT"
#: uresourcestrings.rsanimatedgif
msgid "Animated GIF"
@@ -2764,7 +2813,6 @@ msgid "Autodetect"
msgstr "Автоопределение"
#: uresourcestrings.rsback
-#, fuzzy
msgctxt "uresourcestrings.rsback"
msgid "Back"
msgstr "Назад"
@@ -2779,11 +2827,11 @@ msgstr "Лучшее качество"
#: uresourcestrings.rsbitmap
msgid "Bitmap"
-msgstr ""
+msgstr "Bitmap"
#: uresourcestrings.rsblack
msgid "Black"
-msgstr ""
+msgstr "Чёрный"
#: uresourcestrings.rsblendopnotusedforbackground
msgid "The blend operation is applied only if there is a layer underneath"
@@ -2791,7 +2839,7 @@ msgstr "Операция наложения применяется только
#: uresourcestrings.rsblue
msgid "Blue"
-msgstr "Голубой"
+msgstr "Синий"
#: uresourcestrings.rsbrightness
msgid "Brightness"
@@ -2825,11 +2873,11 @@ msgstr "Размер холста"
#: uresourcestrings.rscdrom
msgid "CD"
-msgstr ""
+msgstr "Компакт-диск"
#: uresourcestrings.rschannels
msgid "Channels"
-msgstr ""
+msgstr "Каналы"
#: uresourcestrings.rsclearpalette
msgid "Clear palette"
@@ -2841,11 +2889,15 @@ msgstr "Закрыть вопрос"
#: uresourcestrings.rscmd
msgid "CMD"
+msgstr "CMD"
+
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
msgstr ""
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
-msgstr ""
+msgstr "Цветовое наложение"
#: uresourcestrings.rscolors
msgctxt "uresourcestrings.rscolors"
@@ -2896,11 +2948,11 @@ msgstr "Обрезать"
#: uresourcestrings.rsctrl
msgid "CTRL"
-msgstr ""
+msgstr "CTRL"
#: uresourcestrings.rscurrentlayernotsplit
msgid "Current layer is not split"
-msgstr ""
+msgstr "Текущий слой не разделен"
#: uresourcestrings.rscurvemodehint
msgid "Press S or X to set the curve mode of the last point"
@@ -2908,7 +2960,7 @@ msgstr "Нажать S или X, чтобы установить последн
#: uresourcestrings.rscyan
msgid "Cyan"
-msgstr ""
+msgstr "Сине-зелёный"
#: uresourcestrings.rsdefaultpalette
msgid "Default palette"
@@ -2932,18 +2984,17 @@ msgid "Dither layer using palette"
msgstr "Дизеринг слоя с использованием палитры"
#: uresourcestrings.rsdonate
-#, fuzzy
msgctxt "uresourcestrings.rsdonate"
msgid "Donate..."
-msgstr "Пожертвования ..."
+msgstr "Пожертвования..."
#: uresourcestrings.rsdownload
msgid "Download"
-msgstr "скачать"
+msgstr "Загрузить"
#: uresourcestrings.rsdropshadow
msgid "Drop shadow"
-msgstr ""
+msgstr "Падающая тень"
#: uresourcestrings.rsduplicateimage
msgid "Duplicate image"
@@ -2967,7 +3018,7 @@ msgstr "Слой пуст"
#: uresourcestrings.rsemptyselection
msgid "Selection is empty"
-msgstr "Выделенная область пуста"
+msgstr "Выделение пусто"
#: uresourcestrings.rsendwithoutmatchingbegin
msgid "End without matching begin"
@@ -2979,7 +3030,7 @@ msgstr "Ввести имя для нового слоя или контейне
#: uresourcestrings.rsenterlayername
msgid "Enter layer name:"
-msgstr "Введите имя слоя:"
+msgstr "Введите название слоя:"
#: uresourcestrings.rsentries
msgid "Entries"
@@ -2999,7 +3050,7 @@ msgstr "Ошибка при загрузке оригинала, однако с
#: uresourcestrings.rserroronopeningfile
msgid "Error on opening file \"%1\""
-msgstr "Ошибка открытия файла \"%1"\"
+msgstr "Ошибка открытия файла \"%1\""
#: uresourcestrings.rsexception
msgid "An exception was encountered"
@@ -3011,15 +3062,15 @@ msgstr "Запрос выхода"
#: uresourcestrings.rsexpect1parameter
msgid "expects one parameter : "
-msgstr "ожидает один параметр:"
+msgstr "ожидается один параметр: "
#: uresourcestrings.rsexpect2parameters
msgid "expects two parameters : "
-msgstr "ожидает два параметра:"
+msgstr "ожидается два параметра: "
#: uresourcestrings.rsexpectnparameters
msgid "expects N parameters : "
-msgstr "ожидает N параметров:"
+msgstr "ожидается N параметров: "
#: uresourcestrings.rsfast
msgid "Fast"
@@ -3070,7 +3121,6 @@ msgid "Fixed"
msgstr "Исправлено"
#: uresourcestrings.rsflattenimage
-#, fuzzy
msgctxt "uresourcestrings.rsflattenimage"
msgid "Flatten image"
msgstr "Свести изображение"
@@ -3089,7 +3139,7 @@ msgstr "Произошли следующие ошибки:"
#: uresourcestrings.rsfractaltree
msgid "Fractal tree"
-msgstr ""
+msgstr "Фрактальное дерево"
#: uresourcestrings.rsframes
msgid "Frames"
@@ -3142,7 +3192,7 @@ msgstr "Тон против час.стрелки"
#: uresourcestrings.rshuecw
msgctxt "uresourcestrings.rshuecw"
msgid "Hue CW"
-msgstr "Тон по час.стрелки"
+msgstr "Тон по час.стрелке"
#: uresourcestrings.rsiconimagealreadyexists
msgid "There is already an image with this size and depth."
@@ -3157,6 +3207,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Размер значков"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Изображение"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Изображение слишком большое"
@@ -3172,11 +3228,11 @@ msgstr "Информация"
#: uresourcestrings.rsinnerlight
msgid "Inner light"
-msgstr ""
+msgstr "Внутренний свет"
#: uresourcestrings.rsinnershadow
msgid "Inner shadow"
-msgstr ""
+msgstr "Внутренняя тень"
#: uresourcestrings.rsintensity
msgctxt "uresourcestrings.rsintensity"
@@ -3189,7 +3245,7 @@ msgstr "Внутренняя ошибка"
#: uresourcestrings.rsinvalidangle
msgid "Invalid angle"
-msgstr ""
+msgstr "Неверный угол"
#: uresourcestrings.rsinvalidname
msgid "Invalid name"
@@ -3197,7 +3253,7 @@ msgstr "Неверное имя"
#: uresourcestrings.rsinvalidopacity
msgid "Invalid opacity : "
-msgstr "Неверная прозрачность:"
+msgstr "Неверная прозрачность: "
#: uresourcestrings.rsinvalidparameters
msgid "Invalid parameters"
@@ -3209,11 +3265,11 @@ msgstr "Неверный размер повторной обработки: "
#: uresourcestrings.rsinvalidsizefornew
msgid "Invalid size for new : "
-msgstr "Неверный размер для нового:"
+msgstr "Неверный размер для нового: "
#: uresourcestrings.rskeepchanges
msgid "Do you want to keep changes?"
-msgstr "Желаете сохранить изменения?"
+msgstr "Хотите сохранить изменения?"
#: uresourcestrings.rskeepemptyspace
msgid "Keep empty space around opaque pixels?"
@@ -3233,7 +3289,7 @@ msgstr "Последняя версия LazPaint доступна online"
#: uresourcestrings.rslava
msgid "Lava"
-msgstr ""
+msgstr "Лава"
#: uresourcestrings.rslayer
msgctxt "uresourcestrings.rslayer"
@@ -3242,7 +3298,7 @@ msgstr "Слой"
#: uresourcestrings.rslayeralreadysplit
msgid "Layer already split"
-msgstr ""
+msgstr "Слой уже разделен"
#: uresourcestrings.rslayeredimage
msgid "Layered image"
@@ -3250,7 +3306,7 @@ msgstr "Многослойное изображение"
#: uresourcestrings.rslayereffect
msgid "Layer effect"
-msgstr ""
+msgstr "Эффект слоя"
#: uresourcestrings.rslayers
msgctxt "uresourcestrings.rslayers"
@@ -3281,11 +3337,11 @@ msgstr "Положение источника света"
#: uresourcestrings.rslinear
msgid "Linear"
-msgstr "Линейная"
+msgstr "Линейный"
#: uresourcestrings.rslinearrgb
msgid "Linear RGB"
-msgstr "Линейна RGB"
+msgstr "Линейный RGB"
#: uresourcestrings.rsloadandmergepalette
msgid "Load and merge palette..."
@@ -3305,11 +3361,11 @@ msgstr "Количество циклов"
#: uresourcestrings.rsmagenta
msgid "Magenta"
-msgstr ""
+msgstr "Маджента"
#: uresourcestrings.rsmakemonochromatic
msgid "Make monochromatic"
-msgstr ""
+msgstr "Сделать монохромным"
#: uresourcestrings.rsmakencolorspalettefrombitmap
msgid "Make %1-colors palette from image"
@@ -3317,15 +3373,15 @@ msgstr "Создать %1-цветную палитру из изображен
#: uresourcestrings.rsmask
msgid "Mask"
-msgstr ""
+msgstr "Маска"
#: uresourcestrings.rsmaskfromalphachannel
msgid "Mask from alpha channel"
-msgstr ""
+msgstr "Маска из альфа-канала"
#: uresourcestrings.rsmerge
msgid "Merge"
-msgstr ""
+msgstr "Объединить"
#: uresourcestrings.rsmergeselection
msgid "Do you want to merge selection?"
@@ -3333,7 +3389,7 @@ msgstr "Хотите объединить выделенные области?"
#: uresourcestrings.rsmitchell
msgid "Mitchell"
-msgstr ""
+msgstr "Mitchell"
#: uresourcestrings.rsmorethanonefile
msgid "You are trying to open more than one file. How would you like these files to be opened?"
@@ -3341,15 +3397,15 @@ msgstr "Вы пытаетесь открыть более одного файл
#: uresourcestrings.rsmovingorrotatingselection
msgid "Moving or rotating selection"
-msgstr "Переместить или повернуть выделенную область"
+msgstr "Переместить или повернуть выделение"
#: uresourcestrings.rsmustreleaseselection
msgid "You must first release the selection"
-msgstr "Сначала Вы должны отменить выделение"
+msgstr "Сначала вы должны отменить выделение"
#: uresourcestrings.rsmustshowlayer
msgid "You must first make the layer visible"
-msgstr "Сначала Вы должны сделать слой видимым"
+msgstr "Сначала вы должны сделать слой видимым"
#: uresourcestrings.rsnetworkdrive
msgid "Network"
@@ -3362,7 +3418,7 @@ msgstr "Новое изображение"
#: uresourcestrings.rsnewmask
msgid "New mask"
-msgstr ""
+msgstr "Новая маска"
#: uresourcestrings.rsno
msgid "No"
@@ -3382,7 +3438,7 @@ msgstr "Не сохранять и отрыть другой файл"
#: uresourcestrings.rsnoname
msgid "noname"
-msgstr "Без_имени"
+msgstr "без_имени"
#: uresourcestrings.rsnormalblendop
msgid "Normal"
@@ -3390,7 +3446,7 @@ msgstr "Нормальное"
#: uresourcestrings.rsnotchromaticchannel
msgid "This is not a chromatic channel"
-msgstr ""
+msgstr "Это не хроматический канал"
#: uresourcestrings.rsnothingtobedeformed
msgid "There is nothing to be deformed"
@@ -3406,11 +3462,11 @@ msgstr "Не стоит сохранять такое большое изобр
#: uresourcestrings.rsnumber
msgid "№"
-msgstr ""
+msgstr "№"
#: uresourcestrings.rsokay
msgid "Okay"
-msgstr ""
+msgstr "ОК"
#: uresourcestrings.rsopacity
msgid "Opacity"
@@ -3453,7 +3509,6 @@ msgid "Palette options"
msgstr "Параметры палитры"
#: uresourcestrings.rspen
-#, fuzzy
msgctxt "uresourcestrings.rspen"
msgid "Pen"
msgstr "Перо"
@@ -3477,7 +3532,7 @@ msgstr "Предустановленное имя"
#: uresourcestrings.rspx
msgid "px"
-msgstr ""
+msgstr "px"
#: uresourcestrings.rspythonunexpectedversion
msgid "Expected Python version %1 but %2 found."
@@ -3502,7 +3557,7 @@ msgstr "Красный"
#: uresourcestrings.rsreload
msgctxt "uresourcestrings.rsreload"
msgid "Reload"
-msgstr "Перегрузить"
+msgstr "Перезагрузить"
#: uresourcestrings.rsreloadchanged
msgid "Bitmap has been modified. Do you really want to reload?"
@@ -3510,13 +3565,16 @@ msgstr "Растровое изображение было изменено. В
#: uresourcestrings.rsremovabledrive
msgid "Removable"
-msgstr "Съемный"
+msgstr "Съёмный"
+
+#: uresourcestrings.rsremovefrompalette
+msgid "Remove color from palette"
+msgstr "Удилить цвет из палитры"
#: uresourcestrings.rsrender
-#, fuzzy
msgctxt "uresourcestrings.rsrender"
msgid "Render"
-msgstr "Визуализация"
+msgstr "Рендеринг"
#: uresourcestrings.rsrepeatimage
msgctxt "uresourcestrings.rsrepeatimage"
@@ -3540,9 +3598,13 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
-msgstr "Правый клик для определения источника"
+msgstr "Правый клик для установки источника"
#: uresourcestrings.rssaturation
msgctxt "uresourcestrings.rssaturation"
@@ -3561,7 +3623,7 @@ msgstr "Сохранить файл с указанным именем"
#: uresourcestrings.rssavechanges
msgid "Current bitmap has been modified. Do you want to save changes?"
-msgstr "Данное изображение было изменено. Вы хотите сохранить изменения?"
+msgstr "Текущее растровое изображение было изменено. Сохранить изменения?"
#: uresourcestrings.rssavepaletteas
msgid "Save palette as..."
@@ -3579,7 +3641,7 @@ msgstr "Выбрать операцию наложения"
#: uresourcestrings.rsshift
msgid "SHIFT"
-msgstr ""
+msgstr "SHIFT"
#: uresourcestrings.rsshowpalette
msgctxt "uresourcestrings.rsshowpalette"
@@ -3597,15 +3659,15 @@ msgstr "Сплайн"
#: uresourcestrings.rssplitcmyk
msgid "Split CMYK"
-msgstr ""
+msgstr "Разделить CMYK"
#: uresourcestrings.rssplithsl
msgid "Split HSL"
-msgstr ""
+msgstr "Разделить HSL"
#: uresourcestrings.rssplitrgb
msgid "Split RGB"
-msgstr ""
+msgstr "Разделить RGB"
#: uresourcestrings.rsstoragedevice
msgid "Device"
@@ -3613,13 +3675,12 @@ msgstr "Устройство"
#: uresourcestrings.rsstroke
msgid "Stroke"
-msgstr ""
+msgstr "Штрих"
#: uresourcestrings.rstextoutline
-#, fuzzy
msgctxt "uresourcestrings.rstextoutline"
msgid "Text outline"
-msgstr "Текст плана"
+msgstr "Контур текста"
#: uresourcestrings.rstexturemapping
msgctxt "uresourcestrings.rstexturemapping"
@@ -3632,7 +3693,7 @@ msgstr "Нет отмеченных пунктов. Отметьте какие-
#: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
-msgstr "Для этого файла не указано имя файла. Используйте "Сохранить как..." из главного меню."
+msgstr "Для этого файла не указано имя. Используйте \"Сохранить как...\" из главного меню."
#: uresourcestrings.rstodo
msgid "To do"
@@ -3672,23 +3733,23 @@ msgstr "Преобразованный растровый слой"
#: uresourcestrings.rstransformselectioncontent
msgid "Do you want to transform content of the selection?"
-msgstr "Желаете преобразовать содержание выделенной области?"
+msgstr "Хотите преобразовать содержание выделенной области?"
#: uresourcestrings.rsunabletoapplyfilter
msgid "Unable to apply filter : "
-msgstr "Невозможно применить фильтр:"
+msgstr "Невозможно применить фильтр: "
#: uresourcestrings.rsunabletoloadfile
msgid "Unable to load file : "
-msgstr "Не удается загрузить файл:"
+msgstr "Невозможно загрузить файл: "
#: uresourcestrings.rsunabletosavefile
msgid "Unable to save file : "
-msgstr "Не удается сохранить файл:"
+msgstr "Невозможно сохранить файл: "
#: uresourcestrings.rsunknowncommand
msgid "Unknown command : "
-msgstr "Неизвестная команда:"
+msgstr "Неизвестная команда: "
#: uresourcestrings.rsunknownoriginal
msgid "Unknown original"
@@ -3700,15 +3761,19 @@ msgstr "Векторный слой"
#: uresourcestrings.rsversion
msgid "Version"
-msgstr ""
+msgstr "Версия"
#: uresourcestrings.rsverticalsize
msgid "Vertical size"
+msgstr "Вертикальный размер"
+
+#: uresourcestrings.rsvisible
+msgid "Visibile"
msgstr ""
#: uresourcestrings.rsyellow
msgid "Yellow"
-msgstr ""
+msgstr "Жёлтый"
#: uresourcestrings.rsyes
msgid "Yes"
@@ -3717,10 +3782,10 @@ msgstr "Да"
#: uresourcestrings.rszoomlayerstackin
msgctxt "uresourcestrings.rszoomlayerstackin"
msgid "Zoom layer stack in"
-msgstr "Увеличить размер в стопке слоев"
+msgstr "Увеличить размер стопки слоёв"
#: uresourcestrings.rszoomlayerstackout
msgctxt "uresourcestrings.rszoomlayerstackout"
msgid "Zoom layer stack out"
-msgstr "Уменьшить размер в стопке слоев"
+msgstr "Увеличить размер стопки слоёв"
diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po
index 44386751..7f55c625 100644
--- a/lazpaint/release/bin/i18n/lazpaint.sv.po
+++ b/lazpaint/release/bin/i18n/lazpaint.sv.po
@@ -649,6 +649,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "Skifta färger..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "Stil på pennan"
@@ -840,6 +848,14 @@ msgstr "Öppna befintlig fil"
msgid "Print..."
msgstr "Skriva ut..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1922,6 +1938,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "Progressiv flodfyllning"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "Mitten"
@@ -1930,15 +1950,39 @@ msgstr "Mitten"
msgid "Align left"
msgstr "Justera till vänster"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "Justera till höger"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "Välj typsnitt..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1949,11 +1993,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "Phongskuggning för text"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "Textskugga"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2853,6 +2909,10 @@ msgstr "Stäng förfrågan"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "Färgbeskrivning: klicka för att skriva in en färg med tangentbordet genom färgnamn eller CSS-notation."
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3166,6 +3226,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "Ikonstorlek"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "Bild"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "Bilden är för stor"
@@ -3553,6 +3619,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "Använd Högerklick för att välja källa"
@@ -3719,6 +3789,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po
index d212a220..b885d41d 100644
--- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po
+++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po
@@ -652,6 +652,14 @@ msgctxt "tfmain.colorshiftcolors.caption"
msgid "Shift colors..."
msgstr "转移颜色..."
+#: tfmain.combobox_arrowend.hint
+msgid "Ending arrow"
+msgstr ""
+
+#: tfmain.combobox_arrowstart.hint
+msgid "Starting arrow"
+msgstr ""
+
#: tfmain.combobox_penstyle.hint
msgid "Pen style"
msgstr "线型"
@@ -842,6 +850,14 @@ msgstr "打开文件"
msgid "Print..."
msgstr "打印..."
+#: tfmain.filequicksave.caption
+msgid "Quick save"
+msgstr ""
+
+#: tfmain.filequicksave.hint
+msgid "Save current file without dialogs"
+msgstr ""
+
#: tfmain.filequit.hint
msgctxt "TFMAIN.FILEQUIT.HINT"
msgid "Quit"
@@ -1922,6 +1938,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
msgid "Progressive floodfill"
msgstr "渐进式填充"
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
#: tfmain.tool_textaligncenter.hint
msgid "Center"
msgstr "居中"
@@ -1930,15 +1950,39 @@ msgstr "居中"
msgid "Align left"
msgstr "向左对齐"
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
#: tfmain.tool_textalignright.hint
msgid "Align right"
msgstr "向右对齐"
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
+#: tfmain.tool_textbidirectional.hint
+msgid "Bidirectional"
+msgstr ""
+
+#: tfmain.tool_textbold.hint
+msgid "Bold"
+msgstr ""
+
#: tfmain.tool_textfont.hint
msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
msgid "Choose font..."
msgstr "选择字体..."
+#: tfmain.tool_textitalic.hint
+msgid "Italic"
+msgstr ""
+
+#: tfmain.tool_textltr.hint
+msgid "Left to right"
+msgstr ""
+
#: tfmain.tool_textoutline.hint
msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
msgid "Text outline"
@@ -1949,11 +1993,23 @@ msgctxt "TFMAIN.TOOL_TEXTPHONG.HINT"
msgid "Text phong shading"
msgstr "文本高光渲染"
+#: tfmain.tool_textrtl.hint
+msgid "Right to left"
+msgstr ""
+
#: tfmain.tool_textshadow.hint
msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
msgid "Text shadow"
msgstr "文本阴影"
+#: tfmain.tool_textstrikeout.hint
+msgid "Strikeout"
+msgstr ""
+
+#: tfmain.tool_textunderline.hint
+msgid "Underline"
+msgstr ""
+
#: tfmain.viewcolors.caption
msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
msgid "Colors"
@@ -2851,6 +2907,10 @@ msgstr "关闭请求"
msgid "CMD"
msgstr "CMD"
+#: uresourcestrings.rscolordescription
+msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
+msgstr "颜色说明:单击以键入颜色名称或 CSS 表示。"
+
#: uresourcestrings.rscoloroverlay
msgid "Color overlay"
msgstr ""
@@ -3171,6 +3231,12 @@ msgctxt "uresourcestrings.rsiconsize"
msgid "Icon size"
msgstr "图标大小"
+#: uresourcestrings.rsimage
+#, fuzzy
+msgctxt "uresourcestrings.rsimage"
+msgid "Image"
+msgstr "图像"
+
#: uresourcestrings.rsimagetoobig
msgid "Image is too big"
msgstr "图像太大"
@@ -3568,6 +3634,10 @@ msgctxt "uresourcestrings.rsrgb"
msgid "RGB"
msgstr "RGB"
+#: uresourcestrings.rsrightclickfinishshape
+msgid "Use RIGHT click to finish shape"
+msgstr ""
+
#: uresourcestrings.rsrightclickforsource
msgid "Use RIGHT click to define source"
msgstr "单击右键来定义源"
@@ -3735,6 +3805,10 @@ msgstr ""
msgid "Vertical size"
msgstr ""
+#: uresourcestrings.rsvisible
+msgid "Visibile"
+msgstr ""
+
#: uresourcestrings.rsyellow
msgid "Yellow"
msgstr ""
diff --git a/lazpaint/release/bin/i18n/lcresourcestring.ru.po b/lazpaint/release/bin/i18n/lcresourcestring.ru.po
index c1e0074b..1bc2454d 100644
--- a/lazpaint/release/bin/i18n/lcresourcestring.ru.po
+++ b/lazpaint/release/bin/i18n/lcresourcestring.ru.po
@@ -167,5 +167,5 @@ msgstr "Повторить по оси Y"
#: lcresourcestring.rsunknownshapeclass
msgid "Unknown shape class \"%1\""
-msgstr "Неизвестный класс формы "%1""
+msgstr "Неизвестный класс формы \"%1\""
diff --git a/lazpaint/release/debian/debian/changelog b/lazpaint/release/debian/debian/changelog
index ef4463b0..428207b2 100644
--- a/lazpaint/release/debian/debian/changelog
+++ b/lazpaint/release/debian/debian/changelog
@@ -1,3 +1,67 @@
+lazpaint (7.2) stable; urgency=low
+
+ * MacOS: handle right-click on layerstack
+ * MacOS: fixed light theme interface
+ * MacOS: avoid key binding conflict with CMD-H
+ * interface: handle cancel language or icon size change
+ * interface: restore main form after embedded editor
+ * interface: rester selection tool after delete
+ * interface: fix shift-arrows in file list
+ * interface: handle right click on switch color button
+ * interface: remember docked toolbox visibility
+ * interface: center on zoom fit
+ * interface: less margin to select outside of color circle
+ * interface: tooltip on arrow start/end
+ * interface: show hotkey in toolbar
+ * interface: update workspace when resizing/rotating
+ * interface: handle keys in embedded editors
+ * interface: prevent ALT key from opening menu
+ * interface: handle ALT-wheel only when applicable
+ * interface: keep fill options visible when changing opacity
+ * layer stack: tooltip for visible and opacity controls
+ * blend mode: removed horizontal scrollbar in blend mode lists
+ * language: tool shortcuts for Cyrillic keyboard
+ * language: translation of color description
+ * language: completed Russian translation
+ * file: prevent saving incorrect filename
+ * file: handle path in file textbook
+ * file: generate new filename with number
+ * file: added quick save action (Ctlr-Q shortcut)
+ * file: overwrite prompt when saving palette
+ * file: experimental support for AVIF format
+ * file: show save prompt when drag'n'drop image to the program
+ * file: save CUR and ICO with command line
+ * SVG: close path when export as SVG
+ * SVG: fixed RTL text export
+ * new file: better handling of ratios
+ * motion blur: fixed sticky mouse click
+ * canvas size: restrict percent to max accepted size
+ * tools: update shape when pressing/releasing SHIFT key
+ * tools: ignore 0 alpha with solid colors
+ * tools: improved hints timing
+ * tools: disambiguation of shortcut keys (Y, K, F and R)
+ * deformation grid tool: handle extreme deformation
+ * déformation grid tool: ESCAPE to exit tool
+ * layer perspective tool: change cursor when hovering points
+ * layer tools: delete current layer with DELETE key
+ * rectangle tool: fixed bug when changing join type
+ * text tool: update when change antialiasing
+ * text tool: provide text style, bidi mode, vertical alignment in toolbar
+ * text tool: allow travel mode with space
+ * text tool: display flipped text
+ * vector tools: avoid error after rasterizing
+ * polygon/closed curve tools: hide center point when ALT key pressed
+ * polyline/opened curve tool: don't reopen shape
+ * poly tools: added RIGHT-click hint
+ * selection tools: deselect when ESCAPE pressed and selection layer empty
+ * selection tools: keep selection mode after undo/redo
+ * rectangle selection tool: include ratio of current image
+ * selection pen: show circular cursor
+ * filter: added negative angle for twirl
+ * script: ignore some Python errors
+
+ -- circular Sat, 6 Aug 2022 10:38:00 +0100
+
lazpaint (7.1.6) stable; urgency=low
* Debian: various icon sizes for Linux application menu
diff --git a/lazpaint/release/debian/debian/control b/lazpaint/release/debian/debian/control
index 8537d46f..1e1dedf9 100644
--- a/lazpaint/release/debian/debian/control
+++ b/lazpaint/release/debian/debian/control
@@ -5,7 +5,7 @@ Maintainer: circular
Homepage: https://wiki.freepascal.org/LazPaint
Package: lazpaint
Architecture: any
-Version: 7.1.6
+Version: 7.2
Depends: ${shlibs:Depends}
Conflicts: lazpaint-gtk2, lazpaint-gtk3, lazpaint-qt4, lazpaint-qt5
Description: Image editor with raster and vector layers
diff --git a/lazpaint/release/macOS/LazPaint.app/Contents/Info.plist b/lazpaint/release/macOS/LazPaint.app/Contents/Info.plist
index 69580324..d484ba72 100644
--- a/lazpaint/release/macOS/LazPaint.app/Contents/Info.plist
+++ b/lazpaint/release/macOS/LazPaint.app/Contents/Info.plist
@@ -19,9 +19,9 @@
CFBundleSignature
lazp
CFBundleShortVersionString
- 7.1.6
+ 7.2
CFBundleVersion
- 7.1.6
+ 7.2
CSResourcesFileMapped
CFBundleDocumentTypes
diff --git a/lazpaint/release/macOS/makedmg.sh b/lazpaint/release/macOS/makedmg.sh
index 0b3f1998..e244aedc 100755
--- a/lazpaint/release/macOS/makedmg.sh
+++ b/lazpaint/release/macOS/makedmg.sh
@@ -8,7 +8,7 @@ if ! [ ${OSTYPE:0:6} = "darwin" ]; then
fi
appname=LazPaint
-appversion=7.1.6
+appversion=7.2
pkgversion=0
appnamenospaces=lazpaint
appbundle="$appname.app"
diff --git a/lazpaint/release/windows/lazpaint.iss b/lazpaint/release/windows/lazpaint.iss
index 22913bde..a1a0a159 100644
--- a/lazpaint/release/windows/lazpaint.iss
+++ b/lazpaint/release/windows/lazpaint.iss
@@ -1,7 +1,7 @@
#define MyAppName "LazPaint"
#define MyAppOutputName "lazpaint"
#define MyInstallerSuffix "_setup_win32_win64"
-#define MyAppVersion "7.1.6"
+#define MyAppVersion "7.2"
#define MyAppPublisher "Circular, Fabien Wang, Lainz and others"
#define MyAppURL "http://sourceforge.net/projects/lazpaint/"
#define MyAppExeName "lazpaint.exe"
diff --git a/lazpaint/tools/utool.pas b/lazpaint/tools/utool.pas
index 83e9a738..257ba9a6 100644
--- a/lazpaint/tools/utool.pas
+++ b/lazpaint/tools/utool.pas
@@ -165,7 +165,7 @@ TReadonlyTool = class(TGenericTool)
TToolClass = class of TGenericTool;
TToolPopupMessage= (tpmNone, tpmHoldKeyForSquare, tpmHoldKeySnapToPixel,
- tpmReturnValides, tpmBackspaceRemoveLastPoint, tpmHoldKeyRestrictRotation,
+ tpmReturnValides, tpmBackspaceRemoveLastPoint, tpmRightClickFinishShape, tpmHoldKeyRestrictRotation,
tpmHoldKeysScaleMode, tpmCurveModeHint, tpmBlendOpBackground,
tpmRightClickForSource, tpmNothingToBeDeformed);
@@ -199,7 +199,6 @@ TToolManager = class
FToolCurrentCursorPos: TPointF;
FSleepingTool: TGenericTool;
FSleepingToolType: TPaintToolType;
- FReturnValidatesHintShown: boolean;
FOnToolChangedHandler: TOnToolChangedHandler;
FOnToolRenderChanged: TNotifyEvent;
FOnToolbarChanged: TNotifyEvent;
@@ -221,6 +220,8 @@ TToolManager = class
FTextFontSize: single;
FTextFontStyle: TFontStyles;
FTextAlign: TAlignment;
+ FTextVerticalAlign: TTextLayout;
+ FTextBidiMode: TFontBidiMode;
FTextOutline: boolean;
FTextOutlineWidth: single;
FTextPhong: boolean;
@@ -336,6 +337,8 @@ TToolManager = class
function ScriptGetShapeRatio(AVars: TVariableSet): TScriptResult;
function ScriptGetSplineStyle(AVars: TVariableSet): TScriptResult;
function ScriptGetTextAlign(AVars: TVariableSet): TScriptResult;
+ function ScriptGetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+ function ScriptGetTextBidiMode(AVars: TVariableSet): TScriptResult;
function ScriptGetTextOutline(AVars: TVariableSet): TScriptResult;
function ScriptGetTextPhong(AVars: TVariableSet): TScriptResult;
function ScriptGetTolerance(AVars: TVariableSet): TScriptResult;
@@ -397,6 +400,8 @@ TToolManager = class
function ScriptSetShapeRatio(AVars: TVariableSet): TScriptResult;
function ScriptSetSplineStyle(AVars: TVariableSet): TScriptResult;
function ScriptSetTextAlign(AVars: TVariableSet): TScriptResult;
+ function ScriptSetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+ function ScriptSetTextBidiMode(AVars: TVariableSet): TScriptResult;
function ScriptSetTextOutline(AVars: TVariableSet): TScriptResult;
function ScriptSetTextPhong(AVars: TVariableSet): TScriptResult;
function ScriptSetTolerance(AVars: TVariableSet): TScriptResult;
@@ -428,6 +433,9 @@ TToolManager = class
procedure SetShapeRatio(AValue: Single);
procedure SetSplineStyle(AValue: TSplineStyle);
procedure SetTextAlign(AValue: TAlignment);
+ procedure SetTextVerticalAlign(AValue: TTextLayout);
+ procedure SetTextBidiMode(AValue: TFontBidiMode);
+ procedure SetTextFontStyle(AValue: TFontStyles);
procedure SetTextPhong(AValue: boolean);
procedure SetTextShadow(AValue: boolean);
procedure SetTextShadowBlurRadius(AValue: single);
@@ -450,6 +458,7 @@ TToolManager = class
PerspectiveControls,FillControls,OutlineFillControls,
BrushControls, RatioControls, DonateControls: TList;
CanvasScale: integer;
+ PenWidthVisible: boolean;
constructor Create(AImage: TLazPaintImage; AConfigProvider: IConfigProvider;
ABitmapToVirtualScreen: TBitmapToVirtualScreenFunction = nil;
@@ -490,7 +499,6 @@ TToolManager = class
function ToolUpdate: boolean;
function ToolUpdateNeeded: boolean;
procedure ToolPopup(AMessage: TToolPopupMessage; AKey: Word = 0; AAlways: boolean = false);
- procedure HintReturnValidates;
function IsSelectingTool: boolean;
function DisplayFilledSelection: boolean;
@@ -551,8 +559,10 @@ TToolManager = class
property BrushSpacing: integer read FBrushSpacing write SetBrushSpacing;
property TextFontName: string read GetTextFontName;
property TextFontSize: single read GetTextFontSize;
- property TextFontStyle: TFontStyles read GetTextFontStyle;
+ property TextFontStyle: TFontStyles read GetTextFontStyle write SetTextFontStyle;
property TextAlign: TAlignment read FTextAlign write SetTextAlign;
+ property TextVerticalAlign: TTextLayout read FTextVerticalAlign write SetTextVerticalAlign;
+ property TextBidiMode: TFontBidiMode read FTextBidiMode write SetTextBidiMode;
property TextOutline: boolean read FTextOutline;
property TextOutlineWidth: single read FTextOutlineWidth;
property TextPhong: boolean read FTextPhong write SetTextPhong;
@@ -748,6 +758,7 @@ function ToolPopupMessageToStr(AMessage: TToolPopupMessage; AKey: Word = 0): str
tpmHoldKeySnapToPixel: result := ReplaceKey(rsHoldKeySnapToPixel, AKey);
tpmReturnValides: result := rsReturnValides;
tpmBackspaceRemoveLastPoint: result := rsBackspaceRemoveLastPoint;
+ tpmRightClickFinishShape: result := rsRightClickFinishShape;
tpmHoldKeyRestrictRotation: result := ReplaceKey(rsHoldKeyRestrictRotation, AKey);
tpmHoldKeysScaleMode: result := ReplaceKey(ReplaceKey(rsHoldKeysScaleMode, AKey, 2), VK_MENU);
tpmCurveModeHint: result := rsCurveModeHint;
@@ -779,15 +790,6 @@ function TReadonlyTool.DoGetToolDrawingLayer: TBGRABitmap;
Result:= Manager.Image.SelectionLayerReadonly;
end;
-procedure TToolManager.HintReturnValidates;
-begin
- if not FReturnValidatesHintShown then
- begin
- ToolPopup(tpmReturnValides);
- FReturnValidatesHintShown:= true;
- end;
-end;
-
{ TGenericTool }
{$hints off}
@@ -1507,6 +1509,30 @@ procedure TToolManager.SetTextAlign(AValue: TAlignment);
if Assigned(FOnTextAlignChanged) then FOnTextAlignChanged(self);
end;
+procedure TToolManager.SetTextVerticalAlign(AValue: TTextLayout);
+begin
+ if FTextVerticalAlign=AValue then Exit;
+ FTextVerticalAlign:=AValue;
+ ToolUpdate;
+ if Assigned(FOnTextAlignChanged) then FOnTextAlignChanged(self);
+end;
+
+procedure TToolManager.SetTextBidiMode(AValue: TFontBidiMode);
+begin
+ if FTextBidiMode=AValue then Exit;
+ FTextBidiMode:=AValue;
+ ToolUpdate;
+ if Assigned(FOnTextAlignChanged) then FOnTextAlignChanged(self);
+end;
+
+procedure TToolManager.SetTextFontStyle(AValue: TFontStyles);
+begin
+ if FTextFontStyle=AValue then Exit;
+ FTextFontStyle:=AValue;
+ ToolUpdate;
+ if Assigned(FOnTextFontChanged) then FOnTextFontChanged(self);
+end;
+
procedure TToolManager.SetTextPhong(AValue: boolean);
begin
if FTextPhong=AValue then Exit;
@@ -2173,6 +2199,28 @@ function TToolManager.ScriptGetTextAlign(AVars: TVariableSet): TScriptResult;
result := srOk;
end;
+function TToolManager.ScriptGetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+begin
+ case TextVerticalAlign of
+ tlTop: AVars.Strings['Result'] := 'Top';
+ tlCenter: AVars.Strings['Result'] := 'Middle';
+ tlBottom: AVars.Strings['Result'] := 'Bottom';
+ else exit(srException);
+ end;
+ result := srOk;
+end;
+
+function TToolManager.ScriptGetTextBidiMode(AVars: TVariableSet): TScriptResult;
+begin
+ case TextBidiMode of
+ fbmAuto: AVars.Strings['Result'] := 'BidiAuto';
+ fbmLeftToRight: AVars.Strings['Result'] := 'LeftToRight';
+ fbmRightToLeft: AVars.Strings['Result'] := 'RightToLeft';
+ else exit(srException);
+ end;
+ result := srOk;
+end;
+
function TToolManager.ScriptGetTextOutline(AVars: TVariableSet): TScriptResult;
begin
if TextOutline then
@@ -2780,6 +2828,28 @@ function TToolManager.ScriptSetTextAlign(AVars: TVariableSet): TScriptResult;
result := srOk;
end;
+function TToolManager.ScriptSetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+begin
+ case AVars.Strings['Align'] of
+ 'Top': TextVerticalAlign:= tlTop;
+ 'Middle': TextVerticalAlign:= tlCenter;
+ 'Bottom': TextVerticalAlign:= tlBottom;
+ else exit(srInvalidParameters);
+ end;
+ result := srOk;
+end;
+
+function TToolManager.ScriptSetTextBidiMode(AVars: TVariableSet): TScriptResult;
+begin
+ case AVars.Strings['BidiMode'] of
+ 'BidiAuto': TextBidiMode:= fbmAuto;
+ 'LeftToRight': TextBidiMode:= fbmLeftToRight;
+ 'RightToLeft': TextBidiMode:= fbmRightToLeft;
+ else exit(srInvalidParameters);
+ end;
+ result := srOk;
+end;
+
function TToolManager.ScriptSetTextOutline(AVars: TVariableSet): TScriptResult;
begin
if AVars.IsDefined('Width') and (AVars.Floats['Width'] > 0) then
@@ -2830,6 +2900,7 @@ constructor TToolManager.Create(AImage: TLazPaintImage; AConfigProvider: IConfig
begin
FImage:= AImage;
CanvasScale := 1;
+ PenWidthVisible := false;
BitmapToVirtualScreen := ABitmapToVirtualScreen;
FShouldExitTool:= false;
FConfigProvider := AConfigProvider;
@@ -2881,6 +2952,8 @@ constructor TToolManager.Create(AImage: TLazPaintImage; AConfigProvider: IConfig
FTextFontName := TTextShape.DefaultFontName;
FTextFontStyle:= [];
FTextAlign := taLeftJustify;
+ FTextVerticalAlign := tlTop;
+ FTextBidiMode := fbmAuto;
FTextPhong := False;
FTextShadowBlurRadius := 4;
FTextShadowOffset := Point(5,5);
@@ -3198,7 +3271,8 @@ function TToolManager.UpdateContextualToolbars: boolean;
OrResult(SetControlsVisible(BrushControls, ctBrush in contextualToolbars));
OrResult(SetControlsVisible(ShapeControls, ctShape in contextualToolbars));
- OrResult(SetControlsVisible(PenWidthControls, (ctPenWidth in contextualToolbars) and hasPen));
+ PenWidthVisible := (ctPenWidth in contextualToolbars) and hasPen;
+ OrResult(SetControlsVisible(PenWidthControls, PenWidthVisible));
OrResult(SetControlsVisible(JoinStyleControls, (ctJoinStyle in contextualToolbars) and hasPen));
OrResult(SetControlsVisible(PenStyleControls, (ctPenStyle in contextualToolbars) and hasPen));
OrResult(SetControlsVisible(CloseShapeControls, ctCloseShape in contextualToolbars));
@@ -3292,6 +3366,10 @@ procedure TToolManager.RegisterScriptFunctions(ARegister: boolean);
FScriptContext.RegisterScriptFunction('ToolGetFontStyle', @ScriptGetFontStyle, ARegister);
FScriptContext.RegisterScriptFunction('ToolSetTextAlign', @ScriptSetTextAlign, ARegister);
FScriptContext.RegisterScriptFunction('ToolGetTextAlign', @ScriptGetTextAlign, ARegister);
+ FScriptContext.RegisterScriptFunction('ToolSetTextVerticalAlign', @ScriptSetTextVerticalAlign, ARegister);
+ FScriptContext.RegisterScriptFunction('ToolGetTextVerticalAlign', @ScriptGetTextVerticalAlign, ARegister);
+ FScriptContext.RegisterScriptFunction('ToolSetTextBidiMode', @ScriptSetTextBidiMode, ARegister);
+ FScriptContext.RegisterScriptFunction('ToolGetTextBidiMode', @ScriptGetTextBidiMode, ARegister);
FScriptContext.RegisterScriptFunction('ToolSetTextOutline', @ScriptSetTextOutline, ARegister);
FScriptContext.RegisterScriptFunction('ToolGetTextOutline', @ScriptGetTextOutline, ARegister);
FScriptContext.RegisterScriptFunction('ToolSetTextPhong', @ScriptSetTextPhong, ARegister);
diff --git a/lazpaint/tools/utoolbasic.pas b/lazpaint/tools/utoolbasic.pas
index 6c15cbf7..c6ba2484 100644
--- a/lazpaint/tools/utoolbasic.pas
+++ b/lazpaint/tools/utoolbasic.pas
@@ -46,7 +46,7 @@ TToolColorPicker = class(TReadonlyTool)
TToolPen = class(TGenericTool)
protected
- class var HintShowed: boolean;
+ class var HintShown: boolean;
penDrawing, penDrawingRight: boolean;
shiftClicking, shiftClickingRight: boolean;
penOrigin: TPointF;
@@ -59,6 +59,7 @@ TToolPen = class(TGenericTool)
function DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect; override;
function DoToolShiftClick(toolDest: TBGRABitmap; ptF: TPointF; rightBtn: boolean): TRect; virtual;
public
+ class procedure ForgetHintShown;
function ToolUp: TRect; override;
function GetContextualToolbars: TContextualToolbars; override;
destructor Destroy; override;
@@ -369,10 +370,10 @@ function TToolPen.DoToolDown(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF;
function TToolPen.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect;
begin
- if (manager.PenWidth <= 3) and not HintShowed then
+ if (manager.PenWidth <= 3) and not HintShown then
begin
Manager.ToolPopup(tpmHoldKeySnapToPixel, VK_CONTROL);
- HintShowed:= true;
+ HintShown:= true;
end;
if ssSnap in ShiftState then ptF := PointF(pt.X,pt.Y);
result := EmptyRect;
@@ -397,6 +398,11 @@ function TToolPen.DoToolShiftClick(toolDest: TBGRABitmap; ptF: TPointF;
result := EmptyRect;
end;
+class procedure TToolPen.ForgetHintShown;
+begin
+ HintShown:= false;
+end;
+
function TToolPen.ToolUp: TRect;
begin
if penDrawing then
diff --git a/lazpaint/tools/utoolbrush.pas b/lazpaint/tools/utoolbrush.pas
index 36e8867b..2705c041 100644
--- a/lazpaint/tools/utoolbrush.pas
+++ b/lazpaint/tools/utoolbrush.pas
@@ -54,6 +54,7 @@ TToolBrush = class(TToolGenericBrush)
TToolClone = class(TToolGenericBrush)
protected
+ class var RightClickHintShown: boolean;
definingSource: boolean;
class var sourceLayerId: integer;
class var sourcePosition: TPoint;
@@ -67,6 +68,7 @@ TToolClone = class(TToolGenericBrush)
function DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF): TRect; override;
function DoToolShiftClick({%H-}toolDest: TBGRABitmap; {%H-}ptF: TPointF; {%H-}rightBtn: boolean): TRect; override;
public
+ class procedure ForgetHintShown;
function SubPixelAccuracy: boolean; override;
constructor Create(AManager: TToolManager); override;
destructor Destroy; override;
@@ -162,7 +164,11 @@ procedure TToolClone.ReleaseBrush;
function TToolClone.DoToolMove(toolDest: TBGRABitmap; pt: TPoint; ptF: TPointF
): TRect;
begin
- Manager.ToolPopup(tpmRightClickForSource);
+ if not RightClickHintShown then
+ begin
+ Manager.ToolPopup(tpmRightClickForSource);
+ RightClickHintShown := true;
+ end;
Result:=inherited DoToolMove(toolDest, pt, ptF);
end;
@@ -172,6 +178,11 @@ function TToolClone.DoToolShiftClick(toolDest: TBGRABitmap; ptF: TPointF;
Result:= EmptyRect;
end;
+class procedure TToolClone.ForgetHintShown;
+begin
+ RightClickHintShown:= false;
+end;
+
function TToolClone.SubPixelAccuracy: boolean;
begin
Result:=false;
diff --git a/lazpaint/tools/utooldeformationgrid.pas b/lazpaint/tools/utooldeformationgrid.pas
index 36b4bcc1..83283c4c 100644
--- a/lazpaint/tools/utooldeformationgrid.pas
+++ b/lazpaint/tools/utooldeformationgrid.pas
@@ -20,6 +20,7 @@ TToolDeformationGrid = class(TGenericTool)
function ToolDeformationGridNeeded: boolean;
procedure ValidateDeformationGrid;
protected
+ class var ReturnHintShown: boolean;
deformationGridNbX,deformationGridNbY,deformationGridX,deformationGridY: integer;
deformationGridMoving: boolean;
deformationOrigin: TPointF;
@@ -35,6 +36,7 @@ TToolDeformationGrid = class(TGenericTool)
function GetIsSelectingTool: boolean; override;
function DoToolUpdate({%H-}toolDest: TBGRABitmap): TRect; override;
public
+ class procedure ForgetHintShown;
constructor Create(AManager: TToolManager); override;
function ToolUp: TRect; override;
function GetContextualToolbars: TContextualToolbars; override;
@@ -48,7 +50,7 @@ TToolDeformationGrid = class(TGenericTool)
TToolTextureMapping = class(TGenericTool)
private
- class var FHintShowed: boolean;
+ class var ScaleHintShown, ReturnHintShown: boolean;
FCurrentBounds: TRect;
FLastTexture: TBGRABitmap;
FTextureAfterAlpha: TBGRABitmap;
@@ -70,7 +72,8 @@ TToolTextureMapping = class(TGenericTool)
quadMovingIndex: integer;
quadMoving,quadMovingBounds: boolean;
quadMovingDelta: TPointF;
- function SnapIfNecessary(ptF: TPointF): TPointF;
+ function SnapIfNecessary(const ptF: TPointF): TPointF;
+ function GetClosestPoint(const ptF: TPointF; out pointFound: TPointF): integer;
function DoToolDown({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; ptF: TPointF;
{%H-}rightBtn: boolean): TRect; override;
function DoToolMove({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; ptF: TPointF): TRect;
@@ -88,6 +91,7 @@ TToolTextureMapping = class(TGenericTool)
function GetStatusText: string; override;
function GetAllowedBackFillTypes: TVectorialFillTypes; override;
public
+ class procedure ForgetHintShown;
constructor Create(AManager: TToolManager); override;
function ToolUp: TRect; override;
function GetContextualToolbars: TContextualToolbars; override;
@@ -169,7 +173,9 @@ function TToolLayerMapping.DefaultTextureCenter: TPointF;
function TToolLayerMapping.GetTextureRepetition: TTextureRepetition;
begin
if poRepeat in Manager.PerspectiveOptions then
- Result:= trRepeatBoth;
+ Result:= trRepeatBoth
+ else
+ result:= trNone;
end;
procedure TToolLayerMapping.ValidateQuad;
@@ -409,18 +415,42 @@ procedure TToolTextureMapping.UpdateBoundsMode(var ARectResult: TRect);
end;
end;
-function TToolTextureMapping.SnapIfNecessary(ptF: TPointF): TPointF;
+function TToolTextureMapping.SnapIfNecessary(const ptF: TPointF): TPointF;
begin
if not (ssSnap in ShiftState) then result := ptF else
result := PointF(round(ptF.X),round(ptF.Y));
end;
+function TToolTextureMapping.GetClosestPoint(const ptF: TPointF; out pointFound: TPointF): integer;
+var
+ minDist, curDist: single;
+ pts: array of TPointF;
+ n: Integer;
+begin
+ if boundsMode then
+ pts := boundsPts
+ else
+ pts := quad;
+ result := -1;
+ pointFound := EmptyPointF;
+ minDist := sqr(DoScaleX(10,OriginalDPI));
+ for n := 0 to high(pts) do
+ begin
+ curDist := sqr(ptF.x-pts[n].x)+sqr(ptF.y-pts[n].y);
+ if curDist < minDist then
+ begin
+ minDist := curDist;
+ result := n;
+ pointFound := pts[n];
+ end;
+ end;
+end;
+
function TToolTextureMapping.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
ptF: TPointF; rightBtn: boolean): TRect;
var
n: Integer;
- curDist,minDist: single;
- pts: array of TPointF;
+ selPt: TPointF;
begin
result := EmptyRect;
if rightBtn then exit;
@@ -445,26 +475,16 @@ function TToolTextureMapping.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
end;
UpdateBoundsMode(result);
- if boundsMode then
- pts := boundsPts
- else
- pts := quad;
- minDist := sqr(DoScaleX(10,OriginalDPI));
- for n := 0 to high(pts) do
+ n := GetClosestPoint(ptF, selPt);
+ if n <> -1 then
begin
- curDist := sqr(ptF.x-pts[n].x)+sqr(ptF.y-pts[n].y);
- if curDist < minDist then
- begin
- minDist := curDist;
- quadMovingIndex := n;
- quadMovingDelta := pts[n]-PtF;
- quadMoving := True;
- quadMovingBounds := boundsMode;
- end;
- end;
-
- if not quadMoving and IsPointInPolygon(pts, ptF, true) then
+ quadMovingIndex := n;
+ quadMovingDelta := selPt-PtF;
+ quadMoving := True;
+ quadMovingBounds := boundsMode;
+ end else
+ if IsPointInPolygon(quad, ptF, true) then
begin
quadMovingIndex := -1;
quadMovingDelta := (quad[0]+quad[2])*0.5-ptF;
@@ -482,7 +502,7 @@ function NonZero(AValue, ADefault: single): single;
function TToolTextureMapping.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
ptF: TPointF): TRect;
var n: integer;
- delta,prevSize,newSize: TPointF;
+ delta,prevSize,newSize,selPt: TPointF;
curBounds: array of TPointF;
ratioX,ratioY,ratio: single;
avgSize: single;
@@ -493,12 +513,13 @@ function TToolTextureMapping.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
begin
if (GetTexture <> nil) and (GetTexture.Height <> 0)
and (GetTexture.Width <> 0) then
+ begin
ratio := GetTexture.Width/GetTexture.Height;
-
- newSize := ptF - quad[0];
- avgSize := (abs(newSize.x)+abs(newSize.y))/2;
- ptF.x := quad[0].x+avgSize*NonZero(sign(newSize.x),1)*ratio/((ratio+1)/2);
- ptF.y := quad[0].y+avgSize*NonZero(sign(newSize.y),1)*1/((ratio+1)/2);
+ newSize := ptF - quad[0];
+ avgSize := (abs(newSize.x)+abs(newSize.y))/2;
+ ptF.x := quad[0].x+avgSize*NonZero(sign(newSize.x),1)*ratio/((ratio+1)/2);
+ ptF.y := quad[0].y+avgSize*NonZero(sign(newSize.y),1)*1/((ratio+1)/2);
+ end;
end;
quad[2] := ptF;
quad[1].x := ptF.x;
@@ -508,12 +529,11 @@ function TToolTextureMapping.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
end;
result := EmptyRect;
- if not FHintShowed then
+ if not ScaleHintShown then
begin
Manager.ToolPopup(tpmHoldKeysScaleMode, VK_SHIFT);
- FHintShowed:= true;
+ ScaleHintShown:= true;
end;
- Manager.HintReturnValidates;
if quadMoving then
begin
if quadMovingIndex = -1 then
@@ -591,6 +611,13 @@ function TToolTextureMapping.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
result := FCurrentBounds;
end;
UpdateBoundsMode(result);
+ if not quadMoving then
+ begin
+ if GetClosestPoint(ptF, selPt) <> -1 then
+ Cursor := crSizeAll
+ else
+ Cursor := crDefault;
+ end;
end;
function TToolTextureMapping.GetIsSelectingTool: boolean;
@@ -699,6 +726,12 @@ function TToolTextureMapping.GetAllowedBackFillTypes: TVectorialFillTypes;
Result:= [vftTexture];
end;
+class procedure TToolTextureMapping.ForgetHintShown;
+begin
+ ScaleHintShown:= false;
+ ReturnHintShown:= false;
+end;
+
constructor TToolTextureMapping.Create(AManager: TToolManager);
begin
inherited Create(AManager);
@@ -758,6 +791,11 @@ function TToolTextureMapping.ToolUp: TRect;
DrawQuad;
FCanReadaptTexture:= false;
result := FCurrentBounds;
+ if not ReturnHintShown then
+ begin
+ Manager.ToolPopup(tpmreturnValides);
+ ReturnHintShown:= true;
+ end;
exit;
end;
if quadMoving then
@@ -1009,7 +1047,6 @@ function TToolDeformationGrid.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
begin
result := EmptyRect;
- Manager.HintReturnValidates;
if not deformationGridMoving then
begin
@@ -1090,6 +1127,32 @@ function TToolDeformationGrid.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]],backupLayer,dmDrawWithTransparency);
gridDone[yb,xb] := true;
end;
+ //drawing zones that are inverted
+ for yb := gridMinY to gridMaxY-1 do
+ for xb := gridMinX to gridMaxX-1 do
+ if not gridDone[yb,xb] and
+ not IsMostlyClockwise([DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+ DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]]) then
+ begin
+ layer.FillQuadLinearMapping(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+ DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb],backupLayer,
+ DeformationGridTexCoord[yb,xb],DeformationGridTexCoord[yb,xb+1],DeformationGridTexCoord[yb+1,xb+1],
+ DeformationGridTexCoord[yb+1,xb],true, fcKeepCW);
+ gridDone[yb,xb] := true;
+ end;
+ //drawing zones that are intersecting
+ for yb := gridMinY to gridMaxY-1 do
+ for xb := gridMinX to gridMaxX-1 do
+ if not gridDone[yb,xb] and
+ DoesQuadIntersect(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+ DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]) then
+ begin
+ layer.FillQuadLinearMapping(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+ DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb],backupLayer,
+ DeformationGridTexCoord[yb,xb],DeformationGridTexCoord[yb,xb+1],DeformationGridTexCoord[yb+1,xb+1],
+ DeformationGridTexCoord[yb+1,xb],true, fcKeepCW);
+ gridDone[yb,xb] := true;
+ end;
//drawing zones that are concave
for yb := gridMinY to gridMaxY-1 do
for xb := gridMinX to gridMaxX-1 do
@@ -1141,12 +1204,19 @@ function TToolDeformationGrid.DoToolUpdate(toolDest: TBGRABitmap): TRect;
result := EmptyRect;
end;
+class procedure TToolDeformationGrid.ForgetHintShown;
+begin
+ ReturnHintShown := false;
+end;
+
constructor TToolDeformationGrid.Create(AManager: TToolManager);
begin
inherited Create(AManager);
deformationGridNbX:= 0;
deformationGridNbY:= 0;
DoingDeformation:= false;
+ deformationGrid := nil;
+ deformationGridTexCoord := nil;
end;
function TToolDeformationGrid.Render(VirtualScreen: TBGRABitmap;
@@ -1215,19 +1285,24 @@ function TToolDeformationGrid.DoToolKeyDown(var key: Word): TRect;
if Key = VK_ESCAPE then
begin
if DoingDeformation then
- begin
CancelActionPartially;
- result := OnlyRenderChange;
- manager.QueryExitTool;
- Key := 0;
- end;
+ result := OnlyRenderChange;
+ manager.QueryExitTool;
+ Key := 0;
end;
end;
function TToolDeformationGrid.ToolUp: TRect;
begin
if deformationGridMoving then
- result := OnlyRenderChange
+ begin
+ result := OnlyRenderChange;
+ if not ReturnHintShown then
+ begin
+ Manager.ToolPopup(tpmreturnValides);
+ ReturnHintShown := true;
+ end;
+ end
else
Result:=EmptyRect;
deformationGridMoving := false;
diff --git a/lazpaint/tools/utoolpolygon.pas b/lazpaint/tools/utoolpolygon.pas
index b71bd3ef..fefd6666 100644
--- a/lazpaint/tools/utoolpolygon.pas
+++ b/lazpaint/tools/utoolpolygon.pas
@@ -32,17 +32,21 @@ TToolEllipse = class(TVectorialTool)
TToolPolygon = class(TVectorialTool)
protected
+ class var RightClickHintShown: boolean;
+ class var RemovePointHintShown: boolean;
initiallyClosed : boolean;
function ShapeClass: TVectorShapeAny; override;
function CreateShape: TVectorShape; override;
function ShouldCloseShape: boolean; virtual;
procedure UpdateManagerCloseShape({%H-}AClose: boolean); virtual;
+ procedure AssignShapeStyleClosed(AShape: TVectorShape); virtual;
procedure AssignShapeStyle(AMatrix: TAffineMatrix; AAlwaysFit: boolean); override;
procedure UpdateUserMode; virtual;
procedure ShapeValidated; override;
function DoToolKeyDown(var key: Word): TRect; override;
function RoundCoordinate(constref ptF: TPointF): TPointF; override;
public
+ class procedure ForgetHintShown;
function ToolUp: TRect; override;
function ToolKeyPress(var key: TUTF8Char): TRect; override;
end;
@@ -51,7 +55,9 @@ TToolPolygon = class(TVectorialTool)
TToolPolyline = class(TToolPolygon)
protected
+ function CreateShape: TVectorShape; override;
function ShouldCloseShape: boolean; override;
+ procedure AssignShapeStyleClosed(AShape: TVectorShape); override;
procedure UpdateManagerCloseShape({%H-}AClose: boolean); override;
function GetManagerShapeOptions: TShapeOptions; override;
function HasBrush: boolean; override;
@@ -131,11 +137,22 @@ function TToolOpenedCurve.GetContextualToolbars: TContextualToolbars;
{ TToolPolyline }
+function TToolPolyline.CreateShape: TVectorShape;
+begin
+ Result:=inherited CreateShape;
+ inherited AssignShapeStyleClosed(Result);
+end;
+
function TToolPolyline.ShouldCloseShape: boolean;
begin
result := false;
end;
+procedure TToolPolyline.AssignShapeStyleClosed(AShape: TVectorShape);
+begin
+ //nothing
+end;
+
procedure TToolPolyline.UpdateManagerCloseShape(AClose: boolean);
begin
//nothing
@@ -271,6 +288,11 @@ function TToolPolygon.CreateShape: TVectorShape;
begin
result := inherited CreateShape;
initiallyClosed := ShouldCloseShape;
+ if not RightClickHintShown then
+ begin
+ Manager.ToolPopup(tpmRightClickFinishShape);
+ RightClickHintShown := true;
+ end;
end;
function TToolPolygon.ShouldCloseShape: boolean;
@@ -290,10 +312,15 @@ procedure TToolPolygon.UpdateManagerCloseShape(AClose: boolean);
Manager.ShapeOptions:= opt;
end;
+procedure TToolPolygon.AssignShapeStyleClosed(AShape: TVectorShape);
+begin
+ (AShape as TCustomPolypointShape).Closed := ShouldCloseShape;
+end;
+
procedure TToolPolygon.AssignShapeStyle(AMatrix: TAffineMatrix; AAlwaysFit: boolean);
begin
inherited AssignShapeStyle(AMatrix, AAlwaysFit);
- TCustomPolypointShape(FShape).Closed := ShouldCloseShape;
+ AssignShapeStyleClosed(TCustomPolypointShape(FShape));
TCustomPolypointShape(FShape).ArrowStartKind := Manager.ArrowStart;
TCustomPolypointShape(FShape).ArrowEndKind := Manager.ArrowEnd;
TCustomPolypointShape(FShape).ArrowSize := Manager.ArrowSize;
@@ -317,7 +344,14 @@ function TToolPolygon.ToolUp: TRect;
begin
Result:=inherited ToolUp;
if Assigned(FShape) then
+ begin
UpdateManagerCloseShape((FShape as TCustomPolypointShape).Closed);
+ if not RemovePointHintShown and ((FShape as TCustomPolypointShape).ValidatedPointCount >= 3) then
+ begin
+ Manager.ToolPopup(tpmBackspaceRemoveLastPoint);
+ RemovePointHintShown := true;
+ end;
+ end;
end;
function TToolPolygon.ToolKeyPress(var key: TUTF8Char): TRect;
@@ -357,6 +391,12 @@ function TToolPolygon.RoundCoordinate(constref ptF: TPointF): TPointF;
result := ptF;
end;
+class procedure TToolPolygon.ForgetHintShown;
+begin
+ RemovePointHintShown := false;
+ RemovePointHintShown := false;
+end;
+
initialization
RegisterTool(ptRect,TToolRectangle);
diff --git a/lazpaint/tools/utoolselect.pas b/lazpaint/tools/utoolselect.pas
index 1ce081dc..b35569bb 100644
--- a/lazpaint/tools/utoolselect.pas
+++ b/lazpaint/tools/utoolselect.pas
@@ -118,7 +118,7 @@ TToolMoveSelection = class(TTransformSelectionTool)
TToolRotateSelection = class(TTransformSelectionTool)
protected
- class var HintShowed: boolean;
+ class var HintShown: boolean;
FHandRotating, FHandTranslating: boolean;
FHandOrigin: TPointF;
FSnapMode: boolean;
@@ -135,6 +135,7 @@ TToolRotateSelection = class(TTransformSelectionTool)
function GetStatusText: string; override;
procedure UpdateTransform;
public
+ class procedure ForgetHintShown;
constructor Create(AManager: TToolManager); override;
function ToolUp: TRect; override;
function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
@@ -421,10 +422,10 @@ function TToolRotateSelection.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
var angleDiff: single;
finalCenter, newOfs: TPointF;
begin
- if not HintShowed then
+ if not HintShown then
begin
Manager.ToolPopup(tpmHoldKeyRestrictRotation, VK_CONTROL);
- HintShowed:= true;
+ HintShown:= true;
end;
if FHandRotating and ((FHandOrigin.X <> ptF.X) or (FHandOrigin.Y <> ptF.Y)) then
begin
@@ -480,6 +481,11 @@ procedure TToolRotateSelection.UpdateTransform;
FOriginalTransform;
end;
+class procedure TToolRotateSelection.ForgetHintShown;
+begin
+ HintShown:= false;
+end;
+
constructor TToolRotateSelection.Create(AManager: TToolManager);
begin
inherited Create(AManager);
diff --git a/lazpaint/tools/utooltext.pas b/lazpaint/tools/utooltext.pas
index 4d1ce3f9..3502d79c 100644
--- a/lazpaint/tools/utooltext.pas
+++ b/lazpaint/tools/utooltext.pas
@@ -20,6 +20,7 @@ TToolText = class(TVectorialTool)
FPrevShadowOffset: TPoint;
FPrevShadowRadius: single;
function ShapeClass: TVectorShapeAny; override;
+ function CreateShape: TVectorShape; override;
function AlwaysRasterizeShape: boolean; override;
procedure IncludeShadowBounds(var ARect: TRect);
function GetCustomShapeBounds(ADestBounds: TRect; AMatrix: TAffineMatrix; ADraft: boolean): TRect; override;
@@ -49,6 +50,13 @@ function TToolText.ShapeClass: TVectorShapeAny;
result := TTextShape;
end;
+function TToolText.CreateShape: TVectorShape;
+begin
+ Result:=inherited CreateShape;
+ if result is TTextShape then
+ (result as TTextShape).FontBidiMode:= Manager.TextBidiMode
+end;
+
function TToolText.AlwaysRasterizeShape: boolean;
begin
Result:= Manager.TextShadow;
@@ -138,7 +146,12 @@ procedure TToolText.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVecto
procedure TToolText.ShapeEditingChange(ASender: TObject);
begin
with (FShape as TTextShape) do
+ begin
+ Manager.TextFontStyle := FontStyle;
+ Manager.TextBidiMode := FontBidiMode;
Manager.TextAlign := ParagraphAlignment;
+ Manager.TextVerticalAlign := VerticalAlignment;
+ end;
inherited ShapeEditingChange(ASender);
end;
@@ -159,7 +172,14 @@ procedure TToolText.AssignShapeStyle(AMatrix: TAffineMatrix; AAlwaysFit: boolean
Aliased := Manager.ShapeOptionAliasing;
LightPosition := AMatrix*Manager.LightPosition;
AltitudePercent:= Manager.PhongShapeAltitude;
- ParagraphAlignment:= Manager.TextAlign;
+ if FontBidiMode <> Manager.TextBidiMode then
+ begin
+ FontBidiMode:= Manager.TextBidiMode;
+ Manager.TextAlign := ParagraphAlignment; // alignment depend on bidi mode
+ end
+ else
+ ParagraphAlignment:= Manager.TextAlign;
+ VerticalAlignment := Manager.TextVerticalAlign;
PenPhong := Manager.TextPhong;
end;
if (Manager.TextShadow <> FPrevShadow) or
@@ -199,12 +219,15 @@ function TToolText.DoToolKeyDown(var key: Word): TRect;
var
keyUtf8: TUTF8Char;
handled: Boolean;
+ alignBefore: TAlignment;
begin
+ if FShape is TTextShape then
+ alignBefore := (FShape as TTextShape).ParagraphAlignment;
if Key = VK_SPACE then
begin
keyUtf8:= ' ';
result := ToolKeyPress(keyUtf8);
- Key := 0;
+ if keyUtf8 <> ' ' then Key := 0;
end else
if (Key = VK_ESCAPE) and Assigned(FShape) then
begin
@@ -222,6 +245,8 @@ function TToolText.DoToolKeyDown(var key: Word): TRect;
Key := 0;
end else
Result:=inherited DoToolKeyDown(key);
+ if (FShape is TTextShape) and (alignBefore <> (FShape as TTextShape).ParagraphAlignment) then
+ Manager.TextAlign := (FShape as TTextShape).ParagraphAlignment;
end;
function TToolText.ToolCommand(ACommand: TToolCommand): boolean;
diff --git a/lazpaint/tools/utoolvectorial.pas b/lazpaint/tools/utoolvectorial.pas
index 3a007e3a..4f8c6f95 100644
--- a/lazpaint/tools/utoolvectorial.pas
+++ b/lazpaint/tools/utoolvectorial.pas
@@ -28,13 +28,14 @@ TVectorialTool = class(TGenericTool)
function GetIsHandDrawing: boolean;
function GetIsIdle: boolean;
protected
+ class var SquareHintShown: boolean;
FLayerWasEmpty: boolean;
FShape: TVectorShape;
FTemporaryStorage: TBGRACustomOriginalStorage;
FLastDraftUpdate: Boolean;
FSwapColor: boolean;
FQuickDefine: Boolean;
- FQuickDefineStartPoint, FQuickDefineEndPoint: TPointF;
+ FQuickDefineStartPoint, FQuickDefineUserEndPoint, FQuickDefineEndPoint: TPointF;
FPreviousUpdateBounds, FPreviousEditorBounds: TRect;
FEditor: TBGRAOriginalEditor;
FRightDown, FLeftDown: boolean;
@@ -59,6 +60,7 @@ TVectorialTool = class(TGenericTool)
function VectorTransform(APixelCentered: boolean): TAffineMatrix;
procedure UpdateCursor(ACursor: TOriginalEditorCursor);
function FixLayerOffset: boolean; override;
+ function UpdateQuickDefine: TRect;
function DoToolDown({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; {%H-}ptF: TPointF; rightBtn: boolean): TRect; override;
function DoToolMove({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; {%H-}ptF: TPointF): TRect; override;
function DoToolUpdate({%H-}toolDest: TBGRABitmap): TRect; override;
@@ -89,6 +91,7 @@ TVectorialTool = class(TGenericTool)
function GetGridMatrix: TAffineMatrix; virtual;
property Editor: TBGRAOriginalEditor read GetEditor;
public
+ class procedure ForgetHintShown;
function ValidateShape: TRect;
function CancelShape: TRect;
constructor Create(AManager: TToolManager); override;
@@ -497,6 +500,7 @@ procedure TEditShapeTool.UpdateToolManagerFromShape(AShape: TVectorShape);
Manager.LightPosition := m*LightPosition;
Manager.PhongShapeAltitude := round(AltitudePercent);
Manager.TextAlign:= ParagraphAlignment;
+ Manager.TextVerticalAlign:= VerticalAlignment;
Manager.SetTextFont(FontName, FontEmHeight*zoom*72/Manager.Image.DPI, FontStyle);
Manager.TextShadow:= false;
if Aliased then
@@ -704,7 +708,13 @@ function TEditShapeTool.DoToolUpdate(toolDest: TBGRABitmap): TRect;
PenPhong := Manager.TextPhong;
LightPosition := m*Manager.LightPosition;
AltitudePercent := Manager.PhongShapeAltitude;
- ParagraphAlignment := Manager.TextAlign;
+ if FontBidiMode <> Manager.TextBidiMode then
+ begin
+ FontBidiMode:= Manager.TextBidiMode;
+ Manager.TextAlign:= ParagraphAlignment;
+ end else
+ ParagraphAlignment := Manager.TextAlign;
+ VerticalAlignment:= Manager.TextVerticalAlign;
FontName:= Manager.TextFontName;
FontEmHeight:= Manager.TextFontSize*zoom*Manager.Image.DPI/72;
FontStyle := Manager.TextFontStyle;
@@ -1605,6 +1615,8 @@ procedure TVectorialTool.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: T
r: TRect;
matrix: TAffineMatrix;
begin
+ if isEmptyPointF(ABounds.TopLeft) or isEmptyPointF(ABounds.BottomRight) then
+ raise exception.Create('Unexpected empty point');
toolDest := GetToolDrawingLayer;
matrix := VectorTransform(false);
r := (matrix*TAffineBox.AffineBox(ABounds)).RectBounds;
@@ -1813,6 +1825,11 @@ function TVectorialTool.GetGridMatrix: TAffineMatrix;
end;
end;
+class procedure TVectorialTool.ForgetHintShown;
+begin
+ SquareHintShown:= false;
+end;
+
function TVectorialTool.ValidateShape: TRect;
var
layerId: LongInt;
@@ -2034,6 +2051,28 @@ function TVectorialTool.FixLayerOffset: boolean;
Result:= false;
end;
+function TVectorialTool.UpdateQuickDefine: TRect;
+var
+ s: TPointF;
+ avg: single;
+begin
+ if ssShift in ShiftState then
+ begin
+ s := FQuickDefineUserEndPoint-FQuickDefineStartPoint;
+ avg := sqrt(abs(s.x*s.y));
+ if s.x > 0 then FQuickDefineEndPoint.x := FQuickDefineStartPoint.x + avg else FQuickDefineEndPoint.x := FQuickDefineStartPoint.x - avg;
+ if s.y > 0 then FQuickDefineEndPoint.y := FQuickDefineStartPoint.y + avg else FQuickDefineEndPoint.y := FQuickDefineStartPoint.y - avg;
+ end else
+ FQuickDefineEndPoint := FQuickDefineUserEndPoint;
+ FShape.BeginUpdate;
+ QuickDefineShape(FQuickDefineStartPoint, FQuickDefineEndPoint);
+ FLastShapeTransform := AffineMatrixInverse(VectorTransform(false));
+ FShape.Transform(FLastShapeTransform);
+ AssignShapeStyle(FLastShapeTransform, true);
+ FShape.EndUpdate;
+ result := OnlyRenderChange;
+end;
+
function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
ptF: TPointF; rightBtn: boolean): TRect;
var
@@ -2063,6 +2102,7 @@ function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
if FShape=nil then
begin
+ UpdateUseOriginal;
if UseOriginal and
((Manager.Image.LayerOriginal[Manager.Image.CurrentLayerIndex] as TVectorOriginal).GetShapesCost >= MediumShapeCost) then
begin
@@ -2088,6 +2128,7 @@ function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
FShape.TemporaryStorage := FTemporaryStorage;
FQuickDefine := true;
FQuickDefineStartPoint := RoundCoordinate(FLastPos);
+ FQuickDefineUserEndPoint := FQuickDefineStartPoint;
FQuickDefineEndPoint := FQuickDefineStartPoint;
FShape.BeginUpdate;
QuickDefineShape(FQuickDefineStartPoint,FQuickDefineEndPoint);
@@ -2102,8 +2143,11 @@ function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
FShape.OnEditingChange:=@ShapeEditingChange;
FShape.OnRemoveQuery:= @ShapeRemoveQuery;
result := RectUnion(result, UpdateShape(toolDest));
- if FShape is TCustomRectShape then
+ if not SquareHintShown and (FShape is TCustomRectShape) then
+ begin
+ SquareHintShown := true;
Manager.ToolPopup(tpmHoldKeyForSquare, VK_SHIFT);
+ end;
end;
end;
end;
@@ -2111,8 +2155,6 @@ function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
function TVectorialTool.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
ptF: TPointF): TRect;
var
- s: TPointF;
- avg: single;
viewPt, shapePt: TPointF;
handled: boolean;
cur: TOriginalEditorCursor;
@@ -2122,21 +2164,8 @@ function TVectorialTool.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
FLastPos := AffineMatrixTranslation(X,Y)*ptF;
if FQuickDefine then
begin
- FQuickDefineEndPoint := RoundCoordinate(ptF);
- if ssShift in ShiftState then
- begin
- s := FQuickDefineEndPoint-FQuickDefineStartPoint;
- avg := sqrt(abs(s.x*s.y));
- if s.x > 0 then FQuickDefineEndPoint.x := FQuickDefineStartPoint.x + avg else FQuickDefineEndPoint.x := FQuickDefineStartPoint.x - avg;
- if s.y > 0 then FQuickDefineEndPoint.y := FQuickDefineStartPoint.y + avg else FQuickDefineEndPoint.y := FQuickDefineStartPoint.y - avg;
- end;
- FShape.BeginUpdate;
- QuickDefineShape(FQuickDefineStartPoint, FQuickDefineEndPoint);
- FLastShapeTransform := AffineMatrixInverse(VectorTransform(false));
- FShape.Transform(FLastShapeTransform);
- AssignShapeStyle(FLastShapeTransform, true);
- FShape.EndUpdate;
- result := OnlyRenderChange;
+ FQuickDefineUserEndPoint := RoundCoordinate(ptF);
+ result := UpdateQuickDefine;
end else
begin
viewPt := Editor.Matrix*AffineMatrixInverse(VectorTransform(true))*FLastPos;
@@ -2224,6 +2253,11 @@ function TVectorialTool.DoToolKeyDown(var key: Word): TRect;
result := CancelShape;
Key := 0;
end else
+ if (Key = VK_SHIFT) and FQuickDefine and Assigned(FShape) then
+ begin
+ result := UpdateQuickDefine;
+ Key := 0;
+ end else
begin
Editor.KeyDown(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
if not handled and Assigned(FShape) then FShape.KeyDown(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
@@ -2246,9 +2280,16 @@ function TVectorialTool.DoToolKeyUp(var key: Word): TRect;
handled: boolean;
begin
result := EmptyRect;
- Editor.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
- if not handled and Assigned(FShape) then FShape.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
- if handled then Key := 0;
+ if (Key = VK_SHIFT) and FQuickDefine and Assigned(FShape) then
+ begin
+ result := UpdateQuickDefine;
+ Key := 0;
+ end else
+ begin
+ Editor.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
+ if not handled and Assigned(FShape) then FShape.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
+ if handled then Key := 0;
+ end;
end;
function TVectorialTool.ToolCommand(ACommand: TToolCommand): boolean;
diff --git a/lazpaint/uchoosecolor.pas b/lazpaint/uchoosecolor.pas
index da928d81..144be905 100644
--- a/lazpaint/uchoosecolor.pas
+++ b/lazpaint/uchoosecolor.pas
@@ -54,6 +54,7 @@ procedure TFChooseColor.FormCreate(Sender: TObject);
FInterface := TChooseColorInterface.Create(ChooseColorControl, TFChooseColor_CustomDPI);
BorderStyle := ToolWindowSizeable;
FormStyle := ToolWindowStyle;
+ Position := poDesigned;
end;
procedure TFChooseColor.FormDeactivate(Sender: TObject);
@@ -70,7 +71,6 @@ procedure TFChooseColor.FormDestroy(Sender: TObject);
procedure TFChooseColor.FormShow(Sender: TObject);
begin
- Position := poDesigned;
self.EnsureVisible(False);
end;
diff --git a/lazpaint/ucommandline.pas b/lazpaint/ucommandline.pas
index 1b2d2339..936b9349 100644
--- a/lazpaint/ucommandline.pas
+++ b/lazpaint/ucommandline.pas
@@ -86,7 +86,7 @@ implementation
uses
SysUtils, BGRAUTF8, LazFileUtils, BGRABitmap, BGRABitmapTypes, Dialogs, uparse,
UImage, UImageAction, ULayerAction, UScripting, UPython, Forms, StdCtrls, Controls,
- UFileSystem;
+ UFileSystem, BGRAIconCursor;
function ParamStrUTF8(AIndex: integer): string;
begin
@@ -98,7 +98,6 @@ procedure InternalProcessCommands(instance: TLazPaintCustomInstance; commandsUTF
var
commandPrefix: set of char;
InputFilename:string;
- OutputFilename:string;
i,iStart: integer;
errPos: integer; //number conversion
@@ -263,10 +262,49 @@ procedure InternalProcessCommands(instance: TLazPaintCustomInstance; commandsUTF
{$ENDIF}
end;
+ procedure DoSaveFile(outputFilename: string);
+ var
+ icoCur: TBGRAIconCursor;
+ stream: TStream;
+ ext: String;
+ begin
+ instance.StartSavingImage(outputFilename);
+ try
+ ext := ExtractFileExt(outputFilename);
+ // normally ICO and CUR cannot be saved directly but make an exception
+ if (CompareText(ext, '.ico')=0) or (CompareText(ext, '.cur')=0) then
+ begin
+ icoCur := TBGRAIconCursor.Create;
+ try
+ if CompareText(ext, '.cur') = 0 then
+ icoCur.FileType := ifCur
+ else icoCur.FileType := ifIco;
+ icoCur.Add(instance.Image.RenderedImage, BGRABitDepthIconCursor(instance.Image.RenderedImage));
+ stream := FileManager.CreateFileStream(outputFilename, fmCreate);
+ try
+ icoCur.SaveToStream(stream);
+ finally
+ stream.Free;
+ end;
+ finally
+ icoCur.Free;
+ end;
+ end else
+ instance.Image.SaveToFileUTF8(outputFilename)
+ except
+ on ex: Exception do
+ begin
+ instance.ShowError(rsSave, rsUnableToSaveFile+outputFilename);
+ end;
+ end;
+ instance.EndSavingImage;
+ end;
+
begin
fileSaved := True;
quitQuery:= false;
errorEncountered := false;
+ enableScript:= false;
if commandsUTF8.count = 0 then exit;
commandPrefix := ['-'];
@@ -375,17 +413,7 @@ procedure InternalProcessCommands(instance: TLazPaintCustomInstance; commandsUTF
end else
begin
ForcePathDelims(CommandStr);
- OutputFilename := CommandStr;
- instance.StartSavingImage(OutputFilename);
- try
- instance.Image.SaveToFileUTF8(OutputFilename)
- except
- on ex: Exception do
- begin
- instance.ShowError(rsSave, rsUnableToSaveFile+OutputFilename);
- end;
- end;
- instance.EndSavingImage;
+ DoSaveFile(commandStr);
fileSaved:= true;
exit;
end;
diff --git a/lazpaint/udarktheme.pas b/lazpaint/udarktheme.pas
index 42ad7c2d..fdcc3dcc 100644
--- a/lazpaint/udarktheme.pas
+++ b/lazpaint/udarktheme.pas
@@ -264,11 +264,13 @@ procedure TDarkTheme.ToolBarPaintButton(Sender: TToolButton; State: integer;
begin
{ Button Down }
Bitmap := TBGRABitmap.Create(Sender.Width, Sender.Height);
- Bitmap.Rectangle(0, 0, Sender.Width, Sender.Height - 1, BGRA(58, 58, 58),
- BGRA(71, 71, 71), dmSet);
- Bitmap.Rectangle(1, 1, Sender.Width - 1, Sender.Height - 2, BGRA(65, 65, 65),
- BGRA(71, 71, 71), dmSet);
- Bitmap.SetHorizLine(0, Sender.Height - 1, Sender.Width - 1, BGRA(93, 93, 93));
+ Bitmap.Rectangle(0, 0, Sender.Width, Sender.Height - 1,
+ GetColorPanelShadow(ADarkTheme), dmSet);
+ Bitmap.Rectangle(1, 1, Sender.Width - 1, Sender.Height - 2,
+ MergeBGRA(ColorToBGRA(GetColorPanelShadow(ADarkTheme)), 2, ColorToBGRA(GetColorButtonFace(ADarkTheme)), 1),
+ MergeBGRA(ColorToBGRA(GetColorPanelShadow(ADarkTheme)), 1, ColorToBGRA(GetColorButtonFace(ADarkTheme)), 2), dmSet);
+ Bitmap.SetHorizLine(0, Sender.Height - 1, Sender.Width - 1,
+ GetColorButtonFace(ADarkTheme));
end
else
begin
@@ -276,13 +278,16 @@ procedure TDarkTheme.ToolBarPaintButton(Sender: TToolButton; State: integer;
begin
{ Button Hovered }
Bitmap := TBGRABitmap.Create(Sender.Width, Sender.Height);
- Bitmap.GradientFill(0, 0, Sender.Width, Sender.Height, BGRA(132, 132, 132),
- BGRA(109, 109, 109), gtLinear, PointF(0, 0),
+ Bitmap.GradientFill(0, 0, Sender.Width, Sender.Height, GetColorPanelHighlight(ADarkTheme),
+ GetColorButtonFace(ADarkTheme), gtLinear, PointF(0, 0),
PointF(0, Sender.Height), dmSet);
Bitmap.Rectangle(0, 0, Sender.Width, Sender.Height - 1,
- BGRA(48, 48, 48), dmSet);
- Bitmap.SetHorizLine(1, 1, Sender.Width - 2, BGRA(160, 160, 160));
- Bitmap.SetHorizLine(0, Sender.Height - 1, Sender.Width - 1, BGRA(83, 83, 83));
+ GetColorPanelShadow(ADarkTheme),
+ dmSet);
+ Bitmap.SetHorizLine(1, 1, Sender.Width - 2,
+ MergeBGRA(ColorToBGRA(GetColorPanelHighlight(ADarkTheme)), ColorToBGRA(GetColorButtonHighlight(ADarkTheme))));
+ Bitmap.SetHorizLine(0, Sender.Height - 1, Sender.Width - 1,
+ MergeBGRA(ColorToBGRA(GetColorPanelShadow(ADarkTheme)), ColorToBGRA(GetColorButtonFace(ADarkTheme))));
end
else
{ Button Normal }
@@ -350,7 +355,7 @@ procedure TDarkTheme.ToolBarPaintButtonLight(Sender: TToolButton; State: integer
procedure TDarkTheme.ToolBarPaintButtonDark(Sender: TToolButton; State: integer);
begin
- ToolBarPaintButton(Sender, State, false);
+ ToolBarPaintButton(Sender, State, true);
end;
procedure TDarkTheme.Apply(AForm: TForm; AThemeEnabled: boolean; ARecursive: boolean);
diff --git a/lazpaint/ufileextensions.pas b/lazpaint/ufileextensions.pas
index ab6e807a..39a3af25 100644
--- a/lazpaint/ufileextensions.pas
+++ b/lazpaint/ufileextensions.pas
@@ -311,6 +311,7 @@ initialization
RegisterPicExt(rsLayeredImage,'lzp;ora;pdn;oXo', [eoReadable]);
RegisterPicExt(rsLayeredImage,'lzp;ora;oXo', [eoWritable]);
+ RegisterPicExt('AVIF','avif', [eoReadable,eoWritable]);
RegisterPicExt(rsBitmap,'bmp', [eoReadable,eoWritable]);
RegisterPicExt(rsAnimatedGIF,'gif', [eoReadable,eoWritable]);
RegisterPicExt(rsIconOrCursor,'ico;cur', [eoReadable,eoWritable]);
diff --git a/lazpaint/ufilesystem.pas b/lazpaint/ufilesystem.pas
index 38f5e0e9..c08cfa87 100644
--- a/lazpaint/ufilesystem.pas
+++ b/lazpaint/ufilesystem.pas
@@ -88,11 +88,13 @@ TFileManager = class
AResult: TFileInfoList; AFileSortType: TFileSortType = fstNone);
function IsDirectory(APathUTF8: string): boolean;
function IsDirectoryEmpty(APathUTF8: string): boolean;
+ function IsValidFileName(AName: string): boolean;
procedure CreateDirectory(APathUTF8: string);
function DeleteDirectory(APathUTF8: string): boolean;
function FileExists(AFilenameUTF8: string): boolean;
procedure DeleteFile(AFilenameUTF8: string);
function GetValidFilename(ASuggested: string): string;
+ function GetDefaultFilename(ADirectory: string): string;
end;
var
@@ -1137,6 +1139,11 @@ function TFileManager.IsDirectoryEmpty(APathUTF8: string): boolean;
result := true;
end;
+function TFileManager.IsValidFileName(AName: string): boolean;
+begin
+ result := AName = GetValidFilename(AName);
+end;
+
procedure TFileManager.CreateDirectory(APathUTF8: string);
var
str: TStream;
@@ -1209,6 +1216,24 @@ function TFileManager.GetValidFilename(ASuggested: string): string;
end;
end;
+function TFileManager.GetDefaultFilename(ADirectory: string): string;
+var
+ nonameCounter: Integer;
+ foundFiles: TFileInfoList;
+begin
+ result := rsNoName;
+ nonameCounter := 1;
+ foundFiles := TFileInfoList.Create;
+ repeat
+ foundFiles.Clear;
+ GetDirectoryElements(ADirectory, result+'.*', [otNonFolders], foundFiles);
+ if foundFiles.Count = 0 then exit;
+ inc(nonameCounter);
+ result := rsNoName+IntToStr(nonameCounter);
+ until nonameCounter > 999;
+ result := '?';
+end;
+
initialization
FileManager := TFileManager.Create;
diff --git a/lazpaint/ugraph.pas b/lazpaint/ugraph.pas
index 31befb33..d2dc09d9 100644
--- a/lazpaint/ugraph.pas
+++ b/lazpaint/ugraph.pas
@@ -16,6 +16,7 @@ interface
function ComputeRatio(ARatio: string): single;
function RatioToStr(ARatio: single): string;
+function InverseRatio(ARatio: string): string;
function RectUnion(const rect1,Rect2: TRect): TRect;
function RectInter(const rect1,Rect2: TRect): TRect;
@@ -104,7 +105,8 @@ function RatioToStr(ARatio: single): string;
inc(num, AValue*denom);
end;
-const MaxDev = 3;
+const MaxDev = 6;
+ MaxDenom = 99;
var
dev: array[1..MaxDev] of integer;
devCount, i: integer;
@@ -116,21 +118,43 @@ function RatioToStr(ARatio: single): string;
devCount := 0;
repeat
inc(devCount);
- dev[devCount] := trunc(ARatio);
+ dev[devCount] := trunc(curVal);
remain := frac(curVal);
if abs(remain) < 1e-3 then break;
+ if devCount = MaxDev then
+ begin
+ if remain > 0.5 then inc(dev[devCount]);
+ break;
+ end;
curVal := 1/remain;
- until devCount = MaxDev;
- num := dev[devCount];
- denom := 1;
- for i := devCount-1 downto 1 do
- begin
- InvFrac;
- AddFrac(dev[i]);
- end;
+ until false;
+ repeat
+ num := dev[devCount];
+ denom := 1;
+ for i := devCount-1 downto 1 do
+ begin
+ InvFrac;
+ AddFrac(dev[i]);
+ end;
+ if ((num >= denom) and (denom <= MaxDenom))
+ or ((num < denom) and (num <= MaxDenom))
+ or (devCount = 1) then break;
+ dec(devCount);
+ until false;
result := IntToStr(num)+':'+IntToStr(denom);
end;
+function InverseRatio(ARatio: string): string;
+var
+ elements: TStringArray;
+begin
+ elements := ARatio.Split([':']);
+ if length(elements) = 2 then
+ result := elements[1] + ':' + elements[0]
+ else
+ result := ARatio;
+end;
+
function RectUnion(const rect1, Rect2: TRect): TRect;
begin
if IsRectEmpty(rect1) then
diff --git a/lazpaint/uimagelist.pas b/lazpaint/uimagelist.pas
index 8af1f265..5f17bb22 100644
--- a/lazpaint/uimagelist.pas
+++ b/lazpaint/uimagelist.pas
@@ -423,6 +423,7 @@ procedure TFImageList.FormResize(Sender: TObject);
procedure TFImageList.FormShow(Sender: TObject);
begin
+ EnsureVisible(False);
tbAutoUncheck.Down:= LazPaintInstance.Config.ImageListAutoUncheck;
tbAutoZoomFit.Down:= LazPaintInstance.Config.ImageListAutoZoom;
pmAutouncheckOnSave.Checked:=LazPaintInstance.Config.ImageListAutoUncheckMode=0;
diff --git a/lazpaint/uimageview.pas b/lazpaint/uimageview.pas
index 2efd3815..8f6228a7 100644
--- a/lazpaint/uimageview.pas
+++ b/lazpaint/uimageview.pas
@@ -73,6 +73,7 @@ TImageView = class
FTablet: TLazTablet;
FImagePos: TPointF;
FCanvasScale: integer;
+ FAltKeyUsedForPenSize: boolean;
function GetImage: TLazPaintImage;
function GetPictureCanvas: TCanvas;
function GetWorkArea: TRect;
@@ -293,10 +294,11 @@ procedure TImageView.PaintBoxMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if not PictureCoordsDefined then exit;
- if ssAlt in Shift then
+ if LazPaintInstance.ToolManager.PenWidthVisible and (ssAlt in Shift) then
begin
if WheelDelta > 0 then LazPaintInstance.ToolManager.StepPenSize(false)
else if WheelDelta < 0 then LazPaintInstance.ToolManager.StepPenSize(true);
+ FAltKeyUsedForPenSize := true;
end else
begin
Zoom.SetPosition(FormToBitmap(MousePos.X,MousePos.Y), MousePos);
@@ -610,6 +612,7 @@ constructor TImageView.Create(AInstance: TLazPaintCustomInstance; AZoom: TZoom;
FInstance := AInstance;
FZoom := AZoom;
FCanvasScale:= round(APaintBox.GetCanvasScaleFactor);
+ FAltKeyUsedForPenSize:= false;
AInstance.ToolManager.CanvasScale := FCanvasScale;
ugraph.CanvasScale:= FCanvasScale;
@@ -677,6 +680,7 @@ function TImageView.CatchToolKeyDown(var AKey: Word): boolean;
begin
FCatchPaintPicture:= true;
FPaintPictureCatched := false;
+ if AKey = VK_MENU then FAltKeyUsedForPenSize := false;
try
result := LazPaintInstance.ToolManager.ToolKeyDown(AKey) or FPaintPictureCatched;
finally
@@ -689,7 +693,8 @@ function TImageView.CatchToolKeyUp(var AKey: Word): boolean;
FCatchPaintPicture:= true;
FPaintPictureCatched := false;
try
- result := LazPaintInstance.ToolManager.ToolKeyUp(AKey) or FPaintPictureCatched;
+ result := LazPaintInstance.ToolManager.ToolKeyUp(AKey) or FPaintPictureCatched;
+ if (AKey = VK_MENU) and FAltKeyUsedForPenSize then AKey := 0;
finally
FCatchPaintPicture:= false;
end;
@@ -999,7 +1004,7 @@ procedure TImageView.UpdateCursor(X,Y: integer);
virtualScreenPenCursorBefore := FPenCursorVisible;
FPenCursorVisible := false;
wantedCursor := LazPaintInstance.ToolManager.Cursor;
- if LazPaintInstance.ToolManager.GetCurrentToolType in[ptPen,ptEraser,ptBrush,ptClone] then UseVSPenCursor;
+ if LazPaintInstance.ToolManager.GetCurrentToolType in[ptPen,ptEraser,ptBrush,ptClone,ptSelectPen] then UseVSPenCursor;
if not PtInRect(WorkArea, Point(X,Y)) then wantedCursor:= crDefault;
if FPaintBox.Cursor <> wantedCursor then FPaintBox.Cursor := wantedCursor;
if virtualScreenPenCursorBefore or FPenCursorVisible then
diff --git a/lazpaint/ulayerstack.pas b/lazpaint/ulayerstack.pas
index e6f8c4ea..a6663edb 100644
--- a/lazpaint/ulayerstack.pas
+++ b/lazpaint/ulayerstack.pas
@@ -93,6 +93,7 @@ procedure TFLayerStack.FormDestroy(Sender: TObject);
procedure TFLayerStack.FormShow(Sender: TObject);
begin
+ EnsureVisible(False);
CreateStackInterface;
end;
diff --git a/lazpaint/uloading.pas b/lazpaint/uloading.pas
index a89b4d09..65aa2a57 100644
--- a/lazpaint/uloading.pas
+++ b/lazpaint/uloading.pas
@@ -127,6 +127,7 @@ procedure TFLoading.SetTimeOut(AMillisecond: integer);
Timer1.Enabled:= false
else
begin
+ Timer1.Enabled := false;
Timer1.Interval := AMillisecond;
Timer1.Enabled := true;
end;
diff --git a/lazpaint/umenu.pas b/lazpaint/umenu.pas
index 3e05a248..76704dc5 100644
--- a/lazpaint/umenu.pas
+++ b/lazpaint/umenu.pas
@@ -17,7 +17,10 @@ TMainFormMenu = class
private
FActionList: TActionList;
FDarkTheme: boolean;
- FMainMenus: array of TMenuItem;
+ FMainMenus: array of record
+ menu: TMenuItem;
+ used: boolean;
+ end;
FToolsShortcuts: array[TPaintToolType] of TUTF8Char;
FToolbars: array of record
tb: TPanel;
@@ -237,10 +240,10 @@ procedure TMainFormMenu.AddMenus(AMenuName: string; AActionsCommaText: string);
break;
end;
for i := 0 to high(FMainMenus) do
- if FMainMenus[i].Name = AMenuName then
+ if FMainMenus[i].menu.Name = AMenuName then
begin
- AddMenus(FMainMenus[i], FActionList, AActionsCommaText);
- FMainMenus[i].Visible := true;
+ AddMenus(FMainMenus[i].menu, FActionList, AActionsCommaText);
+ FMainMenus[i].used := true;
end;
end;
@@ -388,7 +391,10 @@ procedure TMainFormMenu.PredefinedMainMenus(const AMainMenus: array of TMenuItem
begin
setlength(FMainMenus, length(AMainMenus));
for i := 0 to high(AMainMenus) do
- FMainMenus[i] := AMainMenus[i];
+ begin
+ FMainMenus[i].menu := AMainMenus[i];
+ FMainMenus[i].used := false;
+ end;
end;
procedure TMainFormMenu.Toolbars(const AToolbars: array of TPanel; AToolbarBackground: TPanel);
@@ -426,18 +432,31 @@ procedure TMainFormMenu.ScaleToolbars(ATargetDPI: integer);
procedure TMainFormMenu.CycleTool(var ATool: TPaintToolType;
var AShortCut: TUTF8Char);
+const cyrillicMap = 'ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ';
var
curTool: TPaintToolType;
+ latinShortCut: TUTF8Char;
+ idx: integer;
begin
- AShortCut := UTF8UpperCase(AShortCut);
+ latinShortCut := UTF8UpperCase(AShortCut);
curTool := ATool;
+ if (length(latinShortCut) <> 1) or
+ ((length(latinShortCut) = 1) and not (latinShortCut[1] in ['A'..'Z'])) then
+ begin
+ idx := pos(latinShortCut, cyrillicMap);
+ if idx <> 0 then
+ begin
+ idx := UTF8Length(copy(cyrillicMap, 1, idx));
+ latinShortCut := chr(idx+64);
+ end;
+ end;
repeat
if curTool = high(TPaintToolType) then
curTool := low(TPaintToolType)
else
curTool := succ(curTool);
- if (FToolsShortcuts[curTool] = AShortCut) and not
+ if (FToolsShortcuts[curTool] = latinShortCut) and not
((curTool = ptHotSpot) and not FInstance.Image.IsCursor) then
begin
ATool := curTool;
@@ -469,7 +488,8 @@ procedure TMainFormMenu.Apply;
AddMenus('MenuScript', 'FileRunScript,-,InstalledScripts');
AddMenus('MenuHelp', 'HelpIndex,-,HelpAbout');
for i := 0 to high(FMainMenus) do
- if FMainMenus[i].Count = 0 then FMainMenus[i].visible := false;
+ if not FMainMenus[i].used then
+ FMainMenus[i].menu.Visible := false;
ApplyShortcuts;
@@ -612,6 +632,7 @@ procedure TMainFormMenu.ApplyShortcuts;
ActionShortcut('ToolHotSpot','H');
ActionShortcut('ToolPen','P');
ActionShortcut('ToolBrush','B');
+ ActionShortcut('ToolClone','K');
ActionShortcut('ToolColorPicker','C');
ActionShortcut('ToolEraser','E');
ActionShortcut('ToolEditShape','J');
@@ -623,12 +644,12 @@ procedure TMainFormMenu.ApplyShortcuts;
ActionShortcut('ToolSpline','D');
ActionShortcut('ToolFloodfill','G');
ActionShortcut('ToolGradient','G');
- ActionShortcut('ToolPhong','G');
+ ActionShortcut('ToolPhong','Y');
ActionShortcut('ToolText','T');
ActionShortcut('ToolSelectRect','M');
ActionShortcut('ToolSelectEllipse','M');
- ActionShortcut('ToolSelectPoly','A');
- ActionShortcut('ToolSelectSpline','A');
+ ActionShortcut('ToolSelectPoly','F');
+ ActionShortcut('ToolSelectSpline','F');
ActionShortcut('ToolMoveSelection','V');
ActionShortcut('ToolRotateSelection','V');
ActionShortcut('ToolSelectPen','O');
diff --git a/lazpaint/umyslv.pas b/lazpaint/umyslv.pas
index a66492ce..000ebb42 100644
--- a/lazpaint/umyslv.pas
+++ b/lazpaint/umyslv.pas
@@ -55,6 +55,7 @@ TLCShellListView = class
end;
FActualRowHeight,FIconsPerLine: integer;
FSelectedIndex,FKeySelectionRangeStart: integer;
+ FKeySelectionRangeDescending: boolean;
FVScrollBar: TVolatileScrollBar;
FVerticalScrollPos: integer;
FWantedItemVisible: integer;
@@ -689,8 +690,26 @@ procedure TLCShellListView.Redraw(Sender: TObject; ABitmap: TBGRABitmap);
begin
TVolatileScrollBar.InitDPI((Sender as TControl).GetCanvasScaleFactor);
- if SelectedIndex = -1 then FKeySelectionRangeStart := -1
- else if FKeySelectionRangeStart = -1 then FKeySelectionRangeStart:= SelectedIndex;
+ if not ItemSelected[FKeySelectionRangeStart] then FKeySelectionRangeStart := -1;
+ if FKeySelectionRangeStart = -1 then
+ begin
+ if FKeySelectionRangeDescending then
+ begin
+ for i := ItemCount-1 downto 0 do
+ if ItemSelected[i] then
+ begin
+ FKeySelectionRangeStart:= i;
+ break;
+ end;
+ end else
+ for i := 0 to ItemCount-1 do
+ if ItemSelected[i] then
+ begin
+ FKeySelectionRangeStart:= i;
+ break;
+ end;
+ end;
+
for i := 0 to ColumnCount-1 do
FColumns[i].displayRect := EmptyRect;
w := ABitmap.Width;
@@ -750,12 +769,14 @@ procedure TLCShellListView.KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure KeySelectRange(curItem: integer);
- var i: integer;
+ var i, prevKeyRangeStart: integer;
begin
+ prevKeyRangeStart := FKeySelectionRangeStart;
DeselectAll;
- if (ssShift in Shift) and (FKeySelectionRangeStart >= 0) and (FKeySelectionRangeStart < ItemCount) and
+ if (ssShift in Shift) and (prevKeyRangeStart >= 0) and (prevKeyRangeStart < ItemCount) and
FAllowMultiSelect then
begin
+ FKeySelectionRangeStart:= prevKeyRangeStart;
i := curItem;
FSelectedIndex:= curItem;
ItemSelected[i] := true;
@@ -764,6 +785,7 @@ procedure TLCShellListView.KeyDown(Sender: TObject; var Key: Word;
if i< FKeySelectionRangeStart then inc(i) else dec(i);
ItemSelected[i]:= true;
end;
+ FKeySelectionRangeDescending := curItem < FKeySelectionRangeStart;
end else
begin
FSelectedIndex:= curItem;
@@ -774,6 +796,7 @@ procedure TLCShellListView.KeyDown(Sender: TObject; var Key: Word;
MakeItemVisible(curItem);
end;
+var j: integer;
begin
if ItemCount = 0 then exit;
@@ -781,14 +804,35 @@ procedure TLCShellListView.KeyDown(Sender: TObject; var Key: Word;
begin
if SelectedIndex = -1 then
begin
- Key := 0;
- DeselectAll;
- FSelectedIndex:= 0;
- ItemSelected[0] := true;
- InvalidateView;
- MakeItemVisible(0);
- if Assigned(FOnSelectItem) then FOnSelectItem(self,0,true);
- exit;
+ if FKeySelectionRangeStart <> -1 then
+ begin
+ if FKeySelectionRangeDescending then
+ begin
+ for j := 0 to ItemCount-1 do
+ if ItemSelected[j] then
+ begin
+ FSelectedIndex := j;
+ break;
+ end;
+ end else
+ for j := ItemCount-1 downto 0 do
+ if ItemSelected[j] then
+ begin
+ FSelectedIndex := j;
+ break;
+ end;
+ end
+ else
+ begin
+ Key := 0;
+ DeselectAll;
+ FSelectedIndex:= 0;
+ ItemSelected[0] := true;
+ InvalidateView;
+ MakeItemVisible(0);
+ if Assigned(FOnSelectItem) then FOnSelectItem(self,0,true);
+ exit;
+ end;
end
end;
if Key = VK_HOME then
@@ -876,6 +920,7 @@ procedure TLCShellListView.MouseDown(Sender: TObject; Button: TMouseButton;
begin
if idx <> FSelectedIndex then
begin
+ FKeySelectionRangeDescending:= idx < FSelectedIndex;
while idx <> FSelectedIndex do
begin
if FSelectedIndex > idx then dec(FSelectedIndex) else inc(FSelectedIndex);
diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas
index 5169f57f..a0479cca 100644
--- a/lazpaint/upalettetoolbar.pas
+++ b/lazpaint/upalettetoolbar.pas
@@ -396,6 +396,7 @@ procedure TPaletteToolbar.DoSavePalette(Sender: TObject);
saveDialog.InitialDir := '';
saveDialog.Filter := BGRARegisteredPaletteFormatFilter(rsAllSupportedFiletypes);
saveDialog.DefaultExt := 'txt';
+ saveDialog.Options := saveDialog.Options + [ofOverwritePrompt];
if saveDialog.Execute then
begin
if Assigned(FLazPaintInstance) then
diff --git a/lazpaint/upython.pas b/lazpaint/upython.pas
index 6e5cb6b3..fb229078 100644
--- a/lazpaint/upython.pas
+++ b/lazpaint/upython.pas
@@ -68,7 +68,7 @@ function GetPythonVersion(APythonBin: string = DefaultPythonBin): string;
begin
if (PythonVersionCache.Bin <> APythonBin) or (PythonVersionCache.Version = '?') then
begin
- RunCommand(APythonBin, ['-V'], versionStr, [poStderrToOutPut]);
+ RunCommand(APythonBin, ['-V'], versionStr, []);
PythonVersionCache.Bin := APythonBin;
if versionStr.StartsWith(PythonVersionPrefix) then
PythonVersionCache.Version := trim(copy(versionStr,length(PythonVersionPrefix)+1,
diff --git a/lazpaint/uresourcestrings.pas b/lazpaint/uresourcestrings.pas
index 291c1ce4..7ed12a9e 100644
--- a/lazpaint/uresourcestrings.pas
+++ b/lazpaint/uresourcestrings.pas
@@ -36,6 +36,7 @@ function CaptionToResampleFilter(AText: string): TResampleFilter;
rsErrorDecodingRaw='Error decoding raw image.';
rsErrorLoadingOriginal='Error while loading original however layer can be rasterized.';
rsRasterLayer = 'Raster layer';
+ rsVisible = 'Visibile';
rsTransformedRasterLayer = 'Transformed raster layer';
rsVectorialLayer = 'Vectorial layer';
rsUnknownOriginal = 'Unknown original';
@@ -86,6 +87,7 @@ function CaptionToResampleFilter(AText: string): TResampleFilter;
rsHoldKeySnapToPixel = 'Hold %1 to snap to pixels';
rsReturnValides = 'Press ENTER to validate';
rsBackspaceRemoveLastPoint = 'Press BACKSPACE to remove last point';
+ rsRightClickFinishShape = 'Use RIGHT click to finish shape';
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';
@@ -100,6 +102,7 @@ function CaptionToResampleFilter(AText: string): TResampleFilter;
rsEmptyLayer='Layer is empty';
rsKeepEmptySpace='Keep empty space around opaque pixels?';
+ rsImage='Image';
rsRepeatImage='Repeat image';
rsCanvasSize='Canvas size';
rsResamplingImage='Resampling image...';
@@ -135,6 +138,7 @@ function CaptionToResampleFilter(AText: string): TResampleFilter;
rsIntensity='Intensity';
rsLightness='Lightness';
+ rsColorDescription='Color description: click to type in a color with the keyboard using color names or CSS notation.';
rsHotSpot='Hot spot';
rsEntries='Entries';
@@ -299,8 +303,10 @@ function ApplyShortcutStr(ACaption, AShortcut: string): string;
procedure AppendShortcut(AAction: TAction; AShortcut: string);
begin
+ if AAction.Hint <> '' then
+ AAction.Hint := ApplyShortcutStr(AAction.Hint, AShortcut);
if AAction.Caption = '' then
- AAction.Caption := ApplyShortcutStr(AAction.Hint, AShortcut)
+ AAction.Caption := AAction.Hint
else
AAction.Caption := ApplyShortcutStr(AAction.Caption, AShortcut);
end;
diff --git a/lazpaint/utoolbox.pas b/lazpaint/utoolbox.pas
index 67b67ab7..b213f1e0 100644
--- a/lazpaint/utoolbox.pas
+++ b/lazpaint/utoolbox.pas
@@ -45,7 +45,6 @@ implementation
procedure TFToolbox.FormShow(Sender: TObject);
begin
- Position := poDesigned;
self.EnsureVisible(False);
end;
@@ -124,6 +123,7 @@ procedure TFToolbox.FormCreate(Sender: TObject);
begin
BorderStyle := ToolWindowFixedSize;
FormStyle := ToolWindowStyle;
+ Position := poDesigned;
end;
{$R *.lfm}
diff --git a/lazpaint/uzoom.pas b/lazpaint/uzoom.pas
index 8e01ca77..edfd7168 100644
--- a/lazpaint/uzoom.pas
+++ b/lazpaint/uzoom.pas
@@ -33,13 +33,15 @@ TZoom = class
FOnZoomChangedHandler : TOnZoomChangedHandler;
FBitmapPosition: TPointF;
FMousePosition: TPoint;
+ FOnCenterQuery: TNotifyEvent;
function GetEditingZoom: boolean;
function GetPositionDefined: boolean;
function GetZoomFactor: single;
procedure SetEditingZoom(AValue: boolean);
procedure SetMaxFactor(AValue: single);
procedure SetMinFactor(AValue: single);
- procedure SetZoomFactor(AValue: single);
+ procedure SetZoomFactor(AValue: single); overload;
+ procedure SetZoomFactor(AValue: single; ACenter: boolean); overload;
protected
procedure EditZoom_KeyPress(Sender: TObject; var Key: char);
procedure EditZoom_ZoomExit(Sender: TObject);
@@ -66,6 +68,7 @@ TZoom = class
property BitmapPosition: TPointF read FBitmapPosition;
property MousePosition: TPoint read FMousePosition;
property PositionDefined: boolean read GetPositionDefined;
+ property OnCenterQuery: TNotifyEvent read FOnCenterQuery write FOnCenterQuery;
end;
implementation
@@ -120,12 +123,17 @@ procedure TZoom.SetMinFactor(AValue: single);
end;
procedure TZoom.SetZoomFactor(AValue: single);
+begin
+ SetZoomFactor(AValue, false);
+end;
+
+procedure TZoom.SetZoomFactor(AValue: single; ACenter: boolean);
begin
if (FMinFactor <> 0) and (AValue < FMinFactor) then AValue := FMinFactor;
if (FMaxFactor <> 0) and (AValue > FMaxFactor) then AValue := FMaxFactor;
- if AValue = FZoomFactor then exit;
EditingZoom:= False;
FZoomFactor:= AValue;
+ if ACenter and Assigned(OnCenterQuery) then OnCenterQuery(self);
if Assigned(FOnZoomChangedHandler) then
FOnZoomChangedHandler(self, AValue);
UpdateLabel;
@@ -236,7 +244,7 @@ procedure TZoom.ZoomFit(AImageWidth, AImageHeight: integer);
try
zx := (pictureArea.right-pictureArea.left-pixelMargin)/AImageWidth;
zy := (pictureArea.bottom-pictureArea.top-pixelMargin)/AImageheight;
- Factor:= min(zx,zy);
+ SetZoomFactor(min(zx,zy), true);
except
on ex:Exception do
begin end;
diff --git a/lazpaintcontrols/lazpaintcontrols.lpk b/lazpaintcontrols/lazpaintcontrols.lpk
index a3701439..27b103aa 100644
--- a/lazpaintcontrols/lazpaintcontrols.lpk
+++ b/lazpaintcontrols/lazpaintcontrols.lpk
@@ -1,6 +1,6 @@
-
+
@@ -20,7 +20,7 @@
-
+
@@ -76,6 +76,7 @@
+
diff --git a/lazpaintcontrols/lcvectorialfillcontrol.pas b/lazpaintcontrols/lcvectorialfillcontrol.pas
index 4e4d11dd..d4d62cb4 100644
--- a/lazpaintcontrols/lcvectorialfillcontrol.pas
+++ b/lazpaintcontrols/lcvectorialfillcontrol.pas
@@ -75,6 +75,7 @@ TLCVectorialFillControl = class(TWinControl)
FOnEditGradTexPoints: TNotifyEvent;
FOnChooseColor: TChooseColorEvent;
FOnFillChange: TNotifyEvent;
+ FOnOpacityChange: TNotifyEvent;
FOnFillTypeChange: TNotifyEvent;
FOnTextureClick: TNotifyEvent;
FOnTextureChange: TNotifyEvent;
@@ -84,6 +85,7 @@ TLCVectorialFillControl = class(TWinControl)
procedure DoOnEditGradTexPoints(Sender: TObject);
procedure DoOnFillChange(Sender: TObject);
procedure DoOnFillTypeChange(Sender: TObject);
+ procedure DoOnOpacityChange(Sender: TObject);
procedure DoOnTextureClick(Sender: TObject);
procedure DoOnTextureChange(Sender: TObject);
procedure DoOnResize; override;
@@ -122,6 +124,7 @@ TLCVectorialFillControl = class(TWinControl)
property EditingGradTexPoints: boolean read GetEditingGradTexPoints write SetEditingGradTexPoints;
property OnChooseColor: TChooseColorEvent read FOnChooseColor write SetOnChooseColor;
property OnFillChange: TNotifyEvent read FOnFillChange write FOnFillChange;
+ property OnOpacityChange: TNotifyEvent read FOnOpacityChange write FOnOpacityChange;
property OnTextureChange: TNotifyEvent read FOnTextureChange write FOnTextureChange;
property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
property OnEditGradTexPoints: TNotifyEvent read FOnEditGradTexPoints write FOnEditGradTexPoints;
@@ -421,6 +424,11 @@ procedure TLCVectorialFillControl.DoOnFillTypeChange(Sender: TObject);
if Assigned(FOnFillTypeChange) then FOnFillTypeChange(self);
end;
+procedure TLCVectorialFillControl.DoOnOpacityChange(Sender: TObject);
+begin
+ if Assigned(FOnOpacityChange) then FOnOpacityChange(self);
+end;
+
procedure TLCVectorialFillControl.DoOnTextureChange(Sender: TObject);
begin
if Assigned(FOnTextureChange) then FOnTextureChange(self);
@@ -443,6 +451,7 @@ constructor TLCVectorialFillControl.Create(TheOwner: TComponent);
FInterface.OnAdjustToShape:=@DoOnAdjustToShape;
FInterface.OnEditGradTexPoints:=@DoOnEditGradTexPoints;
FInterface.OnFillTypeChange:=@DoOnFillTypeChange;
+ FInterface.OnOpacityChange:=@DoOnOpacityChange;
FInterface.OnMouseMove:=@InterfaceMouseMove;
FInterface.OnMouseDown:=@InterfaceMouseDown;
FInterface.OnMouseUp:=@InterfaceMouseUp;
diff --git a/lazpaintcontrols/lcvectorialfillinterface.pas b/lazpaintcontrols/lcvectorialfillinterface.pas
index 4d793dff..ab47a209 100644
--- a/lazpaintcontrols/lcvectorialfillinterface.pas
+++ b/lazpaintcontrols/lcvectorialfillinterface.pas
@@ -80,7 +80,7 @@ TVectorialFillInterface = class(TComponent)
FPreview: TImage;
FButtonFillNone, FButtonFillSolid,
FButtonFillGradient, FButtonFillTexture: TToolButton;
- FOnFillChange, FOnFillTypeChange: TNotifyEvent;
+ FOnFillChange, FOnFillTypeChange, FOnOpacityChange: TNotifyEvent;
FButtonEditGradTexPoints, FButtonAdjustToShape: TToolButton;
FOnEditGradTexPoints, FOnAdjustToShape: TNotifyEvent;
@@ -204,6 +204,7 @@ TVectorialFillInterface = class(TComponent)
property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
property OnEditGradTexPoints: TNotifyEvent read FOnEditGradTexPoints write FOnEditGradTexPoints;
property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
+ property OnOpacityChange: TNotifyEvent read FOnOpacityChange write FOnOpacityChange;
property OnChooseColor: TChooseColorEvent read FOnChooseColor write FOnChooseColor;
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
@@ -574,6 +575,7 @@ procedure TVectorialFillInterface.UpDownEndAlphaChange(Sender: TObject;
c := GradEndColor;
c.alpha := FUpDownEndAlpha.Value;
GradEndColor:= c;
+ if assigned(FOnOpacityChange) then FOnOpacityChange(self);
end;
end;
@@ -581,7 +583,10 @@ procedure TVectorialFillInterface.UpDownSolidAlphaChange(Sender: TObject;
AByUser: boolean);
begin
if AByUser then
+ begin
SolidColor:= ColorToBGRA(FShapeSolidColor.Brush.Color, FUpDownSolidAlpha.Value);
+ if assigned(FOnOpacityChange) then FOnOpacityChange(self);
+ end;
end;
procedure TVectorialFillInterface.UpDownStartAlphaChange(Sender: TObject;
@@ -594,6 +599,7 @@ procedure TVectorialFillInterface.UpDownStartAlphaChange(Sender: TObject;
c := GradStartColor;
c.alpha := FUpDownStartAlpha.Value;
GradStartColor:= c;
+ if assigned(FOnOpacityChange) then FOnOpacityChange(self);
end;
end;
diff --git a/lazpaintcontrols/lcvectororiginal.pas b/lazpaintcontrols/lcvectororiginal.pas
index b580bdb6..8d123bc6 100644
--- a/lazpaintcontrols/lcvectororiginal.pas
+++ b/lazpaintcontrols/lcvectororiginal.pas
@@ -1976,6 +1976,8 @@ procedure TVectorShape.BeginUpdate(ADiffHandler: TVectorShapeDiffAny);
if FUpdateCount = 0 then
begin
FBoundsBeforeUpdate := GetRenderBounds(InfiniteRect, AffineMatrixIdentity);
+ if isEmptyPointF(FBoundsBeforeUpdate.TopLeft) or isEmptyPointF(FBoundsBeforeUpdate.BottomRight) then
+ raise exception.Create('Unexpected empty point');
Inc(FRenderIteration);
end;
inc(FUpdateCount);
diff --git a/lazpaintcontrols/lcvectorpolyshapes.pas b/lazpaintcontrols/lcvectorpolyshapes.pas
index 5f345509..ba90e6d4 100644
--- a/lazpaintcontrols/lcvectorpolyshapes.pas
+++ b/lazpaintcontrols/lcvectorpolyshapes.pas
@@ -67,6 +67,7 @@ TCustomPolypointShape = class(TVectorShape)
function GetLineCap: TPenEndCap;
function GetPoint(AIndex: integer): TPointF;
function GetPointCount: integer;
+ function GetValidatedPointCount: integer;
procedure SetArrowEndKind(AValue: TArrowKind);
procedure SetArrowSize(AValue: TPointF);
procedure SetArrowStartKind(AValue: TArrowKind);
@@ -80,7 +81,7 @@ TCustomPolypointShape = class(TVectorShape)
FCenterPoint: TPointF;
FCenterPointEditorIndex: integer;
FCurPoint: integer;
- FAddingPoint: boolean;
+ FAddingPoint, FAltPressed: boolean;
FMousePos: TPointF;
FHoverPoint: integer;
FHoverCenter: boolean;
@@ -91,7 +92,8 @@ TCustomPolypointShape = class(TVectorShape)
procedure OnMoveCenterPoint({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF; {%H-}AShift: TShiftState);
procedure OnStartMove({%H-}ASender: TObject; APointIndex: integer; {%H-}AShift: TShiftState);
function GetCurve(AMatrix: TAffineMatrix): ArrayOfTPointF; virtual;
- function GetPath(AMatrix: TAffineMatrix): TBGRAPath; virtual;
+ function GetPath(AMatrix: TAffineMatrix): TBGRAPath; virtual; overload;
+ function GetPath(const APoints: array of TPointF): TBGRAPath; overload;
procedure SetUsermode(AValue: TVectorShapeUsermode); override;
function GetClosed: boolean; virtual;
procedure SetClosed(AValue: boolean); virtual;
@@ -117,6 +119,7 @@ TCustomPolypointShape = class(TVectorShape)
procedure MouseMove({%H-}Shift: TShiftState; X, Y: single; var {%H-}ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
procedure MouseDown(RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
procedure KeyDown({%H-}Shift: TShiftState; Key: TSpecialKey; var AHandled: boolean); override;
+ procedure KeyUp(Shift: TShiftState; Key: TSpecialKey; var AHandled: boolean); override;
procedure QuickDefine(constref APoint1,APoint2: TPointF); override;
procedure LoadFromStorage(AStorage: TBGRACustomOriginalStorage); override;
procedure SaveToStorage(AStorage: TBGRACustomOriginalStorage); override;
@@ -126,6 +129,7 @@ TCustomPolypointShape = class(TVectorShape)
class function DefaultArrowSize: TPointF;
property Points[AIndex:integer]: TPointF read GetPoint write SetPoint;
property PointCount: integer read GetPointCount;
+ property ValidatedPointCount: integer read GetValidatedPointCount;
property Closed: boolean read GetClosed write SetClosed;
property HoverPoint: integer read GetHoverPoint write SetHoverPoint;
property HoverCenter: boolean read FHoverCenter write SetHoverCenter;
@@ -474,6 +478,14 @@ function TCustomPolypointShape.GetPointCount: integer;
result:= length(FPoints);
end;
+function TCustomPolypointShape.GetValidatedPointCount: integer;
+begin
+ if (PointCount > 1) and FAddingPoint then
+ result := PointCount - 1
+ else
+ result := PointCount;
+end;
+
procedure TCustomPolypointShape.SetArrowEndKind(AValue: TArrowKind);
begin
if FArrowEndKind=AValue then Exit;
@@ -610,9 +622,38 @@ function TCustomPolypointShape.GetCurve(AMatrix: TAffineMatrix): ArrayOfTPointF;
result[i] := m*Points[i];
end;
+function TCustomPolypointShape.GetPath(const APoints: array of TPointF): TBGRAPath;
+var p: TPointF;
+ subPoly: boolean;
+begin
+ result := TBGRAPath.Create;
+ subPoly := true;
+ for p in APoints do
+ begin
+ if isEmptyPointF(p) then
+ begin
+ if not result.IsEmpty and Closed then result.closePath;
+ subPoly := true;
+ end else
+ begin
+ if subPoly then
+ begin
+ result.moveTo(p);
+ subPoly := false;
+ end
+ else
+ result.lineTo(p);
+ end;
+ end;
+ if not result.IsEmpty and Closed then result.closePath;
+end;
+
function TCustomPolypointShape.GetPath(AMatrix: TAffineMatrix): TBGRAPath;
+var
+ pts: array of TPointF;
begin
- result := TBGRAPath.Create(GetCurve(AMatrix));
+ pts := GetCurve(AMatrix);
+ result := GetPath(pts);
end;
class function TCustomPolypointShape.Usermodes: TVectorShapeUsermodes;
@@ -1034,6 +1075,7 @@ procedure TCustomPolypointShape.KeyDown(Shift: TShiftState; Key: TSpecialKey;
skRight: d := dx;
skUp: d := -dy;
skDown: d := dy;
+ else d := PointF(0,0);
end;
if HoverCenter then
Center := Center + d
@@ -1041,9 +1083,30 @@ procedure TCustomPolypointShape.KeyDown(Shift: TShiftState; Key: TSpecialKey;
Points[HoverPoint] := Points[HoverPoint] + d;
AHandled := true;
end else
+ if Key = skAlt then
+ begin
+ BeginUpdate;
+ FAltPressed := true;
+ EndUpdate;
+ AHandled := true;
+ end
+ else
inherited KeyDown(Shift, Key, AHandled);
end;
+procedure TCustomPolypointShape.KeyUp(Shift: TShiftState; Key: TSpecialKey;
+ var AHandled: boolean);
+begin
+ if Key = skAlt then
+ begin
+ BeginUpdate;
+ FAltPressed := false;
+ EndUpdate;
+ AHandled := true;
+ end
+ else inherited KeyUp(Shift, Key, AHandled);
+end;
+
procedure TCustomPolypointShape.QuickDefine(constref APoint1, APoint2: TPointF);
begin
BeginUpdate(TCustomPolypointShapeDiff);
@@ -1088,8 +1151,8 @@ procedure TCustomPolypointShape.SaveToStorage(AStorage: TBGRACustomOriginalStora
i: Integer;
begin
inherited SaveToStorage(AStorage);
- setlength(x, PointCount);
- setlength(y, PointCount);
+ setlength({%H-}x, PointCount);
+ setlength({%H-}y, PointCount);
for i:= 0 to PointCount-1 do
begin
x[i] := Points[i].x;
@@ -1147,7 +1210,8 @@ procedure TCustomPolypointShape.ConfigureCustomEditor(AEditor: TBGRAOriginalEdit
FCenterPoint *= 1/nbTotal
else FCenterPoint := EmptyPointF;
- if (FAddingPoint and (nbTotal > 2)) or (not FAddingPoint and (nbTotal > 1)) then
+ if ((FAddingPoint and (nbTotal > 2)) or (not FAddingPoint and (nbTotal > 1)))
+ and not FAltPressed then
begin
FCenterPointEditorIndex := AEditor.AddPoint(FCenterPoint, @OnMoveCenterPoint, true);
AEditor.PointHighlighted[FCenterPointEditorIndex] := HoverCenter;
@@ -1346,7 +1410,7 @@ function TPolylineShape.GetIsSlow(const AMatrix: TAffineMatrix): boolean;
begin
if not GetPenVisible and not GetBackVisible or (PointCount = 0) then exit(false);
- setlength(pts, PointCount);
+ setlength({%H-}pts, PointCount);
for i := 0 to high(pts) do
pts[i] := AMatrix * Points[i];
@@ -1434,7 +1498,7 @@ function TCurveShape.GetCurve(AMatrix: TAffineMatrix): ArrayOfTPointF;
pts := inherited GetCurve(AMatrix);
if FSplineStyle = ssEasyBezier then
begin
- setlength(cm, PointCount);
+ setlength({%H-}cm, PointCount);
for i := 0 to PointCount-1 do
cm[i] := CurveMode[i];
eb := EasyBezierCurve(pts, Closed, cm, CosineAngle);
@@ -1454,18 +1518,19 @@ function TCurveShape.GetPath(AMatrix: TAffineMatrix): TBGRAPath;
eb: TEasyBezierCurve;
begin
pts := inherited GetCurve(AMatrix);
- result := TBGRAPath.Create;
if FSplineStyle = ssEasyBezier then
begin
- setlength(cm, PointCount);
+ setlength({%H-}cm, PointCount);
for i := 0 to PointCount-1 do
cm[i] := CurveMode[i];
eb := EasyBezierCurve(pts, Closed, cm, CosineAngle);
+ result := TBGRAPath.Create;
eb.CopyToPath(result);
end else
begin
- if Closed then result.closedSpline(pts, FSplineStyle)
- else result.openedSpline(pts, FSplineStyle);
+ if Closed then pts := ComputeClosedSpline(pts, FSplineStyle)
+ else pts := ComputeOpenedSpline(pts, FSplineStyle);
+ result := GetPath(pts);
end;
end;
@@ -1664,7 +1729,7 @@ procedure TCurveShape.SaveToStorage(AStorage: TBGRACustomOriginalStorage);
AStorage.RawString['spline-style'] := s;
if SplineStyle = ssEasyBezier then
begin
- setlength(cm, PointCount);
+ setlength({%H-}cm, PointCount);
for i := 0 to PointCount-1 do
cm[i] := ord(CurveMode[i]);
AStorage.FloatArray['curve-mode'] := cm;
diff --git a/lazpaintcontrols/lcvectorrectshapes.pas b/lazpaintcontrols/lcvectorrectshapes.pas
index d1ad5ac0..ae21fc94 100644
--- a/lazpaintcontrols/lcvectorrectshapes.pas
+++ b/lazpaintcontrols/lcvectorrectshapes.pas
@@ -988,7 +988,7 @@ procedure TRectShape.Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix;
i: Integer;
begin
pts := GetAffineBox(AMatrix, true).AsPolygon;
- If GetBackVisible then
+ If GetBackVisible and (Width <> 0) and (Height <> 0) then
begin
if (BackFill.FillType = vftSolid) then backScan := nil
else backScan := BackFill.CreateScanner(AMatrix, ADraft);
@@ -1101,6 +1101,7 @@ function TRectShape.GetRenderBounds(ADestRect: TRect; AMatrix: TAffineMatrix; AO
begin
pts := ComputeStroke(GetAffineBox(AMatrix, false).AsPolygon, true, AMatrix);
for i := 0 to high(pts) do
+ if not IsEmptyPointF(pts[i]) then
begin
if pts[i].x < result.Left then result.Left := pts[i].x;
if pts[i].x > result.Right then result.Right := pts[i].x;
diff --git a/lazpaintcontrols/lcvectortextshapes.pas b/lazpaintcontrols/lcvectortextshapes.pas
index 73ac5b89..c63bf94c 100644
--- a/lazpaintcontrols/lcvectortextshapes.pas
+++ b/lazpaintcontrols/lcvectortextshapes.pas
@@ -101,15 +101,15 @@ TTextShape = class(TCustomRectShape)
function GetHasSelection: boolean;
function GetParagraphAlignment: TAlignment;
procedure InvalidateParagraphLayout(AFrom, ATo: integer);
- procedure LayoutBrokenLinesChanged(ASender: TObject;
+ procedure LayoutBrokenLinesChanged({%H-}ASender: TObject;
AParagraphIndex: integer; ASubBrokenStart, ASubBrokenChangedCountBefore,
ASubBrokenChangedCountAfter: integer; ASubBrokenTotalCountBefore,
ASubBrokenTotalCountAfter: integer);
- procedure LayoutParagraphDeleted(ASender: TObject; AParagraphIndex: integer);
- procedure LayoutParagraphMergedWithNext(ASender: TObject;
+ procedure LayoutParagraphDeleted({%H-}ASender: TObject; AParagraphIndex: integer);
+ procedure LayoutParagraphMergedWithNext({%H-}ASender: TObject;
AParagraphIndex: integer);
- procedure LayoutParagraphSplit(ASender: TObject; AParagraphIndex: integer;
- ASubBrokenIndex, ACharIndex: integer);
+ procedure LayoutParagraphSplit({%H-}ASender: TObject; AParagraphIndex: integer;
+ {%H-}ASubBrokenIndex, {%H-}ACharIndex: integer);
procedure OnMoveLightPos({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF;
{%H-}AShift: TShiftState);
procedure SetAliased(AValue: boolean);
@@ -153,6 +153,7 @@ TTextShape = class(TCustomRectShape)
procedure InsertUnicodeValue;
procedure FillChange(ASender: TObject; var ADiff: TCustomVectorialFillDiff); override;
procedure InvalidateAll;
+ function GetVerticalAlignMatrix(tl: TBidiTextLayout): TAffineMatrix;
public
constructor Create(AContainer: TVectorOriginal); override;
procedure QuickDefine(constref APoint1,APoint2: TPointF); override;
@@ -685,6 +686,7 @@ procedure TTextShape.SetAliased(AValue: boolean);
if FAliased=AValue then Exit;
BeginUpdate(TTextShapeFontDiff);
FAliased:=AValue;
+ InvalidateAll;
EndUpdate;
end;
@@ -818,6 +820,7 @@ procedure TTextShape.SetVertAlign(AValue: TTextLayout);
if FVertAlign=AValue then Exit;
BeginUpdate(TTextShapeTextDiff);
FVertAlign:=AValue;
+ InvalidateAll; // could be more subtle
EndUpdate;
end;
@@ -1073,6 +1076,19 @@ procedure TTextShape.InvalidateAll;
FParagraphLayout := nil;
end;
+function TTextShape.GetVerticalAlignMatrix(tl: TBidiTextLayout): TAffineMatrix;
+var
+ th: Single;
+begin
+ th := max(tl.TotalTextHeight - tl.ParagraphSpacingBelow * tl.LineHeight, 0);
+ if th < tl.AvailableHeight then
+ case VerticalAlignment of
+ tlBottom: exit(AffineMatrixTranslation(0, tl.AvailableHeight-th));
+ tlCenter: exit(AffineMatrixTranslation(0, (tl.AvailableHeight-th)/2));
+ end;
+ exit(AffineMatrixIdentity);
+end;
+
constructor TTextShape.Create(AContainer: TVectorOriginal);
begin
inherited Create(AContainer);
@@ -1175,6 +1191,11 @@ procedure TTextShape.LoadFromStorage(AStorage: TBGRACustomOriginalStorage);
tl.ParagraphAlignment[i] := AlignmentToBidiTextAlignment(alignment, tl.ParagraphRightToLeft[i]);
end;
paraAlignList.Free;
+ case AStorage.RawString['vertical-align'] of
+ 'middle': VerticalAlignment:= tlCenter;
+ 'bottom': VerticalAlignment:= tlBottom;
+ else VerticalAlignment:= tlTop;
+ end;
EndUpdate;
end;
@@ -1219,6 +1240,11 @@ procedure TTextShape.SaveToStorage(AStorage: TBGRACustomOriginalStorage);
end;
AStorage.RawString['paragraph-align'] := paraAlignList.DelimitedText;
paraAlignList.Free;
+ case VerticalAlignment of
+ tlTop: AStorage.RemoveAttribute('vertical-align');
+ tlCenter: AStorage.RawString['vertical-align'] := 'middle';
+ tlBottom: AStorage.RawString['vertical-align'] := 'bottom';
+ end;
end;
destructor TTextShape.Destroy;
@@ -1276,7 +1302,7 @@ procedure TTextShape.ConfigureCustomEditor(AEditor: TBGRAOriginalEditor);
tl := GetTextLayout;
caret:= tl.GetCaret(FSelEnd);
zoom := GetTextRenderZoom;
- m := AffineMatrixTranslation(-0.5,-0.5)*GetUntransformedMatrix*AffineMatrixScale(1/zoom,1/zoom);
+ m := AffineMatrixTranslation(-0.5,-0.5)*GetUntransformedMatrix*AffineMatrixScale(1/zoom,1/zoom)*GetVerticalAlignMatrix(tl);
if FSelStart<>FSelEnd then
begin
pts := tl.GetTextEnveloppe(FSelStart, FSelEnd, false, true, true);
@@ -1730,7 +1756,7 @@ procedure TTextShape.Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix:
TAffineBox.AffineBox(sourceRectF);
wholeImage := TAffineBox.AffineBox(PointF(-1,-1), PointF(-1,ADest.Height+1),
PointF(ADest.Width+1,-1));
- ADest.FillMode := fmWinding;
+ ADest.FillMode := fmAlternate;
ADest.ErasePolyAntialias( ConcatPointsF([wholeImage.AsPolygon, maskBox.AsPolygon], true),
255, false);
end;
@@ -1760,6 +1786,7 @@ procedure TTextShape.Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix:
tl := GetTextLayout;
sourceRectF := RectF(-pad,0,tl.AvailableWidth+pad,min(tl.TotalTextHeight,tl.AvailableHeight));
+ m *= GetVerticalAlignMatrix(tl);
if CanHaveRenderStorage then
begin
@@ -1832,12 +1859,6 @@ procedure TTextShape.Render(ADest: TBGRABitmap; ARenderOffset: TPoint; AMatrix:
sourceRectF.Right := floor(sourceRectF.Right);
sourceRectF.Bottom := sourceRectF.Bottom;
- if tl.TotalTextHeight < tl.AvailableHeight then
- case VerticalAlignment of
- tlBottom: m *= AffineMatrixTranslation(0, tl.AvailableHeight-tl.TotalTextHeight);
- tlCenter: m *= AffineMatrixTranslation(0, (tl.AvailableHeight-tl.TotalTextHeight)/2);
- end;
-
with transfRectF do
transfRect := Rect(floor(Left),floor(Top),ceil(Right),ceil(Bottom));
@@ -2147,7 +2168,7 @@ procedure TTextShape.KeyDown(Shift: TShiftState; Key: TSpecialKey;
else DeleteTextAfter(1);
AHandled:= true;
end else
- if Key in [skLeft,skRight] then
+ if (Key in [skLeft,skRight]) and not (ssAlt in Shift) then
begin
tl := GetTextLayout;
if (Key = skLeft) xor tl.ParagraphRightToLeft[tl.GetParagraphAt(FSelEnd)] then
@@ -2167,7 +2188,7 @@ procedure TTextShape.KeyDown(Shift: TShiftState; Key: TSpecialKey;
end;
AHandled := true;
end else
- if Key in [skUp,skDown] then
+ if (Key in [skUp,skDown]) and not (ssAlt in Shift) then
begin
tl := GetTextLayout;
if Key = skUp then
@@ -2289,10 +2310,13 @@ procedure TTextShape.KeyPress(UTF8Key: string; var AHandled: boolean);
begin
Usermode := vsuEditText;
InsertText(UTF8Key);
+ AHandled := true;
end;
end else
+ begin
InsertText(UTF8Key);
- AHandled := true;
+ AHandled := true;
+ end;
end;
end;
@@ -2455,8 +2479,9 @@ function TTextShape.AppendToSVG(AContent: TSVGContent; ADefs: TSVGDefine): TSVGE
else span.textDirection:= stdLtr;
with rF do
begin
- setlength(a, 1);
+ setlength({%H-}a, 1);
a[0] := FloatWithCSSUnit(Left/zoom, cuCustom);
+ if span.textDirection = stdRtl then a[0].value += Width/zoom;
span.x := a;
a[0] := FloatWithCSSUnit((Top + fm.Baseline)/zoom, cuCustom);
span.y := a;
diff --git a/resources/scripts/lazpaint/tools.py b/resources/scripts/lazpaint/tools.py
index 6ff47f18..8dcf7431 100644
--- a/resources/scripts/lazpaint/tools.py
+++ b/resources/scripts/lazpaint/tools.py
@@ -67,6 +67,10 @@
ALIGN_CENTER = 'Center'
ALIGN_RIGHT = 'Right'
+BIDI_AUTO = 'BidiAuto'
+BIDI_LEFT_TO_RIGHT = 'LeftToRight'
+BIDI_RIGHT_TO_LEFT = 'RightToLeft'
+
SHAPE_OPTION_DRAW_SHAPE = 'DrawShape'
SHAPE_OPTION_FILL_SHAPE = 'FillShape'
SHAPE_OPTION_CLOSE_SHAPE = 'CloseShape'
@@ -345,6 +349,12 @@ def set_text_align(align):
def get_text_align():
return command.send('ToolGetTextAlign?')
+def set_text_bidi_mode(bidi_mode):
+ command.send('ToolSetTextBidiMode', BidiMode=bidi_mode)
+
+def get_text_bidi_mode():
+ return command.send('ToolGetTextBidiMode?')
+
def set_text_outline(width: float):
command.send('ToolSetTextOutline', Width=width)
diff --git a/resources/vector/textalignbottom32.lzp b/resources/vector/textalignbottom32.lzp
new file mode 100644
index 00000000..a6dd9ace
Binary files /dev/null and b/resources/vector/textalignbottom32.lzp differ
diff --git a/resources/vector/textalignbottom32.svg b/resources/vector/textalignbottom32.svg
new file mode 100644
index 00000000..fc6ff08e
--- /dev/null
+++ b/resources/vector/textalignbottom32.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/resources/vector/textalignmiddle32.lzp b/resources/vector/textalignmiddle32.lzp
new file mode 100644
index 00000000..d1a16b9f
Binary files /dev/null and b/resources/vector/textalignmiddle32.lzp differ
diff --git a/resources/vector/textalignmiddle32.svg b/resources/vector/textalignmiddle32.svg
new file mode 100644
index 00000000..232e1ff0
--- /dev/null
+++ b/resources/vector/textalignmiddle32.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/resources/vector/textaligntop32.lzp b/resources/vector/textaligntop32.lzp
new file mode 100644
index 00000000..3efdd4b7
Binary files /dev/null and b/resources/vector/textaligntop32.lzp differ
diff --git a/resources/vector/textaligntop32.svg b/resources/vector/textaligntop32.svg
new file mode 100644
index 00000000..d36821a7
--- /dev/null
+++ b/resources/vector/textaligntop32.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/resources/vector/textbold32.svg b/resources/vector/textbold32.svg
new file mode 100644
index 00000000..7fa424de
--- /dev/null
+++ b/resources/vector/textbold32.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/resources/vector/textdirectionany32.svg b/resources/vector/textdirectionany32.svg
new file mode 100644
index 00000000..e12eb55a
--- /dev/null
+++ b/resources/vector/textdirectionany32.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/resources/vector/textdirectionltr32.svg b/resources/vector/textdirectionltr32.svg
new file mode 100644
index 00000000..6c475694
--- /dev/null
+++ b/resources/vector/textdirectionltr32.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/resources/vector/textdirectionrtl32.svg b/resources/vector/textdirectionrtl32.svg
new file mode 100644
index 00000000..1acd00f4
--- /dev/null
+++ b/resources/vector/textdirectionrtl32.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/resources/vector/textitalic32.svg b/resources/vector/textitalic32.svg
new file mode 100644
index 00000000..22d63cf1
--- /dev/null
+++ b/resources/vector/textitalic32.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/resources/vector/textstrikeout32.svg b/resources/vector/textstrikeout32.svg
new file mode 100644
index 00000000..f5fdc58d
--- /dev/null
+++ b/resources/vector/textstrikeout32.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/resources/vector/textunderline32.svg b/resources/vector/textunderline32.svg
new file mode 100644
index 00000000..cf3b453a
--- /dev/null
+++ b/resources/vector/textunderline32.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/web/config.toml b/web/config.toml
index cc07da77..e8c10eda 100644
--- a/web/config.toml
+++ b/web/config.toml
@@ -5,7 +5,7 @@ disableKinds = ["taxonomyTerm"]
[params]
repo = "https://github.com/bgrabitmap/lazpaint/releases/download/"
- version = "7.1.6"
+ version = "7.2"
[languages]
[languages.de]