GodMode9/arm9/source/common/screenshot.c

64 lines
2.2 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
void CreateScreenshot() {
2018-03-29 23:45:58 -03:00
const u32 snap_size = SCREEN_SIZE_TOP * 2, snap_width = SCREEN_WIDTH_TOP, snap_height = SCREEN_HEIGHT * 2;
u8 *png_data = NULL;
size_t png_size;
2018-03-07 01:15:12 +01:00
char filename[64];
DsTime dstime;
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);
2018-03-29 23:45:58 -03:00
2018-03-07 01:15:12 +01:00
u8* buffer = (u8*) malloc(snap_size);
if (!buffer) return;
2018-03-29 23:45:58 -03:00
u8* buffer_t = buffer;
u8* buffer_b = buffer + SCREEN_SIZE_TOP;
2018-03-07 01:15:12 +01:00
memset(buffer, 0x1F, snap_size); // gray background
2018-03-29 23:45:58 -03:00
for (u32 x = 0; x < 400; x++) {
for (u32 y = 0; y < 240; y++) {
buffer_t[(y * SCREEN_WIDTH_TOP + x) * 3 + 0] = *(TOP_SCREEN + (((x * 240) + (239 - y)) * 3) + 2);
buffer_t[(y * SCREEN_WIDTH_TOP + x) * 3 + 1] = *(TOP_SCREEN + (((x * 240) + (239 - y)) * 3) + 1);
buffer_t[(y * SCREEN_WIDTH_TOP + x) * 3 + 2] = *(TOP_SCREEN + (((x * 240) + (239 - y)) * 3) + 0);
}
}
for (u32 x = 0; x < 320; x++) {
for (u32 y = 0; y < 240; y++) {
buffer_b[(y * SCREEN_WIDTH_TOP + x + 40) * 3 + 0] = *(BOT_SCREEN + (((x * 240) + (239 - y)) * 3) + 2);
buffer_b[(y * SCREEN_WIDTH_TOP + x + 40) * 3 + 1] = *(BOT_SCREEN + (((x * 240) + (239 - y)) * 3) + 1);
buffer_b[(y * SCREEN_WIDTH_TOP + x + 40) * 3 + 2] = *(BOT_SCREEN + (((x * 240) + (239 - y)) * 3) + 0);
}
}
png_data = PNG_Compress(buffer, snap_width, snap_height, &png_size);
if (png_data && png_size)
fvx_qwrite(filename, png_data, 0, png_size, NULL);
else
ShowPrompt(false, "Failed to write screenshot!");
2018-03-07 01:15:12 +01:00
// "snap effect"
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);
memcpy(TOP_SCREEN, buffer_t, SCREEN_SIZE_TOP);
2018-03-29 23:45:58 -03:00
2018-03-07 01:15:12 +01:00
free(buffer);
2018-03-29 23:45:58 -03:00
if (png_data) free(png_data);
2018-03-07 01:15:12 +01:00
}