From 58fbb01ff2b2d425041cfd99b37d059f9f67f883 Mon Sep 17 00:00:00 2001 From: Curtis Hard Date: Mon, 5 Jun 2017 21:36:01 +0100 Subject: [PATCH] Moved command char checker over to C call, believe it or not, this is alot faster then using a characterSet --- source/IJSVGParser.m | 14 +------------- source/IJSVGUtils.h | 1 + source/IJSVGUtils.m | 12 ++++++++++++ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/source/IJSVGParser.m b/source/IJSVGParser.m index ff0d324..9e9e1b4 100644 --- a/source/IJSVGParser.m +++ b/source/IJSVGParser.m @@ -1017,17 +1017,6 @@ } } -static NSCharacterSet * _commandCharSet = nil; - -+ (NSCharacterSet *)_commandCharSet -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _commandCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"MmZzLlHhVvCcSsQqTtAa"] retain]; - }); - return _commandCharSet; -} - #pragma mark Parser stuff! - (void)_parsePathCommandData:(NSString *)command @@ -1039,7 +1028,6 @@ static NSCharacterSet * _commandCharSet = nil; return; } - NSCharacterSet * set = [[self class] _commandCharSet]; NSUInteger len = [command length]; // allocate memory for the string buffer for reading @@ -1061,7 +1049,7 @@ static NSCharacterSet * _commandCharSet = nil; unichar currentChar = buffer[i]; unichar nextChar = buffer[i+1]; BOOL atEnd = i == len-1; - BOOL isStartCommand = [set characterIsMember:nextChar]; + BOOL isStartCommand = IJSVGIsLegalCommandCharacter(nextChar); if( ( currentBufferSize + 1 ) == currentSize ) { currentSize += defaultBufferSize; commandBuffer = (unichar *)realloc( commandBuffer, sizeof(unichar)*currentSize); diff --git a/source/IJSVGUtils.h b/source/IJSVGUtils.h index ccb426d..dba25ad 100644 --- a/source/IJSVGUtils.h +++ b/source/IJSVGUtils.h @@ -18,6 +18,7 @@ CGFloat angle( CGPoint a, CGPoint b ); CGFloat radians_to_degrees( CGFloat radians); CGFloat degrees_to_radians( CGFloat degrees ); +BOOL IJSVGIsLegalCommandCharacter(unichar aChar); + (IJSVGCommandType)typeForCommandString:(NSString *)string; + (CGFloat *)commandParameters:(NSString *)command count:(NSInteger *)count; diff --git a/source/IJSVGUtils.m b/source/IJSVGUtils.m index 47974ee..eafb2d6 100644 --- a/source/IJSVGUtils.m +++ b/source/IJSVGUtils.m @@ -10,6 +10,18 @@ @implementation IJSVGUtils +BOOL IJSVGIsLegalCommandCharacter(unichar aChar) +{ + char * validChars = "MmZzLlHhVvCcSsQqTtAa"; + NSUInteger length = strlen(validChars); + for(NSUInteger i = 0; i < length; i++) { + if(aChar == validChars[i]) { + return YES; + } + } + return NO; +} + CGFloat angle( CGPoint a, CGPoint b ) { return [IJSVGUtils angleBetweenPointA:a pointb:b];