From 536791dee7d78c171fb9ac808433732bbd01ede2 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Fri, 26 Jun 2015 11:11:46 +0300 Subject: [PATCH] Resiter custom fonts for IOS --- ui/styling/font.android.ts | 7 +++--- ui/styling/font.d.ts | 4 ++++ ui/styling/font.ios.ts | 49 ++++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ui/styling/font.android.ts b/ui/styling/font.android.ts index e81bb4f76..da4f4b7df 100644 --- a/ui/styling/font.android.ts +++ b/ui/styling/font.android.ts @@ -7,6 +7,7 @@ import fs = require("file-system"); var typefaceCache = new Map(); var appAssets: android.content.res.AssetManager; +var FONTS_BASE_PATH = "app/fonts/"; export class Font extends common.Font { public static default = new Font(undefined, undefined, enums.FontStyle.normal, enums.FontWeight.normal); @@ -99,10 +100,10 @@ export class Font extends common.Font { var fontAssetPath: string; var basePath = fs.path.join(fs.knownFolders.currentApp().path, "fonts", fontFamily); if (fs.File.exists(basePath + ".ttf")) { - fontAssetPath = "app/fonts/" + fontFamily + ".ttf"; + fontAssetPath = FONTS_BASE_PATH + fontFamily + ".ttf"; } else if (fs.File.exists(basePath + ".otf")) { - fontAssetPath = "app/fonts/" + fontFamily + ".otf"; + fontAssetPath = FONTS_BASE_PATH + fontFamily + ".otf"; } else { trace.write("Could not find font file for " + fontFamily, trace.categories.Error, trace.messageType.error); @@ -120,4 +121,4 @@ export class Font extends common.Font { return result; } -} +} \ No newline at end of file diff --git a/ui/styling/font.d.ts b/ui/styling/font.d.ts index bf30098d7..879a4caf7 100644 --- a/ui/styling/font.d.ts +++ b/ui/styling/font.d.ts @@ -23,4 +23,8 @@ public static equals(value1: Font, value2: Font): boolean; public static parse(cssValue: string): Font; } + + export module ios { + export function registerFont(fontFile: string); + } } \ No newline at end of file diff --git a/ui/styling/font.ios.ts b/ui/styling/font.ios.ts index 7cf9e5e30..e76683671 100644 --- a/ui/styling/font.ios.ts +++ b/ui/styling/font.ios.ts @@ -1,27 +1,31 @@ import enums = require("ui/enums"); import common = require("ui/styling/font-common"); +import fs = require("file-system"); var DEFAULT_SERIF = "Times New Roman"; var DEFAULT_SANS_SERIF = "Helvetica"; var DEFAULT_MONOSPACE = "Courier New"; +var areSystemFontSetsValid: boolean = false; var systemFontFamilies = new Set(); var systemFonts = new Set(); -function initSystemFotns() { - var nsFontFamilies = UIFont.familyNames(); - for (var i = 0; i < nsFontFamilies.count; i++) { - var family = nsFontFamilies.objectAtIndex(i); - systemFontFamilies.add(family); +function assureSystemFotnSets() { + if (!areSystemFontSetsValid) { + var nsFontFamilies = UIFont.familyNames(); + for (var i = 0; i < nsFontFamilies.count; i++) { + var family = nsFontFamilies.objectAtIndex(i); + systemFontFamilies.add(family); - var nsFonts = UIFont.fontNamesForFamilyName(family); - for (var j = 0; j < nsFonts.count; j++) { - var font = nsFonts.objectAtIndex(j); - systemFonts.add(font); + var nsFonts = UIFont.fontNamesForFamilyName(family); + for (var j = 0; j < nsFonts.count; j++) { + var font = nsFonts.objectAtIndex(j); + systemFonts.add(font); + } } + areSystemFontSetsValid = true; } } -initSystemFotns(); export class Font extends common.Font { public static default = new Font(undefined, undefined, enums.FontStyle.normal, enums.FontWeight.normal); @@ -78,6 +82,8 @@ function resolveFontDescriptor(fontFamilyValue: string, symbolicTraits: number): return null; } + assureSystemFotnSets(); + for (var i = 0; i < fonts.length; i++) { var fontFamily = getFontFamilyRespectingGenericFonts(fonts[i]); if (systemFontFamilies.has(fontFamily)) { @@ -121,4 +127,27 @@ function getFontFamilyRespectingGenericFonts(fontFamily: string): string { default: return fontFamily; } +} + +export module ios { + export function registerFont(fontFile: string) { + var filePath = fs.path.join(fs.knownFolders.currentApp().path, "fonts", fontFile); + var fontData = NSFileManager.defaultManager().contentsAtPath(filePath); + if (!fontData) { + throw new Error("Could not load font from: " + fontFile); + } + var provider = CGDataProviderCreateWithCFData(fontData); + var font = CGFontCreateWithDataProvider(provider); + + if (!font) { + throw new Error("Could not load font from: " + fontFile); + } + + var error = NSError.alloc().init(); + if (!CTFontManagerRegisterGraphicsFont(font, error)) { + throw new Error(error.localizedDescription); + } + + areSystemFontSetsValid = false; + } } \ No newline at end of file