diff --git a/desmume/src/gtk-glade/Makefile.am b/desmume/src/gtk-glade/Makefile.am index a58f7520b..62fdcad56 100644 --- a/desmume/src/gtk-glade/Makefile.am +++ b/desmume/src/gtk-glade/Makefile.am @@ -19,7 +19,7 @@ desmume_glade_SOURCES = \ globals.h glade-xml.cpp \ callbacks.cpp callbacks.h callbacks_IO.cpp callbacks_IO.h \ desmume.cpp desmume.h \ - keyval_names.cpp main.cpp printscreen.cpp gdk_gl.cpp gdk_gl.h \ + keyval_names.cpp main.cpp gdk_gl.cpp gdk_gl.h \ dTools/callbacks_1_ioregs.cpp dTools/callbacks_2_memview.cpp \ dTools/callbacks_3_palview.cpp dTools/callbacks_4_tileview.cpp \ dTools/callbacks_dtools.h \ diff --git a/desmume/src/gtk-glade/callbacks.cpp b/desmume/src/gtk-glade/callbacks.cpp index 027b9afe1..b0c32c4d3 100755 --- a/desmume/src/gtk-glade/callbacks.cpp +++ b/desmume/src/gtk-glade/callbacks.cpp @@ -206,9 +206,52 @@ static void file_open() { } void on_menu_ouvrir_activate (GtkMenuItem *menuitem, gpointer user_data) { file_open();} -void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { WriteBMP("./test.bmp",(u16*)GPU_screen); } void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data) { gtk_main_quit(); } +#define SCREENS_PIXEL_SIZE 98304 + +static void Printscreen() +{ + GdkPixbuf *screenshot; + gchar *filename; + GError *error = NULL; + u8 *rgb; + static int seq = 0; + + rgb = (u8 *) malloc(SCREENS_PIXEL_SIZE*3); + if (!rgb) + return; + for (int i = 0; i < SCREENS_PIXEL_SIZE; i++) { + rgb[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; + rgb[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; + rgb[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; + } + + screenshot = gdk_pixbuf_new_from_data(rgb, + GDK_COLORSPACE_RGB, + FALSE, + 8, + 256, + 192*2, + 256*3, + NULL, + NULL); + + filename = g_strdup_printf("./desmume-screenshot-%d.png", seq); + gdk_pixbuf_save(screenshot, filename, "png", &error, NULL); + if (error) { + g_error_free (error); + g_printerr("Failed to save %s", filename); + } else { + seq++; + } + + free(rgb); + g_object_unref(screenshot); + g_free(filename); +} +void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { Printscreen(); } + /* MENU SAVES ***** ***** ***** ***** */ void on_loadstateXX_activate (GtkMenuItem *m, gpointer d) { diff --git a/desmume/src/gtk-glade/globals.h b/desmume/src/gtk-glade/globals.h index d15fb005e..873d2b3ce 100755 --- a/desmume/src/gtk-glade/globals.h +++ b/desmume/src/gtk-glade/globals.h @@ -131,9 +131,6 @@ void black_screen (); void edit_controls(); void init_joy_labels(); -/* printscreen.c */ -int WriteBMP(const char *filename,u16 *bmp); - /* keyvalnames.c -see - */ const char * KEYNAME(int k); void init_keyvals(); diff --git a/desmume/src/gtk-glade/printscreen.cpp b/desmume/src/gtk-glade/printscreen.cpp deleted file mode 100755 index 0b8bae19c..000000000 --- a/desmume/src/gtk-glade/printscreen.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* printscreen.c - this file is part of DeSmuME - * - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This file is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "globals.h" - -/////////////////////////////// PRINTSCREEN ///////////////////////////////// -// TODO: improve (let choose filename, and use png) - -typedef struct -{ - u32 header_size; - s32 width; - s32 height; - u16 r1; - u16 depth; - u32 r2; - u32 size; - s32 r3,r4; - u32 r5,r6; -}BmpImageHeader; - -typedef struct -{ - u16 type; - u32 size; - u16 r1, r2; - u32 data_offset; -}BmpFileHeader; - - -int WriteBMP(const char *filename,u16 *bmp){ - BmpFileHeader fileheader; - BmpImageHeader imageheader; - size_t elems_written = 0; - - fileheader.size = 14; - fileheader.type = 0x4D42; - fileheader.r1 = 0; - fileheader.r2=0; - fileheader.data_offset = 14+40; - - imageheader.header_size = 40; - imageheader.r1 = 1; - imageheader.depth = 24; - imageheader.r2 = 0; - imageheader.size = 256 * 192*2 * 3; - imageheader.r3 = 0; - imageheader.r4 = 0; - imageheader.r5 = 0; - imageheader.r6 = 0; - imageheader.width = 256; - imageheader.height = 192*2; - - FILE *fichier = fopen(filename,"wb"); - if (!fichier) - return 0; - - elems_written += fwrite( &fileheader.type, sizeof(fileheader.type), 1, fichier); - elems_written += fwrite( &fileheader.size, sizeof(fileheader.size), 1, fichier); - elems_written += fwrite( &fileheader.r1, sizeof(fileheader.r1), 1, fichier); - elems_written += fwrite( &fileheader.r2, sizeof(fileheader.r2), 1, fichier); - elems_written += fwrite( &fileheader.data_offset, sizeof(fileheader.data_offset), 1, fichier); - elems_written += fwrite( &imageheader.header_size, sizeof(imageheader.header_size), 1, fichier); - elems_written += fwrite( &imageheader.width, sizeof(imageheader.width), 1, fichier); - elems_written += fwrite( &imageheader.height, sizeof(imageheader.height), 1, fichier); - elems_written += fwrite( &imageheader.r1, sizeof(imageheader.r1), 1, fichier); - elems_written += fwrite( &imageheader.depth, sizeof(imageheader.depth), 1, fichier); - elems_written += fwrite( &imageheader.r2, sizeof(imageheader.r2), 1, fichier); - elems_written += fwrite( &imageheader.size, sizeof(imageheader.size), 1, fichier); - elems_written += fwrite( &imageheader.r3, sizeof(imageheader.r3), 1, fichier); - elems_written += fwrite( &imageheader.r4, sizeof(imageheader.r4), 1, fichier); - elems_written += fwrite( &imageheader.r5, sizeof(imageheader.r5), 1, fichier); - elems_written += fwrite( &imageheader.r6, sizeof(imageheader.r6), 1, fichier); - int i,j; - for(j=0;j<192*2;j++)for(i=0;i<256;i++){ - u8 r,g,b; - u16 pixel = bmp[i+(192*2-j)*256]; - r = pixel>>10; - pixel-=r<<10; - g = pixel>>5; - pixel-=g<<5; - b = pixel; - r*=255/31; - g*=255/31; - b*=255/31; - elems_written += fwrite(&r, 1, sizeof(char), fichier); - elems_written += fwrite(&g, 1, sizeof(char), fichier); - elems_written += fwrite(&b, 1, sizeof(char), fichier); - } - fclose(fichier); -return 1; -}