Kill WriteBMP and use the very same Printscreen functions from the gtk frontend.

This means a few more code duplication but remove some ugliness.
Now dev-cpp (i suppose) compilation is broken.
This commit is contained in:
riccardom 2008-11-29 15:07:31 +00:00
parent df1e0d6737
commit 01b3c77010
4 changed files with 45 additions and 113 deletions

View File

@ -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 \

View File

@ -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) {

View File

@ -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 <gdk/gdkkeysyms.h>- */
const char * KEYNAME(int k);
void init_keyvals();

View File

@ -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;
}