Skip to content

Commit

Permalink
Some more
Browse files Browse the repository at this point in the history
  • Loading branch information
maicki committed May 4, 2017
1 parent dc1291e commit 8c5267b
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 40 deletions.
5 changes: 5 additions & 0 deletions Source/ASDisplayNode.mm
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,11 @@ - (CGRect)threadSafeBounds
return _threadSafeBounds;
}

- (CGRect)_locked_threadSafeBounds
{
return _threadSafeBounds;
}

- (void)setThreadSafeBounds:(CGRect)newBounds
{
ASDN::MutexLocker l(__instanceLock__);
Expand Down
91 changes: 51 additions & 40 deletions Source/ASTextNode.mm
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,39 @@ - (BOOL)isEqual:(ASTextNodeRendererKey *)object
return renderer;
}

#pragma mark - ASTextNodeDisplayContext
#pragma mark - ASTextNodeDrawParametert

@interface ASTextNodeDrawParameter : NSObject {
std::unique_ptr<ASTextKitAttributes> _rendererAttributes;
}
@property (nonatomic, readonly, /*nullable*/) UIColor *backgroundColor;
@property (nonatomic, readonly) UIEdgeInsets textContainerInsets;

- (ASTextKitRenderer *)rendererForBounds:(CGRect)bounds;

@interface ASTextNodeDrawParameter : NSObject
@property (strong) UIColor *backgroundColor;
@property (assign) UIEdgeInsets textContainerInsets;
@property (assign) std::shared_ptr<ASTextKitAttributes> rendererAttributes;
@end

@implementation ASTextNodeDrawParameter

- (instancetype)initWithRendererAttributes:(ASTextKitAttributes)rendererAttributes
backgroundColor:(/*nullable*/ UIColor *)backgroundColor
textContainerInsets:(UIEdgeInsets)textContainerInsets
{
self = [super init];
if (self != nil) {
_rendererAttributes = ASDN::make_unique<ASTextKitAttributes>(rendererAttributes);
_backgroundColor = backgroundColor;
_textContainerInsets = textContainerInsets;
}
return self;
}

- (ASTextKitRenderer *)rendererForBounds:(CGRect)bounds
{
CGRect rect = UIEdgeInsetsInsetRect(bounds, self.textContainerInsets);
return rendererForAttributes(*_rendererAttributes.get(), rect.size);
}

@end


Expand Down Expand Up @@ -289,8 +313,8 @@ - (BOOL)supportsLayerBacking

- (ASTextKitRenderer *)_renderer
{
CGSize constrainedSize = self.threadSafeBounds.size;
return [self _rendererWithBounds:{.size = constrainedSize}];
ASDN::MutexLocker l(__instanceLock__);
return [self _locked_renderer];
}

- (ASTextKitRenderer *)_rendererWithBounds:(CGRect)bounds
Expand All @@ -299,16 +323,15 @@ - (ASTextKitRenderer *)_rendererWithBounds:(CGRect)bounds
return [self _locked_rendererWithBounds:bounds];
}

- (ASTextKitRenderer *)_locked_rendererWithBounds:(CGRect)bounds
- (ASTextKitRenderer *)_locked_renderer
{
bounds = UIEdgeInsetsInsetRect(bounds, _textContainerInset);
return rendererForAttributes([self _rendererAttributes], bounds.size);
return [self _locked_rendererWithBounds:[self _locked_threadSafeBounds]];
}

- (ASTextKitAttributes)_rendererAttributes
- (ASTextKitRenderer *)_locked_rendererWithBounds:(CGRect)bounds
{
ASDN::MutexLocker l(__instanceLock__);
return [self _locked_rendererAttributes];
bounds = UIEdgeInsetsInsetRect(bounds, _textContainerInset);
return rendererForAttributes([self _locked_rendererAttributes], bounds.size);
}

- (ASTextKitAttributes)_locked_rendererAttributes
Expand Down Expand Up @@ -477,28 +500,23 @@ - (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer
{
ASDN::MutexLocker l(__instanceLock__);

ASTextNodeDrawParameter *drawParameter = [[ASTextNodeDrawParameter alloc] init];
drawParameter.textContainerInsets = _textContainerInset;
drawParameter.backgroundColor = self.backgroundColor;
drawParameter.rendererAttributes = std::make_shared<ASTextKitAttributes>([self _locked_rendererAttributes]);
return drawParameter;
return [[ASTextNodeDrawParameter alloc] initWithRendererAttributes:[self _locked_rendererAttributes]
backgroundColor:self.backgroundColor
textContainerInsets:_textContainerInset];
}

+ (void)drawRect:(CGRect)bounds withParameters:(id)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelledBlock isRasterizing:(BOOL)isRasterizing
{
ASTextNodeDrawParameter *drawParameter = (ASTextNodeDrawParameter *)parameters;
UIColor *backgroundColor = isRasterizing ? nil : drawParameter.backgroundColor;
UIEdgeInsets textContainerInset = drawParameter.textContainerInsets;
ASTextKitAttributes rendererAttributes = *drawParameter.rendererAttributes.get();

CGRect rect = UIEdgeInsetsInsetRect(bounds, textContainerInset);
ASTextKitRenderer *renderer = rendererForAttributes(rendererAttributes, rect.size);
UIEdgeInsets textContainerInsets = drawParameter.textContainerInsets;
ASTextKitRenderer *renderer = [drawParameter rendererForBounds:bounds];

CGContextRef context = UIGraphicsGetCurrentContext();
ASDisplayNodeAssert(context, @"This is no good without a context.");

CGContextSaveGState(context);
CGContextTranslateCTM(context, textContainerInset.left, textContainerInset.top);
CGContextTranslateCTM(context, textContainerInsets.left, textContainerInsets.top);

// Fill background
if (backgroundColor != nil) {
Expand Down Expand Up @@ -534,7 +552,7 @@ - (id)_linkAttributeValueAtPoint:(CGPoint)point

ASDN::MutexLocker l(__instanceLock__);

ASTextKitRenderer *renderer = [self _renderer];
ASTextKitRenderer *renderer = [self _locked_renderer];
NSRange visibleRange = renderer.firstVisibleRange;
NSAttributedString *attributedString = _attributedText;
NSRange clampedRange = NSIntersectionRange(visibleRange, NSMakeRange(0, attributedString.length));
Expand Down Expand Up @@ -840,7 +858,7 @@ - (NSArray *)_rectsForTextRange:(NSRange)textRange measureOption:(ASTextKitRende
{
ASDN::MutexLocker l(__instanceLock__);

NSArray *rects = [[self _renderer] rectsForTextRange:textRange measureOption:measureOption];
NSArray *rects = [[self _locked_renderer] rectsForTextRange:textRange measureOption:measureOption];
NSMutableArray *adjustedRects = [NSMutableArray array];

for (NSValue *rectValue in rects) {
Expand All @@ -858,15 +876,15 @@ - (CGRect)trailingRect
{
ASDN::MutexLocker l(__instanceLock__);

CGRect rect = [[self _renderer] trailingRect];
CGRect rect = [[self _locked_renderer] trailingRect];
return ASTextNodeAdjustRenderRectForShadowPadding(rect, self.shadowPadding);
}

- (CGRect)frameForTextRange:(NSRange)textRange
{
ASDN::MutexLocker l(__instanceLock__);

CGRect frame = [[self _renderer] frameForTextRange:textRange];
CGRect frame = [[self _locked_renderer] frameForTextRange:textRange];
return ASTextNodeAdjustRenderRectForShadowPadding(frame, self.shadowPadding);
}

Expand Down Expand Up @@ -896,7 +914,7 @@ - (UIImage *)placeholderImage
UIGraphicsBeginImageContext(size);
[self.placeholderColor setFill];

ASTextKitRenderer *renderer = [self _renderer];
ASTextKitRenderer *renderer = [self _locked_renderer];
NSRange visibleRange = renderer.firstVisibleRange;

// cap height is both faster and creates less subpixel blending
Expand Down Expand Up @@ -974,7 +992,7 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
NSRange visibleRange = NSMakeRange(0, 0);
{
ASDN::MutexLocker l(__instanceLock__);
visibleRange = [self _renderer].firstVisibleRange;
visibleRange = [self _locked_renderer].firstVisibleRange;
}
NSRange truncationMessageRange = [self _additionalTruncationMessageRangeWithVisibleRange:visibleRange];
[self _setHighlightRange:truncationMessageRange forAttributeName:ASTextNodeTruncationTokenAttributeName value:nil animated:YES];
Expand Down Expand Up @@ -1156,15 +1174,9 @@ - (void)setShadowRadius:(CGFloat)shadowRadius
}

- (UIEdgeInsets)shadowPadding
{
return [self shadowPaddingWithRenderer:[self _renderer]];
}

- (UIEdgeInsets)shadowPaddingWithRenderer:(ASTextKitRenderer *)renderer
{
ASDN::MutexLocker l(__instanceLock__);

return renderer.shadower.shadowPadding;
return [self _locked_renderer].shadower.shadowPadding;
}

#pragma mark - Truncation Message
Expand Down Expand Up @@ -1228,8 +1240,7 @@ - (BOOL)isTruncated
{
ASDN::MutexLocker l(__instanceLock__);

ASTextKitRenderer *renderer = [self _renderer];
return renderer.isTruncated;
return [[self _locked_renderer] isTruncated];
}

- (void)setPointSizeScaleFactors:(NSArray *)pointSizeScaleFactors
Expand Down Expand Up @@ -1265,7 +1276,7 @@ - (NSUInteger)lineCount
{
ASDN::MutexLocker l(__instanceLock__);

return [[self _renderer] lineCount];
return [[self _locked_renderer] lineCount];
}

#pragma mark - Truncation Message
Expand Down
10 changes: 10 additions & 0 deletions Source/Details/ASThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,4 +425,14 @@ namespace ASDN {

} // namespace ASDN

// Helper for creating a unique::ptr. Starting available C++14

namespace ASDN {
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
}

#endif /* __cplusplus */
3 changes: 3 additions & 0 deletions Source/Private/ASDisplayNode+FrameworkPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ __unused static NSString * _Nonnull NSStringFromASHierarchyState(ASHierarchyStat
// Thread safe way to access the bounds of the node
@property (nonatomic, assign) CGRect threadSafeBounds;

// Returns the bounds of the node without reaching the view or layer
- (CGRect)_locked_threadSafeBounds;

// delegate to inform of ASInterfaceState changes (used by ASNodeController)
@property (nonatomic, weak) id<ASInterfaceStateDelegate> interfaceStateDelegate;

Expand Down

0 comments on commit 8c5267b

Please sign in to comment.