#include #include #define TINYEXR_IMPLEMENTATION #include "tinyexr.h" using namespace emscripten; /// /// Simple C++ wrapper class for Emscripten /// class EXRLoader { public: /// /// `binary` is the buffer for EXR binary(e.g. buffer read by fs.readFileSync) /// std::string can be used as UInt8Array in JS layer. /// EXRLoader(const std::string &binary) { const float *ptr = reinterpret_cast(binary.data()); float *rgba = nullptr; width_ = -1; height_ = -1; const char *err = nullptr; error_.clear(); result_ = LoadEXRFromMemory( &rgba, &width_, &height_, reinterpret_cast(binary.data()), binary.size(), &err); if (TINYEXR_SUCCESS == result_) { image_.resize(size_t(width_ * height_ * 4)); memcpy(image_.data(), rgba, sizeof(float) * size_t(width_ * height_ * 4)); free(rgba); } else { if (err) { error_ = std::string(err); } } } ~EXRLoader() {} // Return as memory views emscripten::val getBytes() const { return emscripten::val( emscripten::typed_memory_view(image_.size(), image_.data())); } bool ok() const { return (TINYEXR_SUCCESS == result_); } const std::string error() const { return error_; } int width() const { return width_; } int height() const { return height_; } private: std::vector image_; // RGBA int width_; int height_; int result_; std::string error_; }; // Register STL EMSCRIPTEN_BINDINGS(stl_wrappters) { register_vector("VectorFloat"); } EMSCRIPTEN_BINDINGS(tinyexr_module) { class_("EXRLoader") .constructor() .function("getBytes", &EXRLoader::getBytes) .function("ok", &EXRLoader::ok) .function("error", &EXRLoader::error) .function("width", &EXRLoader::width) .function("height", &EXRLoader::height); }