local hb = require("luaharfbuzz") -- special tags hb.Tag.NONE = hb.Tag.new() -- special script codes (ISO 15924) hb.Script.COMMON = hb.Script.new("Zyyy") hb.Script.INHERITED = hb.Script.new("Zinh") hb.Script.UNKNOWN = hb.Script.new("Zzzz") hb.Script.INVALID = hb.Script.from_iso15924_tag(hb.Tag.NONE) -- directions hb.Direction.INVALID = hb.Direction.new("invalid") hb.Direction.LTR = hb.Direction.new("ltr") hb.Direction.RTL = hb.Direction.new("rtl") hb.Direction.TTB = hb.Direction.new("ttb") hb.Direction.BTT = hb.Direction.new("btt") -- special languages hb.Language.INVALID = hb.Language.new() hb.shape = function(font, buf, options) options = options or { } -- Apply options to buffer if they are set. if options.language then buf:set_language(options.language) end if options.script then buf:set_script(options.script) end if options.direction then buf:set_direction(options.direction) end -- Guess segment properties, in case all steps above have failed -- to set the right properties. buf:guess_segment_properties() local features = {} -- Parse features if type(options.features) == "string" then for fs in string.gmatch(options.features, '([^,]+)') do local feature = hb.Feature.new(fs) if feature then table.insert(features, hb.Feature.new(fs)) else error(string.format("Invalid feature string: '%s'", fs)) end end elseif type(options.features) == "table" then features = options.features elseif options.features then -- non-nil but not a string or table error("Invalid features option") end return hb.shape_full(font,buf,features,options.shapers or {}) end -- For backward compatibility hb.Buffer.HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES = hb.Buffer.CLUSTER_LEVEL_MONOTONE_GRAPHEMES hb.Buffer.HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS = hb.Buffer.CLUSTER_LEVEL_MONOTONE_CHARACTERS hb.Buffer.HB_BUFFER_CLUSTER_LEVEL_CHARACTERS = hb.Buffer.CLUSTER_LEVEL_CHARACTERS hb.Buffer.HB_BUFFER_CLUSTER_LEVEL_DEFAULT = hb.Buffer.CLUSTER_LEVEL_DEFAULT hb.Tag.HB_TAG_NONE = hb.Tag.NONE hb.Script.HB_SCRIPT_COMMON = hb.Script.COMMON hb.Script.HB_SCRIPT_INHERITED = hb.Script.INHERITED hb.Script.HB_SCRIPT_UNKNOWN = hb.Script.UNKNOWN hb.Script.HB_SCRIPT_INVALID = hb.Script.INVALID hb.Language.HB_LANGUAGE_INVALID = hb.Language.INVALID hb.Direction.HB_DIRECTION_INVALID = hb.Direction.INVALID hb.Direction.HB_DIRECTION_LTR = hb.Direction.LTR hb.Direction.HB_DIRECTION_RTL = hb.Direction.RTL hb.Direction.HB_DIRECTION_TTB = hb.Direction.TTB hb.Direction.HB_DIRECTION_BTT = hb.Direction.BTT hb.Direction.HB_DIRECTION_IS_VALID = hb.Direction.is_valid hb.Direction.HB_DIRECTION_IS_HORIZONTAL = hb.Direction.is_horizontal hb.Direction.HB_DIRECTION_IS_VERTICAL = hb.Direction.is_vertical hb.Direction.HB_DIRECTION_IS_FORWARD = hb.Direction.is_forward hb.Direction.HB_DIRECTION_IS_BACKWARD = hb.Direction.is_backward hb.Buffer.get_glyph_infos_and_positions = hb.Buffer.get_glyphs return hb