Hello, HarfBuzz Here's the simplest HarfBuzz that can possibly work. We will improve it later. Create a buffer and put your text in it. #include <hb.h> hb_buffer_t *buf; buf = hb_buffer_create(); hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text)); Guess the script, language and direction of the buffer. hb_buffer_guess_segment_properties(buf); Create a face and a font, using FreeType for now. #include <hb-ft.h> FT_New_Face(ft_library, font_path, index, &face) hb_font_t *font = hb_ft_font_create(face); Shape! hb_shape(font, buf, NULL, 0); Get the glyph and position information. hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); Iterate over each glyph. for (i = 0; i < glyph_count; ++i) { glyphid = glyph_info[i].codepoint; x_offset = glyph_pos[i].x_offset / 64.0; y_offset = glyph_pos[i].y_offset / 64.0; x_advance = glyph_pos[i].x_advance / 64.0; y_advance = glyph_pos[i].y_advance / 64.0; draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); cursor_x += x_advance; cursor_y += y_advance; } Tidy up. hb_buffer_destroy(buf); hb_font_destroy(hb_ft_font); This example shows enough to get us started using HarfBuzz. Now we are going to use the remainder of HarfBuzz's API to refine that example and improve our text shaping capabilities.