diff --git a/codecs/basis/Makefile b/codecs/basis/Makefile index c4ac83a9..f11bfdb9 100644 --- a/codecs/basis/Makefile +++ b/codecs/basis/Makefile @@ -3,7 +3,7 @@ CODEC_DIR := node_modules/basis BUILD_DIR := build ENVIRONMENT = worker -OUT_JS := enc/basis_enc.js # enc/basis_node_enc.js +OUT_JS := enc/basis_enc.js dec/basis_dec.js OUT_WASM := $(OUT_JS:.js=.wasm) override CXXFLAGS += -O3 @@ -43,13 +43,14 @@ all: $(CODEC_DIR) $(OUT_JS) # Define dependencies for all variations of build artifacts. $(filter enc/%,$(OUT_JS)): enc/basis_enc.cpp -# $(filter dec/%,$(OUT_JS)): dec/mozjpeg_dec.cpp +$(filter dec/%,$(OUT_JS)): dec/basis_dec.cpp # enc/mozjpeg_node_enc.js dec/mozjpeg_node_dec.js: ENVIRONMENT = node %.js: $(CODEC_CPP_OBJECT_FILE_PATHS) $(CODEC_C_OBJECT_FILE_PATHS) $(CXX) \ -I $(CODEC_DIR)/encoder \ + -I $(CODEC_DIR)/transcoder \ ${CXXFLAGS} \ ${LDFLAGS} \ --closure 1 \ diff --git a/codecs/basis/asdf.html b/codecs/basis/asdf.html new file mode 100644 index 00000000..32f4af41 --- /dev/null +++ b/codecs/basis/asdf.html @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/codecs/basis/dec/basis_dec.cpp b/codecs/basis/dec/basis_dec.cpp new file mode 100644 index 00000000..8cdd70b2 --- /dev/null +++ b/codecs/basis/dec/basis_dec.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include "basisu_global_selector_palette.h" +#include "basisu_transcoder.h" + +using namespace emscripten; +using namespace basisu; + +thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray"); +thread_local const val ImageData = val::global("ImageData"); + +val decode(std::string data) { + basist::basisu_transcoder_init(); + + basist::etc1_global_selector_codebook sel_codebook = basist::etc1_global_selector_codebook( + basist::g_global_selector_cb_size, basist::g_global_selector_cb); + // basis_data data = basis_data(sel_codebook); + basist::basisu_transcoder transcoder = basist::basisu_transcoder(&sel_codebook); + + const void* dataPtr = reinterpret_cast(data.c_str()); + auto dataSize = data.size(); + basist::basisu_image_info info; + transcoder.get_image_info(dataPtr, dataSize, info, 0 /* image_index */); + + auto buffer = std::vector(info.m_width * info.m_height * 4); + auto ok = transcoder.transcode_image_level(dataPtr, dataSize, + /* image_index */ 0, /* level_index */ 0, + buffer.data(), buffer.size() / 4, + basist::transcoder_texture_format::cTFRGBA32); + if (!ok) { + return val(std::string("Could not decode")); + } + + auto img_data_data = Uint8ClampedArray.new_(typed_memory_view(buffer.size(), buffer.data())); + auto imgData = ImageData.new_(img_data_data, info.m_width, info.m_height); + return imgData; +} + +EMSCRIPTEN_BINDINGS(my_module) { + // value_object("MozJpegOptions") + // .field("quality", &MozJpegOptions::quality) + // .field("baseline", &MozJpegOptions::baseline) + // .field("arithmetic", &MozJpegOptions::arithmetic) + // .field("progressive", &MozJpegOptions::progressive) + // .field("optimize_coding", &MozJpegOptions::optimize_coding) + // .field("smoothing", &MozJpegOptions::smoothing) + // .field("color_space", &MozJpegOptions::color_space) + // .field("quant_table", &MozJpegOptions::quant_table) + // .field("trellis_multipass", &MozJpegOptions::trellis_multipass) + // .field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero) + // .field("trellis_opt_table", &MozJpegOptions::trellis_opt_table) + // .field("trellis_loops", &MozJpegOptions::trellis_loops) + // .field("chroma_subsample", &MozJpegOptions::chroma_subsample) + // .field("auto_subsample", &MozJpegOptions::auto_subsample) + // .field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality) + // .field("chroma_quality", &MozJpegOptions::chroma_quality); + + function("decode", &decode); +}