GodMode9/arm9/source/common/screenshot.c

73 lines
2.0 KiB
C
Raw Normal View History

2018-03-07 01:15:12 +01:00
#include "common.h"
#include "ui.h"
#include "rtc.h"
2018-03-07 01:15:12 +01:00
#include "vff.h"
2018-03-29 23:45:58 -03:00
#include "png.h"
2018-03-07 01:15:12 +01:00
2019-05-25 10:34:29 -03:00
static void Screenshot_CvtAndTranspose(u8 *dest, u16 *fb, u32 w, u32 stride)
{
for (u32 y = 0; y < SCREEN_HEIGHT; y++) {
for (u32 x = 0; x < w; x++) {
u8 r, g, b;
u16 rgb_s = GetColor(fb, x, y);
2018-03-07 01:15:12 +01:00
2019-05-25 10:34:29 -03:00
r = ((rgb_s >> 11) & 0x1F) << 3;
g = ((rgb_s >> 5) & 0x3F) << 2;
b = (rgb_s & 0x1F) << 3;
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
*(dest++) = r;
*(dest++) = g;
*(dest++) = b;
}
dest += stride;
}
}
void CreateScreenshot(void) {
DsTime dstime;
2019-05-25 10:34:29 -03:00
size_t png_size;
u8 *png, *buffer;
char filename[64];
u32 snapbuf_size, snap_w, snap_h, bot_offset;
snapbuf_size = (SCREEN_WIDTH_TOP * SCREEN_HEIGHT * 3) * 2;
snap_w = SCREEN_WIDTH_TOP;
snap_h = SCREEN_HEIGHT * 2;
2018-03-07 01:15:12 +01:00
fvx_rmkdir(OUTPUT_PATH);
get_dstime(&dstime);
2018-03-29 23:45:58 -03:00
snprintf(filename, 64, OUTPUT_PATH "/snap_%02X%02X%02X%02X%02X%02X.png",
dstime.bcd_Y, dstime.bcd_M, dstime.bcd_D,
dstime.bcd_h, dstime.bcd_m, dstime.bcd_s);
2019-05-25 10:34:29 -03:00
filename[63] = '\0';
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
buffer = malloc(snapbuf_size);
2018-03-07 01:15:12 +01:00
if (!buffer) return;
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
memset(buffer, 0x1F, snapbuf_size); // gray background
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
bot_offset = ((400 * SCREEN_HEIGHT) + 40) * 3;
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
Screenshot_CvtAndTranspose(buffer, TOP_SCREEN, SCREEN_WIDTH_TOP, 0);
Screenshot_CvtAndTranspose(buffer + bot_offset, BOT_SCREEN, SCREEN_WIDTH_BOT, 80 * 3);
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
png = PNG_Compress(buffer, snap_w, snap_h, &png_size);
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
if (png && png_size) {
fvx_qwrite(filename, png, 0, png_size, NULL);
// "snap effect"
2019-05-25 10:34:29 -03:00
/*memcpy(buffer_b, BOT_SCREEN, SCREEN_SIZE_BOT);
memcpy(buffer_t, TOP_SCREEN, SCREEN_SIZE_TOP);
memset(BOT_SCREEN, 0, SCREEN_SIZE_BOT);
memset(TOP_SCREEN, 0, SCREEN_SIZE_TOP);
memcpy(BOT_SCREEN, buffer_b, SCREEN_SIZE_BOT);
2019-05-25 10:34:29 -03:00
memcpy(TOP_SCREEN, buffer_t, SCREEN_SIZE_TOP);*/
}
// what to do on error...?
2018-03-29 23:45:58 -03:00
2018-03-07 01:15:12 +01:00
free(buffer);
2019-05-25 10:34:29 -03:00
free(png);
2018-03-07 01:15:12 +01:00
}