Текущий архив: 2003.03.03;
Скачать: CL | DM;
ВнизЗдесь кто-нить знает ассемблер??? Найти похожие ветки
← →
F1 (2003-01-05 12:13) [0]Короче, есть у меня процедурка, смешивающая битмапы:
Там по формуле
Colorres:=Alpha*(Color1-Color2)/256+Color2;
Где Alpha- "коэф. прозрачности" 0..255
Так вот проблема с sub при отриц. результате надо прыгать, можно ли это обойтить?
Буду благодарен за любую помощь!
procedure MixBitmap(B1,B2,B3:TBitmap;a:Byte);
var
l:DWORD;
p1,p2,p3:^Byte;
//А в ней ассемблерная процедурка, для скорости
//Я в ассемблере не силен, помогите ее соптимизировать!!!
procedure Mix;assembler;
Label Loop,Exit,m1,m2;
asm
pushad
mov esi,p1
mov edi,p2
mov edx,p3
mov ecx,l
mov bh,a
loop:
mov al,[esi]
mov bl,[edi]
sub al,bl //(p1-p2)
//Как здеся не прыгать, но чтоб результат был правильный?
jnc m1 //Если разность не отриц. то на m1
neg al //Меняю знак рез.
mul bh
sub bl,ah //Вместо сложения вычитаю
mov [edx],bl
jmp m2 //и уходим на m2
m1:
mul bh
add ah,bl
mov [edx],ah
m2:
dec ecx
jecxz Exit //Выход из цикла
inc esi
inc edi
inc edx
jmp loop //цикл
Exit:
popad
end;
var
h,w,bpp:Integer;
begin
//Это всякие проверки, можно не читать
if (B1=nil)or(B2=nil)or(b3=nil) then Exit;
w:=B1.Width;
if (B2.Width<>w)or(B3.Width<>w) then Exit;
h:=B1.Height;
if (B2.Height<>h)or(B3.Height<>h) then Exit;
if (B2.PixelFormat<>B1.PixelFormat)or(B3.PixelFormat<>B1.PixelFormat) then Exit;
if a=0 then
begin
B3.Assign(B2);
Exit;
end;
if a=255 then
begin
B3.Assign(B1);
Exit;
end;
case B1.PixelFormat of
pf24bit:bpp:=3;
pf32bit:bpp:=4;
else Exit;
end;
//А вот и сам Mix!!!!!!!!!!!!!!!!!!!!!!!!
p1:=B1.ScanLine[h-1];
p2:=B2.ScanLine[h-1];
p3:=B3.ScanLine[h-1];
l:=w*h*bpp-1;
Mix; //!!!!!!!!!!111
end;
← →
MBo (2003-01-05 12:53) [1]Alpha*C1+(1-Alpha)*C2
← →
F1 (2003-01-05 12:57) [2]Ага, блин, я от двух умножений специально уходил, медленнее получается :(
← →
Verg (2003-01-05 15:50) [3]Че-то я не помню,.... а
sub al,bl //(p1-p2)
imul bh
add bl,ah
mov [edx],bl
Не канает?
← →
F1 (2003-01-05 16:49) [4]>Verg © (05.01.03 15:50)
Нет! :(
Страницы: 1 вся ветка
Текущий архив: 2003.03.03;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c