Skip to content

Commit d7469d4

Browse files
committed
Send display/framebuffer to JS
Updates mihaip/infinite-mac#219
1 parent 3845f69 commit d7469d4

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

devices/video/display_js.cpp

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,60 @@
11
#include <devices/video/display.h>
22
#include <loguru.hpp>
3+
#include <emscripten.h>
34

4-
class Display::Impl {
5+
class Display::Impl
6+
{
57
public:
8+
std::unique_ptr<uint8_t[]> browser_framebuffer;
9+
int browser_framebuffer_size;
10+
int browser_framebuffer_pitch;
611
};
712

8-
Display::Display(): impl(std::make_unique<Impl>()) {
9-
LOG_F(INFO, "Display::Display()");
13+
Display::Display(): impl(std::make_unique<Impl>())
14+
{
15+
// No-op in JS
1016
}
1117

1218
Display::~Display() {
13-
LOG_F(INFO, "Display::!Display()");
19+
// No-op in JS
1420
}
1521

16-
bool Display::configure(int width, int height) {
17-
LOG_F(INFO, "Display::configure(%d, %d)", width, height);
22+
bool Display::configure(int width, int height)
23+
{
24+
impl->browser_framebuffer_pitch = width * 4;
25+
impl->browser_framebuffer_size = height * impl->browser_framebuffer_pitch;
26+
impl->browser_framebuffer = std::make_unique<uint8_t[]>(impl->browser_framebuffer_size);
27+
EM_ASM_({ workerApi.didOpenVideo($0, $1); }, width, height);
1828
return true;
1929
}
2030

21-
void Display::handle_events(const WindowEvent& wnd_event) {
22-
LOG_F(INFO, "Display::handle_events()");
31+
void Display::handle_events(const WindowEvent& wnd_event)
32+
{
33+
// No-op in JS
2334
}
2435

25-
void Display::blank() {
26-
LOG_F(INFO, "Display::blank()");
36+
void Display::blank()
37+
{
38+
// Replace contents with opaque black.
39+
uint8_t *browser_framebuffer = impl->browser_framebuffer.get();
40+
int browser_framebuffer_size = impl->browser_framebuffer_size;
41+
for (int i = 0; i < browser_framebuffer_size; i += 4) {
42+
browser_framebuffer[i] = 0x00;
43+
browser_framebuffer[i + 1] = 0x00;
44+
browser_framebuffer[i + 2] = 0x00;
45+
browser_framebuffer[i + 3] = 0xff;
46+
}
47+
EM_ASM_({ workerApi.blit($0, $1); }, browser_framebuffer, browser_framebuffer_size);
2748
}
2849

29-
void Display::update(std::function<void(uint8_t *dst_buf, int dst_pitch)> convert_fb_cb, bool draw_hw_cursor, int cursor_x, int cursor_y) {
30-
LOG_F(INFO, "Display::update()");
50+
void Display::update(std::function<void(uint8_t *dst_buf, int dst_pitch)> convert_fb_cb, bool draw_hw_cursor, int cursor_x, int cursor_y)
51+
{
52+
convert_fb_cb(impl->browser_framebuffer.get(), impl->browser_framebuffer_pitch);
53+
// TODO: has contents and avoid sending framebuffer if unchanged
54+
EM_ASM_({ workerApi.blit($0, $1); }, impl->browser_framebuffer.get(), impl->browser_framebuffer_size);
3155
}
3256

33-
void Display::setup_hw_cursor(std::function<void(uint8_t *dst_buf, int dst_pitch)> draw_hw_cursor, int cursor_width, int cursor_height) {
57+
void Display::setup_hw_cursor(std::function<void(uint8_t *dst_buf, int dst_pitch)> draw_hw_cursor, int cursor_width, int cursor_height)
58+
{
3459
LOG_F(INFO, "Display::setup_hw_cursor()");
3560
}

0 commit comments

Comments
 (0)