OpenWindow mit mit Grafik manipulieren , Byte reinschreiben

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

OpenWindow mit mit Grafik manipulieren , Byte reinschreiben

Beitrag von funkheld »

Hallo, guten Tag.
Wie breit und hoch ist bitte dieses Window : 0,0,512,512 ?
512 oder 513 Pixel ? Ich brauche eines welches 512 Pixel breit/hoch ist.

Ich möchte bitte Bytes reinschreiben in diesem Window.
Von oben links nach oben rechts und wieder eine Zeile tiefer usw.
Wie kann man die Anfangsadresse ermittel und dann reinschreiben ?
Die Pixel der Bytes sollen nur Schwarz/Weiss.

Dann möchte ich bitte ein Menü erstellen.
Zählt das Menü noch in den 512 Pixel rein ?

Wie funktioniert das ?

Code: Alles auswählen

 Enumeration
      #Window_0    
    EndEnumeration

    InitSprite()
    InitKeyboard()

    OpenWindow(#Window_0,0,0,512,512,"test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
 
    Repeat

      Event = WaitWindowEvent()

      Select Event
        Case #PB_Event_Gadget
          EventGadget = EventGadget()
          EventType = EventType()

        Case #PB_Event_CloseWindow
          EventWindow = EventWindow()
          If EventWindow = #Window_0
            CloseWindow(#Window_0)
            Break
          EndIf
      EndSelect

    ForEver
Danke.

Gruss
peter
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von STARGÅTE »

Du kannst die normalen Drawing-Befehle verwenden:

Code: Alles auswählen

Enumeration
	#Window_0
EndEnumeration

InitSprite()
InitKeyboard()

OpenWindow(#Window_0,0,0,512,512,"Test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

Repeat
	
	Event = WaitWindowEvent()
	
	Select Event
		Case #PB_Event_CloseWindow
			End
		Case #PB_Event_Repaint
			If StartDrawing(WindowOutput(#Window_0))
				For N = 1 To 10000
					Plot(Random(511), Random(511), Random(1)*$FFFFFF)
				Next
				StopDrawing()
			EndIf
			
	EndSelect
	
ForEver
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
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von funkheld »

Jup, danke.
Ich möchte direkt die Bytes reinschreiben an eine Adresse keine einzelnen Pixel. Es soll möglichs schnell sein, bzw das schnellste. Und nur schwarz/weiß.
Es kommt sonst nichts auf dem Window drauf.

Wie geht das ?

Danke.

Gruss
peter
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von STARGÅTE »

Die Outputadresse bekommst du mit DrawingBuffer().
Zusätzlich brauchst du DrawingBufferPitch() und DrawingBufferPixelFormat() um (weil du ja nicht ein einfachen Weg gehen willst) selbst ermitteln musst, wie viel Speicher eine Bildzeile einnimmt und in welchem Format die Bildpunkte gespeichert werden (3 oder 4 Byte pro Pixel, RGB oder BGR)
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
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von funkheld »

Zusätzlich brauchst du DrawingBufferPitch() und DrawingBufferPixelFormat() um (weil du ja nicht ein einfachen Weg gehen willst) selbst ermitteln musst, wie viel Speicher eine Bildzeile einnimmt und in welchem Format die Bildpunkte gespeichert werden (3 oder 4 Byte pro Pixel, RGB oder BGR)
Au backe, du zählst mir soviel auf.
Kannst du mir mal für ein kleines Muster erstellen.
Ich möchte es als RGB und eigentlich soll das Byte nur schwarz/weiß sein.

Wie zählt man denn eigentlich die 0-512 (512 Pixel) 0-511(512 Pixel) ?

Danke.

Gruss
peter
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von STARGÅTE »

funkheld hat geschrieben:Ich möchte es als RGB und eigentlich soll das Byte nur schwarz/weiß sein.
Um möchten gehts hier nicht. Du musst herausfinden, welches Format das Window haben will.
Nur dann kannst du entscheiden, welche Bytes gesetzt werden müssen, damit eine bestimmte Farbe (halt weiß/schwarz) rauskommt.

Im übrigen sehe ich gerade, dass die Befehle unter WindowOutput garnicht funktionieren.
Von daher rate ich dir die Drawing-Befehle zu verwenden, ohne Debugger sind die auch sehr schnell.
funkheld hat geschrieben:Wie zählt man denn eigentlich die 0-512 (512 Pixel) 0-511(512 Pixel) ?
512 Pixel gehen von 0 bis 511
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
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von funkheld »

Hmmm..., das ist nicht gut.

Geht das irgendwie mit Directx , in die Adresse von WindowOutputein Byte zu schreiben ?

Dank.

Gruss
peter
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von funkheld »

Hallo, in der For-Schleife geht das Startdrawing nicht, das Windowfenster friert ein.
Warum ?
Nur wenn die For-Schleife in der Startdrawing ist, aber dann sehe ich das Bild erst, wenn es fertig ist.
Das möchte ich nicht.

Danke.

Gruss

Code: Alles auswählen

    Enumeration
      #Window_0    
    EndEnumeration

    InitSprite()

    OpenWindow(#Window_0,0,0,600,600,"test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
    OpenWindowedScreen(WindowID(#Window_0), 10, 10, 512,512)
    
    StartDrawing(ScreenOutput())
      Buffer      = DrawingBuffer()             
      ;Pitch       = DrawingBufferPitch()        
       ;PixelFormat = DrawingBufferPixelFormat()    
       buffer1=buffer
    StopDrawing()
        
    Repeat

      Event = WaitWindowEvent()
       For y = 1 To 3
          For x = 1 To 512
            StartDrawing(ScreenOutput())
              buffer=buffer+4
              PokeL(buffer,$ff0000)
            StopDrawing() 
            Delay(10)
          Next
        Next   
       buffer=buffer1
       
      Select Event
        Case #PB_Event_Gadget
          EventGadget = EventGadget()
          EventType = EventType()

        Case #PB_Event_CloseWindow
          EventWindow = EventWindow()
          If EventWindow = #Window_0
            CloseWindow(#Window_0)
            Break
          EndIf
      EndSelect

    ForEver
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von NicTheQuick »

Entschuldige bitte, aber stellst du dich extra so dran?

Du siehst doch selbst, warum es so lange dauert. Die beiden verschachtelten For-Schleifen zusammen rufen den Start-/StopDrawing-Block 512 * 3 mal auf und machen genau so oft ein 'Delay(10)', d.h. das komplette Schleifenkonstrukt braucht schon mal mindestens über 15 Sekunden nur für das Delay und dann ist da noch die Sache mit dem StartDrawing, das viel zu oft aufgerufen wird. Normalerweise rufst du das einmalig vor der For-Schleife auf, dann malst du alle Pixel rein, die du sehen willst, und zwar OHNE ein Delay und nach der For-Schleife kommt dann das StopDrawing.
Und das Fenster friert eben genau wegen diesen 15 Sekunden oder mehr ein, weil dann keine Events mehr von 'WaitWindowEvent()' empfangen werden können.


Was ist eigentlich dein genaues Ziel? Woher hast du die Byte-Daten? Welche Werte haben diese Bytes? Sollen vielleicht sogar die einzelnen Bits dieser Bytes jeweils einen Pixel ausmachen?

Die effektivste Herangehensweise um hier eine Antwort zu bekommen, die dich zufrieden stellt, ist zunächst einmal die Voraussetzungen darzulegen und das Ziel, was dahinter steckt. Wahrscheinlich ist die Frage wie man am schnellsten Bytes irgendwie schwarz und weiß auf ein Fenster kriegt und das auch noch ganz schnell die falsche Frage.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: OpenWindow mit mit Grafik manipulieren , Byte reinschrei

Beitrag von funkheld »

Entschuldigung , das Delay muss raus, hatte es nur mal zu irgendeinen Test drin.

So friert das Windowprogramm ein:

Code: Alles auswählen

For y = 1 To 3
For x = 1 To 512
StartDrawing(ScreenOutput())
buffer=buffer+4
PokeL(buffer,$ff0000)
StopDrawing() 
Next
Next   
Ich möchte ein Buchstabe schreiben der je 8 Pixel breit ist und 8 Pixel hoch ist.
Das soll eine Art Z1013-Screen sein mit 256x256 Pixel bzw 32x32 Zeichen.
Ich möchte dann auch einen Pixel zeitlich Plotten, dabei muss aber jedesmal die Startdrawing verlassen werden. Irgendwie blockiert aber diese For-Schleife ?

Gruss
peter
Zuletzt geändert von funkheld am 08.05.2013 16:48, insgesamt 1-mal geändert.
Antworten