 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.08.2007, 16:09 Titel: Hrgb Farbwert in 16bit |
|
|
Hi, ich habe/wollte eine funktion zum umrechnen von RGB werten in einen 2byte Wert fuer den 16bit Screen Mode schreiben... habe scheinbar aber ein Problem mit shr und shl... denn damit funktionierts nicht so wie ich mir das vorgestellt habe
Code: |
Function Hrgb (byval red as ubyte, byval green as ubyte, byval blue as ubyte) as ushort
Dim as ushort OutCol
red=int((red/256)*32)
green=int((green/256)*64)
blue=int((blue/256)*32)
'OutCol=Val("&b"+Bin(red,5)+Bin(green,6)+Bin(blue,5))
OutCol=(blue shl 16)+(green shl 11)+(red shl 5)
Return OutCol
End Function
?Hrgb (255,255,255)
|
da sollte eigentlich 65535 rauskommen, bin der etwas uneleganten loesung von Val und Bin funktionierts recht gut....
ausserdem ist es enorm langsam
Code: |
Screen 18,16
Dim scr as ushort ptr=ScreenPtr
Dim Adr as UInteger
ScreenLock
for y as integer=0 to 479
for x as integer=0 to 639
scr[Adr+x]=Hrgb(255,0,255)
next x
Adr+=640
next y
ScreenUnlock
|
Ohne ScreenLock/ScreenUnlock kommt es vor das er einfach mittendrinn abbricht.. mit dem 'Zeichnen' und nur ein kleiner balken oben farbig dargestellt wird... wie kommt das oO? _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.08.2007, 16:48 Titel: |
|
|
so glaube ich scheint es in angemessener Geschwindigkeit zu funktionieren
Code: |
Function Hrgb (byval red as ubyte, byval green as ubyte, byval blue as ubyte) as ushort
red=(red shr 3)
green=(green shr 2)
blue=(blue shr 3)
Return (red shl 11)+(green shl 5)+(blue)
End Function
|
_________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 28.08.2007, 21:46 Titel: |
|
|
Hi,
die Kombination 'byval red as ubyte' und 'red shl 11' hat mich erst etwas stutzen lassen.
Ubyte = 8 Bit und dann 'shl 11', wie wird denn da in 8 Bit 11 x nach links geschoben?
Da du das sicher probiert hattest (und es wohl funktionierte) habe ich mir den Assemblercode der Funktion angesehen: Code: | movzx eax, byte ptr [ebp+8] 'red=(red SHR 3)
shr eax, 3
mov bl, al
mov byte ptr [ebp+8], bl
movzx ebx, byte ptr [ebp+12]'green=(green SHR 2)
shr ebx, 2
mov al, bl
mov byte ptr [ebp+12], al
movzx eax, byte ptr [ebp+16]'blue=(blue SHR 3)
shr eax, 3
mov bl, al
mov byte ptr [ebp+16], bl
movzx ebx, byte ptr [ebp+8] '(red SHL 11)
shl ebx, 11
movzx eax, byte ptr [ebp+12]'(green SHL 5)
shl eax, 5
add ebx, eax '+
movzx eax, byte ptr [ebp+16]'(blue)
add ebx, eax '+
mov word ptr [ebp-4], bx 'Return | Aha, FB läd 'red' als Byte, verarbeitet es dann aber im 32 Bit-Register wie ein Uinteger. Also kein Problem!
Dann sollte man die Funktion aber auch noch kompakter schreiben können: Code: | FUNCTION Hrgb (BYVAL red AS UBYTE, BYVAL green AS UBYTE, BYVAL blue AS UBYTE) AS USHORT
RETURN ((red SHR 3) SHL 11) + ((green SHR 2) SHL 5) + (blue SHR 3)
END FUNCTION
'movzx eax, byte ptr [ebp+8]
'shr eax, 3
'shl eax, 11
'movzx ebx, byte ptr [ebp+12]
'shr ebx, 2
'shl ebx, 5
'add eax, ebx
'movzx ebx, byte ptr [ebp+16]
'shr ebx, 3
'add eax, ebx
'mov word ptr [ebp-4], ax | Der Quellcode sieht jetzt natürlich nicht mehr so übersichtlich aus, aber ist wesentlich schneller. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.08.2007, 00:49 Titel: |
|
|
ahh... da danke ich Dir, meiner selbstzweifel ob es (wirklich?) Funktioniert, doch die ergebnisse waren bisher ueberzeugend
Volta hat Folgendes geschrieben: |
Dann sollte man die Funktion aber auch noch kompakter schreiben können:
Code: |
FUNCTION Hrgb (BYVAL red AS UBYTE, BYVAL green AS UBYTE, BYVAL blue AS UBYTE) AS USHORT
RETURN ((red SHR 3) SHL 11) + ((green SHR 2) SHL 5) + (blue SHR 3)
END FUNCTION
|
|
Hab ich schon
Das mit dem Assembler werd ich mal probieren, muss allerdings gestehen das mir dafuer immernoch an Verstandliss fehlt
Edit:
Ich muss staunen
Code: |
Function Hrgb (byval red as ubyte, byval green as ubyte, byval blue as ubyte) as UShort
Hrgb=0
ASM
movzx eax, BYTE PTR [ebp+8]
SHR eax, 3
SHL eax, 11
movzx ebx, BYTE PTR [ebp+12]
SHR ebx, 2
SHL ebx, 5
ADD eax, ebx
movzx ebx, BYTE PTR [ebp+16]
SHR ebx, 3
ADD eax, ebx
mov WORD PTR [ebp-4], ax
End ASM
End Function
|
Das Funktioniert sogar besser als erwartet... doch eine Sache...
Woher weiss der was gemeint ist... also im ASM Code uebergebe ich nirgendwo red, green oder blue.. (als ich das machen wollte hat FBC gemeckert )
Edit2:
Die ASM Function so wie ich die oben versucht habe, hat zusammen mit dem counter.bas von MichaelW aus dem Englischem Forum einige 'cycles' langsamer abgeschnitten als die einzeiler Funktion oO? _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.08.2007, 09:17 Titel: |
|
|
Das die Asm - Funktion einige Zyklen länger braucht ist auf die Anweisung 'Hrgb=0' zurückzuführen.
Die richtige Schreibweise in Asm sieht so aus:
Code: | Function Hrgb (Byval red As Ubyte, Byval green As Ubyte, Byval blue As Ubyte) As Ushort
Asm
movzx eax, Byte Ptr [red]
Shr eax, 3
Shl eax, 11
movzx ebx, Byte Ptr [green]
Shr ebx, 2
Shl ebx, 5
ADD eax, ebx
movzx ebx, Byte Ptr [blue]
Shr ebx, 3
ADD eax, ebx
mov word Ptr [Function], ax
End Asm
End Function |
Da siehst du dann auch wie FB die Parameter übergibt, Byte Ptr [ebp+8] = Byte Ptr [red] usw.
Das ist dann aber völlig identisch mit dem Basic-Einzeiler, also keine weitere Geschwindigkeitssteigerung.
EDIT/
Code: | Function Hrgb (Byval red As Ubyte, Byval green As Ubyte, Byval blue As Ubyte) As Ushort
Asm
mov al, Byte Ptr [red]
Shl eax, 5
mov al, Byte Ptr [green]
Shl eax, 6
mov al, Byte Ptr [blue]
Shr eax, 3
mov word Ptr [Function], ax
End Asm
End Function |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.08.2007, 00:24 Titel: |
|
|
Das letzte Edit hat mich nun ein wenig verwirrt...
irgendwie sieht es ja recht schlank und abgespeckt aus gegenueber der darueber... und dachte mir nun, ich versuch das ganze als Funktion so zu uebernehmen (die ASM Routine funktioniert)
Code: |
FUNCTION Hrgb (BYVAL red AS UBYTE, BYVAL green AS UBYTE, BYVAL blue AS UBYTE) AS USHORT
Return ((red SHL 5) + (green SHL 6) + (blue SHR 3))
END FUNCTION |
Das Funktioniert nicht... dann hab ich gesehen das dort ja gar kei ADD ( + ? ) dabei steht... hat mir bei der loesung allerdings nicht viel geholfen  _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.08.2007, 18:03 Titel: |
|
|
Nö,
das bekommt man in Basic nicht so hin.
Mit ein paar Assemblertricks geht es immer ein bischen schneller . _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 31.08.2007, 20:06 Titel: |
|
|
Hallo. Melde mich nach langer Zeit zurück...
Sagt mal, mal eine ganz ganz blöde frage, aber wie kann man einen 3 Byte Farbwert (RGB) in einen zwei Byte Farbwert umwandeln? Ich würde es ja verstehen wenn es 4 zu drei wären, aber is da nicht irgendein klanal bevorzugt und die anderen benachteiligt? _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 31.08.2007, 20:09 Titel: |
|
|
Ja
in Bits teilt es sich so auf RRRRRGGGGGGBBBBB
sprich 5 bits (0-31) fuer Rot ,6 bits (0-63) gruen und wieder 5 fuer blau _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 03.09.2007, 22:57 Titel: |
|
|
Die ASM Routine als Macro innerhalb einer For/Next ist SUUUPEEER
Im vergleich hat die Funktion bei verschiedenen ablaeufen enorm auf die Geschwindigkeit und CPU Last gedrueckt...
Code: |
'#include "counter.bas"
#macro hrgb(red,green,blue)
ASM
mov al, BYTE PTR [red]
SHL eax, 5
mov al, BYTE PTR [green]
SHL eax, 6
mov al, BYTE PTR [blue]
SHR eax, 3
mov word PTR [hrgb_out], ax
END ASM
#EndMacro
Dim red as ubyte
Dim green as ubyte
dim blue as ubyte
dim hrgb_out as ushort
Dim adr as uinteger
Screen 18,16
Dim scr as ushort ptr=Screenptr
'counter_begin
screenlock
Adr=0
for y as integer=0 to 479
For x as integer=0 to 639
red=255 'das ist hier nur so um das 'holen' einer neuen
green=255 'Pixelinformation zu simulieren
blue=255 '... (auch bei rnd hat Macro weit vorne gelegen)
hrgb(red,green,blue)
scr[Adr+x]=hrgb_out
next x
Adr+=640
next y
screenunlock
'counter_end
'?counter_cycles
sleep
|
_________________
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|