Autor Beitrag
suga2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mo 28.04.08 10:34 
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:

ausblenden 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            //00BBGGRR :Colorref
                         SHL EDX,16
                         MOV EAX, EDX

                @ende:   mov EAX,ECX
                         ADD AL,AH
                         pop ECX

END;
end;


Moderiert von user profile iconKlabautermann: Size- durch Delphi-Tags ersetzt.
Moderiert von user profile iconChristian S.: Titel geändert, 20(!) Ausrufezeichen entfernt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 28.04.08 11:22 
@CS: 20 oder 20! Ausrufezeichen?

ausblenden 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:  //Was soll das machen???
    SUB EDX, EAX            //00BBGGRR :Colorref
    SHL EDX,16
    MOV EAX, EDX

@ende:
    mov EAX,ECX
    ADD AL,AH //Was soll diese Zeile machen???
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!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ausblenden 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.

ausblenden 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            //00BBGGRR :Colorref
                         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 :(
Einloggen, um Attachments anzusehen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 28.04.08 19:22 
Versuch das mal so:

ausblenden 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
    //Eingabewerte auf 0..255 begrenzen
    AND     EAX, $FF
    AND     EDX, $FF

    //X sichern
    MOV     ECX, EAX

    //Mittelwert zwischen X und Y bilden
    ADD     EAX, EDX
    SHR     EAX, 1

    //Farbe zusammensetzen
    BSWAP   EAX            //Rot nach ganz links schieben
    ADD     EAX, ECX       //Grün Kanal im LSB addieren
    ROL     EAX, 8         //Rotkanal wieder rechts einfügen
end;


HTH

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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

ausblenden 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
    //Eingabewerte auf 0..255 begrenzen
    AND     EAX, $FF
    AND     EDX, $FF

    //X sichern
    MOV     ECX, EAX

    //Mittelwert zwischen X und Y bilden
    ADD     EAX, EDX
    SHR     EAX, 1


    //Farbe zusammensetzen
    BSWAP   EAX            //Rot nach ganz links schieben
    ADD     EAX, ECX       //Grün Kanal im LSB addieren
    ROL     EAX, 8         //Rotkanal wieder rechts einfügen
end;


HTH[/quote]

Eigentlich sind nur die drei markierten Zeilen zu ändern ... Halt wie oben beschrieben ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Farbverlauf3(x,Y: Integer):TColor;
asm
    //Eingabewerte auf 0..255 begrenzen
    AND     EAX, $FF
    AND     EDX, $FF

    //Oben genannte Bedingung
    CMP     EAX, EDX
    CMOVC   EAX, EDX


    //Farbe zusammensetzen
    BSWAP   EAX            //Rot nach ganz links schieben
    ADD     EAX, EDX       //Grün Kanal im LSB addieren
    ROL     EAX, 8         //Rotkanal wieder rechts einfügen
end;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.