summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua')
-rw-r--r--Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua157
1 files changed, 157 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua b/Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua
new file mode 100644
index 00000000000..8ab810e3da4
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/luaharfbuzz/spec/shaping_spec.lua
@@ -0,0 +1,157 @@
+local harfbuzz = require("harfbuzz")
+
+local compare_glyphs_against_fixture = function(glyphs, fixture)
+ local json = require('dkjson')
+ local f = io.open("fixtures/"..fixture)
+ local s = f:read("*all")
+ f:close()
+ local hb_shape_glyphs = json.decode(s)
+ assert.are_equal(#hb_shape_glyphs, #glyphs)
+ for c = 1, #glyphs do
+ local g = glyphs[c]
+ local h = hb_shape_glyphs[c]
+ assert.are_equal(h.g, g.codepoint)
+ assert.are_equal(h.cl, g.cluster)
+ assert.are_equal(h.ax, g.x_advance)
+ assert.are_equal(h.ay, g.y_advance)
+ assert.are_equal(h.dx, g.x_offset)
+ assert.are_equal(h.dy, g.y_offset)
+ assert.are_equal(h.fl, g.flags)
+ end
+end
+
+
+describe("harfbuzz module shaping functions", function()
+ local face = harfbuzz.Face.new('fonts/notonastaliq.ttf')
+ local font = harfbuzz.Font.new(face)
+ local urdu_text = "یہ" -- U+06CC U+06C1
+
+ it("can take a buffer and font and shape it, with output matching hb-shape", function()
+ local buf = harfbuzz.Buffer.new()
+ buf:add_utf8(urdu_text)
+
+ harfbuzz.shape(font, buf)
+ local glyphs = buf:get_glyphs()
+ assert.True(#glyphs > 0)
+
+ -- Compare against output of hb-shape
+ compare_glyphs_against_fixture(glyphs, 'notonastaliq_U06CC_U06C1.json')
+ end)
+
+ it("can take a buffer, font and an options table with script, language and direction settings.", function()
+ local buf = harfbuzz.Buffer.new()
+ buf:add_utf8(urdu_text)
+
+ harfbuzz.shape(font, buf, { language = harfbuzz.Language.new("urd"), script = harfbuzz.Script.new("Arab"), direction = harfbuzz.Direction.HB_DIRECTION_RTL })
+ local glyphs = buf:get_glyphs()
+ assert.True(#glyphs > 0)
+
+ -- Compare against output of hb-shape
+ compare_glyphs_against_fixture(glyphs, 'notonastaliq_U06CC_U06C1.json')
+ end)
+
+ it("can take codepoints, font and an options table with script, language and direction settings. #mac", function()
+ local buf = harfbuzz.Buffer.new()
+ local korean_text = { 0xAC00, 0xB098, 0xB2E4 }
+ buf:add_codepoints(korean_text)
+
+ local face_korean = harfbuzz.Face.new('/Library/Fonts/AppleGothic.ttf')
+ local font_korean = harfbuzz.Font.new(face_korean)
+
+ harfbuzz.shape(font_korean, buf, { language = harfbuzz.Language.new("KOR"), script = harfbuzz.Script.new("hang"), direction = harfbuzz.Direction.HB_DIRECTION_LTR })
+ local glyphs = buf:get_glyphs()
+ assert.True(#glyphs > 0)
+
+ -- Compare against output of hb-shape
+ compare_glyphs_against_fixture(glyphs, 'AppleGothic_korean_issue_22.json')
+ end)
+
+ it("can take a string containing a comma-delimited list of valid features", function()
+ local buf = harfbuzz.Buffer.new()
+ buf:add_utf8(urdu_text)
+
+ harfbuzz.shape(font, buf, { language = harfbuzz.Language.new("urd"), script = harfbuzz.Script.new("Arab"), direction = harfbuzz.Direction.HB_DIRECTION_RTL, features = "+kern,smcp" })
+ local glyphs = buf:get_glyphs()
+ assert.True(#glyphs > 0)
+ end)
+
+ describe("features option", function()
+ local buf
+ local options
+
+ before_each(function()
+ buf= harfbuzz.Buffer.new()
+ buf:add_utf8(urdu_text)
+ options = { language = harfbuzz.Language.new("urd"), script = harfbuzz.Script.new("Arab"), direction = harfbuzz.Direction.HB_DIRECTION_RTL }
+ end)
+
+ it("can take a table containing a valid features", function()
+ options.features = {
+ harfbuzz.Feature.new('+kern'),
+ harfbuzz.Feature.new('smcp')
+ }
+
+ harfbuzz.shape(font, buf, options)
+ local glyphs = buf:get_glyphs()
+ assert.True(#glyphs > 0)
+ end)
+
+ it("throws an error if feature string is invalid", function()
+ options.features = "#kern"
+ assert.has_error(function()
+ harfbuzz.shape(font, buf, options)
+ end, "Invalid feature string: '#kern'")
+ end)
+
+ it("throws an error if feature option is not a table or string", function()
+ options.features = 25
+ assert.has_error(function()
+ harfbuzz.shape(font, buf, options)
+ end, "Invalid features option")
+ end)
+
+ it("throws an error if features table does not contain a feature", function()
+ options.features = {
+ harfbuzz.Feature.new('+kern'),
+ 25,
+ harfbuzz.Feature.new('smcp')
+ }
+ assert.has_error(function()
+ harfbuzz.shape(font, buf, options)
+ end, "bad argument #-1 to 'shape_full' (harfbuzz.Feature expected, got number)")
+ end)
+
+ it("shapes a string appropriately with the features turned on",function()
+ buf= harfbuzz.Buffer.new()
+ buf:add_utf8("123")
+ local opts = { language = harfbuzz.Language.new("eng"), script = harfbuzz.Script.new("Latn"), direction = harfbuzz.Direction.HB_DIRECTION_LTR }
+ local amiri_face = harfbuzz.Face.new('fonts/amiri-regular.ttf')
+ local amiri_font = harfbuzz.Font.new(amiri_face)
+
+ -- Check normal shaping w/o features
+ buf= harfbuzz.Buffer.new()
+ buf:add_utf8("123")
+
+ harfbuzz.shape(amiri_font, buf, opts)
+ local glyphs = buf:get_glyphs()
+ compare_glyphs_against_fixture(glyphs, "amiri-regular_123.json")
+
+ -- Check shaping with '+numr'
+ buf= harfbuzz.Buffer.new()
+ buf:add_utf8("123")
+ opts.features = "+numr"
+ harfbuzz.shape(amiri_font, buf, opts)
+ glyphs = buf:get_glyphs()
+ compare_glyphs_against_fixture(glyphs, "amiri-regular_123_numr.json")
+ end)
+
+ it("can set specefic shaper",function()
+ options.shapers = { "fallback"}
+ harfbuzz.shape(font, buf, options)
+ local glyphs = buf:get_glyphs()
+ assert.are_equal(2, #glyphs)
+ assert.are_equal(906, glyphs[1].codepoint)
+ assert.are_equal(909, glyphs[2].codepoint)
+ end)
+ end)
+end)