AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rgb mittels Asm darstellen

Ein Thema von thomasku · begonnen am 4. Mai 2009 · letzter Beitrag vom 7. Mai 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#11

Re: Rgb mittels Asm darstellen

  Alt 7. Mai 2009, 10:09
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ß.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

Re: Rgb mittels Asm darstellen

  Alt 7. Mai 2009, 10:25
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.
Andreas
  Mit Zitat antworten Zitat
thomasku

Registriert seit: 4. Jan 2009
31 Beiträge
 
#13

Re: Rgb mittels Asm darstellen

  Alt 7. Mai 2009, 15:35
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
(immerhin werden es schon 2 unterschiedlich gefärbte Vierecke )
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#14

Re: Rgb mittels Asm darstellen

  Alt 7. Mai 2009, 16:08
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.
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