diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index da6ce21b79..f6e58442c6 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -677,7 +677,7 @@ extern asimagenode_modification_block_t ASImageNodeRoundBorderModificationBlock( [roundOutline addClip]; // Draw the original image - [originalImage drawAtPoint:CGPointZero]; + [originalImage drawAtPoint:CGPointZero blendMode:kCGBlendModeCopy alpha:1]; // Draw a border on top. if (borderWidth > 0.0) { @@ -700,7 +700,7 @@ extern asimagenode_modification_block_t ASImageNodeTintColorModificationBlock(UI // Set color and render template [color setFill]; UIImage *templateImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - [templateImage drawAtPoint:CGPointZero]; + [templateImage drawAtPoint:CGPointZero blendMode:kCGBlendModeCopy alpha:1]; UIImage *modifiedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); diff --git a/AsyncDisplayKit/Private/ASDisplayNode+AsyncDisplay.mm b/AsyncDisplayKit/Private/ASDisplayNode+AsyncDisplay.mm index fa7439cc0d..f758dfb87d 100644 --- a/AsyncDisplayKit/Private/ASDisplayNode+AsyncDisplay.mm +++ b/AsyncDisplayKit/Private/ASDisplayNode+AsyncDisplay.mm @@ -14,6 +14,7 @@ #import "ASAssert.h" #import "ASDisplayNodeInternal.h" #import "ASDisplayNode+FrameworkPrivate.h" +#import "ASInternalHelpers.h" @interface ASDisplayNode () <_ASDisplayLayerDelegate> @end @@ -113,7 +114,9 @@ if (displayBlock) { UIImage *image = (UIImage *)displayBlock(); if (image) { - [image drawInRect:bounds]; + BOOL opaque = ASImageAlphaInfoIsOpaque(CGImageGetAlphaInfo(image.CGImage)); + CGBlendMode blendMode = opaque ? kCGBlendModeCopy : kCGBlendModeNormal; + [image drawInRect:bounds blendMode:blendMode alpha:1]; } } }; diff --git a/AsyncDisplayKitTests/ASImageNodeSnapshotTests.m b/AsyncDisplayKitTests/ASImageNodeSnapshotTests.m index 8788052fc6..529cd0d009 100644 --- a/AsyncDisplayKitTests/ASImageNodeSnapshotTests.m +++ b/AsyncDisplayKitTests/ASImageNodeSnapshotTests.m @@ -58,4 +58,30 @@ @"Contents should be 100 x 100 by contents scale."); } +- (void)testTintColorBlock +{ + UIImage *test = [self testImage]; + UIImage *tinted = ASImageNodeTintColorModificationBlock([UIColor redColor])(test); + ASImageNode *node = [[ASImageNode alloc] init]; + node.image = tinted; + [node layoutThatFits:ASSizeRangeMake(test.size)]; + + ASSnapshotVerifyNode(node, nil); +} + +- (void)testRoundedCornerBlock +{ + UIGraphicsBeginImageContext(CGSizeMake(100, 100)); + [[UIColor blueColor] setFill]; + UIRectFill(CGRectMake(0, 0, 100, 100)); + UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + UIImage *rounded = ASImageNodeRoundBorderModificationBlock(2, [UIColor redColor])(result); + ASImageNode *node = [[ASImageNode alloc] init]; + node.image = rounded; + [node layoutThatFits:ASSizeRangeMake(rounded.size)]; + + ASSnapshotVerifyNode(node, nil); +} + @end diff --git a/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testRoundedCornerBlock@2x.png b/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testRoundedCornerBlock@2x.png new file mode 100644 index 0000000000..b4c17dd803 Binary files /dev/null and b/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testRoundedCornerBlock@2x.png differ diff --git a/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testTintColorBlock@2x.png b/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testTintColorBlock@2x.png new file mode 100644 index 0000000000..0cc74697a6 Binary files /dev/null and b/AsyncDisplayKitTests/ReferenceImages_64/ASImageNodeSnapshotTests/testTintColorBlock@2x.png differ