diff --git a/Framework/IJSVG/IJSVG.xcodeproj/project.pbxproj b/Framework/IJSVG/IJSVG.xcodeproj/project.pbxproj index eb065a3..cc04b50 100644 --- a/Framework/IJSVG/IJSVG.xcodeproj/project.pbxproj +++ b/Framework/IJSVG/IJSVG.xcodeproj/project.pbxproj @@ -33,6 +33,8 @@ 599EB4D3238FF570004CB6BC /* libobjc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 599EB4D2238FF535004CB6BC /* libobjc.tbd */; }; 59A24EBC23F480EA0090C374 /* IJSVGUnitSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A24EBA23F480EA0090C374 /* IJSVGUnitSize.h */; settings = {ATTRIBUTES = (Public, ); }; }; 59A24EBD23F480EA0090C374 /* IJSVGUnitSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A24EBB23F480EA0090C374 /* IJSVGUnitSize.m */; }; + 59AC865A2810156B00CD5685 /* IJSVGThreadManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 59AC86582810156B00CD5685 /* IJSVGThreadManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59AC865B2810156B00CD5685 /* IJSVGThreadManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 59AC86592810156B00CD5685 /* IJSVGThreadManager.m */; }; 59E7CFAF23B148600077D599 /* IJSVGCommandParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 59E7CFAD23B148600077D599 /* IJSVGCommandParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; 59E7CFB023B148600077D599 /* IJSVGCommandParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E7CFAE23B148600077D599 /* IJSVGCommandParser.m */; }; 59EB75D623905F7300F5AE63 /* IJSVGLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 59EB756523905F6B00F5AE63 /* IJSVGLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -183,6 +185,8 @@ 599EB4D2238FF535004CB6BC /* libobjc.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libobjc.tbd; path = usr/lib/libobjc.tbd; sourceTree = SDKROOT; }; 59A24EBA23F480EA0090C374 /* IJSVGUnitSize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IJSVGUnitSize.h; sourceTree = ""; }; 59A24EBB23F480EA0090C374 /* IJSVGUnitSize.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IJSVGUnitSize.m; sourceTree = ""; }; + 59AC86582810156B00CD5685 /* IJSVGThreadManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IJSVGThreadManager.h; sourceTree = ""; }; + 59AC86592810156B00CD5685 /* IJSVGThreadManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IJSVGThreadManager.m; sourceTree = ""; }; 59E7CFAD23B148600077D599 /* IJSVGCommandParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IJSVGCommandParser.h; path = IJSVG/Source/Parsing/IJSVGCommandParser.h; sourceTree = SOURCE_ROOT; }; 59E7CFAE23B148600077D599 /* IJSVGCommandParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = IJSVGCommandParser.m; path = IJSVG/Source/Parsing/IJSVGCommandParser.m; sourceTree = SOURCE_ROOT; }; 59EB756523905F6B00F5AE63 /* IJSVGLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJSVGLayer.h; sourceTree = ""; }; @@ -490,6 +494,8 @@ 591A3E4C25CC91F800AD45B7 /* IJSVGParsing.m */, 59F9EAF62808BB5F00188ACB /* IJSVGViewBox.h */, 59F9EAF72808BB5F00188ACB /* IJSVGViewBox.m */, + 59AC86582810156B00CD5685 /* IJSVGThreadManager.h */, + 59AC86592810156B00CD5685 /* IJSVGThreadManager.m */, ); path = Utils; sourceTree = ""; @@ -675,6 +681,7 @@ 595BA91C280EB29B00AD1C89 /* IJSVGFilterLayer.h in Headers */, 590AA096280DE668002BBE12 /* IJSVGFilterEffectGaussianBlur.h in Headers */, 590EB7A427F637EF0047CECF /* IJSVGTransformLayer.h in Headers */, + 59AC865A2810156B00CD5685 /* IJSVGThreadManager.h in Headers */, 5978C46A280A241200D25296 /* IJSVGRootLayer.h in Headers */, 59F9EAF82808BB5F00188ACB /* IJSVGViewBox.h in Headers */, 59EB760B23905F7300F5AE63 /* IJSVGStyleSheetSelector.h in Headers */, @@ -756,6 +763,7 @@ 59EB763923905F7300F5AE63 /* IJSVGCommandSmoothQuadraticCurve.m in Sources */, 59EB75D823905F7300F5AE63 /* IJSVGStyleSheetRule.m in Sources */, 590AA092280DDDA3002BBE12 /* IJSVGFilterEffect.m in Sources */, + 59AC865B2810156B00CD5685 /* IJSVGThreadManager.m in Sources */, 59EB75FB23905F7300F5AE63 /* IJSVGPath.m in Sources */, 590AA097280DE668002BBE12 /* IJSVGFilterEffectGaussianBlur.m in Sources */, 59F36509262F1ABB00BCE3FD /* IJSVGColorType.m in Sources */, diff --git a/Framework/IJSVG/IJSVG/Source/Commands/IJSVGCommand.m b/Framework/IJSVG/IJSVG/Source/Commands/IJSVGCommand.m index 2f61c52..9352a48 100644 --- a/Framework/IJSVG/IJSVG/Source/Commands/IJSVGCommand.m +++ b/Framework/IJSVG/IJSVG/Source/Commands/IJSVGCommand.m @@ -19,6 +19,7 @@ #import "IJSVGCommandSmoothCurve.h" #import "IJSVGCommandSmoothQuadraticCurve.h" #import "IJSVGCommandVerticalLine.h" +#import "IJSVGThreadManager.h" @implementation IJSVGCommand @@ -112,10 +113,9 @@ + (NSArray*)commandsForDataCharacters:(const char*)buffer { - IJSVGPathDataStream* stream = IJSVGPathDataStreamCreateDefault(); + IJSVGThreadManager* manager = IJSVGThreadManager.currentManager; NSArray* commands = [self commandsForDataCharacters:buffer - dataStream:stream]; - IJSVGPathDataStreamRelease(stream); + dataStream:manager.pathDataStream]; return commands; } diff --git a/Framework/IJSVG/IJSVG/Source/Core/IJSVG.m b/Framework/IJSVG/IJSVG/Source/Core/IJSVG.m index 9286b11..605b861 100644 --- a/Framework/IJSVG/IJSVG/Source/Core/IJSVG.m +++ b/Framework/IJSVG/IJSVG/Source/Core/IJSVG.m @@ -750,7 +750,7 @@ CGContextSaveGState(ref); // make sure we setup a transaction CGFloat backingScale = [self backingScaleFactor]; - [IJSVGLayer logLayer:self.rootLayer]; +// [IJSVGLayer logLayer:self.rootLayer]; [self.rootLayer renderInContext:ref viewPort:rect backingScale:backingScale diff --git a/Framework/IJSVG/IJSVG/Source/Layers/IJSVGLayer.m b/Framework/IJSVG/IJSVG/Source/Layers/IJSVGLayer.m index 40bab03..45d2a95 100644 --- a/Framework/IJSVG/IJSVG/Source/Layers/IJSVGLayer.m +++ b/Framework/IJSVG/IJSVG/Source/Layers/IJSVGLayer.m @@ -261,9 +261,6 @@ [IJSVGLayer renderLayer:layer inContext:offscreenContext]; CGImageRef image = CGBitmapContextCreateImage(offscreenContext); - NSImage* prev = [[[NSImage alloc] initWithCGImage:image - size:NSMakeSize(CGImageGetWidth(image), CGImageGetHeight(image))] autorelease]; - CGContextRelease(offscreenContext); return image; } diff --git a/Framework/IJSVG/IJSVG/Source/Nodes/Filter Effects/IJSVGFilterEffectGaussianBlur.m b/Framework/IJSVG/IJSVG/Source/Nodes/Filter Effects/IJSVGFilterEffectGaussianBlur.m index 21ff927..82ac5b4 100644 --- a/Framework/IJSVG/IJSVG/Source/Nodes/Filter Effects/IJSVGFilterEffectGaussianBlur.m +++ b/Framework/IJSVG/IJSVG/Source/Nodes/Filter Effects/IJSVGFilterEffectGaussianBlur.m @@ -7,12 +7,26 @@ // #import "IJSVGFilterEffectGaussianBlur.h" +#import @implementation IJSVGFilterEffectGaussianBlur ++ (CIFilter*)sharedFilter +{ + IJSVGThreadManager* manager = IJSVGThreadManager.currentManager; + NSString* key = @"CIFilterGaussianBlur"; + CIFilter* filter = nil; + if((filter = [manager userInfoObjectForKey:key]) == nil) { + filter = [CIFilter filterWithName:@"CIGaussianBlur"]; + [manager setUserInfoObject:filter + forKey:key]; + } + return filter; +} + - (CIImage*)processImage:(CIImage*)image { - CIFilter* filter = [CIFilter filterWithName:@"CIGaussianBlur"]; + CIFilter* filter = [self.class sharedFilter]; [filter setDefaults]; [filter setValue:image forKey:kCIInputImageKey]; [filter setValue:@(self.stdDeviation.value) forKey:kCIInputRadiusKey]; diff --git a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGFilter.m b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGFilter.m index d71791a..b1ef82b 100644 --- a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGFilter.m +++ b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGFilter.m @@ -9,6 +9,7 @@ #import "IJSVGFilter.h" #import "IJSVGFilterEffect.h" #import "IJSVGLayer.h" +#import @implementation IJSVGFilter @@ -18,22 +19,26 @@ IJSVGFilter* filter = layer.filter; layer.filter = nil; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + uint32_t info = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little; CGImageRef originalImage = [IJSVGLayer newImageForLayer:layer colorSpace:colorSpace - bitmapInfo:kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little + bitmapInfo:info scale:1.f]; CIImage* image = [CIImage imageWithCGImage:originalImage]; CGColorSpaceRelease(colorSpace); CGImageRelease(originalImage); + for(IJSVGFilterEffect* effect in self.children) { image = [effect processImage:image]; } - CIContext* context = [CIContext context]; + + IJSVGThreadManager* manager = IJSVGThreadManager.currentManager; + CIContext* context = manager.CIContext; CGImageRef outputImage = [context createCGImage:image fromRect:image.extent]; - NSImage* nimage = [[[NSImage alloc] initWithCGImage:outputImage - size:NSMakeSize(CGImageGetWidth(outputImage), - CGImageGetHeight(outputImage))] autorelease]; +// NSImage* nimage = [[[NSImage alloc] initWithCGImage:outputImage +// size:NSMakeSize(CGImageGetWidth(outputImage), +// CGImageGetHeight(outputImage))] autorelease]; layer.filter = filter; return outputImage; } diff --git a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.h b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.h index 74b73c9..6403a7c 100644 --- a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.h +++ b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.h @@ -61,6 +61,7 @@ typedef NS_ENUM(NSInteger, IJSVGNodeType) { IJSVGNodeTypeNotFound, IJSVGNodeTypeFilter, IJSVGNodeTypeFilterEffect, + IJSVGNodeTypeForeignObject, IJSVGNodeTypeUnknown, }; diff --git a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.m b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.m index 4b07657..00aff73 100644 --- a/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.m +++ b/Framework/IJSVG/IJSVG/Source/Nodes/IJSVGNode.m @@ -137,6 +137,9 @@ if(strcmp(name, "desc") == 0) { return IJSVGNodeTypeDesc; } + if(strcmp(name, "foreignobject") == 0) { + return IJSVGNodeTypeForeignObject; + } if(strcmp(name, "filter") == 0) { return IJSVGNodeTypeFilter; } diff --git a/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.h b/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.h index 2da48b1..2f1b570 100644 --- a/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.h +++ b/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.h @@ -25,6 +25,7 @@ #import #import #import +#import #import #import diff --git a/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.m b/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.m index dda672f..141c6f5 100644 --- a/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.m +++ b/Framework/IJSVG/IJSVG/Source/Parsing/IJSVGParser.m @@ -134,9 +134,6 @@ static NSDictionary* _IJSVGAttributeDictionaryTransforms = nil; (void)([_detachedElements release]), _detachedElements = nil; (void)([_rootNode release]), _rootNode = nil; (void)([_styleSheet release]), _styleSheet = nil; - if (_commandDataStream != NULL) { - (void)IJSVGPathDataStreamRelease(_commandDataStream), _commandDataStream = nil; - } [super dealloc]; } @@ -263,7 +260,8 @@ static NSDictionary* _IJSVGAttributeDictionaryTransforms = nil; - (void)begin { // setup basics to begin with _styleSheet = [[IJSVGStyleSheet alloc] init]; - _commandDataStream = IJSVGPathDataStreamCreateDefault(); + IJSVGThreadManager* manager = IJSVGThreadManager.currentManager; + _commandDataStream = manager.pathDataStream; _detachedElements = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory valueOptions:NSPointerFunctionsStrongMemory capacity:1]; @@ -289,26 +287,6 @@ static NSDictionary* _IJSVGAttributeDictionaryTransforms = nil; - (void)computeViewBoxForRootNode:(IJSVGRootNode*)node { -// NSXMLNode* attribute = nil; -// if () { -// CGFloat* box = [IJSVGUtils parseViewBox:attribute.stringValue]; -// rootNode.viewBox = [IJSVGUnitRect rectWithX:box[0] y:box[1] -// width:box[2] height:box[3]]; -// (void)free(box); -// } else { -// // its possible wlength or hlength are nil -// CGFloat w = _rootNode.width.value; -// CGFloat h = _rootNode.height.value; -// -// if (h == 0.f && w != 0.f) { -// h = w; -// } else if (w == 0.f && h != 0.f) { -// w = h; -// } -// rootNode.viewBox = [IJSVGUnitRect rectWithX:0.f y:0.f -// width:w height:h]; -// } - if(node.viewBox == nil) { CGFloat width = node.width.value; CGFloat height = node.height.value; @@ -632,6 +610,11 @@ static NSDictionary* _IJSVGAttributeDictionaryTransforms = nil; IJSVGNode* computedNode = nil; switch(nodeType) { + case IJSVGNodeTypeForeignObject: { + // do nothing for foreign objects, we dont support them + break; + } + case IJSVGNodeTypeStyle: { [self parseStyleElement:element parentNode:node]; diff --git a/Framework/IJSVG/IJSVG/Source/Rendering/IJSVGLayerTree.m b/Framework/IJSVG/IJSVG/Source/Rendering/IJSVGLayerTree.m index 86b3712..aee9884 100644 --- a/Framework/IJSVG/IJSVG/Source/Rendering/IJSVGLayerTree.m +++ b/Framework/IJSVG/IJSVG/Source/Rendering/IJSVGLayerTree.m @@ -231,12 +231,6 @@ // its highly likely that the stroke layer is larger than the layer its being // drawing into, so we need to increase the layer size to match or any groups // that this is inside wont be the correct frame -// layer.borderColor = NSColor.greenColor.CGColor; -// layer.borderWidth = 1.f; - -// CGRect strokeLayerFrame = strokeLayer.frame; -// strokeLayerFrame.origin.x = strokeLayerFrame.origin.y = strokeWidthDifference; -// strokeLayer.frame = strokeLayerFrame; // we need to work out what type of fill we need for the layer switch([IJSVGLayer fillTypeForFill:node.stroke]) { @@ -251,7 +245,7 @@ [layer addSublayer:patternLayer]; break; } -// // gradients + // gradients case IJSVGLayerFillTypeGradient: { IJSVGGradientLayer* gradientLayer = nil; gradientLayer = [self drawableBasicGradientLayerForLayer:strokeLayer diff --git a/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.h b/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.h new file mode 100644 index 0000000..53d2583 --- /dev/null +++ b/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.h @@ -0,0 +1,32 @@ +// +// IJSVGThreadManager.h +// IJSVG +// +// Created by Curtis Hard on 20/04/2022. +// Copyright © 2022 Curtis Hard. All rights reserved. +// + +#import +#import +#import +#import +#import + +@interface IJSVGThreadManager : NSObject { + +@private + NSMutableDictionary* _userInfo; +} + +@property (nonatomic, readonly) NSThread* thread; +@property (nonatomic, readonly) CIContext* CIContext; +@property (nonatomic, readonly) IJSVGPathDataStream* pathDataStream; + ++ (IJSVGThreadManager*)managerForThread:(NSThread*)thread; ++ (IJSVGThreadManager*)currentManager; + +- (void)setUserInfoObject:(id)object + forKey:(id)key; +- (id)userInfoObjectForKey:(id)key; + +@end diff --git a/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.m b/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.m new file mode 100644 index 0000000..761fb9a --- /dev/null +++ b/Framework/IJSVG/IJSVG/Source/Utils/IJSVGThreadManager.m @@ -0,0 +1,119 @@ +// +// IJSVGThreadManager.m +// IJSVG +// +// Created by Curtis Hard on 20/04/2022. +// Copyright © 2022 Curtis Hard. All rights reserved. +// + +#import "IJSVGThreadManager.h" + +@implementation IJSVGThreadManager + +@synthesize CIContext = _CIContext; +@synthesize pathDataStream = _pathDataStream; + +static NSMapTable* managerMap; + ++ (NSMapTable*)mapTable +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + managerMap = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory + valueOptions:NSPointerFunctionsStrongMemory + capacity:1]; + }); + return managerMap; +} + ++ (IJSVGThreadManager*)managerForThread:(NSThread*)thread +{ + IJSVGThreadManager* manager = nil; + NSMapTable* map = [self mapTable]; + @synchronized (map) { + if((manager = [map objectForKey:thread]) == nil) { + manager = [[[self alloc] initWithThread:thread] autorelease]; + [map setObject:manager forKey:thread]; + } + } + return manager; +} + ++ (IJSVGThreadManager *)currentManager +{ + return [self managerForThread:NSThread.currentThread]; +} + +- (void)dealloc +{ + (void)[_userInfo release], _userInfo = nil; + (void)[_thread release], _thread = nil; + (void)[_CIContext release], _CIContext = nil; + if(_pathDataStream != NULL) { + (void)IJSVGPathDataStreamRelease(_pathDataStream), _pathDataStream = NULL; + } + [super dealloc]; +} + +- (id)initWithThread:(NSThread*)thread +{ + if((self = [super init]) != nil) { + // store the thread + _thread = thread.retain; + + // listen for teardown of the thread + NSNotificationCenter* center = NSNotificationCenter.defaultCenter; + [center addObserver:self + selector:@selector(tearDownFromThreadExit) + name:NSThreadWillExitNotification + object:_thread]; + } + return self; +} + +- (void)setUserInfoObject:(id)object + forKey:(id)key +{ + if(_userInfo == nil) { + _userInfo = [[NSMutableDictionary alloc] init]; + } + _userInfo[key] = object; +} + +- (id)userInfoObjectForKey:(id)key +{ + if(_userInfo == nil) { + return nil; + } + return _userInfo[key]; +} + +- (void)tearDownFromThreadExit +{ + NSMapTable* map = [self.class mapTable]; + @synchronized (map) { + [map removeObjectForKey:_thread]; + } +} + +- (CIContext*)CIContext +{ + if(_CIContext == nil) { + // for high performance we can disable the color + // management + _CIContext = [CIContext contextWithOptions:@{ + kCIImageColorSpace: NSNull.null + }].retain; + } + return _CIContext; +} + +- (IJSVGPathDataStream*)pathDataStream +{ + if(_pathDataStream == NULL) { + _pathDataStream = IJSVGPathDataStreamCreateDefault(); + } + return _pathDataStream; +} + +@end diff --git a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj index de61f2e..5b68a34 100644 --- a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj +++ b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj @@ -478,7 +478,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -515,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; diff --git a/IJSVGExample/IJSVGExample.xcodeproj/project.xcworkspace/xcuserdata/curtishard.xcuserdatad/UserInterfaceState.xcuserstate b/IJSVGExample/IJSVGExample.xcodeproj/project.xcworkspace/xcuserdata/curtishard.xcuserdatad/UserInterfaceState.xcuserstate index 06765cf..ee0ac5d 100644 Binary files a/IJSVGExample/IJSVGExample.xcodeproj/project.xcworkspace/xcuserdata/curtishard.xcuserdatad/UserInterfaceState.xcuserstate and b/IJSVGExample/IJSVGExample.xcodeproj/project.xcworkspace/xcuserdata/curtishard.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/IJSVGExample/IJSVGExample.xcodeproj/xcuserdata/curtishard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/IJSVGExample/IJSVGExample.xcodeproj/xcuserdata/curtishard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 9414b3b..c8984e0 100644 --- a/IJSVGExample/IJSVGExample.xcodeproj/xcuserdata/curtishard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/IJSVGExample/IJSVGExample.xcodeproj/xcuserdata/curtishard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -20,69 +20,5 @@ landmarkType = "7"> - - - - - - - - - - - - - - diff --git a/IJSVGExample/IJSVGExample/SVGView.m b/IJSVGExample/IJSVGExample/SVGView.m index 0a027ca..b55f1cb 100644 --- a/IJSVGExample/IJSVGExample/SVGView.m +++ b/IJSVGExample/IJSVGExample/SVGView.m @@ -18,8 +18,7 @@ - (id)initWithFrame:(NSRect)frameRect { - if( ( self = [super initWithFrame:frameRect] ) != nil ) - { + if( ( self = [super initWithFrame:frameRect] ) != nil ) { svg = [self svg].retain; svg.renderQuality = kIJSVGRenderQualityFullResolution; svg.renderingBackingScaleHelper = ^{ @@ -31,7 +30,7 @@ - (IJSVG *)svg { - return [IJSVG svgNamed:@"heart"]; + return [IJSVG svgNamed:@"car"]; } - (void)drawRect:(NSRect)dirtyRect