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 / Impressum
  Heute ist .
Aktueller Forenpartner:

X11.bi - FB-Imagebuffer darstellen

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



Anmeldungsdatum: 23.09.2007
Beiträge: 748

BeitragVerfasst am: 21.03.2010, 20:19    Titel: X11.bi - FB-Imagebuffer darstellen Antworten mit Zitat

hat jemand eine idee, wie es schneller gehen könnte einen Freebasic-Imagebuffer in einem X11-Fenster zu zeichnen?

bisher sieht das bei mir so aus:

( man benötigt die X11.bi von http://www.alice-dsl.net/d.j.peters/libs/X11.bi )

Code:

'test02.bas

#include "X11.bi"

#ifndef true
#define true (1<>0)
#endif
#ifndef false
#define false (1<>1)
#endif
#ifndef boolean
#define boolean integer
#endif
'creates graphic context GCs by diffrent colors
Function create_foreground_gc(Byval display As DISPLAY Ptr, _
                              Byval win     As WindowID, _
                              Byval strRGB  As String) As GContext
  Dim As XCOLOR col,nearest
  Dim As XGCValues gcv
  XAllocNamedColor(display,XDefaultColormap(display,XDefaultScreen(display)), _
                   strRGB,@col, nearest)
  gcv.foreground =col.pixel
  Return XCreateGC(display,win, GCForeground,gcv)
End Function


Dim As Display Ptr          display
Dim As WindowID             win
Dim As XSetWindowAttributes setattributes
Dim As GContext             red_gc,blue_gc,green_gc
Dim As XEvent               report
Dim As ATOM                 wm_delete
Dim As Boolean              blnExit
Dim As Integer              screen_num,win_width,win_height

screen 16,32
cls
dim bild as any ptr = imagecreate(400,400,RGB(0,255,0))
line bild, (0,0)-(399,399),RGB(255,0,0),B
line bild, (0,0)-(399,399),RGB(0,0,255)

'open X connection
display    = XOpenDisplay()
'use macros
screen_num =DefaultScreen(display)
win_width  =DisplayWidth(display,screen_num)
win_height =DisplayHeight(display,screen_num)

setattributes.background_pixel = WhitePixel(display,screen_num)
'create window (last examples it was XCreateSimpleWindow)
win = XCreateWindow(display,RootWindow(display,screen_num), _
                    0, 0, win_width,win_height, 1, _
                    DefaultDepth (display,screen_num),InputOutput, _
                    DefaultVisual(display,screen_num),CWBackPixel, setattributes)
'tell X what for events
XSelectInput(display,win,ClientMessage Or StructureNotifyMask Or ExposuRemask or KeyPressMask or PointerMotionMask) ' or ResizeRedirectMask

'We need the close event from Windowmanager
wm_delete  = XInternAtom(display,"WM_DELETE_WINDOW",False)
'register it
XSetWMProtocols(display,win,wm_delete,1)
'three diffrent GC
red_gc  =Create_Foreground_GC(display,win,"rgb:ff/00/00")
green_gc=Create_Foreground_GC(display,win,"rgb:00/ff/00")
blue_gc =Create_Foreground_GC(display,win,"rgb:00/00/ff")
'clear and flush the buffer
XFlush    (display)
'show the window
XMapWindow(display,win)
'draw a little bit
XDrawLine  (display,win,red_gc  ,  0,  0, 320,199)
XDrawLine  (display,win,green_gc,100,  0,   0,199)
XDrawString(display,win,blue_gc ,80,100,"hello",5)
dim c as GContext
dim bildpixel as uinteger
dim ppointer as ubyte ptr
dim rot as ubyte
dim gruen as ubyte
dim blau as ubyte
for x as integer = 0 to 399
    for y as integer = 0 to 399
   bildpixel = point(x,y,bild)
   ppointer = cast(ubyte ptr, @bildpixel)
   rot = ppointer[0]
   gruen = ppointer[1]
   blau = ppointer[2]
   
   c = Create_Foreground_GC(display,win,"rgb:" & hex(rot) & "/" & hex(gruen) & "/" & hex(blau))
   XDrawPoint(display, win, c, x,y)
    next
next
'update all
XFlush    (display)

'our message loop


While blnExit = false
  'wait on next event
  XNextEvent(display,report)
  'what was it
  Select Case (report.eventtype)
    'an key to exit (only if any makes trouble)
    Case KeyPress
      Print "KeyPress"
      'blnExit=True
    Case KeyRelease
      Print "KeyRelease"
    Case ButtonPress
      Print "ButtonPress"
    Case ButtonRelease
      Print "Button Release"
    Case MotionNotify
      'print "MotionNotify"
      'switch between the colors / GC's
      Swap red_gc,green_gc:Swap green_gc,blue_gc
      XDrawArc(display,win,red_gc,report.xmotion.x-5,report.xmotion.y-5,10,10,0,360*64)
    Case EnterNotify
      Print "EnterNotify"
    Case LeaveNotify
      Print "LeaveNotify"
    Case FocusIn
      Print "FocusIn"
    Case FocusOut
      Print "FocusOut"
    Case KeymapNotify
      Print "KeymapNotify"
    Case Expose
      Print "Expose";report.XExpose.count
      If report.XExpose.count=0 Then
        XClearWindow(display,win)
        win_width =report.xexpose.Width
        win_height=report.xexpose.Height
        XDrawLine  (display,win,red_gc  ,0,           0,win_width,win_height )
        XDrawLine  (display,win,green_gc,0,win_height\2,win_width,win_height\2)
        XDrawString(display,win,blue_gc ,win_width\2-40,win_height\2,"hello",5)
        XDrawArc   (display,win,blue_gc ,win_width\2-50,win_height\2-50,100,100,0,180*64)
for x as integer = 0 to 399
    for y as integer = 0 to 399
   bildpixel = point(x,y,bild)
   ppointer = cast(ubyte ptr, @bildpixel)
   rot = ppointer[0]
   gruen = ppointer[1]
   blau = ppointer[2]
   
   c = Create_Foreground_GC(display,win,"rgb:" & hex(rot) & "/" & hex(gruen) & "/" & hex(blau))
   XDrawPoint(display, win, c, x,y)
    next
next

      End If

    Case GraphicsExpose
      Print "GraphicsExpose"

    Case NoExpose
      Print "Noxpose"
    Case VisibilityNotify
      Print "VisibiltyNotify"
    Case CreateNotify
      Print "CreateNotify"
    Case DestroyNotify
      Print "DestroyNotify"
    Case UnmapNotify
      Print "UnmapNotify"
    Case MapNotify
      Print "MapNotify"
    Case MapRequest
      Print "MapRequest"
    Case ReparentNotify
      Print "ReparentNotify"
    Case ConfigureNotify
      Print "ConfigureNotify"
    Case ConfigureRequest
      Print "ConfigureRequest"
      win_width =report.XConfigure.Width
      win_height=report.XConfigure.Height
    Case GravityNotify
      Print "GravityNotify"
    Case ResizeRequest
      Print "ResizeRequest"
    Case CirculateNotify
      Print "CirculateNotify"
    Case CirculateRequest
      Print "CirculateRequest"
    Case PropertyNotify
      Print "PropertyNotify"
    Case SelectionClear
      Print "SelectionClear"
    Case SelectionRequest
      Print "SelectionRequest"
    Case SelectionNotify
      Print "SelectionNotify"
    Case ColormapNotify
      Print "ColormapNotify"

    'Our registered clientmessage from windowmanager
    Case ClientMessage
      Print "ClientMessage"
      If report.xclient.l(0)=wm_delete Then blnExit=True
    Case MappingNotify
      Print "MappingNotify"
    Case Else
      Print "!!! OTHER !!!"
  End Select

Wend

'free all resources
XFreeGC(display,red_gc)
XFreeGC(display,green_gc)
XFreeGC(display,blue_gc)
XDestroyWindow(display,win)

'close connection
XCloseDisplay(display)

'thats all for now ;-)
End


mein beispiel funktioniert absolut indiskutabel schlecht.. aber ich bekomm das leider nicht besser hin traurig( .. kann man mit XPutImage irgendwie einen Freebasic-buffer ausgeben? (http://tronche.com/gui/x/xlib/graphics/XPutImage.html)

Und wenn das nicht schon genug wäre, ich verstehe diese api einfach nicht.. was sind GCs? Also GraphicContexts?? Definiert man damit die Farbe oder wie oder was? Eigentlich kann ich englisch einigermaßen, aber das manual der api ist mir echt ein graus..

übrigens sind irgendwie 2 versionen von der X11.bi auf meinem computer gelandet. Bei der einen sind die bool-ausdrücke bereits definiert, in der anderen nicht. .. vielleicht weiss einer wo man die aktuellste version bekommt..

vielen dank schon mal!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 25

BeitragVerfasst am: 22.03.2010, 00:05    Titel: Antworten mit Zitat

So einfach wie Du vermutest ist es aber nicht.
Sicherlich kannst Du RGB Pixel von FreeBASIC in einem X11 image schreiben und zeichnen.

!!! ABER !!!

XImages sind immer in dem Format des Visuals des X Desktops
das kann z.B. RGB oder RGBA sein in verschiedenen bits per pixel also
8,8,8 oder 8,8,8,8 oder 5,5,5 oder 5,6,5 oder 5,5,6 sogar 12,12,12 oder 16,16,8 sind möglich

Daher braucht GTK/QT und FreeBASIC einen einen Konverter/Blitter.

Selbst wenn Du genau weist das Dein aktueller Deskop 24Bit 8:8:8 benutzt
dann wird Dein Programm auf einen Rechner mit 5:6:5 sehr schlecht aussehen
und vermutlich abstürzen weil der 8:8:8 Pixelbuffer größer ist als ein 5:6:5 und übers Ziel hinaus schießen würde.

Einfacher Du nimmst gdk_draw_rgb_image dann brauchst Du dich
nicht um das Konvertieren mehr kümmern.

Probier mal das Beispiel "gdk_image.bas"
zu finden unter freebasic/examples/libraries/Gtk

Wenn Du das Beispiel verstanden hast dann kannst Du auch
FB Images als GDK RGB buffer Zeichnen.

Micha
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 748

BeitragVerfasst am: 22.03.2010, 09:40    Titel: Antworten mit Zitat

@micha: WOW! Das ist eine selten fundierte Antwort grinsen .. das bin ich ja fast gar nicht gewöhnt XD ..

Erstmal auch vielen vielen dank für deine antwort!! .. hm, ok, das dies so schwierig sein könnte hab ich nicht gedacht.

Das beispiel gdk_draw_rgb_image könnte mir tatsächlich weiterhelfen.. meine erste versuche in der richtung habe ich auch mit gtk versucht, war aber kläglich gescheitert XD ..

noch eine frage, wo ist der unterschied zwischen gdk und gtk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 748

BeitragVerfasst am: 22.03.2010, 11:11    Titel: Antworten mit Zitat

@micha: so ein mist.. jetzt steh ich vor nem anderen problem traurig .. die funktion gdk_draw_rgb_image nimmt nur 24-bittige images entgegen. Die Freebasic-buffer sind aber mit alpha kanal, also in 32-bit farbtiefe traurig .. deswegen kann ich die speicherbereiche nicht direkt in einem stück kopieren traurig

kann man das irgendwie mit gdk_draw_rgb_image_dithalign bewerkstelligen?
die referenz http://library.gnome.org/devel/gdk/stable/gdk-GdkRGB.html#gdk-draw-rgb-image-dithalign sagt mir leider nicht viel traurig

der weg gefällt mir aber ansonsten sehr gut!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1392

BeitragVerfasst am: 22.03.2010, 14:54    Titel: Antworten mit Zitat

gdk_draw_rgb_32_image()

Das ignoriert den Alphakanal einfach (Padding)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 748

BeitragVerfasst am: 23.03.2010, 01:16    Titel: Antworten mit Zitat

KRASS!! VIELEN DANK!! DAS FUNKTIONIERT grinsen

Aber weils so viel spaß macht:

ich möchte maus und tastaturevents von drawingarea-widget empfangen. ich weiss aber nicht, wie diese events heissen.

hab in einer referenz zur drawingarea folgendes gefunden:

Mouse and button press signals to respond to input from the user. Use the gtk.Widget.add_events() method to enable events you wish to receive. To receive keyboard events, you will need to set the gtk.CAN_FOCUS flag on the drawing area

(http://www.pygtk.org/docs/pygtk/class-gtkdrawingarea.html)

wie funktioniert diese widget.add_events()-methode? aus der beschreibung werd ich irgendwie nich schlau.. eigentlich bin ich nicht sonderlich begriffstutzig, aber aus englischen referenzen werd ich schnell nich schlau traurig(
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 748

BeitragVerfasst am: 23.03.2010, 01:34    Titel: Antworten mit Zitat

hm.. ich glaub ich habs schon lächeln ..

mit gtk_widget_add_events(drawarea, GDK_BUTTON_PRESS_MASK) hats geklappt lächeln nun reagiert das drawingarea-widget auf "mouse_press_event" lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Linux-spezifische Fragen 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