Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Hrgb Farbwert in 16bit

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.08.2007, 16:09    Titel: Hrgb Farbwert in 16bit Antworten mit Zitat

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 verwundert

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 grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.08.2007, 16:48    Titel: Antworten mit Zitat

so glaube ich scheint es in angemessener Geschwindigkeit zu funktionieren happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 28.08.2007, 21:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 29.08.2007, 00:49    Titel: Antworten mit Zitat

ahh... da danke ich Dir, meiner selbstzweifel ob es (wirklich?) Funktioniert, doch die ergebnisse waren bisher ueberzeugend grinsen

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 zwinkern grinsen

Das mit dem Assembler werd ich mal probieren, muss allerdings gestehen das mir dafuer immernoch an Verstandliss fehlt verwundert

Edit:
Ich muss staunen geschockt


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 happy)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 29.08.2007, 09:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.08.2007, 00:24    Titel: Antworten mit Zitat

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 grinsen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 30.08.2007, 18:03    Titel: Antworten mit Zitat

Nö,
das bekommt man in Basic nicht so hin.
Mit ein paar Assemblertricks geht es immer ein bischen schneller zwinkern .
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 31.08.2007, 20:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 31.08.2007, 20:09    Titel: Antworten mit Zitat

Ja happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 03.09.2007, 22:57    Titel: Antworten mit Zitat

Die ASM Routine als Macro innerhalb einer For/Next ist SUUUPEEER grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz