From e8302f2040a24d1e998485fe33d568ae1201f5f1 Mon Sep 17 00:00:00 2001 From: Dan Allen Date: Fri, 29 Aug 2014 04:05:12 -0600 Subject: [PATCH] ignore cmap tables with a format number > 14 - ignore cmap tables with a format number > 14 (CJK fonts) - migrate rspec expectations to expect API --- lib/ttfunk/table/cmap.rb | 3 +- spec/fonts/Mplus1p.ttf | Bin 0 -> 36704 bytes spec/integration/file_spec.rb | 52 +++++++++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 spec/fonts/Mplus1p.ttf diff --git a/lib/ttfunk/table/cmap.rb b/lib/ttfunk/table/cmap.rb index f112bb24..02c64978 100644 --- a/lib/ttfunk/table/cmap.rb +++ b/lib/ttfunk/table/cmap.rb @@ -14,8 +14,9 @@ def self.encode(charmap, encoding) def unicode # Because most callers just call .first on the result, put tables with highest-number format first. + # However, ignore tables with a format number greater than 12 since ttfunk doesn't support them # (Tables with higher format numbers tend to be more complete, especially in higher/astral Unicode ranges.) - @unicode ||= @tables.select { |table| table.unicode? }.sort{|a,b| b.format <=> a.format } + @unicode ||= @tables.select { |table| table.unicode? && table.format <= 12 }.sort{|a,b| b.format <=> a.format } end private diff --git a/spec/fonts/Mplus1p.ttf b/spec/fonts/Mplus1p.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6327c21cdabf4e5d66331217532d66a4b1ff7bb5 GIT binary patch literal 36704 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 z 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 literal 0 HcmV?d00001 diff --git a/spec/integration/file_spec.rb b/spec/integration/file_spec.rb index 77a5a5b8..1a2bded7 100644 --- a/spec/integration/file_spec.rb +++ b/spec/integration/file_spec.rb @@ -5,13 +5,13 @@ describe TTFunk::File, "::open" do it "opens file paths" do font = TTFunk::File.open test_font("DejaVuSans") - font.contents.read(4).should == "\x00\x00\x00\x01" + expect(font.contents.read(4)).to eq("\x00\x00\x00\x01") end it "opens IO Objects" do io = File.open test_font("DejaVuSans") font = TTFunk::File.open io - font.contents.read(4).should == "\x00\x00\x00\x01" + expect(font.contents.read(4)).to eq("\x00\x00\x00\x01") end end @@ -21,7 +21,7 @@ let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} it "should extract the correct value" do - file.ascent.should == 1556 + expect(file.ascent).to eq(1556) end end end @@ -32,7 +32,7 @@ let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} it "should extract the correct value" do - file.descent.should == -492 + expect(file.descent).to eq(-492) end end end @@ -43,7 +43,7 @@ let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} it "should extract the correct value" do - file.line_gap.should == 410 + expect(file.line_gap).to eq(410) end end end @@ -54,7 +54,7 @@ let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} it "should extract the correct value" do - file.bbox.should == [-2090, -850, 3442, 2389] + expect(file.bbox).to eq([-2090, -850, 3442, 2389]) end end end @@ -64,7 +64,45 @@ context "with DejaVuSans" do let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} it "should extract the correct value" do - file.name.preferred_family.first.should == 'DejaVu Sans' + expect(file.name.preferred_family.first).to eq('DejaVu Sans') + end + end +end + +describe TTFunk::File, "#cmap" do + + context "with DejaVuSans" do + let!(:file) { TTFunk::File.open(test_font("DejaVuSans"))} + + it "should extract cmap tables in descending order of format" do + cmaps = file.cmap.unicode + expect(cmaps.size).to eq(4) + expect(cmaps.map(&:format)).to eq([12, 12, 4, 4]) + end + + it "should lookup code in cmap format 12 table" do + cmap_format_12 = file.cmap.unicode.first + expect(cmap_format_12.format).to eq(12) + expect(cmap_format_12[32]).to eq(3) + end + end + + # M+ 1p is a CJK font that includes a cmap format 14 table + # we use a trimmed down version of the font generated with fontforge for testing purposes + context "with M+ 1p" do + let!(:file) { TTFunk::File.open(test_font("Mplus1p"))} + + # this test verifies that the cmap format 14 table is ignored + it "should extract cmap tables in descending order of format" do + cmaps = file.cmap.unicode + expect(cmaps.size).to eq(2) + expect(cmaps.map(&:format)).to eq([4, 4]) + end + + it "should lookup code in cmap format 4 table" do + cmap_format_4 = file.cmap.unicode.first + expect(cmap_format_4.format).to eq(4) + expect(cmap_format_4[32]).to eq(4) end end end