@@ -60,38 +60,41 @@ const uint32_t colors_i[] = {
6060};
6161
6262EM_JS (int , get_screen_height, (), {
63- return document. getElementById ( " canvas " ). height ;
63+ return window. innerHeight ;
6464 });
6565
6666EM_JS (int , get_screen_width, (), {
67- return document. getElementById ( " canvas " ). width ;
67+ return window. innerWidth ;
6868 });
6969
70- EM_JS (int , get_text_size, (int id, const char *str, int len ), {
71- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
70+ EM_JS (int , get_text_size, (int id, const char *str, const char *face ), {
71+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
7272 var ctx = canvas.getContext (" 2d" );
73- var s = new String (str).substring (0 , len);
73+ ctx.font = UTF8ToString (face);
74+
75+ var s = UTF8ToString (str);
7476 var metrics = ctx.measureText (s);
75- var result = (metrics.width << 16 ) + (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );
77+ var height = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent ;
78+ var result = (metrics.width << 16 ) + height;
7679 return result;
7780 });
7881
7982EM_JS (void , draw_arc, (int id, int xc, int yc, double r, double start, double end, double aspect), {
80- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
83+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
8184 var ctx = canvas.getContext (" 2d" );
8285 ctx.beginPath ();
8386 ctx.arc (100 , 75 , 50 , 0 , 2 * Math.PI );
8487 ctx.stroke ();
8588 });
8689
8790EM_JS (void , draw_ellipse, (int id, int xc, int yc, int rx, int ry, int fill), {
88- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
91+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
8992 var ctx = canvas.getContext (" 2d" );
9093
9194 });
9295
9396EM_JS (void , draw_line, (int id, int x1, int y1, int x2, int y2, const char *color), {
94- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
97+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
9598 var ctx = canvas.getContext (" 2d" );
9699 ctx.beginPath ();
97100 ctx.moveTo (x1, y1);
@@ -102,7 +105,7 @@ EM_JS(void, draw_line, (int id, int x1, int y1, int x2, int y2, const char *colo
102105 });
103106
104107EM_JS (void , draw_pixel, (int id, int x, int y, int r, int g, int b), {
105- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
108+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
106109 var ctx = canvas.getContext (" 2d" );
107110 var pxId = ctx.createImageData (1 , 1 );
108111 var pxData = pxId.data ;
@@ -114,28 +117,28 @@ EM_JS(void, draw_pixel, (int id, int x, int y, int r, int g, int b), {
114117 });
115118
116119EM_JS (void , draw_rect_filled, (int id, int x, int y, int w, int h, const char *color), {
117- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
120+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
118121 var ctx = canvas.getContext (" 2d" );
119122 ctx.fillStyle = UTF8ToString (color);
120123 ctx.fillRect (x, y, w, h);
121124 });
122125
123- EM_JS (void , draw_region, (int id, int x, int y, int w, int h), {
124- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
125- var ctx = canvas.getContext (" 2d" );
126-
126+ EM_JS (void , draw_region, (int id, int srcId, int x, int y, int w, int h, int dx, int dy), {
127+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
128+ var destination = canvas.getContext (" 2d" );
129+ var source = document.getElementById (srcId == -1 ? " canvas" : " canvas_" + srcId);
130+ destination.drawImage (source, x, y, w, h, dx, dy, w, h);
127131 });
128132
129133EM_JS (void , draw_text, (int id, int x, int y, const char *str, int len, const char *color, const char *face), {
130- var c = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
134+ var canvas = document.getElementById (id == -1 ? " canvas" : " canvas_" + id);
131135 var ctx = canvas.getContext (" 2d" );
132- var s = UTF8ToString (str).substring (0 , len);
133- var width = ctx.measureText (s).width ;
134- var fontHeight = 15 ;
135- var y1 = y * fontHeight;
136136 ctx.font = UTF8ToString (face);
137+
138+ var s = UTF8ToString (str).substring (0 , len);
139+ var metrics = ctx.measureText (s);
137140 ctx.fillStyle = UTF8ToString (color);
138- ctx.fillText (s, x, y1 );
141+ ctx.fillText (s, x, y + metrics. fontBoundingBoxAscent + metrics. fontBoundingBoxDescent );
139142 });
140143
141144strlib::String get_color () {
@@ -156,6 +159,18 @@ strlib::String get_color() {
156159 return result;
157160}
158161
162+ strlib::String get_face () {
163+ strlib::String result;
164+ if (font->_italic ) {
165+ result.append (" italic " );
166+ }
167+ if (font->_bold ) {
168+ result.append (" bold " );
169+ }
170+ result.append (font->_size ).append (" px monospace" );
171+ return result;
172+ }
173+
159174Canvas::Canvas () :
160175 _clip(nullptr ),
161176 _id(-1 ),
@@ -186,12 +201,14 @@ bool Canvas::create(int width, int height) {
186201 EM_ASM_ ({
187202 var canvas = document.createElement (" canvas" );
188203 canvas.id = " canvas_" + $0 ;
204+ canvas.width = $1 ;
205+ canvas.height = $2 ;
189206 canvas.style .zIndex = 1 ;
190207 canvas.style .display = " none" ;
191208 canvas.style .position = " absolute" ;
192209 canvas.className = " emscripten" ;
193210 document.body .appendChild (canvas);
194- }, _id);
211+ }, _id, _w, _h );
195212 return true ;
196213};
197214
@@ -229,8 +246,8 @@ void maSetClipRect(int left, int top, int width, int height) {
229246
230247MAExtent maGetTextSize (const char *str) {
231248 MAExtent result;
232- if (str && str[0 ] && drawTarget ) {
233- result = (MAExtent)get_text_size (drawTarget->_id , str, strlen (str ));
249+ if (str && str[0 ]) {
250+ result = (MAExtent)get_text_size (drawTarget ? drawTarget ->_id : - 1 , str, get_face ( ));
234251 } else {
235252 result = 0 ;
236253 }
@@ -245,6 +262,7 @@ MAExtent maGetScrSize(void) {
245262}
246263
247264void maDestroyPlaceholder (MAHandle maHandle) {
265+ logEntered ();
248266 Canvas *holder = (Canvas *)maHandle;
249267 delete holder;
250268}
@@ -268,11 +286,6 @@ int maCreateDrawableImage(MAHandle maHandle, int width, int height) {
268286 return drawable->create (width, height) ? RES_OK : -1 ;
269287}
270288
271- void maUpdateScreen (void ) {
272- logEntered ();
273- trace (" %d \n " , screen->_id );
274- }
275-
276289//
277290// drawing
278291//
@@ -318,23 +331,15 @@ void maFillRect(int left, int top, int width, int height) {
318331
319332void maDrawText (int left, int top, const char *str, int length) {
320333 if (str && str[0 ] && drawTarget) {
321- strlib::String face;
322- if (font->_italic ) {
323- face.append (" italic " );
324- }
325- if (font->_bold ) {
326- face.append (" bold " );
327- }
328- face.append (font->_size ).append (" pt monospace" );
329- draw_text (drawTarget->_id , left, top, str, length, get_color (), face);
334+ draw_text (drawTarget->_id , left, top, str, length, get_color (), get_face ());
330335 }
331336}
332337
333338void maDrawImageRegion (MAHandle maHandle, const MARect *srcRect, const MAPoint2d *dstPoint, int transformMode) {
334339 logEntered ();
335340 Canvas *src = (Canvas *)maHandle;
336341 if (drawTarget && drawTarget != src) {
337- // draw_region(drawTarget->_id, src, srcRect, dstPoint->x, dstPoint->y);
342+ draw_region (drawTarget->_id , src-> _id , srcRect-> left , srcRect-> top , srcRect-> width , srcRect-> height , dstPoint->x , dstPoint->y );
338343 }
339344}
340345
@@ -383,3 +388,6 @@ void maShowVirtualKeyboard(void) {
383388
384389void maHideVirtualKeyboard (void ) {
385390}
391+
392+ void maUpdateScreen (void ) {
393+ }
0 commit comments