![]() |
Re: Rgb mittels Asm darstellen
Das PUSH ECX gehört zum Standardverhallten des Compilers.
Der automatisch erzeugte Eintritts- und Austrittscode:
Delphi-Quellcode:
Standardmäßig sind, laut Intel-Sepzifikation, EAX, EDX und ECX, sowie die Statusregister frei verfügbar
PUSH EBP // Vorhanden wenn Locals <> 0 oder Params <> 0
MOV EBP, ESP // Vorhanden wenn Locals <> 0 oder Params <> 0 SUB ESP, Locals // Vorhanden wenn Locals <> 0 PUSH ECX // - ... MOV EAX, [EBP-4] // Vorhanden wenn nachdem &Result etwas zugewiesen wurde auch noch EAX etwas zugewiesen // wird, in diesem Fall wird für &Result [EBP-4] statt EAX verwendet - wenn Result <= Integer POP ECX // - MOV ESP, EBP // Vorhanden wenn Locals <> 0 POP EBP // Vorhanden wenn Locals <> 0 oder Params <> 0 RET Params // Immer vorhanden und alle anderen Register müssen nach der Prozedur/Funktion wieder hergestellt werden. Allerdings verwendet Delphi das ECX intern für eigene Dinge, weßhalb es dieses sicherheitshalber selber nochmal sichert, da der Programmierer es (laut Spec) ja nicht selber machen muß. |
Re: Rgb mittels Asm darstellen
Mal was Grundsätzliches zum Farbverlauf.
Ein "g'scheite" Funktion zum Berechnen eines Farbverlaufs braucht 3 Parameter: * Anfangsfarbe * Endfarbe * Überblendungsfaktor Der Überblendungsfaktor könnte ein Double im Bereich 0.0 bis 1.0 oder auch 0% bis 100% sein. Wenn man Integerarithmetik einsetzen möchte (gerade auch weil man die Funktion in Assembler implementieren will) dann kann man den Überblendungsfaktor auch von 0 bis 255 (Datentyp Integer) festlegen. Ich verweise hier mal auf ![]() Du kannst versuchen die Funktion ColorBetween() in Assembler umzusetzen. Den Aufruf von ColorToRGB() kann man sich schenken, wenn man sicherstellt, dass keine Systemfarben wie z.B. clWindow übergeben werden. Den Aufruf von GetRValue(), GetGValue() und GetBValue() braucht man auch nicht, wenn man die Farbkomponenten rot, grün und blau direkt aus TColor rausholt. |
Re: Rgb mittels Asm darstellen
Hallo himitsu und vielen Dank!
Hallo shmia, habe mich mal daran probiert, scheint aber noch zu schwierig! Danke aber dafür, ist recht interessant. Warum darf man keine Systemfarben übergeben bzw warum stören die 2 Nullen? 00XXXXXXX mal mein bisheriges Ergebnis :oops: (immerhin werden es schon 2 unterschiedlich gefärbte Vierecke :mrgreen: )
Delphi-Quellcode:
Mfg Thomas
function ColorBetween2(a,b:TColor;c:integer):TColor;
ASM // Shl eax,24; //cmp al,$00; // cmp ah,$00; // je @weiter; Sub dl,al; Xchg al,dl; Mul dl; add al,dl; Sub dx,ax; Xchg ax,dx; Mul dx; add ax,cx; shl ax,8; Sub edx,eax; Xchg eax,edx; Mul edx; add eax,ecx; shl eax,16; Ret; //@weiter:; END; //Edit also 2 unterschiedliche Vierecke wenn man die Kommentarklammeren entfernt |
Re: Rgb mittels Asm darstellen
die zwei 00 stören nicht, aber Farben aus gewissen paletten
Delphi-Quellcode:
so hat z.B. clBackground den Wert $FF000001 (auch so zu finden in der Unit Graphics von Delphi)
// Quelle siehe Anhang
Const COLOR_SCROLLBAR = TColorIndex(0); COLOR_BACKGROUND = TColorIndex(1); COLOR_ACTIVECAPTION = TColorIndex(2); cpSystemPalette = $00; cpActingPalette = $01; cpLogicalPalette = $02; cpNoColor = $1F; cpDefaultColor = $20; cpSystemColor = $FF; clScrollBar = TColor(cpSystemColor shl 24 or COLOR_SCROLLBAR); clBackground = TColor(cpSystemColor shl 24 or COLOR_BACKGROUND); clActiveCaption = TColor(cpSystemColor shl 24 or COLOR_ACTIVECAPTION); Function ColorToRGB(Color: TColor): TColor; Var _Color: TColorRec Absolute Color; Begin If _Color.Palette = cpSystemColor Then Result := GetSysColor(Color and $FF) and $FFFFFF Else If _Color.Palette in [cpSystemPalette..cpLogicalPalette] Then Result := Color and $FFFFFF Else Result := $000000; End; Speziell die Systemfarben sind über ihren Index kodiert und müssen erst entschlüsselt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz