commitffb55b0f31Author: Curtis Hard <curtishard@me.com> Date: Fri Mar 2 13:28:40 2018 +0000 Fixes viewBox origin translate commita4c032afa2Author: Curtis Hard <curtishard@me.com> Date: Wed Feb 28 21:29:11 2018 +0000 Added clip to viewport commitabe8f4cba5Author: Curtis Hard <curtishard@me.com> Date: Wed Feb 28 21:00:20 2018 +0000 Fixes drawInRect not obeying origin commita16842271bAuthor: Curtis Hard <curtishard@me.com> Date: Mon Feb 26 13:46:41 2018 +0000 Resolves namespaces correctly + added common HTML list to be parsed as groups commit58126e06e4Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 25 21:58:49 2018 +0000 Fixes! commit5af5e054abAuthor: Curtis Hard <curtishard@me.com> Date: Fri Feb 23 22:37:53 2018 +0000 Fixed defNode being removed commitedd3aa1f33Author: Curtis Hard <curtishard@me.com> Date: Fri Feb 23 16:29:54 2018 +0000 excluded various elements from diff commit3366bc4fa5Author: Curtis Hard <curtishard@me.com> Date: Fri Feb 23 14:05:03 2018 +0000 Better optimaztion commit104002183bAuthor: Curtis Hard <curtishard@me.com> Date: Thu Feb 22 22:17:50 2018 +0000 Added rudimenatry inline styles -> stylesheet commit7010b7ea50Author: Curtis Hard <curtishard@me.com> Date: Thu Feb 22 13:33:32 2018 +0000 Correct order of cleanup commit5266a8c07aAuthor: Curtis Hard <curtishard@me.com> Date: Thu Feb 22 08:22:17 2018 +0000 corrent length of string commitcaf55e8bdfAuthor: Curtis Hard <curtishard@me.com> Date: Wed Feb 21 20:45:17 2018 +0000 removes useless def if required commit8160d05ebaAuthor: Curtis Hard <curtishard@me.com> Date: Tue Feb 20 14:12:02 2018 +0000 Refactor of a few methods commita6d6a06521Author: Curtis Hard <curtishard@me.com> Date: Tue Feb 20 09:40:21 2018 +0000 Added collpasing of gradients commit103a4d71f6Author: Curtis Hard <curtishard@me.com> Date: Mon Feb 19 19:07:30 2018 +0000 Reduced floats even more commit98874b1d2cAuthor: Curtis Hard <curtishard@me.com> Date: Mon Feb 19 18:53:02 2018 +0000 More compression goodness commite742db31e0Author: Curtis Hard <curtishard@me.com> Date: Mon Feb 19 14:02:15 2018 +0000 Added intermediateParent commit198fd09f07Author: Curtis Hard <curtishard@me.com> Date: Mon Feb 19 11:51:37 2018 +0000 Fixes! and performance increases commit3493194b1bAuthor: Curtis Hard <curtishard@me.com> Date: Mon Feb 19 08:20:02 2018 +0000 Scale computation commit0016775eafAuthor: Curtis Hard <curtishard@me.com> Date: Sun Feb 18 22:33:26 2018 +0000 More goodness commit304a04cc22Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 18 22:32:04 2018 +0000 Vastly improved the exporter commite4fd0af582Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 18 15:20:28 2018 +0000 This is insanely important! commit69a2a0c97eAuthor: Curtis Hard <curtishard@me.com> Date: Sun Feb 4 22:02:19 2018 +0000 Refactor commit5299bb0479Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 4 21:58:21 2018 +0000 will continue to use CoreAnimation for the time being commit4f1943cad1Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 4 21:57:46 2018 +0000 Fixes gradient strokes commitf02d186293Author: Curtis Hard <curtishard@me.com> Date: Sun Feb 4 11:15:04 2018 +0000 trying to get masks to work commit3291718cfbAuthor: Curtis Hard <curtishard@me.com> Date: Fri Feb 2 22:35:22 2018 +0000 Beginning of quartz renderer commit6fbaaf5884Author: Curtis Hard <curtishard@me.com> Date: Mon Jan 29 22:32:08 2018 +0000 Removed useless log commitabc65797eaAuthor: Curtis Hard <curtishard@me.com> Date: Mon Jan 29 21:37:45 2018 +0000 I think gradients work :D commitaf5a1c2718Author: Curtis Hard <curtishard@me.com> Date: Sun Jan 28 22:18:02 2018 +0000 Possible fx and fy things… commitfb9a5282b9Author: Curtis Hard <curtishard@me.com> Date: Sun Jan 28 19:22:40 2018 +0000 Even more gradient fixes commitd83933a103Author: Curtis Hard <curtishard@me.com> Date: Sun Jan 28 14:21:50 2018 +0000 Various improvements commitbd7a0d5021Author: Curtis Hard <curtishard@me.com> Date: Sat Jan 27 22:26:33 2018 +0000 Start to linear commita9a038568cAuthor: Curtis Hard <curtishard@me.com> Date: Sat Jan 27 21:14:25 2018 +0000 This kind of actually works... commit77fbb38b6fAuthor: Curtis Hard <curtishard@me.com> Date: Sat Jan 27 20:31:36 2018 +0000 I guess this could be a good start? Posssible start of fixes? commit12c3191569Author: Curtis Hard <curtishard@me.com> Date: Sat Jan 27 15:32:15 2018 +0000 Added method for findind absolute position commite3e9626ef7Author: Curtis Hard <curtishard@me.com> Date: Sat Jan 27 14:25:03 2018 +0000 Fixes crash due to parentNode on temp groups being released commit1160d89f16Author: Curtis Hard <curtishard@me.com> Date: Fri Jan 26 22:29:22 2018 +0000 Fixes use statements with transforms commit1575cbfde8Author: Curtis Hard <curtishard@me.com> Date: Fri Jan 26 18:16:03 2018 +0000 Moved color tree over to modern syntax commit5c4c2eee91Author: Curtis Hard <curtishard@me.com> Date: Thu Jan 25 18:23:53 2018 +0000 Added HSL/HSLA support commit087b13e58fAuthor: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 22:24:43 2018 +0000 Various image loading issues resolved from base64 images commit1183e167aaAuthor: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 21:21:41 2018 +0000 Rect issue fix commit4dbfc59437Author: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 21:19:24 2018 +0000 Moved transforms over from being concatinated to seperate calls commit409bd509faAuthor: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 20:30:38 2018 +0000 Fixes color issue commit8ae1d1b4e0Author: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 18:41:08 2018 +0000 Removed check as its not needed here commit7243fbe5ffAuthor: Curtis Hard <curtishard@me.com> Date: Wed Jan 24 18:35:43 2018 +0000 Added excludeAttributes list to parseCommonAttributes added x and y to that list for rect commit51b9a5e85fAuthor: Curtis Hard <curtishard@me.com> Date: Tue Jan 23 19:53:04 2018 +0000 Added isSubcommand to IJSVGCommand - Fixes move command going awol when preceding move commands are not subcommands (woah) commit40098589deAuthor: Curtis Hard <curtishard@me.com> Date: Mon Jan 22 22:04:48 2018 +0000 removed reverseObjectEnumerator IJSVGTransform already deals with this at parse stage (was a test from earlier), spec states transforms are applied in reverse order (which parser already dealth with :-)) commit7cb96b21f2Author: Curtis Hard <curtishard@me.com> Date: Mon Jan 22 22:01:56 2018 +0000 Removed use of origin here as its computed in apply defaults commit1bff7c6970Author: Curtis Hard <curtishard@me.com> Date: Mon Jan 22 21:48:07 2018 +0000 Various fixes… still going…
387 lines
10 KiB
Objective-C
387 lines
10 KiB
Objective-C
//
|
|
// IJSVGNode.m
|
|
// IconJar
|
|
//
|
|
// Created by Curtis Hard on 30/08/2014.
|
|
// Copyright (c) 2014 Curtis Hard. All rights reserved.
|
|
//
|
|
|
|
#import "IJSVGNode.h"
|
|
#import "IJSVGDef.h"
|
|
#import "IJSVGUtils.h"
|
|
|
|
@implementation IJSVGNode
|
|
|
|
@synthesize shouldRender;
|
|
@synthesize type;
|
|
@synthesize name;
|
|
@synthesize classNameList;
|
|
@synthesize className;
|
|
@synthesize unicode;
|
|
@synthesize x;
|
|
@synthesize y;
|
|
@synthesize width;
|
|
@synthesize height;
|
|
@synthesize fillColor;
|
|
@synthesize fillOpacity;
|
|
@synthesize strokeColor;
|
|
@synthesize strokeOpacity;
|
|
@synthesize strokeWidth;
|
|
@synthesize opacity;
|
|
@synthesize identifier;
|
|
@synthesize parentNode;
|
|
@synthesize intermediateParentNode;
|
|
@synthesize transforms;
|
|
@synthesize windingRule;
|
|
@synthesize def;
|
|
@synthesize fillGradient;
|
|
@synthesize fillPattern;
|
|
@synthesize strokeGradient;
|
|
@synthesize strokePattern;
|
|
@synthesize clipPath;
|
|
@synthesize lineCapStyle;
|
|
@synthesize lineJoinStyle;
|
|
@synthesize strokeDashArrayCount;
|
|
@synthesize strokeDashArray;
|
|
@synthesize strokeDashOffset;
|
|
@synthesize usesDefaultFillColor;
|
|
@synthesize svg;
|
|
@synthesize mask;
|
|
@synthesize units;
|
|
@synthesize contentUnits;
|
|
@synthesize blendMode;
|
|
|
|
- (void)dealloc
|
|
{
|
|
free(strokeDashArray);
|
|
[x release], x = nil;
|
|
[y release], y = nil;
|
|
[width release], width = nil;
|
|
[height release], height = nil;
|
|
[opacity release], opacity = nil;
|
|
[fillOpacity release], fillOpacity = nil;
|
|
[strokeOpacity release], strokeOpacity = nil;
|
|
[strokeWidth release], strokeWidth = nil;
|
|
[strokeDashOffset release], strokeDashOffset = nil;
|
|
[unicode release], unicode = nil;
|
|
[fillGradient release], fillGradient = nil;
|
|
[strokeGradient release], strokeGradient = nil;
|
|
[strokePattern release], strokePattern = nil;
|
|
[transforms release], transforms = nil;
|
|
[fillColor release], fillColor = nil;
|
|
[strokeColor release], strokeColor = nil;
|
|
[identifier release], identifier = nil;
|
|
[def release], def = nil;
|
|
[name release], name = nil;
|
|
[className release], className = nil;
|
|
[classNameList release], classNameList = nil;
|
|
[fillPattern release], fillPattern = nil;
|
|
[clipPath release], clipPath = nil;
|
|
[svg release], svg = nil;
|
|
[mask release], mask = nil;
|
|
[super dealloc];
|
|
}
|
|
|
|
+ (IJSVGNodeType)typeForString:(NSString *)string
|
|
kind:(NSXMLNodeKind)kind
|
|
{
|
|
string = [string lowercaseString];
|
|
if([string isEqualToString:@"style"])
|
|
return IJSVGNodeTypeStyle;
|
|
if([string isEqualToString:@"switch"])
|
|
return IJSVGNodeTypeSwitch;
|
|
if( [string isEqualToString:@"defs"] )
|
|
return IJSVGNodeTypeDef;
|
|
if( [string isEqualToString:@"g"] )
|
|
return IJSVGNodeTypeGroup;
|
|
if( [string isEqualToString:@"path"] )
|
|
return IJSVGNodeTypePath;
|
|
if( [string isEqualToString:@"polygon"] )
|
|
return IJSVGNodeTypePolygon;
|
|
if( [string isEqualToString:@"polyline"] )
|
|
return IJSVGNodeTypePolyline;
|
|
if( [string isEqualToString:@"rect"] )
|
|
return IJSVGNodeTypeRect;
|
|
if( [string isEqualToString:@"line"] )
|
|
return IJSVGNodeTypeLine;
|
|
if( [string isEqualToString:@"circle"] )
|
|
return IJSVGNodeTypeCircle;
|
|
if( [string isEqualToString:@"ellipse"] )
|
|
return IJSVGNodeTypeEllipse;
|
|
if( [string isEqualToString:@"use"] )
|
|
return IJSVGNodeTypeUse;
|
|
if( [string isEqualToString:@"lineargradient"] )
|
|
return IJSVGNodeTypeLinearGradient;
|
|
if( [string isEqualToString:@"radialgradient"] )
|
|
return IJSVGNodeTypeRadialGradient;
|
|
if( [string isEqualToString:@"glyph"] )
|
|
return IJSVGNodeTypeGlyph;
|
|
if( [string isEqualToString:@"font"] )
|
|
return IJSVGNodeTypeFont;
|
|
if( [string isEqualToString:@"clippath"] )
|
|
return IJSVGNodeTypeClipPath;
|
|
if( [string isEqualToString:@"mask"] )
|
|
return IJSVGNodeTypeMask;
|
|
if( [string isEqualToString:@"image"] )
|
|
return IJSVGNodeTypeImage;
|
|
if([string isEqualToString:@"pattern"])
|
|
return IJSVGNodeTypePattern;
|
|
if([string isEqualToString:@"svg"])
|
|
return IJSVGNodeTypeSVG;
|
|
if([string isEqualToString:@"text"])
|
|
return IJSVGNodeTypeText;
|
|
if([string isEqualToString:@"tspan"] || kind == NSXMLTextKind) {
|
|
return IJSVGNodeTypeTextSpan;
|
|
}
|
|
|
|
// are we commong HTML? - if so just treat as a group
|
|
if(IJSVGIsCommonHTMLElementName(string) == YES) {
|
|
return IJSVGNodeTypeGroup;
|
|
}
|
|
|
|
return IJSVGNodeTypeNotFound;
|
|
}
|
|
|
|
- (id)init
|
|
{
|
|
if( ( self = [self initWithDef:YES] ) != nil )
|
|
{
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)applyPropertiesFromNode:(IJSVGNode *)node
|
|
{
|
|
self.name = node.name;
|
|
self.type = node.type;
|
|
self.unicode = node.unicode;
|
|
self.className = node.className;
|
|
self.classNameList = node.classNameList;
|
|
|
|
self.x = node.x;
|
|
self.y = node.y;
|
|
self.width = node.width;
|
|
self.height = node.height;
|
|
|
|
self.fillGradient = node.fillGradient;
|
|
self.fillPattern = node.fillPattern;
|
|
self.strokeGradient = node.strokeGradient;
|
|
self.strokePattern = node.strokePattern;
|
|
|
|
self.fillColor = node.fillColor;
|
|
self.strokeColor = node.strokeColor;
|
|
self.clipPath = node.clipPath;
|
|
|
|
self.units = node.units;
|
|
self.contentUnits = node.contentUnits;
|
|
|
|
self.opacity = node.opacity;
|
|
self.strokeWidth = node.strokeWidth;
|
|
self.fillOpacity = node.fillOpacity;
|
|
self.strokeOpacity = node.strokeOpacity;
|
|
|
|
self.identifier = node.identifier;
|
|
self.usesDefaultFillColor = node.usesDefaultFillColor;
|
|
|
|
self.transforms = node.transforms;
|
|
self.def = node.def;
|
|
self.windingRule = node.windingRule;
|
|
self.lineCapStyle = node.lineCapStyle;
|
|
self.lineJoinStyle = node.lineJoinStyle;
|
|
self.parentNode = node.parentNode;
|
|
|
|
self.shouldRender = node.shouldRender;
|
|
self.blendMode = node.blendMode;
|
|
|
|
// dash array needs physical memory copied
|
|
CGFloat * nStrokeDashArray = (CGFloat *)malloc(node.strokeDashArrayCount*sizeof(CGFloat));
|
|
memcpy( self.strokeDashArray, nStrokeDashArray, node.strokeDashArrayCount*sizeof(CGFloat));
|
|
self.strokeDashArray = nStrokeDashArray;
|
|
self.strokeDashArrayCount = node.strokeDashArrayCount;
|
|
self.strokeDashOffset = node.strokeDashOffset;
|
|
}
|
|
|
|
- (id)copyWithZone:(NSZone *)zone
|
|
{
|
|
IJSVGNode * node = [[self class] allocWithZone:zone];
|
|
[node applyPropertiesFromNode:self];
|
|
return node;
|
|
}
|
|
|
|
- (id)initWithDef:(BOOL)flag
|
|
{
|
|
if( ( self = [super init] ) != nil )
|
|
{
|
|
self.opacity = [IJSVGUnitLength unitWithFloat:0.f];
|
|
self.fillOpacity = [IJSVGUnitLength unitWithFloat:1.f];
|
|
|
|
self.strokeDashOffset = [IJSVGUnitLength unitWithFloat:0.f];
|
|
self.shouldRender = YES;
|
|
|
|
self.strokeOpacity = [IJSVGUnitLength unitWithFloat:1.f];
|
|
self.strokeOpacity.inherit = YES;
|
|
|
|
self.strokeWidth = [IJSVGUnitLength unitWithFloat:0.f];
|
|
self.strokeWidth.inherit = YES;
|
|
|
|
self.windingRule = IJSVGWindingRuleInherit;
|
|
self.lineCapStyle = IJSVGLineCapStyleInherit;
|
|
self.lineJoinStyle = IJSVGLineJoinStyleInherit;
|
|
self.units = IJSVGUnitInherit;
|
|
|
|
self.blendMode = IJSVGBlendModeNormal;
|
|
|
|
if( flag ) {
|
|
def = [[IJSVGDef alloc] init];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (IJSVGDef *)defForID:(NSString *)anID
|
|
{
|
|
IJSVGDef * aDef = nil;
|
|
if( (aDef = [def defForID:anID]) != nil ) {
|
|
return aDef;
|
|
}
|
|
if( parentNode != nil ) {
|
|
return [parentNode defForID:anID];
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
- (void)addDef:(IJSVGNode *)aDef
|
|
{
|
|
[def addDef:aDef];
|
|
}
|
|
|
|
// winding rule can inherit..
|
|
- (IJSVGWindingRule)windingRule
|
|
{
|
|
if(windingRule == IJSVGWindingRuleInherit && parentNode != nil) {
|
|
return parentNode.windingRule;
|
|
}
|
|
return windingRule;
|
|
}
|
|
|
|
- (IJSVGLineCapStyle)lineCapStyle
|
|
{
|
|
if( lineCapStyle == IJSVGLineCapStyleInherit ) {
|
|
if( parentNode != nil ) {
|
|
return parentNode.lineCapStyle;
|
|
}
|
|
}
|
|
return lineCapStyle;
|
|
}
|
|
|
|
- (IJSVGLineJoinStyle)lineJoinStyle
|
|
{
|
|
if( lineJoinStyle == IJSVGLineJoinStyleInherit ) {
|
|
if( parentNode != nil ) {
|
|
return parentNode.lineJoinStyle;
|
|
}
|
|
}
|
|
return lineJoinStyle;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGUnitLength *)opacity
|
|
{
|
|
if(opacity.inherit && parentNode != nil) {
|
|
return parentNode.opacity;
|
|
}
|
|
return opacity;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGUnitLength *)fillOpacity
|
|
{
|
|
if(fillOpacity.inherit && parentNode != nil) {
|
|
return parentNode.fillOpacity;
|
|
}
|
|
return fillOpacity;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGUnitLength *)strokeWidth
|
|
{
|
|
if(strokeWidth.inherit && parentNode != nil) {
|
|
return parentNode.strokeWidth;
|
|
}
|
|
return strokeWidth;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (NSColor *)strokeColor
|
|
{
|
|
if( strokeColor != nil )
|
|
return strokeColor;
|
|
if( strokeColor == nil && parentNode != nil )
|
|
return parentNode.strokeColor;
|
|
return nil;
|
|
}
|
|
|
|
- (IJSVGUnitLength *)strokeOpacity
|
|
{
|
|
if(strokeOpacity.inherit && parentNode != nil) {
|
|
return parentNode.strokeOpacity;
|
|
}
|
|
return strokeOpacity;
|
|
}
|
|
|
|
// even though the spec explicity states fill color
|
|
// must be on the path, it can also be on the
|
|
- (NSColor *)fillColor
|
|
{
|
|
if( fillColor == nil && parentNode != nil ) {
|
|
return parentNode.fillColor;
|
|
}
|
|
return fillColor;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGGradient *)fillGradient
|
|
{
|
|
if(fillGradient == nil && parentNode != nil) {
|
|
return parentNode.fillGradient;
|
|
}
|
|
return fillGradient;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGPattern *)fillPattern
|
|
{
|
|
if(fillPattern == nil && parentNode != nil) {
|
|
return parentNode.fillPattern;
|
|
}
|
|
return fillPattern;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGGradient *)strokeGradient
|
|
{
|
|
if(strokeGradient == nil && parentNode != nil) {
|
|
return parentNode.strokeGradient;
|
|
}
|
|
return strokeGradient;
|
|
}
|
|
|
|
// these are all recursive, so go up the chain
|
|
// if they dont exist on this specific node
|
|
- (IJSVGPattern *)strokePattern
|
|
{
|
|
if(strokePattern == nil && parentNode != nil) {
|
|
return parentNode.strokePattern;
|
|
}
|
|
return strokePattern;
|
|
}
|
|
|
|
@end
|