forked from external-repos/squoosh
It's not possible to share them across threads, so in case we decide to use multithreading in the future, it's best to mark them as thread_local right away, even if it's a no-op right now.
27 lines
747 B
C++
27 lines
747 B
C++
#include <string>
|
|
#include "emscripten/bind.h"
|
|
#include "emscripten/val.h"
|
|
#include "src/webp/decode.h"
|
|
#include "src/webp/demux.h"
|
|
|
|
using namespace emscripten;
|
|
|
|
int version() {
|
|
return WebPGetDecoderVersion();
|
|
}
|
|
|
|
thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray");
|
|
thread_local const val ImageData = val::global("ImageData");
|
|
|
|
val decode(std::string buffer) {
|
|
int width, height;
|
|
std::unique_ptr<uint8_t[]> rgba(
|
|
WebPDecodeRGBA((const uint8_t*)buffer.c_str(), buffer.size(), &width, &height));
|
|
return ImageData.new_(Uint8ClampedArray.new_(typed_memory_view(width * height * 4, rgba.get())), width, height);
|
|
}
|
|
|
|
EMSCRIPTEN_BINDINGS(my_module) {
|
|
function("decode", &decode);
|
|
function("version", &version);
|
|
}
|