From 1324fc179e45778eb3bfdd1a896c4d2fbd81ebfd Mon Sep 17 00:00:00 2001 From: dsward2 Date: Tue, 5 May 2020 12:42:32 -0500 Subject: [PATCH] This commit fixes some bugs, mainly for path segments for the 'm' relative move command. --- .../PathElementEditor.h | 2 + .../PathElementEditor.m | 90 ++- macSVG/MacSVG-Info.plist | 2 +- .../DOMSelectionControlsManager.m | 4 +- macSVG/SVGDocument Classes/PathFunctions.m | 520 ++++++------------ macSVG/SVGDocument Classes/SVGPathEditor.m | 45 +- .../SVGDocument Classes/SVGWebKitController.m | 2 + 7 files changed, 288 insertions(+), 377 deletions(-) diff --git a/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.h b/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.h index 2044580..6815658 100644 --- a/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.h +++ b/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.h @@ -71,6 +71,8 @@ // path functions @property(strong) IBOutlet PathElementEditorFunctions * pathFunctions; +@property(strong) NSString * selectedElementMacsvgid; + - (IBAction)updateSVGPathEditorAction:(id)sender; - (IBAction)editPathSegmentButtonAction:(id)sender; diff --git a/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.m b/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.m index da4b66b..a92136e 100644 --- a/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.m +++ b/MacSVG Plugin Projects/macSVG Plugins/PathElementEditorPlugin/PathElementEditorPlugin/PathElementEditor.m @@ -144,7 +144,7 @@ - (void)unloadPluginView { - + [super unloadPluginView]; } //================================================================================== @@ -166,6 +166,35 @@ } } +//================================================================================== +// loadPluginViewInScrollView: +//================================================================================== + +- (BOOL)loadPluginViewInScrollView:(NSScrollView *)scrollView +{ + BOOL result = [super loadPluginViewInScrollView:scrollView]; + + return result; +} + +//================================================================================== +// svgWebViewReloaded: +//================================================================================== + +- (void) svgWebViewReloaded:(NSNotification *)aNotification +{ + // After Undo/Redo, the path element should be re-selected + if ([self.svgXmlOutlineView selectedRow] == -1) + { + NSXMLElement * selectedElement = [self.macSVGPluginCallbacks xmlElementForMacsvgid:self.selectedElementMacsvgid]; + + if (selectedElement != NULL) + { + [self.macSVGPluginCallbacks selectXMLElement:selectedElement]; + } + } +} + //================================================================================== // selectedPathMode //================================================================================== @@ -367,8 +396,11 @@ if (pathSegmentsArrayCount > 0) { - PathSegment * closePathSegment = [[pathSegmentsArray objectAtIndex:pathSegmentsArrayCount - 1] mutableCopy]; - [pathSegmentsArray addObject:closePathSegment]; // add a second the Z or z segment, the final one will be removed + + PathSegment * closePathSegment = [pathSegmentsArray objectAtIndex:pathSegmentsArrayCount - 1]; + PathSegment * newClosePathSegment = [[PathSegment alloc] init]; + [newClosePathSegment copyValuesFromPathSegment:closePathSegment]; + [pathSegmentsArray addObject:newClosePathSegment]; // add a second the Z or z segment, the final one will be removed [self.macSVGPluginCallbacks updatePathSegmentsAbsoluteValues:pathSegmentsArray]; @@ -481,6 +513,10 @@ - (void) loadSettingsForElement { + NSXMLNode * macsvgidNode = [self.pluginTargetXMLElement attributeForName:@"macsvgid"]; + NSString * selectedElementMacsvgid = macsvgidNode.stringValue; + self.selectedElementMacsvgid = selectedElementMacsvgid; + NSString * selectedPathMode = (self.macSVGPluginCallbacks).selectedPathMode; BOOL useRelativePathCoordinates = (self.macSVGPluginCallbacks).useRelativePathCoordinates; @@ -576,6 +612,11 @@ existingValue:existingValue]; [self loadSettingsForElement]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(svgWebViewReloaded:) + name:@"SVGWebViewReloaded" + object:nil]; return result; } @@ -591,10 +632,26 @@ domElement:newPluginTargetDOMElement]; [self loadSettingsForElement]; - + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(svgWebViewReloaded:) + name:@"SVGWebViewReloaded" + object:nil]; + return result; } +//================================================================================== +// endEdi: +//================================================================================== + +- (void)endEdit +{ + [[NSNotificationCenter defaultCenter] removeObserver:self name:@"SVGWebViewReloaded" object:NULL]; + + [super endEdit]; +} + //================================================================================== // performPathFunctionButtonAction: //================================================================================== @@ -1029,10 +1086,31 @@ self.pathSegmentEditorMode = kAddPathSegment; NSButton *targetButton = (NSButton *)sender; + + NSMutableArray * pathSegmentsArray = [self pathSegmentsArray]; + + if (pathSegmentsArray.count == 0) + { + PathSegment * newPathSegment = [[PathSegment alloc] init]; + newPathSegment.pathCommand = 'M'; + newPathSegment.xFloat = 0; + newPathSegment.yFloat = 0; + newPathSegment.absoluteStartXFloat = 0; + newPathSegment.absoluteStartYFloat = 0; + newPathSegment.xFloat = 0; + newPathSegment.yFloat = 0; + + [pathSegmentsArray addObject:newPathSegment]; + } NSInteger rowIndex = (self.pathTableView).selectedRow; - - NSMutableArray * pathSegmentsArray = [self pathSegmentsArray]; + + if (rowIndex == -1) + { + rowIndex = pathSegmentsArray.count - 1; + NSIndexSet * rowIndexSet = [NSIndexSet indexSetWithIndex:rowIndex]; + [self.pathTableView selectRowIndexes:rowIndexSet byExtendingSelection:NO]; + } PathSegment * pathSegment = pathSegmentsArray[rowIndex]; diff --git a/macSVG/MacSVG-Info.plist b/macSVG/MacSVG-Info.plist index c86fd0b..c075248 100644 --- a/macSVG/MacSVG-Info.plist +++ b/macSVG/MacSVG-Info.plist @@ -105,7 +105,7 @@ CFBundleSignature ???? CFBundleVersion - 3256 + 3331 LSApplicationCategoryType public.app-category.graphics-design LSMinimumSystemVersion diff --git a/macSVG/SVGDocument Classes/DOMSelectionControlsManager.m b/macSVG/SVGDocument Classes/DOMSelectionControlsManager.m index 29dccc9..e8de074 100644 --- a/macSVG/SVGDocument Classes/DOMSelectionControlsManager.m +++ b/macSVG/SVGDocument Classes/DOMSelectionControlsManager.m @@ -2452,12 +2452,12 @@ [newPathString appendString:pathCommandString]; } - NSString * xString = pathSegment.xString; + NSString * xString = pathSegment.absoluteXString; [newPathString appendString:xString]; [newPathString appendString:@","]; - NSString * yString = pathSegment.yString; + NSString * yString = pathSegment.absoluteYString; [newPathString appendString:yString]; [newPathString appendString:@" "]; diff --git a/macSVG/SVGDocument Classes/PathFunctions.m b/macSVG/SVGDocument Classes/PathFunctions.m index 68a8177..d9a872f 100644 --- a/macSVG/SVGDocument Classes/PathFunctions.m +++ b/macSVG/SVGDocument Classes/PathFunctions.m @@ -600,17 +600,8 @@ case 'm': // moveto { - NSString * xString = pathSegment.xString; - float xFloat = xString.floatValue; - xFloat += absoluteStartXFloat; - NSMutableString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; - - NSString * yString = pathSegment.yString; - float yFloat = yString.floatValue; - yFloat += absoluteStartYFloat; - NSMutableString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + pathSegment.xFloat = pathSegment.absoluteXFloat; + pathSegment.yFloat = pathSegment.absoluteYFloat; pathSegment.pathCommand = 'M'; break; @@ -1441,7 +1432,6 @@ - (NSMutableArray *)reversePathWithPathSegmentsArray:(NSMutableArray *)pathSegmentsArray { - MacSVGDocument * macSVGDocument = (self.macSVGDocumentWindowController).document; [self.macSVGDocumentWindowController.svgWebKitController updatePathSegmentsAbsoluteValues:pathSegmentsArray]; NSMutableArray * cubicPathSegmentsArray = [self copyPathSegmentsArray:pathSegmentsArray]; @@ -1477,18 +1467,10 @@ float absoluteStartYFloat = reversePathSegment.absoluteStartYFloat; float absoluteXFloat = reversePathSegment.absoluteXFloat; float absoluteYFloat = reversePathSegment.absoluteYFloat; - - NSString * absoluteStartXString = [macSVGDocument allocFloatString:absoluteStartXFloat]; - NSString * absoluteStartYString = [macSVGDocument allocFloatString:absoluteStartYFloat]; - NSString * absoluteXString = [macSVGDocument allocFloatString:absoluteXFloat]; - NSString * absoluteYString = [macSVGDocument allocFloatString:absoluteYFloat]; - - NSString * xString = pathSegment.xString; - NSString * yString = pathSegment.yString; + + float xFloat = pathSegment.xFloat; + float yFloat = pathSegment.yFloat; - float xFloat = xString.floatValue; - float yFloat = yString.floatValue; - pathSegment.pathCommand = reversePathSegment.pathCommand;; unichar commandCharacter = pathSegment.pathCommand; @@ -1500,17 +1482,13 @@ NSPoint reverseOriginPoint = [self.macSVGDocumentWindowController.svgWebKitController endPointForSegmentIndex:0 pathSegmentsArray:reverseSegmentsArray]; - NSMutableDictionary * movetoPathDictionary = [NSMutableDictionary dictionary]; + PathSegment * movetoPathSegment = [[PathSegment alloc] init]; - movetoPathDictionary[@"command"] = @"M"; - - NSString * movetoXString = [macSVGDocument allocFloatString:reverseOriginPoint.x]; - NSString * movetoYString = [macSVGDocument allocFloatString:reverseOriginPoint.y]; - - movetoPathDictionary[@"x"] = movetoXString; - movetoPathDictionary[@"y"] = movetoYString; - - [newPathSegmentsArray addObject:movetoPathDictionary]; + movetoPathSegment.pathCommand = 'M'; + movetoPathSegment.xFloat = reverseOriginPoint.x; + movetoPathSegment.yFloat = reverseOriginPoint.y; + + [newPathSegmentsArray addObject:movetoPathSegment]; } // some path segments must be changed to standard cubic curves for accurate reversal @@ -1522,32 +1500,26 @@ commandCharacter = 'C'; pathSegment.pathCommand = commandCharacter; - NSString * absoluteX1String = [macSVGDocument allocFloatString:absoluteStartXFloat]; - NSString * absoluteY1String = [macSVGDocument allocFloatString:absoluteStartYFloat]; + float absoluteX1Float = absoluteStartXFloat; + float absoluteY1Float = absoluteStartYFloat; if (currentIndex < reverseSegmentsArray.count) { - NSMutableDictionary * nextReversePathSegmentsDictionary = + PathSegment * nextReversePathSegment = reverseSegmentsArray[(currentIndex + 1)]; - NSNumber * nextAbsoluteX2Number = nextReversePathSegmentsDictionary[@"absoluteX2"]; - NSNumber * nextAbsoluteY2Number = nextReversePathSegmentsDictionary[@"absoluteY2"]; - - if ((nextAbsoluteX2Number != NULL) && (nextAbsoluteY2Number != NULL)) - { - float nextAbsoluteX2Float = nextAbsoluteX2Number.floatValue; - float nextAbsoluteY2Float = nextAbsoluteY2Number.floatValue; + float nextAbsoluteX2Float = nextReversePathSegment.absoluteX2Float; + float nextAbsoluteY2Float = nextReversePathSegment.absoluteY2Float; - float absoluteX1 = absoluteStartXFloat + (absoluteStartXFloat - nextAbsoluteX2Float); - float absoluteY1 = absoluteStartYFloat + (absoluteStartYFloat - nextAbsoluteY2Float); - - absoluteX1String = [macSVGDocument allocFloatString:absoluteX1]; - absoluteY1String = [macSVGDocument allocFloatString:absoluteY1]; - } + float absoluteX1 = absoluteStartXFloat + (absoluteStartXFloat - nextAbsoluteX2Float); + float absoluteY1 = absoluteStartYFloat + (absoluteStartYFloat - nextAbsoluteY2Float); + + absoluteX1Float = absoluteX1; + absoluteY1Float = absoluteY1; } - reversePathSegment.x1String = absoluteX1String; - reversePathSegment.y1String = absoluteY1String; + reversePathSegment.x1Float = absoluteX1Float; + reversePathSegment.y1Float = absoluteY1Float; break; } @@ -1557,44 +1529,35 @@ commandCharacter = 'C'; pathSegment.pathCommand = commandCharacter; - NSString * absoluteX1String = [macSVGDocument allocFloatString:absoluteStartXFloat]; - NSString * absoluteY1String = [macSVGDocument allocFloatString:absoluteStartYFloat]; + float absoluteX1Float = absoluteStartXFloat; + float absoluteY1Float = absoluteStartYFloat; if (currentIndex < reverseSegmentsArray.count) { - NSMutableDictionary * nextReversePathSegmentsDictionary = + PathSegment * nextReversePathSegment = reverseSegmentsArray[(currentIndex + 1)]; - NSNumber * nextAbsoluteX2Number = nextReversePathSegmentsDictionary[@"absoluteX2"]; - NSNumber * nextAbsoluteY2Number = nextReversePathSegmentsDictionary[@"absoluteY2"]; - - if ((nextAbsoluteX2Number != NULL) && (nextAbsoluteY2Number != NULL)) - { - float nextAbsoluteX2Float = nextAbsoluteX2Number.floatValue; - float nextAbsoluteY2Float = nextAbsoluteY2Number.floatValue; + float nextAbsoluteX2Float = nextReversePathSegment.absoluteX2Float; + float nextAbsoluteY2Float = nextReversePathSegment.absoluteY2Float; + + float absoluteX1 = absoluteStartXFloat + (absoluteStartXFloat - nextAbsoluteX2Float); + float absoluteY1 = absoluteStartYFloat + (absoluteStartYFloat - nextAbsoluteY2Float); - float absoluteX1 = absoluteStartXFloat + (absoluteStartXFloat - nextAbsoluteX2Float); - float absoluteY1 = absoluteStartYFloat + (absoluteStartYFloat - nextAbsoluteY2Float); - - absoluteX1String = [macSVGDocument allocFloatString:absoluteX1]; - absoluteY1String = [macSVGDocument allocFloatString:absoluteY1]; - } + absoluteX1Float = absoluteX1; + absoluteY1Float = absoluteY1; } - reversePathSegment.x1String = absoluteX1String; - reversePathSegment.y1String = absoluteY1String; + reversePathSegment.x1Float = absoluteX1Float; + reversePathSegment.y1Float = absoluteY1Float; - reversePathSegment.xString = absoluteXString; - reversePathSegment.yString = absoluteYString; + reversePathSegment.xFloat = absoluteXFloat; + reversePathSegment.yFloat = absoluteYFloat; - float absoluteX2 = reversePathSegment.absoluteX2Float; - float absoluteY2 = reversePathSegment.absoluteY2Float; - - NSString * absoluteX2String = [macSVGDocument allocFloatString:absoluteX2]; - NSString * absoluteY2String = [macSVGDocument allocFloatString:absoluteY2]; - - reversePathSegment.x2String = absoluteX2String; - reversePathSegment.y2String = absoluteY2String; + float absoluteX2Float = reversePathSegment.absoluteX2Float; + float absoluteY2Float = reversePathSegment.absoluteY2Float; + + reversePathSegment.x2Float = absoluteX2Float; + reversePathSegment.y2Float = absoluteY2Float; break; } @@ -1611,16 +1574,11 @@ float newAbsoluteY1Float = absoluteStartYFloat - ((absoluteStartYFloat - absoluteY1Float) / 1.5f); float newAbsoluteX2Float = absoluteXFloat - ((absoluteXFloat - absoluteX1Float) / 1.5f); float newAbsoluteY2Float = absoluteYFloat - ((absoluteYFloat - absoluteY1Float) / 1.5f); - - NSString * absoluteX1String = [macSVGDocument allocFloatString:newAbsoluteX1Float]; - NSString * absoluteY1String = [macSVGDocument allocFloatString:newAbsoluteY1Float]; - NSString * absoluteX2String = [macSVGDocument allocFloatString:newAbsoluteX2Float]; - NSString * absoluteY2String = [macSVGDocument allocFloatString:newAbsoluteY2Float]; - - reversePathSegment.x1String = absoluteX1String; - reversePathSegment.y1String = absoluteY1String; - reversePathSegment.x2String = absoluteX2String; - reversePathSegment.y2String = absoluteY2String; + + reversePathSegment.x1Float = newAbsoluteX1Float; + reversePathSegment.y1Float = newAbsoluteY1Float; + reversePathSegment.x2Float = newAbsoluteX2Float; + reversePathSegment.y2Float = newAbsoluteY2Float; break; } @@ -1638,15 +1596,10 @@ float newAbsoluteX2Float = absoluteXFloat - ((absoluteXFloat - absoluteX1Float) / 1.5f); float newAbsoluteY2Float = absoluteYFloat - ((absoluteYFloat - absoluteY1Float) / 1.5f); - NSString * absoluteX1String = [macSVGDocument allocFloatString:newAbsoluteX1Float]; - NSString * absoluteY1String = [macSVGDocument allocFloatString:newAbsoluteY1Float]; - NSString * absoluteX2String = [macSVGDocument allocFloatString:newAbsoluteX2Float]; - NSString * absoluteY2String = [macSVGDocument allocFloatString:newAbsoluteY2Float]; - - reversePathSegment.x1String = absoluteX1String; - reversePathSegment.y1String = absoluteY1String; - reversePathSegment.x2String = absoluteX2String; - reversePathSegment.y2String = absoluteY2String; + reversePathSegment.x1Float = newAbsoluteX1Float; + reversePathSegment.y1Float = newAbsoluteY1Float; + reversePathSegment.x2Float = newAbsoluteX2Float; + reversePathSegment.y2Float = newAbsoluteY2Float; break; } @@ -1667,10 +1620,10 @@ float cubicAbsoluteX2 = cubicPathSegment.absoluteX2Float; float cubicAbsoluteY2 = cubicPathSegment.absoluteY2Float; - NSString * cubicX1String = cubicPathSegment.x1String; - NSString * cubicY1String = cubicPathSegment.y1String; - NSString * cubicX2String = cubicPathSegment.x2String; - NSString * cubicY2String = cubicPathSegment.y2String; + float cubicX1Float = cubicPathSegment.x1Float; + float cubicY1Float = cubicPathSegment.y1Float; + float cubicX2Float = cubicPathSegment.x2Float; + float cubicY2Float = cubicPathSegment.y2Float; // reverse the endpoint of the cubic bezier for the new segment @@ -1686,15 +1639,12 @@ newPathSegment.absoluteX2Float = cubicAbsoluteX2; newPathSegment.absoluteY2Float = cubicAbsoluteY2; - NSString * newXString = [self allocFloatString:cubicAbsoluteStartX]; - NSString * newYString = [self allocFloatString:cubicAbsoluteStartY]; - - newPathSegment.xString = newXString; - newPathSegment.yString = newYString; - newPathSegment.x1String = cubicX1String; - newPathSegment.y1String = cubicY1String; - newPathSegment.x2String = cubicX2String; - newPathSegment.y2String = cubicY2String; + newPathSegment.xFloat = cubicAbsoluteStartX; + newPathSegment.yFloat = cubicAbsoluteStartY; + newPathSegment.x1Float = cubicX1Float; + newPathSegment.y1Float = cubicY1Float; + newPathSegment.x2Float = cubicX2Float; + newPathSegment.y2Float = cubicY2Float; [reversePathSegment copyValuesFromPathSegment:newPathSegment]; @@ -1716,10 +1666,10 @@ float cubicAbsoluteX2 = cubicPathSegment.absoluteX2Float; float cubicAbsoluteY2 = cubicPathSegment.absoluteY2Float; - NSString * cubicX1String = cubicPathSegment.x1String; - NSString * cubicY1String = cubicPathSegment.y1String; - NSString * cubicX2String = cubicPathSegment.x2String; - NSString * cubicY2String = cubicPathSegment.y2String; + float cubicX1Float = cubicPathSegment.x1Float; + float cubicY1Float = cubicPathSegment.y1Float; + float cubicX2Float = cubicPathSegment.x2Float; + float cubicY2Float = cubicPathSegment.y2Float; // reverse the endpoint of the cubic bezier for the new segment @@ -1735,15 +1685,12 @@ newPathSegment.absoluteX2Float = cubicAbsoluteX2; newPathSegment.absoluteY2Float = cubicAbsoluteY2; - NSString * newXString = [self allocFloatString:cubicAbsoluteStartX]; - NSString * newYString = [self allocFloatString:cubicAbsoluteStartX]; - - newPathSegment.xString = newXString; - newPathSegment.yString = newYString; - newPathSegment.x1String = cubicX1String; - newPathSegment.y1String = cubicY1String; - newPathSegment.x2String = cubicX2String; - newPathSegment.y2String = cubicY2String; + newPathSegment.xFloat = cubicAbsoluteStartX; + newPathSegment.yFloat = cubicAbsoluteStartX; + newPathSegment.x1Float = cubicX1Float; + newPathSegment.y1Float = cubicY1Float; + newPathSegment.x2Float = cubicX2Float; + newPathSegment.y2Float = cubicY2Float; [reversePathSegment copyValuesFromPathSegment:newPathSegment]; @@ -1756,8 +1703,8 @@ { case 'M': // moveto { - pathSegment.xString = absoluteStartXString; - pathSegment.yString = absoluteStartYString; + pathSegment.xFloat = absoluteStartXFloat; + pathSegment.yFloat = absoluteStartYFloat; break; } @@ -1765,19 +1712,17 @@ case 'm': // moveto { xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; + pathSegment.xFloat = xFloat; yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + pathSegment.yFloat = yFloat; break; } case 'L': // lineto { - pathSegment.xString = absoluteStartXString; - pathSegment.yString = absoluteStartYString; + pathSegment.xFloat = absoluteStartXFloat; + pathSegment.yFloat = absoluteStartYFloat; break; } @@ -1785,19 +1730,17 @@ case 'l': // lineto { xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; + pathSegment.xFloat = xFloat; yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + pathSegment.yFloat = yFloat; break; } case 'H': // horizontal lineto { - pathSegment.xString = absoluteStartXString; + pathSegment.xFloat = absoluteStartXFloat; break; } @@ -1805,15 +1748,14 @@ case 'h': // horizontal lineto { xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; + pathSegment.xFloat = xFloat; break; } case 'V': // vertical lineto { - pathSegment.yString = absoluteStartYString; + pathSegment.yFloat = absoluteStartYFloat; break; } @@ -1821,27 +1763,20 @@ case 'v': // vertical lineto { yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + pathSegment.yFloat = yFloat; break; } case 'C': // curveto { - pathSegment.xString = absoluteStartXString; - pathSegment.yString = absoluteStartYString; - - NSString * x1String = reversePathSegment.x1String; - NSString * y1String = reversePathSegment.y1String; - NSString * x2String = reversePathSegment.x2String; - NSString * y2String = reversePathSegment.y2String; + pathSegment.xFloat = absoluteStartXFloat; + pathSegment.yFloat = absoluteStartYFloat; - - pathSegment.x1String = x2String; - pathSegment.y1String = y2String; - pathSegment.x2String = x1String; - pathSegment.y2String = y1String; + pathSegment.x1Float = reversePathSegment.x2Float; + pathSegment.y1Float = reversePathSegment.y2Float; + pathSegment.x2Float = reversePathSegment.x1Float; + pathSegment.y2Float = reversePathSegment.y1Float; break; } @@ -1849,37 +1784,25 @@ case 'c': // curveto { xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; + pathSegment.xFloat = xFloat; yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; - - NSString * x1String = reversePathSegment.x1String; - NSString * y1String = reversePathSegment.y1String; - NSString * x2String = reversePathSegment.x2String; - NSString * y2String = reversePathSegment.y2String; + pathSegment.yFloat = yFloat; - float x1Float = x1String.floatValue; - float y1Float = y1String.floatValue; - float x2Float = x2String.floatValue; - float y2Float = y2String.floatValue; + float x1Float = reversePathSegment.x1Float; + float y1Float = reversePathSegment.y1Float; + float x2Float = reversePathSegment.x2Float; + float y2Float = reversePathSegment.y2Float; x1Float = -x1Float; y1Float = -y1Float; x2Float = -x2Float; y2Float = -y2Float; - x1String = [macSVGDocument allocFloatString:x1Float]; - y1String = [macSVGDocument allocFloatString:y1Float]; - x2String = [macSVGDocument allocFloatString:x2Float]; - y2String = [macSVGDocument allocFloatString:y2Float]; - - pathSegment.x1String = x2String; - pathSegment.y1String = y2String; - pathSegment.x2String = x1String; - pathSegment.y2String = y1String; + pathSegment.x1Float = x2Float; + pathSegment.y1Float = y2Float; + pathSegment.x2Float = x1Float; + pathSegment.y2Float = y1Float; break; } @@ -1928,52 +1851,46 @@ case 'A': // elliptical arc { - pathSegment.xString = absoluteStartXString; - pathSegment.yString = absoluteStartYString; + pathSegment.xFloat = absoluteStartXFloat; + pathSegment.yFloat = absoluteStartYFloat; - NSString * rxString = reversePathSegment.rxString; - NSString * ryString = reversePathSegment.ryString; - NSString * xAxisRotationString = reversePathSegment.xAxisRotationString; - NSString * largeArcFlagString = reversePathSegment.largeArcFlagString; - NSString * sweepFlagString = reversePathSegment.sweepFlagString; + float rxFloat = reversePathSegment.rxFloat; + float ryFloat = reversePathSegment.ryFloat; + float xAxisRotationFloat = reversePathSegment.xAxisRotationFloat; + BOOL largeArcFlagBool = reversePathSegment.largeArcFlagBool; + BOOL sweepFlagBool = reversePathSegment.sweepFlagBool; - NSInteger sweepFlag = sweepFlagString.integerValue; - sweepFlag = !sweepFlag; - sweepFlagString = [NSString stringWithFormat:@"%ld", sweepFlag]; + sweepFlagBool = !sweepFlagBool; - pathSegment.rxString = rxString; - pathSegment.ryString = ryString; - pathSegment.xAxisRotationString = xAxisRotationString; - pathSegment.largeArcFlagString = largeArcFlagString; - pathSegment.sweepFlagString = sweepFlagString; + pathSegment.rxFloat = rxFloat; + pathSegment.ryFloat = ryFloat; + pathSegment.xAxisRotationFloat = xAxisRotationFloat; + pathSegment.largeArcFlagBool = largeArcFlagBool; + pathSegment.sweepFlagBool = sweepFlagBool; break; } case 'a': // elliptical arc { xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; + pathSegment.xFloat = xFloat; yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + pathSegment.yFloat = yFloat; - NSString * rxString = reversePathSegment.rxString; - NSString * ryString = reversePathSegment.ryString; - NSString * xAxisRotationString = reversePathSegment.xAxisRotationString; - NSString * largeArcFlagString = reversePathSegment.largeArcFlagString; - NSString * sweepFlagString = reversePathSegment.sweepFlagString; + float rxFloat = reversePathSegment.rxFloat; + float ryFloat = reversePathSegment.ryFloat; + float xAxisRotationFloat = reversePathSegment.xAxisRotationFloat; + BOOL largeArcFlagBool = reversePathSegment.largeArcFlagBool; + BOOL sweepFlagBool = reversePathSegment.sweepFlagBool; - NSInteger sweepFlag = sweepFlagString.integerValue; - sweepFlag = !sweepFlag; - sweepFlagString = [NSString stringWithFormat:@"%ld", sweepFlag]; + sweepFlagBool = !sweepFlagBool; - pathSegment.rxString = rxString; - pathSegment.ryString = ryString; - pathSegment.xAxisRotationString = xAxisRotationString; - pathSegment.largeArcFlagString = largeArcFlagString; - pathSegment.sweepFlagString = sweepFlagString; + pathSegment.rxFloat = rxFloat; + pathSegment.ryFloat = ryFloat; + pathSegment.xAxisRotationFloat = xAxisRotationFloat; + pathSegment.largeArcFlagBool = largeArcFlagBool; + pathSegment.sweepFlagBool = sweepFlagBool; break; } @@ -2501,7 +2418,6 @@ [reverseSegmentsArray insertObject:newPathSegment atIndex:0]; } - NSMutableArray * cubicPathSegmentsArray = [self copyPathSegmentsArray:pathSegmentsArray]; cubicPathSegmentsArray = [self convertCurvesToAbsoluteCubicBezierWithPathSegmentsArray:cubicPathSegmentsArray]; NSMutableArray * reverseCubicsSegmentsArray = [NSMutableArray array]; @@ -2512,8 +2428,6 @@ [reverseCubicsSegmentsArray insertObject:newCubicSegment atIndex:0]; } - - NSInteger lastIndex = pathSegmentsArray.count - 1; NSPoint reverseOriginPoint = [self.macSVGDocumentWindowController.svgWebKitController @@ -2542,71 +2456,35 @@ { case 'M': // moveto { - float deltaX = currentPoint.x - absoluteStartXFloat; - - float newXFloat = currentPoint.x + deltaX; - float newYFloat = absoluteStartYFloat; - - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; - - NSString * newYString = [macSVGDocument allocFloatString:newYFloat]; - pathSegment.yString = newYString; - + float deltaY = currentPoint.y - absoluteStartYFloat; + pathSegment.yFloat = currentPoint.y + deltaY; break; } case 'm': // moveto { - NSString * xString = pathSegment.xString; - NSString * yString = pathSegment.yString; - - float xFloat = xString.floatValue; - float yFloat = yString.floatValue; - - xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; - - yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; - + float xFloat = pathSegment.xFloat; + pathSegment.xFloat = -xFloat; break; } case 'L': // lineto { float deltaX = currentPoint.x - absoluteStartXFloat; + float deltaY = currentPoint.y - absoluteStartYFloat; - float newXFloat = currentPoint.x + deltaX; - float newYFloat = absoluteStartYFloat; - - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; + float newXFloat = currentPoint.x - deltaX; + float newYFloat = currentPoint.y + deltaY; - NSString * newYString = [macSVGDocument allocFloatString:newYFloat]; - pathSegment.yString = newYString; + pathSegment.xFloat = newXFloat; + pathSegment.yFloat = newYFloat; break; } case 'l': // lineto { - NSString * xString = pathSegment.xString; - NSString * yString = pathSegment.yString; - - float xFloat = xString.floatValue; - float yFloat = yString.floatValue; - - float newXFloat = xFloat; - float newYFloat = -yFloat; - - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; - - yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:newYFloat]; - pathSegment.yString = newYString; + float xFloat = pathSegment.xFloat; + pathSegment.xFloat = -xFloat; break; } @@ -2614,95 +2492,63 @@ case 'H': // horizontal lineto { float deltaX = currentPoint.x - absoluteStartXFloat; - - float newXFloat = currentPoint.x + deltaX; - - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; + float newXFloat = currentPoint.x - deltaX; + pathSegment.xFloat = newXFloat; - break; } case 'h': // horizontal lineto { - NSString * xString = pathSegment.xString; - - float xFloat = xString.floatValue; - - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; - + float xFloat = pathSegment.xFloat; + pathSegment.xFloat = -xFloat; + break; } case 'V': // vertical lineto { - NSString * yString = pathSegment.yString; - - float yFloat = yString.floatValue; - - float yDelta = absoluteStartYFloat - yFloat; - yFloat = currentPoint.y + yDelta; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; - + //float yFloat = pathSegment.yFloat; + //float yDelta = absoluteStartYFloat - yFloat; + //yFloat = currentPoint.y + yDelta; + //pathSegment.yFloat = yFloat; + + float deltaY = currentPoint.y - absoluteStartYFloat; + float newYFloat = currentPoint.y + deltaY; + pathSegment.yFloat = newYFloat; + break; } case 'v': // vertical lineto { - NSString * yString = pathSegment.yString; - - float yFloat = yString.floatValue; - - yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; - break; } case 'C': // curveto { - NSString * x1String = pathSegment.x1String; - NSString * y1String = pathSegment.y1String; - NSString * x2String = pathSegment.x2String; - NSString * y2String = pathSegment.y2String; + float x1Float = pathSegment.x1Float; + float y1Float = pathSegment.y1Float; + float x2Float = pathSegment.x2Float; + float y2Float = pathSegment.y2Float; - float x1Float = x1String.floatValue; - float y1Float = y1String.floatValue; - float x2Float = x2String.floatValue; - float y2Float = y2String.floatValue; + float deltaY = currentPoint.y - absoluteStartYFloat; + float deltaY1 = currentPoint.y - y2Float; + float deltaY2 = currentPoint.y - y1Float; - float deltaX = currentPoint.x - absoluteStartXFloat; - float deltaX1 = currentPoint.x - x2Float; - float deltaX2 = currentPoint.x - x1Float; + float newXFloat = absoluteStartXFloat; + float newYFloat = currentPoint.y + deltaY; + float newX1Float = x2Float; + float newY1Float = currentPoint.y + deltaY1; + float newX2Float = x1Float; + float newY2Float = currentPoint.y + deltaY2; - float newXFloat = currentPoint.x + deltaX; - float newYFloat = absoluteStartYFloat; - float newX1Float = currentPoint.x + deltaX1; - float newY1Float = y2Float; - float newX2Float = currentPoint.x + deltaX2; - float newY2Float = y1Float; - - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; - - NSString * newYString = [macSVGDocument allocFloatString:newYFloat]; - pathSegment.yString = newYString; - - NSString * newX1String = [macSVGDocument allocFloatString:newX1Float]; - pathSegment.x1String = newX1String; - - NSString * newY1String = [macSVGDocument allocFloatString:newY1Float]; - pathSegment.y1String = newY1String; - - NSString * newX2String = [macSVGDocument allocFloatString:newX2Float]; - pathSegment.x2String = newX2String; - - NSString * newY2String = [macSVGDocument allocFloatString:newY2Float]; - pathSegment.y2String = newY2String; + pathSegment.xFloat = newXFloat; + pathSegment.yFloat = newYFloat; + pathSegment.x1Float = newX1Float; + pathSegment.y1Float = newY1Float; + pathSegment.x2Float = newX2Float; + pathSegment.y2Float = newY2Float; break; } @@ -2811,34 +2657,20 @@ case 'A': // elliptical arc { - float deltaX = currentPoint.x - absoluteStartXFloat; + float deltaY = currentPoint.y - absoluteStartYFloat; - float newXFloat = currentPoint.x + deltaX; - float newYFloat = absoluteStartYFloat; + float newXFloat = absoluteStartXFloat; + float newYFloat = currentPoint.y + deltaY; - NSString * newXString = [macSVGDocument allocFloatString:newXFloat]; - pathSegment.xString = newXString; - - NSString * newYString = [macSVGDocument allocFloatString:newYFloat]; - pathSegment.yString = newYString; + pathSegment.xFloat = newXFloat; + pathSegment.yFloat = newYFloat; break; } case 'a': // elliptical arc { - NSString * xString = pathSegment.xString; - NSString * yString = pathSegment.yString; - - float xFloat = xString.floatValue; - float yFloat = yString.floatValue; - - xFloat = -xFloat; - NSString * newXString = [macSVGDocument allocFloatString:xFloat]; - pathSegment.xString = newXString; - - yFloat = -yFloat; - NSString * newYString = [macSVGDocument allocFloatString:yFloat]; - pathSegment.yString = newYString; + float xFloat = pathSegment.xFloat; + pathSegment.xFloat = -xFloat; break; } diff --git a/macSVG/SVGDocument Classes/SVGPathEditor.m b/macSVG/SVGDocument Classes/SVGPathEditor.m index 6061bb9..c8593f2 100644 --- a/macSVG/SVGDocument Classes/SVGPathEditor.m +++ b/macSVG/SVGDocument Classes/SVGPathEditor.m @@ -932,6 +932,9 @@ currentPathSegment.absoluteXFloat = segmentAbsoluteX; currentPathSegment.absoluteYFloat = segmentAbsoluteY; + currentPathSegment.absoluteStartXFloat = segmentAbsoluteX; + currentPathSegment.absoluteStartYFloat = segmentAbsoluteY; + if ((previousCommandChar == 'Z') || (previousCommandChar == 'z')) { subpathAbsoluteStartX = segmentAbsoluteStartX; @@ -1560,8 +1563,8 @@ pathXMLElement:(NSXMLElement *)pathXMLElement { // path commands M,m - NSString * xString = pathSegment.xString; - NSString * yString = pathSegment.yString; + NSString * xString = pathSegment.absoluteXString; + NSString * yString = pathSegment.absoluteYString; NSString * xPxString = [xString stringByAppendingString:@"px"]; NSString * yPxString = [yString stringByAppendingString:@"px"]; @@ -3160,6 +3163,8 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) NSString * pathString = [pathElement getAttribute:@"d"]; NSMutableArray * aPathsArray = [self buildPathSegmentsArrayWithPathString:pathString]; + + self.pathSegmentsArray = aPathsArray; NSUInteger pathSegmentsCount = aPathsArray.count; @@ -4292,6 +4297,17 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) pathSegment.xString = newXString; pathSegment.yString = newYString; + + if (pathSegment.pathCommand == 'M') + { + pathSegment.absoluteXFloat = newX; + pathSegment.absoluteYFloat = newY; + } + else if (pathSegment.pathCommand == 'm') + { + pathSegment.absoluteXFloat = pathSegment.absoluteStartXFloat + newX; + pathSegment.absoluteYFloat = pathSegment.absoluteStartYFloat + newX; + } NSUInteger pathSegmentCount = (self.pathSegmentsArray).count; if (self.pathSegmentIndex < (pathSegmentCount - 1)) @@ -5183,12 +5199,6 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) case 't': // smooth quadratic Bezier curve case 'a': // elliptical arc { - float newNextPathSegmentAbsoluteX = nextPathSegmentAbsoluteX + deltaX; - float newNextPathSegmentAbsoluteY = nextPathSegmentAbsoluteY + deltaY; - - nextPathSegment.absoluteXFloat = newNextPathSegmentAbsoluteX; - nextPathSegment.absoluteYFloat = newNextPathSegmentAbsoluteY; - float newNextPathSegmentX = nextPathSegmentX - deltaX; float newNextPathSegmentY = nextPathSegmentY - deltaY; @@ -5199,15 +5209,6 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) } case 'c': // curveto { - float nextPathSegmentAbsoluteX1 = nextPathSegment.absoluteX1Float; - float nextPathSegmentAbsoluteY1 = nextPathSegment.absoluteY1Float; - - float newNextPathSegmentAbsoluteX1 = nextPathSegmentAbsoluteX1 + deltaX; - float newNextPathSegmentAbsoluteY1 = nextPathSegmentAbsoluteY1 + deltaY; - - nextPathSegment.absoluteX1Float = newNextPathSegmentAbsoluteX1; - nextPathSegment.absoluteY1Float = newNextPathSegmentAbsoluteY1; - float nextPathSegmentX2 = nextPathSegment.x2Float; float nextPathSegmentY2 = nextPathSegment.y2Float; @@ -5229,9 +5230,6 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) } case 'h': // horizontal lineto { - float newNextPathSegmentAbsoluteX = nextPathSegmentAbsoluteX + deltaX; - nextPathSegment.absoluteXFloat = newNextPathSegmentAbsoluteX; - float newNextPathSegmentX = nextPathSegmentX + deltaX; nextPathSegment.xFloat = newNextPathSegmentX; @@ -5239,9 +5237,6 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) } case 'v': // vertical lineto { - float newNextPathSegmentAbsoluteY = nextPathSegmentAbsoluteX + deltaY; - nextPathSegment.absoluteYFloat = newNextPathSegmentAbsoluteY; - float newNextPathSegmentY = nextPathSegmentY + deltaY; nextPathSegment.yFloat = newNextPathSegmentY; @@ -5530,7 +5525,7 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) pathSegment.xString = newXString; pathSegment.yString = newYString; - + break; } case 'L': // lineto absolute @@ -5775,6 +5770,8 @@ NSPoint bezierMidPoint(NSPoint p0, NSPoint p1, NSPoint p2) [self updatePathSegmentsAbsoluteValues:self.pathSegmentsArray]; [self updateActivePathInDOM:YES]; + + //NSLog(@"pathSegmentsArray - %@", self.pathSegmentsArray); } //================================================================================== diff --git a/macSVG/SVGDocument Classes/SVGWebKitController.m b/macSVG/SVGDocument Classes/SVGWebKitController.m index 4604e3b..9cabdd8 100644 --- a/macSVG/SVGDocument Classes/SVGWebKitController.m +++ b/macSVG/SVGDocument Classes/SVGWebKitController.m @@ -435,6 +435,8 @@ //[self.domSelectionControlsManager updateDOMSelectionRectsAndHandles]; // 20160716 [self reloadRulerViews]; + + [[NSNotificationCenter defaultCenter] postNotificationName:@"SVGWebViewReloaded" object:self]; } //==================================================================================