Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rgb mittels Asm darstellen (https://www.delphipraxis.net/133524-rgb-mittels-asm-darstellen.html)

himitsu 7. Mai 2009 10:09

Re: Rgb mittels Asm darstellen
 
Das PUSH ECX gehört zum Standardverhallten des Compilers.

Der automatisch erzeugte Eintritts- und Austrittscode:
Delphi-Quellcode:
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
Standardmäßig sind, laut Intel-Sepzifikation, EAX, EDX und ECX, sowie die Statusregister frei verfügbar
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ß.

shmia 7. Mai 2009 10:25

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 Farbverlauf berechnen.
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.

thomasku 7. Mai 2009 15:35

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:
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;
Mfg Thomas

//Edit also 2 unterschiedliche Vierecke wenn man die Kommentarklammeren entfernt

himitsu 7. Mai 2009 16:08

Re: Rgb mittels Asm darstellen
 
die zwei 00 stören nicht, aber Farben aus gewissen paletten

Delphi-Quellcode:
// 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;
so hat z.B. clBackground den Wert $FF000001 (auch so zu finden in der Unit Graphics von Delphi)

Speziell die Systemfarben sind über ihren Index kodiert und müssen erst entschlüsselt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz