1*c8dee2aaSAndroid Build Coastguard WorkerCanvasKit._extraInitializations = CanvasKit._extraInitializations || []; 2*c8dee2aaSAndroid Build Coastguard WorkerCanvasKit._extraInitializations.push(function() { 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard Worker // sksl is the shader code. 5*c8dee2aaSAndroid Build Coastguard Worker // errorCallback is a function that will be called with an error string if the 6*c8dee2aaSAndroid Build Coastguard Worker // effect cannot be made. If not provided, the error will be logged. 7*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.RuntimeEffect.Make = function(sksl, errorCallback) { 8*c8dee2aaSAndroid Build Coastguard Worker // The easiest way to pass a function into C++ code is to wrap it in an object and 9*c8dee2aaSAndroid Build Coastguard Worker // treat it as an emscripten::val on the other side. 10*c8dee2aaSAndroid Build Coastguard Worker var callbackObj = { 11*c8dee2aaSAndroid Build Coastguard Worker 'onError': errorCallback || function(err) { 12*c8dee2aaSAndroid Build Coastguard Worker console.log('RuntimeEffect error', err); 13*c8dee2aaSAndroid Build Coastguard Worker }, 14*c8dee2aaSAndroid Build Coastguard Worker }; 15*c8dee2aaSAndroid Build Coastguard Worker return CanvasKit.RuntimeEffect._Make(sksl, callbackObj); 16*c8dee2aaSAndroid Build Coastguard Worker }; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker // sksl is the blender code. 19*c8dee2aaSAndroid Build Coastguard Worker // errorCallback is a function that will be called with an error string if the 20*c8dee2aaSAndroid Build Coastguard Worker // effect cannot be made. If not provided, the error will be logged. 21*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.RuntimeEffect.MakeForBlender = function(sksl, errorCallback) { 22*c8dee2aaSAndroid Build Coastguard Worker // The easiest way to pass a function into C++ code is to wrap it in an object and 23*c8dee2aaSAndroid Build Coastguard Worker // treat it as an emscripten::val on the other side. 24*c8dee2aaSAndroid Build Coastguard Worker var callbackObj = { 25*c8dee2aaSAndroid Build Coastguard Worker 'onError': errorCallback || function(err) { 26*c8dee2aaSAndroid Build Coastguard Worker console.log('RuntimeEffect error', err); 27*c8dee2aaSAndroid Build Coastguard Worker }, 28*c8dee2aaSAndroid Build Coastguard Worker }; 29*c8dee2aaSAndroid Build Coastguard Worker return CanvasKit.RuntimeEffect._MakeForBlender(sksl, callbackObj); 30*c8dee2aaSAndroid Build Coastguard Worker }; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.RuntimeEffect.prototype.makeShader = function(floats, localMatrix) { 33*c8dee2aaSAndroid Build Coastguard Worker // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of 34*c8dee2aaSAndroid Build Coastguard Worker // them (and free the memory when the shader is freed). 35*c8dee2aaSAndroid Build Coastguard Worker var shouldOwnUniforms = !floats['_ck']; 36*c8dee2aaSAndroid Build Coastguard Worker var fptr = copy1dArray(floats, 'HEAPF32'); 37*c8dee2aaSAndroid Build Coastguard Worker var localMatrixPtr = copy3x3MatrixToWasm(localMatrix); 38*c8dee2aaSAndroid Build Coastguard Worker // Our array has 4 bytes per float, so be sure to account for that before 39*c8dee2aaSAndroid Build Coastguard Worker // sending it over the wire. 40*c8dee2aaSAndroid Build Coastguard Worker return this._makeShader(fptr, floats.length * 4, shouldOwnUniforms, localMatrixPtr); 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker // childrenWithShaders is an array of other shaders (e.g. Image.makeShader()) 44*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.RuntimeEffect.prototype.makeShaderWithChildren = function(floats, childrenShaders, localMatrix) { 45*c8dee2aaSAndroid Build Coastguard Worker // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of 46*c8dee2aaSAndroid Build Coastguard Worker // them (and free the memory when the shader is freed). 47*c8dee2aaSAndroid Build Coastguard Worker var shouldOwnUniforms = !floats['_ck']; 48*c8dee2aaSAndroid Build Coastguard Worker var fptr = copy1dArray(floats, 'HEAPF32'); 49*c8dee2aaSAndroid Build Coastguard Worker var localMatrixPtr = copy3x3MatrixToWasm(localMatrix); 50*c8dee2aaSAndroid Build Coastguard Worker var barePointers = []; 51*c8dee2aaSAndroid Build Coastguard Worker for (var i = 0; i < childrenShaders.length; i++) { 52*c8dee2aaSAndroid Build Coastguard Worker // childrenShaders are emscriptens smart pointer type. We want to get the bare pointer 53*c8dee2aaSAndroid Build Coastguard Worker // and send that over the wire, so it can be re-wrapped as an sk_sp. 54*c8dee2aaSAndroid Build Coastguard Worker barePointers.push(childrenShaders[i].$$.ptr); 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker var childrenPointers = copy1dArray(barePointers, 'HEAPU32'); 57*c8dee2aaSAndroid Build Coastguard Worker // Our array has 4 bytes per float, so be sure to account for that before 58*c8dee2aaSAndroid Build Coastguard Worker // sending it over the wire. 59*c8dee2aaSAndroid Build Coastguard Worker return this._makeShaderWithChildren(fptr, floats.length * 4, shouldOwnUniforms, childrenPointers, 60*c8dee2aaSAndroid Build Coastguard Worker barePointers.length, localMatrixPtr); 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.RuntimeEffect.prototype.makeBlender = function(floats) { 64*c8dee2aaSAndroid Build Coastguard Worker // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of 65*c8dee2aaSAndroid Build Coastguard Worker // them (and free the memory when the blender is freed). 66*c8dee2aaSAndroid Build Coastguard Worker var shouldOwnUniforms = !floats['_ck']; 67*c8dee2aaSAndroid Build Coastguard Worker var fptr = copy1dArray(floats, 'HEAPF32'); 68*c8dee2aaSAndroid Build Coastguard Worker return this._makeBlender(fptr, floats.length * 4, shouldOwnUniforms); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker}); 71