Forum
Grundkurs
»Introduktion
»Snabbguide
»Komponenter
»Händelser
»Strängar
»Räkna med Delphi »Egna
typer
»Selektion
»Iteration
»Menyer
»Funktioner
»Arraystrukturer
Tips & Tricks
»Nya tips
»Blandat
»Databaser
»Filer
»Forms
»Grafik
»Internet
»Komponenter
»Matematik
»Multimedia
»Objekt/ActiveX
»Skrivare
»Strängar
»System
»Mest lästa tips
Artiklar
»Delphi och ADO
»Bygga en DLL
»Skapa en enkel rapport
»Hantera registret
»Enheter, units
»Klassen TCanvas
»Använd LookUp Controls
Nya
tips
Lägg
till tips
Delphilänkar
Gästbok
|
|
|
|
Övertoning med Assembler
|
Kategori: Grafik
Inlagt: 2005-02-10
Läst: 1423
Inlagt av: Staffan Berg
|
Beskrivning |
Skapa en grafisk övertoning i delphi med hjälp av Assemblerkod.
|
Kod |
function BlendColor(ColorA, ColorB, Size: Integer{0-256}): Integer; var R: Integer; asm //ColorA->EAX ColorB->EDX Size->ECX //red PUSH EAX //save ColorA value AND EAX,255 //get red channel only PUSH EDX //save ColorB MUL ECX //EAX:=EAX*Size POP EDX //open ColorB AND EDX,255 //get red channel only MOV R,EAX //R:=EAX MOV EAX,EDX //EAX:=ColorB PUSH EDX //save ColorB MOV EDX,256 //EDX:=256 SUB EDX,ECX //EDX:=EDX-Size MUL EDX //EAX:=EAX*EDX ADD EAX,R //EAX:=EAX+R SHR EAX,8 //EAX:=EAX div 256 MOV @Result,EAX //Result:=Result+EAX POP EDX //open ColorB POP EAX //open ColorA //green PUSH EAX //save ColorA value SHR EAX,8 //get green channel only AND EAX,255 PUSH EDX //save ColorB MUL ECX //EAX:=EAX*Size POP EDX //open ColorB SHR EDX,8 //get green channel only AND EDX,255 MOV R,EAX //R:=EAX MOV EAX,EDX //EAX:=ColorB PUSH EDX //save ColorB MOV EDX,256 //EDX:=256 SUB EDX,ECX //EDX:=EDX-Size MUL EDX //EAX:=EAX*EDX ADD EAX,R //EAX:=EAX+R SHR EAX,8 //EAX:=EAX div 256 SHL EAX,8 //EAX:=EAX*256 ADD @Result,EAX //Result:=Result+EAX POP EDX //open ColorB POP EAX //open ColorA //blue PUSH EAX //save ColorA value SHR EAX,16 //get blue channel only PUSH EDX //save ColorB MUL ECX //EAX:=EAX*Size POP EDX //open ColorB SHR EDX,16 //get blue channel only MOV R,EAX //R:=EAX MOV EAX,EDX //EAX:=ColorB PUSH EDX //save ColorB MOV EDX,256 //EDX:=256 SUB EDX,ECX //EDX:=EDX-Size MUL EDX //EAX:=EAX*EDX ADD EAX,R //EAX:=EAX+R SHR EAX,8 //EAX:=EAX div 256 SHL EAX,16 //EAX:=EAX*256*256 ADD @Result,EAX //Result:=Result+EAX POP EDX //open ColorB POP EAX //open ColorA end;
|
|
|