Seite 1 von 1
DrawingBufferPixelFormat: wie verwenden
Verfasst: 14.06.2008 11:00
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
Verfasst: 14.06.2008 11:12
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
Verfasst: 14.06.2008 11:22
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 ^^

Verfasst: 14.06.2008 11:29
von PureProgger
Sorry,
in der Hilfe steht nix davon, dass das alles von 1-7 nummeriert ist!
gruß Michael
Verfasst: 14.06.2008 11:31
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!
Verfasst: 14.06.2008 11:32
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
Verfasst: 14.06.2008 11:46
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
Verfasst: 14.06.2008 12:12
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.
Verfasst: 14.06.2008 12:23
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
Verfasst: 14.06.2008 12:34
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...