Fabric: Support stylistic sets for fontVariant (#48674)

Summary:
In the old arch, stylistic sets were supported however in the new arch support was not added. It seems that fontVariant support was actually initially missed on iOS fabric however a limited version was added in https://github.com/facebook/react-native/pull/44112 . I referenced that PR and also old arch implementation for these changes.
<img width="480" alt="Screenshot 2025-01-14 at 11 15 18 AM" src="https://github.com/user-attachments/assets/ec32a356-fadd-4281-83b9-15871bbcd18f" />

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[GENERAL] [ADDED] - Support stylistic sets for fontVariant

Pull Request resolved: https://github.com/facebook/react-native/pull/48674

Test Plan:
- Verified that the "Unsupported FontVariant" native log no longer displays on both platforms
- On iOS was easy to test in the tester app as SF supports stylistic sets by default:
```
<Text>
  Stylistic{'\n'}
  <Text>Normal: ${'\n'}</Text>
  <Text style={{fontVariant: ['stylistic-four']}}>
    Stylistic Four: $
  </Text>
</Text>
```

<img width="391" alt="Screenshot 2025-01-14 at 11 59 29 AM" src="https://github.com/user-attachments/assets/1ede258e-783f-448f-8300-4c8c710796ef" />

- On Android I could not find any system fonts that support stylistic sets by default so I added Raleway and confirmed with a W character
![image](https://github.com/user-attachments/assets/e4b661ba-0013-4e60-90d0-1864be538159)

I did not add font variant example to the tester apps as I felt it could be confusing for people at a glance to understand why there is only a system font example on iOS and why I chose the specific stylistic set.

Reviewed By: cipolleschi

Differential Revision: D68205738

Pulled By: javache

fbshipit-source-id: 03ce572d3c8ecafca71fe00fc0e88eeafc2558bb
This commit is contained in:
Levi
2025-01-15 04:23:39 -08:00
committed by Facebook GitHub Bot
parent a18bc58645
commit c09b71b990
4 changed files with 288 additions and 1 deletions
@@ -317,6 +317,53 @@ inline void fromRawValue(
} else if (item == "proportional-nums") {
result =
(FontVariant)((int)result | (int)FontVariant::ProportionalNums);
} else if (item == "stylistic-one") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticOne);
} else if (item == "stylistic-two") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticTwo);
} else if (item == "stylistic-three") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticThree);
} else if (item == "stylistic-four") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticFour);
} else if (item == "stylistic-five") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticFive);
} else if (item == "stylistic-six") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticSix);
} else if (item == "stylistic-seven") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticSeven);
} else if (item == "stylistic-eight") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticEight);
} else if (item == "stylistic-nine") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticNine);
} else if (item == "stylistic-ten") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticTen);
} else if (item == "stylistic-eleven") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticEleven);
} else if (item == "stylistic-twelve") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticTwelve);
} else if (item == "stylistic-thirteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticThirteen);
} else if (item == "stylistic-fourteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticFourteen);
} else if (item == "stylistic-fifteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticFifteen);
} else if (item == "stylistic-sixteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticSixteen);
} else if (item == "stylistic-seventeen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticSeventeen);
} else if (item == "stylistic-eighteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticEighteen);
} else if (item == "stylistic-nineteen") {
result =
(FontVariant)((int)result | (int)FontVariant::StylisticNineteen);
} else if (item == "stylistic-twenty") {
result = (FontVariant)((int)result | (int)FontVariant::StylisticTwenty);
} else {
LOG(ERROR) << "Unsupported FontVariant value: " << item;
react_native_expect(false);
@@ -346,6 +393,66 @@ inline std::string toString(const FontVariant& fontVariant) {
if ((int)fontVariant & (int)FontVariant::ProportionalNums) {
result += "proportional-nums" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticOne) {
result += "stylistic-one" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticTwo) {
result += "stylistic-two" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticThree) {
result += "stylistic-three" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticFour) {
result += "stylistic-four" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticFive) {
result += "stylistic-five" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticSix) {
result += "stylistic-six" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticSeven) {
result += "stylistic-seven" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticEight) {
result += "stylistic-eight" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticNine) {
result += "stylistic-nine" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticTen) {
result += "stylistic-ten" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticEleven) {
result += "stylistic-eleven" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticTwelve) {
result += "stylistic-twelve" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticThirteen) {
result += "stylistic-thirteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticFourteen) {
result += "stylistic-fourteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticFifteen) {
result += "stylistic-fifteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticSixteen) {
result += "stylistic-sixteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticSeventeen) {
result += "stylistic-seventeen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticEighteen) {
result += "stylistic-eighteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticNineteen) {
result += "stylistic-nineteen" + separator;
}
if ((int)fontVariant & (int)FontVariant::StylisticTwenty) {
result += "stylistic-twenty" + separator;
}
if (!result.empty()) {
result.erase(result.length() - separator.length());
@@ -42,7 +42,27 @@ enum class FontVariant : int {
OldstyleNums = 1 << 2,
LiningNums = 1 << 3,
TabularNums = 1 << 4,
ProportionalNums = 1 << 5
ProportionalNums = 1 << 5,
StylisticOne = 1 << 6,
StylisticTwo = 1 << 7,
StylisticThree = 1 << 8,
StylisticFour = 1 << 9,
StylisticFive = 1 << 10,
StylisticSix = 1 << 11,
StylisticSeven = 1 << 12,
StylisticEight = 1 << 13,
StylisticNine = 1 << 14,
StylisticTen = 1 << 15,
StylisticEleven = 1 << 16,
StylisticTwelve = 1 << 17,
StylisticThirteen = 1 << 18,
StylisticFourteen = 1 << 19,
StylisticFifteen = 1 << 20,
StylisticSixteen = 1 << 21,
StylisticSeventeen = 1 << 22,
StylisticEighteen = 1 << 23,
StylisticNineteen = 1 << 24,
StylisticTwenty = 1 << 25
};
enum class DynamicTypeRamp {
@@ -24,6 +24,26 @@ typedef NS_OPTIONS(NSInteger, RCTFontVariant) {
RCTFontVariantLiningNums = 1 << 3,
RCTFontVariantTabularNums = 1 << 4,
RCTFontVariantProportionalNums = 1 << 5,
RCTFontVariantStylisticOne = 1 << 6,
RCTFontVariantStylisticTwo = 1 << 7,
RCTFontVariantStylisticThree = 1 << 8,
RCTFontVariantStylisticFour = 1 << 9,
RCTFontVariantStylisticFive = 1 << 10,
RCTFontVariantStylisticSix = 1 << 11,
RCTFontVariantStylisticSeven = 1 << 12,
RCTFontVariantStylisticEight = 1 << 13,
RCTFontVariantStylisticNine = 1 << 14,
RCTFontVariantStylisticTen = 1 << 15,
RCTFontVariantStylisticEleven = 1 << 16,
RCTFontVariantStylisticTwelve = 1 << 17,
RCTFontVariantStylisticThirteen = 1 << 18,
RCTFontVariantStylisticFourteen = 1 << 19,
RCTFontVariantStylisticFifteen = 1 << 20,
RCTFontVariantStylisticSixteen = 1 << 21,
RCTFontVariantStylisticSeventeen = 1 << 22,
RCTFontVariantStylisticEighteen = 1 << 23,
RCTFontVariantStylisticNineteen = 1 << 24,
RCTFontVariantStylisticTwenty = 1 << 25,
};
struct RCTFontProperties {
@@ -84,6 +84,86 @@ static NSArray *RCTFontFeatures(RCTFontVariant fontVariant)
UIFontFeatureTypeIdentifierKey : @(kNumberSpacingType),
UIFontFeatureSelectorIdentifierKey : @(kProportionalNumbersSelector),
}},
{RCTFontVariantStylisticOne, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltOneOnSelector),
}},
{RCTFontVariantStylisticTwo, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltTwoOnSelector),
}},
{RCTFontVariantStylisticThree, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltThreeOnSelector),
}},
{RCTFontVariantStylisticFour, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltFourOnSelector),
}},
{RCTFontVariantStylisticFive, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltFiveOnSelector),
}},
{RCTFontVariantStylisticSix, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltSixOnSelector),
}},
{RCTFontVariantStylisticSeven, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltSevenOnSelector),
}},
{RCTFontVariantStylisticEight, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltEightOnSelector),
}},
{RCTFontVariantStylisticNine, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltNineOnSelector),
}},
{RCTFontVariantStylisticTen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltTenOnSelector),
}},
{RCTFontVariantStylisticEleven, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltElevenOnSelector),
}},
{RCTFontVariantStylisticTwelve, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltTwelveOnSelector),
}},
{RCTFontVariantStylisticThirteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltThirteenOnSelector),
}},
{RCTFontVariantStylisticFourteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltFourteenOnSelector),
}},
{RCTFontVariantStylisticFifteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltFifteenOnSelector),
}},
{RCTFontVariantStylisticSixteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltSixteenOnSelector),
}},
{RCTFontVariantStylisticSeventeen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltSeventeenOnSelector),
}},
{RCTFontVariantStylisticEighteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltEighteenOnSelector),
}},
{RCTFontVariantStylisticNineteen, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltNineteenOnSelector),
}},
{RCTFontVariantStylisticTwenty, @{
UIFontFeatureTypeIdentifierKey : @(kStylisticAlternativesType),
UIFontFeatureSelectorIdentifierKey : @(kStylisticAltTwentyOnSelector),
}},
};
});
@@ -102,6 +182,66 @@ static NSArray *RCTFontFeatures(RCTFontVariant fontVariant)
if (fontVariant & RCTFontVariantProportionalNums) {
[fontFeatures addObject:mapping[RCTFontVariantProportionalNums]];
}
if (fontVariant & RCTFontVariantStylisticOne) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticOne]];
}
if (fontVariant & RCTFontVariantStylisticTwo) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticTwo]];
}
if (fontVariant & RCTFontVariantStylisticThree) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticThree]];
}
if (fontVariant & RCTFontVariantStylisticFour) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticFour]];
}
if (fontVariant & RCTFontVariantStylisticFive) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticFive]];
}
if (fontVariant & RCTFontVariantStylisticSix) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticSix]];
}
if (fontVariant & RCTFontVariantStylisticSeven) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticSeven]];
}
if (fontVariant & RCTFontVariantStylisticEight) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticEight]];
}
if (fontVariant & RCTFontVariantStylisticNine) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticNine]];
}
if (fontVariant & RCTFontVariantStylisticTen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticTen]];
}
if (fontVariant & RCTFontVariantStylisticEleven) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticEleven]];
}
if (fontVariant & RCTFontVariantStylisticTwelve) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticTwelve]];
}
if (fontVariant & RCTFontVariantStylisticThirteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticThirteen]];
}
if (fontVariant & RCTFontVariantStylisticFourteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticFourteen]];
}
if (fontVariant & RCTFontVariantStylisticFifteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticFifteen]];
}
if (fontVariant & RCTFontVariantStylisticSixteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticSixteen]];
}
if (fontVariant & RCTFontVariantStylisticSeventeen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticSeventeen]];
}
if (fontVariant & RCTFontVariantStylisticEighteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticEighteen]];
}
if (fontVariant & RCTFontVariantStylisticNineteen) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticNineteen]];
}
if (fontVariant & RCTFontVariantStylisticTwenty) {
[fontFeatures addObject:mapping[RCTFontVariantStylisticTwenty]];
}
return fontFeatures;
}