You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.4 KiB

#include "RNSVGPropHelper.h"
@implementation RNSVGPropHelper
+ (CGFloat)fromRelativeWithNSString:(NSString *)length relative:(CGFloat)relative fontSize:(CGFloat)fontSize
{
length = [length stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSUInteger stringLength = [length length];
NSInteger percentIndex = stringLength - 1;
if (stringLength == 0) {
return 0;
} else if ([length characterAtIndex:percentIndex] == '%') {
return (CGFloat)[[length substringWithRange:NSMakeRange(0, percentIndex)] doubleValue] / 100 * relative;
} else {
NSInteger twoLetterUnitIndex = stringLength - 2;
if (twoLetterUnitIndex > 0) {
NSString *lastTwo = [length substringFromIndex:twoLetterUnitIndex];
NSUInteger end = twoLetterUnitIndex;
CGFloat unit = 1;
if ([lastTwo isEqualToString:@"px"]) {
} else if ([lastTwo isEqualToString:@"em"]) {
unit = fontSize;
} else if ([lastTwo isEqualToString:@"ex"]) {
unit = fontSize / 2;
} else if ([lastTwo isEqualToString:@"pt"]) {
unit = 1.25;
} else if ([lastTwo isEqualToString:@"pc"]) {
unit = 15;
} else if ([lastTwo isEqualToString:@"mm"]) {
unit = (CGFloat)3.543307;
} else if ([lastTwo isEqualToString:@"cm"]) {
unit = (CGFloat)35.43307;
} else if ([lastTwo isEqualToString:@"in"]) {
unit = 90;
} else {
end = stringLength;
}
return (CGFloat)[[length substringWithRange:NSMakeRange(0, end)] doubleValue] * unit;
} else {
return (CGFloat)[length doubleValue];
}
}
}
+ (CGFloat)fromRelative:(RNSVGLength *)length relative:(CGFloat)relative fontSize:(CGFloat)fontSize
{
RNSVGLengthUnitType unitType = length.unit;
CGFloat value = length.value;
CGFloat unit = 1;
switch (unitType) {
case SVG_LENGTHTYPE_NUMBER:
case SVG_LENGTHTYPE_PX:
return value;
break;
case SVG_LENGTHTYPE_PERCENTAGE:
return value / 100 * relative;
case SVG_LENGTHTYPE_EMS:
unit = fontSize;
break;
case SVG_LENGTHTYPE_EXS:
unit = fontSize / 2;
break;
case SVG_LENGTHTYPE_CM:
unit = (CGFloat)35.43307;
break;
case SVG_LENGTHTYPE_MM:
unit = (CGFloat)3.543307;
break;
case SVG_LENGTHTYPE_IN:
unit = 90;
break;
case SVG_LENGTHTYPE_PT:
unit = 1.25;
break;
case SVG_LENGTHTYPE_PC:
unit = 15;
break;
default:
case SVG_LENGTHTYPE_UNKNOWN:
return value;
}
return value * unit;
}
+ (CGFloat)fromRelative:(RNSVGLength *)length relative:(CGFloat)relative
{
RNSVGLengthUnitType unitType = length.unit;
CGFloat value = length.value;
CGFloat unit = 1;
switch (unitType) {
case SVG_LENGTHTYPE_NUMBER:
case SVG_LENGTHTYPE_PX:
return value;
break;
case SVG_LENGTHTYPE_PERCENTAGE:
return value / 100 * relative;
case SVG_LENGTHTYPE_EMS:
unit = 12;
break;
case SVG_LENGTHTYPE_EXS:
unit = 6;
break;
case SVG_LENGTHTYPE_CM:
unit = (CGFloat)35.43307;
break;
case SVG_LENGTHTYPE_MM:
unit = (CGFloat)3.543307;
break;
case SVG_LENGTHTYPE_IN:
unit = 90;
break;
case SVG_LENGTHTYPE_PT:
unit = 1.25;
break;
case SVG_LENGTHTYPE_PC:
unit = 15;
break;
default:
case SVG_LENGTHTYPE_UNKNOWN:
return value;
}
return value * unit;
}
@end