Farbwert höher niedriger, gehts auch einfacher ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Farbwert höher niedriger, gehts auch einfacher ?

Beitrag 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 ???
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Farbwert höher niedriger, gehts auch einfacher ?

Beitrag 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
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: Farbwert höher niedriger, gehts auch einfacher ?

Beitrag 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)
Bild Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Farbwert höher niedriger, gehts auch einfacher ?

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Farbwert höher niedriger, gehts auch einfacher ?

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten