DrawingBufferPixelFormat: wie verwenden

Anfängerfragen zum Programmieren mit PureBasic.
PureProgger
Beiträge: 40
Registriert: 19.12.2006 18:38

DrawingBufferPixelFormat: wie verwenden

Beitrag von PureProgger »

Verschoben aus BUGs, deswegen die Formulierungen.
______________________________________


Hallo,

bekomme nach dem Aufruf von DrawingBuffer() immer eine 7 zurück bei DrawingBufferPixelFormat().
Muss den Wert immer manuell ändern damit es korrekt angezeigt wird

Beispiel : Pixelgewusel

Code: Alles auswählen

#ScreenWidth  = 320  ; Feel free to change this to see the pixel filling speed !
#ScreenHeight = 200

x.l
y.l
col.l
i.l
PixelFormat.l
Buffer.l
Pitch.l

If InitSprite() = 0 Or InitKeyboard()=0
  MessageRequester("Error","DirectX 7+ is needed.",0)
EndIf

Structure Pixel
  Pixel.l
EndStructure

If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")

  Repeat

    StartDrawing(ScreenOutput())
    
      Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
      Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
      PixelFormat = DrawingBufferPixelFormat()  ; Get the pixel format. 
             
      For i=1 To 100000
         
        x=Random(#ScreenWidth-1)
        y=Random(#ScreenHeight-1)
        col=RGB(Random(255),Random(255),Random(255))
        *Line.Pixel = Buffer + (Pitch*y) + (x*4) ; <---Pixelformat sollte 4 sein
        *Line\Pixel=col
       
      Next
                     
    StopDrawing()
      
    ExamineKeyboard()
    
    FlipBuffers()
     
  Until KeyboardPushed(#PB_Key_Escape)

Else

  MessageRequester("Error","Can't open the screen !",0)
  
EndIf

Debug Pixelformat

End

gruß Michael
PB 4.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wo ist das problem?
Help hat geschrieben:DrawingBufferPixelFormat()

Syntax

Ergebnis = DrawingBufferPixelFormat()
Beschreibung

Gibt das aktuelle Video-Format zurück. Das Ergebnis kann einer der folgenden Werte sein:
#PB_PixelFormat_8Bits ; 1 Byte pro Pixel, mit Palette ("palettized")
#PB_PixelFormat_15Bits ; 2 Byte pro Pixel
#PB_PixelFormat_16Bits ; 2 Byte pro Pixel
#PB_PixelFormat_24Bits_RGB ; 3 Byte pro Pixel (RRGGBB)
#PB_PixelFormat_24Bits_BGR ; 3 Byte pro Pixel (BBGGRR)
#PB_PixelFormat_32Bits_RGB ; 4 Byte pro Pixel (RRGGBB)
#PB_PixelFormat_32Bits_BGR ; 4 Byte pro Pixel (BBGGRR)


DrawingBuffer() muss vor dem Verwenden dieses Befehls aufgerufen werden.
die 7 die du bekommst ist #PB_PixelFormat_32Bits_BGR,
die Information ist völlig korrekt.
du musst natürlich aus deinem PixelFormat erst eine PixelSize derivieren:

Code: Alles auswählen

Format | Konstante                    |  BpP
-------+------------------------------+-------
   1   | #PB_PixelFormat_8Bits        |   1
   2   | #PB_PixelFormat_15Bits       |   2
   3   | #PB_PixelFormat_16Bits       |   2
   4   | #PB_PixelFormat_24Bits_RGB   |   3
   5   | #PB_PixelFormat_24Bits_BGR   |   3
   6   | #PB_PixelFormat_32Bits_RGB   |   4
   7   | #PB_PixelFormat_32Bits_BGR   |   4

BpP = Int( DrawingBufferPixelFormat() / 2 ) +1
also bitte, erst mal die Help lesen, notfalls nachfragen,
und erst ganz zuletzt wenn man wirklich sicher ist nen Bug-Bericht posten....


Dieser Thread wird später verschoben, zunächst mal soll er ihn wiederfinden.
Kaeru
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

>also bitte, erst mal die Help lesen, notfalls nachfragen,
>und erst ganz zuletzt wenn man wirklich sicher ist nen Bug-Bericht posten....

@Kaeru Gaman
Sry fürs OT aber diese Animationeb sind einfach so pasend ^^
Bild
Bild
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
PureProgger
Beiträge: 40
Registriert: 19.12.2006 18:38

Beitrag von PureProgger »

Sorry,

in der Hilfe steht nix davon, dass das alles von 1-7 nummeriert ist!

gruß Michael
PB 4.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

in der Hilfe stehen die Konstanten, die du zurückbekommst.
das diese Werte repräsentieren, sollte man eigentlich wissen.
Notfalls debugt man sich die Konstanten mal alle, hab ich schließlich auch grad gemacht.

aber die Help sagt eindeutig, dass der Rückgabewert nicht die Byte-Tiefe eines Pixels ist!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Syntax

Ergebnis = DrawingBufferPixelFormat()

Beschreibung

Gibt das aktuelle Video-Format zurück. Das Ergebnis kann einer der folgenden Werte sein: 

  #PB_PixelFormat_8Bits       ; 1 Byte pro Pixel, mit Palette ("palettized")
  #PB_PixelFormat_15Bits      ; 2 Byte pro Pixel 
  #PB_PixelFormat_16Bits      ; 2 Byte pro Pixel
  #PB_PixelFormat_24Bits_RGB  ; 3 Byte pro Pixel (RRGGBB)
  #PB_PixelFormat_24Bits_BGR  ; 3 Byte pro Pixel (BBGGRR)
  #PB_PixelFormat_32Bits_RGB  ; 4 Byte pro Pixel (RRGGBB)
  #PB_PixelFormat_32Bits_BGR  ; 4 Byte pro Pixel (BBGGRR)
Und beim Debuggen wird nun mal die Konstante zurückgegeben, natürlich nicht als Name sonder als Wert.

Also von oben nach unten:
1
2
3
4
5
6
7
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
PureProgger
Beiträge: 40
Registriert: 19.12.2006 18:38

Beitrag von PureProgger »

Hmm,

eindeutig ist für mich was anderes!

Und wenn du es auch erst genau wußtest nachdem du es debuggt hast kannst du es auch nicht genau gewußt haben!
Wenn hinter der Konstante was von Bytes steht geh ich mal davon aus, das dies der Rückgabewert ist! Und nicht etwas von 1-7

gruß Michael
PB 4.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> eindeutig ist für mich was anderes!

wenn da steht
> Das Ergebnis kann einer der folgenden Werte sein:
und dann folgen sieben konstanten, dann ist es selbstverständlich, dass diese Konstanten unterschiedliche werte haben.

wie wolltest du denn 32Bits_RGB und 32Bits_BGR unterscheiden, wenn beide 4 zurückliefern würden?

welche werte sie genau haben, musste ich selbstverständlich debuggen, sowas hat man nunmal nicht im Kopf.


> Wenn hinter der Konstante was von Bytes steht geh ich mal davon aus, das dies der Rückgabewert ist! Und nicht etwas von 1-7

tja, damit hast du dann aber nicht mitgedacht.
dort steht nirgens, dass die Konstanten als Wert die Bytelänge haben.
dort steht vielmehr, dass sie dazu dienen, sieben verschiedene Formate zu unterscheiden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Dem numerischen Wert der Konstanten sollte man keinerlei Bedeutung
beimessen, sondern lediglich die Konstanten auswerten. Der Wert könnte
sich in der nächsten Version von PB geändert haben, aber die Konstante
wird wohl bleiben und der Code, welcher die Konstante verwendet
problemlos seine Funktion erfüllen.

Es ist zwar eher unwahrscheinlich, das sich Werte von Konstanten ändern,
aber es ist sinn und zweck dieser, diese Möglichkeit offen zu halten, ohne
das irgendein Source geändert werden muß.

Desweiteren machen Konstanten den Code auch leserlicher
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Dem numerischen Wert der Konstanten sollte man keinerlei Bedeutung
> beimessen, sondern lediglich die Konstanten auswerten.

durchaus richtig, obwohl es bei PB vornehmlich darum geht, dass auf Windows,
Linux und OSX die dinge die eine gleiche Funktion haben den gleichen Konstantennamen
tragen, auch wenn sie unterschiedliche Werte repräsentieren.

zum Beispiel bei der Keyboard-Lib kommt das zum tragen:
die Abfrage If KeyboardPushed(#PB_Key_Space) liefert auf allen drei OS #True,
wenn die Leertaste gedrückt wurde, obwohl die Konstanten unterschiedliche Zahlenwerte haben,
weil die unterschiedlichen OS die Tastatur unterschiedlich tabellieren.

@Topic
also genaugenommen geht es so korrekt:

Code: Alles auswählen

; *** Byte Per Pixel korrekt ermitteln

Select DrawingBufferPixelFormat()

  Case #PB_PixelFormat_8Bits       ; 1 Byte pro Pixel, mit Palette ("palettized")
    BytePerPixel = 1

  Case #PB_PixelFormat_15Bits      ; 2 Byte pro Pixel 
    BytePerPixel = 2

  Case #PB_PixelFormat_16Bits      ; 2 Byte pro Pixel
    BytePerPixel = 2

  Case #PB_PixelFormat_24Bits_RGB  ; 3 Byte pro Pixel (RRGGBB)
    BytePerPixel = 3

  Case #PB_PixelFormat_24Bits_BGR  ; 3 Byte pro Pixel (BBGGRR)
    BytePerPixel = 3

  Case #PB_PixelFormat_32Bits_RGB  ; 4 Byte pro Pixel (RRGGBB)
    BytePerPixel = 4

  Case #PB_PixelFormat_32Bits_BGR  ; 4 Byte pro Pixel (BBGGRR)
    BytePerPixel = 4

EndSelect
man kann natürlich auch mit de4m Rückgabewert rechnen, wie ich das oben gemacht habe,
aber dann sollte man sicherheitshalber noch mal die Konstanten debuggen,
bevor man die formel implementiert, um auf nummer sicher zu gehen.


und btw:
> wenn du es auch erst genau wußtest nachdem du es debuggt hast kannst du es auch nicht genau gewußt haben
ich wollte vornehmlich wissen, von was für einer 7 du eigentlich redest...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten