1var nullptr = 0; // emscripten doesn't like to take null as uintptr_t 2 3// arr can be a normal JS array or a TypedArray 4// dest is something like SkottieKit.HEAPF32 5// ptr can be optionally provided if the memory was already allocated. 6function copy1dArray(arr, dest, ptr) { 7 if (!arr || !arr.length) { 8 return nullptr; 9 } 10 // This was created with SkottieKit.Malloc, so it's already been copied. 11 if (arr['_ck']) { 12 return arr.byteOffset; 13 } 14 if (!ptr) { 15 ptr = SkottieKit._malloc(arr.length * dest.BYTES_PER_ELEMENT); 16 } 17 // In c++ terms, the WASM heap is a uint8_t*, a long buffer/array of single 18 // byte elements. When we run _malloc, we always get an offset/pointer into 19 // that block of memory. 20 // SkottieKit exposes some different views to make it easier to work with 21 // different types. HEAPF32 for example, exposes it as a float* 22 // However, to make the ptr line up, we have to do some pointer arithmetic. 23 // Concretely, we need to convert ptr to go from an index into a 1-byte-wide 24 // buffer to an index into a 4-byte-wide buffer (in the case of HEAPF32) 25 // and thus we divide ptr by 4. 26 dest.set(arr, ptr / dest.BYTES_PER_ELEMENT); 27 return ptr; 28} 29