2016-07-19 14:25:35 +03:00

117 lines
4.5 KiB
Objective-C

//
// SVGPathGenerator.h
// SVGgh
// The MIT License (MIT)
// Copyright (c) 2012-2014 Glenn R. Howes
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// Created by Glenn Howes on 12/31/12.
#if defined(__has_feature) && __has_feature(modules)
@import Foundation;
@import CoreGraphics;
#else
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#endif
typedef enum SVGPathValidationError
{
kPathParsingErrorNone = 0,
kPathParsingErrorMissingNumber,
kPathParsingErrorExpectedBoolean,
kPathParsingErrorExpectedDegrees,
kPathParsingErrorUnknownOperand,
kPathParsingErrorMissingStart,
kPathParsingErrorMissingVirtualControlPoint
}SVGPathValidationError;
NS_ASSUME_NONNULL_BEGIN
/*! @brief an object which encapsulates the results of trying to verify an SVG paths 'd' attribute
*/
@interface PathValidationResult : NSObject
/*! @property rangeOfError where in the path string was an error found
*/
@property(nonatomic, readonly) NSRange rangeOfError;
/*! @property error which of the enumerated SVGPathValidationError codes were found
*/
@property(nonatomic, readonly) SVGPathValidationError errorCode;
/*! @property operatorAtError which SVG path operation was the point at which an invalid string was reached
*/
@property(nonatomic, readonly) unsigned char operatorAtError;
/*! @property errorInLastOperation was the error (if any) found while parsing the last operation
*/
@property(nonatomic, readonly) BOOL errorInLastOperation;
/*! @property unexpectedCharacters a string of characters that should never be in an SVG path entity's 'd' attribute but were
*/
@property(nonatomic, readonly) NSString* __nullable unexpectedCharacters;
@end
/*! @brief a bundle of mehtods that deal with the interaction between CGPaths and the text strings to build them
*/
@interface SVGPathGenerator : NSObject
/*! @brief given a CGPathRef, convert it to an SVG Path
* @param aPath a path to be serialized
* @return a string appropriate for a 'd' attribute of an SVG path entity
*/
+(nullable NSString*) svgPathFromCGPath:(CGPathRef)aPath;
/*! @brief given a 'd' attribute from an SVG path entity, create a Core Graphics Path
* @param anSVGPath something like 'M33 11 H22 L 100 100 a 20 40 0 1 1 12 14 Z'
* @param aTransform an affine transform to apply to the result at the time of creation
*/
+(nullable CGPathRef) newCGPathFromSVGPath:(NSString*)anSVGPath whileApplyingTransform:(CGAffineTransform)aTransform CF_RETURNS_RETAINED;
/*! @brief given a SVG path in text form, return a bounding box (includes control points)
* @param anSVGPath a string from a path entity's 'd' attribute
* @return a rectangle which encapulates all the points on the path and any control points
*/
+(CGRect) maxBoundingBoxForSVGPath:(NSString*)anSVGPath;
/*! @brief validate the provided SVG path string
* @param anSVGPath a string from a path entity's 'd' attribute
* @return an object which should be checked for errors in parsing the path
*/
+(nullable PathValidationResult*) findFailure:(NSString*)anSVGPath;
/*! @brief given an SVG operator e.g. 'm', 'z', 'l', 'H', etc., give the number of expected parameters
* @param svgOperator one of the expected operators for an SVG path
* @return number of parameters needed for given operator, e.g. 'z' would return 0
*/
+(NSInteger) parametersNeededForOperator:(unsigned char)svgOperator;
/*! @brief set of characters that should never appear in a 'd' attribute of an SVG path entity
* @return a set of characters like 'b' or '!' or whatever that never appear
*/
+(NSCharacterSet*)invalidPathCharacters;
@end
NS_ASSUME_NONNULL_END