maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
46 lines (38 loc) • 2.08 kB
text/typescript
import {expect, test} from 'vitest';
import {GlyphAtlas} from './glyph_atlas.ts';
import {AlphaImage} from '../util/image.ts';
import type {GlyphMap, StyleGlyph} from '../style/style_glyph.ts';
function createGlyph(value: number): StyleGlyph {
return {
id: 0x093E,
bitmap: new AlphaImage({width: 1, height: 1}, new Uint8Array([value])),
metrics: {width: 1, height: 1, left: 0, top: 0, advance: value}
};
}
test('packs glyphs separately by font, variant, and unmodified text', () => {
const glyphs: GlyphMap = {
Test: {
default: {'\u093E': createGlyph(10), '\0\u093E': createGlyph(20)},
alternate: {
'\u093E': createGlyph(30),
missing: null,
empty: {...createGlyph(0), bitmap: new AlphaImage({width: 0, height: 0})}
}
},
Other: {alternate: {'\u093E': createGlyph(40)}, empty: {}}
};
const atlas = new GlyphAtlas(glyphs);
expect(Object.keys(atlas.positions.Test.default)).toEqual(['\u093E', '\0\u093E']);
expect(Object.keys(atlas.positions.Test.alternate)).toEqual(['\u093E']);
expect(Object.keys(atlas.positions.Other)).toEqual(['alternate', 'empty']);
expect(atlas.positions.Other.empty).toEqual({});
const defaultGlyph = atlas.positions.Test.default['\u093E'];
const alternateGlyph = atlas.positions.Test.alternate['\u093E'];
const otherFontGlyph = atlas.positions.Other.alternate['\u093E'];
expect(defaultGlyph.metrics).toEqual(glyphs.Test.default['\u093E'].metrics);
expect(alternateGlyph.metrics).toEqual(glyphs.Test.alternate['\u093E'].metrics);
expect(otherFontGlyph.metrics).toEqual(glyphs.Other.alternate['\u093E'].metrics);
expect(atlas.image.data[(defaultGlyph.rect.y + 1) * atlas.image.width + defaultGlyph.rect.x + 1]).toBe(10);
expect(atlas.image.data[(alternateGlyph.rect.y + 1) * atlas.image.width + alternateGlyph.rect.x + 1]).toBe(30);
expect(atlas.image.data[(otherFontGlyph.rect.y + 1) * atlas.image.width + otherFontGlyph.rect.x + 1]).toBe(40);
});