From ef0aea3aac8735ae5394b23eb62f53d499d490ca Mon Sep 17 00:00:00 2001 From: Yury Popov Date: Wed, 13 May 2015 01:51:26 +0300 Subject: [PATCH] SVG bounds calculation --- pxSVG/pxSVGRenderPath.m | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pxSVG/pxSVGRenderPath.m b/pxSVG/pxSVGRenderPath.m index eb28a41..f4f21d2 100644 --- a/pxSVG/pxSVGRenderPath.m +++ b/pxSVG/pxSVGRenderPath.m @@ -24,6 +24,7 @@ + (instancetype)pathWithXML:(pxXMLNode *)xmlNode - (instancetype)initWithXML:(pxXMLNode *)xmlNode { self = [super init]; + self.root = [self parseObject:xmlNode]; if ([xmlNode.attributes objectForKey:@"width"] && [xmlNode.attributes objectForKey:@"height"]) { CGPoint o = CGPointZero; @@ -52,11 +53,25 @@ - (instancetype)initWithXML:(pxXMLNode *)xmlNode } }; } else { - self.bounds = CGRectNull; + self.bounds = [self objBounds:self.root]; } - self.root = [self parseObject:xmlNode]; return self; } +- (CGRect) objBounds:(pxSVGObject*)obj +{ + if ([obj respondsToSelector:@selector(d)]) { + UIBezierPath *path = [(id)obj d]; + if (path) return CGRectApplyAffineTransform(path.bounds, CATransform3DGetAffineTransform(obj.transform)); + } + if ([obj respondsToSelector:@selector(subnodes)]) { + CGRect f = CGRectNull; + for (pxSVGObject *o in [(id)obj subnodes]) { + f = CGRectUnion(f, [self objBounds:o]); + } + return CGRectApplyAffineTransform(f, CATransform3DGetAffineTransform(obj.transform)); + } + return CGRectNull; +} - (pxSVGObject*)parseObject:(pxXMLNode*)node { if ([node.tagName rangeOfString:@":"].location != NSNotFound) return nil;