Seite 1 von 1

DrawingBuffer() - oder wie komme ich an die Speicheradresse?

Verfasst: 16.06.2011 11:57
von fabulouspaul
Hallo zusammen,

ich habe mal eine(vermutlich einfach zu beantwortende) Newbie-Frage:

für einige Image-Manipulationen müsste ich die Adresse des Speicherbereiches eines Images (also den Anfang des Speicherbereiches, an dem die Pixelinformationen stehen) herausfinden. Aus der Doku habe ich die Funktion DrawingBuffer() gefunden, die das leisten soll. Allerdings möchte ich die Manipulationen nicht im Videospeicher machen sondern wirklich nur im Speicherebereich des Bildes.

Dazu habe ich ungefähr folgende Zeilen gebastelt

Code: Alles auswählen

   original = CreateImage(#PB_Any, 800, 600, 8)
  ...
   org_output = ImageOutput(original)
   org_handle = StartDrawing(org_output)
   org_adr = DrawingBuffer()
  ...
allerdings liefert mir DrawingBuffer() immer nur 0 zurück?

Was mache ich da falsch?

Viele Grüße,
Paul

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Verfasst: 16.06.2011 12:08
von gnasen
leider ist es sehr schwer zu helfen, wenn du keinen lauffähigen Code postest. Aber meine erste Vermutung wäre, dass du

Code: Alles auswählen

StartDrawing(ScreenOutput())
vorher nicht aufgerufen hast.

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Verfasst: 16.06.2011 12:44
von fabulouspaul
gnasen hat geschrieben:leider ist es sehr schwer zu helfen, wenn du keinen lauffähigen Code postest. Aber meine erste Vermutung wäre, dass du

Code: Alles auswählen

StartDrawing(ScreenOutput())
vorher nicht aufgerufen hast.
Vielleicht habe ich auch nur ein Verständnis-Problem.
StartDrawing wird zur Initialisierung von 2D-Grafik-Aktionen benötigt.
Ich möchte jedoch nicht direkt auf den Bildschirm zeichnen (bzw. Bit-Manipulationen durchführen), sondern in einem im Speicher befindlichen Image. Daher bin ich davon ausgegangen, daß ich nicht ScreenOutput(), sondern ImageOutput() verwenden muß.

Mache ich da einen Denkfehler?
Ich habe mal einen Bastelcode zusammengeschrieben, der aber nicht funktioniert, weil ich von DrawingBuffer() nur eine 0 zurück erhalte:

Code: Alles auswählen

Procedure fill2(Number, color)
  Structure Pixel_byte
    pixel.c
  EndStructure
  
  org_output = ImageOutput(Number)
  org_handle = StartDrawing(org_output)
  *org_adr.Pixel_byte = DrawingBuffer() 
  For i = 0 To ImageWidth(Number) * ImageHeight(Number) -1
    *org_adr\pixel = color
    *org_adr + 1
  Next i
  StopDrawing()
EndProcedure
  

If OpenWindow(0, 216, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(0))

    original = CreateImage(#PB_Any, 800, 600, 8)
    org_id = ImageID(original)
    
    ImageGadget(1, 0, 0, 800, 600, org_id) 
    
    fill2(original, 189)
    SetGadgetState(1, org_id) 
    
  EndIf
EndIf

MessageRequester("Ende", "Programm-Ende")

End

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Verfasst: 16.06.2011 13:15
von gnasen
Ja, du hast natürlich recht, der ScreenOutput() war nur als Beispiel. Dein Code funktioniert bei mir übrigens einwandfrei, wenn du die 8bit Farbtiefe durch 32bit ersetzt. Zumindest in PB4.51 (bei mir) ist 8bit glaube ich nicht unterstützt.

In deinem Beispiel hast du natürlich nie die Chance, das Ergebnis zu sehen. Während einer Messagebox wird das Fenster nicht neu gezeichnet! Also erstmal eine Eventschleife bauen. Zudem muss evtl das Gadget refreshed werden. Ich würde dir gerne ein Beispiel fertig machen, aber ich muss leider weg, die Arbeit ruft, sry :wink:

Re: DrawingBuffer() - oder wie komme ich an die Speicheradre

Verfasst: 16.06.2011 14:05
von fabulouspaul
gnasen hat geschrieben:Ja, du hast natürlich recht, der ScreenOutput() war nur als Beispiel. Dein Code funktioniert bei mir übrigens einwandfrei, wenn du die 8bit Farbtiefe durch 32bit ersetzt. Zumindest in PB4.51 (bei mir) ist 8bit glaube ich nicht unterstützt.

In deinem Beispiel hast du natürlich nie die Chance, das Ergebnis zu sehen. Während einer Messagebox wird das Fenster nicht neu gezeichnet! Also erstmal eine Eventschleife bauen. Zudem muss evtl das Gadget refreshed werden. Ich würde dir gerne ein Beispiel fertig machen, aber ich muss leider weg, die Arbeit ruft, sry :wink:
OK, ich hatte mir mal irgendwann die Demo von PB 4.2 runtergeladen, mit der ich hin und wieder mal was ausprobiere. Kann sein, daß es deshalb bei mir nicht funzt. ...da muss ich wohl mal aktualisieren. ;-)

Übrigens sehe ich das Ergebnis schon (habe mal eine Schleife mit herkömmlichen Zeichenfunktionen statt der Speichermanipulation gebastelt). Durch das SetGadgetState vor dem Messagerequester wird ja das Image aktualisiert.