From 87fc77592049b0bcacbaeee2d9aa85acde4954fe Mon Sep 17 00:00:00 2001 From: Curtis Hard Date: Thu, 4 Sep 2014 00:11:11 +0100 Subject: [PATCH] Added more examples Various fixes for viewport scaling and transform per groups. Added few more example SVG's as examples ( also so I can fix things ) --- IJSVG.m | 58 ++++++++++++------ IJSVGCache.m | 10 ++- .../IJSVGExample.xcodeproj/project.pbxproj | 8 +++ .../UserInterfaceState.xcuserstate | Bin 28064 -> 30464 bytes IJSVGExample/IJSVGExample/SVGView.m | 2 +- IJSVGExample/IJSVGExample/paperplane.svg | 30 +++++++++ IJSVGExample/IJSVGExample/products.svg | 33 ++++++++++ IJSVGParser.m | 8 +++ 8 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 IJSVGExample/IJSVGExample/paperplane.svg create mode 100644 IJSVGExample/IJSVGExample/products.svg diff --git a/IJSVG.m b/IJSVG.m index b8b3039..fcdbead 100644 --- a/IJSVG.m +++ b/IJSVG.m @@ -81,13 +81,17 @@ static NSColor * _baseColor = nil; - (id)initWithFilePathURL:(NSURL *)aURL delegate:(id)delegate { -// if( [IJSVGCache enabled] ) -// { -// IJSVG * svg = nil; -// if( ( svg = [IJSVGCache cachedSVGForFileURL:aURL] ) != nil ) -// return [svg retain]; -// } -// + if( [IJSVGCache enabled] ) + { + IJSVG * svg = nil; + if( ( svg = [IJSVGCache cachedSVGForFileURL:aURL] ) != nil ) +#ifndef __clang_analyzer__ + return [svg retain]; +#else + {} +#endif + } + if( ( self = [super init] ) != nil ) { _delegate = delegate; @@ -127,9 +131,30 @@ static NSColor * _baseColor = nil; - (void)drawInRect:(NSRect)rect { + + // prep for draw... [self _beginDraw:rect]; + + // setup the transforms and scale on the main context + CGContextRef ref = [[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(ref); + + // scale the whole drawing context, but first, we need + // to translate the context so its centered + CGFloat tX = round(rect.size.width/2-(_group.size.width/2)*_scale); + CGFloat tY = round(rect.size.height/2-(_group.size.height/2)*_scale); + CGContextTranslateCTM( ref, tX, tY ); + CGContextScaleCTM( ref, _scale, _scale ); + + // apply standard defaults + [self _applyDefaults:ref + node:_group]; + + // begin draw [self _drawGroup:_group rect:rect]; + + CGContextRestoreGState(ref); } - (void)_recursiveColors:(IJSVGGroup *)group @@ -194,6 +219,8 @@ static NSColor * _baseColor = nil; [self _drawGroup:child rect:rect]; } + + // restore the context CGContextRestoreGState(context); } @@ -225,14 +252,7 @@ static NSColor * _baseColor = nil; CGContextRef ref = [[NSGraphicsContext currentContext] graphicsPort]; CGContextSaveGState(ref); - // scale the whole drawing context, but first, we need - // to translate the context so its centered - CGFloat tX = round(rect.size.width/2-(_group.size.width/2)*_scale); - CGFloat tY = round(rect.size.height/2-(_group.size.height/2)*_scale); - CGContextTranslateCTM( ref, tX, tY ); - CGContextScaleCTM( ref, _scale, _scale ); - - // apply standard defaults + // there could be transforms per path [self _applyDefaults:ref node:path]; @@ -240,8 +260,6 @@ static NSColor * _baseColor = nil; // use the base if its not set if( path.fillColor == nil && _baseColor != nil ) [_baseColor set]; - else - [path.fillColor set]; // fill the path if( path.fillGradient != nil ) @@ -261,7 +279,11 @@ static NSColor * _baseColor = nil; } } else { // just use the color instead - [path.path fill]; + if( path.fillColor != nil ) + { + [path.fillColor set]; + [path.path fill]; + } } // any stroke? diff --git a/IJSVGCache.m b/IJSVGCache.m index a70608a..932e233 100644 --- a/IJSVGCache.m +++ b/IJSVGCache.m @@ -10,7 +10,7 @@ @implementation IJSVGCache -// 5mb +// 5MB #define MAX_CACHE_SIZE 5000000 static NSCache * _cache = nil; @@ -37,6 +37,14 @@ static BOOL _enabled = YES; NSFileManager * fm = [NSFileManager defaultManager]; NSDictionary * atts = [fm attributesOfItemAtPath:[aURL path] error:nil]; + + // cache is nil ... for some reason..? + if( _cache == nil ) + { + _cache = [[NSCache alloc] init]; + [_cache setTotalCostLimit:MAX_CACHE_SIZE]; + } + [_cache setObject:svg forKey:aURL cost:[atts fileSize]+sizeof(svg)]; diff --git a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj index aef58a0..48e8885 100644 --- a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj +++ b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj @@ -42,6 +42,8 @@ 59A0E79D19B72EA7001BA157 /* IJSVGCommandArc.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A0E79C19B72EA7001BA157 /* IJSVGCommandArc.m */; }; 59A0E7A219B7333C001BA157 /* IJSVGLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A0E7A119B7333C001BA157 /* IJSVGLinearGradient.m */; }; 59A0E7A519B7334F001BA157 /* IJSVGDef.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A0E7A419B7334F001BA157 /* IJSVGDef.m */; }; + 59B93C6D19B7D1840063E823 /* paperplane.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59B93C6C19B7D1840063E823 /* paperplane.svg */; }; + 59B93C6F19B7D32C0063E823 /* products.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59B93C6E19B7D32C0063E823 /* products.svg */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -124,6 +126,8 @@ 59A0E7A119B7333C001BA157 /* IJSVGLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJSVGLinearGradient.m; path = ../../IJSVGLinearGradient.m; sourceTree = ""; }; 59A0E7A319B7334F001BA157 /* IJSVGDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IJSVGDef.h; path = ../../IJSVGDef.h; sourceTree = ""; }; 59A0E7A419B7334F001BA157 /* IJSVGDef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJSVGDef.m; path = ../../IJSVGDef.m; sourceTree = ""; }; + 59B93C6C19B7D1840063E823 /* paperplane.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = paperplane.svg; sourceTree = ""; }; + 59B93C6E19B7D32C0063E823 /* products.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = products.svg; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,6 +184,8 @@ 5956657A19B62F4600D805FF /* Supporting Files */ = { isa = PBXGroup; children = ( + 59B93C6E19B7D32C0063E823 /* products.svg */, + 59B93C6C19B7D1840063E823 /* paperplane.svg */, 595665DD19B6309C00D805FF /* test.svg */, 5956657B19B62F4600D805FF /* Info.plist */, 5956657C19B62F4600D805FF /* main.m */, @@ -347,8 +353,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 59B93C6D19B7D1840063E823 /* paperplane.svg in Resources */, 5956658219B62F4600D805FF /* Images.xcassets in Resources */, 595665DE19B6309C00D805FF /* test.svg in Resources */, + 59B93C6F19B7D32C0063E823 /* products.svg in Resources */, 5956658519B62F4600D805FF /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; 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 f16786d342501125185318a8bfae013ce150cb21..fa7e554942e9e0b6dbfdc0751f0672a62af3e825 100644 GIT binary patch literal 30464 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 Mia)J?*MIr{0T?^Kq5uE@ delta 16257 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IJSVGExample/IJSVGExample/products.svg b/IJSVGExample/IJSVGExample/products.svg new file mode 100644 index 0000000..ea7eec9 --- /dev/null +++ b/IJSVGExample/IJSVGExample/products.svg @@ -0,0 +1,33 @@ + + + + IPAD 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IJSVGParser.m b/IJSVGParser.m index 6052306..08d71df 100644 --- a/IJSVGParser.m +++ b/IJSVGParser.m @@ -251,8 +251,16 @@ [self _parseElementForCommonAttributes:element node:group]; [parentGroup addChild:group]; + + // could be gradients within + // the group's aswell, so work those out + [self _parseDef:element + intoNode:group]; + + // recursively parse blocks [self _parseBlock:element intoGroup:group]; + continue; } else if( [subName isEqualToString:@"path"] ) {