int BC_Toggle::initialize() { // Get the image set_images(data); calculate_extents(this, data, bottom_justify, &text_line, &w, &h, &toggle_x, &toggle_y, &text_x, &text_y, &text_w, &text_h, has_caption() ? caption : 0); // Create the subwindow BC_SubWindow::initialize(); set_cursor(UPRIGHT_ARROW_CURSOR); // Display the bitmap draw_face(); return 0; }
int shape (lua_State *L) { const char * text = luaL_checkstring(L, 1); FT_Face face = lua_touserdata(L, 2); const char * script = luaL_checkstring(L, 3); const char * direction_s = luaL_checkstring(L, 4); const char * lang = luaL_checkstring(L, 5); double point_size = luaL_checknumber(L, 6); const char * featurestring = luaL_checkstring(L, 7); hb_segment_properties_t segment_props; hb_shape_plan_t *shape_plan; hb_direction_t direction; hb_feature_t* features; int nFeatures = 0; unsigned int glyph_count = 0; hb_font_t *hb_ft_font; hb_face_t *hb_ft_face; hb_buffer_t *buf; hb_glyph_info_t *glyph_info; hb_glyph_position_t *glyph_pos; unsigned int j; features = scan_feature_string(featurestring, &nFeatures); if (!strcasecmp(direction_s,"RTL")) direction = HB_DIRECTION_RTL; else if (!strcasecmp(direction_s,"TTB")) direction = HB_DIRECTION_TTB; else direction = HB_DIRECTION_LTR; hb_ft_font = hb_ft_font_create(face, NULL); hb_face_t* hbFace = hb_font_get_face(hb_ft_font); buf = hb_buffer_create(); hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text)); hb_buffer_set_script(buf, hb_tag_from_string(script, strlen(script))); hb_buffer_set_direction(buf, direction); hb_buffer_set_language(buf, hb_language_from_string(lang,strlen(lang))); hb_buffer_guess_segment_properties(buf); hb_buffer_get_segment_properties(buf, &segment_props); shape_plan = hb_shape_plan_create_cached(hbFace, &segment_props, features, nFeatures, NULL); int res = hb_shape_plan_execute(shape_plan, hb_ft_font, buf, features, nFeatures); glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); lua_checkstack(L, glyph_count); for (j = 0; j < glyph_count; ++j) { char namebuf[255]; box glyph_extents = { 0.0, 0.0, 0.0 }; calculate_extents(&glyph_extents, glyph_info[j], glyph_pos[j], face, point_size, direction); lua_newtable(L); lua_pushstring(L, "name"); FT_Get_Glyph_Name( face, glyph_info[j].codepoint, namebuf, 255 ); lua_pushstring(L, namebuf); lua_settable(L, -3); if (direction != HB_DIRECTION_TTB) { /* XXX */ if (glyph_pos[j].x_offset) { lua_pushstring(L, "x_offset"); lua_pushnumber(L, glyph_pos[j].x_offset / 64.0); lua_settable(L, -3); } if (glyph_pos[j].y_offset) { lua_pushstring(L, "y_offset"); lua_pushnumber(L, glyph_pos[j].y_offset / 64.0); lua_settable(L, -3); } } lua_pushstring(L, "codepoint"); lua_pushinteger(L, glyph_info[j].codepoint); lua_settable(L, -3); lua_pushstring(L, "width"); lua_pushnumber(L, glyph_extents.width); lua_settable(L, -3); lua_pushstring(L, "height"); lua_pushnumber(L, glyph_extents.height); lua_settable(L, -3); lua_pushstring(L, "depth"); lua_pushnumber(L, glyph_extents.depth); lua_settable(L, -3); } /* Cleanup */ hb_buffer_destroy(buf); hb_font_destroy(hb_ft_font); hb_shape_plan_destroy(shape_plan); free(features); return glyph_count; }