Patch by Magliocchetti Riccardo:

Switch the screenshoot feature to make use of gdk-pixbuf to make png
instead of a open coded bmp encoder (NDSsystem.cpp already provides that).
This commit is contained in:
yabause 2008-11-09 09:14:28 +00:00
parent 55098165f3
commit a508ac1264
1 changed files with 45 additions and 94 deletions

View File

@ -73,7 +73,7 @@ static const GtkActionEntry action_entries[] = {
{ "run", "gtk-media-play", "Run", "<Ctrl>r", NULL, G_CALLBACK(Launch) },
{ "pause", "gtk-media-pause", "Pause", "<Ctrl>p", NULL, G_CALLBACK(Pause) },
{ "quit", "gtk-quit", "Quit", "<Ctrl>q", NULL, G_CALLBACK(gtk_main_quit) },
{ "printscreen",NULL, "Printscreen", NULL, NULL, G_CALLBACK(Printscreen) },
{ "printscreen","gtk-media-record", "Take a screenshot", "<Ctrl>s", NULL, G_CALLBACK(Printscreen) },
{ "reset", "gtk-refresh", "Reset", NULL, NULL, G_CALLBACK(Reset) }
};
@ -363,6 +363,7 @@ static void Launch()
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), TRUE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), TRUE);
}
static void Pause()
@ -1089,98 +1090,48 @@ const char *Layers_Menu[10] =
};
/////////////////////////////// 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;
static int WriteBMP(const char *filename,u16 *bmp)
{
BmpFileHeader fileheader;
BmpImageHeader imageheader;
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;
//fwrite(&fileheader, 1, 14, fichier);
//fwrite(&imageheader, 1, 40, fichier);
fwrite( &fileheader.type, sizeof(fileheader.type), 1, fichier);
fwrite( &fileheader.size, sizeof(fileheader.size), 1, fichier);
fwrite( &fileheader.r1, sizeof(fileheader.r1), 1, fichier);
fwrite( &fileheader.r2, sizeof(fileheader.r2), 1, fichier);
fwrite( &fileheader.data_offset, sizeof(fileheader.data_offset), 1, fichier);
fwrite( &imageheader.header_size, sizeof(imageheader.header_size), 1, fichier);
fwrite( &imageheader.width, sizeof(imageheader.width), 1, fichier);
fwrite( &imageheader.height, sizeof(imageheader.height), 1, fichier);
fwrite( &imageheader.r1, sizeof(imageheader.r1), 1, fichier);
fwrite( &imageheader.depth, sizeof(imageheader.depth), 1, fichier);
fwrite( &imageheader.r2, sizeof(imageheader.r2), 1, fichier);
fwrite( &imageheader.size, sizeof(imageheader.size), 1, fichier);
fwrite( &imageheader.r3, sizeof(imageheader.r3), 1, fichier);
fwrite( &imageheader.r4, sizeof(imageheader.r4), 1, fichier);
fwrite( &imageheader.r5, sizeof(imageheader.r5), 1, fichier);
fwrite( &imageheader.r6, sizeof(imageheader.r6), 1, fichier);
for(int j=0; j<192*2; j++) {
for(int 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;
fwrite(&r, 1, sizeof(char), fichier);
fwrite(&g, 1, sizeof(char), fichier);
fwrite(&b, 1, sizeof(char), fichier);
}
}
fclose(fichier);
return 1;
}
#define SCREENS_PIXEL_SIZE 98304
static void Printscreen()
{
WriteBMP("./test.bmp",(u16 *)GPU_screen);
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);
}
/////////////////////////////// DS CONFIGURATION //////////////////////////////////