LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) : fHbFont(NULL), fHbBuffer(NULL), fTypoFlags(typoFlags) { if (LE_FAILURE(success)) { return; } fHbBuffer = hb_buffer_create (); if (fHbBuffer == hb_buffer_get_empty ()) { success = LE_MEMORY_ALLOCATION_ERROR; return; } hb_buffer_set_unicode_funcs (fHbBuffer, hb_icu_get_unicode_funcs ()); hb_buffer_set_script (fHbBuffer, hb_icu_script_to_script ((UScriptCode) scriptCode)); /* TODO set language */ hb_face_t *face = hb_face_create_for_tables (icu_le_hb_reference_table, (void *) fontInstance, NULL); fHbFont = hb_font_create (face); hb_face_destroy (face); if (fHbFont == hb_font_get_empty ()) { success = LE_MEMORY_ALLOCATION_ERROR; return; } hb_font_set_funcs (fHbFont, icu_le_hb_get_font_funcs (), (void *) fontInstance, NULL); hb_font_set_scale (fHbFont, +from_float (fontInstance->getXPixelsPerEm () * fontInstance->getScaleFactorX ()), -from_float (fontInstance->getYPixelsPerEm () * fontInstance->getScaleFactorY ())); hb_font_set_ppem (fHbFont, fontInstance->getXPixelsPerEm (), fontInstance->getYPixelsPerEm ()); }
hb_buffer_t *hb_buffer_create(void) { hb_buffer_t *buffer = calloc(1, sizeof(*buffer)); if (!buffer) return hb_buffer_get_empty(); hb_atomic_int32_set(&buffer->ref_cnt, 1); buffer->unicode = hb_unicode_funcs_get_empty(); hb_buffer_reset(buffer); return buffer; }
/** * hb_buffer_create: (Xconstructor) * * Creates a new #hb_buffer_t with all properties to defaults. * * Return value: (transfer full): * A newly allocated #hb_buffer_t with a reference count of 1. The initial * reference count should be released with hb_buffer_destroy() when you are done * using the #hb_buffer_t. This function never returns %NULL. If memory cannot * be allocated, a special #hb_buffer_t object will be returned on which * hb_buffer_allocation_successful() returns %false. * * Since: 0.9.2 **/ hb_buffer_t * hb_buffer_create (void) { hb_buffer_t *buffer; if (!(buffer = hb_object_create<hb_buffer_t> ())) return hb_buffer_get_empty (); buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT; buffer->reset (); return buffer; }