diff --git a/IJSVGExample/IJSVGExample/SVGView.m b/IJSVGExample/IJSVGExample/SVGView.m index 8626dac..c513faa 100644 --- a/IJSVGExample/IJSVGExample/SVGView.m +++ b/IJSVGExample/IJSVGExample/SVGView.m @@ -22,8 +22,9 @@ if( ( self = [super initWithFrame:frameRect] ) != nil ) { svg = [self svg]; + svg.renderQuality = IJSVGRenderQualityLow; svg.renderingBackingScaleHelper = ^{ - return [svg computeBackingScale:self.window.backingScaleFactor]; + return self.window.backingScaleFactor; }; } return self; @@ -31,7 +32,7 @@ - (IJSVG *)svg { - return [IJSVG svgNamed:@"intertwingly"]; + return [IJSVG svgNamed:@"car"]; } - (void)drawRect:(NSRect)dirtyRect diff --git a/source/IJSVGImageRep.h b/source/IJSVGImageRep.h new file mode 100644 index 0000000..5ecdd3e --- /dev/null +++ b/source/IJSVGImageRep.h @@ -0,0 +1,17 @@ +// +// IJSVGImageRep.h +// IJSVGExample +// +// Created by Curtis Hard on 15/03/2019. +// Copyright © 2019 Curtis Hard. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface IJSVGImageRep : NSImageRep + +@end + +NS_ASSUME_NONNULL_END diff --git a/source/IJSVGImageRep.m b/source/IJSVGImageRep.m new file mode 100644 index 0000000..5c2f999 --- /dev/null +++ b/source/IJSVGImageRep.m @@ -0,0 +1,104 @@ +// +// IJSVGImageRep.m +// IJSVGExample +// +// Created by Curtis Hard on 15/03/2019. +// Copyright © 2019 Curtis Hard. All rights reserved. +// + +#import "IJSVGImageRep.h" +#import "IJSVG.h" + +@implementation IJSVGImageRep + +@synthesize viewBox = _viewBox; + ++ (void)load +{ + [NSBitmapImageRep registerImageRepClass:self]; +} + ++ (BOOL)canInitWithData:(NSData *)data +{ + return [IJSVGParser isDataSVG:data]; +} + ++ (NSArray *)imageTypes +{ + return @[(NSString *)kUTTypeScalableVectorGraphics, @"svg"]; +} + ++ (NSArray *)imageUnfilteredTypes +{ + return @[(NSString *)kUTTypeScalableVectorGraphics, @"svg"]; +} + ++ (NSArray *)imageRepsWithData:(NSData *)data +{ + IJSVGImageRep * instance = [self imageRepWithData:data]; + if(instance == nil) { + return @[]; + } + return @[instance]; +} + ++ (instancetype)imageRepWithData:(NSData *)data +{ + return [[self alloc] initWithData:data]; +} + +- (void)dealloc +{ + [_svg release], _svg = nil; + [super dealloc]; +} + +- (instancetype)initWithData:(NSData *)data +{ + if((self = [super init]) != nil) { + // grab the string from the data + // its more then likely UTF-8... + NSString * string = [[[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding] autorelease]; + + _svg = [[IJSVG alloc] initWithSVGString:string]; + + // no valid SVG, just return nil; + if(_svg == nil) { + [self release]; + return nil; + } + + // set default properties + self.pixelsWide = _svg.viewBox.size.width; + self.pixelsHigh = _svg.viewBox.size.height; + self.size = _svg.viewBox.size; + } + return self; +} + +- (BOOL)draw +{ + [_svg drawInRect:self.viewBox]; + return YES; +} + +- (BOOL)drawAtPoint:(NSPoint)point +{ + [_svg drawAtPoint:point + size:_svg.viewBox.size]; + return YES; +} + +- (BOOL)drawInRect:(NSRect)rect +{ + [_svg drawInRect:rect]; + return YES; +} + +- (CGRect)viewBox +{ + return _svg.viewBox; +} + +@end diff --git a/source/IJSVGParser.h b/source/IJSVGParser.h index 5d6b68a..c185ed2 100644 --- a/source/IJSVGParser.h +++ b/source/IJSVGParser.h @@ -107,6 +107,8 @@ handleForeignObject:(IJSVGForeignObject *)foreignObject @property ( nonatomic, readonly ) NSRect viewBox; @property ( nonatomic, readonly ) NSSize proposedViewSize; ++ (BOOL)isDataSVG:(NSData *)data; + - (id)initWithSVGString:(NSString *)string error:(NSError **)error delegate:(id)delegate; diff --git a/source/IJSVGParser.m b/source/IJSVGParser.m index 298a493..57f0b78 100644 --- a/source/IJSVGParser.m +++ b/source/IJSVGParser.m @@ -116,6 +116,18 @@ } ++ (BOOL)isDataSVG:(NSData *)data +{ + @try { + NSError * error; + NSXMLDocument * doc = [[[NSXMLDocument alloc] initWithData:data + options:0 + error:&error] autorelease]; + return doc != nil && error == nil; + } @catch(NSException * exception) {} + return NO; +} + - (id)initWithFileURL:(NSURL *)aURL error:(NSError **)error delegate:(id)delegate