diff --git a/desmume/src/gtk-glade/callbacks_IO.c b/desmume/src/gtk-glade/callbacks_IO.c index 1f9c61faf..74167e446 100755 --- a/desmume/src/gtk-glade/callbacks_IO.c +++ b/desmume/src/gtk-glade/callbacks_IO.c @@ -22,8 +22,7 @@ #include "callbacks_IO.h" -// uncomment this if you want to debug -// non working opengl +// comment for GL :D #undef HAVE_LIBGDKGLEXT_X11_1_0 static u16 Cur_Keypad = 0; @@ -113,7 +112,8 @@ void decode_screen () { pixel++; } } -#define LOOP(a,b,c,d,e,f) \ +#ifndef HAVE_LIBGDKGLEXT_X11_1_0 + #define LOOP(a,b,c,d,e,f) \ L=W*ScreenCoeff_Size; \ BL=L*sizeof(u32); \ for (a; b; c) { \ @@ -129,7 +129,14 @@ void decode_screen () { rgb32 += L; \ } \ } - +#else + #define LOOP(a,b,c,d,e,f) \ + for (a; b; c) { \ + for (d; e; f) { \ + rgb32 = image[y][x]; rgb32++; \ + } \ + } +#endif /* load pixels in buffer accordingly */ if (ScreenRotate) { W=RAW_H; H=RAW_W; @@ -141,82 +148,33 @@ void decode_screen () { } } -int unrealized=2; - -gboolean screen (GtkWidget * widget, int offset_pix) { - int H,W,L; #ifndef HAVE_LIBGDKGLEXT_X11_1_0 + +// they are empty if no opengl +void init_GL_capabilities(GtkWidget * widget) {} +void init_GL(GtkWidget * widget, int screen) {} +void reshape (GtkWidget * widget) {} + +gboolean screen (GtkWidget * widget, int off) { + int H,W,L; if (ScreenRotate) { W=RAW_H; H=RAW_W; } else { H=RAW_H; W=RAW_W; } L=W*ScreenCoeff_Size*sizeof(u32); - + off*= offset_pixels_lower_screen(); gdk_draw_rgb_32_image (widget->window, widget->style->fg_gc[widget->state],0,0, W*ScreenCoeff_Size, H*ScreenCoeff_Size, - GDK_RGB_DITHER_NONE,((guchar*)on_screen_image32)+offset_pix,L); -#else - GdkGLDrawable * my_glDrawable; - GdkGLContext * my_glContext; - - if (unrealized) return TRUE; - - my_glDrawable = gtk_widget_get_gl_drawable(widget); - my_glContext = gtk_widget_get_gl_context(widget); - - printf("%08X %08X\n", my_glDrawable, my_glContext); - if (!gdk_gl_drawable_gl_begin(my_glDrawable, my_glContext)) - return FALSE; - - printf("ok\n"); - - glLoadIdentity(); - glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - - glBegin(GL_QUADS); - glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); - glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); - glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); - glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); - glEnd(); - - glPixelZoom(1.0f * ScreenCoeff_Size, -1.0f * ScreenCoeff_Size); - - if (ScreenRotate) { - W=RAW_H; H=RAW_W; - glRotatef(90.0, 0.5, 0.5, 1.0); - glRasterPos2f(-1.0,1.0); -// glBitmap(0,0,0,0,-1.0,1.0,NULL); - glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen); - glRasterPos2f(0.0,1.0); -// glBitmap(0,0,0,0,0.0,1.0,NULL); - glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen+RAW_OFFSET); - } else { - H=RAW_H; W=RAW_W; - glRasterPos2f(-1.0,1.0); -// glBitmap(0,0,0,0,-1.0,1.0,NULL); - glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen); - glRasterPos2f(-1.0,0.0); -// glBitmap(0,0,0,0,-1.0,0.0,NULL); - glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen+RAW_OFFSET); - } - - if (gdk_gl_drawable_is_double_buffered (my_glDrawable)) - gdk_gl_drawable_swap_buffers (my_glDrawable); - else - glFlush (); - - gdk_gl_drawable_gl_end(my_glDrawable); -#endif + GDK_RGB_DITHER_NONE,((guchar*)on_screen_image32)+off,L); return TRUE; } -GdkGLContext * last_glContext=NULL; +#else /* if HAVE_LIBGDKGLEXT_X11_1_0 */ + void init_GL_capabilities(GtkWidget * widget) { -#ifdef HAVE_LIBGDKGLEXT_X11_1_0 GdkGLConfig * my_glConfig; my_glConfig = gdk_gl_config_new_by_mode ( GDK_GL_MODE_RGB @@ -226,59 +184,119 @@ void init_GL_capabilities(GtkWidget * widget) { if (!gtk_widget_set_gl_capability( widget, my_glConfig, - last_glContext, + NULL, TRUE, GDK_GL_RGBA_TYPE)) { - printf ("YOU FAIL ! \n"); + printf ("gtk_widget_set_gl_capability\n"); gtk_main_quit(); } - last_glContext = gtk_widget_get_gl_context(widget); -#endif } -void init_GL(GtkWidget * widget) { -#ifdef HAVE_LIBGDKGLEXT_X11_1_0 - GdkGLDrawable * my_glDrawable; - GdkGLContext * my_glContext; +GLuint Textures[1]; - init_GL_capabilities(widget); - - my_glDrawable = gtk_widget_get_gl_drawable(widget); - my_glContext = gtk_widget_get_gl_context(widget); - - printf("%08X %08X\n", my_glDrawable, my_glContext); +void init_GL(GtkWidget * widget, int screen) { + GdkGLContext *my_glContext = gtk_widget_get_gl_context (widget); + GdkGLDrawable *my_glDrawable = gtk_widget_get_gl_drawable (widget); if (!gdk_gl_drawable_gl_begin(my_glDrawable, my_glContext)) return; - printf("ok\n"); - /* Set the background black */ - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - /* Depth buffer setup */ - glClearDepth(1.0f); - + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + glEnable(GL_TEXTURE_2D); + glGenTextures(1, &Textures[0]); + +/* glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); +*/ + // beautiful quad + glBegin(GL_QUADS); + glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); + glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); + glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); + glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); + glEnd(); + glFlush (); if (gdk_gl_drawable_is_double_buffered (my_glDrawable)) gdk_gl_drawable_swap_buffers (my_glDrawable); - else - glFlush (); - glViewport (0, 0, - widget->allocation.width, widget->allocation.height); gdk_gl_drawable_gl_end(my_glDrawable); -#endif } +void reshape (GtkWidget * widget) { + GdkGLContext *my_glContext = gtk_widget_get_gl_context (widget); + GdkGLDrawable *my_glDrawable = gtk_widget_get_gl_drawable (widget); + if (!gdk_gl_drawable_gl_begin (my_glDrawable, my_glContext)) return; + + glViewport (0, 0, widget->allocation.width, widget->allocation.height); + + gdk_gl_drawable_gl_end (my_glDrawable); +} + +gboolean screen (GtkWidget * widget, int screen) { + int H,W,off; + GdkGLContext *my_glContext = gtk_widget_get_gl_context (widget); + GdkGLDrawable *my_glDrawable = gtk_widget_get_gl_drawable (widget); + if (!gdk_gl_drawable_gl_begin(my_glDrawable, my_glContext)) + return TRUE; + + glLoadIdentity(); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + // colorful quads so that there's something to see in case of pb + glBegin(GL_QUADS); + glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); + glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); + glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); + glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); + glColor3ub(255,255,255); + glEnd(); + + off = (screen)?RAW_OFFSET:0; + + if (ScreenRotate) { + glRotatef(90.0, 0.0, 0.0, 1.0); + } + + glBindTexture(GL_TEXTURE_2D, Textures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, 4, + 256, 256, 0, GL_RGBA, + GL_UNSIGNED_SHORT_1_5_5_5_REV, +// GL_UNSIGNED_SHORT_5_5_5_1, + GPU_screen+off); + + glBegin(GL_QUADS); + // texcoords 0.75 means 192, 1 means 256 + glTexCoord2f(0.0, 0.00); glVertex2d(-1.0, 1.0); + glTexCoord2f(0.0, 0.75); glVertex2d(-1.0,-1.0); + glTexCoord2f(1.0, 0.75); glVertex2d( 1.0,-1.0); + glTexCoord2f(1.0, 0.00); glVertex2d( 1.0, 1.0); + glEnd(); + + + glFlush (); + if (gdk_gl_drawable_is_double_buffered (my_glDrawable)) + gdk_gl_drawable_swap_buffers (my_glDrawable); + gdk_gl_drawable_gl_end(my_glDrawable); + return TRUE; +} + +#endif /* if HAVE_LIBGDKGLEXT_X11_1_0 */ + /* OUTPUT UPPER SCREEN */ +/* OUTPUT LOWER SCREEN */ void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data) { - init_GL(widget); - unrealized--; + init_GL(widget, 0); +} +void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data) { + init_GL(widget, 1); } gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { @@ -287,16 +305,20 @@ gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event #endif return screen(widget, 0); } - -/* OUTPUT LOWER SCREEN */ -void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data) { - init_GL(widget); - unrealized--; -} gboolean on_wDraw_Sub_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { - return screen(widget, offset_pixels_lower_screen()); + return screen(widget, 1); } +gboolean on_wDraw_Main_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { + reshape(widget); return TRUE; +} +gboolean on_wDraw_Sub_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { + reshape(widget); return TRUE; +} + + + + diff --git a/desmume/src/gtk-glade/callbacks_IO.h b/desmume/src/gtk-glade/callbacks_IO.h index a2c7ad459..9b027f660 100755 --- a/desmume/src/gtk-glade/callbacks_IO.h +++ b/desmume/src/gtk-glade/callbacks_IO.h @@ -32,10 +32,13 @@ G_MODULE_EXPORT gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEv /* OUTPUT UPPER SCREEN */ G_MODULE_EXPORT void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data); G_MODULE_EXPORT gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); +G_MODULE_EXPORT gboolean on_wDraw_Main_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); + /* OUTPUT LOWER SCREEN */ G_MODULE_EXPORT void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data); G_MODULE_EXPORT gboolean on_wDraw_Sub_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); +G_MODULE_EXPORT gboolean on_wDraw_Sub_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); /* INPUT STYLUS / MOUSE */ G_MODULE_EXPORT gboolean on_wDraw_Sub_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); diff --git a/desmume/src/gtk-glade/glade/DeSmuMe.glade b/desmume/src/gtk-glade/glade/DeSmuMe.glade index 3e1376457..31addf66c 100755 --- a/desmume/src/gtk-glade/glade/DeSmuMe.glade +++ b/desmume/src/gtk-glade/glade/DeSmuMe.glade @@ -581,13 +581,12 @@ True - 1x + 1,0x True True - True @@ -1053,8 +1052,9 @@ 256 192 - True - GDK_EXPOSURE_MASK + False + GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK + @@ -1217,8 +1217,9 @@ 256 192 - True - GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK + diff --git a/desmume/src/gtk-glade/globals.h b/desmume/src/gtk-glade/globals.h index 90c09b62d..c0a1a85a8 100755 --- a/desmume/src/gtk-glade/globals.h +++ b/desmume/src/gtk-glade/globals.h @@ -42,7 +42,6 @@ #endif #include -#include #include #include diff --git a/desmume/src/gtk-glade/main.c b/desmume/src/gtk-glade/main.c index 0c89ad6ae..63fc18052 100755 --- a/desmume/src/gtk-glade/main.c +++ b/desmume/src/gtk-glade/main.c @@ -252,6 +252,9 @@ int main(int argc, char *argv[]) { pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main"); pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub"); + init_GL_capabilities(pDrawingArea); + init_GL_capabilities(pDrawingArea2); + /* connect the signals in the interface */ glade_xml_signal_autoconnect(xml); @@ -273,6 +276,9 @@ int main(int argc, char *argv[]) { } } + gtk_widget_show(pDrawingArea); + gtk_widget_show(pDrawingArea2); + /* start event loop */ gtk_main(); desmume_free();