Merge pull request #1343 from rcancro/cacheFontScale

[ASTextNode] Improvements to the implementation of the font scale adjuster.
This commit is contained in:
appleguy 2016-03-09 02:41:13 -08:00
commit 1ce3834e0e
3 changed files with 26 additions and 11 deletions

View File

@ -337,7 +337,18 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ];
[self setNeedsDisplay];
return [[self _renderer] size];
CGSize size = [[self _renderer] size];
if (self.attributedString.length > 0) {
CGFloat screenScale = ASScreenScale();
self.ascender = round([[_attributedString attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] ascender] * screenScale)/screenScale;
self.descender = round([[_attributedString attribute:NSFontAttributeName atIndex:_attributedString.length - 1 effectiveRange:NULL] descender] * screenScale)/screenScale;
if (_renderer.currentScaleFactor > 0 && _renderer.currentScaleFactor < 1.0) {
// while not perfect, this is a good estimate of what the ascender of the scaled font will be.
self.ascender *= _renderer.currentScaleFactor;
self.descender *= _renderer.currentScaleFactor;
}
}
return size;
}
#pragma mark - Modifying User Text
@ -375,12 +386,6 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ];
} else {
self.isAccessibilityElement = YES;
}
if (attributedString.length > 0) {
CGFloat screenScale = ASScreenScale();
self.ascender = round([[attributedString attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] ascender] * screenScale)/screenScale;
self.descender = round([[attributedString attribute:NSFontAttributeName atIndex:attributedString.length - 1 effectiveRange:NULL] descender] * screenScale)/screenScale;
}
}
#pragma mark - Text Layout

View File

@ -72,7 +72,7 @@ ASStackBaselinePositionedLayout ASStackBaselinePositionedLayout::compute(const A
baseline will be larger so we will keep that as the max baseline.
However, if were to align from the last baseline we'd find the max baseline by taking the height of node and adding
the font's descender (its negative). In the case of the first node, which is only 1 line, this should be the same value as the ascender.
the font's descender (it's negative). In the case of the first node, which is only 1 line, this should be the same value as the ascender.
The second node, however, has a larger height and there will have a larger baseline offset.
*/
const auto baselineIt = std::max_element(positionedLayout.sublayouts.begin(), positionedLayout.sublayouts.end(), [&](const ASLayout *a, const ASLayout *b){

View File

@ -20,6 +20,8 @@
__weak ASTextKitContext *_context;
ASTextKitAttributes _attributes;
std::mutex _textKitMutex;
BOOL _measured;
CGFloat _scaleFactor;
}
- (instancetype)initWithContext:(ASTextKitContext *)context
@ -85,7 +87,7 @@
NSLayoutManager *layoutManager = _attributes.layoutManagerCreationBlock ? _attributes.layoutManagerCreationBlock() : [[ASLayoutManager alloc] init];
layoutManager.usesFontLeading = NO;
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:_constrainedSize];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(_constrainedSize.width, FLT_MAX)];
textContainer.lineFragmentPadding = 0;
textContainer.lineBreakMode = _attributes.lineBreakMode;
@ -104,8 +106,14 @@
- (CGFloat)scaleFactor
{
if (_measured) {
return _scaleFactor;
}
if ([_attributes.pointSizeScaleFactors count] == 0 || isinf(_constrainedSize.width)) {
return 1.0;
_measured = YES;
_scaleFactor = 1.0;
return _scaleFactor;
}
__block CGFloat adjustedScale = 1.0;
@ -177,7 +185,9 @@
}
}];
return adjustedScale;
_measured = YES;
_scaleFactor = adjustedScale;
return _scaleFactor;
}
@end