Skip to content

Commit 22f108b

Browse files
committed
EMCC: Emscripten version wip
- implemented arc and ellipse
1 parent 9887faa commit 22f108b

File tree

4 files changed

+96
-18
lines changed

4 files changed

+96
-18
lines changed

src/common/sys.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ extern "C" {
7676
#define SB_STR_VER VERSION " Android " BUILD_DATE
7777
#elif defined (_FLTK)
7878
#define SB_STR_VER VERSION " FLTK " BUILD_DATE
79+
#elif defined (_EMCC)
80+
#define SB_STR_VER VERSION " Emscripten " BUILD_DATE
7981
#else
8082
#define SB_STR_VER VERSION " Console " SB_VERSYS SB_BIT_SZ BUILD_DATE
8183
#endif

src/platform/emcc/canvas.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,27 @@ EM_JS(int, get_text_size, (int id, const char *str, const char *face), {
7979
return (Math.round(width) << 16) + height;
8080
});
8181

82-
EM_JS(void, draw_arc, (int id, int xc, int yc, double r, double start, double end, double aspect), {
82+
EM_JS(void, draw_arc, (int id, int xc, int yc, double r, double start, double end, double aspect, const char *color), {
8383
var canvas = document.getElementById(id == -1 ? "canvas" : "canvas_" + id);
8484
var ctx = canvas.getContext("2d");
8585
ctx.beginPath();
86-
ctx.arc(100, 75, 50, 0, 2 * Math.PI);
86+
ctx.arc(xc, yc, r, start, end, false);
87+
ctx.strokeStyle = UTF8ToString(color);
8788
ctx.stroke();
8889
});
8990

90-
EM_JS(void, draw_ellipse, (int id, int xc, int yc, int rx, int ry, int fill), {
91+
EM_JS(void, draw_ellipse, (int id, int xc, int yc, int rx, int ry, int fill, const char *color), {
9192
var canvas = document.getElementById(id == -1 ? "canvas" : "canvas_" + id);
9293
var ctx = canvas.getContext("2d");
93-
94+
ctx.beginPath();
95+
ctx.ellipse(xc, yc, rx, ry, Math.PI * 2, 0, Math.PI * 2, false);
96+
if (fill) {
97+
ctx.fillStyle = UTF8ToString(color);
98+
ctx.fill();
99+
} else {
100+
ctx.strokeStyle = UTF8ToString(color);
101+
ctx.stroke();
102+
}
94103
});
95104

96105
EM_JS(void, draw_line, (int id, int x1, int y1, int x2, int y2, const char *color), {
@@ -306,13 +315,13 @@ int maCreateDrawableImage(MAHandle maHandle, int width, int height) {
306315
//
307316
void maArc(int xc, int yc, double r, double start, double end, double aspect) {
308317
if (drawTarget) {
309-
draw_arc(drawTarget->_id, xc, yc, r, start, end, aspect);
318+
draw_arc(drawTarget->_id, xc, yc, r, start, end, aspect, get_color());
310319
}
311320
}
312321

313322
void maEllipse(int xc, int yc, int rx, int ry, int fill) {
314323
if (drawTarget) {
315-
draw_ellipse(drawTarget->_id, xc, yc, rx, ry, fill);
324+
draw_ellipse(drawTarget->_id, xc, yc, rx, ry, fill, get_color());
316325
}
317326
}
318327

src/platform/emcc/runtime.cpp

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@
2424
#define EVENT_TYPE_RESTART 101
2525
#define EVENT_TYPE_SHOW_MENU 102
2626
#define EVENT_TYPE_RESIZE 103
27+
#define EVENT_TYPE_BACK 104
28+
#define EVENT_TYPE_PGUP 105
29+
#define EVENT_TYPE_PGDN 106
30+
#define EVENT_TYPE_UP 107
31+
#define EVENT_TYPE_DN 108
2732

2833
Runtime *runtime;
2934
String clipboard;
3035

3136
MAEvent *getMotionEvent(int type, const EmscriptenMouseEvent *event) {
3237
MAEvent *result = new MAEvent();
3338
result->type = type;
34-
result->point.x = event->clientX;
35-
result->point.y = event->clientY;
39+
if (event) {
40+
result->point.x = event->clientX;
41+
result->point.y = event->clientY;
42+
}
3643
return result;
3744
}
3845

@@ -45,13 +52,11 @@ MAEvent *getKeyPressedEvent(int keycode, int nativeKey = 0) {
4552
}
4653

4754
EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent *e, void *userData) {
48-
runtime->handleMouse(eventType, e);
49-
return 0;
55+
return runtime->handleMouse(eventType, e);
5056
}
5157

5258
EM_BOOL key_callback(int eventType, const EmscriptenKeyboardEvent *e, void *userData) {
53-
runtime->handleKeyboard(eventType, e);
54-
return 0;
59+
return runtime->handleKeyboard(eventType, e);
5560
}
5661

5762
EM_BOOL resize_callback(int eventType, const EmscriptenUiEvent *e, void *userData) {
@@ -127,14 +132,23 @@ char *Runtime::loadResource(const char *fileName) {
127132
return buffer;
128133
}
129134

130-
void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
135+
bool Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
131136
int keyCode = e->keyCode;
137+
bool result = true;
132138
switch (e->keyCode) {
133139
case DOM_VK_SHIFT:
134140
case DOM_VK_CONTROL:
135141
case DOM_VK_ALT:
136142
case DOM_VK_CAPS_LOCK:
137143
// ignore press without modifier key
144+
result = false;
145+
break;
146+
147+
case DOM_VK_F5:
148+
case DOM_VK_F11:
149+
case DOM_VK_F12:
150+
// ignore standard browser keystrokes
151+
result = false;
138152
break;
139153

140154
default:
@@ -155,9 +169,38 @@ void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
155169
if (keyCode >= 'A' && keyCode <= 'Z') {
156170
keyCode += ('a' - 'A');
157171
}
158-
pushEvent(getKeyPressedEvent(SB_KEY_CTRL(keyCode)));
172+
switch (keyCode) {
173+
case 'b':
174+
pushEvent(getMotionEvent(EVENT_TYPE_BACK, nullptr));
175+
break;
176+
case 'm':
177+
pushEvent(getMotionEvent(EVENT_TYPE_SHOW_MENU, nullptr));
178+
break;
179+
case SB_KEY_PGUP:
180+
pushEvent(getMotionEvent(EVENT_TYPE_PGUP, nullptr));
181+
break;
182+
case SB_KEY_PGDN:
183+
pushEvent(getMotionEvent(EVENT_TYPE_PGDN, nullptr));
184+
break;
185+
case SB_KEY_UP:
186+
pushEvent(getMotionEvent(EVENT_TYPE_UP, nullptr));
187+
break;
188+
case SB_KEY_DN:
189+
pushEvent(getMotionEvent(EVENT_TYPE_PGDN, nullptr));
190+
break;
191+
default:
192+
pushEvent(getKeyPressedEvent(SB_KEY_CTRL(keyCode)));
193+
}
159194
} else if (e->altKey) {
160-
pushEvent(getKeyPressedEvent(SB_KEY_ALT(keyCode)));
195+
switch (keyCode) {
196+
case 'D':
197+
// browser keystroke
198+
result = false;
199+
break;
200+
default:
201+
pushEvent(getKeyPressedEvent(SB_KEY_ALT(keyCode)));
202+
break;
203+
}
161204
} else if (e->shiftKey) {
162205
bool shifted = false;
163206
for (int i = 0; i < SHIFT_KEYMAP_LEN; i++) {
@@ -177,9 +220,11 @@ void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
177220
}
178221
break;
179222
}
223+
return result;
180224
}
181225

182-
void Runtime::handleMouse(int eventType, const EmscriptenMouseEvent *e) {
226+
bool Runtime::handleMouse(int eventType, const EmscriptenMouseEvent *e) {
227+
bool result = true;
183228
switch (eventType) {
184229
case EMSCRIPTEN_EVENT_MOUSEDOWN:
185230
if (e->button == 2) {
@@ -194,7 +239,11 @@ void Runtime::handleMouse(int eventType, const EmscriptenMouseEvent *e) {
194239
case EMSCRIPTEN_EVENT_MOUSEUP:
195240
pushEvent(getMotionEvent(EVENT_TYPE_POINTER_RELEASED, e));
196241
break;
242+
default:
243+
result = false;
244+
break;
197245
}
246+
return result;
198247
}
199248

200249
void Runtime::pause(int timeout) {
@@ -265,6 +314,21 @@ void Runtime::processEvent(MAEvent &event) {
265314
case EVENT_TYPE_RESIZE:
266315
resize();
267316
break;
317+
case EVENT_TYPE_BACK:
318+
setBack();
319+
break;
320+
case EVENT_TYPE_PGUP:
321+
_output->scroll(true, true);
322+
break;
323+
case EVENT_TYPE_PGDN:
324+
_output->scroll(false, true);
325+
break;
326+
case EVENT_TYPE_UP:
327+
_output->scroll(true, false);
328+
break;
329+
case EVENT_TYPE_DN:
330+
_output->scroll(false, false);
331+
break;
268332
default:
269333
handleEvent(event);
270334
break;
@@ -279,6 +343,9 @@ void Runtime::runShell() {
279343
}
280344

281345
void Runtime::setClipboardText(const char *text) {
346+
EM_ASM_({
347+
navigator.clipboard.writeText(UTF8ToString($0));
348+
}, text);
282349
clipboard = text;
283350
}
284351

src/platform/emcc/runtime.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ struct Runtime : public System {
2626
char *loadResource(const char *fileName);
2727
void onRunCompleted() {}
2828
void saveWindowRect() {}
29-
void handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e);
30-
void handleMouse(int eventType, const EmscriptenMouseEvent *e);
29+
bool handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e);
30+
bool handleMouse(int eventType, const EmscriptenMouseEvent *e);
3131
bool hasEvent() { return _eventQueue && _eventQueue->size() > 0; }
3232
void pause(int timeout);
3333
void pushEvent(MAEvent *event) { _eventQueue->push(event); }

0 commit comments

Comments
 (0)