Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Здесь кто-нить знает ассемблер???


F1 ©   (2003-01-05 12:13:00) 

Короче, есть у меня процедурка, смешивающая битмапы:
Там по формуле
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;


F1   (2003-01-05 16:49:00) [1]

>Verg © (05.01.03 15:50)
Нет! :(


Verg   (2003-01-05 15:50:00) [2]

Че-то я не помню,.... а

sub al,bl //(p1-p2)
imul bh
add bl,ah
mov [edx],bl


Не канает?


F1   (2003-01-05 12:57:00) [3]

Ага, блин, я от двух умножений специально уходил, медленнее получается :(


MBo   (2003-01-05 12:53:00) [4]

Alpha*C1+(1-Alpha)*C2


Наверх

Титульная страница Поиск, карта сайта Написать письмо