Нужно:
1. Функции чтобы нарисовать один tbitmap на другом с учетом альфа канала
2. Функции чтобы нарисовать один tbitmap на другом с учетом прозрачности заданной числом?
3. Функции чтобы узнать адрес самих данных (в delphi была tbutton.scanline, а в lazarus'e вроде нету)
хотел старые "наработки" использовать, но там было немного столь любимого мною ассемблера
 
 - Код: Выделить всё
- procedure TransparentBitBltC(Dest: TBitmap; PasteLeft, PasteTop: Integer; Source: TBitmap;
 CopyLeft, CopyTop, CopyWidth, CopyHeight: Integer);
 var
 DLine,SLine,AK:integer;
 DLeft,Width,Height:integer;
 SLeft:integer;
 D,S:PAC;
 DBounds,SBounds,CopyBounds,PasteBounds:TBounds;
 begin
 Dest.PixelFormat:=pf32bit;
 Source.PixelFormat:=pf32bit;
 DBounds:=GetBounds(0,0,Dest.Width,Dest.Height);
 SBounds:=GetBounds(0,0,Source.Width,Source.Height);
 PasteBounds:=GetBounds(PasteLeft,PasteTop,CopyWidth,CopyHeight);
 CopyBounds:=GetBounds(CopyLeft,CopyTop,CopyWidth,CopyHeight);
 PasteBounds:=BoundsAnd(PasteBounds,DBounds);
 PasteBounds.Left:=PasteBounds.Left-PasteLeft;
 PasteBounds.Top:=PasteBounds.Top-PasteTop;
 CopyBounds:=BoundsAnd(CopyBounds,SBounds);
 CopyBounds.Left:=CopyBounds.Left-CopyLeft;
 CopyBounds.Top:=CopyBounds.Top-CopyTop;
 PasteBounds:=BoundsAnd(PasteBounds,CopyBounds);
 if (PasteBounds.Width<=0)OR(PasteBounds.Height<=0)
 then
 Exit;
 {---------------------------------}
 DLine:=Dest.Width*4; //Оскільки формат pf32bit
 SLine:=Source.Width*4;//то наодин піксель - 4 байти (Opaque,Red,Green,Blue)
 D:=Dest.ScanLine[PasteBounds.Top+PasteTop];
 S:=Source.ScanLine[PasteBounds.Top+CopyTop];
 SLeft:=PasteBounds.Left+CopyLeft;
 DLeft:=PasteBounds.Left+PasteLeft;
 Width:=4*(SLeft+PasteBounds.Width); //Економимо на змінних, використаємо замість Right
 Height:=PasteBounds.Height;
 DLeft:=4*DLeft;
 SLeft:=4*SLeft;
 asm
 XOR EAX,EAX //for eax:=0 to Height-1 do
 @B1:CMP EAX,Height
 JAE @E1 //if >= then goto @e1
 PUSH EAX //збереження кроку циклу
 {---------------------------------}
 MOV ECX,DLeft
 MOV EBX,SLeft
 @B2:CMP EBX,Width
 JAE @E2
 PUSH EBX //збереження
 PUSH ECX //кроків циклу
 {---------------------------------}
 ADD ECX,D
 ADD EBX,S
 
 MOV DH,[EBX+3]
 XOR EAX,EAX //рівносильно "mov eax,0" але швидше
 MOV AL,[EBX]
 MUL DH
 MOV AK,EAX
 XOR EAX,EAX
 MOV AL,[ECX]
 MOV DL,DH
 NOT DL //теж саме що й 255-BL
 MUL DL
 ADD EAX,AK
 MOV DL,255
 DIV DL
 MOV [ECX],AL
 XOR EAX,EAX
 MOV AL,[EBX+1]
 MUL DH
 MOV AK,EAX
 XOR EAX,EAX
 MOV AL,[ECX+1]
 MOV DL,DH
 NOT DL
 MUL DL
 ADD EAX,AK
 MOV DL,255
 DIV DL
 MOV [ECX+1],AL
 XOR EAX,EAX
 MOV AL,[EBX+2]
 MUL DH
 MOV EBX,EAX //значення в EBX більше не потрібне
 XOR EAX,EAX
 MOV AL,[ECX+2]
 NOT DH
 MUL DH
 ADD EAX,EBX
 MOV DL,255
 DIV DL
 MOV [ECX+2],AL
 {---------------------------------}
 POP ECX
 POP EBX
 ADD EBX,4
 ADD ECX,4
 JMP @B2
 @E2:
 MOV EAX,D
 SUB EAX,DLine
 MOV D,EAX
 MOV EAX,S
 SUB EAX,SLine
 MOV S,EAX
 {---------------------------------}
 POP EAX
 INC EAX
 JMP @B1
 @E1:
 end;
 end;
Что нибудь посоветуете? Спасибо!



