Seite 1 von 1
Farbwert höher niedriger, gehts auch einfacher ?
Verfasst: 08.02.2020 14:17
von hjbremer
Code: Alles auswählen
Procedure.i AddRGB(color, wert)
Protected r = Red(color) + wert, g = Green(color) + wert, b = Blue(color) + wert
If r > 255: r = 255: ElseIf r < 0: r = 0: EndIf
If g > 255: g = 255: ElseIf g < 0: g = 0: EndIf
If b > 255: b = 255: ElseIf b < 0: b = 0: EndIf
ProcedureReturn RGB(r, g, b)
EndProcedure
Debug Hex(#Gray)
x = AddRGB(#Gray, $14): Debug Hex(x)
Debug Hex(#Gray)
x = AddRGB(#Gray, -$10): Debug Hex(x)
Irgendwie finde ich meinen Code umständlich, gehts auch einfacher, besser oder schöner, kürzer etc
Vielleicht mit XOR oder so ???
Re: Farbwert höher niedriger, gehts auch einfacher ?
Verfasst: 08.02.2020 15:33
von Mijikai
Geht bestimmt noch besser aber ich bin leider kein fasm Experte
fasm (x86 & x64):
Code: Alles auswählen
Procedure.i AddRGB(Color.i,Value.i)
Protected result.i
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!lea eax,[p.v_Color]
!lea ecx,[p.v_result]
!mov dl,byte[eax]
!add dl,byte[p.v_Value]
!mov byte[ecx],dl
!mov dl,byte[eax + 0x1]
!add dl,byte[p.v_Value]
!mov byte[ecx + 0x1],dl
!mov dl,byte[eax + 0x2]
!add dl,byte[p.v_Value]
!mov byte[ecx + 0x2],dl
CompilerElse
!lea rax,[p.v_Color]
!lea rcx,[p.v_result]
!mov dl,byte[rax]
!add dl,byte[p.v_Value]
!mov byte[rcx],dl
!mov dl,byte[rax + 0x1]
!add dl,byte[p.v_Value]
!mov byte[rcx + 0x1],dl
!mov dl,byte[rax + 0x2]
!add dl,byte[p.v_Value]
!mov byte[rcx + 0x2],dl
CompilerEndIf
ProcedureReturn result
EndProcedure
Re: Farbwert höher niedriger, gehts auch einfacher ?
Verfasst: 08.02.2020 19:29
von sibru
einfacher genug ?
Code: Alles auswählen
Procedure Min(w1,w2);liefert die kleinste von 2 Integer-Zahlenwerten
If w1<w2
ProcedureReturn w1
EndIf
ProcedureReturn w2
EndProcedure
Procedure Max(w1,w2) ;liefert die größte von 2 Long-Zahlenwerten
If w1>w2
ProcedureReturn w1
EndIf
ProcedureReturn w2
EndProcedure
Procedure.i AddRGB(color, wert)
Protected r = Min(255,Max(0,Red(color) + wert))
Protected g = Min(255,Max(0,Green(color) + wert))
Protected b = Min(255,Max(0,Blue(color) + wert))
ProcedureReturn RGB(r, g, b)
EndProcedure
Debug Hex(#Gray)
x = AddRGB(#Gray, $14): Debug Hex(x)
Debug Hex(#Gray)
x = AddRGB(#Gray, -$10): Debug Hex(x)
Re: Farbwert höher niedriger, gehts auch einfacher ?
Verfasst: 08.02.2020 21:19
von hjbremer
vielen Dank für eure Mühe !
die Fasm Version finde auf jeden Fall schöner, sieht sehr Professionell aus, leider verstehe ich nur Bahnhof.
die Version mit Min Max ist auch gut aber nicht unbedingt einfacher zu verstehen für mich auf den 1.Blick.
der Hintergrund für meine Frage ist ein 10 Jahre altes Programm, das nackte Grauen was ich da verbrochen hab.
Re: Farbwert höher niedriger, gehts auch einfacher ?
Verfasst: 08.02.2020 21:42
von PureLust
Hätte da noch 'ne kleine Lösung im Angebot:
Code: Alles auswählen
Procedure Limit(Wert, Min=0, Max=255)
ProcedureReturn Wert * Bool(Wert >= Min And Wert <= Max) + Min * Bool(Wert < Min) + Max * Bool(Wert > Max)
EndProcedure
Procedure.i AddRGB(color, wert)
ProcedureReturn RGB(Limit(Red(color)+wert), Limit(Green(color)+wert), Limit(Blue(color)+wert))
EndProcedure
Debug Hex(#Gray)
x = AddRGB(#Gray, $84): Debug Hex(x)
Debug Hex(#Gray)
x = AddRGB(#Gray, -$110): Debug Hex(x)
Wobei man Limit() hier auch auch Macro realisieren könnte.