Skip to content

Commit

Permalink
Fix adjustsFontSizeToFit on iOS Fabric
Browse files Browse the repository at this point in the history
  • Loading branch information
janicduplessis committed Jun 22, 2024
1 parent fa12f03 commit 0f355f8
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ bool ParagraphAttributes::operator==(const ParagraphAttributes& rhs) const {
rhs.adjustsFontSizeToFit,
rhs.includeFontPadding,
rhs.android_hyphenationFrequency) &&
floatEquality(minimumFontSize, rhs.minimumFontSize) &&
floatEquality(maximumFontSize, rhs.maximumFontSize);
floatEquality(minimumFontScale, rhs.minimumFontScale);
}

bool ParagraphAttributes::operator!=(const ParagraphAttributes& rhs) const {
Expand All @@ -46,8 +45,7 @@ SharedDebugStringConvertibleList ParagraphAttributes::getDebugProps() const {
debugStringConvertibleItem("ellipsizeMode", ellipsizeMode),
debugStringConvertibleItem("textBreakStrategy", textBreakStrategy),
debugStringConvertibleItem("adjustsFontSizeToFit", adjustsFontSizeToFit),
debugStringConvertibleItem("minimumFontSize", minimumFontSize),
debugStringConvertibleItem("maximumFontSize", maximumFontSize),
debugStringConvertibleItem("minimumFontScale", minimumFontScale),
debugStringConvertibleItem("includeFontPadding", includeFontPadding),
debugStringConvertibleItem(
"android_hyphenationFrequency", android_hyphenationFrequency)};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,10 @@ class ParagraphAttributes : public DebugStringConvertible {
HyphenationFrequency android_hyphenationFrequency{};

/*
* In case of font size adjustment enabled, defines minimum and maximum
* font sizes.
* Specifies smallest possible scale a font can reach when adjustsFontSizeToFit
* is enabled. (values 0.01-1.0).
*/
Float minimumFontSize{std::numeric_limits<Float>::quiet_NaN()};
Float maximumFontSize{std::numeric_limits<Float>::quiet_NaN()};
Float minimumFontScale{0.0};

bool operator==(const ParagraphAttributes&) const;
bool operator!=(const ParagraphAttributes&) const;
Expand All @@ -93,8 +92,7 @@ struct hash<facebook::react::ParagraphAttributes> {
attributes.ellipsizeMode,
attributes.textBreakStrategy,
attributes.adjustsFontSizeToFit,
attributes.minimumFontSize,
attributes.maximumFontSize,
attributes.minimumFontScale,
attributes.includeFontPadding,
attributes.android_hyphenationFrequency);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -716,18 +716,12 @@ inline ParagraphAttributes convertRawProp(
"adjustsFontSizeToFit",
sourceParagraphAttributes.adjustsFontSizeToFit,
defaultParagraphAttributes.adjustsFontSizeToFit);
paragraphAttributes.minimumFontSize = convertRawProp(
paragraphAttributes.minimumFontScale = convertRawProp(
context,
rawProps,
"minimumFontSize",
sourceParagraphAttributes.minimumFontSize,
defaultParagraphAttributes.minimumFontSize);
paragraphAttributes.maximumFontSize = convertRawProp(
context,
rawProps,
"maximumFontSize",
sourceParagraphAttributes.maximumFontSize,
defaultParagraphAttributes.maximumFontSize);
"minimumFontScale",
sourceParagraphAttributes.minimumFontScale,
defaultParagraphAttributes.minimumFontScale);
paragraphAttributes.includeFontPadding = convertRawProp(
context,
rawProps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,14 +98,8 @@ void ParagraphProps::setProp(
paDefaults,
value,
paragraphAttributes,
minimumFontSize,
"minimumFontSize");
REBUILD_FIELD_SWITCH_CASE(
paDefaults,
value,
paragraphAttributes,
maximumFontSize,
"maximumFontSize");
minimumFontScale,
"minimumFontScale");
REBUILD_FIELD_SWITCH_CASE(
paDefaults,
value,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,14 +288,8 @@ void AndroidTextInputProps::setProp(
paDefaults,
value,
paragraphAttributes,
minimumFontSize,
"minimumFontSize");
REBUILD_FIELD_SWITCH_CASE(
paDefaults,
value,
paragraphAttributes,
maximumFontSize,
"maximumFontSize");
minimumFontScale,
"minimumFontScale");
REBUILD_FIELD_SWITCH_CASE(
paDefaults,
value,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,22 @@ - (void)getRectWithAttributedString:(AttributedString)attributedString

#pragma mark - Private

- (CGFloat)_maximumFontSizeInAttributedString:(NSAttributedString *)attributedString
{
__block CGFloat maximumFontSize = 0.0;
[attributedString enumerateAttribute:NSFontAttributeName
inRange:NSMakeRange(0, attributedString.length)
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
usingBlock:^(id _Nullable value, NSRange range, BOOL *_Nonnull stop) {
CGFloat fontSize = ((UIFont *)value).pointSize;
if (fontSize > maximumFontSize) {
maximumFontSize = fontSize;
}
}];

return maximumFontSize;
}

- (NSTextStorage *)_textStorageForNSAttributesString:(NSAttributedString *)attributedString
paragraphAttributes:(ParagraphAttributes)paragraphAttributes
size:(CGSize)size
Expand All @@ -265,8 +281,8 @@ - (NSTextStorage *)_textStorageForNSAttributesString:(NSAttributedString *)attri
[textStorage addLayoutManager:layoutManager];

if (paragraphAttributes.adjustsFontSizeToFit) {
CGFloat minimumFontSize = !isnan(paragraphAttributes.minimumFontSize) ? paragraphAttributes.minimumFontSize : 4.0;
CGFloat maximumFontSize = !isnan(paragraphAttributes.maximumFontSize) ? paragraphAttributes.maximumFontSize : 96.0;
CGFloat maximumFontSize = [self _maximumFontSizeInAttributedString:attributedString];
CGFloat minimumFontSize = MAX(paragraphAttributes.minimumFontScale * maximumFontSize, 4.0);
[textStorage scaleFontSizeToFitSize:size minimumFontSize:minimumFontSize maximumFontSize:maximumFontSize];
}

Expand Down

0 comments on commit 0f355f8

Please sign in to comment.