1
0
Fork 0
mirror of https://github.com/suchmememanyskill/TegraExplorer.git synced 2024-11-23 04:12:04 +00:00
TegraExplorer/source/tegraexplorer/utils/utils.c
Such Meme, Many Skill cb46e4bc40 Add screenshot feature
2020-05-03 02:00:04 +02:00

195 lines
No EOL
4.7 KiB
C

#include <string.h>
#include "utils.h"
#include "../common/common.h"
#include "../gfx/menu.h"
#include "../../storage/emummc.h"
#include "../../mem/heap.h"
#include "../gfx/gfxutils.h"
#include "../../hid/hid.h"
#include "../../utils/util.h"
#include "../../utils/sprintf.h"
#include "../../libs/fatfs/ff.h"
#include "../fs/fsutils.h"
#include "../../mem/minerva.h"
#include "../../storage/nx_sd.h"
#include "../../gfx/di.h"
extern bool sd_mounted;
int utils_mmcMenu(){
if (emu_cfg.enabled)
return menu_make(utils_mmcChoice, 3, "-- Choose MMC --");
else
return SYSMMC;
}
void utils_copystring(const char *in, char **out){
int len = strlen(in) + 1;
*out = (char *) malloc (len);
strcpy(*out, in);
}
void utils_takeScreenshot(){
static u32 timer = 0;
if (!minerva_cfg || !sd_mounted)
return;
if (timer + 3 < get_tmr_s())
timer = get_tmr_s();
else
return;
char *name, *path;
char basepath[] = "sd:/tegraexplorer/screenshots";
name = malloc(40);
sprintf(name, "Screenshot_%08X.bmp", get_tmr_us());
f_mkdir("sd:/tegraexplorer");
f_mkdir(basepath);
path = fsutil_getnextloc(basepath, name);
free(name);
const u32 file_size = 0x384000 + 0x36;
u8 *bitmap = malloc(file_size);
u32 *fb = malloc(0x384000);
u32 *fb_ptr = gfx_ctxt.fb;
for (int x = 1279; x >= 0; x--)
{
for (int y = 719; y >= 0; y--)
fb[y * 1280 + x] = *fb_ptr++;
}
memcpy(bitmap + 0x36, fb, 0x384000);
bmp_t *bmp = (bmp_t *)bitmap;
bmp->magic = 0x4D42;
bmp->size = file_size;
bmp->rsvd = 0;
bmp->data_off = 0x36;
bmp->hdr_size = 40;
bmp->width = 1280;
bmp->height = 720;
bmp->planes = 1;
bmp->pxl_bits = 32;
bmp->comp = 0;
bmp->img_size = 0x384000;
bmp->res_h = 2834;
bmp->res_v = 2834;
bmp->rsvd2 = 0;
sd_save_to_file(bitmap, file_size, path);
free(bitmap);
free(fb);
display_backlight_brightness(255, 1000);
msleep(100);
display_backlight_brightness(100, 1000);
}
char *utils_InputText(char *start, int maxLen){
if (!hidConnected())
return NULL;
int offset = -1, currentPos = 0, len;
char temp;
Inputs *input = hidRead();
u32 x, y;
gfx_printf("Add characters by pressing X\nRemove characters by pressing Y\nJoysticks for movement\nB to cancel, A to accept\n\n");
gfx_con_getpos(&x, &y);
if (strlen(start) > maxLen)
return NULL;
char *buff;
buff = calloc(maxLen + 1, sizeof(char));
strcpy(buff, start);
while (1){
offset = -1;
gfx_con_setpos(x, y);
for (int i = 0; i < 3; i++){
if (offset != 0){
SWAPCOLOR(0xFF666666);
gfx_con.fntsz = 8;
}
else {
SWAPCOLOR(COLOR_WHITE);
gfx_con.fntsz = 16;
}
for (int x = 0; x < strlen(buff); x++){
if (offset == 0 && x == currentPos){
gfx_printf("%k%c%k", COLOR_GREEN, buff[x], COLOR_WHITE);
}
else {
temp = buff[x] + offset;
if (!(temp >= 32 && temp <= 126))
temp = ' ';
gfx_putc(temp);
}
if (offset != 0)
gfx_puts(" ");
else
gfx_putc(' ');
}
gfx_putc('\n');
offset++;
}
if (input->buttons & (KEY_RDOWN | KEY_RUP))
hidRead();
else
hidWait();
len = strlen(buff);
if (input->buttons & (KEY_A | KEY_B))
break;
if (input->buttons & (KEY_LDOWN | KEY_RDOWN) && buff[currentPos] < 126){
temp = ++buff[currentPos];
while (strchr("\\\"*/:<=>?|+;=[]", temp) != NULL)
temp = ++buff[currentPos];
}
if (input->buttons & (KEY_LUP | KEY_RUP) && buff[currentPos] > 32){
temp = --buff[currentPos];
while (strchr("\\\"*/:<=>?|+;=[]", temp) != NULL)
temp = --buff[currentPos];
}
if (input->Lleft && currentPos > 0)
currentPos--;
if (input->Lright && currentPos < len - 1)
currentPos++;
if (input->x && maxLen > len){
buff[len] = '.';
buff[len + 1] = '\0';
}
if (input->y && len > 1){
buff[len - 1] = '\0';
if (currentPos == len - 1){
currentPos--;
}
gfx_boxGrey(0, y, 1279, y + 48, 0x1B);
}
}
gfx_con.fntsz = 16;
if (input->b){
free(buff);
return NULL;
}
return buff;
}