From 169da551310f321c614f8d8c7c0ffe0bf8c8aaff Mon Sep 17 00:00:00 2001 From: Curtis Hard Date: Fri, 5 Jul 2019 22:34:05 +0100 Subject: [PATCH] More fixes --- .../IJSVGExample.xcodeproj/project.pbxproj | 20 +- .../UserInterfaceState.xcuserstate | Bin 40066 -> 27874 bytes IJSVGExample/IJSVGExample/SVGView.m | 2 +- IJSVGExample/IJSVGExample/home.svg | 336 ++++++++++++++++++ IJSVGExample/IJSVGExample/linear-test.svg | 12 + source/IJSVGGradient.h | 4 + source/IJSVGGradient.m | 12 + source/IJSVGLayerTree.m | 37 +- source/IJSVGLinearGradient.m | 9 +- source/IJSVGRadialGradient.m | 7 +- 10 files changed, 409 insertions(+), 30 deletions(-) create mode 100644 IJSVGExample/IJSVGExample/home.svg create mode 100644 IJSVGExample/IJSVGExample/linear-test.svg diff --git a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj index 5495009..dc87e18 100644 --- a/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj +++ b/IJSVGExample/IJSVGExample.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 595665DE19B6309C00D805FF /* test.svg in Resources */ = {isa = PBXBuildFile; fileRef = 595665DD19B6309C00D805FF /* test.svg */; }; 595665E119B630B600D805FF /* SVGView.m in Sources */ = {isa = PBXBuildFile; fileRef = 595665E019B630B600D805FF /* SVGView.m */; }; 597046A21E24352700A60138 /* IJSVGStrokeLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 597046A11E24352700A60138 /* IJSVGStrokeLayer.m */; }; - 59828C4622CF92AF00F4C444 /* home.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59828C4522CF92AF00F4C444 /* home.svg */; }; + 597AC83322CFD0FC007C0E42 /* home.svg in Resources */ = {isa = PBXBuildFile; fileRef = 597AC83222CFD0FC007C0E42 /* home.svg */; }; 5986308719BA104800CF15EA /* linecap.svg in Resources */ = {isa = PBXBuildFile; fileRef = 5986308619BA104800CF15EA /* linecap.svg */; }; 5986308A19BA106D00CF15EA /* SVGExampleView5.m in Sources */ = {isa = PBXBuildFile; fileRef = 5986308919BA106D00CF15EA /* SVGExampleView5.m */; }; 5986308C19BA180E00CF15EA /* dashed.svg in Resources */ = {isa = PBXBuildFile; fileRef = 5986308B19BA180E00CF15EA /* dashed.svg */; }; @@ -87,13 +87,10 @@ 59E8ABF31E2167D90032A80C /* IJSVGImageLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E8ABF21E2167D90032A80C /* IJSVGImageLayer.m */; }; 59E8ABF61E2176340032A80C /* IJSVGGroupLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E8ABF51E2176340032A80C /* IJSVGGroupLayer.m */; }; 59E8ABF91E219C860032A80C /* IJSVGMath.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E8ABF81E219C860032A80C /* IJSVGMath.m */; }; - 59E9863322CF6F2300C717DD /* KORDEUTER-logo-white.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59E9863222CF6F2300C717DD /* KORDEUTER-logo-white.svg */; }; 59EA311622CF395400DAB3B7 /* IJSVGStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 59EA310F22CF395400DAB3B7 /* IJSVGStringAdditions.m */; }; 59EA311722CF395400DAB3B7 /* IJSVGRendering.m in Sources */ = {isa = PBXBuildFile; fileRef = 59EA311022CF395400DAB3B7 /* IJSVGRendering.m */; }; 59EA311822CF395400DAB3B7 /* IJSVGImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 59EA311322CF395400DAB3B7 /* IJSVGImageRep.m */; }; 59EA311922CF395400DAB3B7 /* IJSVGView.m in Sources */ = {isa = PBXBuildFile; fileRef = 59EA311422CF395400DAB3B7 /* IJSVGView.m */; }; - 59EA311B22CF397A00DAB3B7 /* test2.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59EA311A22CF397A00DAB3B7 /* test2.svg */; }; - 59EA311D22CF437700DAB3B7 /* test 2.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59EA311C22CF437700DAB3B7 /* test 2.svg */; }; 59F799E219B880CE00096CB7 /* htc_one.svg in Resources */ = {isa = PBXBuildFile; fileRef = 59F799E119B880CE00096CB7 /* htc_one.svg */; }; /* End PBXBuildFile section */ @@ -156,7 +153,7 @@ 595665E019B630B600D805FF /* SVGView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGView.m; sourceTree = ""; }; 597046A01E24352700A60138 /* IJSVGStrokeLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJSVGStrokeLayer.h; sourceTree = ""; }; 597046A11E24352700A60138 /* IJSVGStrokeLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGStrokeLayer.m; sourceTree = ""; }; - 59828C4522CF92AF00F4C444 /* home.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = home.svg; path = ../../../../../../../../Downloads/home.svg; sourceTree = ""; }; + 597AC83222CFD0FC007C0E42 /* home.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = home.svg; sourceTree = ""; }; 5986308619BA104800CF15EA /* linecap.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = linecap.svg; sourceTree = ""; }; 5986308819BA106D00CF15EA /* SVGExampleView5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGExampleView5.h; sourceTree = ""; }; 5986308919BA106D00CF15EA /* SVGExampleView5.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGExampleView5.m; sourceTree = ""; }; @@ -252,7 +249,6 @@ 59E8ABF51E2176340032A80C /* IJSVGGroupLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGGroupLayer.m; sourceTree = ""; }; 59E8ABF71E219C860032A80C /* IJSVGMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJSVGMath.h; sourceTree = ""; }; 59E8ABF81E219C860032A80C /* IJSVGMath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGMath.m; sourceTree = ""; }; - 59E9863222CF6F2300C717DD /* KORDEUTER-logo-white.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "KORDEUTER-logo-white.svg"; path = "../../../../../../../../Downloads/KORDEUTER-logo-white.svg"; sourceTree = ""; }; 59EA310E22CF395300DAB3B7 /* IJSVGImageRep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJSVGImageRep.h; sourceTree = ""; }; 59EA310F22CF395400DAB3B7 /* IJSVGStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGStringAdditions.m; sourceTree = ""; }; 59EA311022CF395400DAB3B7 /* IJSVGRendering.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGRendering.m; sourceTree = ""; }; @@ -261,8 +257,6 @@ 59EA311322CF395400DAB3B7 /* IJSVGImageRep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGImageRep.m; sourceTree = ""; }; 59EA311422CF395400DAB3B7 /* IJSVGView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJSVGView.m; sourceTree = ""; }; 59EA311522CF395400DAB3B7 /* IJSVGStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJSVGStringAdditions.h; sourceTree = ""; }; - 59EA311A22CF397A00DAB3B7 /* test2.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = test2.svg; path = ../../../../../../../../Downloads/test2.svg; sourceTree = ""; }; - 59EA311C22CF437700DAB3B7 /* test 2.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "test 2.svg"; path = "../../../../../../../../Desktop/test 2.svg"; sourceTree = ""; }; 59F799E119B880CE00096CB7 /* htc_one.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = htc_one.svg; sourceTree = ""; }; /* End PBXFileReference section */ @@ -332,10 +326,7 @@ 5956657A19B62F4600D805FF /* Supporting Files */ = { isa = PBXGroup; children = ( - 59828C4522CF92AF00F4C444 /* home.svg */, - 59E9863222CF6F2300C717DD /* KORDEUTER-logo-white.svg */, - 59EA311C22CF437700DAB3B7 /* test 2.svg */, - 59EA311A22CF397A00DAB3B7 /* test2.svg */, + 597AC83222CFD0FC007C0E42 /* home.svg */, 59D1E39F202279CA00C54672 /* Group.svg */, 590C87F5201FD0D4004A1554 /* car.svg */, 590C87F3201FC9E3004A1554 /* radialgradient2.svg */, @@ -586,13 +577,12 @@ files = ( 59B93C6D19B7D1840063E823 /* paperplane.svg in Resources */, 5956658219B62F4600D805FF /* Images.xcassets in Resources */, - 59EA311B22CF397A00DAB3B7 /* test2.svg in Resources */, 590C87ED201FA08C004A1554 /* intertwingly.svg in Resources */, 590C87F1201FBF27004A1554 /* AJ_Digital_Camera.svg in Resources */, 590C87EF201FA093004A1554 /* NewTux.svg in Resources */, 59265CE81C4F840400F333F0 /* css.svg in Resources */, - 59E9863322CF6F2300C717DD /* KORDEUTER-logo-white.svg in Resources */, 595665DE19B6309C00D805FF /* test.svg in Resources */, + 597AC83322CFD0FC007C0E42 /* home.svg in Resources */, 590C87EB201F9888004A1554 /* json.svg in Resources */, 59D1E3A0202279CA00C54672 /* Group.svg in Resources */, 59F799E219B880CE00096CB7 /* htc_one.svg in Resources */, @@ -601,8 +591,6 @@ 5986308719BA104800CF15EA /* linecap.svg in Resources */, 5956658519B62F4600D805FF /* MainMenu.xib in Resources */, 590C87F4201FC9E4004A1554 /* radialgradient2.svg in Resources */, - 59828C4622CF92AF00F4C444 /* home.svg in Resources */, - 59EA311D22CF437700DAB3B7 /* test 2.svg in Resources */, 59459CEC19B906FE00CE493B /* clipped.svg in Resources */, 590C87F6201FD0D4004A1554 /* car.svg in Resources */, 5991A2AB201E310200913E3B /* heart.svg in Resources */, 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 2b34b320560936d90c6046e7f967a397ce95c2d0..520c962357297ba2cc2a442b79afc2817406d11c 100644 GIT binary patch delta 13228 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 + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IJSVGExample/IJSVGExample/linear-test.svg b/IJSVGExample/IJSVGExample/linear-test.svg new file mode 100644 index 0000000..2552e21 --- /dev/null +++ b/IJSVGExample/IJSVGExample/linear-test.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/source/IJSVGGradient.h b/source/IJSVGGradient.h index 3da49d4..e34d26c 100644 --- a/source/IJSVGGradient.h +++ b/source/IJSVGGradient.h @@ -27,4 +27,8 @@ absoluteTransform:(CGAffineTransform)absoluteTransform viewPort:(CGRect)viewBox; +- (void)_debugStart:(CGPoint)startPoint + end:(CGPoint)endPoint + context:(CGContextRef)ctx; + @end diff --git a/source/IJSVGGradient.m b/source/IJSVGGradient.m index 6012d9b..32f791b 100644 --- a/source/IJSVGGradient.m +++ b/source/IJSVGGradient.m @@ -134,4 +134,16 @@ { } +- (void)_debugStart:(CGPoint)startPoint + end:(CGPoint)endPoint + context:(CGContextRef)ctx +{ + CGContextSaveGState(ctx); + CGContextSetStrokeColorWithColor(ctx, NSColor.blackColor.CGColor); + CGContextSetLineWidth(ctx, 1.f); + CGContextMoveToPoint(ctx, startPoint.x, startPoint.y); + CGContextAddLineToPoint(ctx, endPoint.x, endPoint.y); + CGContextStrokePath(ctx); +} + @end diff --git a/source/IJSVGLayerTree.m b/source/IJSVGLayerTree.m index 9d4eaed..55f48af 100644 --- a/source/IJSVGLayerTree.m +++ b/source/IJSVGLayerTree.m @@ -249,24 +249,41 @@ return mask; } +//- (CGAffineTransform)absoluteTransform:(IJSVGNode *)node +//{ +// CGAffineTransform parentAbsoluteTransform = CGAffineTransformIdentity; +// IJSVGNode * intermediateNode = node.intermediateParentNode; +// IJSVGNode * parentSVGNode = node; +// while(node != nil) { +// // intermediateParent should be skipped as these are elements +// // created by use statements and are technically fake elements, but the +// // spec says use them for the transforms, yolo! +// if(node == intermediateNode) { +// node = node.parentNode; +// continue; +// } +// CGAffineTransform trans = IJSVGConcatTransforms(node.transforms); +// parentAbsoluteTransform = CGAffineTransformConcat(trans,parentAbsoluteTransform); +// node = node.parentNode; +// } +// return parentAbsoluteTransform; +//} + + + - (CGAffineTransform)absoluteTransform:(IJSVGNode *)node { CGAffineTransform parentAbsoluteTransform = CGAffineTransformIdentity; IJSVGNode * intermediateNode = node.intermediateParentNode; - node = node.parentNode; - while(node != nil) { - // intermediateParent should be skipped as these are elements - // created by use statements and are technically fake elements, but the - // spec says use them for the transforms, yolo! + IJSVGNode * parentSVGNode = node; + while((parentSVGNode = parentSVGNode.parentNode) != nil) { if(node == intermediateNode) { - node = node.parentNode; continue; } - CGAffineTransform trans = IJSVGConcatTransforms(node.transforms); - parentAbsoluteTransform = CGAffineTransformConcat(trans,parentAbsoluteTransform); - node = node.parentNode; + parentAbsoluteTransform = [self absoluteTransform:parentSVGNode]; } - return parentAbsoluteTransform; + return CGAffineTransformConcat(IJSVGConcatTransforms(node.transforms), + parentAbsoluteTransform); } - (IJSVGLayer *)layerForPath:(IJSVGPath *)path diff --git a/source/IJSVGLinearGradient.m b/source/IJSVGLinearGradient.m index 060863a..e4ad0ce 100644 --- a/source/IJSVGLinearGradient.m +++ b/source/IJSVGLinearGradient.m @@ -57,7 +57,6 @@ CGPoint gradientStartPoint = CGPointZero; CGPoint gradientEndPoint = CGPointZero; - CGAffineTransform absTransform = absoluteTransform; CGAffineTransform selfTransform = IJSVGConcatTransforms(self.transforms); CGRect boundingBox = inUserSpace ? viewBox : objectRect; @@ -65,7 +64,7 @@ // make sure we apply the absolute position to // transform us back into the correct space if(inUserSpace == YES) { - CGContextConcatCTM(ctx, absTransform); + CGContextConcatCTM(ctx, absoluteTransform); } CGFloat width = CGRectGetWidth(boundingBox); @@ -86,6 +85,12 @@ CGContextDrawLinearGradient(ctx, self.CGGradient, gradientStartPoint, gradientEndPoint, options); + +#ifdef IJSVG_DEBUG + [self _debugStart:gradientStartPoint + end:gradientEndPoint + context:ctx]; +#endif } @end diff --git a/source/IJSVGRadialGradient.m b/source/IJSVGRadialGradient.m index 55829f9..b847097 100644 --- a/source/IJSVGRadialGradient.m +++ b/source/IJSVGRadialGradient.m @@ -144,7 +144,6 @@ selfTransform = CGAffineTransformConcat(tr, selfTransform); } -#pragma mark Default drawing // transform the context CGContextConcatCTM(ctx, selfTransform); @@ -155,6 +154,12 @@ CGContextDrawRadialGradient(ctx, self.CGGradient, gradientEndPoint, 0, gradientStartPoint, radius, options); + +#ifdef IJSVG_DEBUG_GRADIENTS + [self _debugStart:gradientStartPoint + end:gradientEndPoint + context:ctx]; +#endif } @end