feat(core): support css font-variation-settings (#9995)

This commit is contained in:
Ruslan Lekhman
2022-11-23 21:57:22 -07:00
committed by GitHub
parent 501d310431
commit a5e3e223dd
12 changed files with 219 additions and 66 deletions

View File

@@ -6,7 +6,7 @@
@interface NativeScriptUtils : NSObject
+(UIFont*) getSystemFont:(CGFloat)size weight:(UIFontWeight)weight italic:(BOOL)italic symbolicTraits:(CGFloat)symbolicTraits;
+(UIFont*) getSystemFont:(CGFloat)size weight:(UIFontWeight)weight italic:(BOOL)italic symbolicTraits:(UIFontDescriptorSymbolicTraits)symbolicTraits;
+(UIFont*) createUIFont:(NSDictionary*)font;
+(NSMutableAttributedString*)createMutableStringWithDetails:(NSDictionary*)details;
+(NSMutableAttributedString*)createMutableStringForSpan:(NSString*)text font:(UIFont*)font color:(UIColor*)color backgroundColor:(UIColor*)backgroundColor textDecoration:(NSString*)textDecoration baselineOffset:(CGFloat)baselineOffset;

View File

@@ -2,19 +2,19 @@
@implementation NativeScriptUtils
+(UIFont*) getSystemFont:(CGFloat)size weight:(UIFontWeight)weight italic:(BOOL)italic symbolicTraits:(CGFloat)symbolicTraits {
+(UIFont*) getSystemFont:(CGFloat)size weight:(UIFontWeight)weight italic:(BOOL)italic symbolicTraits:(UIFontDescriptorSymbolicTraits)symbolicTraits {
UIFont *result = [UIFont systemFontOfSize:size weight:weight];
if (italic) {
result = [UIFont fontWithDescriptor:[result.fontDescriptor fontDescriptorWithSymbolicTraits:symbolicTraits] size:size];
}
return result;
}
+(UIFont*) createUIFont:(NSDictionary*)font {
UIFont *result;
CGFloat size = [[font valueForKey:@"fontSize"] floatValue];
UIFontDescriptorSymbolicTraits symbolicTraits = 0;
if ([[font valueForKey:@"isBold"] boolValue]) {
symbolicTraits = symbolicTraits | UIFontDescriptorTraitBold;
@@ -22,12 +22,12 @@
if ([[font valueForKey:@"isItalic"] boolValue]) {
symbolicTraits = symbolicTraits | UIFontDescriptorTraitItalic;
}
NSDictionary *fontDescriptorTraits = @{
UIFontSymbolicTrait : @(symbolicTraits),
UIFontWeightTrait : [font valueForKey:@"fontWeight"]
};
for (NSString *family in [NSArray arrayWithArray:[font valueForKey:@"fontFamily"]]) {
NSString *fontFamily = family;
if ([family.lowercaseString isEqualToString:@"serif"]) {
@@ -35,24 +35,24 @@
} else if ([family.lowercaseString isEqualToString:@"monospace"]) {
fontFamily = @"Courier New";
}
if (!fontFamily || [fontFamily isEqualToString:@"sans-serif"] || [fontFamily isEqualToString:@"system"]) {
result = [NativeScriptUtils getSystemFont:size weight:(UIFontWeight)[[font valueForKey:@"fontWeight"] floatValue] italic:[[font valueForKey:@"isItalic"] boolValue] symbolicTraits:symbolicTraits];
break;
} else {
UIFontDescriptor *descriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{
UIFontDescriptorFamilyAttribute: fontFamily,
UIFontDescriptorTraitsAttribute: fontDescriptorTraits
}];
result = [UIFont fontWithDescriptor:descriptor size:size];
BOOL actualItalic = result.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic;
if ([[font valueForKey:@"isItalic"] boolValue] && !actualItalic) {
// The font we got is not actually italic so emulate that with a matrix
result = [UIFont fontWithDescriptor:[descriptor fontDescriptorWithMatrix:CGAffineTransformMake(1, 0, 0.2, 1, 0, 0)] size:size];
}
// Check if the resolved font has the correct font-family
// If not - fallback to the next font-family
if ([result.familyName isEqualToString:fontFamily]) {
@@ -62,12 +62,12 @@
}
}
}
// Couldn't resolve font - fallback to the system font
if (result == nil) {
result = [NativeScriptUtils getSystemFont:size weight:(UIFontWeight)[[font valueForKey:@"fontWeight"] floatValue] italic:[[font valueForKey:@"isItalic"] boolValue] symbolicTraits:symbolicTraits];
}
return result;
}
@@ -83,29 +83,29 @@
+(NSMutableAttributedString*)createMutableStringForSpan:(NSString*)text font:(UIFont*)font color:(UIColor*)color backgroundColor:(UIColor*)backgroundColor textDecoration:(NSString*)textDecoration baselineOffset:(CGFloat)baselineOffset {
NSMutableDictionary *attrDict = [[NSMutableDictionary alloc] init];
attrDict[NSFontAttributeName] = font;
if (color != nil) {
attrDict[NSForegroundColorAttributeName] = color;
}
if (backgroundColor != nil) {
attrDict[NSBackgroundColorAttributeName] = backgroundColor;
}
if (textDecoration != nil) {
if ([textDecoration rangeOfString:@"underline"].location != NSNotFound) {
attrDict[NSUnderlineStyleAttributeName] = [NSNumber numberWithInt:NSUnderlineStyleSingle];
}
if ([textDecoration rangeOfString:@"line-through"].location != NSNotFound) {
attrDict[NSStrikethroughStyleAttributeName] = [NSNumber numberWithInt:NSUnderlineStyleSingle];
}
}
attrDict[NSBaselineOffsetAttributeName] = [NSNumber numberWithInt:baselineOffset];
return [[NSMutableAttributedString alloc] initWithString:text attributes:attrDict];
}
+(UIImage*)scaleImage:(UIImage*)image width:(CGFloat)width height:(CGFloat)height scaleFactor:(CGFloat)scaleFactor {

View File

@@ -1,4 +1,3 @@
declare const enum MDCAnimationTimingFunction {
Standard = 0,

View File

@@ -1,4 +1,3 @@
declare class NativeScriptUtils extends NSObject {
static alloc(): NativeScriptUtils; // inherited from NSObject
@@ -11,7 +10,7 @@ declare class NativeScriptUtils extends NSObject {
static getImageDataFormatQuality(image: UIImage, format: string, quality: number): NSData;
static getSystemFontWeightItalicSymbolicTraits(size: number, weight: number, italic: boolean, symbolicTraits: number): UIFont;
static getSystemFontWeightItalicSymbolicTraits(size: number, weight: number, italic: boolean, symbolicTraits: UIFontDescriptorSymbolicTraits): UIFont;
static new(): NativeScriptUtils; // inherited from NSObject