Przeróbka na asm

0

Trochę lolokowate, ale co poradzić każdego to może spotkać ;) Jeśli ktoś miałby chwilkę czasu to poprosiłbym o przepisasnie poniższych dwóch procedurek na ASM, to zwykłe operacje na liczbach więc nie powinno nastręczyć to problemu :)

function Darker(Col: TColor; Percent: Byte): TColor;
var
R, G, B: Byte;
begin
if Percent>100 then Percent:=100;
R := GetRValue(Col);
G := GetGValue(Col);
B := GetBValue(Col);
R := Round(RPercent/100);
G := Round(G
Percent/100);
B := Round(B*Percent/100);
Result := Windows.RGB(R, G, B);
end;

function ColorToColor(StartColor,EndColor: TColor; Percent: Byte): TColor;
var
SR, SG, SB: Byte;
ER, EG, EB: Byte;
CR, CG, CB: Byte;
begin
StartColor:=TColor(ColorToRGB(StartColor));
EndColor:=TColor(ColorToRGB(EndColor));
// te dwie linijki wyżej to temu bo wychodziły dziwy z kolorami
// typu clBtnFace itp
SR:=GetRValue(StartColor);
SG:=GetGValue(StartColor);
SB:=GetBValue(StartColor);
ER:=GetRValue(EndColor);
EG:=GetGValue(EndColor);
EB:=GetBValue(EndColor);
if SR>ER then
begin
CR:=SR-(Percent*(SR-ER) div 100)
end else begin
CR:=SR+(Percent*(ER-SR) div 100)
end;
if SG>EG then
begin
CG:=SG-(Percent*(SG-EG) div 100)
end else begin
CG:=SG+(Percent*(EG-SG) div 100)
end;
if SB>EB then
begin
CB:=SB-(Percent*(SB-EB) div 100)
end else begin
CB:=SB+(Percent*(EB-SB) div 100)
end;
Result:=Windows.RGB(CR,CG,CB);
end;

Ewentualnie jeśli się komuś niechce to poproszę o wskazówki. Teraz muszę chatę posprzątać bo starzy w amoku, ale jak im przejdzie to się zabiorę do roboty :)
Potrzebuję tego bo chcę jak najbardziej zoptymalizować i przyśpieszyć kod rysowania widma pod VCL (klasa TBitmap) pojedyńcza klatka rysowana była od 20ms do nawet 300ms, po przerobieniu tego na WinAPI (hBitmap) i użycie klasy TFastDIB rysowanie pojedyńczej klatki to już max 40ms, a gdyby te 2 procki przyśpieszyć (szczególnie tą drugą) to byłoby już bardziej miło. Z góry dzięki za chęci :)

0
function Darker(Col: TColor; Percent: Byte): TColor; assembler
asm
mov eax, col
shr eax, 16
and eax, ffh
mul eax, percent
shr eax, 8
shl eax, 16
mov ebx, eax;
mov eax, col
shr eax, 8
and eax, ffh
mul eax, percent
and eax, ff00h
add ebx, eax
mov eax, col
and eax, ffh
mul eax, percent
shr eax, 8
add ebx, eax
mov result, ebx
end;

jak sie nie pomyliłem powinno działac procenty są od 0 do 255

1 użytkowników online, w tym zalogowanych: 0, gości: 1