The Android widget that I had created sometime ago, that allows Indic text to be rendered on an Android phone at an application level (without having to root the phone), by making use of HarfBuzz-ng and FreeType libraries, is open-sourced on http://code.google.com/p/indic-text-renderer/ .
-- Thanks & Regards, Shiva Kumar H R On Wed, Sep 21, 2011 at 10:29 PM, Shiva Kumar H R <[email protected]> wrote: > Hi, > I am glad to inform that I could use HarfBuzz-ng and FreeType to render > Indic text on Android Canvas. > > Thank you for creating such an elegant lightweight library. > > I referred https://github.com/anoek/ex-sdl-cairo-freetype-harfbuzz to > come up with my sample program, the essence of which looks as below: > > ---- start of indic-text-rendering code snippet ----- > > #include <hb-ft.h> > ... > void drawIndicText(unsigned short* text, int textLength, int xStart, int > yBaseLine, int charHeight) { > FT_Library ft_library; > FT_Init_FreeType(&ft_library); /* initialize library */ > > char* fontFilePath = > "/sdcard/Android/data/org.iisc.mile.indictext.android/Lohit-Kannada.ttf"; > FT_Face ft_face; > FT_New_Face(ft_library, fontFilePath, 0, &ft_face); /* create face > object */ > > hb_font_t *font = hb_ft_font_create(ft_face, NULL); > > FT_Set_Pixel_Sizes(ft_face, 0, charHeight); /* set character size */ > > /* Create a buffer for harfbuzz to use */ > hb_buffer_t *buffer = hb_buffer_create(); > > //hb_buffer_set_direction(buffer, HB_DIRECTION_LTR); /* or LTR */ > hb_buffer_set_script(buffer, HB_SCRIPT_KANNADA); /* see hb-unicode.h */ > //hb_buffer_set_language(buffer, hb_language_from_string("ka")); > > /* Layout the text */ > hb_buffer_add_utf16(buffer, text, textLength, 0, textLength); > hb_ot_shape(font, buffer, NULL, 0, 0); > > int glyph_count = hb_buffer_get_length(buffer); > hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buffer, 0); > hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buffer, > 0); > > for (int i = 0; i < glyph_count; i++) { > FT_UInt glyph_index = glyph_info[i].codepoint; > FT_Error error = FT_Load_Glyph(ft_face, glyph_index, > FT_LOAD_DEFAULT); > if (error) { > continue; /* ignore errors */ > } > /* convert to an anti-aliased bitmap */ > error = FT_Render_Glyph(ft_face->glyph, FT_RENDER_MODE_NORMAL); > if (error) { > continue; > } > > /* now, draw to our target surface (convert position) */ > FT_GlyphSlot slot = ft_face->glyph; > draw_bitmap(&slot->bitmap, xStart + slot->bitmap_left, yBaseLine - > slot->bitmap_top); > int glyphPosX = xStart + glyph_pos[i].x_offset; > int glyphPosY = yBaseLine - glyph_pos[i].y_offset; > //draw_bitmap(&slot->bitmap, glyphPosX, glyphPosY, env, thiz, > lock); > > /* increment pen position */ > xStart += slot->advance.x >> 6; > //xStart += glyph_pos[i].x_advance / 64; > } > > hb_buffer_destroy(buffer); > > hb_font_destroy(font); > FT_Done_Face(ft_face); > FT_Done_FreeType(ft_library); > > return; > } > ... > ---- end of indic-text-rendering code snippet ----- > > Few things I noticed: > 1) I had earlier used hb_shape() but that didn't work. It worked when I > used hb_ot_shape(). Is this by design? > > 2) There are a few errors in the sequence of glyphs returned by HarfBuzz > for certain Kannada language words. In the attached snapshot, words in > second edit-box are not rendered properly. Where should I report these > errors and in what format? > > I see a test case in > http://cgit.freedesktop.org/harfbuzz/tree/test/test-shape-complex.c . But > I couldn't figure out how to run this. Simply running > test-shape-complex.exe didn't help. Are there some instructions that I can > look at? > > > -- > Thanks & Regards, > Shiva Kumar H R > http://people.apache.org/~shivahr/ > > On Fri, Sep 16, 2011 at 5:05 PM, Shiva Kumar H R <[email protected]>wrote: > >> I have used a simple Android.mk as below and got the HarfBuzz to build on >> Android NDK. I got below warnings though. >> >> harfbuzz-ng/src/hb-object-private.hh:74:2: warning: #warning "Could not >> find any system to define atomic_int macros, library will NOT be >> thread-safe" >> >> Android.mk: >> ------Begin of Android.mk------- >> BASE_PATH := $(call my-dir) >> LOCAL_PATH:= $(call my-dir) >> >> ############################################################# >> # build the harfbuzz library >> # >> >> include $(CLEAR_VARS) >> >> LOCAL_ARM_MODE := arm >> >> LOCAL_MODULE_TAGS := optional >> >> LOCAL_CPP_EXTENSION := .cc >> >> LOCAL_SRC_FILES:= \ >> src/hb-blob.cc \ >> src/hb-buffer.cc \ >> src/hb-common.cc \ >> src/hb-fallback-shape.cc \ >> src/hb-font.cc \ >> src/hb-ot-tag.cc \ >> src/hb-shape.cc \ >> src/hb-tt-font.cc \ >> src/hb-unicode.cc \ >> src/hb-ot-layout.cc \ >> src/hb-ot-map.cc \ >> src/hb-ot-shape.cc \ >> src/hb-ot-shape-complex-arabic.cc \ >> src/hb-ot-shape-complex-indic.cc \ >> src/hb-ot-shape-complex-misc.cc \ >> src/hb-ot-shape-normalize.cc \ >> src/hb-ft.cc \ >> >> LOCAL_C_INCLUDES += \ >> $(LOCAL_PATH)/src $(LOCAL_PATH)/../freetype/include >> >> LOCAL_MODULE:= libharfbuzz >> >> LOCAL_STATIC_LIBRARIES := ft2 >> >> include $(BUILD_SHARED_LIBRARY) >> >> ------End of Android.mk------- >> >> >> Yet to write a sample program and see if it is actually working. >> >> >> -- >> Thanks & Regards, >> Shiva Kumar H R >> >> >> On Fri, Sep 16, 2011 at 3:26 PM, Shiva Kumar H R <[email protected]>wrote: >> >>> Hi, >>> Is it possible to build harfbuzz-ng using Android-NDK. If yes, are there >>> any instructions that I can look at? >>> >>> I came across Android.mk in >>> http://tools.impjq.net/android/external/harfbuzz/ , but this seems to >>> be the old Harfbuzz tree and has a dependency on ICU4C. >>> >>> -- >>> Thanks & Regards, >>> Shiva Kumar H R >>> http://people.apache.org/~shivahr/ >>> >> >> >
_______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
