Skip to content

Commit d87eff7

Browse files
authored
Adding the Quite OK Image (QOI) Codec (#1384)
1 parent f374068 commit d87eff7

File tree

19 files changed

+295
-0
lines changed

19 files changed

+295
-0
lines changed

codecs/qoi/Makefile

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
CODEC_URL = https://github.com/phoboslab/qoi/archive/8d35d93cdca85d2868246c2a8a80a1e2c16ba2a8.tar.gz
2+
3+
CODEC_DIR = node_modules/qoi
4+
CODEC_BUILD_DIR:= $(CODEC_DIR)/build
5+
ENVIRONMENT = worker
6+
7+
OUT_JS = enc/qoi_enc.js dec/qoi_dec.js
8+
OUT_WASM := $(OUT_JS:.js=.wasm)
9+
10+
.PHONY: all clean
11+
12+
all: $(OUT_JS)
13+
14+
$(filter enc/%,$(OUT_JS)): enc/qoi_enc.o
15+
$(filter dec/%,$(OUT_JS)): dec/qoi_dec.o
16+
17+
# ALL .js FILES
18+
$(OUT_JS):
19+
$(LD) \
20+
$(LDFLAGS) \
21+
--bind \
22+
-s ENVIRONMENT=$(ENVIRONMENT) \
23+
-s EXPORT_ES6=1 \
24+
-o $@ \
25+
$+
26+
27+
# ALL .o FILES
28+
%.o: %.cpp $(CODEC_DIR)
29+
$(CXX) -c \
30+
$(CXXFLAGS) \
31+
-I $(CODEC_DIR) \
32+
-o $@ \
33+
$<
34+
35+
# CREATE DIRECTORY
36+
$(CODEC_DIR):
37+
mkdir -p $(CODEC_DIR)
38+
curl -sL $(CODEC_URL) | tar xz --strip 1 -C $(CODEC_DIR)
39+
40+
clean:
41+
$(RM) $(OUT_JS) $(OUT_WASM)
42+
$(MAKE) -C $(CODEC_DIR) clean

codecs/qoi/dec/qoi_dec.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <emscripten/bind.h>
2+
#include <emscripten/val.h>
3+
4+
#define QOI_IMPLEMENTATION
5+
#include "qoi.h"
6+
7+
using namespace emscripten;
8+
9+
thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray");
10+
thread_local const val ImageData = val::global("ImageData");
11+
12+
val decode(std::string qoiimage) {
13+
qoi_desc desc;
14+
uint8_t* rgba = (uint8_t*)qoi_decode(qoiimage.c_str(), qoiimage.length(), &desc, 4);
15+
16+
// Resultant width and height stored in descriptor
17+
int decodedWidth = desc.width;
18+
int decodedHeight = desc.height;
19+
20+
val result = ImageData.new_(
21+
Uint8ClampedArray.new_(typed_memory_view(4 * decodedWidth * decodedHeight, rgba)),
22+
decodedWidth, decodedHeight);
23+
free(rgba);
24+
25+
return result;
26+
}
27+
28+
EMSCRIPTEN_BINDINGS(my_module) {
29+
function("decode", &decode);
30+
}

codecs/qoi/dec/qoi_dec.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface QOIModule extends EmscriptenWasm.Module {
2+
decode(data: BufferSource): ImageData | null;
3+
}
4+
5+
declare var moduleFactory: EmscriptenWasm.ModuleFactory<QOIModule>;
6+
7+
export default moduleFactory;

codecs/qoi/dec/qoi_dec.js

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codecs/qoi/dec/qoi_dec.wasm

16.1 KB
Binary file not shown.

codecs/qoi/enc/qoi_enc.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <emscripten/bind.h>
2+
#include <emscripten/val.h>
3+
4+
#define QOI_IMPLEMENTATION
5+
#include "qoi.h"
6+
7+
using namespace emscripten;
8+
9+
struct QoiOptions {};
10+
11+
thread_local const val Uint8Array = val::global("Uint8Array");
12+
13+
val encode(std::string buffer, int width, int height, QoiOptions options) {
14+
int compressedSizeInBytes;
15+
qoi_desc desc;
16+
desc.width = width;
17+
desc.height = height;
18+
desc.channels = 4;
19+
desc.colorspace = QOI_SRGB;
20+
21+
uint8_t* encodedData = (uint8_t*)qoi_encode(buffer.c_str(), &desc, &compressedSizeInBytes);
22+
if (encodedData == NULL)
23+
return val::null();
24+
25+
auto js_result =
26+
Uint8Array.new_(typed_memory_view(compressedSizeInBytes, (const uint8_t*)encodedData));
27+
free(encodedData);
28+
29+
return js_result;
30+
}
31+
32+
EMSCRIPTEN_BINDINGS(my_module) {
33+
value_object<QoiOptions>("QoiOptions");
34+
35+
function("encode", &encode);
36+
}

codecs/qoi/enc/qoi_enc.d.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export interface EncodeOptions {}
2+
3+
export interface QoiModule extends EmscriptenWasm.Module {
4+
encode(
5+
data: BufferSource,
6+
width: number,
7+
height: number,
8+
options: EncodeOptions,
9+
): Uint8Array;
10+
}
11+
12+
declare var moduleFactory: EmscriptenWasm.ModuleFactory<QoiModule>;
13+
14+
export default moduleFactory;

codecs/qoi/enc/qoi_enc.js

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codecs/qoi/enc/qoi_enc.wasm

16.2 KB
Binary file not shown.

codecs/qoi/package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "qoi",
3+
"scripts": {
4+
"build": "../build-cpp.sh"
5+
}
6+
}
7+

0 commit comments

Comments
 (0)