https://github.com/ukyo/emscripten-fileio
を参考に.
まずfab.cのfopenで指定している,
1. input_file_name -> "input"に変更,
2. output_file_name -> "output"に変更する.
はまりどころ,考慮する点としては
・fab.cのfopenにおける入力ファイル名と出力ファイル名をinput, outputいうプレースホルダにする
・そのプレースホルダをemscripten file stream APIが提供するロケーションにバインドする(pre.js)
・ファイルの引数の指定の仕方(header.js)→ラッパー関数の引数を選択抽出して引数配列に渡す
・処理が終わってからModule.ret()する(footer.js)→setIntervalで巡回して処理完了を検出している
fab.cの変更
input_file = fopen("input", "rb"); // void fab_read_stl(struct fab_vars *v, char *input_file_name) { input_file = fopen("input", "rb"); //void fab_read_png(struct fab_vars *v, char *input_file_name) { input_file = fopen("input","rb"); //void fab_read_array(struct fab_vars *v, char *input_file_name) { input_file = fopen("input","r"); //void fab_read_path(struct fab_vars *v, char *input_file_name) { output_file = fopen("output", "wb"); //void fab_write_png_K(struct fab_vars *v, char *output_file_name) { output_file = fopen("output","wb");// void fab_write_array(struct fab_vars *v, char *output_file_name) { output_file = fopen("output","w");// void fab_write_path(struct fab_vars *v, char *output_file_name) {
File stream APIに必要なJSを用意する.
pre.js
Module['preRun'] = function(){ FS.createDataFile( '/', 'input', Module['input'], //引数から入力できるようにするためのもの true, true ); FS.createDataFile( '/', 'output', [], true, true ); Module['ret'] = function(){ return FS.findObject("/output").contents; //最終的に返り値になる }; };
header.js
function png_path(input,error,diameter,offset,overwrap,intensity){ var Module = { //さきにModule作っちゃう input: input //pre.jsで読み込まれる }; arguments = ["dummy_input","dummy_output",error,diameter,offset,overwrap,intensity];//こうしないとmain関数のargvとして読み込まれるので注意
footer.js
var timerId = setInterval(function(){ if(FS.findObject("/output").contents !== null){ console.log("Output file ready."); console.log(String.fromCharCode.apply(null, Module.ret())); clearInterval(timerId); } },300); }
http://d.hatena.ne.jp/seinzumtode/20141202/1417498960 を参考にビルドする.
build.sh
#!/bin/sh emcc -O2 -I/usr/local/include -L/usr/local/lib -c fab.c ar rsv libfabcore.a fab.o emcc -O2 -I/usr/local/include -L/usr/local/lib -c png_path.c emcc -O2 png_path.o libfabcore.a libpng.a libgif.a libz.a -o png_path.raw.js --pre-js pre.js cat header.js png_path.raw.js footer.js > png_path.js
index.html
<!doctype html> <html> <head> <title>fileio</title> </head> <body> <input type="file"> <script src="./png_path.js"></script> <script> window.onload = function() { var fileInput = document.querySelector('input'); fileInput.addEventListener('change', function(e) { var file = e.target.files[0]; var reader = new FileReader; reader.readAsArrayBuffer(file); reader.onload = function() { //png_path(INPUT_ARRAY,error(px) diameter(mm) offset(-1) overwrap(0-1) intensity(0-1)) var res = png_path(new Uint8Array(reader.result),1.1,0.25,1,0.5,0.5); }; }, false); }; </script> </body> </html>