@shopify/react-native-skia
Version:
High-performance React Native Graphics using Skia
106 lines (103 loc) • 3.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useFonts = exports.useFont = exports.matchFont = exports.listFontFamilies = void 0;
var _react = require("react");
var _Skia = require("../Skia");
var _types = require("../types");
var _Platform = require("../../Platform");
var _Typeface = require("./Typeface");
/*global SkiaApi*/
const defaultFontSize = 14;
/**
* Returns a Skia Font object
* */
const useFont = (font, size = defaultFontSize, onError) => {
const typeface = (0, _Typeface.useTypeface)(font, onError);
return (0, _react.useMemo)(() => {
if (typeface) {
return _Skia.Skia.Font(typeface, size);
} else {
return null;
}
}, [size, typeface]);
};
exports.useFont = useFont;
const defaultFontStyle = {
fontFamily: "System",
fontSize: defaultFontSize,
fontStyle: "normal",
fontWeight: "normal"
};
const slant = s => {
if (s === "italic") {
return _types.FontSlant.Italic;
} else if (s === "oblique") {
return _types.FontSlant.Oblique;
} else {
return _types.FontSlant.Upright;
}
};
const weight = fontWeight => {
switch (fontWeight) {
case "normal":
return 400;
case "bold":
return 700;
default:
return parseInt(fontWeight, 10);
}
};
const matchFont = (inputStyle = {}, fontMgr = _Skia.Skia.FontMgr.System()) => {
const fontStyle = {
...defaultFontStyle,
...inputStyle
};
const style = {
weight: weight(fontStyle.fontWeight),
width: 5,
slant: slant(fontStyle.fontStyle)
};
const typeface = fontMgr.matchFamilyStyle(fontStyle.fontFamily, style);
return _Skia.Skia.Font(typeface, fontStyle.fontSize);
};
exports.matchFont = matchFont;
const listFontFamilies = (fontMgr = _Skia.Skia.FontMgr.System()) => {
const families = new Set();
for (let i = 0; i < fontMgr.countFamilies(); i++) {
families.add(fontMgr.getFamilyName(i));
}
return Array.from(families);
};
exports.listFontFamilies = listFontFamilies;
const loadTypefaces = typefacesToLoad => {
const promises = Object.keys(typefacesToLoad).flatMap(familyName => {
return typefacesToLoad[familyName].map(typefaceToLoad => {
return _Skia.Skia.Data.fromURI(_Platform.Platform.resolveAsset(typefaceToLoad)).then(data => {
const tf = _Skia.Skia.Typeface.MakeFreeTypeFaceFromData(data);
if (tf === null) {
throw new Error(`Couldn't create typeface for ${familyName}`);
}
return [familyName, tf];
});
});
});
return Promise.all(promises);
};
const useFonts = sources => {
const [fontMgr, setFontMgr] = (0, _react.useState)(null);
(0, _react.useEffect)(() => {
loadTypefaces(sources).then(result => {
const fMgr = _Skia.Skia.TypefaceFontProvider.Make();
result.forEach(([familyName, typeface]) => {
fMgr.registerFont(typeface, familyName);
});
setFontMgr(fMgr);
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return fontMgr;
};
exports.useFonts = useFonts;
//# sourceMappingURL=Font.js.map