harfbuzzjs
Version:
Minimal version of HarfBuzz for JavaScript use
65 lines (55 loc) • 2.21 kB
HTML
<script src="../hb.js"></script>
<script>
var utf8Encoder = new TextEncoder("utf8");
let harfBuzzModule;
createHarfBuzz().then(hbmodule=>{
harfBuzzModule = hbmodule;
var exports = hbmodule.wasmExports;
fetch('../test/fonts/noto/NotoSans-Regular.ttf').then(function (x) {
return x.arrayBuffer();
}).then(function (fontBlob) {
var heapu8 = new Uint8Array(exports.memory.buffer);
var heapu32 = new Uint32Array(exports.memory.buffer);
var heapi32 = new Int32Array(exports.memory.buffer);
var fontBuffer = exports.malloc(fontBlob.byteLength);
heapu8.set(new Uint8Array(fontBlob), fontBuffer);
var blob = exports.hb_blob_create(fontBuffer, fontBlob.byteLength, 2/*HB_MEMORY_MODE_WRITABLE*/, 0, 0);
var face = exports.hb_face_create(blob, 0);
var font = exports.hb_font_create(face);
var buffer = exports.hb_buffer_create();
{
var text = utf8Encoder.encode('abc');
var text_ptr = exports.malloc(text.byteLength);
heapu8.set(text, text_ptr);
exports.hb_buffer_add_utf8(buffer, text_ptr, text.byteLength, 0, -1);
exports.free(text_ptr);
}
exports.hb_buffer_guess_segment_properties(buffer);
// exports.hb_buffer_set_direction(5); 4: ltr, 5: rtl, 6: ttb. 7: btt
exports.hb_shape(font, buffer, 0, 0);
var length = exports.hb_buffer_get_length(buffer);
var result = [];
var infosPtr32 = exports.hb_buffer_get_glyph_infos(buffer, 0) / 4;
var positionsPtr32 = exports.hb_buffer_get_glyph_positions(buffer, 0) / 4;
var infos = heapu32.subarray(infosPtr32, infosPtr32 + 5 * length);
var positions = heapi32.subarray(positionsPtr32, positionsPtr32 + 5 * length);
for (var i = 0; i < length; ++i) {
result.push({
g: infos[i * 5 + 0],
cl: infos[i * 5 + 2],
ax: positions[i * 5 + 0],
ay: positions[i * 5 + 1],
dx: positions[i * 5 + 2],
dy: positions[i * 5 + 3]
});
}
exports.hb_buffer_destroy(buffer);
exports.hb_font_destroy(font);
exports.hb_face_destroy(face);
exports.hb_blob_create(blob);
exports.free(fontBuffer);
document.body.innerText = JSON.stringify(result);
});
});
</script>