From 4f90efbb2215358b9ffc5fa5991a628c9f836005 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Mon, 17 Apr 2023 10:56:38 +0200 Subject: [PATCH] start integrating milepost components into orca --- build.sh | 2 +- milepost | 2 +- resources/OpenSansLatinSubset.ttf | Bin 0 -> 29928 bytes samples/pong/build.sh | 6 +- samples/pong/{ => src}/main.c | 0 scripts/bindgen2.py | 201 +++++++++++++++++++++++++++ sdk/graphics.c | 45 ++++++ sdk/graphics.h | 222 ++++++++++++++++++++++++++++++ sdk/orca.c | 9 ++ sdk/orca.h | 14 ++ src/canvas_api.json | 124 +++++++++++++++++ src/canvas_api_bind.c | 21 +++ 12 files changed, 641 insertions(+), 5 deletions(-) create mode 100644 resources/OpenSansLatinSubset.ttf rename samples/pong/{ => src}/main.c (100%) create mode 100644 scripts/bindgen2.py create mode 100644 sdk/graphics.c create mode 100644 sdk/graphics.h create mode 100644 sdk/orca.c create mode 100644 sdk/orca.h create mode 100644 src/canvas_api.json create mode 100644 src/canvas_api_bind.c diff --git a/build.sh b/build.sh index 318d2ae..407a277 100755 --- a/build.sh +++ b/build.sh @@ -51,7 +51,7 @@ elif [ $target = orca ] ; then ./scripts/bindgen.py core ./src ./scripts/bindgen.py gles ./src - ./scripts/bindgen2.py canvas \ + python3 ./scripts/bindgen2.py canvas \ src/canvas_api.json \ --guest-stubs sdk/graphics.c \ --guest-include graphics.h \ diff --git a/milepost b/milepost index c347e10..f36e144 160000 --- a/milepost +++ b/milepost @@ -1 +1 @@ -Subproject commit c347e105772072618d683214e76a21ca6229ac9a +Subproject commit f36e144bc0fed66470aff0612098dba29c552604 diff --git a/resources/OpenSansLatinSubset.ttf b/resources/OpenSansLatinSubset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..acfe2d8b4dae9be68ae5eb300f7a9f2cdc9906ff GIT binary patch literal 29928 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 Nq^@UM{QsPH{~!GB{!jn_ literal 0 HcmV?d00001 diff --git a/samples/pong/build.sh b/samples/pong/build.sh index 225b524..f0535a0 100755 --- a/samples/pong/build.sh +++ b/samples/pong/build.sh @@ -8,8 +8,8 @@ wasmFlags="--target=wasm32 \ -Wl,--allow-undefined \ -g \ -D__ORCA__ \ - -I ../../sdk -I ../../milepost/src" + -I ../../sdk -I ../../milepost/src -I ../../milepost/src/util -I ../../milepost/src/platform" -/usr/local/opt/llvm/bin/clang $wasmFlags -o ./module.wasm ../../sdk/graphics.c ../../sdk/orca.c main.c +/usr/local/opt/llvm/bin/clang $wasmFlags -o ./module.wasm ../../sdk/graphics.c ../../sdk/orca.c src/main.c -#python3 ../../scripts/mkapp.py --orca-dir ../.. --name Pong --icon icon.png module.wasm +python3 ../../scripts/mkapp.py --orca-dir ../.. --name Pong --icon icon.png module.wasm diff --git a/samples/pong/main.c b/samples/pong/src/main.c similarity index 100% rename from samples/pong/main.c rename to samples/pong/src/main.c diff --git a/scripts/bindgen2.py b/scripts/bindgen2.py new file mode 100644 index 0000000..107234d --- /dev/null +++ b/scripts/bindgen2.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 + +from argparse import ArgumentParser +import json + +parser = ArgumentParser(prog='bindgen.py') +parser.add_argument('api') +parser.add_argument('spec') +parser.add_argument('-g', '--guest-stubs') +parser.add_argument('--guest-include') +parser.add_argument('--wasm3-bindings') + +args = parser.parse_args() + +apiName = args.api +spec = args.spec +guest_stubs_path = args.guest_stubs +if guest_stubs_path == None: + guest_stubs_path = 'bindgen_' + apiName + '_guest_stubs.c' + +wasm3_bindings_path = args.wasm3_bindings +if wasm3_bindings_path == None: + wasm3_bindings_path = 'bindgen_' + apiName + '_wasm3_bindings.c' + +host_bindings = open(wasm3_bindings_path, 'w') +guest_bindings = None + +specFile = open(spec, 'r') +data = json.load(specFile) + +def needs_arg_ptr_stub(decl): + res = (decl['ret']['tag'] == 'S') + for arg in decl['args']: + if arg['type']['tag'] == 'S': + res = True + return(res) + +for decl in data: + if needs_arg_ptr_stub(decl): + guest_bindings = open(guest_stubs_path, 'w') + if args.guest_include != None: + s = '#include"' + args.guest_include + '"\n\n' + print(s, file=guest_bindings) + break + +for decl in data: + + name = decl['name'] + cname = decl.get('cname', name) + + if needs_arg_ptr_stub(decl): + argPtrStubName = name + '_argptr_stub' + # pointer arg stub declaration + s = '' + if decl['ret']['tag'] == 'S': + s += 'void' + else: + s += decl['ret']['name'] + + s += ' ' + argPtrStubName + '(' + + if decl['ret']['tag'] == 'S': + s += decl['ret']['name'] + '* __retArg' + if len(decl['args']) > 0: + s += ', ' + + for i, arg in enumerate(decl['args']): + s += arg['type']['name'] + if arg['type']['tag'] == 'S': + s += '*' + s += ' ' + arg['name'] + if i+1 < len(decl['args']): + s += ', ' + s += ');\n\n' + + # forward function to pointer arg stub declaration + s += decl['ret']['name'] + ' ' + name + '(' + for i, arg in enumerate(decl['args']): + s += arg['type']['name'] + ' ' + arg['name'] + if i+1 < len(decl['args']): + s += ', ' + s += ')\n' + s += '{\n' + s += '\t' + if decl['ret']['tag'] == 'S': + s += decl['ret']['name'] + ' __ret;\n\t' + elif decl['ret']['tag'] != 'v': + s += decl['ret']['name'] + s += ' __ret = ' + s += argPtrStubName + '(' + + if decl['ret']['tag'] == 'S': + s += '&__ret' + if len(decl['args']) > 0: + s += ', ' + + for i, arg in enumerate(decl['args']): + if arg['type']['tag'] == 'S': + s += '&' + + s += arg['name'] + if i+1 < len(decl['args']): + s += ', ' + s += ');\n' + if decl['ret']['tag'] != 'v': + s += '\treturn(__ret);\n' + s += '}\n\n' + + print(s, file=guest_bindings) + + # host-side stub + s = 'const void* ' + cname + '_stub(IM3Runtime runtime, IM3ImportContext _ctx, uint64_t* _sp, void* _mem)' + + gen_stub = decl.get('gen_stub', True) + if gen_stub == False: + s += ';\n\n' + else: + s += '\n{\n\t' + retTag = decl['ret']['tag'] + + if retTag == 'i': + s += '*((i32*)&_sp[0]) = ' + elif retTag == 'I': + s += '*((i64*)&_sp[0]) = ' + elif retTag == 'f': + s += '*((f32*)&_sp[0]) = ' + elif retTag == 'd': + s += '*((f64*)&_sp[0]) = ' + elif retTag == 'S': + retTypeName = decl['ret']['name'] + retTypeCName = decl['ret'].get('cname', retTypeName) + s += '*(' + retTypeCName + '*)((char*)_mem + *(i32*)&_sp[0]) = ' + + s += cname + '(' + + firstArgIndex = 0 + if retTag != 'v': + firstArgIndex = 1 + + for i, arg in enumerate(decl['args']): + typeName = arg['type']['name'] + typeCName = arg['type'].get('cname', typeName) + argTag = arg['type']['tag'] + if argTag == 'i': + s += '*(i32*)&_sp[' + str(firstArgIndex + i) + ']' + elif argTag == 'I': + s += '*(i64*)&_sp[' + str(firstArgIndex + i) + ']' + elif argTag == 'f': + s += '*(f32*)&_sp[' + str(firstArgIndex + i) + ']' + elif argTag == 'd': + s += '*(f64*)&_sp[' + str(firstArgIndex + i) + ']' + elif argTag == 'p': + s += '(void*)((char*)_mem + *(i32*)&_sp[' + str(firstArgIndex + i) + '])' + elif argTag == 'S': + s += '*(' + typeCName + '*)((char*)_mem + *(i32*)&_sp[' + str(firstArgIndex + i) + '])' + else: + print('unrecognized type ' + c + ' in procedure signature\n') + break + + if i+1 < len(decl['args']): + s += ', ' + + s += ');\n\treturn(0);\n}\n\n' + + print(s, file=host_bindings) + +# link function +s = 'int bindgen_link_' + apiName + '_api(IM3Module module)\n{\n\t' +s += 'M3Result res;\n' + +for decl in data: + name = decl['name'] + cname = decl.get('cname', name) + + if needs_arg_ptr_stub(decl): + name = name + '_argptr_stub' + + m3Sig = '' + if decl['ret']['tag'] == 'S': + m3Sig += 'v' + else: + m3Sig += decl['ret']['tag'] + + m3Sig += '(' + if decl['ret']['tag'] == 'S': + m3Sig += 'i' + for arg in decl['args']: + tag = arg['type']['tag'] + if tag == 'p' or tag == 'S': + tag = 'i' + m3Sig += tag + m3Sig += ')' + + + s += '\tres = m3_LinkRawFunction(module, "*", "' + name + '", "' + m3Sig + '", ' + cname + '_stub);\n' + s += '\tif(res != m3Err_none && res != m3Err_functionLookupFailed) { LOG_ERROR("error: %s\\n", res); return(-1); }\n\n' + + +s += '\treturn(0);\n}\n' + +print(s, file=host_bindings) diff --git a/sdk/graphics.c b/sdk/graphics.c new file mode 100644 index 0000000..8892751 --- /dev/null +++ b/sdk/graphics.c @@ -0,0 +1,45 @@ +#include"graphics.h" + + +void g_set_color_argptr_stub(g_color* color); + +void g_set_color(g_color color) +{ + g_set_color_argptr_stub(&color); +} + + +void g_matrix_push_argptr_stub(g_mat2x3* m); + +void g_matrix_push(g_mat2x3 m) +{ + g_matrix_push_argptr_stub(&m); +} + + +void g_font_create_default_argptr_stub(g_font* __retArg); + +g_font g_font_create_default() +{ + g_font __ret; + g_font_create_default_argptr_stub(&__ret); + return(__ret); +} + + +void g_set_font_argptr_stub(g_font* font); + +void g_set_font(g_font font) +{ + g_set_font_argptr_stub(&font); +} + + +void g_text_outlines_argptr_stub(str8* text); + +void g_text_outlines(str8 text) +{ + g_text_outlines_argptr_stub(&text); +} + + diff --git a/sdk/graphics.h b/sdk/graphics.h new file mode 100644 index 0000000..1743f9d --- /dev/null +++ b/sdk/graphics.h @@ -0,0 +1,222 @@ +//***************************************************************** +// +// $file: graphics.h $ +// $author: Martin Fouilleul $ +// $date: 23/36/2015 $ +// $revision: $ +// +//***************************************************************** +#ifndef __GRAPHICS_H_ +#define __GRAPHICS_H_ + +#include"typedefs.h" + +typedef struct g_mat2x3 +{ + f32 m[6]; +} g_mat2x3; + +typedef struct g_color +{ + union + { + struct + { + f32 r; + f32 g; + f32 b; + f32 a; + }; + f32 c[4]; + }; +} g_color; + +typedef enum {G_JOINT_MITER = 0, + G_JOINT_BEVEL, + G_JOINT_NONE } g_joint_type; + +typedef enum {G_CAP_NONE = 0, + G_CAP_SQUARE } g_cap_type; + +typedef struct g_font { u64 h; } g_font; + +typedef struct g_font_extents +{ + f32 ascent; // the extent above the baseline (by convention a positive value extends above the baseline) + f32 descent; // the extent below the baseline (by convention, positive value extends below the baseline) + f32 leading; // spacing between one row's descent and the next row's ascent + f32 xHeight; // height of the lower case letter 'x' + f32 capHeight; // height of the upper case letter 'M' + f32 width; // maximum width of the font + +} g_font_extents; + +typedef struct g_text_extents +{ + f32 xBearing; + f32 yBearing; + f32 width; + f32 height; + f32 xAdvance; + f32 yAdvance; + +} g_text_extents; + +//------------------------------------------------------------------------------------------ +//NOTE(martin): fonts +//------------------------------------------------------------------------------------------ + +g_font g_font_nil(); +g_font g_font_create_default(); +//g_font g_font_create_from_memory(u32 size, byte* buffer, u32 rangeCount, unicode_range* ranges); +void g_font_destroy(g_font font); + +//NOTE(martin): the following int valued functions return -1 if font is invalid or codepoint is not present in font// +//TODO(martin): add enum error codes +/* +g_font_extents g_font_get_extents(g_font font); +g_font_extents g_font_get_scaled_extents(g_font font, f32 emSize); +f32 g_font_get_scale_for_em_pixels(g_font font, f32 emSize); + +//NOTE(martin): if you need to process more than one codepoint, first convert your codepoints to glyph indices, then use the +// glyph index versions of the functions, which can take an array of glyph indices. + +str32 g_font_get_glyph_indices(g_font font, str32 codePoints, str32 backing); +str32 g_font_push_glyph_indices(g_font font, mem_arena* arena, str32 codePoints); +u32 g_font_get_glyph_index(g_font font, utf32 codePoint); + +int g_font_get_codepoint_extents(g_font font, utf32 codePoint, g_text_extents* outExtents); + +int g_font_get_glyph_extents(g_font font, str32 glyphIndices, g_text_extents* outExtents); + +mp_rect g_text_bounding_box_utf32(g_font font, f32 fontSize, str32 text); +mp_rect g_text_bounding_box(g_font font, f32 fontSize, str8 text); +*/ +//------------------------------------------------------------------------------------------ +//NOTE(martin): images +//------------------------------------------------------------------------------------------ +/* +g_image g_image_nil(); +bool g_image_is_nil(g_image a); + +g_image g_image_create(u32 width, u32 height); +g_image g_image_create_from_rgba8(u32 width, u32 height, u8* pixels); +g_image g_image_create_from_data(str8 data, bool flip); +g_image g_image_create_from_file(str8 path, bool flip); + +void g_image_destroy(g_image image); + +void g_image_upload_region_rgba8(g_image image, mp_rect region, u8* pixels); +vec2 g_image_size(g_image image); +*/ +//------------------------------------------------------------------------------------------ +//NOTE(martin): atlasing +//------------------------------------------------------------------------------------------ +/* +//NOTE: rectangle allocator +typedef struct g_rect_atlas g_rect_atlas; + +g_rect_atlas* g_rect_atlas_create(mem_arena* arena, i32 width, i32 height); +mp_rect g_rect_atlas_alloc(g_rect_atlas* atlas, i32 width, i32 height); +void g_rect_atlas_recycle(g_rect_atlas* atlas, mp_rect rect); + +//NOTE: image atlas helpers +typedef struct g_image_region +{ + g_image image; + mp_rect rect; +} g_image_region; + +g_image_region g_image_atlas_alloc_from_rgba8(g_rect_atlas* atlas, g_image backingImage, u32 width, u32 height, u8* pixels); +g_image_region g_image_atlas_alloc_from_data(g_rect_atlas* atlas, g_image backingImage, str8 data, bool flip); +g_image_region g_image_atlas_alloc_from_file(g_rect_atlas* atlas, g_image backingImage, str8 path, bool flip); +void g_image_atlas_recycle(g_rect_atlas* atlas, g_image_region imageRgn); +*/ +//------------------------------------------------------------------------------------------ +//NOTE(martin): transform, viewport and clipping +//------------------------------------------------------------------------------------------ +void g_viewport(mp_rect viewPort); + +void g_matrix_push(g_mat2x3 matrix); +void g_matrix_pop(); + +void g_clip_push(f32 x, f32 y, f32 w, f32 h); +void g_clip_pop(); + +//------------------------------------------------------------------------------------------ +//NOTE(martin): graphics attributes setting/getting +//------------------------------------------------------------------------------------------ +void g_set_color(g_color color); +void g_set_color_rgba(f32 r, f32 g, f32 b, f32 a); +void g_set_width(f32 width); +void g_set_tolerance(f32 tolerance); +void g_set_joint(g_joint_type joint); +void g_set_max_joint_excursion(f32 maxJointExcursion); +void g_set_cap(g_cap_type cap); +void g_set_font(g_font font); +void g_set_font_size(f32 size); +void g_set_text_flip(bool flip); + +/* +void g_set_image(g_image image); +void g_set_image_source_region(mp_rect region); +*/ + +g_color g_get_color(); +f32 g_get_width(); +f32 g_get_tolerance(); +g_joint_type g_get_joint(); +f32 g_get_max_joint_excursion(); +g_cap_type g_get_cap(); +g_font g_get_font(); +f32 g_get_font_size(); +bool g_get_text_flip(); + +//------------------------------------------------------------------------------------------ +//NOTE(martin): path construction +//------------------------------------------------------------------------------------------ +vec2 g_get_position(); +void g_move_to(f32 x, f32 y); +void g_line_to(f32 x, f32 y); +void g_quadratic_to(f32 x1, f32 y1, f32 x2, f32 y2); +void g_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3); +void g_close_path(); + +/* +mp_rect g_glyph_outlines(str32 glyphIndices); +void g_codepoints_outlines(str32 string); +*/ +typedef struct str8 +{ + u64 len; + char* ptr; +} str8; + +void g_text_outlines(str8 string); + +//------------------------------------------------------------------------------------------ +//NOTE(martin): clear/fill/stroke +//------------------------------------------------------------------------------------------ +void g_clear(); +void g_fill(); +void g_stroke(); + +//------------------------------------------------------------------------------------------ +//NOTE(martin): simple shapes helpers +//------------------------------------------------------------------------------------------ +void g_rectangle_fill(f32 x, f32 y, f32 w, f32 h); +void g_rectangle_stroke(f32 x, f32 y, f32 w, f32 h); +void g_rounded_rectangle_fill(f32 x, f32 y, f32 w, f32 h, f32 r); +void g_rounded_rectangle_stroke(f32 x, f32 y, f32 w, f32 h, f32 r); +void g_ellipse_fill(f32 x, f32 y, f32 rx, f32 ry); +void g_ellipse_stroke(f32 x, f32 y, f32 rx, f32 ry); +void g_circle_fill(f32 x, f32 y, f32 r); +void g_circle_stroke(f32 x, f32 y, f32 r); +void g_arc(f32 x, f32 y, f32 r, f32 arcAngle, f32 startAngle); + +//NOTE: image helpers +/* +void g_image_draw(g_image image, mp_rect rect); +void g_image_draw_region(g_image image, mp_rect srcRegion, mp_rect dstRegion); +*/ +#endif //__GRAPHICS_H_ diff --git a/sdk/orca.c b/sdk/orca.c new file mode 100644 index 0000000..2ba3379 --- /dev/null +++ b/sdk/orca.c @@ -0,0 +1,9 @@ +/************************************************************//** +* +* @file: orca.c +* @author: Martin Fouilleul +* @date: 13/04/2023 +* +*****************************************************************/ + +//#include"util/memory.c" diff --git a/sdk/orca.h b/sdk/orca.h new file mode 100644 index 0000000..683b4e2 --- /dev/null +++ b/sdk/orca.h @@ -0,0 +1,14 @@ +/************************************************************//** +* +* @file: orca.h +* @author: Martin Fouilleul +* @date: 13/04/2023 +* +*****************************************************************/ +#ifndef __ORCA_H_ +#define __ORCA_H_ + +#include"util/typedefs.h" +#include"util/lists.h" + +#endif //__ORCA_H_ diff --git a/src/canvas_api.json b/src/canvas_api.json new file mode 100644 index 0000000..e77bc6d --- /dev/null +++ b/src/canvas_api.json @@ -0,0 +1,124 @@ +[ +{ + "name": "g_clear", + "cname": "mg_clear", + "ret": {"name": "void", "tag": "v"}, + "args": [] +}, +{ + "name": "g_set_color_rgba", + "cname": "mg_set_color_rgba", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "r", + "type": {"name": "float", "tag": "f"}}, + {"name": "g", + "type": {"name": "float", "tag": "f"}}, + {"name": "b", + "type": {"name": "float", "tag": "f"}}, + {"name": "a", + "type": {"name": "float", "tag": "f"}}] +}, +{ + "name": "g_set_color", + "cname": "mg_set_color", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "color", + "type": {"name": "g_color", "cname": "mg_color", "tag": "S"}}] +}, +{ + "name": "g_matrix_push", + "cname": "mg_matrix_push", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "m", + "type": {"name": "g_mat2x3", "cname": "mg_mat2x3", "tag": "S"}}] +}, +{ + "name": "g_matrix_pop", + "cname": "mg_matrix_pop", + "ret": {"name": "void", "tag": "v"}, + "args": [] +}, +{ + "name": "g_circle_fill", + "cname": "mg_circle_fill", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "x", + "type": {"name": "float", "tag": "f"}}, + {"name": "y", + "type": {"name": "float", "tag": "f"}}, + {"name": "r", + "type": {"name": "float", "tag": "f"}}] +}, +{ + "name": "g_rectangle_fill", + "cname": "mg_rectangle_fill", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "x", + "type": {"name": "float", "tag": "f"}}, + {"name": "y", + "type": {"name": "float", "tag": "f"}}, + {"name": "w", + "type": {"name": "float", "tag": "f"}}, + {"name": "h", + "type": {"name": "float", "tag": "f"}}] +}, +{ + "name": "g_font_create_default", + "cname": "mg_font_create_default", + "ret": {"name": "g_font", "cname": "mg_font", "tag": "S"}, + "args": [] +}, +{ + "name": "g_set_font", + "cname": "mg_set_font", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "font", + "type": {"name": "g_font", "cname": "mg_font" , "tag": "S"}}] +}, +{ + "name": "g_set_font_size", + "cname": "mg_set_font_size", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "size", + "type": {"name": "float", "cname": "float" , "tag": "f"}}] +}, +{ + "gen_stub": false, + "name": "g_text_outlines", + "cname": "mg_text_outlines", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "text", + "type": {"name": "str8", "cname": "str8" , "tag": "S"}}] +}, +{ + "name": "g_fill", + "cname": "mg_fill", + "ret": {"name": "void", "tag": "v"}, + "args": [] +}, +{ + "name": "g_move_to", + "cname": "mg_move_to", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "x", + "type": {"name": "f32", "tag":"f"}}, + {"name": "y", + "type": {"name": "f32", "tag":"f"}}] +}, +{ + "name": "g_set_text_flip", + "cname": "mg_set_text_flip", + "ret": {"name": "void", "tag": "v"}, + "args": [ + {"name": "flip", + "type": {"name": "bool", "tag":"i"}}] +}] diff --git a/src/canvas_api_bind.c b/src/canvas_api_bind.c new file mode 100644 index 0000000..9c7175f --- /dev/null +++ b/src/canvas_api_bind.c @@ -0,0 +1,21 @@ +#include"canvas_api_bind_gen.c" + +typedef struct wasm_str8 +{ + i64 len; + i32 offset; +} wasm_str8; + +const void* mg_text_outlines_stub(IM3Runtime runtime, IM3ImportContext _ctx, uint64_t* _sp, void* _mem) +{ + wasm_str8 wasmStr = *(wasm_str8*)((char*)_mem + *(i32*)&_sp[0]); + + ///////////////////////////////////////////////////////////////////// + //TODO: bound checks + str8 str = {.len = wasmStr.len, + .ptr = (char*)_mem + wasmStr.offset}; + ///////////////////////////////////////////////////////////////////// + + mg_text_outlines(str); + return(0); +}