Skip to content

Commit 42dad98

Browse files
authored
[Fabric] Implement maxFontSizeMultiplier in Text (#14622)
1 parent b9b0842 commit 42dad98

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "[Fabric] Implement maxFontSizeMultiplier in Text",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

vnext/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.cpp

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
#include <unicode.h>
1616

17+
constexpr float cDefaultMaxFontSizeMultiplier = 0.0f;
18+
1719
namespace facebook::react {
1820

1921
// Creates an empty InlineObject since RN handles actually rendering the Inline object, this just reserves space for it.
@@ -81,6 +83,20 @@ void TextLayoutManager::GetTextLayout(
8183
style = DWRITE_FONT_STYLE_OBLIQUE;
8284

8385
winrt::com_ptr<IDWriteTextFormat> spTextFormat;
86+
87+
float fontSizeText = outerFragment.textAttributes.fontSize;
88+
if (outerFragment.textAttributes.allowFontScaling.value_or(true) &&
89+
!std::isnan(outerFragment.textAttributes.fontSizeMultiplier)) {
90+
float maxFontSizeMultiplierText = cDefaultMaxFontSizeMultiplier;
91+
maxFontSizeMultiplierText =
92+
(!std::isnan(outerFragment.textAttributes.maxFontSizeMultiplier)
93+
? outerFragment.textAttributes.maxFontSizeMultiplier
94+
: cDefaultMaxFontSizeMultiplier);
95+
fontSizeText *= (maxFontSizeMultiplierText >= 1.0f)
96+
? std::min(maxFontSizeMultiplierText, outerFragment.textAttributes.fontSizeMultiplier)
97+
: outerFragment.textAttributes.fontSizeMultiplier;
98+
}
99+
84100
winrt::check_hresult(Microsoft::ReactNative::DWriteFactory()->CreateTextFormat(
85101
outerFragment.textAttributes.fontFamily.empty()
86102
? L"Segoe UI"
@@ -90,10 +106,7 @@ void TextLayoutManager::GetTextLayout(
90106
static_cast<facebook::react::FontWeight>(DWRITE_FONT_WEIGHT_REGULAR))),
91107
style,
92108
DWRITE_FONT_STRETCH_NORMAL,
93-
(outerFragment.textAttributes.allowFontScaling.value_or(true) &&
94-
!std::isnan(outerFragment.textAttributes.fontSizeMultiplier))
95-
? (outerFragment.textAttributes.fontSizeMultiplier * outerFragment.textAttributes.fontSize)
96-
: outerFragment.textAttributes.fontSize,
109+
fontSizeText,
97110
L"",
98111
spTextFormat.put()));
99112

@@ -206,11 +219,18 @@ void TextLayoutManager::GetTextLayout(
206219
attributes.fontWeight.value_or(static_cast<facebook::react::FontWeight>(DWRITE_FONT_WEIGHT_REGULAR))),
207220
range));
208221
winrt::check_hresult(spTextLayout->SetFontStyle(fragmentStyle, range));
209-
winrt::check_hresult(spTextLayout->SetFontSize(
210-
(attributes.allowFontScaling.value_or(true) && !std::isnan(attributes.fontSizeMultiplier))
211-
? (attributes.fontSizeMultiplier * attributes.fontSize)
212-
: attributes.fontSize,
213-
range));
222+
223+
float maxFontSizeMultiplier = cDefaultMaxFontSizeMultiplier;
224+
maxFontSizeMultiplier =
225+
(!std::isnan(attributes.maxFontSizeMultiplier) ? attributes.maxFontSizeMultiplier
226+
: cDefaultMaxFontSizeMultiplier);
227+
float fontSize = attributes.fontSize;
228+
if (attributes.allowFontScaling.value_or(true) && (!std::isnan(attributes.fontSizeMultiplier))) {
229+
fontSize *= (maxFontSizeMultiplier >= 1.0f) ? std::min(maxFontSizeMultiplier, attributes.fontSizeMultiplier)
230+
: attributes.fontSizeMultiplier;
231+
}
232+
233+
winrt::check_hresult(spTextLayout->SetFontSize(fontSize, range));
214234

215235
if (!isnan(attributes.letterSpacing)) {
216236
winrt::check_hresult(

0 commit comments

Comments
 (0)