Skip to content

Commit 19e0c7f

Browse files
committed
Add buffer.setMessageFunc()
1 parent fab5b66 commit 19e0c7f

2 files changed

Lines changed: 34 additions & 13 deletions

File tree

hb.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ _hb_buffer_add_utf16
66
_hb_buffer_add_utf8
77
_hb_buffer_add_codepoints
88
_hb_buffer_create
9+
_hb_buffer_reference
910
_hb_buffer_destroy
1011
_hb_buffer_get_glyph_infos
1112
_hb_buffer_get_glyph_positions

hbjs.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -955,9 +955,10 @@ function hbjs(Module) {
955955

956956
/**
957957
* Create an object representing a Harfbuzz buffer.
958+
* @param {number} ptr Optional. The pointer to the buffer.
958959
**/
959-
function createBuffer() {
960-
var ptr = exports.hb_buffer_create();
960+
function createBuffer(ptr) {
961+
var ptr = ptr ? exports.hb_buffer_reference(ptr) : exports.hb_buffer_create();
961962
return {
962963
ptr: ptr,
963964
/**
@@ -1054,6 +1055,30 @@ function hbjs(Module) {
10541055
exports.hb_buffer_set_cluster_level(ptr, level)
10551056
},
10561057
/**
1058+
* Set message func.
1059+
* @param {function} func The function to set.
1060+
*
1061+
* The function should accept three arguments:
1062+
* @param {object} buffer The buffer
1063+
* @param {object} font The font
1064+
* @param {string} message The message
1065+
*
1066+
* Returning false from this function will skip this shaping step and move to the next one.
1067+
*/
1068+
setMessageFunc: function (func) {
1069+
var traceFunc = function (bufferPtr, fontPtr, messagePtr, user_data) {
1070+
var message = _utf8_ptr_to_string(messagePtr);
1071+
var buffer = createBuffer(bufferPtr);
1072+
var font = createFont(null, fontPtr);
1073+
var result = func(buffer, font, message);
1074+
buffer.destroy();
1075+
font.destroy();
1076+
return result ? 1 : 0;
1077+
}
1078+
var traceFuncPtr = addFunction(traceFunc, 'iiiii');
1079+
exports.hb_buffer_set_message_func(ptr, traceFuncPtr, 0, 0);
1080+
},
1081+
/**
10571082
* Serialize the buffer contents to a string.
10581083
* @param {object} font Optional. The font to use for serialization.
10591084
* @param {number} start Optional. The starting index of the glyphs to serialize.
@@ -1167,8 +1192,7 @@ function hbjs(Module) {
11671192
var stopping = false;
11681193
var failure = false;
11691194

1170-
var traceFunc = function (bufferPtr, fontPtr, messagePtr, user_data) {
1171-
var message = _utf8_ptr_to_string(messagePtr);
1195+
buffer.setMessageFunc((buffer, font, message) => {
11721196
if (message.startsWith("start table GSUB"))
11731197
currentPhase = TRACE_PHASE_GSUB;
11741198
else if (message.startsWith("start table GPOS"))
@@ -1178,30 +1202,26 @@ function hbjs(Module) {
11781202
stopping = false;
11791203

11801204
if (failure)
1181-
return 1;
1205+
return true;
11821206

11831207
if (stop_phase != TRACE_PHASE_DONT_STOP && currentPhase == stop_phase && message.startsWith("end lookup " + stop_at))
11841208
stopping = true;
11851209

11861210
if (stopping)
1187-
return 0;
1211+
return false;
11881212

11891213
var traceBuf = buffer.serialize(font, 0, null, "JSON", ["noGlyphNames"]);
11901214

11911215
trace.push({
11921216
m: message,
11931217
t: JSON.parse(traceBuf),
1194-
glyphs: exports.hb_buffer_get_content_type(bufferPtr) == HB_BUFFER_CONTENT_TYPE_GLYPHS,
1218+
glyphs: exports.hb_buffer_get_content_type(buffer.ptr) == HB_BUFFER_CONTENT_TYPE_GLYPHS,
11951219
});
11961220

1197-
return 1;
1198-
}
1221+
return true;
1222+
});
11991223

1200-
var traceFuncPtr = addFunction(traceFunc, 'iiiii');
1201-
exports.hb_buffer_set_message_func(buffer.ptr, traceFuncPtr, 0, 0);
12021224
shape(font, buffer, features, 0);
1203-
removeFunction(traceFuncPtr);
1204-
12051225
return trace;
12061226
}
12071227

0 commit comments

Comments
 (0)