Entwickler-Ecke
Multimedia / Grafik - Farbverlauf (gradient) ASM Routine.... ?
suga2001 - Mo 28.04.08 10:34
Titel: Farbverlauf (gradient) ASM Routine.... ?
hallo... und zwar soll ich einen farbverlauf machen. bisher hat auch alles ziemlich gut ( mit kleinen problemchen, die ich aber schon behoben habe) hingehauen. nun soll ich einen farbverlauf mit einer asm-routine machen, der sich von gelb(links unten) nach rot(rechts oben) zieht. ich habe bisschen mit den zahlen gespielt, um zu sehen,was überhaupt passiert, aber da fängt das problem schon an. linke seite bleibt schwarz und läuft zuu rechte seite rot über.... nix von gelb zu sehen, selbst wenn ich die zahl von 8 auf 16 verschiebe...gleiches resultat. ich habe alle buttonclicks überprüft, alle proceduren und funktionen, aber keinen fehler gefunden.....
wer könnte mir bitte unter die arme greifen? danke im voraus :D
hier mein quellcode für die function:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function Farbverlauf3(gelb,rot:integer):TColor;
begin ASM push ecx mov ecx,eax; CMP ecx,edx; JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH pop ECX
END; end; |
Moderiert von
Klabautermann: Size- durch Delphi-Tags ersetzt.
Moderiert von
Christian S.: Titel geändert, 20(!) Ausrufezeichen entfernt
BenBE - Mo 28.04.08 11:22
@CS: 20 oder 20! Ausrufezeichen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function Farbverlauf3(gelb,rot:integer):TColor; ASM mov ecx,eax CMP ecx,edx JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH end; |
Kurz paar Allgemeine Hinweise:
Wenn Du rein ASM haben willst, dann kein Begin-End verwenden; sonst hast Du nämlich noch einige Nebeneffekte des Delphi-Compilers zu beachten
Argumente werden der Reihe nach in EAX, EDX, ECX (von links nach rechts, der Rest auf'm Stack; bei Register) übergeben.
Bitte auch mal beschreiben, wie der Aufruf dieser Routine aussieht!
suga2001 - Mo 28.04.08 18:50
@warm: //Was soll das machen??? wir haben dazu nen skript bekommen wo der prof anhand von 0 bis 255 warm und kalt angibt. in dem fall ist @warm der name der schleife.
ADD AL,AH //Was soll diese Zeile machen??? das weiß ich auch nicht so genau, ich hab gedachte,dass damit irgendein zwischenwert angesprochen wird, damit ich gelb bekomme und kein blau :D ????
für den buttonklick der die procedure, bzw den farbverlauf ausführen soll
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Image10Click(Sender: TObject); var x,y ,Anfangszeit,Endzeit:integer; begin Anfangszeit:=GetTickCount; for y:=0 to 255 do BEGIN for x:= 0 to 255 do Image2.Canvas.Pixels[x,y]:=Farbverlauf3(x,y); Image2.Update; END; Endzeit:=GetTickCount; Label2.Caption:=Inttostr(Endzeit-Anfangszeit); Label2.Caption:=format('Farbverlauf dauerte %g Millisekunden',[(Endzeit-Anfangszeit)/1]);
end; |
mein prof meinte,dass wenn man in eine asm-routine begin und end zufügt,dass sie denn gesichert ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| unction Farbverlauf3(gelb,rot:integer):TColor; ASM push ecx mov ecx,eax; CMP ecx,edx; JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH pop ECX |
hab im anhang mal das genommen, was ich jetzt machen soll. ich hänge nun bei 5.3 fest, weil ich kein gelb machen kann :(
BenBE - Mo 28.04.08 19:22
Versuch das mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
MOV ECX, EAX
ADD EAX, EDX SHR EAX, 1
BSWAP EAX ADD EAX, ECX ROL EAX, 8 end; |
HTH
suga2001 - Mo 28.04.08 20:04
habs ausprobiert. rot/grün hatte ich ja schon. aber ich soll irgendwie ein geld erzeugen,welches von der linken ecke unten in schwarz mitte in rot rechte ecke oben übergeht.
mit seinem script bzw der "Anteilung" kann ich nicht wirklich was anfangen...
BenBE - Mo 28.04.08 20:55
Naja, vollständig die Lösung verraten wird Dir nicht viel bringen, da dabeider Lerneffekt etwas verloren geht...
Wie erreicht man so einen Farbverlauf:
- Wenn X(Rot) < Y(Gelb): Rot = Gelb
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
MOV ECX, EAX
ADD EAX, EDX SHR EAX, 1
BSWAP EAX ADD EAX, ECX ROL EAX, 8 end; |
HTH[/quote]
Eigentlich sind nur die drei markierten Zeilen zu ändern ... Halt wie oben beschrieben ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
CMP EAX, EDX CMOVC EAX, EDX
BSWAP EAX ADD EAX, EDX ROL EAX, 8 end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!