mirror of https://github.com/mgba-emu/mgba.git
Core: Export screenshot dimensions in savedata extdata
This commit is contained in:
parent
7ee2be6c96
commit
a4d1268db4
|
@ -16,6 +16,7 @@ enum mStateExtdataTag {
|
||||||
EXTDATA_SAVEDATA = 2,
|
EXTDATA_SAVEDATA = 2,
|
||||||
EXTDATA_CHEATS = 3,
|
EXTDATA_CHEATS = 3,
|
||||||
EXTDATA_RTC = 4,
|
EXTDATA_RTC = 4,
|
||||||
|
EXTDATA_SCREENSHOT_DIMENSIONS = 5,
|
||||||
EXTDATA_META_TIME = 0x101,
|
EXTDATA_META_TIME = 0x101,
|
||||||
EXTDATA_META_CREATOR = 0x102,
|
EXTDATA_META_CREATOR = 0x102,
|
||||||
EXTDATA_MAX
|
EXTDATA_MAX
|
||||||
|
|
|
@ -262,8 +262,18 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx
|
||||||
PNGReadClose(png, info, end);
|
PNGReadClose(png, info, end);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
unsigned width, height;
|
|
||||||
core->desiredVideoDimensions(core, &width, &height);
|
if (!PNGReadHeader(png, info)) {
|
||||||
|
PNGReadClose(png, info, end);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned width = png_get_image_width(png, info);
|
||||||
|
unsigned height = png_get_image_height(png, info);
|
||||||
|
if (width > 0x4000 || height > 0x4000) {
|
||||||
|
// These images are ridiculously large...let's assume a DOS attempt and reject
|
||||||
|
PNGReadClose(png, info, end);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
uint32_t* pixels = malloc(width * height * 4);
|
uint32_t* pixels = malloc(width * height * 4);
|
||||||
if (!pixels) {
|
if (!pixels) {
|
||||||
PNGReadClose(png, info, end);
|
PNGReadClose(png, info, end);
|
||||||
|
@ -278,8 +288,8 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx
|
||||||
.extdata = extdata
|
.extdata = extdata
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool success = true;
|
||||||
PNGInstallChunkHandler(png, &bundle, _loadPNGChunkHandler, "gbAs gbAx");
|
PNGInstallChunkHandler(png, &bundle, _loadPNGChunkHandler, "gbAs gbAx");
|
||||||
bool success = PNGReadHeader(png, info);
|
|
||||||
success = success && PNGReadPixels(png, info, pixels, width, height, width);
|
success = success && PNGReadPixels(png, info, pixels, width, height, width);
|
||||||
success = success && PNGReadFooter(png, end);
|
success = success && PNGReadFooter(png, end);
|
||||||
PNGReadClose(png, info, end);
|
PNGReadClose(png, info, end);
|
||||||
|
@ -295,6 +305,12 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx
|
||||||
.clean = free
|
.clean = free
|
||||||
};
|
};
|
||||||
mStateExtdataPut(extdata, EXTDATA_SCREENSHOT, &item);
|
mStateExtdataPut(extdata, EXTDATA_SCREENSHOT, &item);
|
||||||
|
|
||||||
|
uint16_t dims[2] = { width, height };
|
||||||
|
item.size = sizeof(dims);
|
||||||
|
item.data = malloc(item.size);
|
||||||
|
memcpy(item.data, dims, item.size);
|
||||||
|
mStateExtdataPut(extdata, EXTDATA_SCREENSHOT_DIMENSIONS, &item);
|
||||||
} else {
|
} else {
|
||||||
free(pixels);
|
free(pixels);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue