-
Notifications
You must be signed in to change notification settings - Fork 1
/
svgViewer.GenerateImageCollection.pas
131 lines (118 loc) · 2.89 KB
/
svgViewer.GenerateImageCollection.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
unit svgViewer.GenerateImageCollection;
interface
uses
System.Types,
System.SysUtils,
System.Classes,
svgViewer.Types,
Vcl.ImageCollection;
type
TGenerateImageCollection = class(TInterfacedObject)
private
fBaseSize : integer;
fList : ISVGIconList;
fSizes : TArray<Integer>;
fCollection : TImageCollection;
procedure RenderImages;
procedure RenderToImageData(aItem:TImageCollectionItem;aindex,aSize:Integer);
function ComponentToString(aComponent:TComponent) : STring;
public
constructor Create(aSourceList:ISVGIconList;BaseSize:Integer);
end;
implementation
uses
System.Skia,
System.StrUtils,
VCL.Graphics,
VCL.Skia,
VCL.Clipbrd;
const
CRLF = ^M+^J;
{ TGenerateImageCollection }
function TGenerateImageCollection.ComponentToString(
aComponent: TComponent): STring;
var
Mem : TMemoryStream;
Stm : TStringSTream;
begin
mem := tMemoryStream.create;
stm := tSTringSTream.create;
try
mem.WriteComponent(fCollection);
mem.Seek(0,soFromBeginning);
ObjectBinaryToText(mem, Stm);
Result := stm.DataString;
finally
stm.free;
mem.free;
end;
end;
constructor TGenerateImageCollection.Create(aSourceList: ISVGIconList;
BaseSize: Integer);
begin
inherited Create;
fList := aSourceList;
fBaseSize := BaseSize;
fCollection := TImageCollection.create(nil);
fCollection.name := 'ImageCollection1';
SetLength(fSizes,5);
fSizes[0] := BaseSize;
fSIzes[1] := Trunc(fSizes[0] * 1.25);
fSizes[2] := Trunc(fSizes[0] * 1.5);
fSizes[3] := Trunc(fSizes[0] * 1.75);
fSizes[4] := Trunc(fSizes[0] * 2);
RenderImages;
Clipboard.AsText := ComponentToString(fCollection);
end;
procedure TGenerateImageCollection.RenderImages;
var
ix : integer;
size : integer;
Item : TImageCollectionItem;
begin
for ix := 0 to fList.Count-1 do
begin
Item := fCollection.Images.add;
Item.Name := fList.Name[ix];
for size in fSizes do
RenderToImageData(Item,ix,size);
end;
end;
procedure TGenerateImageCollection.RenderToImageData(aItem:TImageCollectionItem;aindex,
aSize: Integer);
var
LBitmap : TBitmap;
pngImg : TWICImage;
Image : TImageCollectionSourceItem;
begin
LBitmap := TBitmap.Create;
try
LBitmap.SetSize(aSize, aSize);
LBitmap.SkiaDraw(
procedure (const ACanvas: ISKCanvas)
var
LSvgBrush: TSkSvgBrush;
begin
LSvgBrush := TSkSvgBrush.Create;
try
LSvgBrush.Source := fList.Source[aIndex];
LSvgBrush.Render(ACanvas, RectF(0, 0, LBitmap.Width, LBitmap.Height), 1);
finally
LSvgBrush.Free;
end;
end);
pngImg := TWICImage.Create;
try
LBitmap.AlphaFormat := afDefined;
pngImg.Assign(LBitmap);
pngImg.ImageFormat := wifPng;
Image := aITem.SourceImages.add;
Image.Image.assign(pngImg);
finally
pngImg.Free;
end;
finally
lBitmap.Free;
end;
end;
end.