Browse Source

svg or custom alignment

Johann ELSASS 5 years ago
parent
commit
c3d8a8f998

+ 64 - 20
bcsvgviewer.pas

@@ -27,6 +27,7 @@ type
     FProportional: boolean;
     FStretchMode: TBCStretchMode;
     FDestDPI: single;
+    FUseSVGAlignment: boolean;
     FVertAlign: TTextLayout;
     Fx: single;
     Fy: single;
@@ -39,6 +40,7 @@ type
     procedure SetHorizAlign(AValue: TAlignment);
     procedure SetProportional(AValue: boolean);
     procedure SetStretchMode(AValue: TBCStretchMode);
+    procedure SetUseSVGAlignment(AValue: boolean);
     procedure SetVertAlign(AValue: TTextLayout);
   protected
     FSVG: TBGRASVG;
@@ -49,6 +51,7 @@ type
     procedure LoadFromFile(AFileName: string);
     procedure LoadFromResource(Resource: string);
     function GetSVGRectF: TRectF;
+    function GetSVGContainerRectF: TRectF;
   published
     { Published declarations }
     property Align;
@@ -71,6 +74,7 @@ type
     property Proportional: boolean read FProportional write SetProportional default True;
     property DrawCheckers: boolean
       read FDrawCheckers write SetDrawCheckers default False;
+    property UseSVGAlignment: boolean read FUseSVGAlignment write SetUseSVGAlignment default False;
     property Color;
     property ColorOpacity;
     property OnClick;
@@ -91,7 +95,7 @@ type
 
 implementation
 
-uses BGRAVectorize;
+uses BGRAVectorize, math;
 
 {$IFDEF FPC}
 procedure Register;
@@ -170,6 +174,13 @@ begin
   DiscardBitmap;
 end;
 
+procedure TBCSVGViewer.SetUseSVGAlignment(AValue: boolean);
+begin
+  if FUseSVGAlignment=AValue then Exit;
+  FUseSVGAlignment:=AValue;
+  DiscardBitmap;
+end;
+
 procedure TBCSVGViewer.SetVertAlign(AValue: TTextLayout);
 begin
   if FVertAlign = AValue then
@@ -186,17 +197,17 @@ begin
   if (FBGRA <> nil) and (FBGRA.NbPixels <> 0) then
   begin
     r := GetSVGRectF;
+    FBGRA.Fill(ColorToBGRA(ColorToRGB(Color), ColorOpacity));
     if FDrawCheckers then
     begin
       checkersSize := round(8 * DestDPI / 96 * BitmapScale);
-      FBGRA.DrawCheckers(rect(0, 0, FBGRA.Width, FBGRA.Height), CSSWhite, CSSSilver,
-        checkersSize, checkersSize);
-      FBGRA.RectangleAntialias(r.Left, r.Top, r.Right, r.Bottom, BGRA(255, 0, 0, 160), 1);
-    end
-    else
-      FBGRA.Fill(ColorToBGRA(ColorToRGB(Color), ColorOpacity));
+      with GetSVGContainerRectF do
+        FBGRA.DrawCheckers(rect(floor(Left), floor(Top),
+          ceil(right), ceil(Bottom)), CSSWhite, CSSSilver,
+          checkersSize, checkersSize);
+    end;
     FBGRA.Canvas2D.FontRenderer := TBGRAVectorizedFontRenderer.Create;
-    FSVG.StretchDraw(FBGRA.Canvas2D, r);
+    FSVG.StretchDraw(FBGRA.Canvas2D, r, UseSVGAlignment);
     if Assigned(OnRedraw) then
       OnRedraw(self, FBGRA);
   end;
@@ -205,7 +216,7 @@ end;
 constructor TBCSVGViewer.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
-  FSVG := TBGRASVG.Create(Width, Height, TCSSUnit.cuPixel);
+  FSVG := TBGRASVG.Create(100, 100, TCSSUnit.cuPercent);
   FDestDPI := 96;
   Fx := 0;
   Fy := 0;
@@ -214,6 +225,7 @@ begin
   FVertAlign := tlCenter;
   FProportional := True;
   FBitmapAutoScale := False;
+  FUseSVGAlignment:= false;
 end;
 
 destructor TBCSVGViewer.Destroy;
@@ -237,10 +249,10 @@ end;
 function TBCSVGViewer.GetSVGRectF: TRectF;
 var
   vbSize: TPointF;
-  w, h: integer;
-  dpi: double;
+  w, h, dpi: single;
+  containerRect: TRectF;
 
-  procedure NoStretch(AX, AY: single);
+  function NoStretch(AX, AY: single): TRectF;
   begin
     case HorizAlign of
       taCenter: Result.Left := (w - vbSize.x) / 2;
@@ -259,15 +271,19 @@ var
   end;
 
 begin
-  Result := RectF(0, 0, 0, 0);
-  if FSVG = nil then
-    exit;
-  w := BitmapWidth;
-  h := BitmapHeight;
+  if FSVG = nil then exit(EmptyRectF);
+
+  containerRect := GetSVGContainerRectF;
+  w := containerRect.Width;
+  h := containerRect.Height;
   dpi := DestDPI * BitmapScale;
 
   FSVG.Units.ContainerWidth := FloatWithCSSUnit(w * FSVG.Units.DpiX / dpi, cuPixel);
   FSVG.Units.ContainerHeight := FloatWithCSSUnit(h * FSVG.Units.DpiY / dpi, cuPixel);
+
+  if UseSVGAlignment then
+    exit(FSVG.GetStretchRectF(containerRect.Left, containerRect.Top, containerRect.Width, containerRect.Height));
+
   vbSize := FSVG.ViewSizeInUnit[cuPixel];
   vbSize.x := vbSize.x * (dpi / FSVG.Units.DpiX);
   vbSize.y := vbSize.y * (dpi / FSVG.Units.DpiY);
@@ -295,9 +311,37 @@ begin
       Result := RectF(0, 0, w, h);
   end
   else
-  begin
-    NoStretch(x, y);
-  end;
+    result := NoStretch(x, y);
+
+  result.Offset(containerRect.Left, containerRect.Top);
+end;
+
+function TBCSVGViewer.GetSVGContainerRectF: TRectF;
+var
+  w, h: Integer;
+  dpi, ratioX, ratioY, ratio: single;
+begin
+  w := BitmapWidth;
+  h := BitmapHeight;
+  dpi := DestDPI * BitmapScale;
+  Result := RectF(0, 0, w, h);
+
+  if (FSVG = nil) or not UseSVGAlignment then exit;
+
+  FSVG.Units.ContainerWidth := FloatWithCSSUnit(w * FSVG.Units.DpiX / dpi, cuPixel);
+  FSVG.Units.ContainerHeight := FloatWithCSSUnit(h * FSVG.Units.DpiY / dpi, cuPixel);
+
+  if (FSVG = nil) or (FSVG.WidthAsPixel = 0) or
+    (FSVG.HeightAsPixel = 0) or (BitmapWidth = 0)
+    or (BitmapHeight = 0) then exit(EmptyRectF);
+
+  ratioX := BitmapWidth / FSVG.WidthAsPixel;
+  ratioY := BitmapHeight / FSVG.HeightAsPixel;
+  ratio := min(ratioX, ratioY);
+  result := RectWithSizeF(0, 0, FSVG.WidthAsPixel * ratio,
+              FSVG.HeightAsPixel * ratio);
+  result.Offset((BitmapWidth - result.Width) / 2,
+    (BitmapHeight - result.Height) / 2);
 end;
 
 end.

+ 73 - 18
bgrasvgimagelist.pas

@@ -17,8 +17,11 @@ type
   TBGRASVGImageList = class(TComponent)
   private
     FHeight: integer;
+    FHorizontalAlignment: TAlignment;
     FItems: TListOfTStringList;
     FReferenceDPI: integer;
+    FUseSVGAlignment: boolean;
+    FVerticalAlignment: TTextLayout;
     FWidth: integer;
     procedure ReadData(Stream: TStream);
     procedure SetHeight(AValue: integer);
@@ -40,27 +43,36 @@ type
     procedure Replace(AIndex: integer; ASVG: string);
     function GetSize(ATargetDPI: integer): TSize;
     // Get TBGRABitmap with custom width and height
+    function GetBGRABitmap(AIndex: integer; AWidth, AHeight: integer): TBGRABitmap; overload;
     function GetBGRABitmap(AIndex: integer; AWidth, AHeight: integer;
-      UseSVGAspectRatio: boolean = True): TBGRABitmap; overload;
+      AUseSVGAlignment: boolean): TBGRABitmap; overload;
     // Get TBitmap with custom width and height
+    function GetBitmap(AIndex: integer; AWidth, AHeight: integer): TBitmap; overload;
     function GetBitmap(AIndex: integer; AWidth, AHeight: integer;
-      UseSVGAspectRatio: boolean = True): TBitmap; overload;
+      AUseSVGAlignment: boolean): TBitmap; overload;
     // Draw image with default width and height scaled to the DPI of the control.
+    procedure Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas; ALeft, ATop: integer); overload;
     procedure Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas; ALeft, ATop: integer;
-      UseSVGAspectRatio: boolean = True; AOpacity: byte = 255); overload;
+      AUseSVGAlignment: boolean; AOpacity: byte = 255); overload;
     // Draw image with default width and height scaled to a custom DPI in LCL coordinates.
+    procedure Draw(AIndex: integer; AControl: TControl; ATargetDPI: integer;
+      ACanvas: TCanvas; ALeft, ATop: integer); overload;
     procedure Draw(AIndex: integer; AControl: TControl; ATargetDPI: integer; ACanvas: TCanvas;
-      ALeft, ATop: integer; UseSVGAspectRatio: boolean = True; AOpacity: byte = 255); overload;
+      ALeft, ATop: integer; AUseSVGAlignment: boolean; AOpacity: byte = 255); overload;
     // Draw image with custom width and height. The Width and
     // Height property are in LCL coordinates.
     procedure Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas;
-      ALeft, ATop, AWidth, AHeight: integer; UseSVGAspectRatio: boolean = True;
+      ALeft, ATop, AWidth, AHeight: integer); overload;
+    procedure Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas;
+      ALeft, ATop, AWidth, AHeight: integer; AUseSVGAlignment: boolean;
       AOpacity: byte = 255); overload;
     // Draw image with custom width, height and canvas scale. The Width and
     // Height property are in LCL coordinates. CanvasScale is useful on MacOS
     // where LCL coordinates do not match actual pixels.
     procedure Draw(AIndex: integer; ACanvasScale: single; ACanvas: TCanvas;
-      ALeft, ATop, AWidth, AHeight: integer; UseSVGAspectRatio: boolean = True;
+      ALeft, ATop, AWidth, AHeight: integer); overload;
+    procedure Draw(AIndex: integer; ACanvasScale: single; ACanvas: TCanvas;
+      ALeft, ATop, AWidth, AHeight: integer; AUseSVGAlignment: boolean;
       AOpacity: byte = 255); overload;
 
     // Generate bitmaps for an image list
@@ -71,6 +83,9 @@ type
     property Width: integer read FWidth write SetWidth;
     property Height: integer read FHeight write SetHeight;
     property ReferenceDPI: integer read FReferenceDPI write FReferenceDPI default 96;
+    property UseSVGAlignment: boolean read FUseSVGAlignment write FUseSVGAlignment default False;
+    property HorizontalAlignment: TAlignment read FHorizontalAlignment write FHorizontalAlignment default taCenter;
+    property VerticalAlignment: TTextLayout read FVerticalAlignment write FVerticalAlignment default tlCenter;
   end;
 
 procedure Register;
@@ -169,6 +184,9 @@ begin
   FWidth := 16;
   FHeight := 16;
   FReferenceDPI := 96;
+  FUseSVGAlignment:= false;
+  FHorizontalAlignment := taCenter;
+  FVerticalAlignment := tlCenter;
 end;
 
 destructor TBGRASVGImageList.Destroy;
@@ -217,8 +235,14 @@ begin
   result.cy := MulDiv(Height, ATargetDPI, ReferenceDPI);
 end;
 
+function TBGRASVGImageList.GetBGRABitmap(AIndex: integer; AWidth,
+  AHeight: integer): TBGRABitmap;
+begin
+  result := GetBGRABitmap(AIndex, AWidth, AHeight, UseSVGAlignment);
+end;
+
 function TBGRASVGImageList.GetBGRABitmap(AIndex: integer; AWidth, AHeight: integer;
-  UseSVGAspectRatio: boolean): TBGRABitmap;
+  AUseSVGAlignment: boolean): TBGRABitmap;
 var
   bmp: TBGRABitmap;
   svg: TBGRASVG;
@@ -226,20 +250,25 @@ begin
   bmp := TBGRABitmap.Create(AWidth, AHeight);
   svg := TBGRASVG.CreateFromString(FItems[AIndex].Text);
   try
-    svg.StretchDraw(bmp.Canvas2D, 0, 0, AWidth, AHeight, UseSVGAspectRatio);
+    svg.StretchDraw(bmp.Canvas2D, 0, 0, AWidth, AHeight, AUseSVGAlignment);
   finally
     svg.Free;
   end;
   Result := bmp;
 end;
 
+function TBGRASVGImageList.GetBitmap(AIndex: integer; AWidth, AHeight: integer): TBitmap;
+begin
+  result := GetBitmap(AIndex, AWidth, AHeight, UseSVGAlignment);
+end;
+
 function TBGRASVGImageList.GetBitmap(AIndex: integer; AWidth, AHeight: integer;
-  UseSVGAspectRatio: boolean): TBitmap;
+  AUseSVGAlignment: boolean): TBitmap;
 var
   bmp: TBGRABitmap;
   ms: TMemoryStream;
 begin
-  bmp := GetBGRABitmap(AIndex, AWidth, AHeight, UseSVGAspectRatio);
+  bmp := GetBGRABitmap(AIndex, AWidth, AHeight, AUseSVGAlignment);
   ms := TMemoryStream.Create;
   bmp.Bitmap.SaveToStream(ms);
   bmp.Free;
@@ -249,8 +278,14 @@ begin
   ms.Free;
 end;
 
+procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl;
+  ACanvas: TCanvas; ALeft, ATop: integer);
+begin
+  Draw(AIndex, AControl, ACanvas, ALeft, ATop, UseSVGAlignment);
+end;
+
 procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas;
-  ALeft, ATop: integer; UseSVGAspectRatio: boolean; AOpacity: byte);
+  ALeft, ATop: integer; AUseSVGAlignment: boolean; AOpacity: byte);
 var
   parentForm: TCustomForm;
   targetDPI: Integer;
@@ -258,26 +293,44 @@ begin
   parentForm := GetParentForm(AControl);
   if parentForm <> nil then targetDPI := parentForm.PixelsPerInch
   else targetDPI := Screen.PixelsPerInch;
-  Draw(AIndex, AControl, targetDPI, ACanvas, ALeft, ATop, UseSVGAspectRatio, AOpacity);
+  Draw(AIndex, AControl, targetDPI, ACanvas, ALeft, ATop, AUseSVGAlignment, AOpacity);
+end;
+
+procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl;
+  ATargetDPI: integer; ACanvas: TCanvas; ALeft, ATop: integer);
+begin
+  Draw(AIndex, AControl, ATargetDPI, ACanvas, ALeft, ATop, UseSVGAlignment);
 end;
 
 procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl;
   ATargetDPI: integer; ACanvas: TCanvas; ALeft, ATop: integer;
-  UseSVGAspectRatio: boolean; AOpacity: byte);
+  AUseSVGAlignment: boolean; AOpacity: byte);
 begin
   with GetSize(ATargetDPI) do
-    Draw(AIndex, AControl, ACanvas, ALeft, ATop, cx, cy, UseSVGAspectRatio, AOpacity);
+    Draw(AIndex, AControl, ACanvas, ALeft, ATop, cx, cy, AUseSVGAlignment, AOpacity);
+end;
+
+procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl;
+  ACanvas: TCanvas; ALeft, ATop, AWidth, AHeight: integer);
+begin
+  Draw(AIndex, AControl, ACanvas, ALeft, ATop, AWidth, AHeight, UseSVGAlignment);
 end;
 
 procedure TBGRASVGImageList.Draw(AIndex: integer; AControl: TControl; ACanvas: TCanvas;
-  ALeft, ATop, AWidth, AHeight: integer; UseSVGAspectRatio: boolean; AOpacity: byte);
+  ALeft, ATop, AWidth, AHeight: integer; AUseSVGAlignment: boolean; AOpacity: byte);
 begin
   Draw(AIndex, AControl.GetCanvasScaleFactor, ACanvas, ALeft, ATop, AWidth, AHeight,
-       UseSVGAspectRatio, AOpacity);
+       AUseSVGAlignment, AOpacity);
+end;
+
+procedure TBGRASVGImageList.Draw(AIndex: integer; ACanvasScale: single;
+  ACanvas: TCanvas; ALeft, ATop, AWidth, AHeight: integer);
+begin
+  Draw(AIndex, ACanvasScale, ACanvas, ALeft, ATop, AWidth, AHeight, UseSVGAlignment);
 end;
 
 procedure TBGRASVGImageList.Draw(AIndex: integer; ACanvasScale: single; ACanvas: TCanvas;
-  ALeft, ATop, AWidth, AHeight: integer; UseSVGAspectRatio: boolean; AOpacity: byte);
+  ALeft, ATop, AWidth, AHeight: integer; AUseSVGAlignment: boolean; AOpacity: byte);
 var
   bmp: TBGRABitmap;
   svg: TBGRASVG;
@@ -287,7 +340,9 @@ begin
   bmp := TBGRABitmap.Create(round(AWidth * ACanvasScale), round(AHeight * ACanvasScale));
   svg := TBGRASVG.CreateFromString(FItems[AIndex].Text);
   try
-    svg.StretchDraw(bmp.Canvas2D, 0, 0, bmp.Width, bmp.Height, UseSVGAspectRatio);
+    if AUseSVGAlignment then
+      svg.StretchDraw(bmp.Canvas2D, 0, 0, bmp.Width, bmp.Height, true)
+      else svg.StretchDraw(bmp.Canvas2D, HorizontalAlignment, VerticalAlignment, 0, 0, bmp.Width, bmp.Height);
     bmp.ApplyGlobalOpacity(AOpacity);
     bmp.Draw(ACanvas, RectWithSize(ALeft, ATop, AWidth, AHeight), False);
   finally

+ 280 - 6
bgrasvgimagelistform/bgrasvgimagelistform.lfm

@@ -1,10 +1,10 @@
 object frmBGRASVGImageListEditor: TfrmBGRASVGImageListEditor
   Left = 480
-  Height = 240
+  Height = 268
   Top = 141
   Width = 484
   Caption = 'BGRA SVG Image List'
-  ClientHeight = 240
+  ClientHeight = 268
   ClientWidth = 484
   LCLVersion = '2.0.10.0'
   object ListBox1: TListBox
@@ -12,11 +12,14 @@ object frmBGRASVGImageListEditor: TfrmBGRASVGImageListEditor
     Height = 192
     Top = 40
     Width = 315
+    Anchors = [akTop, akLeft, akBottom]
     ItemHeight = 16
     OnDrawItem = ListBox1DrawItem
     OnSelectionChange = ListBox1SelectionChange
+    ScrollWidth = 313
     Style = lbOwnerDrawFixed
     TabOrder = 0
+    TopIndex = -1
   end
   object btnAdd: TButton
     Left = 8
@@ -59,12 +62,13 @@ object frmBGRASVGImageListEditor: TfrmBGRASVGImageListEditor
   end
   object BCSVGViewerPreview: TBCSVGViewer
     Left = 328
-    Height = 144
-    Top = 56
+    Height = 192
+    Top = 40
     Width = 144
-    SVGString = '<?xml version="1.0" encoding="utf-8"?>'#13#10'<svg width="75px" xmlns="http://www.w3.org/2000/svg" height="50px"/>'#13#10
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    SVGString = '<?xml version="1.0" encoding="utf-8"?>'#10'<svg width="100%" xmlns="http://www.w3.org/2000/svg" height="100%"/>'#10
     DrawCheckers = True
-    Color = clWhite
+    Color = clForm
     ColorOpacity = 128
     Caption = 'BCSVGViewerPreview'
   end
@@ -78,9 +82,279 @@ object frmBGRASVGImageListEditor: TfrmBGRASVGImageListEditor
     OnClick = btnReplaceClick
     TabOrder = 5
   end
+  object CheckBox_UseSVGAlignment: TCheckBox
+    Left = 13
+    Height = 23
+    Top = 237
+    Width = 239
+    Anchors = [akLeft, akBottom]
+    Caption = 'Use SVG alignment and aspect ratio'
+    OnChange = CheckBox_UseSVGAlignmentChange
+    TabOrder = 6
+  end
+  object ToolBar1: TToolBar
+    Left = 323
+    Height = 26
+    Top = 232
+    Width = 147
+    Align = alNone
+    Caption = 'ToolBar1'
+    Images = ImageList1
+    TabOrder = 7
+    object ToolButton_AlignLeft: TToolButton
+      Left = 1
+      Top = 2
+      Grouped = True
+      ImageIndex = 0
+      OnClick = ToolButton_AlignLeftClick
+    end
+    object ToolButton_AlignCenter: TToolButton
+      Left = 24
+      Top = 2
+      Grouped = True
+      ImageIndex = 1
+      OnClick = ToolButton_AlignCenterClick
+    end
+    object ToolButton_AlignRight: TToolButton
+      Left = 47
+      Top = 2
+      Caption = 'ToolButton_AlignRight'
+      Grouped = True
+      ImageIndex = 2
+      OnClick = ToolButton_AlignRightClick
+    end
+    object ToolButton1: TToolButton
+      Left = 70
+      Height = 22
+      Top = 2
+      Caption = 'ToolButton_Divider'
+      Style = tbsDivider
+    end
+    object ToolButton_AlignTop: TToolButton
+      Left = 75
+      Top = 2
+      Grouped = True
+      ImageIndex = 3
+      OnClick = ToolButton_AlignTopClick
+    end
+    object ToolButton_AlignVCenter: TToolButton
+      Left = 98
+      Top = 2
+      Grouped = True
+      ImageIndex = 4
+      OnClick = ToolButton_AlignVCenterClick
+    end
+    object ToolButton_AlignBottom: TToolButton
+      Left = 121
+      Top = 2
+      Grouped = True
+      ImageIndex = 5
+      OnClick = ToolButton_AlignBottomClick
+    end
+  end
   object OpenDialog1: TOpenDialog
     Filter = 'SVG|*.svg'
     Left = 166
     Top = 76
   end
+  object ImageList1: TImageList
+    Scaled = True
+    Left = 247
+    Top = 140
+    Bitmap = {
+      4C69060000001000000010000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FFFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FFFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FFFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FFFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7F010000FF010000FF010000FF010000FF010000FF7B7B7BC6FFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7F0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FFFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7F010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FFFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7F010000FF010000FF010000FF010000FF010000FF7B7B7BC6FFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7F010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7F010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7F0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7F010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7F010000FF010000FF010000FF010000FF010000FF7B7B7BC6FFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7F0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FFFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7F010000FF010000FF010000FF010000FF010000FF7B7B7BC6FFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7F0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FFFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7F010000FF010000FF0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FF0100
+      00FF010000FFFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7F010000FF010000FF010000FF010000FF010000FF7B7B7BC6FFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7F0100
+      00FF010000FF010000FF010000FF010000FF010000FF010000FF010000FFFFFF
+      FF7FFFFFFF7FFFFFFF7F0000000000000000FFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF
+      FF7FFFFFFF7FFFFFFF7F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000
+    }
+  end
 end

+ 105 - 2
bgrasvgimagelistform/bgrasvgimagelistform.pas

@@ -6,7 +6,7 @@ interface
 
 uses
   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, BCSVGViewer,
-  BGRASVGImageList, ComponentEditors, Types, Math, LCLType;
+  BGRASVGImageList, ComponentEditors, Types, Math, LCLType, ComCtrls;
 
 type
 
@@ -19,22 +19,42 @@ type
     btnUp: TButton;
     btnDown: TButton;
     btnReplace: TButton;
+    CheckBox_UseSVGAlignment: TCheckBox;
+    ImageList1: TImageList;
     ListBox1: TListBox;
     OpenDialog1: TOpenDialog;
+    ToolBar1: TToolBar;
+    ToolButton1: TToolButton;
+    ToolButton_AlignTop: TToolButton;
+    ToolButton_AlignLeft: TToolButton;
+    ToolButton_AlignCenter: TToolButton;
+    ToolButton_AlignRight: TToolButton;
+    ToolButton_AlignVCenter: TToolButton;
+    ToolButton_AlignBottom: TToolButton;
     procedure btnAddClick(Sender: TObject);
     procedure btnDownClick(Sender: TObject);
     procedure btnRemoveClick(Sender: TObject);
     procedure btnReplaceClick(Sender: TObject);
     procedure btnUpClick(Sender: TObject);
+    procedure CheckBox_UseSVGAlignmentChange(Sender: TObject);
     procedure ListBox1DrawItem(Control: TWinControl; Index: integer;
       ARect: TRect; State: TOwnerDrawState);
     procedure ListBox1SelectionChange(Sender: TObject; User: boolean);
+    procedure ToolButton_AlignBottomClick(Sender: TObject);
+    procedure ToolButton_AlignCenterClick(Sender: TObject);
+    procedure ToolButton_AlignLeftClick(Sender: TObject);
+    procedure ToolButton_AlignRightClick(Sender: TObject);
+    procedure ToolButton_AlignTopClick(Sender: TObject);
+    procedure ToolButton_AlignVCenterClick(Sender: TObject);
   private
     FComponent: TComponent;
+    function GetImageList: TBGRASVGImageList;
     procedure UpdateListBox;
     procedure UpdateButtons;
+    procedure UpdateToolButtonsAlign;
   public
     constructor {%H-}Create(AComponent: TComponent);
+    property ImageList: TBGRASVGImageList read GetImageList;
   end;
 
   { TBGRASVGImageListEditor }
@@ -144,6 +164,15 @@ begin
   ListBox1.ItemIndex := ListBox1.ItemIndex - 1;
 end;
 
+procedure TfrmBGRASVGImageListEditor.CheckBox_UseSVGAlignmentChange(
+  Sender: TObject);
+begin
+  ImageList.UseSVGAlignment:= CheckBox_UseSVGAlignment.Checked;
+  BCSVGViewerPreview.UseSVGAlignment:= ImageList.UseSVGAlignment;
+  ListBox1.Invalidate;
+  UpdateToolButtonsAlign;
+end;
+
 procedure TfrmBGRASVGImageListEditor.ListBox1DrawItem(Control: TWinControl;
   Index: integer; ARect: TRect; State: TOwnerDrawState);
 begin
@@ -167,6 +196,58 @@ begin
       TBGRASVGImageList(FComponent).SVGString[ListBox1.ItemIndex];
 end;
 
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignBottomClick(Sender: TObject
+  );
+begin
+  ImageList.VerticalAlignment:= tlBottom;
+  BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignCenterClick(Sender: TObject
+  );
+begin
+  ImageList.HorizontalAlignment:= taCenter;
+  BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignLeftClick(Sender: TObject);
+begin
+  ImageList.HorizontalAlignment:= taLeftJustify;
+  BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignRightClick(Sender: TObject
+  );
+begin
+  ImageList.HorizontalAlignment:= taRightJustify;
+  BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignTopClick(Sender: TObject);
+begin
+  ImageList.VerticalAlignment:= tlTop;
+  BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
+procedure TfrmBGRASVGImageListEditor.ToolButton_AlignVCenterClick(
+  Sender: TObject);
+begin
+  ImageList.VerticalAlignment:= tlCenter;
+  BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
+  UpdateToolButtonsAlign;
+  ListBox1.Invalidate;
+end;
+
 procedure TfrmBGRASVGImageListEditor.UpdateListBox;
 var
   i: integer;
@@ -181,6 +262,11 @@ begin
   UpdateButtons;
 end;
 
+function TfrmBGRASVGImageListEditor.GetImageList: TBGRASVGImageList;
+begin
+  result := TBGRASVGImageList(FComponent);
+end;
+
 procedure TfrmBGRASVGImageListEditor.UpdateButtons;
 begin
   btnUp.Enabled := (ListBox1.Count > 1) and (ListBox1.ItemIndex > 0);
@@ -189,13 +275,30 @@ begin
   btnReplace.Enabled := (ListBox1.Count > 0) and (ListBox1.ItemIndex <> -1);
 end;
 
+procedure TfrmBGRASVGImageListEditor.UpdateToolButtonsAlign;
+begin
+  ToolButton_AlignLeft.Down := (ImageList.HorizontalAlignment = taLeftJustify);
+  ToolButton_AlignCenter.Down := (ImageList.HorizontalAlignment = taCenter);
+  ToolButton_AlignRight.Down := (ImageList.HorizontalAlignment = taRightJustify);
+  ToolButton_AlignTop.Down := (ImageList.VerticalAlignment = tlTop);
+  ToolButton_AlignVCenter.Down := (ImageList.VerticalAlignment = tlCenter);
+  ToolButton_AlignBottom.Down := (ImageList.VerticalAlignment = tlBottom);
+  ToolBar1.Enabled:= not ImageList.UseSVGAlignment;
+end;
+
 constructor TfrmBGRASVGImageListEditor.Create(AComponent: TComponent);
 begin
   inherited Create(Application);
 
   FComponent := AComponent;
-  ListBox1.ItemHeight := Max(TBGRASVGImageList(FComponent).Height, Max(16, ListBox1.Canvas.TextHeight('0')));
+  ListBox1.ItemHeight := Max(ImageList.Height,
+                             Max(16, ListBox1.Canvas.TextHeight('0')));
   UpdateListBox;
+  CheckBox_UseSVGAlignment.Checked := ImageList.UseSVGAlignment;
+  BCSVGViewerPreview.UseSVGAlignment:= ImageList.UseSVGAlignment;
+  BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
+  BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
+  UpdateToolButtonsAlign;
 end;
 
 initialization

BIN
test/test_bgrathemes/test