Lua: Don't lua_error() out of context with pending dtors
[lsnes.git] / src / lua / screenshot.cpp
blob20499c86a4f0cf07ff711f8aa076051f8c1c5e8b
1 #include "core/framebuffer.hpp"
2 #include "core/instance.hpp"
3 #include "lua/internal.hpp"
4 #include "lua/bitmap.hpp"
6 namespace
8 int screenshot(lua::state& L, lua::parameters& P)
10 std::string filename;
12 P(filename);
14 CORE().fbuf->take_screenshot(filename);
15 return 0;
18 int screenshot_bitmap(lua::state& L, lua::parameters& P)
20 auto& core = CORE();
21 framebuffer::raw& _fb = core.fbuf->render_get_latest_screen();
22 try {
23 auto osize = std::make_pair(_fb.get_width(), _fb.get_height());
24 std::vector<uint32_t> tmp(_fb.get_width());
25 lua_dbitmap* b = lua::_class<lua_dbitmap>::create(L, osize.first, osize.second);
26 for(size_t y = 0; y < osize.second; y++) {
27 _fb.get_format()->decode(&tmp[0], _fb.get_start() + _fb.get_stride() * y,
28 _fb.get_width());
29 for(size_t x = 0; x < osize.first; x++)
30 b->pixels[y * b->width + x] = framebuffer::color(tmp[x]);
32 } catch(...) {
33 core.fbuf->render_get_latest_screen_end();
34 throw;
36 core.fbuf->render_get_latest_screen_end();
37 return 1;
40 lua::functions LUA_screenshot_fns(lua_func_misc, "gui", {
41 {"screenshot", screenshot},
42 {"screenshot_bitmap", screenshot_bitmap},
43 });