static int init_libthai() { if (!th_brk || !th_next_cell || !th_render_cell_tis || !th_render_cell_win || !th_render_cell_mac) { th_brk = (th_brk_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_brk"); th_next_cell = (th_next_cell_def)HB_Library_Resolve("thai", LIBTHAI_MAJOR, "th_next_cell"); th_render_cell_tis = (th_render_cell_tis_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_tis"); th_render_cell_win = (th_render_cell_win_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_win"); th_render_cell_mac = (th_render_cell_mac_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_mac"); } if (th_brk && th_next_cell && th_render_cell_tis && th_render_cell_win && th_render_cell_mac) return 1; else return 0; }
static void thaiWordBreaks(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes) { typedef int (*th_brk_def)(const char*, int[], int); static void *thaiCodec = 0; static th_brk_def th_brk = 0; char *cstr = 0; int brp[128]; int *break_positions = brp; hb_uint32 numbreaks; hb_uint32 i; if (!thaiCodec) thaiCodec = HB_TextCodecForMib(2259); /* load libthai dynamically */ if (!th_brk && thaiCodec) { th_brk = (th_brk_def)HB_Library_Resolve("thai", "th_brk"); if (!th_brk) thaiCodec = 0; } if (!th_brk) return; cstr = HB_TextCodec_ConvertFromUnicode(thaiCodec, string, len, 0); if (!cstr) return; break_positions = brp; numbreaks = th_brk(cstr, break_positions, 128); if (numbreaks > 128) { break_positions = (int *)malloc(numbreaks * sizeof(int)); numbreaks = th_brk(cstr, break_positions, numbreaks); } for (i = 0; i < len; ++i) attributes[i].lineBreakType = HB_NoBreak; for (i = 0; i < numbreaks; ++i) { if (break_positions[i] > 0) attributes[break_positions[i]-1].lineBreakType = HB_Break; } if (break_positions != brp) free(break_positions); HB_TextCodec_FreeResult(cstr); }
static void resolve_libthai() { if (!th_brk) th_brk = (th_brk_def)HB_Library_Resolve("thai", 0, "th_brk"); libthai_resolved = 1; }