diff --git a/.travis.yml b/.travis.yml index a51c83d1..38976ace 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,4 +7,5 @@ branches: script: - set -o pipefail && xcodebuild test -project Macaw.xcodeproj -scheme 'Macaw iOS' -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO -destination 'platform=iOS Simulator,name=iPhone 6,OS=11.2' | xcpretty; - - set -o pipefail && xcodebuild build -project Macaw.xcodeproj -scheme 'MacawOSX' ONLY_ACTIVE_ARCH=NO | xcpretty; \ No newline at end of file + - set -o pipefail && xcodebuild build -project Macaw.xcodeproj -scheme 'MacawOSX' ONLY_ACTIVE_ARCH=NO | xcpretty; + - set -o pipefail && xcodebuild build -project Macaw.xcodeproj -scheme 'MacawtvOS' ONLY_ACTIVE_ARCH=NO | xcpretty; diff --git a/Macaw.podspec b/Macaw.podspec index 85aff6b1..cd77ac69 100644 --- a/Macaw.podspec +++ b/Macaw.podspec @@ -28,6 +28,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = "9.0" s.osx.deployment_target = "10.12" + s.tvos.deployment_target = '9.0' s.requires_arc = true s.pod_target_xcconfig = { 'SWIFT_VERSION' => '4.0' } diff --git a/Macaw.xcodeproj/project.pbxproj b/Macaw.xcodeproj/project.pbxproj index 2e1fc86e..c0f1c410 100644 --- a/Macaw.xcodeproj/project.pbxproj +++ b/Macaw.xcodeproj/project.pbxproj @@ -255,6 +255,125 @@ 57F1087C1F53CA7E00DC365B /* MDisplayLink_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F1087B1F53CA7E00DC365B /* MDisplayLink_iOS.swift */; }; 57FCD2771D76EA4600CC0FB6 /* Macaw.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57FCD26C1D76EA4600CC0FB6 /* Macaw.framework */; }; 57FCD27C1D76EA4600CC0FB6 /* MacawTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57FCD27B1D76EA4600CC0FB6 /* MacawTests.swift */; }; + 639256782046F2AD0042CDDA /* Group.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1381E3B393900D1CB28 /* Group.swift */; }; + 639256792046F2AD0042CDDA /* Locus+ToPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = C43B06501F9866E400787A35 /* Locus+ToPath.swift */; }; + 6392567A2046F2AD0042CDDA /* TextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1441E3B393900D1CB28 /* TextRenderer.swift */; }; + 6392567B2046F2AD0042CDDA /* CGFloat+Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E14D1E3B393900D1CB28 /* CGFloat+Double.swift */; }; + 6392567C2046F2AD0042CDDA /* CGExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E91E3B393900D1CB28 /* CGExtensions.swift */; }; + 6392567D2046F2AD0042CDDA /* GaussianBlur.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11B1E3B393900D1CB28 /* GaussianBlur.swift */; }; + 6392567E2046F2AD0042CDDA /* RoundRect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1341E3B393900D1CB28 /* RoundRect.swift */; }; + 6392567F2046F2AD0042CDDA /* UIImage2Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57900FF81EA0DEBF00809FFB /* UIImage2Image.swift */; }; + 639256802046F2AD0042CDDA /* SVGParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1471E3B393900D1CB28 /* SVGParser.swift */; }; + 639256812046F2AD0042CDDA /* SWXMLHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572CEFC61E2CED4B008C7C83 /* SWXMLHash.swift */; }; + 639256822046F2AD0042CDDA /* NodesMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1511E3B393900D1CB28 /* NodesMap.swift */; }; + 639256832046F2AD0042CDDA /* RenderUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1421E3B393900D1CB28 /* RenderUtils.swift */; }; + 639256842046F2AD0042CDDA /* FuncBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F11E3B393900D1CB28 /* FuncBounds.swift */; }; + 639256852046F2AD0042CDDA /* MView_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD461F45C28700966E06 /* MView_iOS.swift */; }; + 639256862046F2AD0042CDDA /* DoubleInterpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0EC1E3B393900D1CB28 /* DoubleInterpolation.swift */; }; + 639256872046F2AD0042CDDA /* PathSegmentType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12F1E3B393900D1CB28 /* PathSegmentType.swift */; }; + 639256882046F2AD0042CDDA /* AnimatableVariable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E21E3B393900D1CB28 /* AnimatableVariable.swift */; }; + 639256892046F2AD0042CDDA /* TimingFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FD1E3B393900D1CB28 /* TimingFunction.swift */; }; + 6392568A2046F2AD0042CDDA /* AnimationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F71E3B393900D1CB28 /* AnimationCache.swift */; }; + 6392568B2046F2AD0042CDDA /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1361E3B393900D1CB28 /* Transform.swift */; }; + 6392568C2046F2AD0042CDDA /* Graphics_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD4A1F45C28F00966E06 /* Graphics_macOS.swift */; }; + 6392568D2046F2AD0042CDDA /* ShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1431E3B393900D1CB28 /* ShapeRenderer.swift */; }; + 6392568E2046F2AD0042CDDA /* LinearGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11D1E3B393900D1CB28 /* LinearGradient.swift */; }; + 6392568F2046F2AD0042CDDA /* MDisplayLink_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD4B1F45C28F00966E06 /* MDisplayLink_macOS.swift */; }; + 639256902046F2AD0042CDDA /* GroupDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1071E3B393900D1CB28 /* GroupDisposable.swift */; }; + 639256912046F2AD0042CDDA /* Stroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1221E3B393900D1CB28 /* Stroke.swift */; }; + 639256922046F2AD0042CDDA /* TapEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E10E1E3B393900D1CB28 /* TapEvent.swift */; }; + 639256932046F2AD0042CDDA /* LineCap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11E1E3B393900D1CB28 /* LineCap.swift */; }; + 639256942046F2AD0042CDDA /* SVGView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E14A1E3B393900D1CB28 /* SVGView.swift */; }; + 639256952046F2AD0042CDDA /* Arc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1241E3B393900D1CB28 /* Arc.swift */; }; + 639256962046F2AD0042CDDA /* MacawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1501E3B393900D1CB28 /* MacawView.swift */; }; + 639256972046F2AD0042CDDA /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1391E3B393900D1CB28 /* Image.swift */; }; + 639256982046F2AD0042CDDA /* TransformGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FE1E3B393900D1CB28 /* TransformGenerator.swift */; }; + 639256992046F2AD0042CDDA /* AnimationImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E41E3B393900D1CB28 /* AnimationImpl.swift */; }; + 6392569A2046F2AD0042CDDA /* AnimOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0EB1E3B393900D1CB28 /* AnimOperators.swift */; }; + 6392569B2046F2AD0042CDDA /* Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1251E3B393900D1CB28 /* Circle.swift */; }; + 6392569C2046F2AD0042CDDA /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1151E3B393900D1CB28 /* Color.swift */; }; + 6392569D2046F2AD0042CDDA /* PathSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12E1E3B393900D1CB28 /* PathSegment.swift */; }; + 6392569E2046F2AD0042CDDA /* ImageRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E13F1E3B393900D1CB28 /* ImageRenderer.swift */; }; + 6392569F2046F2AD0042CDDA /* PathFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F31E3B393900D1CB28 /* PathFunctions.swift */; }; + 639256A02046F2AD0042CDDA /* SVGSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4820B171F458D0E008CE0FF /* SVGSerializer.swift */; }; + 639256A12046F2AD0042CDDA /* MorphingAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1021E3B393900D1CB28 /* MorphingAnimation.swift */; }; + 639256A22046F2AD0042CDDA /* ShapeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A27BD01E44C5460057BD3A /* ShapeAnimation.swift */; }; + 639256A32046F2AD0042CDDA /* TransformInterpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F01E3B393900D1CB28 /* TransformInterpolation.swift */; }; + 639256A42046F2AD0042CDDA /* ShapeAnimationGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A27BD21E44C5570057BD3A /* ShapeAnimationGenerator.swift */; }; + 639256A52046F2AD0042CDDA /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E61E3B393900D1CB28 /* AnimationUtils.swift */; }; + 639256A62046F2AD0042CDDA /* Polygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1311E3B393900D1CB28 /* Polygon.swift */; }; + 639256A72046F2AD0042CDDA /* Baseline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1141E3B393900D1CB28 /* Baseline.swift */; }; + 639256A82046F2AD0042CDDA /* AspectRatio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1131E3B393900D1CB28 /* AspectRatio.swift */; }; + 639256A92046F2AD0042CDDA /* TransformAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1041E3B393900D1CB28 /* TransformAnimation.swift */; }; + 639256AA2046F2AD0042CDDA /* CombineAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1001E3B393900D1CB28 /* CombineAnimation.swift */; }; + 639256AB2046F2AD0042CDDA /* TransformHashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FA1E3B393900D1CB28 /* TransformHashable.swift */; }; + 639256AC2046F2AD0042CDDA /* MoveTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12B1E3B393900D1CB28 /* MoveTo.swift */; }; + 639256AD2046F2AD0042CDDA /* NodeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1401E3B393900D1CB28 /* NodeRenderer.swift */; }; + 639256AE2046F2AD0042CDDA /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11A1E3B393900D1CB28 /* Font.swift */; }; + 639256AF2046F2AD0042CDDA /* Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E31E3B393900D1CB28 /* Animation.swift */; }; + 639256B02046F2AD0042CDDA /* SVGParserError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1481E3B393900D1CB28 /* SVGParserError.swift */; }; + 639256B12046F2AD0042CDDA /* Drawable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1161E3B393900D1CB28 /* Drawable.swift */; }; + 639256B22046F2AD0042CDDA /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1061E3B393900D1CB28 /* Disposable.swift */; }; + 639256B32046F2AD0042CDDA /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12C1E3B393900D1CB28 /* Path.swift */; }; + 639256B42046F2AD0042CDDA /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1291E3B393900D1CB28 /* Line.swift */; }; + 639256B52046F2AD0042CDDA /* PathBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F21E3B393900D1CB28 /* PathBounds.swift */; }; + 639256B62046F2AD0042CDDA /* AnimationProducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E51E3B393900D1CB28 /* AnimationProducer.swift */; }; + 639256B72046F2AD0042CDDA /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1191E3B393900D1CB28 /* Fill.swift */; }; + 639256B82046F2AD0042CDDA /* ShapeInterpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A27BD41E44C5840057BD3A /* ShapeInterpolation.swift */; }; + 639256B92046F2AD0042CDDA /* Graphics_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD451F45C28700966E06 /* Graphics_iOS.swift */; }; + 639256BA2046F2AD0042CDDA /* LineJoin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11F1E3B393900D1CB28 /* LineJoin.swift */; }; + 639256BB2046F2AD0042CDDA /* RadialGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1201E3B393900D1CB28 /* RadialGradient.swift */; }; + 639256BC2046F2AD0042CDDA /* MacawView+PDF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57614BD91F8739EE00875933 /* MacawView+PDF.swift */; }; + 639256BD2046F2AD0042CDDA /* Stop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1211E3B393900D1CB28 /* Stop.swift */; }; + 639256BE2046F2AD0042CDDA /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E13C1E3B393900D1CB28 /* Text.swift */; }; + 639256BF2046F2AD0042CDDA /* MDisplayLink_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F1087B1F53CA7E00DC365B /* MDisplayLink_iOS.swift */; }; + 639256C02046F2AD0042CDDA /* RenderContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1411E3B393900D1CB28 /* RenderContext.swift */; }; + 639256C12046F2AD0042CDDA /* Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1351E3B393900D1CB28 /* Size.swift */; }; + 639256C22046F2AD0042CDDA /* Polyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1321E3B393900D1CB28 /* Polyline.swift */; }; + 639256C32046F2AD0042CDDA /* ContentsAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1011E3B393900D1CB28 /* ContentsAnimation.swift */; }; + 639256C42046F2AD0042CDDA /* TouchEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5713C4E11E51EC8F00BBA4D9 /* TouchEvent.swift */; }; + 639256C52046F2AD0042CDDA /* MBezierPath+Extension_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD511F45C2A400966E06 /* MBezierPath+Extension_macOS.swift */; }; + 639256C62046F2AD0042CDDA /* MView_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD4C1F45C28F00966E06 /* MView_macOS.swift */; }; + 639256C72046F2AD0042CDDA /* Easing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0E71E3B393900D1CB28 /* Easing.swift */; }; + 639256C82046F2AD0042CDDA /* Point.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1301E3B393900D1CB28 /* Point.swift */; }; + 639256C92046F2AD0042CDDA /* OpacityGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FC1E3B393900D1CB28 /* OpacityGenerator.swift */; }; + 639256CA2046F2AD0042CDDA /* Shape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E13B1E3B393900D1CB28 /* Shape.swift */; }; + 639256CB2046F2AD0042CDDA /* Ellipse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1261E3B393900D1CB28 /* Ellipse.swift */; }; + 639256CC2046F2AD0042CDDA /* Locus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12A1E3B393900D1CB28 /* Locus.swift */; }; + 639256CD2046F2AD0042CDDA /* SceneUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57AF39881E66E06200F0BFE2 /* SceneUtils.swift */; }; + 639256CE2046F2AD0042CDDA /* NodeHashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F91E3B393900D1CB28 /* NodeHashable.swift */; }; + 639256CF2046F2AD0042CDDA /* GeomUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1271E3B393900D1CB28 /* GeomUtils.swift */; }; + 639256D02046F2AD0042CDDA /* CAAnimationClosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E14C1E3B393900D1CB28 /* CAAnimationClosure.swift */; }; + 639256D12046F2AD0042CDDA /* DropShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1171E3B393900D1CB28 /* DropShadow.swift */; }; + 639256D22046F2AD0042CDDA /* Common_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD431F45C28200966E06 /* Common_iOS.swift */; }; + 639256D32046F2AD0042CDDA /* Common_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD491F45C28F00966E06 /* Common_macOS.swift */; }; + 639256D42046F2AD0042CDDA /* MDisplayLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F108791F53C92000DC365B /* MDisplayLink.swift */; }; + 639256D52046F2AD0042CDDA /* AnimationRestorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0F81E3B393900D1CB28 /* AnimationRestorer.swift */; }; + 639256D62046F2AD0042CDDA /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E10A1E3B393900D1CB28 /* Event.swift */; }; + 639256D72046F2AD0042CDDA /* Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E11C1E3B393900D1CB28 /* Gradient.swift */; }; + 639256D82046F2AD0042CDDA /* Interpolable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0EE1E3B393900D1CB28 /* Interpolable.swift */; }; + 639256D92046F2AD0042CDDA /* Align.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1121E3B393900D1CB28 /* Align.swift */; }; + 639256DA2046F2AD0042CDDA /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1081E3B393900D1CB28 /* Variable.swift */; }; + 639256DB2046F2AD0042CDDA /* OpacityAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1031E3B393900D1CB28 /* OpacityAnimation.swift */; }; + 639256DC2046F2AD0042CDDA /* Touchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F108731F502A3600DC365B /* Touchable.swift */; }; + 639256DD2046F2AD0042CDDA /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E13A1E3B393900D1CB28 /* Node.swift */; }; + 639256DE2046F2AD0042CDDA /* PanEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E10B1E3B393900D1CB28 /* PanEvent.swift */; }; + 639256DF2046F2AD0042CDDA /* RotateEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E10D1E3B393900D1CB28 /* RotateEvent.swift */; }; + 639256E02046F2AD0042CDDA /* Insets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1281E3B393900D1CB28 /* Insets.swift */; }; + 639256E12046F2AD0042CDDA /* Rect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1331E3B393900D1CB28 /* Rect.swift */; }; + 639256E22046F2AD0042CDDA /* PathBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E12D1E3B393900D1CB28 /* PathBuilder.swift */; }; + 639256E32046F2AD0042CDDA /* PinchEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E10C1E3B393900D1CB28 /* PinchEvent.swift */; }; + 639256E42046F2AD0042CDDA /* ContentsInterpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A27BCE1E44C4EC0057BD3A /* ContentsInterpolation.swift */; }; + 639256E52046F2AD0042CDDA /* GroupRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E13E1E3B393900D1CB28 /* GroupRenderer.swift */; }; + 639256E62046F2AD0042CDDA /* SVGParserRegexHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1491E3B393900D1CB28 /* SVGParserRegexHelper.swift */; }; + 639256E72046F2AD0042CDDA /* Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1181E3B393900D1CB28 /* Effect.swift */; }; + 639256E82046F2AD0042CDDA /* NSTimer+Closure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E14E1E3B393900D1CB28 /* NSTimer+Closure.swift */; }; + 639256E92046F2AD0042CDDA /* SWXMLHash+TypeConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572CEFC51E2CED4B008C7C83 /* SWXMLHash+TypeConversion.swift */; }; + 639256EA2046F2AD0042CDDA /* AnimationSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FF1E3B393900D1CB28 /* AnimationSequence.swift */; }; + 639256EB2046F2AD0042CDDA /* MorphingGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0FB1E3B393900D1CB28 /* MorphingGenerator.swift */; }; + 639256EC2046F2AD0042CDDA /* SVGConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1461E3B393900D1CB28 /* SVGConstants.swift */; }; + 639256ED2046F2AD0042CDDA /* ShapeLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E1521E3B393900D1CB28 /* ShapeLayer.swift */; }; + 639256EE2046F2AD0042CDDA /* LocusInterpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E5E0EF1E3B393900D1CB28 /* LocusInterpolation.swift */; }; A718CD441F45C28200966E06 /* Common_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD431F45C28200966E06 /* Common_iOS.swift */; }; A718CD471F45C28700966E06 /* Graphics_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD451F45C28700966E06 /* Graphics_iOS.swift */; }; A718CD481F45C28700966E06 /* MView_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD461F45C28700966E06 /* MView_iOS.swift */; }; @@ -316,6 +435,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 639256F22046F2AD0042CDDA /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -452,6 +580,10 @@ 57FCD2761D76EA4600CC0FB6 /* MacawTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MacawTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 57FCD27B1D76EA4600CC0FB6 /* MacawTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacawTests.swift; sourceTree = ""; }; 57FCD27D1D76EA4600CC0FB6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63547E29206174450041F0B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Source/Info.plist; sourceTree = ""; }; + 639256F72046F2AD0042CDDA /* MacawtvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MacawtvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 639257002046F3110042CDDA /* Testoo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Testoo.h; sourceTree = ""; }; + 639257012046F3110042CDDA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A718CD431F45C28200966E06 /* Common_iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Common_iOS.swift; path = Source/platform/iOS/Common_iOS.swift; sourceTree = SOURCE_ROOT; }; A718CD451F45C28700966E06 /* Graphics_iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Graphics_iOS.swift; path = Source/platform/iOS/Graphics_iOS.swift; sourceTree = SOURCE_ROOT; }; A718CD461F45C28700966E06 /* MView_iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MView_iOS.swift; path = Source/platform/iOS/MView_iOS.swift; sourceTree = SOURCE_ROOT; }; @@ -507,6 +639,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 639256EF2046F2AD0042CDDA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -828,8 +967,10 @@ 57FCD2621D76EA4600CC0FB6 = { isa = PBXGroup; children = ( + 63547E29206174450041F0B3 /* Info.plist */, 57FCD26E1D76EA4600CC0FB6 /* Macaw */, 57FCD27A1D76EA4600CC0FB6 /* MacawTests */, + 639256FF2046F3110042CDDA /* Testoo */, 57FCD26D1D76EA4600CC0FB6 /* Products */, ); sourceTree = ""; @@ -840,6 +981,7 @@ 57FCD26C1D76EA4600CC0FB6 /* Macaw.framework */, 57FCD2761D76EA4600CC0FB6 /* MacawTests.xctest */, 57614B791F83D15600875933 /* MacawOSX.framework */, + 639256F72046F2AD0042CDDA /* MacawtvOS.framework */, ); name = Products; sourceTree = ""; @@ -869,6 +1011,15 @@ path = MacawTests; sourceTree = ""; }; + 639256FF2046F3110042CDDA /* Testoo */ = { + isa = PBXGroup; + children = ( + 639257002046F3110042CDDA /* Testoo.h */, + 639257012046F3110042CDDA /* Info.plist */, + ); + path = Testoo; + sourceTree = ""; + }; A718CD2C1F45BC5300966E06 /* Platform */ = { isa = PBXGroup; children = ( @@ -936,6 +1087,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 639256F02046F2AD0042CDDA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -997,6 +1155,26 @@ productReference = 57FCD2761D76EA4600CC0FB6 /* MacawTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 639256762046F2AD0042CDDA /* MacawtvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 639256F42046F2AD0042CDDA /* Build configuration list for PBXNativeTarget "MacawtvOS" */; + buildPhases = ( + 639256772046F2AD0042CDDA /* Sources */, + 639256EF2046F2AD0042CDDA /* Frameworks */, + 639256F02046F2AD0042CDDA /* Headers */, + 639256F12046F2AD0042CDDA /* Resources */, + 639256F22046F2AD0042CDDA /* CopyFiles */, + 639256F32046F2AD0042CDDA /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MacawtvOS; + productName = Macaw; + productReference = 639256F72046F2AD0042CDDA /* MacawtvOS.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1034,6 +1212,7 @@ 57FCD26B1D76EA4600CC0FB6 /* Macaw */, 57FCD2751D76EA4600CC0FB6 /* MacawTests */, 57614AFB1F83D15600875933 /* MacawOSX */, + 639256762046F2AD0042CDDA /* MacawtvOS */, ); }; /* End PBXProject section */ @@ -1090,9 +1269,29 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 639256F12046F2AD0042CDDA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 639256F32046F2AD0042CDDA /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint autocorrect --format\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; 665742FC1F988D93006612C6 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1392,6 +1591,132 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 639256772046F2AD0042CDDA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 639256782046F2AD0042CDDA /* Group.swift in Sources */, + 639256792046F2AD0042CDDA /* Locus+ToPath.swift in Sources */, + 6392567A2046F2AD0042CDDA /* TextRenderer.swift in Sources */, + 6392567B2046F2AD0042CDDA /* CGFloat+Double.swift in Sources */, + 6392567C2046F2AD0042CDDA /* CGExtensions.swift in Sources */, + 6392567D2046F2AD0042CDDA /* GaussianBlur.swift in Sources */, + 6392567E2046F2AD0042CDDA /* RoundRect.swift in Sources */, + 6392567F2046F2AD0042CDDA /* UIImage2Image.swift in Sources */, + 639256802046F2AD0042CDDA /* SVGParser.swift in Sources */, + 639256812046F2AD0042CDDA /* SWXMLHash.swift in Sources */, + 639256822046F2AD0042CDDA /* NodesMap.swift in Sources */, + 639256832046F2AD0042CDDA /* RenderUtils.swift in Sources */, + 639256842046F2AD0042CDDA /* FuncBounds.swift in Sources */, + 639256852046F2AD0042CDDA /* MView_iOS.swift in Sources */, + 639256862046F2AD0042CDDA /* DoubleInterpolation.swift in Sources */, + 639256872046F2AD0042CDDA /* PathSegmentType.swift in Sources */, + 639256882046F2AD0042CDDA /* AnimatableVariable.swift in Sources */, + 639256892046F2AD0042CDDA /* TimingFunction.swift in Sources */, + 6392568A2046F2AD0042CDDA /* AnimationCache.swift in Sources */, + 6392568B2046F2AD0042CDDA /* Transform.swift in Sources */, + 6392568C2046F2AD0042CDDA /* Graphics_macOS.swift in Sources */, + 6392568D2046F2AD0042CDDA /* ShapeRenderer.swift in Sources */, + 6392568E2046F2AD0042CDDA /* LinearGradient.swift in Sources */, + 6392568F2046F2AD0042CDDA /* MDisplayLink_macOS.swift in Sources */, + 639256902046F2AD0042CDDA /* GroupDisposable.swift in Sources */, + 639256912046F2AD0042CDDA /* Stroke.swift in Sources */, + 639256922046F2AD0042CDDA /* TapEvent.swift in Sources */, + 639256932046F2AD0042CDDA /* LineCap.swift in Sources */, + 639256942046F2AD0042CDDA /* SVGView.swift in Sources */, + 639256952046F2AD0042CDDA /* Arc.swift in Sources */, + 639256962046F2AD0042CDDA /* MacawView.swift in Sources */, + 639256972046F2AD0042CDDA /* Image.swift in Sources */, + 639256982046F2AD0042CDDA /* TransformGenerator.swift in Sources */, + 639256992046F2AD0042CDDA /* AnimationImpl.swift in Sources */, + 6392569A2046F2AD0042CDDA /* AnimOperators.swift in Sources */, + 6392569B2046F2AD0042CDDA /* Circle.swift in Sources */, + 6392569C2046F2AD0042CDDA /* Color.swift in Sources */, + 6392569D2046F2AD0042CDDA /* PathSegment.swift in Sources */, + 6392569E2046F2AD0042CDDA /* ImageRenderer.swift in Sources */, + 6392569F2046F2AD0042CDDA /* PathFunctions.swift in Sources */, + 639256A02046F2AD0042CDDA /* SVGSerializer.swift in Sources */, + 639256A12046F2AD0042CDDA /* MorphingAnimation.swift in Sources */, + 639256A22046F2AD0042CDDA /* ShapeAnimation.swift in Sources */, + 639256A32046F2AD0042CDDA /* TransformInterpolation.swift in Sources */, + 639256A42046F2AD0042CDDA /* ShapeAnimationGenerator.swift in Sources */, + 639256A52046F2AD0042CDDA /* AnimationUtils.swift in Sources */, + 639256A62046F2AD0042CDDA /* Polygon.swift in Sources */, + 639256A72046F2AD0042CDDA /* Baseline.swift in Sources */, + 639256A82046F2AD0042CDDA /* AspectRatio.swift in Sources */, + 639256A92046F2AD0042CDDA /* TransformAnimation.swift in Sources */, + 639256AA2046F2AD0042CDDA /* CombineAnimation.swift in Sources */, + 639256AB2046F2AD0042CDDA /* TransformHashable.swift in Sources */, + 639256AC2046F2AD0042CDDA /* MoveTo.swift in Sources */, + 639256AD2046F2AD0042CDDA /* NodeRenderer.swift in Sources */, + 639256AE2046F2AD0042CDDA /* Font.swift in Sources */, + 639256AF2046F2AD0042CDDA /* Animation.swift in Sources */, + 639256B02046F2AD0042CDDA /* SVGParserError.swift in Sources */, + 639256B12046F2AD0042CDDA /* Drawable.swift in Sources */, + 639256B22046F2AD0042CDDA /* Disposable.swift in Sources */, + 639256B32046F2AD0042CDDA /* Path.swift in Sources */, + 639256B42046F2AD0042CDDA /* Line.swift in Sources */, + 639256B52046F2AD0042CDDA /* PathBounds.swift in Sources */, + 639256B62046F2AD0042CDDA /* AnimationProducer.swift in Sources */, + 639256B72046F2AD0042CDDA /* Fill.swift in Sources */, + 639256B82046F2AD0042CDDA /* ShapeInterpolation.swift in Sources */, + 639256B92046F2AD0042CDDA /* Graphics_iOS.swift in Sources */, + 639256BA2046F2AD0042CDDA /* LineJoin.swift in Sources */, + 639256BB2046F2AD0042CDDA /* RadialGradient.swift in Sources */, + 639256BC2046F2AD0042CDDA /* MacawView+PDF.swift in Sources */, + 639256BD2046F2AD0042CDDA /* Stop.swift in Sources */, + 639256BE2046F2AD0042CDDA /* Text.swift in Sources */, + 639256BF2046F2AD0042CDDA /* MDisplayLink_iOS.swift in Sources */, + 639256C02046F2AD0042CDDA /* RenderContext.swift in Sources */, + 639256C12046F2AD0042CDDA /* Size.swift in Sources */, + 639256C22046F2AD0042CDDA /* Polyline.swift in Sources */, + 639256C32046F2AD0042CDDA /* ContentsAnimation.swift in Sources */, + 639256C42046F2AD0042CDDA /* TouchEvent.swift in Sources */, + 639256C52046F2AD0042CDDA /* MBezierPath+Extension_macOS.swift in Sources */, + 639256C62046F2AD0042CDDA /* MView_macOS.swift in Sources */, + 639256C72046F2AD0042CDDA /* Easing.swift in Sources */, + 639256C82046F2AD0042CDDA /* Point.swift in Sources */, + 639256C92046F2AD0042CDDA /* OpacityGenerator.swift in Sources */, + 639256CA2046F2AD0042CDDA /* Shape.swift in Sources */, + 639256CB2046F2AD0042CDDA /* Ellipse.swift in Sources */, + 639256CC2046F2AD0042CDDA /* Locus.swift in Sources */, + 639256CD2046F2AD0042CDDA /* SceneUtils.swift in Sources */, + 639256CE2046F2AD0042CDDA /* NodeHashable.swift in Sources */, + 639256CF2046F2AD0042CDDA /* GeomUtils.swift in Sources */, + 639256D02046F2AD0042CDDA /* CAAnimationClosure.swift in Sources */, + 639256D12046F2AD0042CDDA /* DropShadow.swift in Sources */, + 639256D22046F2AD0042CDDA /* Common_iOS.swift in Sources */, + 639256D32046F2AD0042CDDA /* Common_macOS.swift in Sources */, + 639256D42046F2AD0042CDDA /* MDisplayLink.swift in Sources */, + 639256D52046F2AD0042CDDA /* AnimationRestorer.swift in Sources */, + 639256D62046F2AD0042CDDA /* Event.swift in Sources */, + 639256D72046F2AD0042CDDA /* Gradient.swift in Sources */, + 639256D82046F2AD0042CDDA /* Interpolable.swift in Sources */, + 639256D92046F2AD0042CDDA /* Align.swift in Sources */, + 639256DA2046F2AD0042CDDA /* Variable.swift in Sources */, + 639256DB2046F2AD0042CDDA /* OpacityAnimation.swift in Sources */, + 639256DC2046F2AD0042CDDA /* Touchable.swift in Sources */, + 639256DD2046F2AD0042CDDA /* Node.swift in Sources */, + 639256DE2046F2AD0042CDDA /* PanEvent.swift in Sources */, + 639256DF2046F2AD0042CDDA /* RotateEvent.swift in Sources */, + 639256E02046F2AD0042CDDA /* Insets.swift in Sources */, + 639256E12046F2AD0042CDDA /* Rect.swift in Sources */, + 639256E22046F2AD0042CDDA /* PathBuilder.swift in Sources */, + 639256E32046F2AD0042CDDA /* PinchEvent.swift in Sources */, + 639256E42046F2AD0042CDDA /* ContentsInterpolation.swift in Sources */, + 639256E52046F2AD0042CDDA /* GroupRenderer.swift in Sources */, + 639256E62046F2AD0042CDDA /* SVGParserRegexHelper.swift in Sources */, + 639256E72046F2AD0042CDDA /* Effect.swift in Sources */, + 639256E82046F2AD0042CDDA /* NSTimer+Closure.swift in Sources */, + 639256E92046F2AD0042CDDA /* SWXMLHash+TypeConversion.swift in Sources */, + 639256EA2046F2AD0042CDDA /* AnimationSequence.swift in Sources */, + 639256EB2046F2AD0042CDDA /* MorphingGenerator.swift in Sources */, + 639256EC2046F2AD0042CDDA /* SVGConstants.swift in Sources */, + 639256ED2046F2AD0042CDDA /* ShapeLayer.swift in Sources */, + 639256EE2046F2AD0042CDDA /* LocusInterpolation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1673,6 +1998,58 @@ }; name = Release; }; + 639256F52046F2AD0042CDDA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ""; + OTHER_SWIFT_FLAGS = "-D CARTHAGE"; + PRODUCT_BUNDLE_IDENTIFIER = com.exyte.Macaw; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + VALID_ARCHS = "arm64 armv7"; + }; + name = Debug; + }; + 639256F62046F2AD0042CDDA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ""; + OTHER_SWIFT_FLAGS = "-D CARTHAGE"; + PRODUCT_BUNDLE_IDENTIFIER = com.exyte.Macaw; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + VALID_ARCHS = "arm64 armv7"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1712,6 +2089,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 639256F42046F2AD0042CDDA /* Build configuration list for PBXNativeTarget "MacawtvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 639256F52046F2AD0042CDDA /* Debug */, + 639256F62046F2AD0042CDDA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 57FCD2631D76EA4600CC0FB6 /* Project object */; diff --git a/MacawTests/Animation/CombineAnimationTests.swift b/MacawTests/Animation/CombineAnimationTests.swift index 53dcad7c..832df21b 100644 --- a/MacawTests/Animation/CombineAnimationTests.swift +++ b/MacawTests/Animation/CombineAnimationTests.swift @@ -6,7 +6,7 @@ // Copyright © 2017 Exyte. All rights reserved. // -#if os(iOS) +#if os(iOS) || os(tvOS) import XCTest @testable import Macaw diff --git a/MacawTests/Animation/DelayedAnimationTests.swift b/MacawTests/Animation/DelayedAnimationTests.swift index 7c6b1b37..48a90d86 100644 --- a/MacawTests/Animation/DelayedAnimationTests.swift +++ b/MacawTests/Animation/DelayedAnimationTests.swift @@ -6,7 +6,7 @@ // Copyright © 2017 Exyte. All rights reserved. // -#if os(iOS) +#if os(iOS) || os(tvOS) import XCTest @testable import Macaw diff --git a/MacawTests/Animation/SequenceAnimationTests.swift b/MacawTests/Animation/SequenceAnimationTests.swift index d04646c4..9505695a 100644 --- a/MacawTests/Animation/SequenceAnimationTests.swift +++ b/MacawTests/Animation/SequenceAnimationTests.swift @@ -6,7 +6,7 @@ // Copyright © 2017 Exyte. All rights reserved. // -#if os(iOS) +#if os(iOS) || os(tvOS) import XCTest @testable import Macaw diff --git a/MacawTests/Bounds/ImageBoundsTests.swift b/MacawTests/Bounds/ImageBoundsTests.swift index c617edb1..b23e57df 100644 --- a/MacawTests/Bounds/ImageBoundsTests.swift +++ b/MacawTests/Bounds/ImageBoundsTests.swift @@ -6,7 +6,7 @@ // Copyright © 2017 Exyte. All rights reserved. // -#if os(iOS) +#if os(iOS) || os(tvOS) import XCTest @testable import Macaw diff --git a/MacawTests/Bounds/NodeBoundsTests.swift b/MacawTests/Bounds/NodeBoundsTests.swift index 7a0ee0c2..230b0b4f 100644 --- a/MacawTests/Bounds/NodeBoundsTests.swift +++ b/MacawTests/Bounds/NodeBoundsTests.swift @@ -6,7 +6,7 @@ // Copyright © 2017 Exyte. All rights reserved. // -#if os(iOS) +#if os(iOS) || os(tvOS) import XCTest @testable import Macaw diff --git a/Source/animation/AnimationProducer.swift b/Source/animation/AnimationProducer.swift index b1482536..6d3cfef0 100644 --- a/Source/animation/AnimationProducer.swift +++ b/Source/animation/AnimationProducer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/layer_animation/CGExtensions.swift b/Source/animation/layer_animation/CGExtensions.swift index 7a936fc2..44eb8995 100644 --- a/Source/animation/layer_animation/CGExtensions.swift +++ b/Source/animation/layer_animation/CGExtensions.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/animation/types/animation_generators/Cache/AnimationCache.swift b/Source/animation/types/animation_generators/Cache/AnimationCache.swift index c6372716..0f32b3d6 100644 --- a/Source/animation/types/animation_generators/Cache/AnimationCache.swift +++ b/Source/animation/types/animation_generators/Cache/AnimationCache.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/types/animation_generators/MorphingGenerator.swift b/Source/animation/types/animation_generators/MorphingGenerator.swift index d082d410..eaa37af0 100644 --- a/Source/animation/types/animation_generators/MorphingGenerator.swift +++ b/Source/animation/types/animation_generators/MorphingGenerator.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/types/animation_generators/OpacityGenerator.swift b/Source/animation/types/animation_generators/OpacityGenerator.swift index e9af46a2..5f6cfc5b 100644 --- a/Source/animation/types/animation_generators/OpacityGenerator.swift +++ b/Source/animation/types/animation_generators/OpacityGenerator.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/types/animation_generators/ShapeAnimationGenerator.swift b/Source/animation/types/animation_generators/ShapeAnimationGenerator.swift index a59d7536..d22d2cf3 100644 --- a/Source/animation/types/animation_generators/ShapeAnimationGenerator.swift +++ b/Source/animation/types/animation_generators/ShapeAnimationGenerator.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/types/animation_generators/TimingFunction.swift b/Source/animation/types/animation_generators/TimingFunction.swift index 4f10ee79..71945b47 100644 --- a/Source/animation/types/animation_generators/TimingFunction.swift +++ b/Source/animation/types/animation_generators/TimingFunction.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/animation/types/animation_generators/TransformGenerator.swift b/Source/animation/types/animation_generators/TransformGenerator.swift index 5b6e7676..90b99a7a 100644 --- a/Source/animation/types/animation_generators/TransformGenerator.swift +++ b/Source/animation/types/animation_generators/TransformGenerator.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/model/draw/RadialGradient.swift b/Source/model/draw/RadialGradient.swift index 630f96e7..1564b120 100644 --- a/Source/model/draw/RadialGradient.swift +++ b/Source/model/draw/RadialGradient.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/model/scene/Image.swift b/Source/model/scene/Image.swift index ee1abeae..f62268fa 100644 --- a/Source/model/scene/Image.swift +++ b/Source/model/scene/Image.swift @@ -4,7 +4,7 @@ import Foundation import AppKit #endif -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif @@ -159,7 +159,7 @@ open class Image: Node { } // General case - #if os(iOS) + #if os(iOS) || os(tvOS) return MImage(named: src) #elseif os(OSX) return MImage(named: NSImage.Name(rawValue: src)) diff --git a/Source/model/scene/Text.swift b/Source/model/scene/Text.swift index 47e39aa4..cd449c6f 100644 --- a/Source/model/scene/Text.swift +++ b/Source/model/scene/Text.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/platform/iOS/Common_iOS.swift b/Source/platform/iOS/Common_iOS.swift index a37a7560..6f400943 100644 --- a/Source/platform/iOS/Common_iOS.swift +++ b/Source/platform/iOS/Common_iOS.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit public typealias MRectCorner = UIRectCorner @@ -23,8 +23,12 @@ import Foundation public typealias MGestureRecognizerDelegate = UIGestureRecognizerDelegate public typealias MTapGestureRecognizer = UITapGestureRecognizer public typealias MPanGestureRecognizer = UIPanGestureRecognizer + + #if os(iOS) public typealias MPinchGestureRecognizer = UIPinchGestureRecognizer public typealias MRotationGestureRecognizer = UIRotationGestureRecognizer + #endif + public typealias MScreen = UIScreen public typealias MViewContentMode = UIViewContentMode @@ -44,6 +48,7 @@ import Foundation } } + #if os(iOS) extension MRotationGestureRecognizer { final var mRotation: CGFloat { get { @@ -71,10 +76,15 @@ import Foundation return super.location(ofTouch: touch, in: inView) } } + #endif extension MFont { class var mSystemFontSize: CGFloat { - return UIFont.systemFontSize + #if os(iOS) + return UIFont.systemFontSize + #elseif os(tvOS) + return 12.0 + #endif } } diff --git a/Source/platform/iOS/Graphics_iOS.swift b/Source/platform/iOS/Graphics_iOS.swift index ab95cc8a..98460026 100644 --- a/Source/platform/iOS/Graphics_iOS.swift +++ b/Source/platform/iOS/Graphics_iOS.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit func MGraphicsGetCurrentContext() -> CGContext? { diff --git a/Source/platform/iOS/MDisplayLink_iOS.swift b/Source/platform/iOS/MDisplayLink_iOS.swift index dee19689..61c97c0e 100644 --- a/Source/platform/iOS/MDisplayLink_iOS.swift +++ b/Source/platform/iOS/MDisplayLink_iOS.swift @@ -6,7 +6,7 @@ // // -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit class MDisplayLink: MDisplayLinkProtocol { @@ -23,7 +23,11 @@ self.onUpdate = onUpdate displayLink = CADisplayLink(target: self, selector: #selector(updateHandler)) - displayLink?.frameInterval = 1 + #if os(iOS) + displayLink?.frameInterval = 1 + #elseif os(tvOS) + displayLink?.preferredFramesPerSecond = 1 + #endif displayLink?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) } diff --git a/Source/platform/iOS/MView_iOS.swift b/Source/platform/iOS/MView_iOS.swift index 67bbc253..5a41fde3 100644 --- a/Source/platform/iOS/MView_iOS.swift +++ b/Source/platform/iOS/MView_iOS.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit open class MView: UIView, Touchable { diff --git a/Source/platform/macOS/Common_macOS.swift b/Source/platform/macOS/Common_macOS.swift index 20e31079..536aa9b7 100644 --- a/Source/platform/macOS/Common_macOS.swift +++ b/Source/platform/macOS/Common_macOS.swift @@ -123,7 +123,7 @@ import Foundation func MMainScreen() -> MScreen? { return MScreen.main } - + extension MBezierPath { func apply(_ transform: CGAffineTransform) { let affineTransform = AffineTransform( @@ -134,7 +134,7 @@ import Foundation tX: transform.tx, tY: transform.ty ) - + self.transform(using: affineTransform) } } diff --git a/Source/platform/macOS/MDisplayLink_macOS.swift b/Source/platform/macOS/MDisplayLink_macOS.swift index 3a2a8c69..138546c7 100644 --- a/Source/platform/macOS/MDisplayLink_macOS.swift +++ b/Source/platform/macOS/MDisplayLink_macOS.swift @@ -28,7 +28,7 @@ import Foundation return } - CVDisplayLinkSetOutputCallback(displayLink!, { (_, _, _, _, _, userData) -> CVReturn in + CVDisplayLinkSetOutputCallback(displayLink!, { _, _, _, _, _, userData -> CVReturn in let `self` = unsafeBitCast(userData, to: MDisplayLink.self) `self`.onUpdate?() diff --git a/Source/render/GroupRenderer.swift b/Source/render/GroupRenderer.swift index 0f3f52e1..ea10305e 100644 --- a/Source/render/GroupRenderer.swift +++ b/Source/render/GroupRenderer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/render/ImageRenderer.swift b/Source/render/ImageRenderer.swift index 9e07f256..9cd7389b 100644 --- a/Source/render/ImageRenderer.swift +++ b/Source/render/ImageRenderer.swift @@ -4,7 +4,7 @@ import Foundation import AppKit #endif -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif @@ -64,7 +64,7 @@ class ImageRenderer: NodeRenderer { return .none } - #if os(iOS) + #if os(iOS) || os(tvOS) let osImage = MImage(named: image.src) #elseif os(OSX) let osImage = MImage(named: NSImage.Name(rawValue: image.src)) diff --git a/Source/render/NodeRenderer.swift b/Source/render/NodeRenderer.swift index f3c2f976..39dca214 100644 --- a/Source/render/NodeRenderer.swift +++ b/Source/render/NodeRenderer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/render/RenderContext.swift b/Source/render/RenderContext.swift index 23991669..93a897c0 100644 --- a/Source/render/RenderContext.swift +++ b/Source/render/RenderContext.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/render/RenderUtils.swift b/Source/render/RenderUtils.swift index 20471be7..f5ee2eb3 100644 --- a/Source/render/RenderUtils.swift +++ b/Source/render/RenderUtils.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit @@ -423,7 +423,7 @@ class RenderUtils { let maxSize = CGFloat(max(w, h)) let path = MBezierPath(arcCenter: CGPoint.zero, radius: maxSize / 2, startAngle: extent, endAngle: end, clockwise: arcAngle >= 0) - #if os(iOS) + #if os(iOS) || os(tvOS) var transform = CGAffineTransform(translationX: cx, y: cy) transform = transform.rotated(by: CGFloat(rotation)) path.apply(transform.scaledBy(x: CGFloat(w) / maxSize, y: CGFloat(h) / maxSize)) diff --git a/Source/render/ShapeRenderer.swift b/Source/render/ShapeRenderer.swift index c8ac9970..56125999 100644 --- a/Source/render/ShapeRenderer.swift +++ b/Source/render/ShapeRenderer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/render/TextRenderer.swift b/Source/render/TextRenderer.swift index d180eed7..c40de1c5 100644 --- a/Source/render/TextRenderer.swift +++ b/Source/render/TextRenderer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit @@ -160,7 +160,7 @@ class TextRenderer: NodeRenderer { fileprivate func getTextColor(_ fill: Fill) -> MColor { if let color = fill as? Color { - #if os(iOS) + #if os(iOS) || os(tvOS) return MColor(cgColor: RenderUtils.mapColor(color)) #elseif os(OSX) return MColor(cgColor: RenderUtils.mapColor(color)) ?? .black diff --git a/Source/svg/SVGView.swift b/Source/svg/SVGView.swift index d36ace82..e9ca680a 100644 --- a/Source/svg/SVGView.swift +++ b/Source/svg/SVGView.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Source/thirdparty/CGFloat+Double.swift b/Source/thirdparty/CGFloat+Double.swift index 29a35490..9cef258d 100644 --- a/Source/thirdparty/CGFloat+Double.swift +++ b/Source/thirdparty/CGFloat+Double.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/utils/UIImage2Image.swift b/Source/utils/UIImage2Image.swift index ef61baeb..9919860e 100644 --- a/Source/utils/UIImage2Image.swift +++ b/Source/utils/UIImage2Image.swift @@ -8,7 +8,7 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/views/MacawView.swift b/Source/views/MacawView.swift index a56421a4..ab197edd 100644 --- a/Source/views/MacawView.swift +++ b/Source/views/MacawView.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit @@ -126,24 +126,27 @@ open class MacawView: MView, MGestureRecognizerDelegate { let tapRecognizer = MTapGestureRecognizer(target: self, action: #selector(MacawView.handleTap)) let panRecognizer = MPanGestureRecognizer(target: self, action: #selector(MacawView.handlePan)) - let rotationRecognizer = MRotationGestureRecognizer(target: self, action: #selector(MacawView.handleRotation)) - let pinchRecognizer = MPinchGestureRecognizer(target: self, action: #selector(MacawView.handlePinch)) + + #if os(iOS) + let rotationRecognizer = MRotationGestureRecognizer(target: self, action: #selector(MacawView.handleRotation)) + let pinchRecognizer = MPinchGestureRecognizer(target: self, action: #selector(MacawView.handlePinch)) + rotationRecognizer.delegate = self + pinchRecognizer.delegate = self + rotationRecognizer.cancelsTouchesInView = false + pinchRecognizer.cancelsTouchesInView = false + self.addGestureRecognizer(rotationRecognizer) + self.addGestureRecognizer(pinchRecognizer) + #endif tapRecognizer.delegate = self panRecognizer.delegate = self - rotationRecognizer.delegate = self - pinchRecognizer.delegate = self - tapRecognizer.cancelsTouchesInView = false panRecognizer.cancelsTouchesInView = false - rotationRecognizer.cancelsTouchesInView = false - pinchRecognizer.cancelsTouchesInView = false self.removeGestureRecognizers() self.addGestureRecognizer(tapRecognizer) self.addGestureRecognizer(panRecognizer) - self.addGestureRecognizer(rotationRecognizer) - self.addGestureRecognizer(pinchRecognizer) + } override open func draw(_ rect: CGRect) { @@ -376,98 +379,99 @@ open class MacawView: MView, MGestureRecognizerDelegate { } // MARK: - Rotation - + #if os(iOS) @objc func handleRotation(_ recognizer: MRotationGestureRecognizer) { - if !self.node.shouldCheckForRotate() { - return - } + if !self.node.shouldCheckForRotate() { + return + } - guard let renderer = renderer else { - return - } + guard let renderer = renderer else { + return + } - if recognizer.state == .began { - let location = recognizer.location(in: self) + if recognizer.state == .began { + let location = recognizer.location(in: self) - localContext { ctx in - guard let foundNode = renderer.findNodeAt(location: location, ctx: ctx) else { - return - } + localContext { ctx in + guard let foundNode = renderer.findNodeAt(location: location, ctx: ctx) else { + return + } - if self.recognizersMap[recognizer] == nil { - self.recognizersMap[recognizer] = [Node]() - } + if self.recognizersMap[recognizer] == nil { + self.recognizersMap[recognizer] = [Node]() + } - var parent: Node? = foundNode - while parent != .none { - if parent!.shouldCheckForRotate() { - self.recognizersMap[recognizer]?.append(parent!) - } + var parent: Node? = foundNode + while parent != .none { + if parent!.shouldCheckForRotate() { + self.recognizersMap[recognizer]?.append(parent!) + } - parent = nodesMap.parents(parent!).first - } - } - } + parent = nodesMap.parents(parent!).first + } + } + } - let rotation = Double(recognizer.rotation) - recognizer.rotation = 0 + let rotation = Double(recognizer.rotation) + recognizer.rotation = 0 - recognizersMap[recognizer]?.forEach { node in - let event = RotateEvent(node: node, angle: rotation) - node.handleRotate(event) - } + recognizersMap[recognizer]?.forEach { node in + let event = RotateEvent(node: node, angle: rotation) + node.handleRotate(event) + } - if recognizer.state == .ended || recognizer.state == .cancelled { - recognizersMap.removeValue(forKey: recognizer) - } + if recognizer.state == .ended || recognizer.state == .cancelled { + recognizersMap.removeValue(forKey: recognizer) + } } // MARK: - Pinch @objc func handlePinch(_ recognizer: MPinchGestureRecognizer) { - if !self.node.shouldCheckForPinch() { - return - } + if !self.node.shouldCheckForPinch() { + return + } - guard let renderer = renderer else { - return - } + guard let renderer = renderer else { + return + } - if recognizer.state == .began { - let location = recognizer.location(in: self) + if recognizer.state == .began { + let location = recognizer.location(in: self) - localContext { ctx in - guard let foundNode = renderer.findNodeAt(location: location, ctx: ctx) else { - return - } + localContext { ctx in + guard let foundNode = renderer.findNodeAt(location: location, ctx: ctx) else { + return + } - if self.recognizersMap[recognizer] == nil { - self.recognizersMap[recognizer] = [Node]() - } + if self.recognizersMap[recognizer] == nil { + self.recognizersMap[recognizer] = [Node]() + } - var parent: Node? = foundNode - while parent != .none { - if parent!.shouldCheckForPinch() { - self.recognizersMap[recognizer]?.append(parent!) - } + var parent: Node? = foundNode + while parent != .none { + if parent!.shouldCheckForPinch() { + self.recognizersMap[recognizer]?.append(parent!) + } - parent = nodesMap.parents(parent!).first - } - } - } + parent = nodesMap.parents(parent!).first + } + } + } - let scale = Double(recognizer.mScale) - recognizer.mScale = 1 + let scale = Double(recognizer.mScale) + recognizer.mScale = 1 - recognizersMap[recognizer]?.forEach { node in - let event = PinchEvent(node: node, scale: scale) - node.handlePinch(event) - } + recognizersMap[recognizer]?.forEach { node in + let event = PinchEvent(node: node, scale: scale) + node.handlePinch(event) + } - if recognizer.state == .ended || recognizer.state == .cancelled { - recognizersMap.removeValue(forKey: recognizer) - } + if recognizer.state == .ended || recognizer.state == .cancelled { + recognizersMap.removeValue(forKey: recognizer) } + } + #endif deinit { nodesMap.remove(node) diff --git a/Source/views/NodesMap.swift b/Source/views/NodesMap.swift index f53c0297..a5ae4af4 100644 --- a/Source/views/NodesMap.swift +++ b/Source/views/NodesMap.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #endif diff --git a/Source/views/ShapeLayer.swift b/Source/views/ShapeLayer.swift index ea198dc8..2e9a03d3 100644 --- a/Source/views/ShapeLayer.swift +++ b/Source/views/ShapeLayer.swift @@ -1,6 +1,6 @@ import Foundation -#if os(iOS) +#if os(iOS) || os(tvOS) import UIKit #elseif os(OSX) import AppKit diff --git a/Testoo/Info.plist b/Testoo/Info.plist new file mode 100644 index 00000000..1007fd9d --- /dev/null +++ b/Testoo/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Testoo/Testoo.h b/Testoo/Testoo.h new file mode 100644 index 00000000..adfd031a --- /dev/null +++ b/Testoo/Testoo.h @@ -0,0 +1,19 @@ +// +// Testoo.h +// Testoo +// +// Created by Kristaps Grinbergs on 28/02/2018. +// Copyright © 2018 Exyte. All rights reserved. +// + +#import + +//! Project version number for Testoo. +FOUNDATION_EXPORT double TestooVersionNumber; + +//! Project version string for Testoo. +FOUNDATION_EXPORT const unsigned char TestooVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +