-
Notifications
You must be signed in to change notification settings - Fork 3
/
optimizedscanlineunit.pas
105 lines (89 loc) · 2.91 KB
/
optimizedscanlineunit.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
unit optimizedscanlineunit;
interface
uses
FMX.Utils, FMX.Types, System.UITypes;
procedure OptimizedAlphaColorToScanline(Input: PAlphaColor; Output: Pointer; PixelCount: Integer; OutputFormat: TPixelFormat);
procedure OptimizedScanlineToAlphaColor(Input: Pointer; Output: PAlphaColor; PixelCount: Integer; InputFormat: TPixelFormat);
implementation
procedure OptimizedAlphaColorToScanline(Input: PAlphaColor; Output: Pointer; PixelCount: Integer; OutputFormat: TPixelFormat);
var
InpData : PAlphaColor;
OutData : Pointer;
Index, DestPitch : Integer;
tmpByte : Byte;
begin
Case OutputFormat of
TPixelFormat.BGRA:
begin
// Same image color space we're using, just copy
Move(Input^,Output^,PixelCount*4);
end;
TPixelFormat.RGBA:
begin
Move(Input^,Output^,PixelCount*4);
// Convert BGRA to RGBA
For Index := 0 to PixelCount-1 do
begin
tmpByte := TAlphaColorRec(PAlphaColorArray(Output)[Index]).R;
TAlphaColorRec(PAlphaColorArray(Output)[Index]).R := TAlphaColorRec(PAlphaColorArray(Output)[Index]).B;
TAlphaColorRec(PAlphaColorArray(Output)[Index]).B := tmpByte;
end;
end;
else
begin
// Case else - other color formats
DestPitch := PixelFormatBytes[OutputFormat];
if DestPitch < 1 then
Exit;
InpData := Input;
OutData := Output;
for Index := 0 to PixelCount - 1 do
begin
AlphaColorToPixel(InpData^, OutData, OutputFormat);
Inc(InpData);
Inc(NativeInt(OutData), DestPitch);
end;
end;
End;
end;
procedure OptimizedScanlineToAlphaColor(Input: Pointer; Output: PAlphaColor; PixelCount: Integer; InputFormat: TPixelFormat);
var
InpMem : Pointer;
OutColor : PAlphaColor;
Index, SrcPitch : Integer;
tmpByte : Byte;
begin
Case InputFormat of
TPixelFormat.BGRA:
begin
// Same image color space we're using, just copy
Move(Input^,Output^,PixelCount*4);
end;
TPixelFormat.RGBA:
begin
// Convert BGRA to RGBA
Move(Input^,Output^,PixelCount*4);
For Index := 0 to PixelCount-1 do
begin
tmpByte := TAlphaColorRec(PAlphaColorArray(Output)[Index]).R;
TAlphaColorRec(PAlphaColorArray(Output)[Index]).R := TAlphaColorRec(PAlphaColorArray(Output)[Index]).B;
TAlphaColorRec(PAlphaColorArray(Output)[Index]).B := tmpByte;
end;
end;
else
begin
// Case else - other color formats
SrcPitch := PixelFormatBytes[InputFormat];
if SrcPitch < 1 then Exit;
InpMem := Input;
OutColor := Output;
for Index := 0 to PixelCount - 1 do
begin
OutColor^ := PixelToAlphaColor(InpMem, InputFormat);
Inc(NativeInt(InpMem), SrcPitch);
Inc(OutColor);
end;
end;
End;
end;
end.