@@ -49,6 +49,19 @@ function hbjs(Module) {
4949 return 0x0 ;
5050 }
5151
52+ function _language_to_string ( language ) {
53+ var ptr = exports . hb_language_to_string ( language ) ;
54+ var str = utf8Decoder . decode ( Module . HEAPU8 . subarray ( ptr , Module . HEAPU8 . indexOf ( 0 , ptr ) ) ) ;
55+ return str ;
56+ }
57+
58+ function _language_from_string ( str ) {
59+ var languageStr = createAsciiString ( str ) ;
60+ var languagePtr = exports . hb_language_from_string ( languageStr . ptr , - 1 ) ;
61+ languageStr . free ( ) ;
62+ return languagePtr ;
63+ }
64+
5265 /**
5366 * Create an object representing a Harfbuzz blob.
5467 * @param {string } blob A blob of binary data (usually the contents of a font file).
@@ -234,6 +247,41 @@ function hbjs(Module) {
234247 }
235248 return tags ;
236249 } ,
250+ /**
251+ * Return all names in the specified face's name table.
252+ **/
253+ listNames : function ( ) {
254+ var numEntriesPtr = Module . stackAlloc ( 4 ) ;
255+ var entriesPtr = exports . hb_ot_name_list_names ( ptr , numEntriesPtr ) ;
256+ var numEntries = Module . HEAPU32 [ numEntriesPtr / 4 ] ;
257+ var entries = [ ] ;
258+ for ( var i = 0 ; i < numEntries ; i ++ ) {
259+ // FIXME: this depends on the struct memory layout.
260+ // A more robust way would involve ading helper C functions to access
261+ // the struct and use them here.
262+ entries . push ( {
263+ nameId : Module . HEAPU32 [ ( entriesPtr / 4 ) + ( i * 3 ) ] ,
264+ language : _language_to_string ( Module . HEAPU32 [ ( entriesPtr / 4 ) + ( i * 3 ) + 2 ] )
265+ } ) ;
266+ }
267+ return entries ;
268+ } ,
269+ /**
270+ * Get the name of the specified face.
271+ * @param {number } nameId The ID of the name to get.
272+ * @param {string } language The language of the name to get.
273+ **/
274+ getName : function ( nameId , language ) {
275+ var languagePtr = _language_from_string ( language ) ;
276+ var nameLen = exports . hb_ot_name_get_utf16 ( ptr , nameId , languagePtr , 0 , 0 ) + 1 ;
277+ var textSizePtr = Module . stackAlloc ( 4 ) ;
278+ var textPtr = exports . malloc ( nameLen * 2 ) ;
279+ Module . HEAPU32 [ textSizePtr / 4 ] = nameLen ;
280+ exports . hb_ot_name_get_utf16 ( ptr , nameId , languagePtr , textSizePtr , textPtr ) ;
281+ var name = String . fromCharCode . apply ( null , Module . HEAPU16 . subarray ( textPtr / 2 , textPtr / 2 + nameLen - 1 ) ) ;
282+ exports . free ( textPtr ) ;
283+ return name ;
284+ } ,
237285 /**
238286 * Free the object.
239287 */
0 commit comments