UNPKG

cn-font-split

Version:

划时代的字体切割工具,CJK与任何字符!支持 otf、ttf、woff2 字体多线程切割,完美地细颗粒度地进行包大小控制。A revolutionary font subetter that supports CJK and any characters! It enables multi-threaded subset of otf, ttf, and woff2 fonts, allowing for precise control over package size.

51 lines (46 loc) 1.5 kB
import path from 'path'; import { FontSplitProps } from '../interface.js'; import { getBinName, matchPlatform } from '../load.js'; import { isMusl } from './isMusl.js'; export * from '../interface.js'; export * from '../createAPI.js'; // @ts-ignore import { dlopen, Callback } from '@xan105/ffi/koffi'; import koffi from 'koffi'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; import { createAPI } from '../createAPI.js'; // @ts-ignore 获取当前模块的 URL const __filename = fileURLToPath(import.meta.url); // 获取当前模块所在的目录 const __dirname = dirname(__filename); let binPath = process.env.CN_FONT_SPLIT_BIN; if (!binPath) { binPath = path.resolve( __dirname, '../' + getBinName(matchPlatform(process.platform, process.arch, isMusl)), ); // throw new Error('CN_FONT_SPLIT_BIN is undefined!'); } const dylib = dlopen(binPath, { font_split: { parameters: ['pointer', 'usize', 'function'], result: 'void', }, }); const createCallback = (cb: (data: Uint8Array) => void) => new Callback( { parameters: ['pointer', 'usize'], result: 'void', }, (ptr: any, length: number) => { const data = koffi.decode( ptr, koffi.array('uint8_t', length, 'Array'), ); cb(new Uint8Array(data)); }, ).pointer; export const fontSplit = createAPI(dylib.font_split, createCallback);