summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2019-07-14 08:21:32 -0500
committer GitHub <noreply@github.com>2019-07-14 08:21:32 -0500
commitaa0f72dcd13dcd23ec0468469faf7f3aaba27443 (patch)
tree5b5be5a76a394049cc39051ac93c664880f8a43d /src/frontend
parenteb63d3999aebfad019237b37618715c878d6ccbe (diff)
parent33c9f2f0725d0b4b7125eb4bc7260452d3819d69 (diff)
luaengine: video:size(), video:pixels(), screen:refresh_attoseconds() [vadosnaprimer] (#5334)
* luaengine: video:size(), video:pixels(), screen:refresh_attoseconds() pixels() and size() correspond to internal game resolution covering all screens and internal pixel colors. the same values are used for bitmap dumping. similar things available for screen_device lua library take into account final UI resolution and colors, so they can't be used when accurate framebuffer is needed. refresh_attoseconds() allows to calculate precise numerator and denominator for framerate
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/mame/luaengine.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index b786eaeb5c8..fb42192da11 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -1819,7 +1819,9 @@ void lua_engine::initialize()
* video:skip_this_frame() - is current frame going to be skipped
* video:speed_factor() - get speed factor
* video:speed_percent() - get percent from realtime
- * video:frame_update()
+ * video:frame_update() - render a frame
+ * video:size() - get width and height of snapshot bitmap in pixels
+ * video:pixels() - get binary bitmap of all screens as string
*
* video.frameskip - current frameskip
* video.throttled - throttle state
@@ -1848,6 +1850,22 @@ void lua_engine::initialize()
"speed_factor", &video_manager::speed_factor,
"speed_percent", &video_manager::speed_percent,
"frame_update", &video_manager::frame_update,
+ "size", [](video_manager &vm) {
+ s32 width, height;
+ vm.compute_snapshot_size(width, height);
+ return std::tuple<s32, s32>(width, height);
+ },
+ "pixels", [](video_manager &vm, sol::this_state s) {
+ lua_State *L = s;
+ luaL_Buffer buff;
+ s32 width, height;
+ vm.compute_snapshot_size(width, height);
+ int size = width * height * 4;
+ u32 *ptr = (u32 *)luaL_buffinitsize(L, &buff, size);
+ vm.pixels(ptr);
+ luaL_pushresultsize(&buff, size);
+ return sol::make_reference(L, sol::stack_reference(L, -1));
+ },
"frameskip", sol::property(&video_manager::frameskip, &video_manager::set_frameskip),
"throttled", sol::property(&video_manager::throttled, &video_manager::set_throttled),
"throttle_rate", sol::property(&video_manager::throttle_rate, &video_manager::set_throttle_rate));
@@ -1920,7 +1938,7 @@ void lua_engine::initialize()
* target:hidden() - is target hidden
* target:is_ui_target() - is ui render target
* target:index() - target index
- * target:view_name(index) - current target layout view name
+ * target:view_name([opt] index) - current target layout view name
*
* target.max_update_rate -
* target.view - current target layout view
@@ -2005,8 +2023,9 @@ void lua_engine::initialize()
* screen:height() - screen height
* screen:width() - screen width
* screen:orientation() - screen angle, flipx, flipy
- * screen:refresh() - screen refresh rate
- * screen:snapshot() - save snap shot
+ * screen:refresh() - screen refresh rate in Hz
+ * screen:refresh_attoseconds() - screen refresh rate in attoseconds
+ * screen:snapshot([opt] filename) - save snap shot
* screen:type() - screen drawing type
* screen:frame_number() - screen frame count
* screen:name() - screen device full name
@@ -2095,6 +2114,7 @@ void lua_engine::initialize()
return std::tuple<int, bool, bool>(rotation_angle, flags & ORIENTATION_FLIP_X, flags & ORIENTATION_FLIP_Y);
},
"refresh", [](screen_device &sdev) { return ATTOSECONDS_TO_HZ(sdev.refresh_attoseconds()); },
+ "refresh_attoseconds", [](screen_device &sdev) { return sdev.refresh_attoseconds(); },
"snapshot", [this](screen_device &sdev, sol::object filename) -> sol::object {
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
osd_file::error filerr;