mirror of https://github.com/mgba-emu/mgba.git
Add function to GBAVideoRenderer for taking screenshot
This commit is contained in:
parent
bbe52bf632
commit
deb278dc22
|
@ -16,6 +16,7 @@ static void GBAVideoDummyRendererWritePalette(struct GBAVideoRenderer* renderer,
|
|||
static void GBAVideoDummyRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam);
|
||||
static void GBAVideoDummyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
|
||||
static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer);
|
||||
static void GBAVideoDummyRendererGetPixels(struct GBAVideoRenderer* renderer, unsigned* stride, void** pixels);
|
||||
|
||||
static struct GBAVideoRenderer dummyRenderer = {
|
||||
.init = GBAVideoDummyRendererInit,
|
||||
|
@ -25,7 +26,8 @@ static struct GBAVideoRenderer dummyRenderer = {
|
|||
.writePalette = GBAVideoDummyRendererWritePalette,
|
||||
.writeOAM = GBAVideoDummyRendererWriteOAM,
|
||||
.drawScanline = GBAVideoDummyRendererDrawScanline,
|
||||
.finishFrame = GBAVideoDummyRendererFinishFrame
|
||||
.finishFrame = GBAVideoDummyRendererFinishFrame,
|
||||
.getPixels = GBAVideoDummyRendererGetPixels
|
||||
};
|
||||
|
||||
void GBAVideoInit(struct GBAVideo* video) {
|
||||
|
@ -219,6 +221,14 @@ static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer)
|
|||
// Nothing to do
|
||||
}
|
||||
|
||||
static void GBAVideoDummyRendererGetPixels(struct GBAVideoRenderer* renderer, unsigned* stride, void** pixels) {
|
||||
UNUSED(renderer);
|
||||
UNUSED(stride);
|
||||
UNUSED(pixels);
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
|
||||
void GBAVideoSerialize(struct GBAVideo* video, struct GBASerializedState* state) {
|
||||
memcpy(state->vram, video->renderer->vram, SIZE_VRAM);
|
||||
memcpy(state->oam, video->oam.raw, SIZE_OAM);
|
||||
|
|
|
@ -178,6 +178,8 @@ struct GBAVideoRenderer {
|
|||
void (*drawScanline)(struct GBAVideoRenderer* renderer, int y);
|
||||
void (*finishFrame)(struct GBAVideoRenderer* renderer);
|
||||
|
||||
void (*getPixels)(struct GBAVideoRenderer* renderer, unsigned* stride, void** pixels);
|
||||
|
||||
uint16_t* palette;
|
||||
uint16_t* vram;
|
||||
union GBAOAM* oam;
|
||||
|
|
|
@ -29,6 +29,7 @@ static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* render
|
|||
static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
||||
static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
|
||||
static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer);
|
||||
static void GBAVideoSoftwareRendererGetPixels(struct GBAVideoRenderer* renderer, unsigned* stride, void** pixels);
|
||||
|
||||
static void GBAVideoSoftwareRendererUpdateDISPCNT(struct GBAVideoSoftwareRenderer* renderer);
|
||||
static void GBAVideoSoftwareRendererWriteBGCNT(struct GBAVideoSoftwareRenderer* renderer, struct GBAVideoSoftwareBackground* bg, uint16_t value);
|
||||
|
@ -67,6 +68,7 @@ void GBAVideoSoftwareRendererCreate(struct GBAVideoSoftwareRenderer* renderer) {
|
|||
renderer->d.writePalette = GBAVideoSoftwareRendererWritePalette;
|
||||
renderer->d.drawScanline = GBAVideoSoftwareRendererDrawScanline;
|
||||
renderer->d.finishFrame = GBAVideoSoftwareRendererFinishFrame;
|
||||
renderer->d.getPixels = GBAVideoSoftwareRendererGetPixels;
|
||||
}
|
||||
|
||||
static void GBAVideoSoftwareRendererInit(struct GBAVideoRenderer* renderer) {
|
||||
|
@ -501,6 +503,13 @@ static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* rendere
|
|||
softwareRenderer->bg[3].sy = softwareRenderer->bg[3].refy;
|
||||
}
|
||||
|
||||
static void GBAVideoSoftwareRendererGetPixels(struct GBAVideoRenderer* renderer, unsigned* stride, void** pixels) {
|
||||
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
||||
|
||||
*stride = softwareRenderer->outputBufferStride;
|
||||
*pixels = softwareRenderer->outputBuffer;
|
||||
}
|
||||
|
||||
static void GBAVideoSoftwareRendererUpdateDISPCNT(struct GBAVideoSoftwareRenderer* renderer) {
|
||||
renderer->bg[0].enabled = renderer->dispcnt.bg0Enable;
|
||||
renderer->bg[1].enabled = renderer->dispcnt.bg1Enable;
|
||||
|
|
|
@ -77,7 +77,6 @@ int main(int argc, char** argv) {
|
|||
renderer.events.fullscreen = graphicsOpts.fullscreen;
|
||||
renderer.events.windowUpdated = 0;
|
||||
#endif
|
||||
renderer.events.renderer = &renderer.d;
|
||||
|
||||
if (!_GBASDLInit(&renderer)) {
|
||||
freeOptions(&opts);
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#define SDL_BINDING_KEY 0x53444C4B
|
||||
#define SDL_BINDING_BUTTON 0x53444C42
|
||||
|
||||
static void _takeScreenshot(struct GBAThread*, struct GBASDLEvents*);
|
||||
static void _takeScreenshot(struct GBAThread*);
|
||||
|
||||
bool GBASDLInitEvents(struct GBASDLEvents* context) {
|
||||
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) {
|
||||
|
@ -82,7 +82,7 @@ static void _GBASDLHandleKeypress(struct GBAThread* context, struct GBASDLEvents
|
|||
case SDLK_F12:
|
||||
if (event->type == SDL_KEYDOWN) {
|
||||
GBAThreadInterrupt(context);
|
||||
_takeScreenshot(context, sdlContext);
|
||||
_takeScreenshot(context);
|
||||
GBAThreadContinue(context);
|
||||
}
|
||||
return;
|
||||
|
@ -262,11 +262,14 @@ void GBASDLHandleEvent(struct GBAThread* context, struct GBASDLEvents* sdlContex
|
|||
}
|
||||
}
|
||||
|
||||
static void _takeScreenshot(struct GBAThread* context, struct GBASDLEvents* sdlContext) {
|
||||
static void _takeScreenshot(struct GBAThread* context) {
|
||||
unsigned stride;
|
||||
void* pixels = 0;
|
||||
struct VFile* vf = context->stateDir->openFile(context->stateDir, "screenshot.png", O_CREAT | O_WRONLY);
|
||||
context->gba->video.renderer->getPixels(context->gba->video.renderer, &stride, &pixels);
|
||||
png_structp png = PNGWriteOpen(vf);
|
||||
png_infop info = PNGWriteHeader(png, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
|
||||
PNGWritePixels(png, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS, 256, sdlContext->renderer->outputBuffer);
|
||||
PNGWritePixels(png, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS, stride, pixels);
|
||||
PNGWriteClose(png, info);
|
||||
vf->close(vf);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ struct GBAVideoSoftwareRenderer;
|
|||
|
||||
struct GBASDLEvents {
|
||||
struct GBAInputMap* bindings;
|
||||
struct GBAVideoSoftwareRenderer* renderer;
|
||||
SDL_Joystick* joystick;
|
||||
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||
SDL_Window* window;
|
||||
|
|
Loading…
Reference in New Issue