@@ -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