Skip to content

Commit 1c9e980

Browse files
committed
Test changing React's font manager
1 parent f3a6539 commit 1c9e980

File tree

3 files changed

+72
-17
lines changed

3 files changed

+72
-17
lines changed

Libraries/Text/RCTTextAttributes.m

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,27 +93,27 @@ - (NSParagraphStyle *)effectiveParagraphStyle
9393
alignment = NSTextAlignmentRight;
9494
}
9595
}
96-
96+
9797
paragraphStyle.alignment = alignment;
9898
isParagraphStyleUsed = YES;
9999
}
100-
100+
101101
if (_baseWritingDirection != NSWritingDirectionNatural) {
102102
paragraphStyle.baseWritingDirection = _baseWritingDirection;
103103
isParagraphStyleUsed = YES;
104104
}
105-
105+
106106
if (!isnan(_lineHeight)) {
107107
CGFloat lineHeight = _lineHeight * self.effectiveFontSizeMultiplier;
108108
paragraphStyle.minimumLineHeight = lineHeight;
109109
paragraphStyle.maximumLineHeight = lineHeight;
110110
isParagraphStyleUsed = YES;
111111
}
112-
112+
113113
if (isParagraphStyleUsed) {
114114
return [paragraphStyle copy];
115115
}
116-
116+
117117
return nil;
118118
}
119119

@@ -192,14 +192,40 @@ - (NSParagraphStyle *)effectiveParagraphStyle
192192

193193
- (UIFont *)effectiveFont
194194
{
195-
// FIXME: RCTFont has thread-safety issues and must be rewritten.
196-
return [RCTFont updateFont:nil
197-
withFamily:_fontFamily
198-
size:@(isnan(_fontSize) ? 0 : _fontSize)
199-
weight:_fontWeight
200-
style:_fontStyle
201-
variant:_fontVariant
202-
scaleMultiplier:self.effectiveFontSizeMultiplier];
195+
NSArray *rawFontFamilies = [_fontFamily componentsSeparatedByString:@","];
196+
197+
NSMutableArray *fonts = [NSMutableArray new];
198+
for (NSString *rawFontFamily in rawFontFamilies) {
199+
NSString *fontFamily = [rawFontFamily stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
200+
if (fontFamily.length == 0) {
201+
continue;
202+
}
203+
204+
UIFont *font = [RCTFont updateFont:nil
205+
withFamily:fontFamily
206+
size:@(isnan(_fontSize) ? 0 : _fontSize)
207+
weight:_fontWeight
208+
style:_fontStyle
209+
variant:_fontVariant
210+
scaleMultiplier:self.effectiveFontSizeMultiplier];
211+
212+
if (font) {
213+
[fonts addObject:font];
214+
}
215+
}
216+
217+
UIFont *primaryFont = fonts[0];
218+
219+
NSMutableArray *fontDescriptors = [NSMutableArray new];
220+
for (NSUInteger i = 1; i < fonts.count; i++) {
221+
UIFont *font = fonts[i];
222+
[fontDescriptors addObject:font.fontDescriptor];
223+
}
224+
225+
UIFontDescriptor *fontDescriptor = [primaryFont.fontDescriptor fontDescriptorByAddingAttributes:
226+
@{UIFontDescriptorCascadeListAttribute: fontDescriptors}];
227+
228+
return [UIFont fontWithDescriptor:fontDescriptor size:primaryFont.pointSize];
203229
}
204230

205231
- (CGFloat)effectiveFontSizeMultiplier
@@ -243,7 +269,7 @@ - (UIColor *)effectiveBackgroundColor
243269
NSMutableArray *newWords = [NSMutableArray new];
244270
NSNumberFormatter *num = [NSNumberFormatter new];
245271
for (NSString *item in words) {
246-
NSString *word;
272+
NSString *word;
247273
if ([item length] > 0 && [num numberFromString:[item substringWithRange:NSMakeRange(0, 1)]] == nil) {
248274
word = [item capitalizedString];
249275
} else {

ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ public Typeface getTypeface(
7373

7474
public Typeface getTypeface(
7575
String fontFamilyName, TypefaceStyle typefaceStyle, AssetManager assetManager) {
76+
// Test
77+
fontFamilyName = "Roboto";
78+
7679
if (mCustomTypefaceCache.containsKey(fontFamilyName)) {
7780
// Apply `typefaceStyle` because custom fonts configure variants using `app:fontStyle` and
7881
// `app:fontWeight` in their resource XML configuration file.

ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTFontUtils.mm

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,36 @@ static RCTFontStyle RCTGetFontStyle(UIFont *font)
110110
RCTFontProperties defaultFontProperties = RCTDefaultFontProperties();
111111
fontProperties = RCTResolveFontProperties(fontProperties, defaultFontProperties);
112112

113+
NSString *primaryFamily;
114+
NSString *fallbackFamily;
115+
NSMutableArray *familyNames;
116+
117+
if (fontProperties.family) {
118+
// Split familyProperty by comma and trim whitespace in each
119+
NSArray *rawFamilyNames = [fontProperties.family componentsSeparatedByString:@","];
120+
familyNames = [NSMutableArray new];
121+
for (NSString *familyName in familyNames) {
122+
[familyNames addObject:[familyName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
123+
}
124+
125+
primaryFamily = familyNames[0];
126+
fallbackFamily = familyNames[1];
127+
}
128+
113129
assert(!isnan(fontProperties.sizeMultiplier));
114130
CGFloat effectiveFontSize = fontProperties.sizeMultiplier * fontProperties.size;
115131
UIFont *font;
116-
if ([fontProperties.family isEqualToString:defaultFontProperties.family]) {
132+
if ([primaryFamily isEqualToString:defaultFontProperties.family]) {
117133
// Handle system font as special case. This ensures that we preserve
118134
// the specific metrics of the standard system font as closely as possible.
119135
font = RCTDefaultFontWithFontProperties(fontProperties);
120136
} else {
121-
NSArray<NSString *> *fontNames = [UIFont fontNamesForFamilyName:fontProperties.family];
137+
NSArray<NSString *> *fontNames = [UIFont fontNamesForFamilyName:primaryFamily];
122138

123139
if (fontNames.count == 0) {
124140
// Gracefully handle being given a font name rather than font family, for
125141
// example: "Helvetica Light Oblique" rather than just "Helvetica".
126-
font = [UIFont fontWithName:fontProperties.family size:effectiveFontSize];
142+
font = [UIFont fontWithName:primaryFamily size:effectiveFontSize];
127143

128144
if (!font) {
129145
// Failback to system font.
@@ -163,5 +179,15 @@ static RCTFontStyle RCTGetFontStyle(UIFont *font)
163179
font = [UIFont fontWithDescriptor:fontDescriptor size:effectiveFontSize];
164180
}
165181

182+
if (fallbackFamily) {
183+
RCTFontProperties fallbackFontProperties = fontProperties;
184+
fallbackFontProperties.family = fallbackFamily;
185+
UIFont *fallbackFont = RCTFontWithFontProperties(fallbackFontProperties);
186+
187+
UIFontDescriptor *fontDescriptor = [font.fontDescriptor
188+
fontDescriptorByAddingAttributes:@{UIFontDescriptorCascadeListAttribute : @[fallbackFont.fontDescriptor]}];
189+
font = [UIFont fontWithDescriptor:fontDescriptor size:effectiveFontSize];
190+
}
191+
166192
return font;
167193
}

0 commit comments

Comments
 (0)