Files
IJSVG/source/IJSVGPatternLayer.m
2019-03-14 20:11:49 +00:00

67 lines
1.8 KiB
Objective-C

//
// IJSVGPatternLayer.m
// IJSVGExample
//
// Created by Curtis Hard on 07/01/2017.
// Copyright © 2017 Curtis Hard. All rights reserved.
//
#import "IJSVGPatternLayer.h"
@implementation IJSVGPatternLayer
@synthesize pattern;
@synthesize patternNode;
- (void)dealloc
{
[pattern release], pattern = nil;
[patternNode release], patternNode = nil;
[super dealloc];
}
- (id)init
{
if((self = [super init]) != nil) {
self.requiresBackingScaleHelp = YES;
self.shouldRasterize = YES;
}
return self;
}
void IJSVGPatternDrawingCallBack(void * info, CGContextRef ctx) {
// reassign the layer
IJSVGPatternLayer * layer = (IJSVGPatternLayer *)info;
[layer.pattern renderInContext:ctx];
};
- (void)drawInContext:(CGContextRef)ctx
{
// holder for callback
static const CGPatternCallbacks callbacks = {0, &IJSVGPatternDrawingCallBack, NULL};
// create base pattern space
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(ctx, patternSpace);
CGColorSpaceRelease(patternSpace);
// create the pattern
CGRect rect = self.bounds;
CGPatternRef ref = CGPatternCreate( (void *)self, self.bounds,
CGAffineTransformIdentity,
roundf(rect.size.width*self.patternNode.width.value),
roundf(rect.size.height*self.patternNode.height.value),
kCGPatternTilingConstantSpacing,
true, &callbacks);
// set the pattern then release it
CGFloat alpha = 1.f;
CGContextSetFillPattern(ctx, ref, &alpha);
CGPatternRelease(ref);
// fill it
CGContextFillRect(ctx, rect);
}
@end