>` (background thread sets a value; GUI thread reads it)
+* [`poll_promise::Promise`](https://docs.rs/poll-promise) (example: [`eframe/examples/download_image.rs`](https://github.com/emilk/egui/blob/master/eframe/examples/download_image.rs))
+* [`eventuals::Eventual`](https://docs.rs/eventuals/latest/eventuals/struct.Eventual.html)
+* [`tokio::sync::watch::channel`](https://docs.rs/tokio/latest/tokio/sync/watch/fn.channel.html)
### What about accessibility, such as screen readers?
There is experimental support for a screen reader. In [the web demo](https://www.egui.rs/#demo) you can enable it in the "Backend" tab.
diff --git a/deny.toml b/deny.toml
index c58fa9ba..fd4089e2 100644
--- a/deny.toml
+++ b/deny.toml
@@ -28,10 +28,16 @@ deny = [
]
skip = [
- { name = "time" }, # old version pulled in by unmaintianed crate 'chrono'
+ { name = "ahash" }, # old version via dark-light
+ { name = "arrayvec" }, # old version via tiny-skia
+ { name = "hashbrown" }, # old version via dark-light
+ { name = "time" }, # old version pulled in by unmaintianed crate 'chrono'
+ { name = "ttf-parser" }, # different versions pulled in by ab_glyph and usvg
]
skip-tree = [
- { name = "eframe", version = "0.16.0" },
+ { name = "criterion" }, # dev-dependnecy
+ { name = "glium" }, # legacy crate, lots of old dependencies
+ { name = "glutin" }, # legacy crate, lots of old dependencies
]
diff --git a/docs/egui_demo_app.js b/docs/egui_demo_app.js
index 4e627b80..1d9a2d1b 100644
--- a/docs/egui_demo_app.js
+++ b/docs/egui_demo_app.js
@@ -212,48 +212,58 @@ function makeMutClosure(arg0, arg1, dtor, f) {
return real;
}
-function __wbg_adapter_30(arg0, arg1) {
- wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hedff1e3c1ca6c71c(arg0, arg1);
+function __wbg_adapter_28(arg0, arg1) {
+ try {
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
+ wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1a994ac62d7f09ed(retptr, arg0, arg1);
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
+ if (r1) {
+ throw takeObject(r0);
+ }
+ } finally {
+ wasm.__wbindgen_add_to_stack_pointer(16);
+ }
}
-function __wbg_adapter_33(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_31(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_36(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_34(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_39(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_37(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_42(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_40(arg0, arg1) {
+ wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hab0a29b7d3429481(arg0, arg1);
}
-function __wbg_adapter_45(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_43(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_48(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_46(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_51(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_49(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_54(arg0, arg1) {
- wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he78f81eace0d019f(arg0, arg1);
+function __wbg_adapter_52(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_57(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d2f25dc91669030(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_55(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1ad4df80404e66c5(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_60(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h84e1489b515e3492(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_58(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h5cef6584e9ecc7ee(arg0, arg1, addHeapObject(arg2));
}
function makeClosure(arg0, arg1, dtor, f) {
@@ -277,12 +287,12 @@ function makeClosure(arg0, arg1, dtor, f) {
return real;
}
-function __wbg_adapter_63(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h72e381f5228369dd(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_61(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h7a180c79a20cae62(arg0, arg1, addHeapObject(arg2));
}
-function __wbg_adapter_66(arg0, arg1, arg2) {
- wasm._dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h72e381f5228369dd(arg0, arg1, addHeapObject(arg2));
+function __wbg_adapter_64(arg0, arg1, arg2) {
+ wasm._dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h7a180c79a20cae62(arg0, arg1, addHeapObject(arg2));
}
/**
@@ -293,15 +303,21 @@ function __wbg_adapter_66(arg0, arg1, arg2) {
* @param {string} canvas_id
*/
__exports.start = function(canvas_id) {
- var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- wasm.start(ptr0, len0);
+ try {
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
+ var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ wasm.start(retptr, ptr0, len0);
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
+ if (r1) {
+ throw takeObject(r0);
+ }
+ } finally {
+ wasm.__wbindgen_add_to_stack_pointer(16);
+ }
};
-function getArrayU8FromWasm0(ptr, len) {
- return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
-}
-
function handleError(f, args) {
try {
return f.apply(this, args);
@@ -377,864 +393,972 @@ async function init(input) {
var ret = getStringFromWasm0(arg0, arg1);
return addHeapObject(ret);
};
+ imports.wbg.__wbg_log_02e20a3c32305fb7 = function(arg0, arg1) {
+ try {
+ console.log(getStringFromWasm0(arg0, arg1));
+ } finally {
+ wasm.__wbindgen_free(arg0, arg1);
+ }
+ };
+ imports.wbg.__wbg_log_5c7513aa8c164502 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {
+ try {
+ console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7));
+ } finally {
+ wasm.__wbindgen_free(arg0, arg1);
+ }
+ };
+ imports.wbg.__wbg_mark_abc7631bdced64f0 = function(arg0, arg1) {
+ performance.mark(getStringFromWasm0(arg0, arg1));
+ };
+ imports.wbg.__wbg_measure_c528ff64085b7146 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
+ try {
+ performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3));
+ } finally {
+ wasm.__wbindgen_free(arg0, arg1);
+ wasm.__wbindgen_free(arg2, arg3);
+ }
+ }, arguments) };
+ imports.wbg.__wbg_new_693216e109162396 = function() {
+ var ret = new Error();
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_stack_0ddaca5d1abfb52f = function(arg0, arg1) {
+ var ret = getObject(arg1).stack;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_error_09919627ac0992f5 = function(arg0, arg1) {
+ try {
+ console.error(getStringFromWasm0(arg0, arg1));
+ } finally {
+ wasm.__wbindgen_free(arg0, arg1);
+ }
+ };
imports.wbg.__wbindgen_number_get = function(arg0, arg1) {
const obj = getObject(arg1);
var ret = typeof(obj) === 'number' ? obj : undefined;
getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
};
- imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
- var ret = getObject(arg0);
- return addHeapObject(ret);
- };
imports.wbg.__wbindgen_boolean_get = function(arg0) {
const v = getObject(arg0);
var ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2;
return ret;
};
- imports.wbg.__wbg_instanceof_WebGl2RenderingContext_56ad96bfac3f5531 = function(arg0) {
+ imports.wbg.__wbg_instanceof_WebGl2RenderingContext_df519ebc1fd4a55f = function(arg0) {
var ret = getObject(arg0) instanceof WebGL2RenderingContext;
return ret;
};
- imports.wbg.__wbg_drawingBufferWidth_561b8beaef3111f5 = function(arg0) {
- var ret = getObject(arg0).drawingBufferWidth;
- return ret;
- };
- imports.wbg.__wbg_drawingBufferHeight_aa35759c7f962358 = function(arg0) {
- var ret = getObject(arg0).drawingBufferHeight;
- return ret;
- };
- imports.wbg.__wbg_bindVertexArray_52b8b2f5fd93d81d = function(arg0, arg1) {
+ imports.wbg.__wbg_bindVertexArray_8020efc46272d6b1 = function(arg0, arg1) {
getObject(arg0).bindVertexArray(getObject(arg1));
};
- imports.wbg.__wbg_bufferData_bba22fbe5dd1f1d6 = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_bufferData_17b90d9499ee7889 = function(arg0, arg1, arg2, arg3) {
getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0);
};
- imports.wbg.__wbg_bufferData_794d61d3c392fafd = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).bufferData(arg1 >>> 0, getArrayU8FromWasm0(arg2, arg3), arg4 >>> 0);
- };
- imports.wbg.__wbg_createVertexArray_d59135c0a43c410b = function(arg0) {
+ imports.wbg.__wbg_createVertexArray_ccfd68f784dda58d = function(arg0) {
var ret = getObject(arg0).createVertexArray();
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_deleteVertexArray_385874f9e1499a3f = function(arg0, arg1) {
- getObject(arg0).deleteVertexArray(getObject(arg1));
- };
- imports.wbg.__wbg_texImage2D_29ea0a7f026e239b = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) {
- getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10));
+ imports.wbg.__wbg_texImage2D_40c3695cff5564ad = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
+ getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, getObject(arg9));
}, arguments) };
- imports.wbg.__wbg_activeTexture_0092956fa2eefd8c = function(arg0, arg1) {
+ imports.wbg.__wbg_texSubImage2D_3225e265581d1641 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
+ getObject(arg0).texSubImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, getObject(arg9));
+ }, arguments) };
+ imports.wbg.__wbg_texSubImage2D_b6e8bd62500957ed = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
+ getObject(arg0).texSubImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9);
+ }, arguments) };
+ imports.wbg.__wbg_activeTexture_e07e910acea70faa = function(arg0, arg1) {
getObject(arg0).activeTexture(arg1 >>> 0);
};
- imports.wbg.__wbg_attachShader_7faccaa7b5ac28a6 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_attachShader_2e252ab2fda53d9b = function(arg0, arg1, arg2) {
getObject(arg0).attachShader(getObject(arg1), getObject(arg2));
};
- imports.wbg.__wbg_bindBuffer_4ece833dd10cac2f = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_bindBuffer_612af2c0d1623df9 = function(arg0, arg1, arg2) {
getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2));
};
- imports.wbg.__wbg_bindFramebuffer_48c4bf8ff82bf7e9 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_bindFramebuffer_f79f98a252b25421 = function(arg0, arg1, arg2) {
getObject(arg0).bindFramebuffer(arg1 >>> 0, getObject(arg2));
};
- imports.wbg.__wbg_bindTexture_9d8ed0fcd83eb0a9 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_bindTexture_5de299363180ad48 = function(arg0, arg1, arg2) {
getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2));
};
- imports.wbg.__wbg_blendFunc_b254bb91838df1dd = function(arg0, arg1, arg2) {
- getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0);
+ imports.wbg.__wbg_blendEquation_3ddbe96827ea563c = function(arg0, arg1) {
+ getObject(arg0).blendEquation(arg1 >>> 0);
};
- imports.wbg.__wbg_clear_4ce66c813d66e77d = function(arg0, arg1) {
+ imports.wbg.__wbg_blendFuncSeparate_be76c74e24fb8c4b = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).blendFuncSeparate(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, arg4 >>> 0);
+ };
+ imports.wbg.__wbg_clear_4c5eed385310e256 = function(arg0, arg1) {
getObject(arg0).clear(arg1 >>> 0);
};
- imports.wbg.__wbg_clearColor_71f96fd72a7646a6 = function(arg0, arg1, arg2, arg3, arg4) {
+ imports.wbg.__wbg_clearColor_d9d486c5ff20404c = function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).clearColor(arg1, arg2, arg3, arg4);
};
- imports.wbg.__wbg_compileShader_dd66d66a5a6481f3 = function(arg0, arg1) {
+ imports.wbg.__wbg_compileShader_e224e94272352503 = function(arg0, arg1) {
getObject(arg0).compileShader(getObject(arg1));
};
- imports.wbg.__wbg_createBuffer_5c5caa16032a81b7 = function(arg0) {
+ imports.wbg.__wbg_createBuffer_564dc1c3c3f058b7 = function(arg0) {
var ret = getObject(arg0).createBuffer();
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_createFramebuffer_9818fc04b4a38c18 = function(arg0) {
+ imports.wbg.__wbg_createFramebuffer_ca860b7155b412f2 = function(arg0) {
var ret = getObject(arg0).createFramebuffer();
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_createProgram_32d01a55e144b9fc = function(arg0) {
+ imports.wbg.__wbg_createProgram_e9fa1d7669773667 = function(arg0) {
var ret = getObject(arg0).createProgram();
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_createShader_6e8eed55567fe1a6 = function(arg0, arg1) {
+ imports.wbg.__wbg_createShader_03233922e9b5ebf2 = function(arg0, arg1) {
var ret = getObject(arg0).createShader(arg1 >>> 0);
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_createTexture_8f31e7386e22fc37 = function(arg0) {
+ imports.wbg.__wbg_createTexture_7ee50a5b223f0511 = function(arg0) {
var ret = getObject(arg0).createTexture();
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_deleteBuffer_de80b51d8166fddb = function(arg0, arg1) {
- getObject(arg0).deleteBuffer(getObject(arg1));
+ imports.wbg.__wbg_deleteShader_67c4f4b03b5c074a = function(arg0, arg1) {
+ getObject(arg0).deleteShader(getObject(arg1));
};
- imports.wbg.__wbg_deleteFramebuffer_5f58ccb548438c57 = function(arg0, arg1) {
- getObject(arg0).deleteFramebuffer(getObject(arg1));
- };
- imports.wbg.__wbg_deleteProgram_3ec3c43f2cddde7f = function(arg0, arg1) {
- getObject(arg0).deleteProgram(getObject(arg1));
- };
- imports.wbg.__wbg_deleteTexture_a0632c71429795ac = function(arg0, arg1) {
+ imports.wbg.__wbg_deleteTexture_b4643da89823c0c1 = function(arg0, arg1) {
getObject(arg0).deleteTexture(getObject(arg1));
};
- imports.wbg.__wbg_disable_b05e075ae54fa448 = function(arg0, arg1) {
+ imports.wbg.__wbg_detachShader_c7115572e0c5095c = function(arg0, arg1, arg2) {
+ getObject(arg0).detachShader(getObject(arg1), getObject(arg2));
+ };
+ imports.wbg.__wbg_disable_e61fb08d6c7131e4 = function(arg0, arg1) {
getObject(arg0).disable(arg1 >>> 0);
};
- imports.wbg.__wbg_drawElements_a41bb53d39cd6297 = function(arg0, arg1, arg2, arg3, arg4) {
+ imports.wbg.__wbg_disableVertexAttribArray_4e8dd2973a2f796d = function(arg0, arg1) {
+ getObject(arg0).disableVertexAttribArray(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_drawElements_8f3cfd28610fd46e = function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4);
};
- imports.wbg.__wbg_enable_766e546395da5a5d = function(arg0, arg1) {
+ imports.wbg.__wbg_enable_8e888a63831a3fe5 = function(arg0, arg1) {
getObject(arg0).enable(arg1 >>> 0);
};
- imports.wbg.__wbg_enableVertexAttribArray_91da8d3cbe0c2bbd = function(arg0, arg1) {
+ imports.wbg.__wbg_enableVertexAttribArray_d1b2636395bdaa7a = function(arg0, arg1) {
getObject(arg0).enableVertexAttribArray(arg1 >>> 0);
};
- imports.wbg.__wbg_framebufferTexture2D_3da41a7f38e2c523 = function(arg0, arg1, arg2, arg3, arg4, arg5) {
+ imports.wbg.__wbg_framebufferTexture2D_ceadbfd128a6e565 = function(arg0, arg1, arg2, arg3, arg4, arg5) {
getObject(arg0).framebufferTexture2D(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, getObject(arg4), arg5);
};
- imports.wbg.__wbg_getAttribLocation_5d304d390c7273f5 = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_getAttribLocation_7f79c73e983e47cd = function(arg0, arg1, arg2, arg3) {
var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
return ret;
};
- imports.wbg.__wbg_getProgramInfoLog_18c849a5fa54e7b1 = function(arg0, arg1, arg2) {
- var ret = getObject(arg1).getProgramInfoLog(getObject(arg2));
- var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_getProgramParameter_80edd3cfbcf7cf1d = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0);
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_getShaderInfoLog_ba1de20c14b6fb63 = function(arg0, arg1, arg2) {
- var ret = getObject(arg1).getShaderInfoLog(getObject(arg2));
- var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_getShaderParameter_264d9ab5c13ece4d = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0);
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_getUniformLocation_77b2d89291f84289 = function(arg0, arg1, arg2, arg3) {
- var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_linkProgram_b84796e37364e5c9 = function(arg0, arg1) {
- getObject(arg0).linkProgram(getObject(arg1));
- };
- imports.wbg.__wbg_pixelStorei_a9b9b42ef01616b2 = function(arg0, arg1, arg2) {
- getObject(arg0).pixelStorei(arg1 >>> 0, arg2);
- };
- imports.wbg.__wbg_scissor_5802aaee71f2eb0e = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).scissor(arg1, arg2, arg3, arg4);
- };
- imports.wbg.__wbg_shaderSource_18f45f93c05a8311 = function(arg0, arg1, arg2, arg3) {
- getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3));
- };
- imports.wbg.__wbg_texParameteri_c54aab65b2f8cf6d = function(arg0, arg1, arg2, arg3) {
- getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3);
- };
- imports.wbg.__wbg_uniform1i_e287345af4468e22 = function(arg0, arg1, arg2) {
- getObject(arg0).uniform1i(getObject(arg1), arg2);
- };
- imports.wbg.__wbg_uniform2f_f8d8e7662e0e0eb6 = function(arg0, arg1, arg2, arg3) {
- getObject(arg0).uniform2f(getObject(arg1), arg2, arg3);
- };
- imports.wbg.__wbg_useProgram_c2fdf4a953d1128a = function(arg0, arg1) {
- getObject(arg0).useProgram(getObject(arg1));
- };
- imports.wbg.__wbg_vertexAttribPointer_76d558694fe81cd7 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
- getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6);
- };
- imports.wbg.__wbg_viewport_da0901eee69b9909 = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).viewport(arg1, arg2, arg3, arg4);
- };
- imports.wbg.__wbg_instanceof_Window_c4b70662a0d2c5ec = function(arg0) {
- var ret = getObject(arg0) instanceof Window;
+ imports.wbg.__wbg_getError_a89e4527e1dad18c = function(arg0) {
+ var ret = getObject(arg0).getError();
return ret;
};
- imports.wbg.__wbg_document_1c64944725c0d81d = function(arg0) {
- var ret = getObject(arg0).document;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_location_f98ad02632f88c43 = function(arg0) {
- var ret = getObject(arg0).location;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_navigator_480e592af6ad365b = function(arg0) {
- var ret = getObject(arg0).navigator;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_innerWidth_ef25c730fca132cf = function() { return handleError(function (arg0) {
- var ret = getObject(arg0).innerWidth;
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_innerHeight_1b1217a63a77bf61 = function() { return handleError(function (arg0) {
- var ret = getObject(arg0).innerHeight;
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_devicePixelRatio_d8c3852bb37f76bf = function(arg0) {
- var ret = getObject(arg0).devicePixelRatio;
- return ret;
- };
- imports.wbg.__wbg_performance_947628766699c5bb = function(arg0) {
- var ret = getObject(arg0).performance;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_speechSynthesis_c60292416ffe4406 = function() { return handleError(function (arg0) {
- var ret = getObject(arg0).speechSynthesis;
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_localStorage_6775414303ab5085 = function() { return handleError(function (arg0) {
- var ret = getObject(arg0).localStorage;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_matchMedia_b95c474c6db67a60 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = getObject(arg0).matchMedia(getStringFromWasm0(arg1, arg2));
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_open_5416e4448a959cfa = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
- var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_requestAnimationFrame_71638ca922068239 = function() { return handleError(function (arg0, arg1) {
- var ret = getObject(arg0).requestAnimationFrame(getObject(arg1));
- return ret;
- }, arguments) };
- imports.wbg.__wbg_fetch_cfe0d1dd786e9cd4 = function(arg0, arg1) {
- var ret = getObject(arg0).fetch(getObject(arg1));
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_setInterval_ec2d9dc4a54a6566 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = getObject(arg0).setInterval(getObject(arg1), arg2);
- return ret;
- }, arguments) };
- imports.wbg.__wbg_setTimeout_df66d951b1726b78 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = getObject(arg0).setTimeout(getObject(arg1), arg2);
- return ret;
- }, arguments) };
- imports.wbg.__wbg_addEventListener_52721772cc0a7f30 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
- getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3));
- }, arguments) };
- imports.wbg.__wbg_matches_76fae292b8cd60a6 = function(arg0) {
- var ret = getObject(arg0).matches;
- return ret;
- };
- imports.wbg.__wbg_now_559193109055ebad = function(arg0) {
- var ret = getObject(arg0).now();
- return ret;
- };
- imports.wbg.__wbg_headers_4764f5445b6a6c89 = function(arg0) {
- var ret = getObject(arg0).headers;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_newwithstrandinit_9b0fa00478c37287 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2));
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_identifier_87ee1c4654593a75 = function(arg0) {
- var ret = getObject(arg0).identifier;
- return ret;
- };
- imports.wbg.__wbg_pageX_e47dc88281930930 = function(arg0) {
- var ret = getObject(arg0).pageX;
- return ret;
- };
- imports.wbg.__wbg_pageY_b6b579adcea2948f = function(arg0) {
- var ret = getObject(arg0).pageY;
- return ret;
- };
- imports.wbg.__wbg_force_c47d39a3ad56c12f = function(arg0) {
- var ret = getObject(arg0).force;
- return ret;
- };
- imports.wbg.__wbg_instanceof_HtmlInputElement_8cafe5f30dfdb6bc = function(arg0) {
- var ret = getObject(arg0) instanceof HTMLInputElement;
- return ret;
- };
- imports.wbg.__wbg_setautofocus_5d3aec51de5021e2 = function(arg0, arg1) {
- getObject(arg0).autofocus = arg1 !== 0;
- };
- imports.wbg.__wbg_setsize_9ec16303ce038acb = function(arg0, arg1) {
- getObject(arg0).size = arg1 >>> 0;
- };
- imports.wbg.__wbg_value_0627d4b1c27534e6 = function(arg0, arg1) {
- var ret = getObject(arg1).value;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_setvalue_2459f62386b6967f = function(arg0, arg1, arg2) {
- getObject(arg0).value = getStringFromWasm0(arg1, arg2);
- };
- imports.wbg.__wbg_items_0e0d8664cb0c227c = function(arg0) {
- var ret = getObject(arg0).items;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_files_d148fafe4f8ef096 = function(arg0) {
- var ret = getObject(arg0).files;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_getData_a4934f84b4074e8b = function() { return handleError(function (arg0, arg1, arg2, arg3) {
- var ret = getObject(arg1).getData(getStringFromWasm0(arg2, arg3));
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- }, arguments) };
- imports.wbg.__wbg_length_b3892c671bcff0a9 = function(arg0) {
- var ret = getObject(arg0).length;
- return ret;
- };
- imports.wbg.__wbg_get_eb708b1d3ad92ce5 = function(arg0, arg1) {
- var ret = getObject(arg0)[arg1 >>> 0];
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_type_7a49279491e15d0a = function(arg0, arg1) {
- var ret = getObject(arg1).type;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_preventDefault_9866c9fd51eecfb6 = function(arg0) {
- getObject(arg0).preventDefault();
- };
- imports.wbg.__wbg_stopPropagation_ae76be6b0f664ee8 = function(arg0) {
- getObject(arg0).stopPropagation();
- };
- imports.wbg.__wbg_length_a2870b8b80e120c3 = function(arg0) {
- var ret = getObject(arg0).length;
- return ret;
- };
- imports.wbg.__wbg_get_b84d80d476cf15e4 = function(arg0, arg1) {
- var ret = getObject(arg0)[arg1 >>> 0];
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_speaking_6ee7e15af03f4ade = function(arg0) {
- var ret = getObject(arg0).speaking;
- return ret;
- };
- imports.wbg.__wbg_cancel_db8fc22aeb60a627 = function(arg0) {
- getObject(arg0).cancel();
- };
- imports.wbg.__wbg_speak_a2c1dfdf7b0927fc = function(arg0, arg1) {
- getObject(arg0).speak(getObject(arg1));
- };
- imports.wbg.__wbg_length_1d27563e3515722e = function(arg0) {
- var ret = getObject(arg0).length;
- return ret;
- };
- imports.wbg.__wbg_item_a23b382195352a8a = function(arg0, arg1) {
- var ret = getObject(arg0).item(arg1 >>> 0);
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_get_20b719b18767c76e = function(arg0, arg1) {
- var ret = getObject(arg0)[arg1 >>> 0];
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_name_6af1a38f3edc1522 = function(arg0, arg1) {
- var ret = getObject(arg1).name;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_lastModified_c61609c3c6a0bd88 = function(arg0) {
- var ret = getObject(arg0).lastModified;
- return ret;
- };
- imports.wbg.__wbg_instanceof_HtmlCanvasElement_25d964a0dde6717e = function(arg0) {
- var ret = getObject(arg0) instanceof HTMLCanvasElement;
- return ret;
- };
- imports.wbg.__wbg_width_555f63ab09ba7d3f = function(arg0) {
- var ret = getObject(arg0).width;
- return ret;
- };
- imports.wbg.__wbg_setwidth_c1a7061891b71f25 = function(arg0, arg1) {
- getObject(arg0).width = arg1 >>> 0;
- };
- imports.wbg.__wbg_height_7153faec70fbaf7b = function(arg0) {
- var ret = getObject(arg0).height;
- return ret;
- };
- imports.wbg.__wbg_setheight_88894b05710ff752 = function(arg0, arg1) {
- getObject(arg0).height = arg1 >>> 0;
- };
- imports.wbg.__wbg_getContext_f701d0231ae22393 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2));
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_keyCode_490ed69472addfdc = function(arg0) {
- var ret = getObject(arg0).keyCode;
- return ret;
- };
- imports.wbg.__wbg_altKey_3dcb50d5afbc5036 = function(arg0) {
- var ret = getObject(arg0).altKey;
- return ret;
- };
- imports.wbg.__wbg_ctrlKey_fb62ba10b63b34a4 = function(arg0) {
- var ret = getObject(arg0).ctrlKey;
- return ret;
- };
- imports.wbg.__wbg_shiftKey_bd2875540e5db840 = function(arg0) {
- var ret = getObject(arg0).shiftKey;
- return ret;
- };
- imports.wbg.__wbg_metaKey_94ca09e07f21f240 = function(arg0) {
- var ret = getObject(arg0).metaKey;
- return ret;
- };
- imports.wbg.__wbg_isComposing_d05ebca75d81bc30 = function(arg0) {
- var ret = getObject(arg0).isComposing;
- return ret;
- };
- imports.wbg.__wbg_key_10dcaa4bb6d5449f = function(arg0, arg1) {
- var ret = getObject(arg1).key;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- };
- imports.wbg.__wbg_clipboard_3dff7cff084c4be2 = function(arg0) {
- var ret = getObject(arg0).clipboard;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_userAgent_bdd46cceef222f52 = function() { return handleError(function (arg0, arg1) {
- var ret = getObject(arg1).userAgent;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- }, arguments) };
- imports.wbg.__wbg_touches_3bcd168150040d19 = function(arg0) {
- var ret = getObject(arg0).touches;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_changedTouches_d84714496e7f4712 = function(arg0) {
- var ret = getObject(arg0).changedTouches;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_size_3d49b94127cdd6ed = function(arg0) {
- var ret = getObject(arg0).size;
- return ret;
- };
- imports.wbg.__wbg_arrayBuffer_e857fb358de5f814 = function(arg0) {
- var ret = getObject(arg0).arrayBuffer();
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_width_d55d3698a2514ec1 = function(arg0) {
- var ret = getObject(arg0).width;
- return ret;
- };
- imports.wbg.__wbg_height_df08a93b45ce76ec = function(arg0) {
- var ret = getObject(arg0).height;
- return ret;
- };
- imports.wbg.__wbg_top_3946f8347860b55c = function(arg0) {
- var ret = getObject(arg0).top;
- return ret;
- };
- imports.wbg.__wbg_left_31cce57341292712 = function(arg0) {
- var ret = getObject(arg0).left;
- return ret;
- };
- imports.wbg.__wbg_appendChild_d318db34c4559916 = function() { return handleError(function (arg0, arg1) {
- var ret = getObject(arg0).appendChild(getObject(arg1));
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_error_da56814eacf0ed82 = function(arg0) {
- var ret = getObject(arg0).error;
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_body_78ae4fd43b446013 = function(arg0) {
- var ret = getObject(arg0).body;
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_createElement_86c152812a141a62 = function() { return handleError(function (arg0, arg1, arg2) {
- var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));
- return addHeapObject(ret);
- }, arguments) };
- imports.wbg.__wbg_getElementById_f3e94458ce77f0d0 = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_setid_681bb5a14c3d5850 = function(arg0, arg1, arg2) {
- getObject(arg0).id = getStringFromWasm0(arg1, arg2);
- };
- imports.wbg.__wbg_scrollLeft_e79152b1f5d86671 = function(arg0) {
- var ret = getObject(arg0).scrollLeft;
- return ret;
- };
- imports.wbg.__wbg_clientWidth_4d9e01af2b5b9f21 = function(arg0) {
- var ret = getObject(arg0).clientWidth;
- return ret;
- };
- imports.wbg.__wbg_clientHeight_87c209f0cacf2e97 = function(arg0) {
- var ret = getObject(arg0).clientHeight;
- return ret;
- };
- imports.wbg.__wbg_getBoundingClientRect_2fba0402ea2a6ec4 = function(arg0) {
- var ret = getObject(arg0).getBoundingClientRect();
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_instanceof_WebGlRenderingContext_101b938bec1286a3 = function(arg0) {
- var ret = getObject(arg0) instanceof WebGLRenderingContext;
- return ret;
- };
- imports.wbg.__wbg_drawingBufferWidth_8b0c2b31d9d6eee7 = function(arg0) {
- var ret = getObject(arg0).drawingBufferWidth;
- return ret;
- };
- imports.wbg.__wbg_drawingBufferHeight_f62678018bab567c = function(arg0) {
- var ret = getObject(arg0).drawingBufferHeight;
- return ret;
- };
- imports.wbg.__wbg_bufferData_6beb22ecb30c1316 = function(arg0, arg1, arg2, arg3) {
- getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0);
- };
- imports.wbg.__wbg_bufferData_2f9be23b37e5a1a4 = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).bufferData(arg1 >>> 0, getArrayU8FromWasm0(arg2, arg3), arg4 >>> 0);
- };
- imports.wbg.__wbg_texImage2D_712c56fe5a9825ed = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) {
- getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10));
- }, arguments) };
- imports.wbg.__wbg_activeTexture_b34aca0c2110966c = function(arg0, arg1) {
- getObject(arg0).activeTexture(arg1 >>> 0);
- };
- imports.wbg.__wbg_attachShader_eaa824fd5b37a770 = function(arg0, arg1, arg2) {
- getObject(arg0).attachShader(getObject(arg1), getObject(arg2));
- };
- imports.wbg.__wbg_bindBuffer_2ca7e1c18819ecb2 = function(arg0, arg1, arg2) {
- getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2));
- };
- imports.wbg.__wbg_bindFramebuffer_c9f468afa9d42a5f = function(arg0, arg1, arg2) {
- getObject(arg0).bindFramebuffer(arg1 >>> 0, getObject(arg2));
- };
- imports.wbg.__wbg_bindTexture_edd827f3dba6038e = function(arg0, arg1, arg2) {
- getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2));
- };
- imports.wbg.__wbg_blendFunc_d5ab9f0ff5a40a48 = function(arg0, arg1, arg2) {
- getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0);
- };
- imports.wbg.__wbg_clear_da26620d46f0a11a = function(arg0, arg1) {
- getObject(arg0).clear(arg1 >>> 0);
- };
- imports.wbg.__wbg_clearColor_cbf22f8faa5a52c1 = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).clearColor(arg1, arg2, arg3, arg4);
- };
- imports.wbg.__wbg_compileShader_8fb70a472f32552c = function(arg0, arg1) {
- getObject(arg0).compileShader(getObject(arg1));
- };
- imports.wbg.__wbg_createBuffer_4802e2f0e1b1acdf = function(arg0) {
- var ret = getObject(arg0).createBuffer();
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_createFramebuffer_0157699cdc720b46 = function(arg0) {
- var ret = getObject(arg0).createFramebuffer();
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_createProgram_b1d94f4c7554d3a1 = function(arg0) {
- var ret = getObject(arg0).createProgram();
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_createShader_da09e167692f0dc7 = function(arg0, arg1) {
- var ret = getObject(arg0).createShader(arg1 >>> 0);
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_createTexture_bafc7c08393ae59d = function(arg0) {
- var ret = getObject(arg0).createTexture();
- return isLikeNone(ret) ? 0 : addHeapObject(ret);
- };
- imports.wbg.__wbg_deleteBuffer_9c31f3452ba32db1 = function(arg0, arg1) {
- getObject(arg0).deleteBuffer(getObject(arg1));
- };
- imports.wbg.__wbg_deleteFramebuffer_0f43513bd6c6d986 = function(arg0, arg1) {
- getObject(arg0).deleteFramebuffer(getObject(arg1));
- };
- imports.wbg.__wbg_deleteProgram_a2c849932f79e7af = function(arg0, arg1) {
- getObject(arg0).deleteProgram(getObject(arg1));
- };
- imports.wbg.__wbg_deleteTexture_82d755a5ac828346 = function(arg0, arg1) {
- getObject(arg0).deleteTexture(getObject(arg1));
- };
- imports.wbg.__wbg_disable_b07faddb7d04349f = function(arg0, arg1) {
- getObject(arg0).disable(arg1 >>> 0);
- };
- imports.wbg.__wbg_drawElements_8e8af4b6757fedce = function(arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4);
- };
- imports.wbg.__wbg_enable_d3d210aeb08eff52 = function(arg0, arg1) {
- getObject(arg0).enable(arg1 >>> 0);
- };
- imports.wbg.__wbg_enableVertexAttribArray_d539e547495bea44 = function(arg0, arg1) {
- getObject(arg0).enableVertexAttribArray(arg1 >>> 0);
- };
- imports.wbg.__wbg_framebufferTexture2D_923c6fc6645661bc = function(arg0, arg1, arg2, arg3, arg4, arg5) {
- getObject(arg0).framebufferTexture2D(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, getObject(arg4), arg5);
- };
- imports.wbg.__wbg_getAttribLocation_706a0beabcdaebcf = function(arg0, arg1, arg2, arg3) {
- var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
- return ret;
- };
- imports.wbg.__wbg_getExtension_045789240c50a108 = function() { return handleError(function (arg0, arg1, arg2) {
+ imports.wbg.__wbg_getExtension_aa055f67731688a2 = function() { return handleError(function (arg0, arg1, arg2) {
var ret = getObject(arg0).getExtension(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_getParameter_6412bd2d0602696d = function() { return handleError(function (arg0, arg1) {
+ imports.wbg.__wbg_getParameter_ecc6d50165f87cce = function() { return handleError(function (arg0, arg1) {
var ret = getObject(arg0).getParameter(arg1 >>> 0);
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_getProgramInfoLog_b60e82d52c200cbd = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_getProgramInfoLog_dbd8d8cedcc8cdcc = function(arg0, arg1, arg2) {
var ret = getObject(arg1).getProgramInfoLog(getObject(arg2));
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_getProgramParameter_229c193895936bbe = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_getProgramParameter_4b9d43902599c2d2 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_getShaderInfoLog_ba51160c01b98360 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_getShaderInfoLog_5aab05280bd0fe1b = function(arg0, arg1, arg2) {
var ret = getObject(arg1).getShaderInfoLog(getObject(arg2));
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_getShaderParameter_dadc55c10928575d = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_getShaderParameter_e5f7e371d4eec000 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_getUniformLocation_c3b3570b4632cc5c = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_getSupportedExtensions_9129f695af4c7c3a = function(arg0) {
+ var ret = getObject(arg0).getSupportedExtensions();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_getUniformLocation_9541edb0d39d1646 = function(arg0, arg1, arg2, arg3) {
var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_linkProgram_7080c84b0233cea2 = function(arg0, arg1) {
+ imports.wbg.__wbg_linkProgram_116382e2dc17af64 = function(arg0, arg1) {
getObject(arg0).linkProgram(getObject(arg1));
};
- imports.wbg.__wbg_pixelStorei_3cd96723ae22a5c6 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_pixelStorei_ea8cf13cf2f14a47 = function(arg0, arg1, arg2) {
getObject(arg0).pixelStorei(arg1 >>> 0, arg2);
};
- imports.wbg.__wbg_scissor_35fe98c7da06091c = function(arg0, arg1, arg2, arg3, arg4) {
+ imports.wbg.__wbg_scissor_826e824cb569eebc = function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).scissor(arg1, arg2, arg3, arg4);
};
- imports.wbg.__wbg_shaderSource_67b991301db003d0 = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_shaderSource_0066bb6817bf9e88 = function(arg0, arg1, arg2, arg3) {
getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3));
};
- imports.wbg.__wbg_texParameteri_bd724f6a5ad0cbbc = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_texParameteri_52fb3e85a6d2c636 = function(arg0, arg1, arg2, arg3) {
getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3);
};
- imports.wbg.__wbg_uniform1i_0811c29c0eebe191 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_uniform1i_a6ce351ee8cef296 = function(arg0, arg1, arg2) {
getObject(arg0).uniform1i(getObject(arg1), arg2);
};
- imports.wbg.__wbg_uniform2f_c4c110dee7f069e7 = function(arg0, arg1, arg2, arg3) {
+ imports.wbg.__wbg_uniform2f_84c79c4f8bb2428e = function(arg0, arg1, arg2, arg3) {
getObject(arg0).uniform2f(getObject(arg1), arg2, arg3);
};
- imports.wbg.__wbg_useProgram_b72b0bfcbc720fa9 = function(arg0, arg1) {
+ imports.wbg.__wbg_useProgram_de22d1e01c430663 = function(arg0, arg1) {
getObject(arg0).useProgram(getObject(arg1));
};
- imports.wbg.__wbg_vertexAttribPointer_b5cb524c6fe9eec8 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+ imports.wbg.__wbg_vertexAttribPointer_4e139167926d5080 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6);
};
- imports.wbg.__wbg_viewport_89af3aceb7036a2c = function(arg0, arg1, arg2, arg3, arg4) {
+ imports.wbg.__wbg_viewport_caffbaa3e8b9568b = function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).viewport(arg1, arg2, arg3, arg4);
};
- imports.wbg.__wbg_error_cc38ce2b4b661e1d = function(arg0) {
- console.error(getObject(arg0));
- };
- imports.wbg.__wbg_log_3445347661d4505e = function(arg0) {
- console.log(getObject(arg0));
- };
- imports.wbg.__wbg_warn_5ec7c7c02d0b3841 = function(arg0) {
- console.warn(getObject(arg0));
- };
- imports.wbg.__wbg_scrollTop_14114fee3506489f = function(arg0) {
- var ret = getObject(arg0).scrollTop;
+ imports.wbg.__wbg_instanceof_Window_434ce1849eb4e0fc = function(arg0) {
+ var ret = getObject(arg0) instanceof Window;
return ret;
};
- imports.wbg.__wbg_hidden_cf2bd9859a26899c = function(arg0) {
- var ret = getObject(arg0).hidden;
- return ret;
+ imports.wbg.__wbg_document_5edd43643d1060d9 = function(arg0) {
+ var ret = getObject(arg0).document;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_sethidden_8e35dd2030c5f20a = function(arg0, arg1) {
- getObject(arg0).hidden = arg1 !== 0;
- };
- imports.wbg.__wbg_style_c88e323890d3a091 = function(arg0) {
- var ret = getObject(arg0).style;
+ imports.wbg.__wbg_location_11472bb76bf5bbca = function(arg0) {
+ var ret = getObject(arg0).location;
return addHeapObject(ret);
};
- imports.wbg.__wbg_offsetTop_83b2934370041fae = function(arg0) {
- var ret = getObject(arg0).offsetTop;
- return ret;
+ imports.wbg.__wbg_navigator_0e0588c949560476 = function(arg0) {
+ var ret = getObject(arg0).navigator;
+ return addHeapObject(ret);
};
- imports.wbg.__wbg_offsetLeft_d6d050965faa87a8 = function(arg0) {
- var ret = getObject(arg0).offsetLeft;
- return ret;
- };
- imports.wbg.__wbg_offsetWidth_69cd6669725b154f = function(arg0) {
- var ret = getObject(arg0).offsetWidth;
- return ret;
- };
- imports.wbg.__wbg_blur_0bae1ed9ffb0b918 = function() { return handleError(function (arg0) {
- getObject(arg0).blur();
+ imports.wbg.__wbg_innerWidth_405786923c1d2641 = function() { return handleError(function (arg0) {
+ var ret = getObject(arg0).innerWidth;
+ return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_focus_00530e359f44fc6e = function() { return handleError(function (arg0) {
- getObject(arg0).focus();
+ imports.wbg.__wbg_innerHeight_25d3be0d129329c3 = function() { return handleError(function (arg0) {
+ var ret = getObject(arg0).innerHeight;
+ return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_setProperty_1460c660bc329763 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
- }, arguments) };
- imports.wbg.__wbg_hash_0fff5255cf3c317c = function() { return handleError(function (arg0, arg1) {
- var ret = getObject(arg1).hash;
- var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
- }, arguments) };
- imports.wbg.__wbg_clientX_97ff0f5c7b19e687 = function(arg0) {
- var ret = getObject(arg0).clientX;
+ imports.wbg.__wbg_devicePixelRatio_9632545370d525ae = function(arg0) {
+ var ret = getObject(arg0).devicePixelRatio;
return ret;
};
- imports.wbg.__wbg_clientY_cacd4a7e44b9719b = function(arg0) {
- var ret = getObject(arg0).clientY;
- return ret;
+ imports.wbg.__wbg_performance_bbca4ccfaef860b2 = function(arg0) {
+ var ret = getObject(arg0).performance;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_ctrlKey_9761d22fa42f09c0 = function(arg0) {
- var ret = getObject(arg0).ctrlKey;
- return ret;
- };
- imports.wbg.__wbg_metaKey_e6b9e0aa35aa2974 = function(arg0) {
- var ret = getObject(arg0).metaKey;
- return ret;
- };
- imports.wbg.__wbg_button_a02c0467d38e8338 = function(arg0) {
- var ret = getObject(arg0).button;
- return ret;
- };
- imports.wbg.__wbg_getItem_77fb9d4666f3b93a = function() { return handleError(function (arg0, arg1, arg2, arg3) {
- var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3));
- var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
- var len0 = WASM_VECTOR_LEN;
- getInt32Memory0()[arg0 / 4 + 1] = len0;
- getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ imports.wbg.__wbg_speechSynthesis_b2674a6ce67b99ad = function() { return handleError(function (arg0) {
+ var ret = getObject(arg0).speechSynthesis;
+ return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_setItem_b0c4561489dffecd = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
- getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
+ imports.wbg.__wbg_localStorage_2b7091e6919605e2 = function() { return handleError(function (arg0) {
+ var ret = getObject(arg0).localStorage;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_data_dbff09eb89176161 = function(arg0, arg1) {
+ imports.wbg.__wbg_matchMedia_646cf522f15a60a9 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).matchMedia(getStringFromWasm0(arg1, arg2));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_open_67fbcd7373a90ddc = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
+ var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_requestAnimationFrame_0c71cd3c6779a371 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg0).requestAnimationFrame(getObject(arg1));
+ return ret;
+ }, arguments) };
+ imports.wbg.__wbg_fetch_427498e0ccea81f4 = function(arg0, arg1) {
+ var ret = getObject(arg0).fetch(getObject(arg1));
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_setInterval_fcb622396840b607 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).setInterval(getObject(arg1), arg2);
+ return ret;
+ }, arguments) };
+ imports.wbg.__wbg_setTimeout_1c75092906446b91 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).setTimeout(getObject(arg1), arg2);
+ return ret;
+ }, arguments) };
+ imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
+ var ret = getObject(arg0);
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_data_9562112603a9aa89 = function(arg0, arg1) {
var ret = getObject(arg1).data;
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_type_a6fcda966902940d = function(arg0, arg1) {
+ imports.wbg.__wbg_type_8bc3e57acd2158c9 = function(arg0, arg1) {
var ret = getObject(arg1).type;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_set_5357fedb30848723 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
+ imports.wbg.__wbg_set_f9448486a94c9aef = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).set(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
}, arguments) };
- imports.wbg.__wbg_setvolume_44690b04c6d36880 = function(arg0, arg1) {
+ imports.wbg.__wbg_bindVertexArrayOES_4364f11e81712180 = function(arg0, arg1) {
+ getObject(arg0).bindVertexArrayOES(getObject(arg1));
+ };
+ imports.wbg.__wbg_createVertexArrayOES_54cc0b7c450f4662 = function(arg0) {
+ var ret = getObject(arg0).createVertexArrayOES();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_setvolume_1f2d6904dfdf4626 = function(arg0, arg1) {
getObject(arg0).volume = arg1;
};
- imports.wbg.__wbg_setrate_d7dded444361b3d7 = function(arg0, arg1) {
+ imports.wbg.__wbg_setrate_d8f68fa10eeb7dbb = function(arg0, arg1) {
getObject(arg0).rate = arg1;
};
- imports.wbg.__wbg_setpitch_43555959c1427b9f = function(arg0, arg1) {
+ imports.wbg.__wbg_setpitch_7cc80b45cc0633c7 = function(arg0, arg1) {
getObject(arg0).pitch = arg1;
};
- imports.wbg.__wbg_setonstart_69c389399994b82f = function(arg0, arg1) {
+ imports.wbg.__wbg_setonstart_fab3ebffcb3dc24f = function(arg0, arg1) {
getObject(arg0).onstart = getObject(arg1);
};
- imports.wbg.__wbg_setonend_e5383b79c37801e0 = function(arg0, arg1) {
+ imports.wbg.__wbg_setonend_fff35a6f78e430f4 = function(arg0, arg1) {
getObject(arg0).onend = getObject(arg1);
};
- imports.wbg.__wbg_setonerror_9a2a8daff49cf41b = function(arg0, arg1) {
+ imports.wbg.__wbg_setonerror_ec0f8ed48489bd83 = function(arg0, arg1) {
getObject(arg0).onerror = getObject(arg1);
};
- imports.wbg.__wbg_newwithtext_c86b8374216fcadc = function() { return handleError(function (arg0, arg1) {
+ imports.wbg.__wbg_newwithtext_b63d82923fd41338 = function() { return handleError(function (arg0, arg1) {
var ret = new SpeechSynthesisUtterance(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_deltaX_8cfc6cd15e97d97c = function(arg0) {
+ imports.wbg.__wbg_deltaX_df228181f4d1a561 = function(arg0) {
var ret = getObject(arg0).deltaX;
return ret;
};
- imports.wbg.__wbg_deltaY_080604c20160c0e8 = function(arg0) {
+ imports.wbg.__wbg_deltaY_afa6edde136e1500 = function(arg0) {
var ret = getObject(arg0).deltaY;
return ret;
};
- imports.wbg.__wbg_deltaMode_c5ec1ee518ea0a08 = function(arg0) {
+ imports.wbg.__wbg_deltaMode_ed9d7974a0c11323 = function(arg0) {
var ret = getObject(arg0).deltaMode;
return ret;
};
- imports.wbg.__wbg_writeText_3b86a6dbc18b261b = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2));
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_clipboardData_d717f7cf398c0dd9 = function(arg0) {
+ imports.wbg.__wbg_clipboardData_702911c63c2dd54e = function(arg0) {
var ret = getObject(arg0).clipboardData;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_dataTransfer_ebba35c1049e694f = function(arg0) {
+ imports.wbg.__wbg_dataTransfer_bc4c0501385a0c8e = function(arg0) {
var ret = getObject(arg0).dataTransfer;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
- imports.wbg.__wbg_instanceof_Response_e1b11afbefa5b563 = function(arg0) {
+ imports.wbg.__wbg_instanceof_Response_ea36d565358a42f7 = function(arg0) {
var ret = getObject(arg0) instanceof Response;
return ret;
};
- imports.wbg.__wbg_url_50e0bdb6051741be = function(arg0, arg1) {
+ imports.wbg.__wbg_url_6e564c9e212456f8 = function(arg0, arg1) {
var ret = getObject(arg1).url;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_status_6d8bb444ddc5a7b2 = function(arg0) {
+ imports.wbg.__wbg_status_3a55bb50e744b834 = function(arg0) {
var ret = getObject(arg0).status;
return ret;
};
- imports.wbg.__wbg_ok_270f6d403efe7e7b = function(arg0) {
+ imports.wbg.__wbg_ok_23eb4786bc6e94e7 = function(arg0) {
var ret = getObject(arg0).ok;
return ret;
};
- imports.wbg.__wbg_statusText_97740db9b8bb12e3 = function(arg0, arg1) {
+ imports.wbg.__wbg_statusText_a3f3d92b5ddca585 = function(arg0, arg1) {
var ret = getObject(arg1).statusText;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
- imports.wbg.__wbg_headers_5ffa990806e04cfc = function(arg0) {
+ imports.wbg.__wbg_headers_e4204c6775f7b3b4 = function(arg0) {
var ret = getObject(arg0).headers;
return addHeapObject(ret);
};
- imports.wbg.__wbg_arrayBuffer_b8937ed04beb0d36 = function() { return handleError(function (arg0) {
+ imports.wbg.__wbg_arrayBuffer_0e2a43f68a8b3e49 = function() { return handleError(function (arg0) {
var ret = getObject(arg0).arrayBuffer();
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_get_67189fe0b323d288 = function(arg0, arg1) {
+ imports.wbg.__wbg_writeText_6267af08021f3e64 = function(arg0, arg1, arg2) {
+ var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2));
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_addEventListener_6bdba88519fdc1c9 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
+ getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3));
+ }, arguments) };
+ imports.wbg.__wbg_matches_a375878271bc2ba5 = function(arg0) {
+ var ret = getObject(arg0).matches;
+ return ret;
+ };
+ imports.wbg.__wbg_identifier_afa8b01d4d901685 = function(arg0) {
+ var ret = getObject(arg0).identifier;
+ return ret;
+ };
+ imports.wbg.__wbg_pageX_e0c8221ecfdb73d0 = function(arg0) {
+ var ret = getObject(arg0).pageX;
+ return ret;
+ };
+ imports.wbg.__wbg_pageY_32100ad7039a744e = function(arg0) {
+ var ret = getObject(arg0).pageY;
+ return ret;
+ };
+ imports.wbg.__wbg_force_8e51e1fec066aade = function(arg0) {
+ var ret = getObject(arg0).force;
+ return ret;
+ };
+ imports.wbg.__wbg_instanceof_HtmlInputElement_8969541a2a0bded0 = function(arg0) {
+ var ret = getObject(arg0) instanceof HTMLInputElement;
+ return ret;
+ };
+ imports.wbg.__wbg_setautofocus_a2ae37091dfbe4af = function(arg0, arg1) {
+ getObject(arg0).autofocus = arg1 !== 0;
+ };
+ imports.wbg.__wbg_setsize_90d1034a7a757a50 = function(arg0, arg1) {
+ getObject(arg0).size = arg1 >>> 0;
+ };
+ imports.wbg.__wbg_value_fc1c354d1a0e9714 = function(arg0, arg1) {
+ var ret = getObject(arg1).value;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_setvalue_ce4a23f487065c07 = function(arg0, arg1, arg2) {
+ getObject(arg0).value = getStringFromWasm0(arg1, arg2);
+ };
+ imports.wbg.__wbg_length_41b205f6892bf9d9 = function(arg0) {
+ var ret = getObject(arg0).length;
+ return ret;
+ };
+ imports.wbg.__wbg_get_bdec89fd60d07530 = function(arg0, arg1) {
+ var ret = getObject(arg0)[arg1 >>> 0];
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_now_5fa0ca001e042f8a = function(arg0) {
+ var ret = getObject(arg0).now();
+ return ret;
+ };
+ imports.wbg.__wbg_headers_1a60dec7fbd28a3b = function(arg0) {
+ var ret = getObject(arg0).headers;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_newwithstrandinit_c07f0662ece15bc6 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2));
+ return addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_speaking_3e6ccf3668029ac5 = function(arg0) {
+ var ret = getObject(arg0).speaking;
+ return ret;
+ };
+ imports.wbg.__wbg_cancel_85040548807aa10f = function(arg0) {
+ getObject(arg0).cancel();
+ };
+ imports.wbg.__wbg_speak_907bd548bebdbbf2 = function(arg0, arg1) {
+ getObject(arg0).speak(getObject(arg1));
+ };
+ imports.wbg.__wbg_items_d571f433ef73ee49 = function(arg0) {
+ var ret = getObject(arg0).items;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_files_a4192b4f5967317b = function(arg0) {
+ var ret = getObject(arg0).files;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_getData_3a1069aff0f72f76 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
+ var ret = getObject(arg1).getData(getStringFromWasm0(arg2, arg3));
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_type_e32f387f5584c765 = function(arg0, arg1) {
+ var ret = getObject(arg1).type;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_preventDefault_fa00541ff125b78c = function(arg0) {
+ getObject(arg0).preventDefault();
+ };
+ imports.wbg.__wbg_stopPropagation_da586180676fa914 = function(arg0) {
+ getObject(arg0).stopPropagation();
+ };
+ imports.wbg.__wbg_name_9a61dbbdbfb2d0de = function(arg0, arg1) {
+ var ret = getObject(arg1).name;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_lastModified_0de23a8c5214f2fb = function(arg0) {
+ var ret = getObject(arg0).lastModified;
+ return ret;
+ };
+ imports.wbg.__wbg_length_a2882c668bdf6488 = function(arg0) {
+ var ret = getObject(arg0).length;
+ return ret;
+ };
+ imports.wbg.__wbg_get_1c01a7682a9775bb = function(arg0, arg1) {
+ var ret = getObject(arg0)[arg1 >>> 0];
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_keyCode_8a05b1390fced3c8 = function(arg0) {
+ var ret = getObject(arg0).keyCode;
+ return ret;
+ };
+ imports.wbg.__wbg_altKey_773e7f8151c49bb1 = function(arg0) {
+ var ret = getObject(arg0).altKey;
+ return ret;
+ };
+ imports.wbg.__wbg_ctrlKey_8c7ff99be598479e = function(arg0) {
+ var ret = getObject(arg0).ctrlKey;
+ return ret;
+ };
+ imports.wbg.__wbg_shiftKey_894b631364d8db13 = function(arg0) {
+ var ret = getObject(arg0).shiftKey;
+ return ret;
+ };
+ imports.wbg.__wbg_metaKey_99a7d3732e1b7856 = function(arg0) {
+ var ret = getObject(arg0).metaKey;
+ return ret;
+ };
+ imports.wbg.__wbg_isComposing_b892666abf384da9 = function(arg0) {
+ var ret = getObject(arg0).isComposing;
+ return ret;
+ };
+ imports.wbg.__wbg_key_7f10b1291a923361 = function(arg0, arg1) {
+ var ret = getObject(arg1).key;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_length_01a613025b5ffd74 = function(arg0) {
+ var ret = getObject(arg0).length;
+ return ret;
+ };
+ imports.wbg.__wbg_item_b192ab411bbfbb09 = function(arg0, arg1) {
+ var ret = getObject(arg0).item(arg1 >>> 0);
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_get_a765dab923455e0d = function(arg0, arg1) {
+ var ret = getObject(arg0)[arg1 >>> 0];
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_body_7538539844356c1c = function(arg0) {
+ var ret = getObject(arg0).body;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_createElement_d017b8d2af99bab9 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));
+ return addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_getElementById_b30e88aff96f66a1 = function(arg0, arg1, arg2) {
+ var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_instanceof_WebGlRenderingContext_2be4c068bf5f8362 = function(arg0) {
+ var ret = getObject(arg0) instanceof WebGLRenderingContext;
+ return ret;
+ };
+ imports.wbg.__wbg_bufferData_85d635f32a990208 = function(arg0, arg1, arg2, arg3) {
+ getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0);
+ };
+ imports.wbg.__wbg_texImage2D_16ff123798c82f60 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
+ getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, getObject(arg9));
+ }, arguments) };
+ imports.wbg.__wbg_texSubImage2D_d907a4c940fd6e41 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
+ getObject(arg0).texSubImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, getObject(arg9));
+ }, arguments) };
+ imports.wbg.__wbg_activeTexture_74ed11a5c5d5af90 = function(arg0, arg1) {
+ getObject(arg0).activeTexture(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_attachShader_55dbe770f3ee32ca = function(arg0, arg1, arg2) {
+ getObject(arg0).attachShader(getObject(arg1), getObject(arg2));
+ };
+ imports.wbg.__wbg_bindBuffer_29d52e7bc48650c3 = function(arg0, arg1, arg2) {
+ getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2));
+ };
+ imports.wbg.__wbg_bindFramebuffer_bd35ddd23765c7b6 = function(arg0, arg1, arg2) {
+ getObject(arg0).bindFramebuffer(arg1 >>> 0, getObject(arg2));
+ };
+ imports.wbg.__wbg_bindTexture_198c816345baca83 = function(arg0, arg1, arg2) {
+ getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2));
+ };
+ imports.wbg.__wbg_blendEquation_09d56f3be6f914f5 = function(arg0, arg1) {
+ getObject(arg0).blendEquation(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_blendFuncSeparate_494b1dae028cb9a9 = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).blendFuncSeparate(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, arg4 >>> 0);
+ };
+ imports.wbg.__wbg_clear_2af1271959ec83d7 = function(arg0, arg1) {
+ getObject(arg0).clear(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_clearColor_51c4f69c743c3252 = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).clearColor(arg1, arg2, arg3, arg4);
+ };
+ imports.wbg.__wbg_compileShader_3b5f9ef4c67a0777 = function(arg0, arg1) {
+ getObject(arg0).compileShader(getObject(arg1));
+ };
+ imports.wbg.__wbg_createBuffer_c40f37e1348bb91f = function(arg0) {
+ var ret = getObject(arg0).createBuffer();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_createFramebuffer_410b12a5cc5a8f13 = function(arg0) {
+ var ret = getObject(arg0).createFramebuffer();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_createProgram_245520da1fb9e47b = function(arg0) {
+ var ret = getObject(arg0).createProgram();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_createShader_4d8818a13cb825b3 = function(arg0, arg1) {
+ var ret = getObject(arg0).createShader(arg1 >>> 0);
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_createTexture_f3a6a715d6bada45 = function(arg0) {
+ var ret = getObject(arg0).createTexture();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_deleteShader_e4f5a1da4d9c84c4 = function(arg0, arg1) {
+ getObject(arg0).deleteShader(getObject(arg1));
+ };
+ imports.wbg.__wbg_deleteTexture_9159fb5927ed32c0 = function(arg0, arg1) {
+ getObject(arg0).deleteTexture(getObject(arg1));
+ };
+ imports.wbg.__wbg_detachShader_32e4b718f0a63080 = function(arg0, arg1, arg2) {
+ getObject(arg0).detachShader(getObject(arg1), getObject(arg2));
+ };
+ imports.wbg.__wbg_disable_2b63b75dc6c27537 = function(arg0, arg1) {
+ getObject(arg0).disable(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_disableVertexAttribArray_aa8458b40dd08914 = function(arg0, arg1) {
+ getObject(arg0).disableVertexAttribArray(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_drawElements_6e26500a25ecf478 = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4);
+ };
+ imports.wbg.__wbg_enable_8f6dd779ccb8e1de = function(arg0, arg1) {
+ getObject(arg0).enable(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_enableVertexAttribArray_4ed5f91d0718bee1 = function(arg0, arg1) {
+ getObject(arg0).enableVertexAttribArray(arg1 >>> 0);
+ };
+ imports.wbg.__wbg_framebufferTexture2D_31643260e5b0b294 = function(arg0, arg1, arg2, arg3, arg4, arg5) {
+ getObject(arg0).framebufferTexture2D(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, getObject(arg4), arg5);
+ };
+ imports.wbg.__wbg_getAttribLocation_da5df7094096113d = function(arg0, arg1, arg2, arg3) {
+ var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
+ return ret;
+ };
+ imports.wbg.__wbg_getError_364189947a05fa24 = function(arg0) {
+ var ret = getObject(arg0).getError();
+ return ret;
+ };
+ imports.wbg.__wbg_getExtension_c6ceee3244ee7f20 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).getExtension(getStringFromWasm0(arg1, arg2));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_getParameter_cf7a00ba1cbac0d3 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg0).getParameter(arg1 >>> 0);
+ return addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_getProgramInfoLog_c253042b64e86027 = function(arg0, arg1, arg2) {
+ var ret = getObject(arg1).getProgramInfoLog(getObject(arg2));
+ var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_getProgramParameter_4f698af0dda0a2d4 = function(arg0, arg1, arg2) {
+ var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0);
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_getShaderInfoLog_584794e3bcf1e19b = function(arg0, arg1, arg2) {
+ var ret = getObject(arg1).getShaderInfoLog(getObject(arg2));
+ var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ };
+ imports.wbg.__wbg_getShaderParameter_64b1ffe576e5fa25 = function(arg0, arg1, arg2) {
+ var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0);
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_getSupportedExtensions_687e6dd9ca9b8e1e = function(arg0) {
+ var ret = getObject(arg0).getSupportedExtensions();
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_getUniformLocation_703972f150a46500 = function(arg0, arg1, arg2, arg3) {
+ var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_linkProgram_5fdd57237c761833 = function(arg0, arg1) {
+ getObject(arg0).linkProgram(getObject(arg1));
+ };
+ imports.wbg.__wbg_pixelStorei_fab41fe53c557df3 = function(arg0, arg1, arg2) {
+ getObject(arg0).pixelStorei(arg1 >>> 0, arg2);
+ };
+ imports.wbg.__wbg_scissor_fb094c7db856e2a7 = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).scissor(arg1, arg2, arg3, arg4);
+ };
+ imports.wbg.__wbg_shaderSource_173ab97288934a60 = function(arg0, arg1, arg2, arg3) {
+ getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3));
+ };
+ imports.wbg.__wbg_texParameteri_caec5468f2a850c3 = function(arg0, arg1, arg2, arg3) {
+ getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3);
+ };
+ imports.wbg.__wbg_uniform1i_a0275676828a22b6 = function(arg0, arg1, arg2) {
+ getObject(arg0).uniform1i(getObject(arg1), arg2);
+ };
+ imports.wbg.__wbg_uniform2f_b0af46ba675f2c0d = function(arg0, arg1, arg2, arg3) {
+ getObject(arg0).uniform2f(getObject(arg1), arg2, arg3);
+ };
+ imports.wbg.__wbg_useProgram_d5898a40ebe88916 = function(arg0, arg1) {
+ getObject(arg0).useProgram(getObject(arg1));
+ };
+ imports.wbg.__wbg_vertexAttribPointer_0d097efa33e3f45f = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+ getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6);
+ };
+ imports.wbg.__wbg_viewport_19577064127daf83 = function(arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).viewport(arg1, arg2, arg3, arg4);
+ };
+ imports.wbg.__wbg_setid_73be37238eaa05be = function(arg0, arg1, arg2) {
+ getObject(arg0).id = getStringFromWasm0(arg1, arg2);
+ };
+ imports.wbg.__wbg_scrollLeft_e8aba47a94d12290 = function(arg0) {
+ var ret = getObject(arg0).scrollLeft;
+ return ret;
+ };
+ imports.wbg.__wbg_clientWidth_4c903f82634f2159 = function(arg0) {
+ var ret = getObject(arg0).clientWidth;
+ return ret;
+ };
+ imports.wbg.__wbg_clientHeight_cddbd2cef19a2cb1 = function(arg0) {
+ var ret = getObject(arg0).clientHeight;
+ return ret;
+ };
+ imports.wbg.__wbg_getBoundingClientRect_534c1b96b6e612d3 = function(arg0) {
+ var ret = getObject(arg0).getBoundingClientRect();
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_scrollTop_5ebd5c6591748d6e = function(arg0) {
+ var ret = getObject(arg0).scrollTop;
+ return ret;
+ };
+ imports.wbg.__wbg_hidden_f7a620ec4ab18ce5 = function(arg0) {
+ var ret = getObject(arg0).hidden;
+ return ret;
+ };
+ imports.wbg.__wbg_sethidden_fdaefd7e7da7e4c0 = function(arg0, arg1) {
+ getObject(arg0).hidden = arg1 !== 0;
+ };
+ imports.wbg.__wbg_style_16f5dd9624687c8f = function(arg0) {
+ var ret = getObject(arg0).style;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_offsetTop_45111254e7b26a1f = function(arg0) {
+ var ret = getObject(arg0).offsetTop;
+ return ret;
+ };
+ imports.wbg.__wbg_offsetLeft_be5393bf9eec5766 = function(arg0) {
+ var ret = getObject(arg0).offsetLeft;
+ return ret;
+ };
+ imports.wbg.__wbg_offsetWidth_bc683e2f57ea2d6b = function(arg0) {
+ var ret = getObject(arg0).offsetWidth;
+ return ret;
+ };
+ imports.wbg.__wbg_blur_2156876090506146 = function() { return handleError(function (arg0) {
+ getObject(arg0).blur();
+ }, arguments) };
+ imports.wbg.__wbg_focus_4434360545ac99cf = function() { return handleError(function (arg0) {
+ getObject(arg0).focus();
+ }, arguments) };
+ imports.wbg.__wbg_instanceof_HtmlCanvasElement_a6157e470d06b638 = function(arg0) {
+ var ret = getObject(arg0) instanceof HTMLCanvasElement;
+ return ret;
+ };
+ imports.wbg.__wbg_width_cfa982e2a6ad6297 = function(arg0) {
+ var ret = getObject(arg0).width;
+ return ret;
+ };
+ imports.wbg.__wbg_setwidth_362e8db8cbadbe96 = function(arg0, arg1) {
+ getObject(arg0).width = arg1 >>> 0;
+ };
+ imports.wbg.__wbg_height_1b399500ca683487 = function(arg0) {
+ var ret = getObject(arg0).height;
+ return ret;
+ };
+ imports.wbg.__wbg_setheight_28f53831182cc410 = function(arg0, arg1) {
+ getObject(arg0).height = arg1 >>> 0;
+ };
+ imports.wbg.__wbg_getContext_bd4e9445094eda84 = function() { return handleError(function (arg0, arg1, arg2) {
+ var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2));
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_clipboard_7f80e1666b51776c = function(arg0) {
+ var ret = getObject(arg0).clipboard;
+ return isLikeNone(ret) ? 0 : addHeapObject(ret);
+ };
+ imports.wbg.__wbg_userAgent_3f63af8b4fe2331c = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).userAgent;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_touches_7397ce4df4dceded = function(arg0) {
+ var ret = getObject(arg0).touches;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_changedTouches_363278e8a9a95419 = function(arg0) {
+ var ret = getObject(arg0).changedTouches;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_size_20c167ba9040b895 = function(arg0) {
+ var ret = getObject(arg0).size;
+ return ret;
+ };
+ imports.wbg.__wbg_arrayBuffer_8b5364ee9b393098 = function(arg0) {
+ var ret = getObject(arg0).arrayBuffer();
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_width_079617995a2466be = function(arg0) {
+ var ret = getObject(arg0).width;
+ return ret;
+ };
+ imports.wbg.__wbg_height_ece90b0809f44f4d = function(arg0) {
+ var ret = getObject(arg0).height;
+ return ret;
+ };
+ imports.wbg.__wbg_top_a24b8b81afea659b = function(arg0) {
+ var ret = getObject(arg0).top;
+ return ret;
+ };
+ imports.wbg.__wbg_left_0e681cb8fd277739 = function(arg0) {
+ var ret = getObject(arg0).left;
+ return ret;
+ };
+ imports.wbg.__wbg_appendChild_3fe5090c665d3bb4 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg0).appendChild(getObject(arg1));
+ return addHeapObject(ret);
+ }, arguments) };
+ imports.wbg.__wbg_getItem_f92ef607397e96b1 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
+ var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3));
+ var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_setItem_279b13e5ad0b82cb = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
+ }, arguments) };
+ imports.wbg.__wbg_setProperty_ebb06e7fa941d6a8 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
+ getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
+ }, arguments) };
+ imports.wbg.__wbg_href_0c435df13f22003c = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).href;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_origin_1bc82542e055b010 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).origin;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_protocol_128aca096ff0b399 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).protocol;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_host_8afef3759896202e = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).host;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_hostname_37415809eea07bcd = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).hostname;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_port_e5253b8797db36d1 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).port;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_search_7e1c9ba7f3985c36 = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).search;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_hash_2f90ddae1e6efe5f = function() { return handleError(function (arg0, arg1) {
+ var ret = getObject(arg1).hash;
+ var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+ var len0 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len0;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+ }, arguments) };
+ imports.wbg.__wbg_clientX_849ccdf456d662ac = function(arg0) {
+ var ret = getObject(arg0).clientX;
+ return ret;
+ };
+ imports.wbg.__wbg_clientY_1aaff30fe0cd0876 = function(arg0) {
+ var ret = getObject(arg0).clientY;
+ return ret;
+ };
+ imports.wbg.__wbg_ctrlKey_4e536bedb069129f = function(arg0) {
+ var ret = getObject(arg0).ctrlKey;
+ return ret;
+ };
+ imports.wbg.__wbg_shiftKey_cc93bd2f12bfcc9c = function(arg0) {
+ var ret = getObject(arg0).shiftKey;
+ return ret;
+ };
+ imports.wbg.__wbg_metaKey_0b396e35a4941247 = function(arg0) {
+ var ret = getObject(arg0).metaKey;
+ return ret;
+ };
+ imports.wbg.__wbg_button_a18f33eb55774d89 = function(arg0) {
+ var ret = getObject(arg0).button;
+ return ret;
+ };
+ imports.wbg.__wbg_error_e676403cd981461e = function(arg0) {
+ var ret = getObject(arg0).error;
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_get_f45dff51f52d7222 = function(arg0, arg1) {
var ret = getObject(arg0)[arg1 >>> 0];
return addHeapObject(ret);
};
- imports.wbg.__wbg_length_42e02f5a04d67464 = function(arg0) {
+ imports.wbg.__wbg_length_7b60f47bde714631 = function(arg0) {
var ret = getObject(arg0).length;
return ret;
};
@@ -1242,7 +1366,7 @@ async function init(input) {
var ret = typeof(getObject(arg0)) === 'function';
return ret;
};
- imports.wbg.__wbg_newnoargs_be86524d73f67598 = function(arg0, arg1) {
+ imports.wbg.__wbg_newnoargs_f579424187aa1717 = function(arg0, arg1) {
var ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
@@ -1251,75 +1375,75 @@ async function init(input) {
var ret = typeof(val) === 'object' && val !== null;
return ret;
};
- imports.wbg.__wbg_next_c4151d46d5fa7097 = function(arg0) {
+ imports.wbg.__wbg_next_c7a2a6b012059a5e = function(arg0) {
var ret = getObject(arg0).next;
return addHeapObject(ret);
};
- imports.wbg.__wbg_next_7720502039b96d00 = function() { return handleError(function (arg0) {
+ imports.wbg.__wbg_next_dd1a890d37e38d73 = function() { return handleError(function (arg0) {
var ret = getObject(arg0).next();
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_done_b06cf0578e89ff68 = function(arg0) {
+ imports.wbg.__wbg_done_982b1c7ac0cbc69d = function(arg0) {
var ret = getObject(arg0).done;
return ret;
};
- imports.wbg.__wbg_value_e74a542443d92451 = function(arg0) {
+ imports.wbg.__wbg_value_2def2d1fb38b02cd = function(arg0) {
var ret = getObject(arg0).value;
return addHeapObject(ret);
};
- imports.wbg.__wbg_iterator_4fc4ce93e6b92958 = function() {
+ imports.wbg.__wbg_iterator_4b9cedbeda0c0e30 = function() {
var ret = Symbol.iterator;
return addHeapObject(ret);
};
- imports.wbg.__wbg_get_4d0f21c2f823742e = function() { return handleError(function (arg0, arg1) {
+ imports.wbg.__wbg_get_8bbb82393651dd9c = function() { return handleError(function (arg0, arg1) {
var ret = Reflect.get(getObject(arg0), getObject(arg1));
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_call_888d259a5fefc347 = function() { return handleError(function (arg0, arg1) {
+ imports.wbg.__wbg_call_89558c3e96703ca1 = function() { return handleError(function (arg0, arg1) {
var ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_new_0b83d3df67ecb33e = function() {
+ imports.wbg.__wbg_new_d3138911a89329b0 = function() {
var ret = new Object();
return addHeapObject(ret);
};
- imports.wbg.__wbg_getTime_10d33f4f2959e5dd = function(arg0) {
+ imports.wbg.__wbg_getTime_f8ce0ff902444efb = function(arg0) {
var ret = getObject(arg0).getTime();
return ret;
};
- imports.wbg.__wbg_getTimezoneOffset_d3e5a22a1b7fb1d8 = function(arg0) {
+ imports.wbg.__wbg_getTimezoneOffset_41211a984662508b = function(arg0) {
var ret = getObject(arg0).getTimezoneOffset();
return ret;
};
- imports.wbg.__wbg_new0_fd3a3a290b25cdac = function() {
+ imports.wbg.__wbg_new0_57a6a2c2aaed3fc5 = function() {
var ret = new Date();
return addHeapObject(ret);
};
- imports.wbg.__wbg_resolve_d23068002f584f22 = function(arg0) {
+ imports.wbg.__wbg_resolve_4f8f547f26b30b27 = function(arg0) {
var ret = Promise.resolve(getObject(arg0));
return addHeapObject(ret);
};
- imports.wbg.__wbg_then_2fcac196782070cc = function(arg0, arg1) {
+ imports.wbg.__wbg_then_a6860c82b90816ca = function(arg0, arg1) {
var ret = getObject(arg0).then(getObject(arg1));
return addHeapObject(ret);
};
- imports.wbg.__wbg_then_8c2d62e8ae5978f7 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_then_58a04e42527f52c6 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
- imports.wbg.__wbg_self_c6fbdfc2918d5e58 = function() { return handleError(function () {
+ imports.wbg.__wbg_self_e23d74ae45fb17d1 = function() { return handleError(function () {
var ret = self.self;
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_window_baec038b5ab35c54 = function() { return handleError(function () {
+ imports.wbg.__wbg_window_b4be7f48b24ac56e = function() { return handleError(function () {
var ret = window.window;
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_globalThis_3f735a5746d41fbd = function() { return handleError(function () {
+ imports.wbg.__wbg_globalThis_d61b1f48a57191ae = function() { return handleError(function () {
var ret = globalThis.globalThis;
return addHeapObject(ret);
}, arguments) };
- imports.wbg.__wbg_global_1bc0b39582740e95 = function() { return handleError(function () {
+ imports.wbg.__wbg_global_e7669da72fd7f239 = function() { return handleError(function () {
var ret = global.global;
return addHeapObject(ret);
}, arguments) };
@@ -1327,50 +1451,50 @@ async function init(input) {
var ret = getObject(arg0) === undefined;
return ret;
};
- imports.wbg.__wbg_buffer_397eaa4d72ee94dd = function(arg0) {
+ imports.wbg.__wbg_buffer_5e74a88a1424a2e0 = function(arg0) {
var ret = getObject(arg0).buffer;
return addHeapObject(ret);
};
- imports.wbg.__wbg_new_99c38feff948285c = function(arg0) {
- var ret = new Int16Array(getObject(arg0));
+ imports.wbg.__wbg_newwithbyteoffsetandlength_8c0e6ae8071b27e7 = function(arg0, arg1, arg2) {
+ var ret = new Int8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_newwithbyteoffsetandlength_4b9b8c4e3f5adbff = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_newwithbyteoffsetandlength_fa38811f43e9099d = function(arg0, arg1, arg2) {
+ var ret = new Int16Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_newwithbyteoffsetandlength_a0b51a3de0017386 = function(arg0, arg1, arg2) {
+ var ret = new Int32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
+ return addHeapObject(ret);
+ };
+ imports.wbg.__wbg_newwithbyteoffsetandlength_278ec7532799393a = function(arg0, arg1, arg2) {
var ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_new_a7ce447f15ff496f = function(arg0) {
+ imports.wbg.__wbg_new_e3b800e570795b3c = function(arg0) {
var ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
};
- imports.wbg.__wbg_set_969ad0a60e51d320 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbg_set_5b8081e9d002f0df = function(arg0, arg1, arg2) {
getObject(arg0).set(getObject(arg1), arg2 >>> 0);
};
- imports.wbg.__wbg_length_1eb8fc608a0d4cdb = function(arg0) {
+ imports.wbg.__wbg_length_30803400a8f15c59 = function(arg0) {
var ret = getObject(arg0).length;
return ret;
};
- imports.wbg.__wbg_new_8b45a9becdb89691 = function(arg0) {
- var ret = new Float32Array(getObject(arg0));
+ imports.wbg.__wbg_newwithbyteoffsetandlength_bdb885cfc5e9bc43 = function(arg0, arg1, arg2) {
+ var ret = new Uint16Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_subarray_5208d7c1876d9ee7 = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
+ imports.wbg.__wbg_newwithbyteoffsetandlength_f6c2c5e40f6f5bda = function(arg0, arg1, arg2) {
+ var ret = new Uint32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_subarray_8b658422a224f479 = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
+ imports.wbg.__wbg_newwithbyteoffsetandlength_ad2916c6fa7d4c6f = function(arg0, arg1, arg2) {
+ var ret = new Float32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
- imports.wbg.__wbg_subarray_9e3273b330900f8c = function(arg0, arg1, arg2) {
- var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
- return addHeapObject(ret);
- };
- imports.wbg.__wbg_instanceof_Memory_625744f21df3a5ec = function(arg0) {
- var ret = getObject(arg0) instanceof WebAssembly.Memory;
- return ret;
- };
- imports.wbg.__wbg_set_82a4e8a85e31ac42 = function() { return handleError(function (arg0, arg1, arg2) {
+ imports.wbg.__wbg_set_c42875065132a932 = function() { return handleError(function (arg0, arg1, arg2) {
var ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2));
return ret;
}, arguments) };
@@ -1384,63 +1508,60 @@ async function init(input) {
imports.wbg.__wbindgen_throw = function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
};
- imports.wbg.__wbindgen_rethrow = function(arg0) {
- throw takeObject(arg0);
- };
imports.wbg.__wbindgen_memory = function() {
var ret = wasm.memory;
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1901 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_30);
+ imports.wbg.__wbindgen_closure_wrapper2336 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_28);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1902 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_33);
+ imports.wbg.__wbindgen_closure_wrapper2337 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_31);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1904 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_36);
+ imports.wbg.__wbindgen_closure_wrapper2339 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_34);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1906 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_39);
+ imports.wbg.__wbindgen_closure_wrapper2341 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_37);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1908 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_42);
+ imports.wbg.__wbindgen_closure_wrapper2343 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_40);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1911 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_45);
+ imports.wbg.__wbindgen_closure_wrapper2345 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_43);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1913 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_48);
+ imports.wbg.__wbindgen_closure_wrapper2348 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_46);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1915 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_51);
+ imports.wbg.__wbindgen_closure_wrapper2350 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_49);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1917 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_54);
+ imports.wbg.__wbindgen_closure_wrapper2352 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_52);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper1919 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 720, __wbg_adapter_57);
+ imports.wbg.__wbindgen_closure_wrapper2354 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 928, __wbg_adapter_55);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper2113 = function(arg0, arg1, arg2) {
- var ret = makeMutClosure(arg0, arg1, 823, __wbg_adapter_60);
+ imports.wbg.__wbindgen_closure_wrapper2467 = function(arg0, arg1, arg2) {
+ var ret = makeMutClosure(arg0, arg1, 978, __wbg_adapter_58);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper2179 = function(arg0, arg1, arg2) {
- var ret = makeClosure(arg0, arg1, 871, __wbg_adapter_63);
+ imports.wbg.__wbindgen_closure_wrapper2532 = function(arg0, arg1, arg2) {
+ var ret = makeClosure(arg0, arg1, 1026, __wbg_adapter_61);
return addHeapObject(ret);
};
- imports.wbg.__wbindgen_closure_wrapper2181 = function(arg0, arg1, arg2) {
- var ret = makeClosure(arg0, arg1, 871, __wbg_adapter_66);
+ imports.wbg.__wbindgen_closure_wrapper2534 = function(arg0, arg1, arg2) {
+ var ret = makeClosure(arg0, arg1, 1026, __wbg_adapter_64);
return addHeapObject(ret);
};
diff --git a/docs/egui_demo_app_bg.wasm b/docs/egui_demo_app_bg.wasm
index 0cfdb5f3..e3cbafed 100644
Binary files a/docs/egui_demo_app_bg.wasm and b/docs/egui_demo_app_bg.wasm differ
diff --git a/docs/index.html b/docs/index.html
index 6d3a5588..bf9dfb5f 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -128,20 +128,20 @@
.catch(on_wasm_error);
function on_wasm_loaded() {
- console.debug("wasm loaded. starting egui app…");
+ console.debug("wasm loaded. starting app…");
// This call installs a bunch of callbacks and then returns:
wasm_bindgen.start("the_canvas_id");
- console.debug("egui app started.");
+ console.debug("app started.");
document.getElementById("center_text").remove();
}
function on_wasm_error(error) {
- console.error("Failed to start egui: " + error);
+ console.error("Failed to start: " + error);
document.getElementById("center_text").innerHTML = `
- An error occurred loading egui
+ An error occurred during loading:
${error}
diff --git a/eframe/CHANGELOG.md b/eframe/CHANGELOG.md
index 5b64eafa..656dfea7 100644
--- a/eframe/CHANGELOG.md
+++ b/eframe/CHANGELOG.md
@@ -5,6 +5,9 @@ NOTE: [`egui_web`](../egui_web/CHANGELOG.md), [`egui-winit`](../egui-winit/CHANG
## Unreleased
+
+
+## 0.17.0 - 2022-02-22
* Removed `Frame::alloc_texture`. Use `egui::Context::load_texture` instead ([#1110](https://github.com/emilk/egui/pull/1110)).
* The default native backend is now `egui_glow` (instead of `egui_glium`) ([#1020](https://github.com/emilk/egui/pull/1020)).
* The default web painter is now `egui_glow` (instead of WebGL) ([#1020](https://github.com/emilk/egui/pull/1020)).
@@ -12,8 +15,10 @@ NOTE: [`egui_web`](../egui_web/CHANGELOG.md), [`egui-winit`](../egui-winit/CHANG
* Fix horizontal scrolling direction on Linux.
* Added `App::on_exit_event` ([#1038](https://github.com/emilk/egui/pull/1038))
* Added `NativeOptions::initial_window_pos`.
+* Fixed `enable_drag` for Windows OS ([#1108](https://github.com/emilk/egui/pull/1108)).
* Shift-scroll will now result in horizontal scrolling on all platforms ([#1136](https://github.com/emilk/egui/pull/1136)).
* Log using the `tracing` crate. Log to stdout by adding `tracing_subscriber::fmt::init();` to your `main` ([#1192](https://github.com/emilk/egui/pull/1192)).
+* Expose all parts of the location/url in `frame.info().web_info` ([#1258](https://github.com/emilk/egui/pull/1258)).
## 0.16.0 - 2021-12-29
diff --git a/eframe/Cargo.toml b/eframe/Cargo.toml
index a9ff85c3..d091b12e 100644
--- a/eframe/Cargo.toml
+++ b/eframe/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "eframe"
-version = "0.16.0"
+version = "0.17.0"
authors = ["Emil Ernerfeldt "]
description = "egui framework - write GUI apps that compiles to web and/or natively"
edition = "2021"
@@ -49,27 +49,24 @@ screen_reader = [
[dependencies]
-egui = { version = "0.16.0", path = "../egui", default-features = false }
-epi = { version = "0.16.0", path = "../epi" }
+egui = { version = "0.17.0", path = "../egui", default-features = false }
+epi = { version = "0.17.0", path = "../epi" }
# native:
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-egui-winit = { version = "0.16.0", path = "../egui-winit", default-features = false }
-egui_glium = { version = "0.16.0", path = "../egui_glium", default-features = false, features = ["clipboard", "epi", "links"], optional = true }
-egui_glow = { version = "0.16.0", path = "../egui_glow", default-features = false, features = ["clipboard", "epi", "links", "winit"], optional = true }
+egui-winit = { version = "0.17.0", path = "../egui-winit", default-features = false }
+egui_glium = { version = "0.17.0", path = "../egui_glium", default-features = false, features = ["clipboard", "epi", "links"], optional = true }
+egui_glow = { version = "0.17.0", path = "../egui_glow", default-features = false, features = ["clipboard", "epi", "links", "winit"], optional = true }
# web:
[target.'cfg(target_arch = "wasm32")'.dependencies]
-egui_web = { version = "0.16.0", path = "../egui_web", default-features = false, features = ["glow"] }
+egui_web = { version = "0.17.0", path = "../egui_web", default-features = false, features = ["glow"] }
[dev-dependencies]
+# For examples:
+egui_extras = { path = "../egui_extras", features = ["image", "svg"] }
ehttp = "0.2"
image = { version = "0.24", default-features = false, features = ["jpeg", "png"] }
poll-promise = "0.1"
-rfd = "0.7"
-
-# svg.rs example:
-resvg = "0.20"
-tiny-skia = "0.6"
-usvg = "0.20"
+rfd = "0.8"
diff --git a/eframe/examples/download_image.rs b/eframe/examples/download_image.rs
index e350ac56..dede08c4 100644
--- a/eframe/examples/download_image.rs
+++ b/eframe/examples/download_image.rs
@@ -1,6 +1,7 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
use eframe::{egui, epi};
+use egui_extras::RetainedImage;
use poll_promise::Promise;
fn main() {
@@ -11,7 +12,7 @@ fn main() {
#[derive(Default)]
struct MyApp {
/// `None` when download hasn't started yet.
- promise: Option>>,
+ promise: Option>>,
}
impl epi::App for MyApp {
@@ -24,14 +25,13 @@ impl epi::App for MyApp {
// Begin download.
// We download the image using `ehttp`, a library that works both in WASM and on native.
// We use the `poll-promise` library to communicate with the UI thread.
- let ctx = ctx.clone();
let frame = frame.clone();
let (sender, promise) = Promise::new();
let request = ehttp::Request::get("https://picsum.photos/seed/1.759706314/1024");
ehttp::fetch(request, move |response| {
+ let image = response.and_then(parse_response);
+ sender.send(image); // send the results back to the UI thread.
frame.request_repaint(); // wake up UI thread
- let texture = response.and_then(|response| parse_response(&ctx, response));
- sender.send(texture); // send the results back to the UI thread.
});
promise
});
@@ -43,24 +43,17 @@ impl epi::App for MyApp {
Some(Err(err)) => {
ui.colored_label(egui::Color32::RED, err); // something went wrong
}
- Some(Ok(texture)) => {
- let mut size = texture.size_vec2();
- size *= (ui.available_width() / size.x).min(1.0);
- size *= (ui.available_height() / size.y).min(1.0);
- ui.image(texture, size);
+ Some(Ok(image)) => {
+ image.show_max_size(ui, ui.available_size());
}
});
}
}
-fn parse_response(
- ctx: &egui::Context,
- response: ehttp::Response,
-) -> Result {
+fn parse_response(response: ehttp::Response) -> Result {
let content_type = response.content_type().unwrap_or_default();
if content_type.starts_with("image/") {
- let image = load_image(&response.bytes).map_err(|err| err.to_string())?;
- Ok(ctx.load_texture("my-image", image))
+ RetainedImage::from_image_bytes(&response.url, &response.bytes)
} else {
Err(format!(
"Expected image, found content-type {:?}",
@@ -68,14 +61,3 @@ fn parse_response(
))
}
}
-
-fn load_image(image_data: &[u8]) -> Result {
- let image = image::load_from_memory(image_data)?;
- let size = [image.width() as _, image.height() as _];
- let image_buffer = image.to_rgba8();
- let pixels = image_buffer.as_flat_samples();
- Ok(egui::ColorImage::from_rgba_unmultiplied(
- size,
- pixels.as_slice(),
- ))
-}
diff --git a/eframe/examples/hello_world.rs b/eframe/examples/hello_world.rs
index 7ec61fba..77f1479b 100644
--- a/eframe/examples/hello_world.rs
+++ b/eframe/examples/hello_world.rs
@@ -22,19 +22,17 @@ impl epi::App for MyApp {
}
fn update(&mut self, ctx: &egui::Context, frame: &epi::Frame) {
- let Self { name, age } = self;
-
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("My egui Application");
ui.horizontal(|ui| {
ui.label("Your name: ");
- ui.text_edit_singleline(name);
+ ui.text_edit_singleline(&mut self.name);
});
- ui.add(egui::Slider::new(age, 0..=120).text("age"));
+ ui.add(egui::Slider::new(&mut self.age, 0..=120).text("age"));
if ui.button("Click each year").clicked() {
- *age += 1;
+ self.age += 1;
}
- ui.label(format!("Hello '{}', age {}", name, age));
+ ui.label(format!("Hello '{}', age {}", self.name, self.age));
});
// Resize the native window to be just the size we need it to be:
diff --git a/eframe/examples/image.rs b/eframe/examples/image.rs
index a47e6c5b..97575c23 100644
--- a/eframe/examples/image.rs
+++ b/eframe/examples/image.rs
@@ -1,10 +1,22 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
use eframe::{egui, epi};
+use egui_extras::RetainedImage;
-#[derive(Default)]
struct MyApp {
- texture: Option,
+ image: RetainedImage,
+}
+
+impl Default for MyApp {
+ fn default() -> Self {
+ Self {
+ image: RetainedImage::from_image_bytes(
+ "rust-logo-256x256.png",
+ include_bytes!("rust-logo-256x256.png"),
+ )
+ .unwrap(),
+ }
+ }
}
impl epi::App for MyApp {
@@ -13,17 +25,15 @@ impl epi::App for MyApp {
}
fn update(&mut self, ctx: &egui::Context, _frame: &epi::Frame) {
- let texture: &egui::TextureHandle = self.texture.get_or_insert_with(|| {
- let image = load_image(include_bytes!("rust-logo-256x256.png")).unwrap();
- ctx.load_texture("rust-logo", image)
- });
-
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("This is an image:");
- ui.image(texture, texture.size_vec2());
+ self.image.show(ui);
ui.heading("This is an image you can click:");
- ui.add(egui::ImageButton::new(texture, texture.size_vec2()));
+ ui.add(egui::ImageButton::new(
+ self.image.texture_id(ctx),
+ self.image.size_vec2(),
+ ));
});
}
}
@@ -32,14 +42,3 @@ fn main() {
let options = eframe::NativeOptions::default();
eframe::run_native(Box::new(MyApp::default()), options);
}
-
-fn load_image(image_data: &[u8]) -> Result {
- let image = image::load_from_memory(image_data)?;
- let size = [image.width() as _, image.height() as _];
- let image_buffer = image.to_rgba8();
- let pixels = image_buffer.as_flat_samples();
- Ok(egui::ColorImage::from_rgba_unmultiplied(
- size,
- pixels.as_slice(),
- ))
-}
diff --git a/eframe/examples/svg.rs b/eframe/examples/svg.rs
index e4aff0cf..b7d362f9 100644
--- a/eframe/examples/svg.rs
+++ b/eframe/examples/svg.rs
@@ -1,82 +1,23 @@
//! A good way of displaying an SVG image in egui.
//!
-//! Requires the dependencies `resvg`, `tiny-skia`, `usvg`
+//! Requires the dependency `egui_extras` with the `svg` feature.
+
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
+
use eframe::{egui, epi};
-/// Load an SVG and rasterize it into an egui image.
-fn load_svg_data(svg_data: &[u8]) -> Result {
- let mut opt = usvg::Options::default();
- opt.fontdb.load_system_fonts();
-
- let rtree = usvg::Tree::from_data(svg_data, &opt.to_ref()).map_err(|err| err.to_string())?;
-
- let pixmap_size = rtree.svg_node().size.to_screen_size();
- let [w, h] = [pixmap_size.width(), pixmap_size.height()];
-
- let mut pixmap = tiny_skia::Pixmap::new(w, h)
- .ok_or_else(|| format!("Failed to create SVG Pixmap of size {}x{}", w, h))?;
-
- resvg::render(
- &rtree,
- usvg::FitTo::Original,
- tiny_skia::Transform::default(),
- pixmap.as_mut(),
- )
- .ok_or_else(|| "Failed to render SVG".to_owned())?;
-
- let image = egui::ColorImage::from_rgba_unmultiplied(
- [pixmap.width() as _, pixmap.height() as _],
- pixmap.data(),
- );
-
- Ok(image)
-}
-
-// ----------------------------------------------------------------------------
-
-/// An SVG image to be shown in egui
-struct SvgImage {
- image: egui::ColorImage,
- texture: Option,
-}
-
-impl SvgImage {
- /// Pass itn the bytes of an SVG that you've loaded from disk
- pub fn from_svg_data(bytes: &[u8]) -> Result {
- Ok(Self {
- image: load_svg_data(bytes)?,
- texture: None,
- })
- }
-
- pub fn show_max_size(&mut self, ui: &mut egui::Ui, max_size: egui::Vec2) -> egui::Response {
- let mut desired_size = egui::vec2(self.image.width() as _, self.image.height() as _);
- desired_size *= (max_size.x / desired_size.x).min(1.0);
- desired_size *= (max_size.y / desired_size.y).min(1.0);
- self.show_size(ui, desired_size)
- }
-
- pub fn show_size(&mut self, ui: &mut egui::Ui, desired_size: egui::Vec2) -> egui::Response {
- // We need to convert the SVG to a texture to display it:
- // Future improvement: tell backend to do mip-mapping of the image to
- // make it look smoother when downsized.
- let svg_texture = self
- .texture
- .get_or_insert_with(|| ui.ctx().load_texture("svg", self.image.clone()));
- ui.image(svg_texture, desired_size)
- }
-}
-
-// ----------------------------------------------------------------------------
-
struct MyApp {
- svg_image: SvgImage,
+ svg_image: egui_extras::RetainedImage,
}
impl Default for MyApp {
fn default() -> Self {
Self {
- svg_image: SvgImage::from_svg_data(include_bytes!("rustacean-flat-happy.svg")).unwrap(),
+ svg_image: egui_extras::RetainedImage::from_svg_bytes(
+ "rustacean-flat-happy.svg",
+ include_bytes!("rustacean-flat-happy.svg"),
+ )
+ .unwrap(),
}
}
}
diff --git a/egui-winit/CHANGELOG.md b/egui-winit/CHANGELOG.md
index 80de1eaa..ccc2a29b 100644
--- a/egui-winit/CHANGELOG.md
+++ b/egui-winit/CHANGELOG.md
@@ -1,15 +1,17 @@
# Changelog for egui-winit
-
All notable changes to the `egui-winit` integration will be noted in this file.
## Unreleased
+
+
+## 0.17.0 - 2022-02-22
* Fixed horizontal scrolling direction on Linux.
-* Automatically detect and apply dark or light mode from system ([#1045](https://github.com/emilk/egui/pull/1045)).
* Replaced `std::time::Instant` with `instant::Instant` for WebAssembly compatability ([#1023](https://github.com/emilk/egui/pull/1023))
+* Automatically detect and apply dark or light mode from system ([#1045](https://github.com/emilk/egui/pull/1045)).
+* Fixed `enable_drag` on Windows OS ([#1108](https://github.com/emilk/egui/pull/1108)).
* Shift-scroll will now result in horizontal scrolling on all platforms ([#1136](https://github.com/emilk/egui/pull/1136)).
* Require knowledge about max texture side (e.g. `GL_MAX_TEXTURE_SIZE`)) ([#1154](https://github.com/emilk/egui/pull/1154)).
-* Fixed `enable_drag` for Windows. Now called only once just after left click ([#1108](https://github.com/emilk/egui/pull/1108)).
## 0.16.0 - 2021-12-29
diff --git a/egui-winit/Cargo.toml b/egui-winit/Cargo.toml
index bbb0fbfa..5410871b 100644
--- a/egui-winit/Cargo.toml
+++ b/egui-winit/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "egui-winit"
-version = "0.16.0"
+version = "0.17.0"
authors = ["Emil Ernerfeldt "]
description = "Bindings for using egui with winit"
edition = "2021"
@@ -43,17 +43,17 @@ convert_bytemuck = ["egui/convert_bytemuck"]
[dependencies]
-egui = { version = "0.16.0", path = "../egui", default-features = false, features = ["single_threaded", "tracing"] }
+egui = { version = "0.17.0", path = "../egui", default-features = false, features = ["single_threaded", "tracing"] }
instant = { version = "0.1", features = ["wasm-bindgen"] }
tracing = "0.1"
winit = "0.26.1"
-epi = { version = "0.16.0", path = "../epi", optional = true }
+epi = { version = "0.17.0", path = "../epi", optional = true }
copypasta = { version = "0.7", optional = true }
dark-light = { version = "0.2.1", optional = true } # detect dark mode system preference
serde = { version = "1.0", optional = true, features = ["derive"] }
-webbrowser = { version = "0.5", optional = true }
+webbrowser = { version = "0.6", optional = true }
# feature screen_reader
tts = { version = "0.20", optional = true }
diff --git a/egui-winit/src/epi.rs b/egui-winit/src/epi.rs
index 70d13d32..fd671131 100644
--- a/egui-winit/src/epi.rs
+++ b/egui-winit/src/epi.rs
@@ -1,7 +1,4 @@
-use egui::Vec2;
-use winit::dpi::LogicalSize;
-
-pub fn points_to_size(points: Vec2) -> LogicalSize {
+pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize {
winit::dpi::LogicalSize {
width: points.x as f64,
height: points.y as f64,
@@ -222,6 +219,7 @@ pub struct EpiIntegration {
frame: epi::Frame,
persistence: crate::epi::Persistence,
pub egui_ctx: egui::Context,
+ pending_full_output: egui::FullOutput,
egui_winit: crate::State,
pub app: Box,
/// When set, it is time to quit
@@ -267,6 +265,7 @@ impl EpiIntegration {
persistence,
egui_ctx,
egui_winit: crate::State::new(max_texture_side, window),
+ pending_full_output: Default::default(),
app,
quit: false,
can_drag_window: false,
@@ -295,8 +294,8 @@ impl EpiIntegration {
fn warm_up(&mut self, window: &winit::window::Window) {
let saved_memory: egui::Memory = self.egui_ctx.memory().clone();
self.egui_ctx.memory().set_everything_is_visible(true);
- let (_, textures_delta, _) = self.update(window);
- self.egui_ctx.output().textures_delta = textures_delta; // Handle it next frame
+ let full_output = self.update(window);
+ self.pending_full_output.append(full_output); // Handle it next frame
*self.egui_ctx.memory() = saved_memory; // We don't want to remember that windows were huge.
self.egui_ctx.clear_animations();
}
@@ -323,37 +322,39 @@ impl EpiIntegration {
self.egui_winit.on_event(&self.egui_ctx, event);
}
- /// Returns `needs_repaint` and shapes to paint.
- pub fn update(
- &mut self,
- window: &winit::window::Window,
- ) -> (bool, egui::TexturesDelta, Vec) {
+ pub fn update(&mut self, window: &winit::window::Window) -> egui::FullOutput {
let frame_start = instant::Instant::now();
let raw_input = self.egui_winit.take_egui_input(window);
- let (egui_output, shapes) = self.egui_ctx.run(raw_input, |egui_ctx| {
+ let full_output = self.egui_ctx.run(raw_input, |egui_ctx| {
self.app.update(egui_ctx, &self.frame);
});
+ self.pending_full_output.append(full_output);
+ let full_output = std::mem::take(&mut self.pending_full_output);
- let needs_repaint = egui_output.needs_repaint;
- let textures_delta = self
- .egui_winit
- .handle_output(window, &self.egui_ctx, egui_output);
-
- let mut app_output = self.frame.take_app_output();
- app_output.drag_window &= self.can_drag_window; // Necessary on Windows; see https://github.com/emilk/egui/pull/1108
- self.can_drag_window = false;
-
- if app_output.quit {
- self.quit = self.app.on_exit_event();
+ {
+ let mut app_output = self.frame.take_app_output();
+ app_output.drag_window &= self.can_drag_window; // Necessary on Windows; see https://github.com/emilk/egui/pull/1108
+ self.can_drag_window = false;
+ if app_output.quit {
+ self.quit = self.app.on_exit_event();
+ }
+ crate::epi::handle_app_output(window, self.egui_ctx.pixels_per_point(), app_output);
}
- crate::epi::handle_app_output(window, self.egui_ctx.pixels_per_point(), app_output);
-
let frame_time = (instant::Instant::now() - frame_start).as_secs_f64() as f32;
self.frame.lock().info.cpu_usage = Some(frame_time);
- (needs_repaint, textures_delta, shapes)
+ full_output
+ }
+
+ pub fn handle_platform_output(
+ &mut self,
+ window: &winit::window::Window,
+ platform_output: egui::PlatformOutput,
+ ) {
+ self.egui_winit
+ .handle_platform_output(window, &self.egui_ctx, platform_output);
}
pub fn maybe_autosave(&mut self, window: &winit::window::Window) {
diff --git a/egui-winit/src/lib.rs b/egui-winit/src/lib.rs
index 6e19f435..a4a36220 100644
--- a/egui-winit/src/lib.rs
+++ b/egui-winit/src/lib.rs
@@ -144,7 +144,7 @@ impl State {
start_time: instant::Instant::now(),
egui_input: egui::RawInput {
pixels_per_point: Some(pixels_per_point),
- max_texture_side,
+ max_texture_side: Some(max_texture_side),
..Default::default()
},
pointer_pos_in_points: None,
@@ -514,26 +514,25 @@ impl State {
/// * open any clicked urls
/// * update the IME
/// *
- pub fn handle_output(
+ pub fn handle_platform_output(
&mut self,
window: &winit::window::Window,
egui_ctx: &egui::Context,
- output: egui::Output,
- ) -> egui::TexturesDelta {
+ platform_output: egui::PlatformOutput,
+ ) {
if egui_ctx.options().screen_reader {
- self.screen_reader.speak(&output.events_description());
+ self.screen_reader
+ .speak(&platform_output.events_description());
}
- let egui::Output {
+ let egui::PlatformOutput {
cursor_icon,
open_url,
copied_text,
- needs_repaint: _, // needs to be handled elsewhere
events: _, // handled above
mutable_text_under_cursor: _, // only used in egui_web
text_cursor_pos,
- textures_delta,
- } = output;
+ } = platform_output;
self.current_pixels_per_point = egui_ctx.pixels_per_point(); // someone can have changed it to scale the UI
@@ -550,8 +549,6 @@ impl State {
if let Some(egui::Pos2 { x, y }) = text_cursor_pos {
window.set_ime_position(winit::dpi::LogicalPosition { x, y });
}
-
- textures_delta
}
fn set_cursor_icon(&mut self, window: &winit::window::Window, cursor_icon: egui::CursorIcon) {
diff --git a/egui/Cargo.toml b/egui/Cargo.toml
index 67591cf2..55e34912 100644
--- a/egui/Cargo.toml
+++ b/egui/Cargo.toml
@@ -1,8 +1,8 @@
[package]
name = "egui"
-version = "0.16.1"
+version = "0.17.0"
authors = ["Emil Ernerfeldt "]
-description = "Simple, portable immediate mode GUI library for Rust"
+description = "An easy-to-use immediate mode GUI that runs on both web and native"
edition = "2021"
rust-version = "1.56"
homepage = "https://github.com/emilk/egui"
@@ -58,7 +58,7 @@ multi_threaded = ["epaint/multi_threaded"]
[dependencies]
-epaint = { version = "0.16.0", path = "../epaint", default-features = false }
+epaint = { version = "0.17.0", path = "../epaint", default-features = false }
ahash = "0.7"
nohash-hasher = "0.2"
diff --git a/egui/src/containers/area.rs b/egui/src/containers/area.rs
index 9ff25d5f..6501a1d7 100644
--- a/egui/src/containers/area.rs
+++ b/egui/src/containers/area.rs
@@ -204,7 +204,7 @@ impl Area {
let state = ctx.memory().areas.get(id).cloned();
let is_new = state.is_none();
if is_new {
- ctx.request_repaint(); // if we don't know the previous size we are likely drawing the area in the wrong place}
+ ctx.request_repaint(); // if we don't know the previous size we are likely drawing the area in the wrong place
}
let mut state = state.unwrap_or_else(|| State {
pos: default_pos.unwrap_or_else(|| automatic_area_position(ctx)),
@@ -212,6 +212,7 @@ impl Area {
interactable,
});
state.pos = new_pos.unwrap_or(state.pos);
+ state.interactable = interactable;
if let Some((anchor, offset)) = anchor {
if is_new {
diff --git a/egui/src/containers/frame.rs b/egui/src/containers/frame.rs
index 044b96a9..9e7cd949 100644
--- a/egui/src/containers/frame.rs
+++ b/egui/src/containers/frame.rs
@@ -1,51 +1,8 @@
//! Frame container
-use crate::{layers::ShapeIdx, *};
+use crate::{layers::ShapeIdx, style::Margin, *};
use epaint::*;
-#[derive(Clone, Copy, Debug, Default, PartialEq)]
-#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
-pub struct Margin {
- pub left: f32,
- pub right: f32,
- pub top: f32,
- pub bottom: f32,
-}
-
-impl Margin {
- #[inline]
- pub fn same(margin: f32) -> Self {
- Self {
- left: margin,
- right: margin,
- top: margin,
- bottom: margin,
- }
- }
-
- /// Margins with the same size on opposing sides
- #[inline]
- pub fn symmetric(x: f32, y: f32) -> Self {
- Self {
- left: x,
- right: x,
- top: y,
- bottom: y,
- }
- }
-
- /// Total margins on both sides
- pub fn sum(&self) -> Vec2 {
- Vec2::new(self.left + self.right, self.top + self.bottom)
- }
-}
-
-impl From for Margin {
- fn from(v: Vec2) -> Self {
- Self::symmetric(v.x, v.y)
- }
-}
-
/// Color and margin of a rectangular background of a [`Ui`].
#[derive(Clone, Copy, Debug, Default, PartialEq)]
#[must_use = "You should call .show()"]
diff --git a/egui/src/containers/mod.rs b/egui/src/containers/mod.rs
index cc457a51..f151b8e9 100644
--- a/egui/src/containers/mod.rs
+++ b/egui/src/containers/mod.rs
@@ -16,7 +16,7 @@ pub use {
area::Area,
collapsing_header::{CollapsingHeader, CollapsingResponse},
combo_box::*,
- frame::{Frame, Margin},
+ frame::Frame,
panel::{CentralPanel, SidePanel, TopBottomPanel},
popup::*,
resize::Resize,
diff --git a/egui/src/containers/panel.rs b/egui/src/containers/panel.rs
index 9fc6aae8..ea17aa17 100644
--- a/egui/src/containers/panel.rs
+++ b/egui/src/containers/panel.rs
@@ -9,6 +9,8 @@
//! The order in which you add panels matter!
//! The first panel you add will always be the outermost, and the last you add will always be the innermost.
//!
+//! You must never open one top-level panel from within another panel. Add one panel, then the next.
+//!
//! Always add any [`CentralPanel`] last.
//!
//! Add your [`Window`]:s after any top-level panels.
diff --git a/egui/src/containers/scroll_area.rs b/egui/src/containers/scroll_area.rs
index d5c9e712..3d9254ae 100644
--- a/egui/src/containers/scroll_area.rs
+++ b/egui/src/containers/scroll_area.rs
@@ -81,6 +81,7 @@ pub struct ScrollArea {
has_bar: [bool; 2],
auto_shrink: [bool; 2],
max_size: Vec2,
+ min_scrolled_size: Vec2,
always_show_scroll: bool,
id_source: Option,
offset_x: Option,
@@ -123,6 +124,7 @@ impl ScrollArea {
has_bar,
auto_shrink: [true; 2],
max_size: Vec2::INFINITY,
+ min_scrolled_size: Vec2::splat(64.0),
always_show_scroll: false,
id_source: None,
offset_x: None,
@@ -152,6 +154,28 @@ impl ScrollArea {
self
}
+ /// The minimum width of a horizontal scroll area which requires scroll bars.
+ ///
+ /// The `ScrollArea` will only become smaller than this if the content is smaller than this
+ /// (and so we don't require scroll bars).
+ ///
+ /// Default: `64.0`.
+ pub fn min_scrolled_width(mut self, min_scrolled_width: f32) -> Self {
+ self.min_scrolled_size.x = min_scrolled_width;
+ self
+ }
+
+ /// The minimum height of a vertical scroll area which requires scroll bars.
+ ///
+ /// The `ScrollArea` will only become smaller than this if the content is smaller than this
+ /// (and so we don't require scroll bars).
+ ///
+ /// Default: `64.0`.
+ pub fn min_scrolled_height(mut self, min_scrolled_height: f32) -> Self {
+ self.min_scrolled_size.y = min_scrolled_height;
+ self
+ }
+
/// If `false` (default), the scroll bar will be hidden when not needed/
/// If `true`, the scroll bar will always be displayed even if not needed.
pub fn always_show_scroll(mut self, always_show_scroll: bool) -> Self {
@@ -288,6 +312,7 @@ impl ScrollArea {
has_bar,
auto_shrink,
max_size,
+ min_scrolled_size,
always_show_scroll,
id_source,
offset_x,
@@ -329,27 +354,39 @@ impl ScrollArea {
let outer_size = available_outer.size().at_most(max_size);
- let inner_size = outer_size - current_bar_use;
+ let inner_size = {
+ let mut inner_size = outer_size - current_bar_use;
+
+ // Don't go so far that we shrink to zero.
+ // In particular, if we put a `ScrollArea` inside of a `ScrollArea`, the inner
+ // one shouldn't collapse into nothingness.
+ // See https://github.com/emilk/egui/issues/1097
+ for d in 0..2 {
+ if has_bar[d] {
+ inner_size[d] = inner_size[d].max(min_scrolled_size[d]);
+ }
+ }
+ inner_size
+ };
+
let inner_rect = Rect::from_min_size(available_outer.min, inner_size);
- let mut inner_child_max_size = inner_size;
+ let mut content_max_size = inner_size;
if true {
// Tell the inner Ui to *try* to fit the content without needing to scroll,
- // i.e. better to wrap text than showing a horizontal scrollbar!
+ // i.e. better to wrap text and shrink images than showing a horizontal scrollbar!
} else {
// Tell the inner Ui to use as much space as possible, we can scroll to see it!
for d in 0..2 {
if has_bar[d] {
- inner_child_max_size[d] = f32::INFINITY;
+ content_max_size[d] = f32::INFINITY;
}
}
}
- let mut content_ui = ui.child_ui(
- Rect::from_min_size(inner_rect.min - state.offset, inner_child_max_size),
- *ui.layout(),
- );
+ let content_max_rect = Rect::from_min_size(inner_rect.min - state.offset, content_max_size);
+ let mut content_ui = ui.child_ui(content_max_rect, *ui.layout());
let mut content_clip_rect = inner_rect.expand(ui.visuals().clip_rect_margin);
content_clip_rect = content_clip_rect.intersect(ui.clip_rect());
// Nice handling of forced resizing beyond the possible:
@@ -489,18 +526,38 @@ impl Prepared {
// We take the scroll target so only this ScrollArea will use it:
let scroll_target = content_ui.ctx().frame_state().scroll_target[d].take();
if let Some((scroll, align)) = scroll_target {
- let center_factor = align.to_factor();
-
let min = content_ui.min_rect().min[d];
- let visible_range = min..=min + content_ui.clip_rect().size()[d];
- let offset = scroll - lerp(visible_range, center_factor);
-
+ let clip_rect = content_ui.clip_rect();
+ let visible_range = min..=min + clip_rect.size()[d];
+ let start = *scroll.start();
+ let end = *scroll.end();
+ let clip_start = clip_rect.min[d];
+ let clip_end = clip_rect.max[d];
let mut spacing = ui.spacing().item_spacing[d];
- // Depending on the alignment we need to add or subtract the spacing
- spacing *= remap(center_factor, 0.0..=1.0, -1.0..=1.0);
+ let delta = if let Some(align) = align {
+ let center_factor = align.to_factor();
- state.offset[d] = offset + spacing;
+ let offset =
+ lerp(scroll, center_factor) - lerp(visible_range, center_factor);
+
+ // Depending on the alignment we need to add or subtract the spacing
+ spacing *= remap(center_factor, 0.0..=1.0, -1.0..=1.0);
+
+ offset + spacing - state.offset[d]
+ } else if start < clip_start && end < clip_end {
+ -(clip_start - start + spacing).min(clip_end - end - spacing)
+ } else if end > clip_end && start > clip_start {
+ (end - clip_end + spacing).min(start - clip_start - spacing)
+ } else {
+ // Ui is already in view, no need to adjust scroll.
+ 0.0
+ };
+
+ if delta != 0.0 {
+ state.offset[d] += delta;
+ ui.ctx().request_repaint();
+ }
}
}
}
diff --git a/egui/src/context.rs b/egui/src/context.rs
index 3695b91c..c0c261fc 100644
--- a/egui/src/context.rs
+++ b/egui/src/context.rs
@@ -1,8 +1,8 @@
// #![warn(missing_docs)]
use crate::{
- animation_manager::AnimationManager, data::output::Output, frame_state::FrameState,
- input_state::*, layers::GraphicLayers, memory::Options, TextureHandle, *,
+ animation_manager::AnimationManager, data::output::PlatformOutput, frame_state::FrameState,
+ input_state::*, layers::GraphicLayers, memory::Options, output::FullOutput, TextureHandle, *,
};
use epaint::{mutex::*, stats::*, text::Fonts, TessellationOptions, *};
@@ -42,7 +42,7 @@ struct ContextImpl {
// The output of a frame:
graphics: GraphicLayers,
- output: Output,
+ output: PlatformOutput,
paint_stats: PaintStats,
@@ -79,7 +79,7 @@ impl ContextImpl {
/// Load fonts unless already loaded.
fn update_fonts_mut(&mut self) {
let pixels_per_point = self.input.pixels_per_point();
- let max_texture_side = self.input.raw.max_texture_side;
+ let max_texture_side = self.input.max_texture_side;
if let Some(font_definitions) = self.memory.new_font_definitions.take() {
let fonts = Fonts::new(pixels_per_point, max_texture_side, font_definitions);
@@ -108,7 +108,7 @@ impl ContextImpl {
/// Your handle to egui.
///
/// This is the first thing you need when working with egui.
-/// Contains the [`InputState`], [`Memory`], [`Output`], and more.
+/// Contains the [`InputState`], [`Memory`], [`PlatformOutput`], and more.
///
/// [`Context`] is cheap to clone, and any clones refers to the same mutable data
/// ([`Context`] uses refcounting internally).
@@ -121,14 +121,14 @@ impl ContextImpl {
/// # Example:
///
/// ``` no_run
-/// # fn handle_output(_: egui::Output) {}
-/// # fn paint(_: Vec) {}
+/// # fn handle_platform_output(_: egui::PlatformOutput) {}
+/// # fn paint(textures_detla: egui::TexturesDelta, _: Vec) {}
/// let mut ctx = egui::Context::default();
///
/// // Game loop:
/// loop {
/// let raw_input = egui::RawInput::default();
-/// let (output, shapes) = ctx.run(raw_input, |ctx| {
+/// let full_output = ctx.run(raw_input, |ctx| {
/// egui::CentralPanel::default().show(&ctx, |ui| {
/// ui.label("Hello world!");
/// if ui.button("Click me").clicked() {
@@ -136,9 +136,9 @@ impl ContextImpl {
/// }
/// });
/// });
-/// let clipped_meshes = ctx.tessellate(shapes); // create triangles to paint
-/// handle_output(output);
-/// paint(clipped_meshes);
+/// handle_platform_output(full_output.platform_output);
+/// let clipped_meshes = ctx.tessellate(full_output.shapes); // create triangles to paint
+/// paint(full_output.textures_delta, clipped_meshes);
/// }
/// ```
#[derive(Clone)]
@@ -185,19 +185,15 @@ impl Context {
///
/// // Each frame:
/// let input = egui::RawInput::default();
- /// let (output, shapes) = ctx.run(input, |ctx| {
+ /// let full_output = ctx.run(input, |ctx| {
/// egui::CentralPanel::default().show(&ctx, |ui| {
/// ui.label("Hello egui!");
/// });
/// });
- /// // handle output, paint shapes
+ /// // handle full_output
/// ```
#[must_use]
- pub fn run(
- &self,
- new_input: RawInput,
- run_ui: impl FnOnce(&Context),
- ) -> (Output, Vec) {
+ pub fn run(&self, new_input: RawInput, run_ui: impl FnOnce(&Context)) -> FullOutput {
self.begin_frame(new_input);
run_ui(self);
self.end_frame()
@@ -217,8 +213,8 @@ impl Context {
/// ui.label("Hello egui!");
/// });
///
- /// let (output, shapes) = ctx.end_frame();
- /// // handle output, paint shapes
+ /// let full_output = ctx.end_frame();
+ /// // handle full_output
/// ```
pub fn begin_frame(&self, new_input: RawInput) {
self.write().begin_frame_mut(new_input);
@@ -463,8 +459,13 @@ impl Context {
}
/// What egui outputs each frame.
+ ///
+ /// ```
+ /// # let mut ctx = egui::Context::default();
+ /// ctx.output().cursor_icon = egui::CursorIcon::Progress;
+ /// ```
#[inline]
- pub fn output(&self) -> RwLockWriteGuard<'_, Output> {
+ pub fn output(&self) -> RwLockWriteGuard<'_, PlatformOutput> {
RwLockWriteGuard::map(self.write(), |c| &mut c.output)
}
@@ -719,14 +720,13 @@ impl Context {
impl Context {
/// Call at the end of each frame.
- /// Returns what has happened this frame [`crate::Output`] as well as what you need to paint.
- /// You can transform the returned shapes into triangles with a call to [`Context::tessellate`].
#[must_use]
- pub fn end_frame(&self) -> (Output, Vec) {
+ pub fn end_frame(&self) -> FullOutput {
if self.input().wants_repaint() {
self.request_repaint();
}
+ let textures_delta;
{
let ctx_impl = &mut *self.write();
ctx_impl
@@ -742,20 +742,26 @@ impl Context {
.set(TextureId::default(), font_image_delta);
}
- ctx_impl
- .output
- .textures_delta
- .append(ctx_impl.tex_manager.0.write().take_delta());
- }
+ textures_delta = ctx_impl.tex_manager.0.write().take_delta();
+ };
- let mut output: Output = std::mem::take(&mut self.output());
- if self.read().repaint_requests > 0 {
+ let platform_output: PlatformOutput = std::mem::take(&mut self.output());
+
+ let needs_repaint = if self.read().repaint_requests > 0 {
self.write().repaint_requests -= 1;
- output.needs_repaint = true;
- }
+ true
+ } else {
+ false
+ };
let shapes = self.drain_paint_lists();
- (output, shapes)
+
+ FullOutput {
+ platform_output,
+ needs_repaint,
+ textures_delta,
+ shapes,
+ }
}
fn drain_paint_lists(&self) -> Vec {
@@ -889,6 +895,17 @@ impl Context {
self.memory().layer_id_at(pos, resize_grab_radius_side)
}
+ /// The overall top-most layer. When an area is clicked on or interacted
+ /// with, it is moved above all other areas.
+ pub fn top_most_layer(&self) -> Option {
+ self.memory().top_most_layer()
+ }
+
+ /// Moves the given area to the top.
+ pub fn move_to_top(&self, layer_id: LayerId) {
+ self.memory().areas.move_to_top(layer_id);
+ }
+
pub(crate) fn rect_contains_pointer(&self, layer_id: LayerId, rect: Rect) -> bool {
let pointer_pos = self.input().pointer.interact_pos();
if let Some(pointer_pos) = pointer_pos {
diff --git a/egui/src/data/input.rs b/egui/src/data/input.rs
index 21234b65..832a1ee6 100644
--- a/egui/src/data/input.rs
+++ b/egui/src/data/input.rs
@@ -33,7 +33,7 @@ pub struct RawInput {
/// Ask your graphics drivers about this. This corresponds to `GL_MAX_TEXTURE_SIZE`.
///
/// The default is a very small (but very portable) 2048.
- pub max_texture_side: usize,
+ pub max_texture_side: Option,
/// Monotonically increasing time, in seconds. Relative to whatever. Used for animations.
/// If `None` is provided, egui will assume a time delta of `predicted_dt` (default 1/60 seconds).
@@ -69,7 +69,7 @@ impl Default for RawInput {
Self {
screen_rect: None,
pixels_per_point: None,
- max_texture_side: 2048,
+ max_texture_side: None,
time: None,
predicted_dt: 1.0 / 60.0,
modifiers: Modifiers::default(),
@@ -89,7 +89,7 @@ impl RawInput {
RawInput {
screen_rect: self.screen_rect.take(),
pixels_per_point: self.pixels_per_point.take(),
- max_texture_side: self.max_texture_side,
+ max_texture_side: self.max_texture_side.take(),
time: self.time.take(),
predicted_dt: self.predicted_dt,
modifiers: self.modifiers,
@@ -115,7 +115,7 @@ impl RawInput {
self.screen_rect = screen_rect.or(self.screen_rect);
self.pixels_per_point = pixels_per_point.or(self.pixels_per_point);
- self.max_texture_side = max_texture_side; // use latest
+ self.max_texture_side = max_texture_side.or(self.max_texture_side);
self.time = time; // use latest time
self.predicted_dt = predicted_dt; // use latest dt
self.modifiers = modifiers; // use latest
@@ -165,18 +165,27 @@ pub enum Event {
///
/// When the user presses enter/return, do not send a `Text` (just [`Key::Enter`]).
Text(String),
+ /// A key was pressed or released.
Key {
key: Key,
+ /// Was it pressed or released?
pressed: bool,
+ /// The state of the modifier keys at the time of the event.
modifiers: Modifiers,
},
+ /// The mouse or touch moved to a new place.
PointerMoved(Pos2),
+
+ /// A mouse button was pressed or released (or a touch started or stopped).
PointerButton {
+ /// Where is the pointer?
pos: Pos2,
+ /// What mouse button? For touches, use [`PointerButton::Primary`].
button: PointerButton,
+ /// Was it the button/touch pressed this frame, or released?
pressed: bool,
- /// The state of the modifier keys at the time of the event
+ /// The state of the modifier keys at the time of the event.
modifiers: Modifiers,
},
/// The mouse left the screen, or the last/primary touch input disappeared.
@@ -217,6 +226,7 @@ pub enum Event {
/// Unique identifier of a finger/pen. Value is stable from touch down
/// to lift-up
id: TouchId,
+ /// One of: start move end cancel.
phase: TouchPhase,
/// Position of the touch (or where the touch was last detected)
pos: Pos2,
@@ -244,18 +254,24 @@ pub enum PointerButton {
pub const NUM_POINTER_BUTTONS: usize = 3;
/// State of the modifier keys. These must be fed to egui.
-#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
+///
+/// The best way to compare `Modifiers` is by using [`Modifiers::matches`].
+#[derive(Clone, Copy, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Modifiers {
/// Either of the alt keys are down (option ⌥ on Mac).
pub alt: bool,
+
/// Either of the control keys are down.
/// When checking for keyboard shortcuts, consider using [`Self::command`] instead.
pub ctrl: bool,
+
/// Either of the shift keys are down.
pub shift: bool,
+
/// The Mac ⌘ Command key. Should always be set to `false` on other platforms.
pub mac_cmd: bool,
+
/// On Windows and Linux, set this to the same value as `ctrl`.
/// On Mac, this should be set whenever one of the ⌘ Command keys are down (same as `mac_cmd`).
/// This is so that egui can, for instance, select all text by checking for `command + A`
@@ -264,6 +280,56 @@ pub struct Modifiers {
}
impl Modifiers {
+ pub fn new() -> Self {
+ Default::default()
+ }
+
+ pub const NONE: Self = Self {
+ alt: false,
+ ctrl: false,
+ shift: false,
+ mac_cmd: false,
+ command: false,
+ };
+
+ pub const ALT: Self = Self {
+ alt: true,
+ ctrl: false,
+ shift: false,
+ mac_cmd: false,
+ command: false,
+ };
+ pub const CTRL: Self = Self {
+ alt: false,
+ ctrl: true,
+ shift: false,
+ mac_cmd: false,
+ command: false,
+ };
+ pub const SHIFT: Self = Self {
+ alt: false,
+ ctrl: false,
+ shift: true,
+ mac_cmd: false,
+ command: false,
+ };
+ /// The Mac ⌘ Command key
+ pub const MAC_CMD: Self = Self {
+ alt: false,
+ ctrl: false,
+ shift: false,
+ mac_cmd: true,
+ command: false,
+ };
+ /// On Mac: ⌘ Command key, elsewhere: Ctrl key
+ pub const COMMAND: Self = Self {
+ alt: false,
+ ctrl: false,
+ shift: false,
+ mac_cmd: false,
+ command: true,
+ };
+
#[inline(always)]
pub fn is_none(&self) -> bool {
self == &Self::default()
@@ -274,6 +340,7 @@ impl Modifiers {
!self.is_none()
}
+ /// Is shift the only pressed button?
#[inline(always)]
pub fn shift_only(&self) -> bool {
self.shift && !(self.alt || self.command)
@@ -284,6 +351,66 @@ impl Modifiers {
pub fn command_only(&self) -> bool {
!self.alt && !self.shift && self.command
}
+
+ /// Check for equality but with proper handling of [`Self::command`].
+ ///
+ /// ```
+ /// # use egui::Modifiers;
+ /// assert!(Modifiers::CTRL.matches(Modifiers::CTRL));
+ /// assert!(!Modifiers::CTRL.matches(Modifiers::CTRL | Modifiers::SHIFT));
+ /// assert!(!(Modifiers::CTRL | Modifiers::SHIFT).matches(Modifiers::CTRL));
+ /// assert!((Modifiers::CTRL | Modifiers::COMMAND).matches(Modifiers::CTRL));
+ /// assert!((Modifiers::CTRL | Modifiers::COMMAND).matches(Modifiers::COMMAND));
+ /// assert!((Modifiers::MAC_CMD | Modifiers::COMMAND).matches(Modifiers::COMMAND));
+ /// assert!(!Modifiers::COMMAND.matches(Modifiers::MAC_CMD));
+ /// ```
+ pub fn matches(&self, pattern: Modifiers) -> bool {
+ // alt and shift must always match the pattern:
+ if pattern.alt != self.alt || pattern.shift != self.shift {
+ return false;
+ }
+
+ if pattern.mac_cmd {
+ // Mac-specific match:
+ if !self.mac_cmd {
+ return false;
+ }
+ if pattern.ctrl != self.ctrl {
+ return false;
+ }
+ return true;
+ }
+
+ if !pattern.ctrl && !pattern.command {
+ // the pattern explicitly doesn't want any ctrl/command:
+ return !self.ctrl && !self.command;
+ }
+
+ // if the pattern is looking for command, then `ctrl` may or may not be set depending on platform.
+ // if the pattern is looking for `ctrl`, then `command` may or may not be set depending on platform.
+
+ if pattern.ctrl && !self.ctrl {
+ return false;
+ }
+ if pattern.command && !self.command {
+ return false;
+ }
+
+ true
+ }
+}
+
+impl std::ops::BitOr for Modifiers {
+ type Output = Self;
+ fn bitor(self, rhs: Self) -> Self {
+ Self {
+ alt: self.alt | rhs.alt,
+ ctrl: self.ctrl | rhs.ctrl,
+ shift: self.shift | rhs.shift,
+ mac_cmd: self.mac_cmd | rhs.mac_cmd,
+ command: self.command | rhs.command,
+ }
+ }
}
/// Keyboard keys.
@@ -382,7 +509,7 @@ impl RawInput {
.on_hover_text(
"Also called HDPI factor.\nNumber of physical pixels per each logical pixel.",
);
- ui.label(format!("max_texture_side: {}", max_texture_side));
+ ui.label(format!("max_texture_side: {:?}", max_texture_side));
if let Some(time) = time {
ui.label(format!("time: {:.3} s", time));
} else {
diff --git a/egui/src/data/output.rs b/egui/src/data/output.rs
index 664808b5..e3f8dc37 100644
--- a/egui/src/data/output.rs
+++ b/egui/src/data/output.rs
@@ -2,11 +2,56 @@
use crate::WidgetType;
-/// What egui emits each frame.
+/// What egui emits each frame from [`crate::Context::run`].
+///
+/// The backend should use this.
+#[derive(Clone, Default, PartialEq)]
+pub struct FullOutput {
+ /// Non-rendering related output.
+ pub platform_output: PlatformOutput,
+
+ /// If `true`, egui is requesting immediate repaint (i.e. on the next frame).
+ ///
+ /// This happens for instance when there is an animation, or if a user has called `Context::request_repaint()`.
+ pub needs_repaint: bool,
+
+ /// Texture changes since last frame (including the font texture).
+ ///
+ /// The backend needs to apply [`crate::TexturesDelta::set`] _before_ painting,
+ /// and free any texture in [`crate::TexturesDelta::free`] _after_ painting.
+ pub textures_delta: epaint::textures::TexturesDelta,
+
+ /// What to paint.
+ ///
+ /// You can use [`crate::Context::tessellate`] to turn this into triangles.
+ pub shapes: Vec,
+}
+
+impl FullOutput {
+ /// Add on new output.
+ pub fn append(&mut self, newer: Self) {
+ let Self {
+ platform_output,
+ needs_repaint,
+ textures_delta,
+ shapes,
+ } = newer;
+
+ self.platform_output.append(platform_output);
+ self.needs_repaint = needs_repaint; // if the last frame doesn't need a repaint, then we don't need to repaint
+ self.textures_delta.append(textures_delta);
+ self.shapes = shapes; // Only paint the latest
+ }
+}
+
+/// The non-rendering part of what egui emits each frame.
+///
+/// You can access (and modify) this with [`crate::Context::output`].
+///
/// The backend should use this.
#[derive(Clone, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
-pub struct Output {
+pub struct PlatformOutput {
/// Set the cursor to this icon.
pub cursor_icon: CursorIcon,
@@ -18,14 +63,6 @@ pub struct Output {
/// This is often a response to [`crate::Event::Copy`] or [`crate::Event::Cut`].
pub copied_text: String,
- /// If `true`, egui is requesting immediate repaint (i.e. on the next frame).
- ///
- /// This happens for instance when there is an animation, or if a user has called `Context::request_repaint()`.
- ///
- /// As an egui user: don't set this value directly.
- /// Call `Context::request_repaint()` instead and it will do so for you.
- pub needs_repaint: bool,
-
/// Events that may be useful to e.g. a screen reader.
pub events: Vec,
@@ -35,12 +72,9 @@ pub struct Output {
/// Screen-space position of text edit cursor (used for IME).
pub text_cursor_pos: Option,
-
- /// Texture changes since last frame.
- pub textures_delta: epaint::textures::TexturesDelta,
}
-impl Output {
+impl PlatformOutput {
/// Open the given url in a web browser.
/// If egui is running in a browser, the same tab will be reused.
pub fn open_url(&mut self, url: impl ToString) {
@@ -70,11 +104,9 @@ impl Output {
cursor_icon,
open_url,
copied_text,
- needs_repaint,
mut events,
mutable_text_under_cursor,
text_cursor_pos,
- textures_delta,
} = newer;
self.cursor_icon = cursor_icon;
@@ -84,11 +116,9 @@ impl Output {
if !copied_text.is_empty() {
self.copied_text = copied_text;
}
- self.needs_repaint = needs_repaint; // if the last frame doesn't need a repaint, then we don't need to repaint
self.events.append(&mut events);
self.mutable_text_under_cursor = mutable_text_under_cursor;
self.text_cursor_pos = text_cursor_pos.or(self.text_cursor_pos);
- self.textures_delta.append(textures_delta);
}
/// Take everything ephemeral (everything except `cursor_icon` currently)
@@ -129,7 +159,7 @@ impl OpenUrl {
/// A mouse cursor icon.
///
-/// egui emits a [`CursorIcon`] in [`Output`] each frame as a request to the integration.
+/// egui emits a [`CursorIcon`] in [`PlatformOutput`] each frame as a request to the integration.
///
/// Loosely based on .
#[derive(Clone, Copy, Debug, PartialEq)]
diff --git a/egui/src/frame_state.rs b/egui/src/frame_state.rs
index 848dc415..e522eef6 100644
--- a/egui/src/frame_state.rs
+++ b/egui/src/frame_state.rs
@@ -1,3 +1,5 @@
+use std::ops::RangeInclusive;
+
use crate::*;
/// State that is collected during a frame and then cleared.
@@ -28,7 +30,7 @@ pub(crate) struct FrameState {
/// Cleared by the first `ScrollArea` that makes use of it.
pub(crate) scroll_delta: Vec2, // TODO: move to a Mutex inside of `InputState` ?
/// horizontal, vertical
- pub(crate) scroll_target: [Option<(f32, Align)>; 2],
+ pub(crate) scroll_target: [Option<(RangeInclusive, Option)>; 2],
}
impl Default for FrameState {
@@ -40,7 +42,7 @@ impl Default for FrameState {
used_by_panels: Rect::NAN,
tooltip_rect: None,
scroll_delta: Vec2::ZERO,
- scroll_target: [None; 2],
+ scroll_target: [None, None],
}
}
}
@@ -63,7 +65,7 @@ impl FrameState {
*used_by_panels = Rect::NOTHING;
*tooltip_rect = None;
*scroll_delta = input.scroll_delta;
- *scroll_target = [None; 2];
+ *scroll_target = [None, None];
}
/// How much space is still available after panels has been added.
diff --git a/egui/src/input_state.rs b/egui/src/input_state.rs
index 6395b54f..1c1e4703 100644
--- a/egui/src/input_state.rs
+++ b/egui/src/input_state.rs
@@ -49,6 +49,11 @@ pub struct InputState {
/// Also known as device pixel ratio, > 1 for high resolution screens.
pub pixels_per_point: f32,
+ /// Maximum size of one side of a texture.
+ ///
+ /// This depends on the backend.
+ pub max_texture_side: usize,
+
/// Time in seconds. Relative to whatever. Used for animation.
pub time: f64,
@@ -82,6 +87,7 @@ impl Default for InputState {
zoom_factor_delta: 1.0,
screen_rect: Rect::from_min_size(Default::default(), vec2(10_000.0, 10_000.0)),
pixels_per_point: 1.0,
+ max_texture_side: 2048,
time: 0.0,
unstable_dt: 1.0 / 6.0,
predicted_dt: 1.0 / 6.0,
@@ -134,6 +140,7 @@ impl InputState {
zoom_factor_delta,
screen_rect,
pixels_per_point: new.pixels_per_point.unwrap_or(self.pixels_per_point),
+ max_texture_side: new.max_texture_side.unwrap_or(self.max_texture_side),
time,
unstable_dt,
predicted_dt: new.predicted_dt,
@@ -192,6 +199,28 @@ impl InputState {
self.pointer.wants_repaint() || self.scroll_delta != Vec2::ZERO || !self.events.is_empty()
}
+ /// Check for a key press. If found, `true` is returned and the key pressed is consumed, so that this will only return `true` once.
+ pub fn consume_key(&mut self, modifiers: Modifiers, key: Key) -> bool {
+ let mut match_found = false;
+
+ self.events.retain(|event| {
+ let is_match = matches!(
+ event,
+ Event::Key {
+ key: ev_key,
+ modifiers: ev_mods,
+ pressed: true
+ } if *ev_key == key && ev_mods.matches(modifiers)
+ );
+
+ match_found |= is_match;
+
+ !is_match
+ });
+
+ match_found
+ }
+
/// Was the given key pressed this frame?
pub fn key_pressed(&self, desired_key: Key) -> bool {
self.num_presses(desired_key) > 0
@@ -692,6 +721,7 @@ impl InputState {
zoom_factor_delta,
screen_rect,
pixels_per_point,
+ max_texture_side,
time,
unstable_dt,
predicted_dt,
@@ -724,9 +754,13 @@ impl InputState {
ui.label(format!("zoom_factor_delta: {:4.2}x", zoom_factor_delta));
ui.label(format!("screen_rect: {:?} points", screen_rect));
ui.label(format!(
- "{:?} physical pixels for each logical point",
+ "{} physical pixels for each logical point",
pixels_per_point
));
+ ui.label(format!(
+ "max texture size (on each side): {}",
+ max_texture_side
+ ));
ui.label(format!("time: {:.3} s", time));
ui.label(format!(
"time since previous frame: {:.1} ms",
diff --git a/egui/src/introspection.rs b/egui/src/introspection.rs
index 3726b808..e5f814cc 100644
--- a/egui/src/introspection.rs
+++ b/egui/src/introspection.rs
@@ -146,7 +146,7 @@ impl Widget for &mut epaint::TessellationOptions {
epsilon: _,
} = self;
ui.checkbox(anti_alias, "Antialias")
- .on_hover_text("Turn off for small performance gain.");
+ .on_hover_text("Apply feathering to smooth out the edges of shapes. Turn off for small performance gain.");
ui.add(
crate::widgets::Slider::new(bezier_tolerance, 0.0001..=10.0)
.logarithmic(true)
diff --git a/egui/src/layers.rs b/egui/src/layers.rs
index 578d505a..76c8dfe3 100644
--- a/egui/src/layers.rs
+++ b/egui/src/layers.rs
@@ -23,6 +23,7 @@ pub enum Order {
/// Debug layer, always painted last / on top
Debug,
}
+
impl Order {
const COUNT: usize = 6;
const ALL: [Order; Self::COUNT] = [
diff --git a/egui/src/lib.rs b/egui/src/lib.rs
index fdf37174..8c05fc1a 100644
--- a/egui/src/lib.rs
+++ b/egui/src/lib.rs
@@ -110,16 +110,16 @@
//! To write your own integration for egui you need to do this:
//!
//! ``` no_run
-//! # fn handle_output(_: egui::Output) {}
-//! # fn paint(_: Vec) {}
+//! # fn handle_platform_output(_: egui::PlatformOutput) {}
//! # fn gather_input() -> egui::RawInput { egui::RawInput::default() }
+//! # fn paint(textures_detla: egui::TexturesDelta, _: Vec) {}
//! let mut ctx = egui::Context::default();
//!
//! // Game loop:
//! loop {
//! let raw_input: egui::RawInput = gather_input();
//!
-//! let (output, shapes) = ctx.run(raw_input, |ctx| {
+//! let full_output = ctx.run(raw_input, |ctx| {
//! egui::CentralPanel::default().show(&ctx, |ui| {
//! ui.label("Hello world!");
//! if ui.button("Click me").clicked() {
@@ -127,10 +127,9 @@
//! }
//! });
//! });
-//!
-//! let clipped_meshes = ctx.tessellate(shapes); // create triangles to paint
-//! handle_output(output);
-//! paint(clipped_meshes);
+//! handle_platform_output(full_output.platform_output);
+//! let clipped_meshes = ctx.tessellate(full_output.shapes); // create triangles to paint
+//! paint(full_output.textures_delta, clipped_meshes);
//! }
//! ```
//!
@@ -385,7 +384,7 @@ pub use epaint::emath;
pub use emath::{lerp, pos2, remap, remap_clamp, vec2, Align, Align2, NumExt, Pos2, Rect, Vec2};
pub use epaint::{
color, mutex,
- text::{FontData, FontDefinitions, FontFamily, FontId},
+ text::{FontData, FontDefinitions, FontFamily, FontId, FontTweak},
textures::TexturesDelta,
AlphaImage, ClippedMesh, Color32, ColorImage, ImageData, Mesh, Rgba, Rounding, Shape, Stroke,
TextureHandle, TextureId,
@@ -403,7 +402,7 @@ pub use {
context::Context,
data::{
input::*,
- output::{self, CursorIcon, Output, WidgetInfo},
+ output::{self, CursorIcon, FullOutput, PlatformOutput, WidgetInfo},
},
grid::Grid,
id::{Id, IdMap},
diff --git a/egui/src/memory.rs b/egui/src/memory.rs
index 4809f2de..0ccc36ae 100644
--- a/egui/src/memory.rs
+++ b/egui/src/memory.rs
@@ -105,7 +105,7 @@ pub struct Options {
pub tessellation_options: epaint::TessellationOptions,
/// This does not at all change the behavior of egui,
- /// but is a signal to any backend that we want the [`crate::Output::events`] read out loud.
+ /// but is a signal to any backend that we want the [`crate::PlatformOutput::events`] read out loud.
/// Screen readers is an experimental feature of egui, and not supported on all platforms.
pub screen_reader: bool,
@@ -329,6 +329,12 @@ impl Memory {
self.areas.layer_id_at(pos, resize_interact_radius_side)
}
+ /// The overall top-most layer. When an area is clicked on or interacted
+ /// with, it is moved above all other areas.
+ pub fn top_most_layer(&self) -> Option {
+ self.areas.order().last().copied()
+ }
+
pub(crate) fn had_focus_last_frame(&self, id: Id) -> bool {
self.interaction.focus.id_previous_frame == Some(id)
}
@@ -516,9 +522,9 @@ impl Areas {
if state.interactable {
// Allow us to resize by dragging just outside the window:
rect = rect.expand(resize_interact_radius_side);
- }
- if rect.contains(pos) {
- return Some(*layer);
+ if rect.contains(pos) {
+ return Some(*layer);
+ }
}
}
}
diff --git a/egui/src/menu.rs b/egui/src/menu.rs
index d2b87216..46146821 100644
--- a/egui/src/menu.rs
+++ b/egui/src/menu.rs
@@ -126,7 +126,7 @@ pub(crate) fn menu_ui<'c, R>(
let area = Area::new(menu_id)
.order(Order::Foreground)
.fixed_pos(pos)
- .interactable(false)
+ .interactable(true)
.drag_bounds(Rect::EVERYTHING);
let inner_response = area.show(ctx, |ui| {
ui.scope(|ui| {
diff --git a/egui/src/response.rs b/egui/src/response.rs
index d685174f..e8a94330 100644
--- a/egui/src/response.rs
+++ b/egui/src/response.rs
@@ -1,5 +1,5 @@
use crate::{
- emath::{lerp, Align, Pos2, Rect, Vec2},
+ emath::{Align, Pos2, Rect, Vec2},
menu, Context, CursorIcon, Id, LayerId, PointerButton, Sense, Ui, WidgetText,
NUM_POINTER_BUTTONS,
};
@@ -443,7 +443,11 @@ impl Response {
)
}
- /// Move the scroll to this UI with the specified alignment.
+ /// Adjust the scroll position until this UI becomes visible.
+ ///
+ /// If `align` is `None`, it'll scroll enough to bring the UI into view.
+ ///
+ /// See also: [`Ui::scroll_to_cursor`], [`Ui::scroll_to_rect`].
///
/// ```
/// # egui::__run_test_ui(|ui| {
@@ -451,18 +455,15 @@ impl Response {
/// for i in 0..1000 {
/// let response = ui.button("Scroll to me");
/// if response.clicked() {
- /// response.scroll_to_me(egui::Align::Center);
+ /// response.scroll_to_me(Some(egui::Align::Center));
/// }
/// }
/// });
/// # });
/// ```
- pub fn scroll_to_me(&self, align: Align) {
- let scroll_target = lerp(self.rect.x_range(), align.to_factor());
- self.ctx.frame_state().scroll_target[0] = Some((scroll_target, align));
-
- let scroll_target = lerp(self.rect.y_range(), align.to_factor());
- self.ctx.frame_state().scroll_target[1] = Some((scroll_target, align));
+ pub fn scroll_to_me(&self, align: Option) {
+ self.ctx.frame_state().scroll_target[0] = Some((self.rect.x_range(), align));
+ self.ctx.frame_state().scroll_target[1] = Some((self.rect.y_range(), align));
}
/// For accessibility.
@@ -509,6 +510,8 @@ impl Response {
impl Response {
/// A logical "or" operation.
/// For instance `a.union(b).hovered` means "was either a or b hovered?".
+ ///
+ /// The resulting [`Self::id`] will come from the first (`self`) argument.
pub fn union(&self, other: Self) -> Self {
assert!(self.ctx == other.ctx);
crate::egui_assert!(
diff --git a/egui/src/style.rs b/egui/src/style.rs
index d13548a6..9024a002 100644
--- a/egui/src/style.rs
+++ b/egui/src/style.rs
@@ -2,7 +2,7 @@
#![allow(clippy::if_same_then_else)]
-use crate::{color::*, emath::*, FontFamily, FontId, Margin, Response, RichText, WidgetText};
+use crate::{color::*, emath::*, FontFamily, FontId, Response, RichText, WidgetText};
use epaint::{mutex::Arc, Rounding, Shadow, Stroke};
use std::collections::BTreeMap;
@@ -277,6 +277,49 @@ impl Spacing {
}
}
+#[derive(Clone, Copy, Debug, Default, PartialEq)]
+#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
+pub struct Margin {
+ pub left: f32,
+ pub right: f32,
+ pub top: f32,
+ pub bottom: f32,
+}
+
+impl Margin {
+ #[inline]
+ pub fn same(margin: f32) -> Self {
+ Self {
+ left: margin,
+ right: margin,
+ top: margin,
+ bottom: margin,
+ }
+ }
+
+ /// Margins with the same size on opposing sides
+ #[inline]
+ pub fn symmetric(x: f32, y: f32) -> Self {
+ Self {
+ left: x,
+ right: x,
+ top: y,
+ bottom: y,
+ }
+ }
+
+ /// Total margins on both sides
+ pub fn sum(&self) -> Vec2 {
+ Vec2::new(self.left + self.right, self.top + self.bottom)
+ }
+}
+
+impl From for Margin {
+ fn from(v: Vec2) -> Self {
+ Self::symmetric(v.x, v.y)
+ }
+}
+
/// How and when interaction happens.
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
@@ -564,7 +607,7 @@ impl Visuals {
selection: Selection::default(),
hyperlink_color: Color32::from_rgb(90, 170, 255),
faint_bg_color: Color32::from_gray(24),
- extreme_bg_color: Color32::from_gray(10),
+ extreme_bg_color: Color32::from_gray(10), // e.g. TextEdit background
code_bg_color: Color32::from_gray(64),
window_rounding: Rounding::same(6.0),
window_shadow: Shadow::big_dark(),
@@ -585,9 +628,9 @@ impl Visuals {
widgets: Widgets::light(),
selection: Selection::light(),
hyperlink_color: Color32::from_rgb(0, 155, 255),
- faint_bg_color: Color32::from_gray(240),
- extreme_bg_color: Color32::from_gray(250),
- code_bg_color: Color32::from_gray(200),
+ faint_bg_color: Color32::from_gray(245),
+ extreme_bg_color: Color32::from_gray(255), // e.g. TextEdit background
+ code_bg_color: Color32::from_gray(230),
window_shadow: Shadow::big_light(),
popup_shadow: Shadow::small_light(),
..Self::dark()
@@ -666,21 +709,21 @@ impl Widgets {
pub fn light() -> Self {
Self {
noninteractive: WidgetVisuals {
- bg_fill: Color32::from_gray(235), // window background
+ bg_fill: Color32::from_gray(248), // window background - should be distinct from TextEdit background
bg_stroke: Stroke::new(1.0, Color32::from_gray(190)), // separators, indentation lines, windows outlines
- fg_stroke: Stroke::new(1.0, Color32::from_gray(100)), // normal text color
+ fg_stroke: Stroke::new(1.0, Color32::from_gray(80)), // normal text color
rounding: Rounding::same(2.0),
expansion: 0.0,
},
inactive: WidgetVisuals {
- bg_fill: Color32::from_gray(215), // button background
+ bg_fill: Color32::from_gray(230), // button background
bg_stroke: Default::default(),
- fg_stroke: Stroke::new(1.0, Color32::from_gray(80)), // button text
+ fg_stroke: Stroke::new(1.0, Color32::from_gray(60)), // button text
rounding: Rounding::same(2.0),
expansion: 0.0,
},
hovered: WidgetVisuals {
- bg_fill: Color32::from_gray(210),
+ bg_fill: Color32::from_gray(220),
bg_stroke: Stroke::new(1.0, Color32::from_gray(105)), // e.g. hover over window edge or button
fg_stroke: Stroke::new(1.5, Color32::BLACK),
rounding: Rounding::same(3.0),
diff --git a/egui/src/ui.rs b/egui/src/ui.rs
index b1790e8c..eb442593 100644
--- a/egui/src/ui.rs
+++ b/egui/src/ui.rs
@@ -338,6 +338,21 @@ impl Ui {
self.ctx().input()
}
+ /// The [`InputState`] of the [`Context`] associated with this [`Ui`].
+ /// Equivalent to `.ctx().input_mut()`.
+ ///
+ /// Note that this locks the [`Context`], so be careful with if-let bindings
+ /// like for [`Self::input()`].
+ /// ```
+ /// # egui::__run_test_ui(|ui| {
+ /// ui.input_mut().consume_key(egui::Modifiers::default(), egui::Key::Enter);
+ /// # });
+ /// ```
+ #[inline]
+ pub fn input_mut(&self) -> RwLockWriteGuard<'_, InputState> {
+ self.ctx().input_mut()
+ }
+
/// The [`Memory`] of the [`Context`] associated with this ui.
/// Equivalent to `.ctx().memory()`.
#[inline]
@@ -351,10 +366,10 @@ impl Ui {
self.ctx().data()
}
- /// The [`Output`] of the [`Context`] associated with this ui.
+ /// The [`PlatformOutput`] of the [`Context`] associated with this ui.
/// Equivalent to `.ctx().output()`.
#[inline]
- pub fn output(&self) -> RwLockWriteGuard<'_, Output> {
+ pub fn output(&self) -> RwLockWriteGuard<'_, PlatformOutput> {
self.ctx().output()
}
@@ -889,7 +904,36 @@ impl Ui {
(response, painter)
}
- /// Move the scroll to this cursor position with the specified alignment.
+ /// Adjust the scroll position of any parent [`ScrollArea`] so that the given `Rect` becomes visible.
+ ///
+ /// If `align` is `None`, it'll scroll enough to bring the cursor into view.
+ ///
+ /// See also: [`Response::scroll_to_me`], [`Ui::scroll_to_rect`].
+ ///
+ /// ```
+ /// # use egui::Align;
+ /// # egui::__run_test_ui(|ui| {
+ /// egui::ScrollArea::vertical().show(ui, |ui| {
+ /// // …
+ /// let response = ui.button("Center on me.");
+ /// if response.clicked() {
+ /// ui.scroll_to_rect(response.rect, Some(Align::Center));
+ /// }
+ /// });
+ /// # });
+ /// ```
+ pub fn scroll_to_rect(&self, rect: Rect, align: Option) {
+ for d in 0..2 {
+ let range = rect.min[d]..=rect.max[d];
+ self.ctx().frame_state().scroll_target[d] = Some((range, align));
+ }
+ }
+
+ /// Adjust the scroll position of any parent [`ScrollArea`] so that the cursor (where the next widget goes) becomes visible.
+ ///
+ /// If `align` is not provided, it'll scroll enough to bring the cursor into view.
+ ///
+ /// See also: [`Response::scroll_to_me`], [`Ui::scroll_to_rect`].
///
/// ```
/// # use egui::Align;
@@ -901,15 +945,16 @@ impl Ui {
/// }
///
/// if scroll_bottom {
- /// ui.scroll_to_cursor(Align::BOTTOM);
+ /// ui.scroll_to_cursor(Some(Align::BOTTOM));
/// }
/// });
/// # });
/// ```
- pub fn scroll_to_cursor(&mut self, align: Align) {
+ pub fn scroll_to_cursor(&self, align: Option) {
let target = self.next_widget_position();
for d in 0..2 {
- self.ctx().frame_state().scroll_target[d] = Some((target[d], align));
+ let target = target[d];
+ self.ctx().frame_state().scroll_target[d] = Some((target..=target, align));
}
}
}
@@ -969,7 +1014,7 @@ impl Ui {
.inner
}
- /// Add a single[`Widget`] that is possibly disabled, i.e. greyed out and non-interactive.
+ /// Add a single [`Widget`] that is possibly disabled, i.e. greyed out and non-interactive.
///
/// If you call `add_enabled` from within an already disabled `Ui`,
/// the widget will always be disabled, even if the `enabled` argument is true.
@@ -1024,7 +1069,7 @@ impl Ui {
})
}
- /// Add a single[`Widget`] that is possibly invisible.
+ /// Add a single [`Widget`] that is possibly invisible.
///
/// An invisible widget still takes up the same space as if it were visible.
///
diff --git a/egui/src/widget_text.rs b/egui/src/widget_text.rs
index 4e5659cd..c9fb64e2 100644
--- a/egui/src/widget_text.rs
+++ b/egui/src/widget_text.rs
@@ -51,6 +51,13 @@ impl From<&String> for RichText {
}
}
+impl From<&mut String> for RichText {
+ #[inline]
+ fn from(text: &mut String) -> Self {
+ RichText::new(text.clone())
+ }
+}
+
impl From for RichText {
#[inline]
fn from(text: String) -> Self {
diff --git a/egui/src/widgets/color_picker.rs b/egui/src/widgets/color_picker.rs
index 6ed70d60..4a5f4c2a 100644
--- a/egui/src/widgets/color_picker.rs
+++ b/egui/src/widgets/color_picker.rs
@@ -145,9 +145,9 @@ fn color_slider_1d(ui: &mut Ui, value: &mut f32, color_at: impl Fn(f32) -> Color
let picked_color = color_at(*value);
ui.painter().add(Shape::convex_polygon(
vec![
- pos2(x - r, rect.bottom()),
- pos2(x + r, rect.bottom()),
- pos2(x, rect.center().y),
+ pos2(x, rect.center().y), // tip
+ pos2(x + r, rect.bottom()), // right bottom
+ pos2(x - r, rect.bottom()), // left bottom
],
picked_color,
Stroke::new(visuals.fg_stroke.width, contrast_color(picked_color)),
@@ -357,7 +357,7 @@ pub fn color_edit_button_hsva(ui: &mut Ui, hsva: &mut Hsva, alpha: Alpha) -> Res
if ui.memory().is_popup_open(popup_id) {
let area_response = Area::new(popup_id)
.order(Order::Foreground)
- .default_pos(button_response.rect.max)
+ .current_pos(button_response.rect.max)
.show(ui.ctx(), |ui| {
ui.spacing_mut().slider_width = 210.0;
Frame::popup(ui.style()).show(ui, |ui| {
diff --git a/egui/src/widgets/drag_value.rs b/egui/src/widgets/drag_value.rs
index 0c788184..54ce87fc 100644
--- a/egui/src/widgets/drag_value.rs
+++ b/egui/src/widgets/drag_value.rs
@@ -180,7 +180,7 @@ impl<'a> Widget for DragValue<'a> {
emath::format_with_decimals_in_range(value, auto_decimals..=max_decimals)
};
- let kb_edit_id = ui.auto_id_with("edit");
+ let kb_edit_id = ui.next_auto_id();
let is_kb_editing = ui.memory().has_focus(kb_edit_id);
let mut response = if is_kb_editing {
diff --git a/egui/src/widgets/plot/items/mod.rs b/egui/src/widgets/plot/items/mod.rs
index 983d29df..55ae512e 100644
--- a/egui/src/widgets/plot/items/mod.rs
+++ b/egui/src/widgets/plot/items/mod.rs
@@ -7,7 +7,7 @@ use epaint::Mesh;
use crate::*;
-use super::{CustomLabelFuncRef, PlotBounds, ScreenTransform};
+use super::{LabelFormatter, PlotBounds, ScreenTransform};
use rect_elem::*;
use values::{ClosestElem, PlotGeometry};
@@ -66,7 +66,7 @@ pub(super) trait PlotItem {
elem: ClosestElem,
shapes: &mut Vec,
plot: &PlotConfig<'_>,
- custom_label_func: &CustomLabelFuncRef,
+ label_formatter: &LabelFormatter,
) {
let points = match self.geometry() {
PlotGeometry::Points(points) => points,
@@ -89,7 +89,7 @@ pub(super) trait PlotItem {
let pointer = plot.transform.position_from_value(&value);
shapes.push(Shape::circle_filled(pointer, 3.0, line_color));
- rulers_at_value(pointer, value, self.name(), plot, shapes, custom_label_func);
+ rulers_at_value(pointer, value, self.name(), plot, shapes, label_formatter);
}
}
@@ -613,6 +613,7 @@ impl PlotItem for Polygon {
}
/// Text inside the plot.
+#[derive(Clone)]
pub struct Text {
pub(super) text: WidgetText,
pub(super) position: Value,
@@ -807,9 +808,9 @@ impl Points {
impl PlotItem for Points {
fn get_shapes(&self, _ui: &mut Ui, transform: &ScreenTransform, shapes: &mut Vec) {
- let sqrt_3 = 3f32.sqrt();
- let frac_sqrt_3_2 = 3f32.sqrt() / 2.0;
- let frac_1_sqrt_2 = 1.0 / 2f32.sqrt();
+ let sqrt_3 = 3_f32.sqrt();
+ let frac_sqrt_3_2 = 3_f32.sqrt() / 2.0;
+ let frac_1_sqrt_2 = 1.0 / 2_f32.sqrt();
let Self {
series,
@@ -861,15 +862,20 @@ impl PlotItem for Points {
}));
}
MarkerShape::Diamond => {
- let points = vec![tf(1.0, 0.0), tf(0.0, -1.0), tf(-1.0, 0.0), tf(0.0, 1.0)];
+ let points = vec![
+ tf(0.0, 1.0), // bottom
+ tf(-1.0, 0.0), // left
+ tf(0.0, -1.0), // top
+ tf(1.0, 0.0), // right
+ ];
shapes.push(Shape::convex_polygon(points, fill, stroke));
}
MarkerShape::Square => {
let points = vec![
- tf(frac_1_sqrt_2, frac_1_sqrt_2),
- tf(frac_1_sqrt_2, -frac_1_sqrt_2),
- tf(-frac_1_sqrt_2, -frac_1_sqrt_2),
tf(-frac_1_sqrt_2, frac_1_sqrt_2),
+ tf(-frac_1_sqrt_2, -frac_1_sqrt_2),
+ tf(frac_1_sqrt_2, -frac_1_sqrt_2),
+ tf(frac_1_sqrt_2, frac_1_sqrt_2),
];
shapes.push(Shape::convex_polygon(points, fill, stroke));
}
@@ -893,7 +899,7 @@ impl PlotItem for Points {
}
MarkerShape::Up => {
let points =
- vec![tf(0.0, -1.0), tf(-0.5 * sqrt_3, 0.5), tf(0.5 * sqrt_3, 0.5)];
+ vec![tf(0.0, -1.0), tf(0.5 * sqrt_3, 0.5), tf(-0.5 * sqrt_3, 0.5)];
shapes.push(Shape::convex_polygon(points, fill, stroke));
}
MarkerShape::Down => {
@@ -912,8 +918,8 @@ impl PlotItem for Points {
MarkerShape::Right => {
let points = vec![
tf(1.0, 0.0),
- tf(-0.5, -0.5 * sqrt_3),
tf(-0.5, 0.5 * sqrt_3),
+ tf(-0.5, -0.5 * sqrt_3),
];
shapes.push(Shape::convex_polygon(points, fill, stroke));
}
@@ -1074,6 +1080,7 @@ impl PlotItem for Arrows {
}
/// An image in the plot.
+#[derive(Clone)]
pub struct PlotImage {
pub(super) position: Value,
pub(super) texture_id: TextureId,
@@ -1380,7 +1387,7 @@ impl PlotItem for BarChart {
elem: ClosestElem,
shapes: &mut Vec,
plot: &PlotConfig<'_>,
- _: &CustomLabelFuncRef,
+ _: &LabelFormatter,
) {
let bar = &self.bars[elem.index];
@@ -1522,7 +1529,7 @@ impl PlotItem for BoxPlot {
elem: ClosestElem,
shapes: &mut Vec,
plot: &PlotConfig<'_>,
- _: &CustomLabelFuncRef,
+ _: &LabelFormatter,
) {
let box_plot = &self.boxes[elem.index];
@@ -1643,7 +1650,7 @@ pub(super) fn rulers_at_value(
name: &str,
plot: &PlotConfig<'_>,
shapes: &mut Vec,
- custom_label_func: &CustomLabelFuncRef,
+ label_formatter: &LabelFormatter,
) {
let line_color = rulers_color(plot.ui);
if plot.show_x {
@@ -1663,7 +1670,7 @@ pub(super) fn rulers_at_value(
let scale = plot.transform.dvalue_dpos();
let x_decimals = ((-scale[0].abs().log10()).ceil().at_least(0.0) as usize).at_most(6);
let y_decimals = ((-scale[1].abs().log10()).ceil().at_least(0.0) as usize).at_most(6);
- if let Some(custom_label) = custom_label_func {
+ if let Some(custom_label) = label_formatter {
custom_label(name, &value)
} else if plot.show_x && plot.show_y {
format!(
diff --git a/egui/src/widgets/plot/mod.rs b/egui/src/widgets/plot/mod.rs
index 647c1b41..b6f08096 100644
--- a/egui/src/widgets/plot/mod.rs
+++ b/egui/src/widgets/plot/mod.rs
@@ -1,6 +1,6 @@
//! Simple plotting library.
-use std::{cell::RefCell, rc::Rc};
+use std::{cell::RefCell, ops::RangeInclusive, rc::Rc};
use crate::*;
use epaint::ahash::AHashSet;
@@ -20,12 +20,44 @@ mod items;
mod legend;
mod transform;
-type CustomLabelFunc = dyn Fn(&str, &Value) -> String;
-type CustomLabelFuncRef = Option>;
-
-type AxisFormatterFn = dyn Fn(f64) -> String;
+type LabelFormatterFn = dyn Fn(&str, &Value) -> String;
+type LabelFormatter = Option>;
+type AxisFormatterFn = dyn Fn(f64, &RangeInclusive) -> String;
type AxisFormatter = Option>;
+/// Specifies the coordinates formatting when passed to [`Plot::coordinates_formatter`].
+pub struct CoordinatesFormatter {
+ function: Box String>,
+}
+
+impl CoordinatesFormatter {
+ /// Create a new formatter based on the pointer coordinate and the plot bounds.
+ pub fn new(function: impl Fn(&Value, &PlotBounds) -> String + 'static) -> Self {
+ Self {
+ function: Box::new(function),
+ }
+ }
+
+ /// Show a fixed number of decimal places.
+ pub fn with_decimals(num_decimals: usize) -> Self {
+ Self {
+ function: Box::new(move |value, _| {
+ format!("x: {:.d$}\ny: {:.d$}", value.x, value.y, d = num_decimals)
+ }),
+ }
+ }
+
+ fn format(&self, value: &Value, bounds: &PlotBounds) -> String {
+ (self.function)(value, bounds)
+ }
+}
+
+impl Default for CoordinatesFormatter {
+ fn default() -> Self {
+ Self::with_decimals(3)
+ }
+}
+
// ----------------------------------------------------------------------------
/// Information about the plot that has to persist between frames.
@@ -146,7 +178,8 @@ pub struct Plot {
show_x: bool,
show_y: bool,
- custom_label_func: CustomLabelFuncRef,
+ label_formatter: LabelFormatter,
+ coordinates_formatter: Option<(Corner, CoordinatesFormatter)>,
axis_formatters: [AxisFormatter; 2],
legend_config: Option