#include <vector>
|
|
|
|
#include <emscripten/bind.h>
|
|
|
|
#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<const float *>(binary.data());
|
|
|
|
float *rgba = nullptr;
|
|
width_ = -1;
|
|
height_ = -1;
|
|
const char *err = nullptr;
|
|
|
|
error_.clear();
|
|
|
|
result_ = LoadEXRFromMemory(
|
|
&rgba, &width_, &height_,
|
|
reinterpret_cast<const unsigned char *>(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<float> image_; // RGBA
|
|
int width_;
|
|
int height_;
|
|
int result_;
|
|
std::string error_;
|
|
};
|
|
|
|
// Register STL
|
|
EMSCRIPTEN_BINDINGS(stl_wrappters) { register_vector<float>("VectorFloat"); }
|
|
|
|
EMSCRIPTEN_BINDINGS(tinyexr_module) {
|
|
class_<EXRLoader>("EXRLoader")
|
|
.constructor<const std::string &>()
|
|
.function("getBytes", &EXRLoader::getBytes)
|
|
.function("ok", &EXRLoader::ok)
|
|
.function("error", &EXRLoader::error)
|
|
.function("width", &EXRLoader::width)
|
|
.function("height", &EXRLoader::height);
|
|
}
|