diff --git a/Source/ASImageNode.mm b/Source/ASImageNode.mm index 49b35d6f4..6f7994cdf 100644 --- a/Source/ASImageNode.mm +++ b/Source/ASImageNode.mm @@ -456,6 +456,7 @@ + (UIImage *)displayWithParameters:(id)parameter isCancelled:(NS_NOESC } static ASWeakMap *cache = nil; +static ASWeakMap *workingKeySourceImageMap = nil; + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters:(id)drawParameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled { @@ -464,20 +465,29 @@ + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters: dispatch_once(&onceToken, ^{ cacheLock = new AS::Mutex(); }); + + UIImage *sourceImage = key.image; { AS::MutexLocker l(*cacheLock); if (!cache) { cache = [[ASWeakMap alloc] init]; + workingKeySourceImageMap = [[ASWeakMap alloc] init]; } ASWeakMapEntry *entry = [cache entryForKey:key]; if (entry != nil) { return entry; } + ASWeakMapEntry *sourceImageEntry = [workingKeySourceImageMap entryForKey: key]; + if (sourceImageEntry != nil) { + sourceImage = sourceImageEntry.value; + } else { + [workingKeySourceImageMap setObject:sourceImage forKey:key]; + } } // cache miss - UIImage *contents = [self createContentsForkey:key drawParameters:drawParameters isCancelled:isCancelled]; + UIImage *contents = [self createContentsForkey:key sourceImage:sourceImage drawParameters:drawParameters isCancelled:isCancelled]; if (contents == nil) { // If nil, we were cancelled return nil; } @@ -488,7 +498,7 @@ + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters: } } -+ (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key drawParameters:(id)parameter isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled ++ (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key sourceImage:(UIImage *)sourceImage drawParameters:(id)parameter isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled { // The following `ASGraphicsCreateImage` call will sometimes take take longer than 5ms on an // A5 processor for a 400x800 backingSize. @@ -537,7 +547,7 @@ + (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key drawParameters:( [key.tintColor setFill]; } - @synchronized(image) { + @synchronized(sourceImage) { [image drawInRect:key.imageDrawRect blendMode:blendMode alpha:1]; }