You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/fontland/fontland/test/glyph_mapping.rkt

150 lines
6.2 KiB
Racket

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#lang racket
(require rackunit racket/runtime-path fontland)
#|
approximates
https://github.com/mbutterick/fontkit/blob/master/test/glyph_mapping.js
|#
(define-runtime-path open-sans-ttf "data/OpenSans/OpenSans-Regular.ttf")
(define-runtime-path source-sans-otf "data/SourceSansPro/SourceSansPro-Regular.otf")
(define-runtime-path mada-ttf "data/Mada/Mada-Regular.subset1.ttf")
(define font (open-font open-sans-ttf))
#|
import fontkit from '../src';
import assert from 'assert';
describe('character to glyph mapping', function() {
describe('basic cmap handling', function() {
let font = fontkit.openSync(__dirname + '/data/OpenSans/OpenSans-Regular.ttf');
it('should get characterSet', function() {
assert(Array.isArray(font.characterSet));
return assert.equal(font.characterSet.length, 884);
});
it('should check if a character is supported', function() {
assert(font.hasGlyphForCodePoint('a'.charCodeAt()));
return assert(!font.hasGlyphForCodePoint(0));
});
it('should get a glyph for a character code', function() {
let glyph = font.glyphForCodePoint('a'.charCodeAt());
assert.equal(glyph.id, 68);
return assert.deepEqual(glyph.codePoints, [97]);
});
it('should map a string to glyphs', function() {
let glyphs = font.glyphsForString('hello', []);
assert(Array.isArray(glyphs));
assert.equal(glyphs.length, 5);
assert.deepEqual(glyphs.map(g => g.id), [75, 72, 79, 79, 82]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [[104], [101], [108], [108], [111]]);
});
it('should support unicode variation selectors', function() {
let font = fontkit.openSync(__dirname + '/data/fonttest/TestCMAP14.otf');
let glyphs = font.glyphsForString('\u{82a6}\u{82a6}\u{E0100}\u{82a6}\u{E0101}');
assert.deepEqual(glyphs.map(g => g.id), [1, 1, 2]);
});
it('should support legacy encodings when no unicode cmap is found', function() {
let font = fontkit.openSync(__dirname + '/data/fonttest/TestCMAPMacTurkish.ttf');
let glyphs = font.glyphsForString("“ABÇĞIİÖŞÜ”");
assert.deepEqual(glyphs.map(g => g.id), [200, 34, 35, 126, 176, 42, 178, 140, 181, 145, 201]);
});
});
describe('opentype features', function() {
let font = fontkit.openSync(__dirname + '/data/SourceSansPro/SourceSansPro-Regular.otf');
it('should list available features', () =>
assert.deepEqual(font.availableFeatures, [
'aalt', 'c2sc', 'case', 'ccmp', 'dnom', 'frac', 'liga', 'numr',
'onum', 'ordn', 'pnum', 'salt', 'sinf', 'smcp', 'ss01', 'ss02',
'ss03', 'ss04', 'ss05', 'subs', 'sups', 'zero', 'kern', 'mark',
'mkmk', 'size'
])
);
it('should apply opentype GSUB features', function() {
let {glyphs} = font.layout('ffi', ['dlig']);
assert.equal(glyphs.length, 2);
assert.deepEqual(glyphs.map(g => g.id), [ 514, 36 ]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [[102, 102], [105]]);
});
it('should enable fractions when using fraction slash', function() {
let {glyphs} = font.layout('123 116 123');
return assert.deepEqual(glyphs.map(g => g.id), [ 1088, 1089, 1090, 1, 1617, 1724, 1603, 1608, 1, 1088, 1089, 1090 ]);
});
it('should not break if cant enable fractions when using fraction slash', function() {
let {glyphs} = font.layout('ab 1 2');
return assert.deepEqual(glyphs.map(g => g.id), [ 28, 1724, 29, 1, 1724, 1, 1617, 1724, 1, 1724, 1604 ]);
});
});
describe('AAT features', function() {
let font = fontkit.openSync(__dirname + '/data/Play/Play-Regular.ttf');
it('should list available features', () => assert.deepEqual(font.availableFeatures, [ 'tnum', 'sups', 'subs', 'numr', 'onum', 'lnum', 'liga', 'kern' ]));
it('should apply default AAT morx features', function() {
let {glyphs} = font.layout('ffi 12');
assert.equal(glyphs.length, 5);
assert.deepEqual(glyphs.map(g => g.id), [ 767, 3, 20, 645, 21 ]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [[102, 102, 105], [32], [49], [8260], [50]]);
});
it('should apply user specified features', function() {
let {glyphs} = font.layout('ffi 12', [ 'numr' ]);
assert.equal(glyphs.length, 3);
assert.deepEqual(glyphs.map(g => g.id), [ 767, 3, 126 ]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [[102, 102, 105], [32], [49, 8260, 50]]);
});
it('should handle rtl direction', function() {
let {glyphs} = font.layout('ffi', [], null, null, "rtl");
assert.equal(glyphs.length, 3);
assert.deepEqual(glyphs.map(g => g.id), [ 76, 73, 73 ]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [[105], [102], [102]]);
});
it('should apply indic reordering features', function() {
let f = fontkit.openSync(__dirname + '/data/Khmer/Khmer.ttf');
let {glyphs} = f.layout('ខ្ញុំអាចញ៉ាំកញ្ចក់បាន ដោយគ្មានបញ្ហា');
assert.deepEqual(glyphs.map(g => g.id), [
45, 153, 177, 112, 248, 188, 49, 296, 44, 187, 149, 44, 117, 236, 188, 63, 3, 107,
226, 188, 69, 218, 169, 188, 63, 64, 255, 175, 188
]);
return assert.deepEqual(glyphs.map(g => g.codePoints), [
[ 6017 ], [ 6098, 6025 ], [ 6075 ], [ 6086 ], [ 6050 ], [ 6070 ], [ 6021 ],
[ 6025, 6089, 6070, 6086 ], [ 6016 ], [ 6025 ], [ 6098, 6021 ], [ 6016 ],
[ 6091 ], [ 6036 ], [ 6070 ], [ 6035 ], [ 32 ], [ 6084 ], [ 6026 ], [ 6070 ],
[ 6041 ], [ 6018 ], [ 6098, 6040 ], [ 6070 ], [ 6035 ], [ 6036 ], [ 6025 ],
[ 6098, 6048 ], [ 6070 ]
]);
});
});
describe('glyph id to strings', function () {
it('should return strings from cmap that map to a given glyph', function () {
let font = fontkit.openSync(__dirname + '/data/OpenSans/OpenSans-Regular.ttf');
let strings = font.stringsForGlyph(68);
assert.deepEqual(strings, ['a']);
});
it('should return strings from AAT morx table that map to the given glyph', function () {
let font = fontkit.openSync(__dirname + '/data/Play/Play-Regular.ttf');
let strings = font.stringsForGlyph(767);
assert.deepEqual(strings, ['ffi']);
});
});
});
|#