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 8332cd0..31a229b 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/source/IJSVGImageRep.m b/source/IJSVGImageRep.m index 5c2f999..25fb407 100644 --- a/source/IJSVGImageRep.m +++ b/source/IJSVGImageRep.m @@ -44,7 +44,7 @@ + (instancetype)imageRepWithData:(NSData *)data { - return [[self alloc] initWithData:data]; + return [[[self alloc] initWithData:data] autorelease]; } - (void)dealloc diff --git a/source/IJSVGLinearGradient.m b/source/IJSVGLinearGradient.m index e4ad0ce..ee6432b 100644 --- a/source/IJSVGLinearGradient.m +++ b/source/IJSVGLinearGradient.m @@ -14,25 +14,15 @@ + (NSGradient *)parseGradient:(NSXMLElement *)element gradient:(IJSVGLinearGradient *)aGradient { - // work out each coord, and work out if its a % or not - // annoyingly we need to check them all against each other -_- - // also this will only account if this is objectBoundingBox - BOOL isPercent = aGradient.units == IJSVGUnitObjectBoundingBox; - - // assume its a vertical / horizonal - if(isPercent == NO) { - // just ask unit for the value - aGradient.x1 = [IJSVGGradientUnitLength unitWithString:[[element attributeForName:@"x1"] stringValue] ?: @"0"]; - aGradient.x2 = [IJSVGGradientUnitLength unitWithString:[[element attributeForName:@"x2"] stringValue] ?: @"100"]; - aGradient.y1 = [IJSVGGradientUnitLength unitWithString:[[element attributeForName:@"y1"] stringValue] ?: @"0"]; - aGradient.y2 = [IJSVGGradientUnitLength unitWithString:[[element attributeForName:@"y2"] stringValue] ?: @"0"]; - } else { - // make sure its a percent! - aGradient.x1 = [IJSVGGradientUnitLength unitWithPercentageString:[[element attributeForName:@"x1"] stringValue] ?: @"0"]; - aGradient.x2 = [IJSVGGradientUnitLength unitWithPercentageString:[[element attributeForName:@"x2"] stringValue] ?: @"1"]; - aGradient.y1 = [IJSVGGradientUnitLength unitWithPercentageString:[[element attributeForName:@"y1"] stringValue] ?: @"0"]; - aGradient.y2 = [IJSVGGradientUnitLength unitWithPercentageString:[[element attributeForName:@"y2"] stringValue] ?: @"0"]; - } + // just ask unit for the value + NSString * x1 = ([element attributeForName:@"x1"].stringValue ?: @"0"); + NSString * x2 = ([element attributeForName:@"x2"].stringValue ?: @"100%"); + NSString * y1 = ([element attributeForName:@"y1"].stringValue ?: @"0"); + NSString * y2 = ([element attributeForName:@"y2"].stringValue ?: @"0"); + aGradient.x1 = [IJSVGGradientUnitLength unitWithString:x1 fromUnitType:aGradient.units]; + aGradient.x2 = [IJSVGGradientUnitLength unitWithString:x2 fromUnitType:aGradient.units]; + aGradient.y1 = [IJSVGGradientUnitLength unitWithString:y1 fromUnitType:aGradient.units]; + aGradient.y2 = [IJSVGGradientUnitLength unitWithString:y2 fromUnitType:aGradient.units]; // compute the color stops and colours NSArray * colors = nil; diff --git a/source/IJSVGNode.h b/source/IJSVGNode.h index b3f3527..e422825 100644 --- a/source/IJSVGNode.h +++ b/source/IJSVGNode.h @@ -73,12 +73,6 @@ typedef NS_OPTIONS( NSInteger, IJSVGFontTraits ) { IJSVGFontTraitItalic = 1 << 2 }; -typedef NS_ENUM( NSInteger, IJSVGUnitType) { - IJSVGUnitUserSpaceOnUse, - IJSVGUnitObjectBoundingBox, - IJSVGUnitInherit -}; - typedef NS_ENUM( NSInteger, IJSVGBlendMode) { IJSVGBlendModeNormal = kCGBlendModeNormal, IJSVGBlendModeMultiply = kCGBlendModeMultiply, diff --git a/source/IJSVGRadialGradient.m b/source/IJSVGRadialGradient.m index 2018b6f..e5e8cb8 100644 --- a/source/IJSVGRadialGradient.m +++ b/source/IJSVGRadialGradient.m @@ -50,38 +50,31 @@ NSString * str = [element attributeForName:key].stringValue; IJSVGUnitLength * unit = nil; if(str != nil) { - if(gradient.units == IJSVGUnitObjectBoundingBox) { - unit = [IJSVGUnitLength unitWithPercentageString:str]; - } else { - unit = [IJSVGUnitLength unitWithString:str]; - } + unit = [IJSVGUnitLength unitWithString:str + fromUnitType:gradient.units]; } else { + // spec says to say 50% for missing property default unit = [IJSVGUnitLength unitWithPercentageFloat:.5f]; } [gradient setValue:unit forKey:kv[key]]; } + // fx and fy are the same unless specified otherwise gradient.fx = gradient.cx; gradient.fy = gradient.cy; // needs fixing NSString * fx = [element attributeForName:@"fx"].stringValue; if(fx != nil) { - if(gradient.units == IJSVGUnitObjectBoundingBox) { - gradient.fx = [IJSVGUnitLength unitWithPercentageString:fx]; - } else { - gradient.fx = [IJSVGUnitLength unitWithString:fx]; - } + gradient.fx = [IJSVGUnitLength unitWithString:fx + fromUnitType:gradient.units]; } NSString * fy = [element attributeForName:@"fy"].stringValue; if(fx != nil) { - if(gradient.units == IJSVGUnitObjectBoundingBox) { - gradient.fy = [IJSVGUnitLength unitWithPercentageString:fy]; - } else { - gradient.fy = [IJSVGUnitLength unitWithString:fy]; - } + gradient.fy = [IJSVGUnitLength unitWithString:fy + fromUnitType:gradient.units]; } if( gradient.gradient != nil ) { diff --git a/source/IJSVGUnitLength.h b/source/IJSVGUnitLength.h index 0d6a4c0..83958f2 100644 --- a/source/IJSVGUnitLength.h +++ b/source/IJSVGUnitLength.h @@ -13,6 +13,12 @@ typedef NS_ENUM(NSInteger, IJSVGUnitLengthType) { IJSVGUnitLengthTypePercentage }; +typedef NS_ENUM( NSInteger, IJSVGUnitType) { + IJSVGUnitUserSpaceOnUse, + IJSVGUnitObjectBoundingBox, + IJSVGUnitInherit +}; + @interface IJSVGUnitLength : NSObject @property (nonatomic, assign) IJSVGUnitLengthType type; @@ -26,6 +32,9 @@ typedef NS_ENUM(NSInteger, IJSVGUnitLengthType) { + (IJSVGUnitLength *)unitWithString:(NSString *)string; + (IJSVGUnitLength *)unitWithPercentageString:(NSString *)string; ++ (IJSVGUnitLength *)unitWithString:(NSString *)string + fromUnitType:(IJSVGUnitType)units; + - (CGFloat)valueAsPercentage; - (CGFloat)computeValue:(CGFloat)anotherValue; - (NSString *)stringValue; diff --git a/source/IJSVGUnitLength.m b/source/IJSVGUnitLength.m index ca55d78..de31dfd 100644 --- a/source/IJSVGUnitLength.m +++ b/source/IJSVGUnitLength.m @@ -7,6 +7,7 @@ // #import "IJSVGUnitLength.h" +#import "IJSVGNode.h" @implementation IJSVGUnitLength @@ -22,6 +23,15 @@ return unit; } ++ (IJSVGUnitLength *)unitWithString:(NSString *)string + fromUnitType:(IJSVGUnitType)units +{ + if(units == IJSVGUnitObjectBoundingBox) { + return [self unitWithPercentageString:string]; + } + return [self unitWithString:string]; +} + + (IJSVGUnitLength *)unitWithFloat:(CGFloat)number type:(IJSVGUnitLengthType)type {