Hi,

I just coded my first working Windows example with harfbuzz (code attached). I got my first thai characters to be shaped into glyphs (at least I got the same output as hb-shape). But I don't really feel like I understood anything:

1) What is a blob and how come I didn't need to know what it is?

2) I created a hb_ft_font and passed it to the shaper but, shouldn't I also call hb_ft_font_set_funcs in order to use hb-ft as font instance?

3) How does harfbuzz manage to get the GSUB/GPOS tables of the fonts if everything I provided was a FT_Face? I don't see anything related to those tables in hb-ft, and AFAIK FT2 does not provide tools to extract those tables. Is it opening the font file by itself?

4) What is get_ft_library for? Should I be calling it instead of FT_Init_FreeType?

Thanks!
#include <string.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include <hb.h>
#include <assert.h>
#include <hb-ft.h>

#define MAX_CHARS 2048

int loadUcsFile(char* filename, uint16_t* buf){
        FILE* fp;
        fp = fopen (filename, "r");
        int count = fread(buf, sizeof(uint16_t), MAX_CHARS, fp);
        buf[count] = (uint16_t)0;
        fclose(fp);
        return count;
        }

void loadFTFace(char* filename, FT_Face& ft_face){
        FT_Library ft_library;
    assert(!FT_Init_FreeType(&ft_library));

    /* Load our fonts */
        assert(!FT_New_Face(ft_library, "C:/Windows/fonts/leelawad.ttf", 0, 
&ft_face));
    assert(!FT_Set_Char_Size(ft_face, 0, 50*64, 72, 72 ));
        FT_Set_Charmap(ft_face, 0);
        //FT_Done_FreeType(ft_library);
        }

void printGlyphs(hb_glyph_info_t *glyph_info, 
                                 hb_glyph_position_t *glyph_pos,
                                 unsigned int         glyph_count){
        for (int i = 0; i < glyph_count; i++){
                printf("[%4x] Adv(%4d, %4d) Ofs(%4d, %4d)\n", 
glyph_info[i].codepoint, 
                                                                                
                 glyph_pos[i].x_advance,
                                                                                
                 glyph_pos[i].y_advance,
                                                                                
                 glyph_pos[i].x_offset,
                                                                                
                 glyph_pos[i].y_offset);
                }
        }

int main (int argc, char **argv){
        uint16_t buf[MAX_CHARS];
        int count = loadUcsFile("line.txt", buf);
    FT_Face ft_face;
        hb_font_t *hb_ft_font;

        loadFTFace("C:/Windows/fonts/leelawad.ttf", ft_face);
        hb_ft_font = hb_ft_font_create(ft_face, NULL);
         
        hb_buffer_t *buffer = hb_buffer_create ();      
        hb_buffer_set_direction(buffer, HB_DIRECTION_LTR); 
        hb_buffer_set_script(buffer, HB_SCRIPT_THAI);
        hb_buffer_set_language(buffer, hb_language_from_string("th", 
strlen("th"))); // see hb-ot-tag.cc
        // hb_buffer_guess_segment_properties(buffer);

        hb_buffer_add_utf16(buffer, buf, count, 0, count);
        hb_shape(hb_ft_font, buffer, NULL, 0);

    unsigned int         glyph_count;
    hb_glyph_info_t     *glyph_info   = hb_buffer_get_glyph_infos(buffer, 
&glyph_count);
    hb_glyph_position_t *glyph_pos    = hb_buffer_get_glyph_positions(buffer, 
&glyph_count);

        printGlyphs(glyph_info, glyph_pos, glyph_count);

        hb_buffer_destroy (buffer);
        }
_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to