[HarfBuzz] Building harfbuzz-ng using Android NDK

Behdad Esfahbod behdad at behdad.org
Fri Jun 8 15:58:55 PDT 2012


Hi Shiva,

Thanks for the pointers!

behdad

On 06/05/2012 02:10 AM, Shiva Kumar H R wrote:
> 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 <shivahr at gmail.com
> <mailto:shivahr at gmail.com>> 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/ <http://people.apache.org/%7Eshivahr/>
> 
>     On Fri, Sep 16, 2011 at 5:05 PM, Shiva Kumar H R <shivahr at gmail.com
>     <mailto:shivahr at gmail.com>> 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 <shivahr at gmail.com
>         <mailto:shivahr at gmail.com>> 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/
>             <http://people.apache.org/%7Eshivahr/>
> 
> 
> 
> 
> 
> 
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/harfbuzz



More information about the HarfBuzz mailing list