From 8bbb174471fd2fa17a754540ccfbfe28d0c20c31 Mon Sep 17 00:00:00 2001 From: Matt Sullivan Date: Sat, 26 Sep 2020 13:29:45 -0700 Subject: [PATCH] Initial commit of the iOS runtime --- .gitignore | 2 + Example-iOS/Assets/bird.riv | Bin 0 -> 44554 bytes Example-iOS/Assets/blend.riv | Bin 0 -> 8434 bytes Example-iOS/Assets/funtime.riv | Bin 0 -> 28077 bytes Example-iOS/Assets/juice.riv | Bin 0 -> 9204 bytes Example-iOS/Assets/simple.riv | Bin 0 -> 1260 bytes Example-iOS/Assets/truck.riv | Bin 0 -> 36315 bytes Example-iOS/Assets/van.riv | Bin 0 -> 19289 bytes .../RiveExample.xcodeproj/project.pbxproj | 472 +++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Example-iOS/Source/AppDelegate.swift | 37 + .../AppIcon.appiconset/Contents.json | 98 + .../Source/Assets.xcassets/Contents.json | 6 + .../Source/Base.lproj/LaunchScreen.storyboard | 25 + Example-iOS/Source/ContentView.swift | 25 + Example-iOS/Source/Helpers/Utilities.swift | 31 + Example-iOS/Source/Info.plist | 60 + .../Preview Assets.xcassets/Contents.json | 6 + Example-iOS/Source/SceneDelegate.swift | 64 + RiveRuntime.xcodeproj/project.pbxproj | 1638 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + RiveRuntimeTests/Info.plist | 22 + RiveRuntimeTests/RiveRuntimeTests.m | 37 + Source/Info.plist | 22 + Source/RiveKit/Rive.h | 97 + Source/RiveKit/Rive.mm | 243 +++ Source/RiveKit/RiveRenderer.hpp | 162 ++ Source/RiveKit/RiveRenderer.mm | 451 +++++ Source/RiveKit/RiveView.h | 19 + Source/RiveKit/RiveView.mm | 30 + Source/RiveKit/RiveViewController.h | 19 + Source/RiveKit/RiveViewController.mm | 114 ++ Source/RiveRuntime.h | 20 + Source/Runtime/RiveRenderer.h | 20 + Source/Runtime/RiveRenderer.mm | 26 + Source/TestHeader.h | 15 + 38 files changed, 3791 insertions(+) create mode 100644 Example-iOS/Assets/bird.riv create mode 100644 Example-iOS/Assets/blend.riv create mode 100644 Example-iOS/Assets/funtime.riv create mode 100644 Example-iOS/Assets/juice.riv create mode 100644 Example-iOS/Assets/simple.riv create mode 100644 Example-iOS/Assets/truck.riv create mode 100644 Example-iOS/Assets/van.riv create mode 100644 Example-iOS/RiveExample.xcodeproj/project.pbxproj create mode 100644 Example-iOS/RiveExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example-iOS/RiveExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example-iOS/Source/AppDelegate.swift create mode 100644 Example-iOS/Source/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example-iOS/Source/Assets.xcassets/Contents.json create mode 100644 Example-iOS/Source/Base.lproj/LaunchScreen.storyboard create mode 100644 Example-iOS/Source/ContentView.swift create mode 100644 Example-iOS/Source/Helpers/Utilities.swift create mode 100644 Example-iOS/Source/Info.plist create mode 100644 Example-iOS/Source/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Example-iOS/Source/SceneDelegate.swift create mode 100644 RiveRuntime.xcodeproj/project.pbxproj create mode 100644 RiveRuntime.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RiveRuntime.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RiveRuntimeTests/Info.plist create mode 100644 RiveRuntimeTests/RiveRuntimeTests.m create mode 100644 Source/Info.plist create mode 100644 Source/RiveKit/Rive.h create mode 100644 Source/RiveKit/Rive.mm create mode 100644 Source/RiveKit/RiveRenderer.hpp create mode 100644 Source/RiveKit/RiveRenderer.mm create mode 100644 Source/RiveKit/RiveView.h create mode 100644 Source/RiveKit/RiveView.mm create mode 100644 Source/RiveKit/RiveViewController.h create mode 100644 Source/RiveKit/RiveViewController.mm create mode 100644 Source/RiveRuntime.h create mode 100644 Source/Runtime/RiveRenderer.h create mode 100644 Source/Runtime/RiveRenderer.mm create mode 100644 Source/TestHeader.h diff --git a/.gitignore b/.gitignore index 330d167..5466cb2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore +.DS_Store + ## User settings xcuserdata/ diff --git a/Example-iOS/Assets/bird.riv b/Example-iOS/Assets/bird.riv new file mode 100644 index 0000000000000000000000000000000000000000..958755de5ed8e4e39f31fbe60d4ac6f5f97c438c GIT binary patch literal 44554 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 B?O6Z- literal 0 HcmV?d00001 diff --git a/Example-iOS/Assets/juice.riv b/Example-iOS/Assets/juice.riv new file mode 100644 index 0000000000000000000000000000000000000000..fa2244b935ecac80e83e99041616bafdeee663bf GIT binary patch literal 9204 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 literal 0 HcmV?d00001 diff --git a/Example-iOS/Assets/truck.riv b/Example-iOS/Assets/truck.riv new file mode 100644 index 0000000000000000000000000000000000000000..c9a238c3119c995fee601f609a3acf72389d2171 GIT binary patch literal 36315 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 literal 0 HcmV?d00001 diff --git a/Example-iOS/RiveExample.xcodeproj/project.pbxproj b/Example-iOS/RiveExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d90eded --- /dev/null +++ b/Example-iOS/RiveExample.xcodeproj/project.pbxproj @@ -0,0 +1,472 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + C9696B1224FC704A0041502A /* juice.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9696B1124FC704A0041502A /* juice.riv */; }; + C9696B1524FC71CE0041502A /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9696B1424FC71CE0041502A /* Utilities.swift */; }; + C970484A250822F300CB3AB3 /* simple.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9704847250822F300CB3AB3 /* simple.riv */; }; + C98F298B2513FD8C0076E802 /* blend.riv in Resources */ = {isa = PBXBuildFile; fileRef = C98F29882513FD8C0076E802 /* blend.riv */; }; + C9927C1B250986BF009F17F5 /* truck.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9927C18250986BF009F17F5 /* truck.riv */; }; + C99E2FE3251E8DB4009227CA /* van.riv in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FE0251E8DB4009227CA /* van.riv */; }; + C99E2FE8251E8E35009227CA /* bird.riv in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FE6251E8E35009227CA /* bird.riv */; }; + C99E2FE9251E8E35009227CA /* funtime.riv in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FE7251E8E35009227CA /* funtime.riv */; }; + C9C73E9824FC471E00EF9516 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C73E9724FC471E00EF9516 /* AppDelegate.swift */; }; + C9C73E9A24FC471E00EF9516 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */; }; + C9C73E9C24FC471E00EF9516 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C73E9B24FC471E00EF9516 /* ContentView.swift */; }; + C9C73E9E24FC471E00EF9516 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9C73E9D24FC471E00EF9516 /* Assets.xcassets */; }; + C9C73EA124FC471E00EF9516 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9C73EA024FC471E00EF9516 /* Preview Assets.xcassets */; }; + C9C73EA424FC471E00EF9516 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9C73EA224FC471E00EF9516 /* LaunchScreen.storyboard */; }; + C9E1AA45251E957F00BD52EC /* RiveRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9E1AA3E251E94CC00BD52EC /* RiveRuntime.framework */; }; + C9E1AA46251E957F00BD52EC /* RiveRuntime.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C9E1AA3E251E94CC00BD52EC /* RiveRuntime.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C9E1AA3D251E94CC00BD52EC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C9E1AA38251E94CC00BD52EC /* RiveRuntime.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C9C73ED124FC478800EF9516; + remoteInfo = RiveRuntime; + }; + C9E1AA3F251E94CC00BD52EC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C9E1AA38251E94CC00BD52EC /* RiveRuntime.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C9C73EDA24FC478900EF9516; + remoteInfo = RiveRuntimeTests; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + C9C7420224FC53CF00EF9516 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + C9E1AA46251E957F00BD52EC /* RiveRuntime.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + C9696B1124FC704A0041502A /* juice.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = juice.riv; sourceTree = ""; }; + C9696B1424FC71CE0041502A /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + C9704847250822F300CB3AB3 /* simple.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = simple.riv; sourceTree = ""; }; + C98F29882513FD8C0076E802 /* blend.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = blend.riv; sourceTree = ""; }; + C9927C18250986BF009F17F5 /* truck.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = truck.riv; sourceTree = ""; }; + C99E2FE0251E8DB4009227CA /* van.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = van.riv; sourceTree = ""; }; + C99E2FE6251E8E35009227CA /* bird.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = bird.riv; sourceTree = ""; }; + C99E2FE7251E8E35009227CA /* funtime.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = funtime.riv; sourceTree = ""; }; + C9C73E9424FC471E00EF9516 /* RiveExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RiveExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C9C73E9724FC471E00EF9516 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + C9C73E9B24FC471E00EF9516 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + C9C73E9D24FC471E00EF9516 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C9C73EA024FC471E00EF9516 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + C9C73EA324FC471E00EF9516 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + C9C73EA524FC471E00EF9516 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C9E1AA38251E94CC00BD52EC /* RiveRuntime.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RiveRuntime.xcodeproj; path = ../RiveRuntime.xcodeproj; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C9C73E9124FC471E00EF9516 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C9E1AA45251E957F00BD52EC /* RiveRuntime.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C9696B0E24FC6FD10041502A /* Assets */ = { + isa = PBXGroup; + children = ( + C99E2FE6251E8E35009227CA /* bird.riv */, + C99E2FE7251E8E35009227CA /* funtime.riv */, + C99E2FE0251E8DB4009227CA /* van.riv */, + C98F29882513FD8C0076E802 /* blend.riv */, + C9927C18250986BF009F17F5 /* truck.riv */, + C9704847250822F300CB3AB3 /* simple.riv */, + C9696B1124FC704A0041502A /* juice.riv */, + ); + path = Assets; + sourceTree = ""; + }; + C9696B1324FC71B80041502A /* Helpers */ = { + isa = PBXGroup; + children = ( + C9696B1424FC71CE0041502A /* Utilities.swift */, + ); + path = Helpers; + sourceTree = ""; + }; + C9C73E8B24FC471E00EF9516 = { + isa = PBXGroup; + children = ( + C9E1AA38251E94CC00BD52EC /* RiveRuntime.xcodeproj */, + C9696B0E24FC6FD10041502A /* Assets */, + C9C73E9624FC471E00EF9516 /* Source */, + C9C73E9524FC471E00EF9516 /* Products */, + C9C741FF24FC53CF00EF9516 /* Frameworks */, + ); + sourceTree = ""; + }; + C9C73E9524FC471E00EF9516 /* Products */ = { + isa = PBXGroup; + children = ( + C9C73E9424FC471E00EF9516 /* RiveExample.app */, + ); + name = Products; + sourceTree = ""; + }; + C9C73E9624FC471E00EF9516 /* Source */ = { + isa = PBXGroup; + children = ( + C9696B1324FC71B80041502A /* Helpers */, + C9C73E9724FC471E00EF9516 /* AppDelegate.swift */, + C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */, + C9C73E9B24FC471E00EF9516 /* ContentView.swift */, + C9C73E9D24FC471E00EF9516 /* Assets.xcassets */, + C9C73EA224FC471E00EF9516 /* LaunchScreen.storyboard */, + C9C73EA524FC471E00EF9516 /* Info.plist */, + C9C73E9F24FC471E00EF9516 /* Preview Content */, + ); + path = Source; + sourceTree = ""; + }; + C9C73E9F24FC471E00EF9516 /* Preview Content */ = { + isa = PBXGroup; + children = ( + C9C73EA024FC471E00EF9516 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + C9C741FF24FC53CF00EF9516 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + C9E1AA39251E94CC00BD52EC /* Products */ = { + isa = PBXGroup; + children = ( + C9E1AA3E251E94CC00BD52EC /* RiveRuntime.framework */, + C9E1AA40251E94CC00BD52EC /* RiveRuntimeTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C9C73E9324FC471E00EF9516 /* RiveExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "RiveExample" */; + buildPhases = ( + C9C73E9024FC471E00EF9516 /* Sources */, + C9C73E9124FC471E00EF9516 /* Frameworks */, + C9C73E9224FC471E00EF9516 /* Resources */, + C9C7420224FC53CF00EF9516 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RiveExample; + productName = RiveExample; + productReference = C9C73E9424FC471E00EF9516 /* RiveExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C9C73E8C24FC471E00EF9516 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1160; + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = Rive; + TargetAttributes = { + C9C73E9324FC471E00EF9516 = { + CreatedOnToolsVersion = 11.6; + }; + }; + }; + buildConfigurationList = C9C73E8F24FC471E00EF9516 /* Build configuration list for PBXProject "RiveExample" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C9C73E8B24FC471E00EF9516; + productRefGroup = C9C73E9524FC471E00EF9516 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = C9E1AA39251E94CC00BD52EC /* Products */; + ProjectRef = C9E1AA38251E94CC00BD52EC /* RiveRuntime.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + C9C73E9324FC471E00EF9516 /* RiveExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + C9E1AA3E251E94CC00BD52EC /* RiveRuntime.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = RiveRuntime.framework; + remoteRef = C9E1AA3D251E94CC00BD52EC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C9E1AA40251E94CC00BD52EC /* RiveRuntimeTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = RiveRuntimeTests.xctest; + remoteRef = C9E1AA3F251E94CC00BD52EC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + C9C73E9224FC471E00EF9516 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C99E2FE9251E8E35009227CA /* funtime.riv in Resources */, + C98F298B2513FD8C0076E802 /* blend.riv in Resources */, + C9696B1224FC704A0041502A /* juice.riv in Resources */, + C9C73EA424FC471E00EF9516 /* LaunchScreen.storyboard in Resources */, + C99E2FE3251E8DB4009227CA /* van.riv in Resources */, + C99E2FE8251E8E35009227CA /* bird.riv in Resources */, + C9C73EA124FC471E00EF9516 /* Preview Assets.xcassets in Resources */, + C970484A250822F300CB3AB3 /* simple.riv in Resources */, + C9C73E9E24FC471E00EF9516 /* Assets.xcassets in Resources */, + C9927C1B250986BF009F17F5 /* truck.riv in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C9C73E9024FC471E00EF9516 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C9C73E9824FC471E00EF9516 /* AppDelegate.swift in Sources */, + C9C73E9A24FC471E00EF9516 /* SceneDelegate.swift in Sources */, + C9696B1524FC71CE0041502A /* Utilities.swift in Sources */, + C9C73E9C24FC471E00EF9516 /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + C9C73EA224FC471E00EF9516 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C9C73EA324FC471E00EF9516 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C9C73EBC24FC471E00EF9516 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + C9C73EBD24FC471E00EF9516 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C9C73EBF24FC471E00EF9516 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"Source/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = Source/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.example.RiveExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C9C73EC024FC471E00EF9516 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"Source/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = Source/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.example.RiveExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C9C73E8F24FC471E00EF9516 /* Build configuration list for PBXProject "RiveExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9C73EBC24FC471E00EF9516 /* Debug */, + C9C73EBD24FC471E00EF9516 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "RiveExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9C73EBF24FC471E00EF9516 /* Debug */, + C9C73EC024FC471E00EF9516 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C9C73E8C24FC471E00EF9516 /* Project object */; +} diff --git a/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..491b025 --- /dev/null +++ b/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example-iOS/RiveExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example-iOS/Source/AppDelegate.swift b/Example-iOS/Source/AppDelegate.swift new file mode 100644 index 0000000..75b387b --- /dev/null +++ b/Example-iOS/Source/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// RiveExample +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/Example-iOS/Source/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example-iOS/Source/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/Example-iOS/Source/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-iOS/Source/Assets.xcassets/Contents.json b/Example-iOS/Source/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example-iOS/Source/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-iOS/Source/Base.lproj/LaunchScreen.storyboard b/Example-iOS/Source/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/Example-iOS/Source/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example-iOS/Source/ContentView.swift b/Example-iOS/Source/ContentView.swift new file mode 100644 index 0000000..e3570c5 --- /dev/null +++ b/Example-iOS/Source/ContentView.swift @@ -0,0 +1,25 @@ +// +// ContentView.swift +// RiveExample +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +import SwiftUI +import RiveRuntime + +struct ContentView: View { + var body: some View { + // Text("Hello, World!") + MyRive() + } +} + +struct MyRive: UIViewControllerRepresentable { + func makeUIViewController(context: Context) -> RiveViewController { + return RiveViewController(resource: "truck", withExtension: "riv") + } + + func updateUIViewController(_ uiViewController: RiveViewController, context: Context) {} +} diff --git a/Example-iOS/Source/Helpers/Utilities.swift b/Example-iOS/Source/Helpers/Utilities.swift new file mode 100644 index 0000000..3ae3fa0 --- /dev/null +++ b/Example-iOS/Source/Helpers/Utilities.swift @@ -0,0 +1,31 @@ +// +// Utilities.swift +// RiveExample +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +import Foundation + +func loadBytesFromFile(forResource res: String, withExtension ext: String) -> Data? +{ + guard let fileURL = Bundle.main.url(forResource: res, withExtension: ext) else { + print("Failed to create URL for file.") + return nil + } + do { + let data = try Data(contentsOf: fileURL) + return data + } + catch { + print("Error opening file: \(error)") + return nil + } +} + +extension Data { + var bytes : [UInt8]{ + return [UInt8](self) + } +} diff --git a/Example-iOS/Source/Info.plist b/Example-iOS/Source/Info.plist new file mode 100644 index 0000000..9742bf0 --- /dev/null +++ b/Example-iOS/Source/Info.plist @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Example-iOS/Source/Preview Content/Preview Assets.xcassets/Contents.json b/Example-iOS/Source/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example-iOS/Source/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-iOS/Source/SceneDelegate.swift b/Example-iOS/Source/SceneDelegate.swift new file mode 100644 index 0000000..a9c9761 --- /dev/null +++ b/Example-iOS/Source/SceneDelegate.swift @@ -0,0 +1,64 @@ +// +// SceneDelegate.swift +// RiveExample +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +import UIKit +import SwiftUI +import RiveRuntime + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + // Create the SwiftUI view that provides the window contents. + let contentView = ContentView() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} diff --git a/RiveRuntime.xcodeproj/project.pbxproj b/RiveRuntime.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c6ffbd3 --- /dev/null +++ b/RiveRuntime.xcodeproj/project.pbxproj @@ -0,0 +1,1638 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + C9601F23250C143A0032AA07 /* RiveViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C9601F21250C143A0032AA07 /* RiveViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9601F24250C143A0032AA07 /* RiveViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9601F22250C143A0032AA07 /* RiveViewController.mm */; }; + C9601F27250C14560032AA07 /* RiveView.h in Headers */ = {isa = PBXBuildFile; fileRef = C9601F25250C14560032AA07 /* RiveView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9601F28250C14560032AA07 /* RiveView.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9601F26250C14560032AA07 /* RiveView.mm */; }; + C9601F2B250C25930032AA07 /* RiveRenderer.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9601F2A250C25930032AA07 /* RiveRenderer.mm */; }; + C9601F69251004780032AA07 /* vec2d.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F2D251004770032AA07 /* vec2d.hpp */; }; + C9601F6C251004780032AA07 /* color.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F30251004770032AA07 /* color.hpp */; }; + C9601F6D251004780032AA07 /* transform_components.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F31251004770032AA07 /* transform_components.hpp */; }; + C9601F70251004780032AA07 /* trim_path_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F34251004770032AA07 /* trim_path_base.hpp */; }; + C9601F71251004780032AA07 /* command_path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F35251004780032AA07 /* command_path.hpp */; }; + C9601F73251004780032AA07 /* stroke_cap.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F38251004780032AA07 /* stroke_cap.hpp */; }; + C9601F75251004780032AA07 /* stroke.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F3A251004780032AA07 /* stroke.hpp */; }; + C9601F79251004780032AA07 /* stroke_join.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F3E251004780032AA07 /* stroke_join.hpp */; }; + C9601F7A251004780032AA07 /* fill.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F3F251004780032AA07 /* fill.hpp */; }; + C9601F7C251004780032AA07 /* trim_path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F41251004780032AA07 /* trim_path.hpp */; }; + C9601F7F251004780032AA07 /* linear_gradient.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F44251004780032AA07 /* linear_gradient.hpp */; }; + C9601F80251004780032AA07 /* stroke_effect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F45251004780032AA07 /* stroke_effect.hpp */; }; + C9601F82251004780032AA07 /* straight_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F48251004780032AA07 /* straight_vertex.hpp */; }; + C9601F84251004780032AA07 /* gradient_stop.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F4B251004780032AA07 /* gradient_stop.hpp */; }; + C9601F86251004780032AA07 /* shape_paint_mutator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F4D251004780032AA07 /* shape_paint_mutator.hpp */; }; + C9601F87251004780032AA07 /* blend_mode.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F4E251004780032AA07 /* blend_mode.hpp */; }; + C9601F88251004780032AA07 /* shape_paint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F4F251004780032AA07 /* shape_paint.hpp */; }; + C9601F8B251004780032AA07 /* radial_gradient.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F52251004780032AA07 /* radial_gradient.hpp */; }; + C9601F8D251004780032AA07 /* color.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F54251004780032AA07 /* color.hpp */; }; + C9601F8E251004780032AA07 /* solid_color.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F55251004780032AA07 /* solid_color.hpp */; }; + C9601F91251004780032AA07 /* path_composer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F58251004780032AA07 /* path_composer.hpp */; }; + C9601F92251004780032AA07 /* shape_paint_container.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F59251004780032AA07 /* shape_paint_container.hpp */; }; + C9601F93251004780032AA07 /* cubic_mirrored_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5A251004780032AA07 /* cubic_mirrored_vertex.hpp */; }; + C9601F94251004780032AA07 /* path_space.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5B251004780032AA07 /* path_space.hpp */; }; + C9601F95251004780032AA07 /* ellipse.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5C251004780032AA07 /* ellipse.hpp */; }; + C9601F96251004780032AA07 /* clipping_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5D251004780032AA07 /* clipping_shape.hpp */; }; + C9601F97251004780032AA07 /* metrics_path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5E251004780032AA07 /* metrics_path.hpp */; }; + C9601F98251004780032AA07 /* cubic_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F5F251004780032AA07 /* cubic_vertex.hpp */; }; + C9601F9A251004780032AA07 /* triangle.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F61251004780032AA07 /* triangle.hpp */; }; + C9601F9B251004780032AA07 /* path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F62251004780032AA07 /* path.hpp */; }; + C9601F9D251004780032AA07 /* parametric_path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F64251004780032AA07 /* parametric_path.hpp */; }; + C9601FA0251004780032AA07 /* cubic_asymmetric_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9601F67251004780032AA07 /* cubic_asymmetric_vertex.hpp */; }; + C9601FAF251004950032AA07 /* trim_path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FA2251004950032AA07 /* trim_path.cpp */; }; + C9601FB0251004950032AA07 /* metrics_path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FA3251004950032AA07 /* metrics_path.cpp */; }; + C9601FB3251004950032AA07 /* shape_paint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FA7251004950032AA07 /* shape_paint.cpp */; }; + C9601FB6251004950032AA07 /* color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FAA251004950032AA07 /* color.cpp */; }; + C9601FB9251004950032AA07 /* gradient_stop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FAD251004950032AA07 /* gradient_stop.cpp */; }; + C9601FBA251004950032AA07 /* stroke.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601FAE251004950032AA07 /* stroke.cpp */; }; + C960285B251FD59800704818 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C960285A251FD59800704818 /* UIKit.framework */; }; + C98F296F2513FA8B0076E802 /* keyframe_id.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F296E2513FA8B0076E802 /* keyframe_id.hpp */; }; + C98F29782513FAAE0076E802 /* draw_rules.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29722513FAAE0076E802 /* draw_rules.hpp */; }; + C98F29792513FAAE0076E802 /* draw_target_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29732513FAAE0076E802 /* draw_target_base.hpp */; }; + C98F297A2513FAAE0076E802 /* draw_rules_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29742513FAAE0076E802 /* draw_rules_base.hpp */; }; + C98F297B2513FAAE0076E802 /* draw_target_placement.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29752513FAAE0076E802 /* draw_target_placement.hpp */; }; + C98F297C2513FAAE0076E802 /* draw_target.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29762513FAAE0076E802 /* draw_target.hpp */; }; + C98F297D2513FAAE0076E802 /* keyframe_id_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C98F29772513FAAE0076E802 /* keyframe_id_base.hpp */; }; + C98F29832513FAC30076E802 /* draw_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C98F29802513FAC30076E802 /* draw_target.cpp */; }; + C98F29842513FAC30076E802 /* keyframe_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C98F29812513FAC30076E802 /* keyframe_id.cpp */; }; + C98F29852513FAC30076E802 /* draw_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C98F29822513FAC30076E802 /* draw_rules.cpp */; }; + C9C73EE024FC478900EF9516 /* RiveRuntimeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C73EDF24FC478900EF9516 /* RiveRuntimeTests.m */; }; + C9C73EE224FC478900EF9516 /* RiveRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C73ED424FC478800EF9516 /* RiveRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9C7413724FC4F0500EF9516 /* core_bool_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407024FC4F0400EF9516 /* core_bool_type.cpp */; }; + C9C7413824FC4F0500EF9516 /* core_uint_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407124FC4F0400EF9516 /* core_uint_type.cpp */; }; + C9C7413924FC4F0500EF9516 /* core_double_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407224FC4F0400EF9516 /* core_double_type.cpp */; }; + C9C7413A24FC4F0500EF9516 /* core_string_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407324FC4F0400EF9516 /* core_string_type.cpp */; }; + C9C7413B24FC4F0500EF9516 /* core_color_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407424FC4F0400EF9516 /* core_color_type.cpp */; }; + C9C7413C24FC4F0500EF9516 /* binary_reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407524FC4F0400EF9516 /* binary_reader.cpp */; }; + C9C7413D24FC4F0500EF9516 /* transform_component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407624FC4F0400EF9516 /* transform_component.cpp */; }; + C9C7413E24FC4F0500EF9516 /* component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407724FC4F0400EF9516 /* component.cpp */; }; + C9C7413F24FC4F0500EF9516 /* node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407824FC4F0400EF9516 /* node.cpp */; }; + C9C7414024FC4F0500EF9516 /* layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407924FC4F0400EF9516 /* layout.cpp */; }; + C9C7414124FC4F0500EF9516 /* keyframe_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407B24FC4F0400EF9516 /* keyframe_color.cpp */; }; + C9C7414224FC4F0500EF9516 /* keyed_object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407C24FC4F0400EF9516 /* keyed_object.cpp */; }; + C9C7414324FC4F0500EF9516 /* linear_animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407D24FC4F0400EF9516 /* linear_animation.cpp */; }; + C9C7414424FC4F0500EF9516 /* linear_animation_instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407E24FC4F0400EF9516 /* linear_animation_instance.cpp */; }; + C9C7414524FC4F0500EF9516 /* keyframe_double.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7407F24FC4F0400EF9516 /* keyframe_double.cpp */; }; + C9C7414624FC4F0500EF9516 /* keyframe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408024FC4F0400EF9516 /* keyframe.cpp */; }; + C9C7414724FC4F0500EF9516 /* cubic_interpolator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408124FC4F0400EF9516 /* cubic_interpolator.cpp */; }; + C9C7414824FC4F0500EF9516 /* keyed_property.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408224FC4F0400EF9516 /* keyed_property.cpp */; }; + C9C7414A24FC4F0500EF9516 /* drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408424FC4F0400EF9516 /* drawable.cpp */; }; + C9C7414B24FC4F0500EF9516 /* solid_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408724FC4F0400EF9516 /* solid_color.cpp */; }; + C9C7414C24FC4F0500EF9516 /* linear_gradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408824FC4F0400EF9516 /* linear_gradient.cpp */; }; + C9C7414E24FC4F0500EF9516 /* fill.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408A24FC4F0400EF9516 /* fill.cpp */; }; + C9C7414F24FC4F0500EF9516 /* radial_gradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408B24FC4F0400EF9516 /* radial_gradient.cpp */; }; + C9C7415124FC4F0500EF9516 /* shape_paint_mutator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7408D24FC4F0400EF9516 /* shape_paint_mutator.cpp */; }; + C9C7415424FC4F0500EF9516 /* points_path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409024FC4F0400EF9516 /* points_path.cpp */; }; + C9C7415524FC4F0500EF9516 /* cubic_asymmetric_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409124FC4F0400EF9516 /* cubic_asymmetric_vertex.cpp */; }; + C9C7415624FC4F0500EF9516 /* cubic_detached_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409224FC4F0400EF9516 /* cubic_detached_vertex.cpp */; }; + C9C7415724FC4F0500EF9516 /* cubic_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409324FC4F0400EF9516 /* cubic_vertex.cpp */; }; + C9C7415824FC4F0500EF9516 /* shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409424FC4F0400EF9516 /* shape.cpp */; }; + C9C7415924FC4F0500EF9516 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409524FC4F0400EF9516 /* path.cpp */; }; + C9C7415A24FC4F0500EF9516 /* parametric_path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409624FC4F0400EF9516 /* parametric_path.cpp */; }; + C9C7415B24FC4F0500EF9516 /* path_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409724FC4F0400EF9516 /* path_vertex.cpp */; }; + C9C7415C24FC4F0500EF9516 /* rectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409824FC4F0400EF9516 /* rectangle.cpp */; }; + C9C7415D24FC4F0500EF9516 /* straight_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409924FC4F0400EF9516 /* straight_vertex.cpp */; }; + C9C7415E24FC4F0500EF9516 /* path_composer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409A24FC4F0400EF9516 /* path_composer.cpp */; }; + C9C7415F24FC4F0500EF9516 /* shape_paint_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409B24FC4F0400EF9516 /* shape_paint_container.cpp */; }; + C9C7416024FC4F0500EF9516 /* cubic_mirrored_vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409C24FC4F0400EF9516 /* cubic_mirrored_vertex.cpp */; }; + C9C7416124FC4F0500EF9516 /* ellipse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409D24FC4F0400EF9516 /* ellipse.cpp */; }; + C9C7416224FC4F0500EF9516 /* clipping_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C7409E24FC4F0400EF9516 /* clipping_shape.cpp */; }; + C9C7416324FC4F0500EF9516 /* aabb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A024FC4F0400EF9516 /* aabb.cpp */; }; + C9C7416424FC4F0500EF9516 /* vec2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A124FC4F0400EF9516 /* vec2d.cpp */; }; + C9C7416524FC4F0500EF9516 /* mat2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A224FC4F0400EF9516 /* mat2d.cpp */; }; + C9C7416624FC4F0500EF9516 /* dependency_sorter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A324FC4F0400EF9516 /* dependency_sorter.cpp */; }; + C9C7416724FC4F0500EF9516 /* artboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A424FC4F0400EF9516 /* artboard.cpp */; }; + C9C7416824FC4F0500EF9516 /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A524FC4F0400EF9516 /* file.cpp */; }; + C9C7416924FC4F0500EF9516 /* root_bone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A724FC4F0400EF9516 /* root_bone.cpp */; }; + C9C7416A24FC4F0500EF9516 /* bone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A824FC4F0400EF9516 /* bone.cpp */; }; + C9C7416B24FC4F0500EF9516 /* skinnable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740A924FC4F0400EF9516 /* skinnable.cpp */; }; + C9C7416C24FC4F0500EF9516 /* weight.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740AA24FC4F0400EF9516 /* weight.cpp */; }; + C9C7416D24FC4F0500EF9516 /* skin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740AB24FC4F0400EF9516 /* skin.cpp */; }; + C9C7416E24FC4F0500EF9516 /* tendon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9C740AC24FC4F0400EF9516 /* tendon.cpp */; }; + C9C7416F24FC4F0500EF9516 /* core_registry.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740AF24FC4F0400EF9516 /* core_registry.hpp */; }; + C9C7417024FC4F0500EF9516 /* node_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B024FC4F0400EF9516 /* node_base.hpp */; }; + C9C7417124FC4F0500EF9516 /* transform_component_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B124FC4F0400EF9516 /* transform_component_base.hpp */; }; + C9C7417224FC4F0500EF9516 /* artboard_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B224FC4F0400EF9516 /* artboard_base.hpp */; }; + C9C7417324FC4F0500EF9516 /* keyframe_color_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B424FC4F0400EF9516 /* keyframe_color_base.hpp */; }; + C9C7417424FC4F0500EF9516 /* keyed_property_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B524FC4F0400EF9516 /* keyed_property_base.hpp */; }; + C9C7417524FC4F0500EF9516 /* keyframe_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B624FC4F0400EF9516 /* keyframe_base.hpp */; }; + C9C7417624FC4F0500EF9516 /* animation_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B724FC4F0400EF9516 /* animation_base.hpp */; }; + C9C7417724FC4F0500EF9516 /* cubic_interpolator_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B824FC4F0400EF9516 /* cubic_interpolator_base.hpp */; }; + C9C7417824FC4F0500EF9516 /* keyframe_draw_order_value_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740B924FC4F0400EF9516 /* keyframe_draw_order_value_base.hpp */; }; + C9C7417924FC4F0500EF9516 /* keyframe_draw_order_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740BA24FC4F0400EF9516 /* keyframe_draw_order_base.hpp */; }; + C9C7417A24FC4F0500EF9516 /* linear_animation_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740BB24FC4F0400EF9516 /* linear_animation_base.hpp */; }; + C9C7417B24FC4F0500EF9516 /* keyed_object_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740BC24FC4F0400EF9516 /* keyed_object_base.hpp */; }; + C9C7417C24FC4F0500EF9516 /* keyframe_double_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740BD24FC4F0400EF9516 /* keyframe_double_base.hpp */; }; + C9C7417D24FC4F0500EF9516 /* linear_gradient_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C024FC4F0400EF9516 /* linear_gradient_base.hpp */; }; + C9C7417E24FC4F0500EF9516 /* stroke_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C124FC4F0400EF9516 /* stroke_base.hpp */; }; + C9C7417F24FC4F0500EF9516 /* fill_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C224FC4F0400EF9516 /* fill_base.hpp */; }; + C9C7418024FC4F0500EF9516 /* shape_paint_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C324FC4F0400EF9516 /* shape_paint_base.hpp */; }; + C9C7418124FC4F0500EF9516 /* solid_color_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C424FC4F0400EF9516 /* solid_color_base.hpp */; }; + C9C7418224FC4F0500EF9516 /* radial_gradient_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C524FC4F0400EF9516 /* radial_gradient_base.hpp */; }; + C9C7418324FC4F0500EF9516 /* gradient_stop_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C624FC4F0400EF9516 /* gradient_stop_base.hpp */; }; + C9C7418424FC4F0500EF9516 /* parametric_path_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C724FC4F0400EF9516 /* parametric_path_base.hpp */; }; + C9C7418524FC4F0500EF9516 /* cubic_asymmetric_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C824FC4F0400EF9516 /* cubic_asymmetric_vertex_base.hpp */; }; + C9C7418624FC4F0500EF9516 /* cubic_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740C924FC4F0400EF9516 /* cubic_vertex_base.hpp */; }; + C9C7418724FC4F0500EF9516 /* ellipse_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CA24FC4F0400EF9516 /* ellipse_base.hpp */; }; + C9C7418824FC4F0500EF9516 /* path_composer_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CB24FC4F0400EF9516 /* path_composer_base.hpp */; }; + C9C7418924FC4F0500EF9516 /* points_path_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CC24FC4F0400EF9516 /* points_path_base.hpp */; }; + C9C7418A24FC4F0500EF9516 /* triangle_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CD24FC4F0400EF9516 /* triangle_base.hpp */; }; + C9C7418B24FC4F0500EF9516 /* shape_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CE24FC4F0400EF9516 /* shape_base.hpp */; }; + C9C7418C24FC4F0500EF9516 /* rectangle_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740CF24FC4F0400EF9516 /* rectangle_base.hpp */; }; + C9C7418D24FC4F0500EF9516 /* cubic_mirrored_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D024FC4F0400EF9516 /* cubic_mirrored_vertex_base.hpp */; }; + C9C7418E24FC4F0500EF9516 /* straight_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D124FC4F0400EF9516 /* straight_vertex_base.hpp */; }; + C9C7418F24FC4F0500EF9516 /* path_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D224FC4F0400EF9516 /* path_base.hpp */; }; + C9C7419024FC4F0500EF9516 /* cubic_detached_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D324FC4F0400EF9516 /* cubic_detached_vertex_base.hpp */; }; + C9C7419124FC4F0500EF9516 /* clipping_shape_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D424FC4F0400EF9516 /* clipping_shape_base.hpp */; }; + C9C7419224FC4F0500EF9516 /* path_vertex_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D524FC4F0400EF9516 /* path_vertex_base.hpp */; }; + C9C7419324FC4F0500EF9516 /* container_component_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D624FC4F0400EF9516 /* container_component_base.hpp */; }; + C9C7419424FC4F0500EF9516 /* component_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D724FC4F0400EF9516 /* component_base.hpp */; }; + C9C7419524FC4F0500EF9516 /* weight_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740D924FC4F0400EF9516 /* weight_base.hpp */; }; + C9C7419624FC4F0500EF9516 /* root_bone_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DA24FC4F0400EF9516 /* root_bone_base.hpp */; }; + C9C7419724FC4F0500EF9516 /* cubic_weight_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DB24FC4F0400EF9516 /* cubic_weight_base.hpp */; }; + C9C7419824FC4F0500EF9516 /* bone_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DC24FC4F0400EF9516 /* bone_base.hpp */; }; + C9C7419924FC4F0500EF9516 /* skin_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DD24FC4F0400EF9516 /* skin_base.hpp */; }; + C9C7419A24FC4F0500EF9516 /* tendon_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DE24FC4F0400EF9516 /* tendon_base.hpp */; }; + C9C7419B24FC4F0500EF9516 /* skeletal_component_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740DF24FC4F0400EF9516 /* skeletal_component_base.hpp */; }; + C9C7419C24FC4F0500EF9516 /* backboard_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E024FC4F0400EF9516 /* backboard_base.hpp */; }; + C9C7419D24FC4F0500EF9516 /* drawable_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E124FC4F0400EF9516 /* drawable_base.hpp */; }; + C9C7419E24FC4F0500EF9516 /* backboard.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E224FC4F0400EF9516 /* backboard.hpp */; }; + C9C7419F24FC4F0500EF9516 /* reader.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E424FC4F0400EF9516 /* reader.h */; }; + C9C741A024FC4F0500EF9516 /* core_color_type.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E624FC4F0400EF9516 /* core_color_type.hpp */; }; + C9C741A124FC4F0500EF9516 /* core_uint_type.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E724FC4F0400EF9516 /* core_uint_type.hpp */; }; + C9C741A224FC4F0500EF9516 /* core_double_type.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E824FC4F0400EF9516 /* core_double_type.hpp */; }; + C9C741A324FC4F0500EF9516 /* core_string_type.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740E924FC4F0400EF9516 /* core_string_type.hpp */; }; + C9C741A424FC4F0500EF9516 /* core_bool_type.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740EA24FC4F0400EF9516 /* core_bool_type.hpp */; }; + C9C741A524FC4F0500EF9516 /* binary_reader.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740EB24FC4F0400EF9516 /* binary_reader.hpp */; }; + C9C741A624FC4F0500EF9516 /* status_code.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740EC24FC4F0400EF9516 /* status_code.hpp */; }; + C9C741A724FC4F0500EF9516 /* component_dirt.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740ED24FC4F0400EF9516 /* component_dirt.hpp */; }; + C9C741A824FC4F0500EF9516 /* renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740EE24FC4F0400EF9516 /* renderer.hpp */; }; + C9C741AA24FC4F0500EF9516 /* file.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F024FC4F0400EF9516 /* file.hpp */; }; + C9C741AB24FC4F0500EF9516 /* container_component.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F124FC4F0400EF9516 /* container_component.hpp */; }; + C9C741AC24FC4F0500EF9516 /* cubic_interpolator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F324FC4F0500EF9516 /* cubic_interpolator.hpp */; }; + C9C741AD24FC4F0500EF9516 /* keyed_property.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F424FC4F0500EF9516 /* keyed_property.hpp */; }; + C9C741B024FC4F0500EF9516 /* animation.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F724FC4F0500EF9516 /* animation.hpp */; }; + C9C741B124FC4F0500EF9516 /* keyframe.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F824FC4F0500EF9516 /* keyframe.hpp */; }; + C9C741B224FC4F0500EF9516 /* keyed_object.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740F924FC4F0500EF9516 /* keyed_object.hpp */; }; + C9C741B324FC4F0500EF9516 /* linear_animation.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740FA24FC4F0500EF9516 /* linear_animation.hpp */; }; + C9C741B424FC4F0500EF9516 /* linear_animation_instance.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740FB24FC4F0500EF9516 /* linear_animation_instance.hpp */; }; + C9C741B524FC4F0500EF9516 /* keyframe_double.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740FC24FC4F0500EF9516 /* keyframe_double.hpp */; }; + C9C741B624FC4F0500EF9516 /* loop.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740FD24FC4F0500EF9516 /* loop.hpp */; }; + C9C741B724FC4F0500EF9516 /* keyframe_color.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C740FE24FC4F0500EF9516 /* keyframe_color.hpp */; }; + C9C741CC24FC4F0500EF9516 /* shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7411524FC4F0500EF9516 /* shape.hpp */; }; + C9C741CF24FC4F0500EF9516 /* path_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7411824FC4F0500EF9516 /* path_vertex.hpp */; }; + C9C741D124FC4F0500EF9516 /* rectangle.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7411A24FC4F0500EF9516 /* rectangle.hpp */; }; + C9C741D224FC4F0500EF9516 /* points_path.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7411B24FC4F0500EF9516 /* points_path.hpp */; }; + C9C741D424FC4F0500EF9516 /* cubic_detached_vertex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7411D24FC4F0500EF9516 /* cubic_detached_vertex.hpp */; }; + C9C741D624FC4F0500EF9516 /* mat2d.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412024FC4F0500EF9516 /* mat2d.hpp */; }; + C9C741D724FC4F0500EF9516 /* aabb.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412124FC4F0500EF9516 /* aabb.hpp */; }; + C9C741DA24FC4F0500EF9516 /* circle_constant.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412424FC4F0500EF9516 /* circle_constant.hpp */; }; + C9C741DB24FC4F0500EF9516 /* component.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412524FC4F0500EF9516 /* component.hpp */; }; + C9C741DC24FC4F0500EF9516 /* node.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412624FC4F0500EF9516 /* node.hpp */; }; + C9C741DD24FC4F0500EF9516 /* layout.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412724FC4F0500EF9516 /* layout.hpp */; }; + C9C741DE24FC4F0500EF9516 /* drawable.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412824FC4F0500EF9516 /* drawable.hpp */; }; + C9C741DF24FC4F0500EF9516 /* artboard.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412924FC4F0500EF9516 /* artboard.hpp */; }; + C9C741E024FC4F0500EF9516 /* dependency_sorter.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412A24FC4F0500EF9516 /* dependency_sorter.hpp */; }; + C9C741E124FC4F0500EF9516 /* core_context.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412B24FC4F0500EF9516 /* core_context.hpp */; }; + C9C741E224FC4F0500EF9516 /* tendon.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412D24FC4F0500EF9516 /* tendon.hpp */; }; + C9C741E324FC4F0500EF9516 /* skeletal_component.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412E24FC4F0500EF9516 /* skeletal_component.hpp */; }; + C9C741E424FC4F0500EF9516 /* weight.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7412F24FC4F0500EF9516 /* weight.hpp */; }; + C9C741E524FC4F0500EF9516 /* skin.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413024FC4F0500EF9516 /* skin.hpp */; }; + C9C741E624FC4F0500EF9516 /* root_bone.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413124FC4F0500EF9516 /* root_bone.hpp */; }; + C9C741E724FC4F0500EF9516 /* bone.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413224FC4F0500EF9516 /* bone.hpp */; }; + C9C741E824FC4F0500EF9516 /* skinnable.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413324FC4F0500EF9516 /* skinnable.hpp */; }; + C9C741E924FC4F0500EF9516 /* cubic_weight.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413424FC4F0500EF9516 /* cubic_weight.hpp */; }; + C9C741EA24FC4F0500EF9516 /* core.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413524FC4F0500EF9516 /* core.hpp */; }; + C9C741EB24FC4F0500EF9516 /* transform_component.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9C7413624FC4F0500EF9516 /* transform_component.hpp */; }; + C9C741F424FC510200EF9516 /* Rive.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C741F224FC510200EF9516 /* Rive.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9C741F524FC510200EF9516 /* Rive.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9C741F324FC510200EF9516 /* Rive.mm */; }; + C9D60DAA2512B01600AAA3A6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D60DA92512B01600AAA3A6 /* CoreGraphics.framework */; }; + C9D60DAC2512B04B00AAA3A6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D60DAB2512B04B00AAA3A6 /* QuartzCore.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C9C73EDC24FC478900EF9516 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C9C73EC824FC478800EF9516 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C9C73ED024FC478800EF9516; + remoteInfo = RiveRuntime; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + C9601F21250C143A0032AA07 /* RiveViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RiveViewController.h; sourceTree = ""; }; + C9601F22250C143A0032AA07 /* RiveViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RiveViewController.mm; sourceTree = ""; }; + C9601F25250C14560032AA07 /* RiveView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RiveView.h; sourceTree = ""; }; + C9601F26250C14560032AA07 /* RiveView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RiveView.mm; sourceTree = ""; }; + C9601F29250C25830032AA07 /* RiveRenderer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RiveRenderer.hpp; sourceTree = ""; }; + C9601F2A250C25930032AA07 /* RiveRenderer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RiveRenderer.mm; sourceTree = ""; }; + C9601F2D251004770032AA07 /* vec2d.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec2d.hpp; sourceTree = ""; }; + C9601F2E251004770032AA07 /* mat2d.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat2d.hpp; sourceTree = ""; }; + C9601F2F251004770032AA07 /* aabb.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = aabb.hpp; sourceTree = ""; }; + C9601F30251004770032AA07 /* color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color.hpp; sourceTree = ""; }; + C9601F31251004770032AA07 /* transform_components.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform_components.hpp; sourceTree = ""; }; + C9601F32251004770032AA07 /* circle_constant.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = circle_constant.hpp; sourceTree = ""; }; + C9601F33251004770032AA07 /* stroke_effect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = stroke_effect.hpp; path = shapes/paint/stroke_effect.hpp; sourceTree = ""; }; + C9601F34251004770032AA07 /* trim_path_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = trim_path_base.hpp; path = generated/shapes/paint/trim_path_base.hpp; sourceTree = ""; }; + C9601F35251004780032AA07 /* command_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = command_path.hpp; sourceTree = ""; }; + C9601F36251004780032AA07 /* metrics_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = metrics_path.hpp; path = shapes/metrics_path.hpp; sourceTree = ""; }; + C9601F38251004780032AA07 /* stroke_cap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_cap.hpp; sourceTree = ""; }; + C9601F39251004780032AA07 /* gradient_stop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gradient_stop.hpp; sourceTree = ""; }; + C9601F3A251004780032AA07 /* stroke.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke.hpp; sourceTree = ""; }; + C9601F3B251004780032AA07 /* shape_paint_mutator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_mutator.hpp; sourceTree = ""; }; + C9601F3C251004780032AA07 /* blend_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = blend_mode.hpp; sourceTree = ""; }; + C9601F3D251004780032AA07 /* shape_paint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint.hpp; sourceTree = ""; }; + C9601F3E251004780032AA07 /* stroke_join.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_join.hpp; sourceTree = ""; }; + C9601F3F251004780032AA07 /* fill.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fill.hpp; sourceTree = ""; }; + C9601F40251004780032AA07 /* radial_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = radial_gradient.hpp; sourceTree = ""; }; + C9601F41251004780032AA07 /* trim_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = trim_path.hpp; sourceTree = ""; }; + C9601F42251004780032AA07 /* color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color.hpp; sourceTree = ""; }; + C9601F43251004780032AA07 /* solid_color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_color.hpp; sourceTree = ""; }; + C9601F44251004780032AA07 /* linear_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_gradient.hpp; sourceTree = ""; }; + C9601F45251004780032AA07 /* stroke_effect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_effect.hpp; sourceTree = ""; }; + C9601F46251004780032AA07 /* trim_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = trim_path.hpp; path = shapes/paint/trim_path.hpp; sourceTree = ""; }; + C9601F48251004780032AA07 /* straight_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = straight_vertex.hpp; sourceTree = ""; }; + C9601F4A251004780032AA07 /* stroke_cap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_cap.hpp; sourceTree = ""; }; + C9601F4B251004780032AA07 /* gradient_stop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gradient_stop.hpp; sourceTree = ""; }; + C9601F4C251004780032AA07 /* stroke.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke.hpp; sourceTree = ""; }; + C9601F4D251004780032AA07 /* shape_paint_mutator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_mutator.hpp; sourceTree = ""; }; + C9601F4E251004780032AA07 /* blend_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = blend_mode.hpp; sourceTree = ""; }; + C9601F4F251004780032AA07 /* shape_paint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint.hpp; sourceTree = ""; }; + C9601F50251004780032AA07 /* stroke_join.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_join.hpp; sourceTree = ""; }; + C9601F51251004780032AA07 /* fill.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fill.hpp; sourceTree = ""; }; + C9601F52251004780032AA07 /* radial_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = radial_gradient.hpp; sourceTree = ""; }; + C9601F53251004780032AA07 /* trim_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = trim_path.hpp; sourceTree = ""; }; + C9601F54251004780032AA07 /* color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color.hpp; sourceTree = ""; }; + C9601F55251004780032AA07 /* solid_color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_color.hpp; sourceTree = ""; }; + C9601F56251004780032AA07 /* linear_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_gradient.hpp; sourceTree = ""; }; + C9601F57251004780032AA07 /* stroke_effect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_effect.hpp; sourceTree = ""; }; + C9601F58251004780032AA07 /* path_composer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_composer.hpp; sourceTree = ""; }; + C9601F59251004780032AA07 /* shape_paint_container.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_container.hpp; sourceTree = ""; }; + C9601F5A251004780032AA07 /* cubic_mirrored_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_mirrored_vertex.hpp; sourceTree = ""; }; + C9601F5B251004780032AA07 /* path_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_space.hpp; sourceTree = ""; }; + C9601F5C251004780032AA07 /* ellipse.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ellipse.hpp; sourceTree = ""; }; + C9601F5D251004780032AA07 /* clipping_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = clipping_shape.hpp; sourceTree = ""; }; + C9601F5E251004780032AA07 /* metrics_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = metrics_path.hpp; sourceTree = ""; }; + C9601F5F251004780032AA07 /* cubic_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_vertex.hpp; sourceTree = ""; }; + C9601F60251004780032AA07 /* shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape.hpp; sourceTree = ""; }; + C9601F61251004780032AA07 /* triangle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = triangle.hpp; sourceTree = ""; }; + C9601F62251004780032AA07 /* path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path.hpp; sourceTree = ""; }; + C9601F63251004780032AA07 /* path_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_vertex.hpp; sourceTree = ""; }; + C9601F64251004780032AA07 /* parametric_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parametric_path.hpp; sourceTree = ""; }; + C9601F65251004780032AA07 /* rectangle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rectangle.hpp; sourceTree = ""; }; + C9601F66251004780032AA07 /* points_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = points_path.hpp; sourceTree = ""; }; + C9601F67251004780032AA07 /* cubic_asymmetric_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_asymmetric_vertex.hpp; sourceTree = ""; }; + C9601F68251004780032AA07 /* cubic_detached_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_detached_vertex.hpp; sourceTree = ""; }; + C9601FA2251004950032AA07 /* trim_path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = trim_path.cpp; path = shapes/paint/trim_path.cpp; sourceTree = ""; }; + C9601FA3251004950032AA07 /* metrics_path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metrics_path.cpp; sourceTree = ""; }; + C9601FA5251004950032AA07 /* solid_color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = solid_color.cpp; sourceTree = ""; }; + C9601FA6251004950032AA07 /* linear_gradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linear_gradient.cpp; sourceTree = ""; }; + C9601FA7251004950032AA07 /* shape_paint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape_paint.cpp; sourceTree = ""; }; + C9601FA8251004950032AA07 /* fill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fill.cpp; sourceTree = ""; }; + C9601FA9251004950032AA07 /* radial_gradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = radial_gradient.cpp; sourceTree = ""; }; + C9601FAA251004950032AA07 /* color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = color.cpp; sourceTree = ""; }; + C9601FAB251004950032AA07 /* trim_path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = trim_path.cpp; sourceTree = ""; }; + C9601FAC251004950032AA07 /* shape_paint_mutator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape_paint_mutator.cpp; sourceTree = ""; }; + C9601FAD251004950032AA07 /* gradient_stop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gradient_stop.cpp; sourceTree = ""; }; + C9601FAE251004950032AA07 /* stroke.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stroke.cpp; sourceTree = ""; }; + C960285A251FD59800704818 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + C98F296E2513FA8B0076E802 /* keyframe_id.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_id.hpp; sourceTree = ""; }; + C98F29722513FAAE0076E802 /* draw_rules.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = draw_rules.hpp; sourceTree = ""; }; + C98F29732513FAAE0076E802 /* draw_target_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = draw_target_base.hpp; path = generated/draw_target_base.hpp; sourceTree = ""; }; + C98F29742513FAAE0076E802 /* draw_rules_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = draw_rules_base.hpp; path = generated/draw_rules_base.hpp; sourceTree = ""; }; + C98F29752513FAAE0076E802 /* draw_target_placement.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = draw_target_placement.hpp; sourceTree = ""; }; + C98F29762513FAAE0076E802 /* draw_target.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = draw_target.hpp; sourceTree = ""; }; + C98F29772513FAAE0076E802 /* keyframe_id_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = keyframe_id_base.hpp; path = generated/animation/keyframe_id_base.hpp; sourceTree = ""; }; + C98F29802513FAC30076E802 /* draw_target.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = draw_target.cpp; sourceTree = ""; }; + C98F29812513FAC30076E802 /* keyframe_id.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = keyframe_id.cpp; path = animation/keyframe_id.cpp; sourceTree = ""; }; + C98F29822513FAC30076E802 /* draw_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = draw_rules.cpp; sourceTree = ""; }; + C9C73ED124FC478800EF9516 /* RiveRuntime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RiveRuntime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C9C73ED424FC478800EF9516 /* RiveRuntime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RiveRuntime.h; sourceTree = ""; }; + C9C73ED524FC478800EF9516 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C9C73EDA24FC478900EF9516 /* RiveRuntimeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RiveRuntimeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + C9C73EDF24FC478900EF9516 /* RiveRuntimeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RiveRuntimeTests.m; sourceTree = ""; }; + C9C73EE124FC478900EF9516 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C9C7407024FC4F0400EF9516 /* core_bool_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_bool_type.cpp; sourceTree = ""; }; + C9C7407124FC4F0400EF9516 /* core_uint_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_uint_type.cpp; sourceTree = ""; }; + C9C7407224FC4F0400EF9516 /* core_double_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_double_type.cpp; sourceTree = ""; }; + C9C7407324FC4F0400EF9516 /* core_string_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_string_type.cpp; sourceTree = ""; }; + C9C7407424FC4F0400EF9516 /* core_color_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_color_type.cpp; sourceTree = ""; }; + C9C7407524FC4F0400EF9516 /* binary_reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary_reader.cpp; sourceTree = ""; }; + C9C7407624FC4F0400EF9516 /* transform_component.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transform_component.cpp; sourceTree = ""; }; + C9C7407724FC4F0400EF9516 /* component.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = component.cpp; sourceTree = ""; }; + C9C7407824FC4F0400EF9516 /* node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node.cpp; sourceTree = ""; }; + C9C7407924FC4F0400EF9516 /* layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = layout.cpp; sourceTree = ""; }; + C9C7407B24FC4F0400EF9516 /* keyframe_color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keyframe_color.cpp; sourceTree = ""; }; + C9C7407C24FC4F0400EF9516 /* keyed_object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keyed_object.cpp; sourceTree = ""; }; + C9C7407D24FC4F0400EF9516 /* linear_animation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linear_animation.cpp; sourceTree = ""; }; + C9C7407E24FC4F0400EF9516 /* linear_animation_instance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linear_animation_instance.cpp; sourceTree = ""; }; + C9C7407F24FC4F0400EF9516 /* keyframe_double.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keyframe_double.cpp; sourceTree = ""; }; + C9C7408024FC4F0400EF9516 /* keyframe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keyframe.cpp; sourceTree = ""; }; + C9C7408124FC4F0400EF9516 /* cubic_interpolator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cubic_interpolator.cpp; sourceTree = ""; }; + C9C7408224FC4F0400EF9516 /* keyed_property.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keyed_property.cpp; sourceTree = ""; }; + C9C7408424FC4F0400EF9516 /* drawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drawable.cpp; sourceTree = ""; }; + C9C7408724FC4F0400EF9516 /* solid_color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = solid_color.cpp; sourceTree = ""; }; + C9C7408824FC4F0400EF9516 /* linear_gradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linear_gradient.cpp; sourceTree = ""; }; + C9C7408924FC4F0400EF9516 /* shape_paint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape_paint.cpp; sourceTree = ""; }; + C9C7408A24FC4F0400EF9516 /* fill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fill.cpp; sourceTree = ""; }; + C9C7408B24FC4F0400EF9516 /* radial_gradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = radial_gradient.cpp; sourceTree = ""; }; + C9C7408C24FC4F0400EF9516 /* color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = color.cpp; sourceTree = ""; }; + C9C7408D24FC4F0400EF9516 /* shape_paint_mutator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape_paint_mutator.cpp; sourceTree = ""; }; + C9C7408E24FC4F0400EF9516 /* gradient_stop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gradient_stop.cpp; sourceTree = ""; }; + C9C7408F24FC4F0400EF9516 /* stroke.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stroke.cpp; sourceTree = ""; }; + C9C7409024FC4F0400EF9516 /* points_path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = points_path.cpp; sourceTree = ""; }; + C9C7409124FC4F0400EF9516 /* cubic_asymmetric_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cubic_asymmetric_vertex.cpp; sourceTree = ""; }; + C9C7409224FC4F0400EF9516 /* cubic_detached_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cubic_detached_vertex.cpp; sourceTree = ""; }; + C9C7409324FC4F0400EF9516 /* cubic_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cubic_vertex.cpp; sourceTree = ""; }; + C9C7409424FC4F0400EF9516 /* shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape.cpp; sourceTree = ""; }; + C9C7409524FC4F0400EF9516 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path.cpp; sourceTree = ""; }; + C9C7409624FC4F0400EF9516 /* parametric_path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parametric_path.cpp; sourceTree = ""; }; + C9C7409724FC4F0400EF9516 /* path_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path_vertex.cpp; sourceTree = ""; }; + C9C7409824FC4F0400EF9516 /* rectangle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rectangle.cpp; sourceTree = ""; }; + C9C7409924FC4F0400EF9516 /* straight_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = straight_vertex.cpp; sourceTree = ""; }; + C9C7409A24FC4F0400EF9516 /* path_composer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path_composer.cpp; sourceTree = ""; }; + C9C7409B24FC4F0400EF9516 /* shape_paint_container.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape_paint_container.cpp; sourceTree = ""; }; + C9C7409C24FC4F0400EF9516 /* cubic_mirrored_vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cubic_mirrored_vertex.cpp; sourceTree = ""; }; + C9C7409D24FC4F0400EF9516 /* ellipse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ellipse.cpp; sourceTree = ""; }; + C9C7409E24FC4F0400EF9516 /* clipping_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = clipping_shape.cpp; sourceTree = ""; }; + C9C740A024FC4F0400EF9516 /* aabb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aabb.cpp; sourceTree = ""; }; + C9C740A124FC4F0400EF9516 /* vec2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vec2d.cpp; sourceTree = ""; }; + C9C740A224FC4F0400EF9516 /* mat2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mat2d.cpp; sourceTree = ""; }; + C9C740A324FC4F0400EF9516 /* dependency_sorter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dependency_sorter.cpp; sourceTree = ""; }; + C9C740A424FC4F0400EF9516 /* artboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = artboard.cpp; sourceTree = ""; }; + C9C740A524FC4F0400EF9516 /* file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file.cpp; sourceTree = ""; }; + C9C740A724FC4F0400EF9516 /* root_bone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = root_bone.cpp; sourceTree = ""; }; + C9C740A824FC4F0400EF9516 /* bone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bone.cpp; sourceTree = ""; }; + C9C740A924FC4F0400EF9516 /* skinnable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = skinnable.cpp; sourceTree = ""; }; + C9C740AA24FC4F0400EF9516 /* weight.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weight.cpp; sourceTree = ""; }; + C9C740AB24FC4F0400EF9516 /* skin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = skin.cpp; sourceTree = ""; }; + C9C740AC24FC4F0400EF9516 /* tendon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tendon.cpp; sourceTree = ""; }; + C9C740AF24FC4F0400EF9516 /* core_registry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_registry.hpp; sourceTree = ""; }; + C9C740B024FC4F0400EF9516 /* node_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = node_base.hpp; sourceTree = ""; }; + C9C740B124FC4F0400EF9516 /* transform_component_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform_component_base.hpp; sourceTree = ""; }; + C9C740B224FC4F0400EF9516 /* artboard_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = artboard_base.hpp; sourceTree = ""; }; + C9C740B424FC4F0400EF9516 /* keyframe_color_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_color_base.hpp; sourceTree = ""; }; + C9C740B524FC4F0400EF9516 /* keyed_property_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyed_property_base.hpp; sourceTree = ""; }; + C9C740B624FC4F0400EF9516 /* keyframe_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_base.hpp; sourceTree = ""; }; + C9C740B724FC4F0400EF9516 /* animation_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = animation_base.hpp; sourceTree = ""; }; + C9C740B824FC4F0400EF9516 /* cubic_interpolator_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_interpolator_base.hpp; sourceTree = ""; }; + C9C740B924FC4F0400EF9516 /* keyframe_draw_order_value_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_draw_order_value_base.hpp; sourceTree = ""; }; + C9C740BA24FC4F0400EF9516 /* keyframe_draw_order_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_draw_order_base.hpp; sourceTree = ""; }; + C9C740BB24FC4F0400EF9516 /* linear_animation_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_animation_base.hpp; sourceTree = ""; }; + C9C740BC24FC4F0400EF9516 /* keyed_object_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyed_object_base.hpp; sourceTree = ""; }; + C9C740BD24FC4F0400EF9516 /* keyframe_double_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_double_base.hpp; sourceTree = ""; }; + C9C740C024FC4F0400EF9516 /* linear_gradient_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_gradient_base.hpp; sourceTree = ""; }; + C9C740C124FC4F0400EF9516 /* stroke_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_base.hpp; sourceTree = ""; }; + C9C740C224FC4F0400EF9516 /* fill_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fill_base.hpp; sourceTree = ""; }; + C9C740C324FC4F0400EF9516 /* shape_paint_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_base.hpp; sourceTree = ""; }; + C9C740C424FC4F0400EF9516 /* solid_color_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_color_base.hpp; sourceTree = ""; }; + C9C740C524FC4F0400EF9516 /* radial_gradient_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = radial_gradient_base.hpp; sourceTree = ""; }; + C9C740C624FC4F0400EF9516 /* gradient_stop_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gradient_stop_base.hpp; sourceTree = ""; }; + C9C740C724FC4F0400EF9516 /* parametric_path_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parametric_path_base.hpp; sourceTree = ""; }; + C9C740C824FC4F0400EF9516 /* cubic_asymmetric_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_asymmetric_vertex_base.hpp; sourceTree = ""; }; + C9C740C924FC4F0400EF9516 /* cubic_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_vertex_base.hpp; sourceTree = ""; }; + C9C740CA24FC4F0400EF9516 /* ellipse_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ellipse_base.hpp; sourceTree = ""; }; + C9C740CB24FC4F0400EF9516 /* path_composer_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_composer_base.hpp; sourceTree = ""; }; + C9C740CC24FC4F0400EF9516 /* points_path_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = points_path_base.hpp; sourceTree = ""; }; + C9C740CD24FC4F0400EF9516 /* triangle_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = triangle_base.hpp; sourceTree = ""; }; + C9C740CE24FC4F0400EF9516 /* shape_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_base.hpp; sourceTree = ""; }; + C9C740CF24FC4F0400EF9516 /* rectangle_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rectangle_base.hpp; sourceTree = ""; }; + C9C740D024FC4F0400EF9516 /* cubic_mirrored_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_mirrored_vertex_base.hpp; sourceTree = ""; }; + C9C740D124FC4F0400EF9516 /* straight_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = straight_vertex_base.hpp; sourceTree = ""; }; + C9C740D224FC4F0400EF9516 /* path_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_base.hpp; sourceTree = ""; }; + C9C740D324FC4F0400EF9516 /* cubic_detached_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_detached_vertex_base.hpp; sourceTree = ""; }; + C9C740D424FC4F0400EF9516 /* clipping_shape_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = clipping_shape_base.hpp; sourceTree = ""; }; + C9C740D524FC4F0400EF9516 /* path_vertex_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_vertex_base.hpp; sourceTree = ""; }; + C9C740D624FC4F0400EF9516 /* container_component_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = container_component_base.hpp; sourceTree = ""; }; + C9C740D724FC4F0400EF9516 /* component_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = component_base.hpp; sourceTree = ""; }; + C9C740D924FC4F0400EF9516 /* weight_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weight_base.hpp; sourceTree = ""; }; + C9C740DA24FC4F0400EF9516 /* root_bone_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = root_bone_base.hpp; sourceTree = ""; }; + C9C740DB24FC4F0400EF9516 /* cubic_weight_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_weight_base.hpp; sourceTree = ""; }; + C9C740DC24FC4F0400EF9516 /* bone_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bone_base.hpp; sourceTree = ""; }; + C9C740DD24FC4F0400EF9516 /* skin_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skin_base.hpp; sourceTree = ""; }; + C9C740DE24FC4F0400EF9516 /* tendon_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tendon_base.hpp; sourceTree = ""; }; + C9C740DF24FC4F0400EF9516 /* skeletal_component_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skeletal_component_base.hpp; sourceTree = ""; }; + C9C740E024FC4F0400EF9516 /* backboard_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = backboard_base.hpp; sourceTree = ""; }; + C9C740E124FC4F0400EF9516 /* drawable_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drawable_base.hpp; sourceTree = ""; }; + C9C740E224FC4F0400EF9516 /* backboard.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = backboard.hpp; sourceTree = ""; }; + C9C740E424FC4F0400EF9516 /* reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = ""; }; + C9C740E624FC4F0400EF9516 /* core_color_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_color_type.hpp; sourceTree = ""; }; + C9C740E724FC4F0400EF9516 /* core_uint_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_uint_type.hpp; sourceTree = ""; }; + C9C740E824FC4F0400EF9516 /* core_double_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_double_type.hpp; sourceTree = ""; }; + C9C740E924FC4F0400EF9516 /* core_string_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_string_type.hpp; sourceTree = ""; }; + C9C740EA24FC4F0400EF9516 /* core_bool_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_bool_type.hpp; sourceTree = ""; }; + C9C740EB24FC4F0400EF9516 /* binary_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = binary_reader.hpp; sourceTree = ""; }; + C9C740EC24FC4F0400EF9516 /* status_code.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = status_code.hpp; sourceTree = ""; }; + C9C740ED24FC4F0400EF9516 /* component_dirt.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = component_dirt.hpp; sourceTree = ""; }; + C9C740EE24FC4F0400EF9516 /* renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = renderer.hpp; sourceTree = ""; }; + C9C740EF24FC4F0400EF9516 /* runtime_header.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = runtime_header.hpp; sourceTree = ""; }; + C9C740F024FC4F0400EF9516 /* file.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file.hpp; sourceTree = ""; }; + C9C740F124FC4F0400EF9516 /* container_component.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = container_component.hpp; sourceTree = ""; }; + C9C740F324FC4F0500EF9516 /* cubic_interpolator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_interpolator.hpp; sourceTree = ""; }; + C9C740F424FC4F0500EF9516 /* keyed_property.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyed_property.hpp; sourceTree = ""; }; + C9C740F724FC4F0500EF9516 /* animation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = animation.hpp; sourceTree = ""; }; + C9C740F824FC4F0500EF9516 /* keyframe.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe.hpp; sourceTree = ""; }; + C9C740F924FC4F0500EF9516 /* keyed_object.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyed_object.hpp; sourceTree = ""; }; + C9C740FA24FC4F0500EF9516 /* linear_animation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_animation.hpp; sourceTree = ""; }; + C9C740FB24FC4F0500EF9516 /* linear_animation_instance.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_animation_instance.hpp; sourceTree = ""; }; + C9C740FC24FC4F0500EF9516 /* keyframe_double.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_double.hpp; sourceTree = ""; }; + C9C740FD24FC4F0500EF9516 /* loop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = loop.hpp; sourceTree = ""; }; + C9C740FE24FC4F0500EF9516 /* keyframe_color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keyframe_color.hpp; sourceTree = ""; }; + C9C7410024FC4F0500EF9516 /* straight_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = straight_vertex.hpp; sourceTree = ""; }; + C9C7410224FC4F0500EF9516 /* stroke_cap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_cap.hpp; sourceTree = ""; }; + C9C7410324FC4F0500EF9516 /* gradient_stop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gradient_stop.hpp; sourceTree = ""; }; + C9C7410424FC4F0500EF9516 /* stroke.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke.hpp; sourceTree = ""; }; + C9C7410524FC4F0500EF9516 /* shape_paint_mutator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_mutator.hpp; sourceTree = ""; }; + C9C7410624FC4F0500EF9516 /* blend_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = blend_mode.hpp; sourceTree = ""; }; + C9C7410724FC4F0500EF9516 /* shape_paint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint.hpp; sourceTree = ""; }; + C9C7410824FC4F0500EF9516 /* stroke_join.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stroke_join.hpp; sourceTree = ""; }; + C9C7410924FC4F0500EF9516 /* fill.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fill.hpp; sourceTree = ""; }; + C9C7410A24FC4F0500EF9516 /* radial_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = radial_gradient.hpp; sourceTree = ""; }; + C9C7410B24FC4F0500EF9516 /* color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color.hpp; sourceTree = ""; }; + C9C7410C24FC4F0500EF9516 /* solid_color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_color.hpp; sourceTree = ""; }; + C9C7410D24FC4F0500EF9516 /* linear_gradient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linear_gradient.hpp; sourceTree = ""; }; + C9C7410E24FC4F0500EF9516 /* path_composer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_composer.hpp; sourceTree = ""; }; + C9C7410F24FC4F0500EF9516 /* shape_paint_container.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_paint_container.hpp; sourceTree = ""; }; + C9C7411024FC4F0500EF9516 /* cubic_mirrored_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_mirrored_vertex.hpp; sourceTree = ""; }; + C9C7411124FC4F0500EF9516 /* path_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_space.hpp; sourceTree = ""; }; + C9C7411224FC4F0500EF9516 /* ellipse.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ellipse.hpp; sourceTree = ""; }; + C9C7411324FC4F0500EF9516 /* clipping_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = clipping_shape.hpp; sourceTree = ""; }; + C9C7411424FC4F0500EF9516 /* cubic_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_vertex.hpp; sourceTree = ""; }; + C9C7411524FC4F0500EF9516 /* shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape.hpp; sourceTree = ""; }; + C9C7411624FC4F0500EF9516 /* triangle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = triangle.hpp; sourceTree = ""; }; + C9C7411724FC4F0500EF9516 /* path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path.hpp; sourceTree = ""; }; + C9C7411824FC4F0500EF9516 /* path_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_vertex.hpp; sourceTree = ""; }; + C9C7411924FC4F0500EF9516 /* parametric_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parametric_path.hpp; sourceTree = ""; }; + C9C7411A24FC4F0500EF9516 /* rectangle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rectangle.hpp; sourceTree = ""; }; + C9C7411B24FC4F0500EF9516 /* points_path.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = points_path.hpp; sourceTree = ""; }; + C9C7411C24FC4F0500EF9516 /* cubic_asymmetric_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_asymmetric_vertex.hpp; sourceTree = ""; }; + C9C7411D24FC4F0500EF9516 /* cubic_detached_vertex.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_detached_vertex.hpp; sourceTree = ""; }; + C9C7411F24FC4F0500EF9516 /* vec2d.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec2d.hpp; sourceTree = ""; }; + C9C7412024FC4F0500EF9516 /* mat2d.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat2d.hpp; sourceTree = ""; }; + C9C7412124FC4F0500EF9516 /* aabb.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = aabb.hpp; sourceTree = ""; }; + C9C7412224FC4F0500EF9516 /* color.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color.hpp; sourceTree = ""; }; + C9C7412324FC4F0500EF9516 /* transform_components.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform_components.hpp; sourceTree = ""; }; + C9C7412424FC4F0500EF9516 /* circle_constant.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = circle_constant.hpp; sourceTree = ""; }; + C9C7412524FC4F0500EF9516 /* component.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = component.hpp; sourceTree = ""; }; + C9C7412624FC4F0500EF9516 /* node.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = node.hpp; sourceTree = ""; }; + C9C7412724FC4F0500EF9516 /* layout.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = layout.hpp; sourceTree = ""; }; + C9C7412824FC4F0500EF9516 /* drawable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drawable.hpp; sourceTree = ""; }; + C9C7412924FC4F0500EF9516 /* artboard.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = artboard.hpp; sourceTree = ""; }; + C9C7412A24FC4F0500EF9516 /* dependency_sorter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dependency_sorter.hpp; sourceTree = ""; }; + C9C7412B24FC4F0500EF9516 /* core_context.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core_context.hpp; sourceTree = ""; }; + C9C7412D24FC4F0500EF9516 /* tendon.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tendon.hpp; sourceTree = ""; }; + C9C7412E24FC4F0500EF9516 /* skeletal_component.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skeletal_component.hpp; sourceTree = ""; }; + C9C7412F24FC4F0500EF9516 /* weight.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weight.hpp; sourceTree = ""; }; + C9C7413024FC4F0500EF9516 /* skin.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skin.hpp; sourceTree = ""; }; + C9C7413124FC4F0500EF9516 /* root_bone.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = root_bone.hpp; sourceTree = ""; }; + C9C7413224FC4F0500EF9516 /* bone.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bone.hpp; sourceTree = ""; }; + C9C7413324FC4F0500EF9516 /* skinnable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skinnable.hpp; sourceTree = ""; }; + C9C7413424FC4F0500EF9516 /* cubic_weight.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cubic_weight.hpp; sourceTree = ""; }; + C9C7413524FC4F0500EF9516 /* core.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core.hpp; sourceTree = ""; }; + C9C7413624FC4F0500EF9516 /* transform_component.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform_component.hpp; sourceTree = ""; }; + C9C741F224FC510200EF9516 /* Rive.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Rive.h; sourceTree = ""; }; + C9C741F324FC510200EF9516 /* Rive.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Rive.mm; sourceTree = ""; }; + C9D60DA92512B01600AAA3A6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + C9D60DAB2512B04B00AAA3A6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C9C73ECE24FC478800EF9516 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C960285B251FD59800704818 /* UIKit.framework in Frameworks */, + C9D60DAC2512B04B00AAA3A6 /* QuartzCore.framework in Frameworks */, + C9D60DAA2512B01600AAA3A6 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C9C73ED724FC478900EF9516 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C9601F20250C13D40032AA07 /* RiveKit */ = { + isa = PBXGroup; + children = ( + C9C741F224FC510200EF9516 /* Rive.h */, + C9C741F324FC510200EF9516 /* Rive.mm */, + C9601F29250C25830032AA07 /* RiveRenderer.hpp */, + C9601F2A250C25930032AA07 /* RiveRenderer.mm */, + C9601F25250C14560032AA07 /* RiveView.h */, + C9601F26250C14560032AA07 /* RiveView.mm */, + C9601F21250C143A0032AA07 /* RiveViewController.h */, + C9601F22250C143A0032AA07 /* RiveViewController.mm */, + ); + path = RiveKit; + sourceTree = ""; + }; + C9601F2C251004770032AA07 /* math */ = { + isa = PBXGroup; + children = ( + C9601F2D251004770032AA07 /* vec2d.hpp */, + C9601F2E251004770032AA07 /* mat2d.hpp */, + C9601F2F251004770032AA07 /* aabb.hpp */, + C9601F30251004770032AA07 /* color.hpp */, + C9601F31251004770032AA07 /* transform_components.hpp */, + C9601F32251004770032AA07 /* circle_constant.hpp */, + ); + path = math; + sourceTree = ""; + }; + C9601F37251004780032AA07 /* paint */ = { + isa = PBXGroup; + children = ( + C9601F38251004780032AA07 /* stroke_cap.hpp */, + C9601F39251004780032AA07 /* gradient_stop.hpp */, + C9601F3A251004780032AA07 /* stroke.hpp */, + C9601F3B251004780032AA07 /* shape_paint_mutator.hpp */, + C9601F3C251004780032AA07 /* blend_mode.hpp */, + C9601F3D251004780032AA07 /* shape_paint.hpp */, + C9601F3E251004780032AA07 /* stroke_join.hpp */, + C9601F3F251004780032AA07 /* fill.hpp */, + C9601F40251004780032AA07 /* radial_gradient.hpp */, + C9601F41251004780032AA07 /* trim_path.hpp */, + C9601F42251004780032AA07 /* color.hpp */, + C9601F43251004780032AA07 /* solid_color.hpp */, + C9601F44251004780032AA07 /* linear_gradient.hpp */, + C9601F45251004780032AA07 /* stroke_effect.hpp */, + ); + name = paint; + path = shapes/paint; + sourceTree = ""; + }; + C9601F47251004780032AA07 /* shapes */ = { + isa = PBXGroup; + children = ( + C9601F48251004780032AA07 /* straight_vertex.hpp */, + C9601F49251004780032AA07 /* paint */, + C9601F58251004780032AA07 /* path_composer.hpp */, + C9601F59251004780032AA07 /* shape_paint_container.hpp */, + C9601F5A251004780032AA07 /* cubic_mirrored_vertex.hpp */, + C9601F5B251004780032AA07 /* path_space.hpp */, + C9601F5C251004780032AA07 /* ellipse.hpp */, + C9601F5D251004780032AA07 /* clipping_shape.hpp */, + C9601F5E251004780032AA07 /* metrics_path.hpp */, + C9601F5F251004780032AA07 /* cubic_vertex.hpp */, + C9601F60251004780032AA07 /* shape.hpp */, + C9601F61251004780032AA07 /* triangle.hpp */, + C9601F62251004780032AA07 /* path.hpp */, + C9601F63251004780032AA07 /* path_vertex.hpp */, + C9601F64251004780032AA07 /* parametric_path.hpp */, + C9601F65251004780032AA07 /* rectangle.hpp */, + C9601F66251004780032AA07 /* points_path.hpp */, + C9601F67251004780032AA07 /* cubic_asymmetric_vertex.hpp */, + C9601F68251004780032AA07 /* cubic_detached_vertex.hpp */, + ); + path = shapes; + sourceTree = ""; + }; + C9601F49251004780032AA07 /* paint */ = { + isa = PBXGroup; + children = ( + C9601F4A251004780032AA07 /* stroke_cap.hpp */, + C9601F4B251004780032AA07 /* gradient_stop.hpp */, + C9601F4C251004780032AA07 /* stroke.hpp */, + C9601F4D251004780032AA07 /* shape_paint_mutator.hpp */, + C9601F4E251004780032AA07 /* blend_mode.hpp */, + C9601F4F251004780032AA07 /* shape_paint.hpp */, + C9601F50251004780032AA07 /* stroke_join.hpp */, + C9601F51251004780032AA07 /* fill.hpp */, + C9601F52251004780032AA07 /* radial_gradient.hpp */, + C9601F53251004780032AA07 /* trim_path.hpp */, + C9601F54251004780032AA07 /* color.hpp */, + C9601F55251004780032AA07 /* solid_color.hpp */, + C9601F56251004780032AA07 /* linear_gradient.hpp */, + C9601F57251004780032AA07 /* stroke_effect.hpp */, + ); + path = paint; + sourceTree = ""; + }; + C9601FA4251004950032AA07 /* paint */ = { + isa = PBXGroup; + children = ( + C9601FA5251004950032AA07 /* solid_color.cpp */, + C9601FA6251004950032AA07 /* linear_gradient.cpp */, + C9601FA7251004950032AA07 /* shape_paint.cpp */, + C9601FA8251004950032AA07 /* fill.cpp */, + C9601FA9251004950032AA07 /* radial_gradient.cpp */, + C9601FAA251004950032AA07 /* color.cpp */, + C9601FAB251004950032AA07 /* trim_path.cpp */, + C9601FAC251004950032AA07 /* shape_paint_mutator.cpp */, + C9601FAD251004950032AA07 /* gradient_stop.cpp */, + C9601FAE251004950032AA07 /* stroke.cpp */, + ); + name = paint; + path = shapes/paint; + sourceTree = ""; + }; + C9C73EC724FC478800EF9516 = { + isa = PBXGroup; + children = ( + C9C7406C24FC4EF400EF9516 /* Rive */, + C9C73ED324FC478800EF9516 /* Source */, + C9C73EDE24FC478900EF9516 /* RiveRuntimeTests */, + C9C73ED224FC478800EF9516 /* Products */, + C9D60DA62512AFE900AAA3A6 /* Frameworks */, + ); + sourceTree = ""; + }; + C9C73ED224FC478800EF9516 /* Products */ = { + isa = PBXGroup; + children = ( + C9C73ED124FC478800EF9516 /* RiveRuntime.framework */, + C9C73EDA24FC478900EF9516 /* RiveRuntimeTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C9C73ED324FC478800EF9516 /* Source */ = { + isa = PBXGroup; + children = ( + C9601F20250C13D40032AA07 /* RiveKit */, + C9C73ED424FC478800EF9516 /* RiveRuntime.h */, + C9C73ED524FC478800EF9516 /* Info.plist */, + ); + path = Source; + sourceTree = ""; + }; + C9C73EDE24FC478900EF9516 /* RiveRuntimeTests */ = { + isa = PBXGroup; + children = ( + C9C73EDF24FC478900EF9516 /* RiveRuntimeTests.m */, + C9C73EE124FC478900EF9516 /* Info.plist */, + ); + path = RiveRuntimeTests; + sourceTree = ""; + }; + C9C7406C24FC4EF400EF9516 /* Rive */ = { + isa = PBXGroup; + children = ( + C9C740AD24FC4F0400EF9516 /* include */, + C9C7406D24FC4F0400EF9516 /* src */, + ); + name = Rive; + sourceTree = ""; + }; + C9C7406D24FC4F0400EF9516 /* src */ = { + isa = PBXGroup; + children = ( + C98F29822513FAC30076E802 /* draw_rules.cpp */, + C98F29802513FAC30076E802 /* draw_target.cpp */, + C98F29812513FAC30076E802 /* keyframe_id.cpp */, + C9601FA4251004950032AA07 /* paint */, + C9601FA2251004950032AA07 /* trim_path.cpp */, + C9C7406E24FC4F0400EF9516 /* core */, + C9C7407624FC4F0400EF9516 /* transform_component.cpp */, + C9C7407724FC4F0400EF9516 /* component.cpp */, + C9C7407824FC4F0400EF9516 /* node.cpp */, + C9C7407924FC4F0400EF9516 /* layout.cpp */, + C9C7407A24FC4F0400EF9516 /* animation */, + C9C7408424FC4F0400EF9516 /* drawable.cpp */, + C9C7408524FC4F0400EF9516 /* shapes */, + C9C7409F24FC4F0400EF9516 /* math */, + C9C740A324FC4F0400EF9516 /* dependency_sorter.cpp */, + C9C740A424FC4F0400EF9516 /* artboard.cpp */, + C9C740A524FC4F0400EF9516 /* file.cpp */, + C9C740A624FC4F0400EF9516 /* bones */, + ); + name = src; + path = "submodules/rive-cpp/src"; + sourceTree = ""; + }; + C9C7406E24FC4F0400EF9516 /* core */ = { + isa = PBXGroup; + children = ( + C9C7406F24FC4F0400EF9516 /* field_types */, + C9C7407524FC4F0400EF9516 /* binary_reader.cpp */, + ); + path = core; + sourceTree = ""; + }; + C9C7406F24FC4F0400EF9516 /* field_types */ = { + isa = PBXGroup; + children = ( + C9C7407024FC4F0400EF9516 /* core_bool_type.cpp */, + C9C7407124FC4F0400EF9516 /* core_uint_type.cpp */, + C9C7407224FC4F0400EF9516 /* core_double_type.cpp */, + C9C7407324FC4F0400EF9516 /* core_string_type.cpp */, + C9C7407424FC4F0400EF9516 /* core_color_type.cpp */, + ); + path = field_types; + sourceTree = ""; + }; + C9C7407A24FC4F0400EF9516 /* animation */ = { + isa = PBXGroup; + children = ( + C9C7407B24FC4F0400EF9516 /* keyframe_color.cpp */, + C9C7407C24FC4F0400EF9516 /* keyed_object.cpp */, + C9C7407D24FC4F0400EF9516 /* linear_animation.cpp */, + C9C7407E24FC4F0400EF9516 /* linear_animation_instance.cpp */, + C9C7407F24FC4F0400EF9516 /* keyframe_double.cpp */, + C9C7408024FC4F0400EF9516 /* keyframe.cpp */, + C9C7408124FC4F0400EF9516 /* cubic_interpolator.cpp */, + C9C7408224FC4F0400EF9516 /* keyed_property.cpp */, + ); + path = animation; + sourceTree = ""; + }; + C9C7408524FC4F0400EF9516 /* shapes */ = { + isa = PBXGroup; + children = ( + C9C7408624FC4F0400EF9516 /* paint */, + C9C7409024FC4F0400EF9516 /* points_path.cpp */, + C9C7409124FC4F0400EF9516 /* cubic_asymmetric_vertex.cpp */, + C9C7409224FC4F0400EF9516 /* cubic_detached_vertex.cpp */, + C9C7409324FC4F0400EF9516 /* cubic_vertex.cpp */, + C9C7409424FC4F0400EF9516 /* shape.cpp */, + C9601FA3251004950032AA07 /* metrics_path.cpp */, + C9C7409524FC4F0400EF9516 /* path.cpp */, + C9C7409624FC4F0400EF9516 /* parametric_path.cpp */, + C9C7409724FC4F0400EF9516 /* path_vertex.cpp */, + C9C7409824FC4F0400EF9516 /* rectangle.cpp */, + C9C7409924FC4F0400EF9516 /* straight_vertex.cpp */, + C9C7409A24FC4F0400EF9516 /* path_composer.cpp */, + C9C7409B24FC4F0400EF9516 /* shape_paint_container.cpp */, + C9C7409C24FC4F0400EF9516 /* cubic_mirrored_vertex.cpp */, + C9C7409D24FC4F0400EF9516 /* ellipse.cpp */, + C9C7409E24FC4F0400EF9516 /* clipping_shape.cpp */, + ); + path = shapes; + sourceTree = ""; + }; + C9C7408624FC4F0400EF9516 /* paint */ = { + isa = PBXGroup; + children = ( + C9C7408724FC4F0400EF9516 /* solid_color.cpp */, + C9C7408824FC4F0400EF9516 /* linear_gradient.cpp */, + C9C7408924FC4F0400EF9516 /* shape_paint.cpp */, + C9C7408A24FC4F0400EF9516 /* fill.cpp */, + C9C7408B24FC4F0400EF9516 /* radial_gradient.cpp */, + C9C7408C24FC4F0400EF9516 /* color.cpp */, + C9C7408D24FC4F0400EF9516 /* shape_paint_mutator.cpp */, + C9C7408E24FC4F0400EF9516 /* gradient_stop.cpp */, + C9C7408F24FC4F0400EF9516 /* stroke.cpp */, + ); + path = paint; + sourceTree = ""; + }; + C9C7409F24FC4F0400EF9516 /* math */ = { + isa = PBXGroup; + children = ( + C9C740A024FC4F0400EF9516 /* aabb.cpp */, + C9C740A124FC4F0400EF9516 /* vec2d.cpp */, + C9C740A224FC4F0400EF9516 /* mat2d.cpp */, + ); + path = math; + sourceTree = ""; + }; + C9C740A624FC4F0400EF9516 /* bones */ = { + isa = PBXGroup; + children = ( + C9C740A724FC4F0400EF9516 /* root_bone.cpp */, + C9C740A824FC4F0400EF9516 /* bone.cpp */, + C9C740A924FC4F0400EF9516 /* skinnable.cpp */, + C9C740AA24FC4F0400EF9516 /* weight.cpp */, + C9C740AB24FC4F0400EF9516 /* skin.cpp */, + C9C740AC24FC4F0400EF9516 /* tendon.cpp */, + ); + path = bones; + sourceTree = ""; + }; + C9C740AD24FC4F0400EF9516 /* include */ = { + isa = PBXGroup; + children = ( + C98F29742513FAAE0076E802 /* draw_rules_base.hpp */, + C98F29722513FAAE0076E802 /* draw_rules.hpp */, + C98F29732513FAAE0076E802 /* draw_target_base.hpp */, + C98F29752513FAAE0076E802 /* draw_target_placement.hpp */, + C98F29762513FAAE0076E802 /* draw_target.hpp */, + C98F29772513FAAE0076E802 /* keyframe_id_base.hpp */, + C9601F35251004780032AA07 /* command_path.hpp */, + C9601F2C251004770032AA07 /* math */, + C9601F36251004780032AA07 /* metrics_path.hpp */, + C9601F37251004780032AA07 /* paint */, + C9601F47251004780032AA07 /* shapes */, + C9601F33251004770032AA07 /* stroke_effect.hpp */, + C9601F34251004770032AA07 /* trim_path_base.hpp */, + C9601F46251004780032AA07 /* trim_path.hpp */, + C9C740AE24FC4F0400EF9516 /* generated */, + C9C740E224FC4F0400EF9516 /* backboard.hpp */, + C9C740E324FC4F0400EF9516 /* core */, + C9C740EC24FC4F0400EF9516 /* status_code.hpp */, + C9C740ED24FC4F0400EF9516 /* component_dirt.hpp */, + C9C740EE24FC4F0400EF9516 /* renderer.hpp */, + C9C740EF24FC4F0400EF9516 /* runtime_header.hpp */, + C9C740F024FC4F0400EF9516 /* file.hpp */, + C9C740F124FC4F0400EF9516 /* container_component.hpp */, + C9C740F224FC4F0400EF9516 /* animation */, + C9C740FF24FC4F0500EF9516 /* shapes */, + C9C7411E24FC4F0500EF9516 /* math */, + C9C7412524FC4F0500EF9516 /* component.hpp */, + C9C7412624FC4F0500EF9516 /* node.hpp */, + C9C7412724FC4F0500EF9516 /* layout.hpp */, + C9C7412824FC4F0500EF9516 /* drawable.hpp */, + C9C7412924FC4F0500EF9516 /* artboard.hpp */, + C9C7412A24FC4F0500EF9516 /* dependency_sorter.hpp */, + C9C7412B24FC4F0500EF9516 /* core_context.hpp */, + C9C7412C24FC4F0500EF9516 /* bones */, + C9C7413524FC4F0500EF9516 /* core.hpp */, + C9C7413624FC4F0500EF9516 /* transform_component.hpp */, + ); + name = include; + path = "submodules/rive-cpp/include"; + sourceTree = ""; + }; + C9C740AE24FC4F0400EF9516 /* generated */ = { + isa = PBXGroup; + children = ( + C9C740AF24FC4F0400EF9516 /* core_registry.hpp */, + C9C740B024FC4F0400EF9516 /* node_base.hpp */, + C9C740B124FC4F0400EF9516 /* transform_component_base.hpp */, + C9C740B224FC4F0400EF9516 /* artboard_base.hpp */, + C9C740B324FC4F0400EF9516 /* animation */, + C9C740BE24FC4F0400EF9516 /* shapes */, + C9C740D624FC4F0400EF9516 /* container_component_base.hpp */, + C9C740D724FC4F0400EF9516 /* component_base.hpp */, + C9C740D824FC4F0400EF9516 /* bones */, + C9C740E024FC4F0400EF9516 /* backboard_base.hpp */, + C9C740E124FC4F0400EF9516 /* drawable_base.hpp */, + ); + path = generated; + sourceTree = ""; + }; + C9C740B324FC4F0400EF9516 /* animation */ = { + isa = PBXGroup; + children = ( + C9C740B424FC4F0400EF9516 /* keyframe_color_base.hpp */, + C9C740B524FC4F0400EF9516 /* keyed_property_base.hpp */, + C9C740B624FC4F0400EF9516 /* keyframe_base.hpp */, + C9C740B724FC4F0400EF9516 /* animation_base.hpp */, + C9C740B824FC4F0400EF9516 /* cubic_interpolator_base.hpp */, + C9C740B924FC4F0400EF9516 /* keyframe_draw_order_value_base.hpp */, + C9C740BA24FC4F0400EF9516 /* keyframe_draw_order_base.hpp */, + C9C740BB24FC4F0400EF9516 /* linear_animation_base.hpp */, + C9C740BC24FC4F0400EF9516 /* keyed_object_base.hpp */, + C9C740BD24FC4F0400EF9516 /* keyframe_double_base.hpp */, + ); + path = animation; + sourceTree = ""; + }; + C9C740BE24FC4F0400EF9516 /* shapes */ = { + isa = PBXGroup; + children = ( + C9C740BF24FC4F0400EF9516 /* paint */, + C9C740C724FC4F0400EF9516 /* parametric_path_base.hpp */, + C9C740C824FC4F0400EF9516 /* cubic_asymmetric_vertex_base.hpp */, + C9C740C924FC4F0400EF9516 /* cubic_vertex_base.hpp */, + C9C740CA24FC4F0400EF9516 /* ellipse_base.hpp */, + C9C740CB24FC4F0400EF9516 /* path_composer_base.hpp */, + C9C740CC24FC4F0400EF9516 /* points_path_base.hpp */, + C9C740CD24FC4F0400EF9516 /* triangle_base.hpp */, + C9C740CE24FC4F0400EF9516 /* shape_base.hpp */, + C9C740CF24FC4F0400EF9516 /* rectangle_base.hpp */, + C9C740D024FC4F0400EF9516 /* cubic_mirrored_vertex_base.hpp */, + C9C740D124FC4F0400EF9516 /* straight_vertex_base.hpp */, + C9C740D224FC4F0400EF9516 /* path_base.hpp */, + C9C740D324FC4F0400EF9516 /* cubic_detached_vertex_base.hpp */, + C9C740D424FC4F0400EF9516 /* clipping_shape_base.hpp */, + C9C740D524FC4F0400EF9516 /* path_vertex_base.hpp */, + ); + path = shapes; + sourceTree = ""; + }; + C9C740BF24FC4F0400EF9516 /* paint */ = { + isa = PBXGroup; + children = ( + C9C740C024FC4F0400EF9516 /* linear_gradient_base.hpp */, + C9C740C124FC4F0400EF9516 /* stroke_base.hpp */, + C9C740C224FC4F0400EF9516 /* fill_base.hpp */, + C9C740C324FC4F0400EF9516 /* shape_paint_base.hpp */, + C9C740C424FC4F0400EF9516 /* solid_color_base.hpp */, + C9C740C524FC4F0400EF9516 /* radial_gradient_base.hpp */, + C9C740C624FC4F0400EF9516 /* gradient_stop_base.hpp */, + ); + path = paint; + sourceTree = ""; + }; + C9C740D824FC4F0400EF9516 /* bones */ = { + isa = PBXGroup; + children = ( + C9C740D924FC4F0400EF9516 /* weight_base.hpp */, + C9C740DA24FC4F0400EF9516 /* root_bone_base.hpp */, + C9C740DB24FC4F0400EF9516 /* cubic_weight_base.hpp */, + C9C740DC24FC4F0400EF9516 /* bone_base.hpp */, + C9C740DD24FC4F0400EF9516 /* skin_base.hpp */, + C9C740DE24FC4F0400EF9516 /* tendon_base.hpp */, + C9C740DF24FC4F0400EF9516 /* skeletal_component_base.hpp */, + ); + path = bones; + sourceTree = ""; + }; + C9C740E324FC4F0400EF9516 /* core */ = { + isa = PBXGroup; + children = ( + C9C740E424FC4F0400EF9516 /* reader.h */, + C9C740E524FC4F0400EF9516 /* field_types */, + C9C740EB24FC4F0400EF9516 /* binary_reader.hpp */, + ); + path = core; + sourceTree = ""; + }; + C9C740E524FC4F0400EF9516 /* field_types */ = { + isa = PBXGroup; + children = ( + C9C740E624FC4F0400EF9516 /* core_color_type.hpp */, + C9C740E724FC4F0400EF9516 /* core_uint_type.hpp */, + C9C740E824FC4F0400EF9516 /* core_double_type.hpp */, + C9C740E924FC4F0400EF9516 /* core_string_type.hpp */, + C9C740EA24FC4F0400EF9516 /* core_bool_type.hpp */, + ); + path = field_types; + sourceTree = ""; + }; + C9C740F224FC4F0400EF9516 /* animation */ = { + isa = PBXGroup; + children = ( + C98F296E2513FA8B0076E802 /* keyframe_id.hpp */, + C9C740F324FC4F0500EF9516 /* cubic_interpolator.hpp */, + C9C740F424FC4F0500EF9516 /* keyed_property.hpp */, + C9C740F724FC4F0500EF9516 /* animation.hpp */, + C9C740F824FC4F0500EF9516 /* keyframe.hpp */, + C9C740F924FC4F0500EF9516 /* keyed_object.hpp */, + C9C740FA24FC4F0500EF9516 /* linear_animation.hpp */, + C9C740FB24FC4F0500EF9516 /* linear_animation_instance.hpp */, + C9C740FC24FC4F0500EF9516 /* keyframe_double.hpp */, + C9C740FD24FC4F0500EF9516 /* loop.hpp */, + C9C740FE24FC4F0500EF9516 /* keyframe_color.hpp */, + ); + path = animation; + sourceTree = ""; + }; + C9C740FF24FC4F0500EF9516 /* shapes */ = { + isa = PBXGroup; + children = ( + C9C7410024FC4F0500EF9516 /* straight_vertex.hpp */, + C9C7410124FC4F0500EF9516 /* paint */, + C9C7410E24FC4F0500EF9516 /* path_composer.hpp */, + C9C7410F24FC4F0500EF9516 /* shape_paint_container.hpp */, + C9C7411024FC4F0500EF9516 /* cubic_mirrored_vertex.hpp */, + C9C7411124FC4F0500EF9516 /* path_space.hpp */, + C9C7411224FC4F0500EF9516 /* ellipse.hpp */, + C9C7411324FC4F0500EF9516 /* clipping_shape.hpp */, + C9C7411424FC4F0500EF9516 /* cubic_vertex.hpp */, + C9C7411524FC4F0500EF9516 /* shape.hpp */, + C9C7411624FC4F0500EF9516 /* triangle.hpp */, + C9C7411724FC4F0500EF9516 /* path.hpp */, + C9C7411824FC4F0500EF9516 /* path_vertex.hpp */, + C9C7411924FC4F0500EF9516 /* parametric_path.hpp */, + C9C7411A24FC4F0500EF9516 /* rectangle.hpp */, + C9C7411B24FC4F0500EF9516 /* points_path.hpp */, + C9C7411C24FC4F0500EF9516 /* cubic_asymmetric_vertex.hpp */, + C9C7411D24FC4F0500EF9516 /* cubic_detached_vertex.hpp */, + ); + path = shapes; + sourceTree = ""; + }; + C9C7410124FC4F0500EF9516 /* paint */ = { + isa = PBXGroup; + children = ( + C9C7410224FC4F0500EF9516 /* stroke_cap.hpp */, + C9C7410324FC4F0500EF9516 /* gradient_stop.hpp */, + C9C7410424FC4F0500EF9516 /* stroke.hpp */, + C9C7410524FC4F0500EF9516 /* shape_paint_mutator.hpp */, + C9C7410624FC4F0500EF9516 /* blend_mode.hpp */, + C9C7410724FC4F0500EF9516 /* shape_paint.hpp */, + C9C7410824FC4F0500EF9516 /* stroke_join.hpp */, + C9C7410924FC4F0500EF9516 /* fill.hpp */, + C9C7410A24FC4F0500EF9516 /* radial_gradient.hpp */, + C9C7410B24FC4F0500EF9516 /* color.hpp */, + C9C7410C24FC4F0500EF9516 /* solid_color.hpp */, + C9C7410D24FC4F0500EF9516 /* linear_gradient.hpp */, + ); + path = paint; + sourceTree = ""; + }; + C9C7411E24FC4F0500EF9516 /* math */ = { + isa = PBXGroup; + children = ( + C9C7411F24FC4F0500EF9516 /* vec2d.hpp */, + C9C7412024FC4F0500EF9516 /* mat2d.hpp */, + C9C7412124FC4F0500EF9516 /* aabb.hpp */, + C9C7412224FC4F0500EF9516 /* color.hpp */, + C9C7412324FC4F0500EF9516 /* transform_components.hpp */, + C9C7412424FC4F0500EF9516 /* circle_constant.hpp */, + ); + path = math; + sourceTree = ""; + }; + C9C7412C24FC4F0500EF9516 /* bones */ = { + isa = PBXGroup; + children = ( + C9C7412D24FC4F0500EF9516 /* tendon.hpp */, + C9C7412E24FC4F0500EF9516 /* skeletal_component.hpp */, + C9C7412F24FC4F0500EF9516 /* weight.hpp */, + C9C7413024FC4F0500EF9516 /* skin.hpp */, + C9C7413124FC4F0500EF9516 /* root_bone.hpp */, + C9C7413224FC4F0500EF9516 /* bone.hpp */, + C9C7413324FC4F0500EF9516 /* skinnable.hpp */, + C9C7413424FC4F0500EF9516 /* cubic_weight.hpp */, + ); + path = bones; + sourceTree = ""; + }; + C9D60DA62512AFE900AAA3A6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C960285A251FD59800704818 /* UIKit.framework */, + C9D60DAB2512B04B00AAA3A6 /* QuartzCore.framework */, + C9D60DA92512B01600AAA3A6 /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + C9C73ECC24FC478800EF9516 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C9601F6C251004780032AA07 /* color.hpp in Headers */, + C9C741D224FC4F0500EF9516 /* points_path.hpp in Headers */, + C9C741F424FC510200EF9516 /* Rive.h in Headers */, + C9601F8E251004780032AA07 /* solid_color.hpp in Headers */, + C9601F27250C14560032AA07 /* RiveView.h in Headers */, + C9601F23250C143A0032AA07 /* RiveViewController.h in Headers */, + C9C741DF24FC4F0500EF9516 /* artboard.hpp in Headers */, + C9601F7F251004780032AA07 /* linear_gradient.hpp in Headers */, + C9C741B324FC4F0500EF9516 /* linear_animation.hpp in Headers */, + C9C741E524FC4F0500EF9516 /* skin.hpp in Headers */, + C9601FA0251004780032AA07 /* cubic_asymmetric_vertex.hpp in Headers */, + C9601F73251004780032AA07 /* stroke_cap.hpp in Headers */, + C9C7418624FC4F0500EF9516 /* cubic_vertex_base.hpp in Headers */, + C98F296F2513FA8B0076E802 /* keyframe_id.hpp in Headers */, + C9601F95251004780032AA07 /* ellipse.hpp in Headers */, + C9C741B624FC4F0500EF9516 /* loop.hpp in Headers */, + C9601F82251004780032AA07 /* straight_vertex.hpp in Headers */, + C9601F71251004780032AA07 /* command_path.hpp in Headers */, + C9C7419A24FC4F0500EF9516 /* tendon_base.hpp in Headers */, + C9C741D124FC4F0500EF9516 /* rectangle.hpp in Headers */, + C9C741EA24FC4F0500EF9516 /* core.hpp in Headers */, + C9C741A624FC4F0500EF9516 /* status_code.hpp in Headers */, + C9C741D424FC4F0500EF9516 /* cubic_detached_vertex.hpp in Headers */, + C9C741A024FC4F0500EF9516 /* core_color_type.hpp in Headers */, + C9C7418924FC4F0500EF9516 /* points_path_base.hpp in Headers */, + C9C7419F24FC4F0500EF9516 /* reader.h in Headers */, + C9C741D624FC4F0500EF9516 /* mat2d.hpp in Headers */, + C9601F96251004780032AA07 /* clipping_shape.hpp in Headers */, + C98F297D2513FAAE0076E802 /* keyframe_id_base.hpp in Headers */, + C9601F9B251004780032AA07 /* path.hpp in Headers */, + C9601F91251004780032AA07 /* path_composer.hpp in Headers */, + C9601F79251004780032AA07 /* stroke_join.hpp in Headers */, + C9601F8B251004780032AA07 /* radial_gradient.hpp in Headers */, + C9601F98251004780032AA07 /* cubic_vertex.hpp in Headers */, + C9601F75251004780032AA07 /* stroke.hpp in Headers */, + C9C7419424FC4F0500EF9516 /* component_base.hpp in Headers */, + C9601F8D251004780032AA07 /* color.hpp in Headers */, + C9601F9D251004780032AA07 /* parametric_path.hpp in Headers */, + C9C741A324FC4F0500EF9516 /* core_string_type.hpp in Headers */, + C9C7417D24FC4F0500EF9516 /* linear_gradient_base.hpp in Headers */, + C9C7418424FC4F0500EF9516 /* parametric_path_base.hpp in Headers */, + C9C7419B24FC4F0500EF9516 /* skeletal_component_base.hpp in Headers */, + C9C741D724FC4F0500EF9516 /* aabb.hpp in Headers */, + C9C7416F24FC4F0500EF9516 /* core_registry.hpp in Headers */, + C9C741AA24FC4F0500EF9516 /* file.hpp in Headers */, + C9C7419924FC4F0500EF9516 /* skin_base.hpp in Headers */, + C9C7418224FC4F0500EF9516 /* radial_gradient_base.hpp in Headers */, + C9C741DA24FC4F0500EF9516 /* circle_constant.hpp in Headers */, + C98F297B2513FAAE0076E802 /* draw_target_placement.hpp in Headers */, + C9C7417724FC4F0500EF9516 /* cubic_interpolator_base.hpp in Headers */, + C9C7419724FC4F0500EF9516 /* cubic_weight_base.hpp in Headers */, + C98F297A2513FAAE0076E802 /* draw_rules_base.hpp in Headers */, + C9601F7C251004780032AA07 /* trim_path.hpp in Headers */, + C9C741B024FC4F0500EF9516 /* animation.hpp in Headers */, + C9601F9A251004780032AA07 /* triangle.hpp in Headers */, + C9C741B424FC4F0500EF9516 /* linear_animation_instance.hpp in Headers */, + C9C741CC24FC4F0500EF9516 /* shape.hpp in Headers */, + C9C7419624FC4F0500EF9516 /* root_bone_base.hpp in Headers */, + C9C741E224FC4F0500EF9516 /* tendon.hpp in Headers */, + C9C741E724FC4F0500EF9516 /* bone.hpp in Headers */, + C9601F69251004780032AA07 /* vec2d.hpp in Headers */, + C9601F70251004780032AA07 /* trim_path_base.hpp in Headers */, + C9C7417024FC4F0500EF9516 /* node_base.hpp in Headers */, + C9C7418A24FC4F0500EF9516 /* triangle_base.hpp in Headers */, + C9C7418324FC4F0500EF9516 /* gradient_stop_base.hpp in Headers */, + C9601F87251004780032AA07 /* blend_mode.hpp in Headers */, + C9C7418824FC4F0500EF9516 /* path_composer_base.hpp in Headers */, + C9C7417224FC4F0500EF9516 /* artboard_base.hpp in Headers */, + C9C741B224FC4F0500EF9516 /* keyed_object.hpp in Headers */, + C9C741DC24FC4F0500EF9516 /* node.hpp in Headers */, + C9C7418F24FC4F0500EF9516 /* path_base.hpp in Headers */, + C9C7419324FC4F0500EF9516 /* container_component_base.hpp in Headers */, + C9C7419524FC4F0500EF9516 /* weight_base.hpp in Headers */, + C9601F97251004780032AA07 /* metrics_path.hpp in Headers */, + C9601F93251004780032AA07 /* cubic_mirrored_vertex.hpp in Headers */, + C9C741E824FC4F0500EF9516 /* skinnable.hpp in Headers */, + C9601F92251004780032AA07 /* shape_paint_container.hpp in Headers */, + C9C7418524FC4F0500EF9516 /* cubic_asymmetric_vertex_base.hpp in Headers */, + C9C741E624FC4F0500EF9516 /* root_bone.hpp in Headers */, + C98F297C2513FAAE0076E802 /* draw_target.hpp in Headers */, + C9C7419E24FC4F0500EF9516 /* backboard.hpp in Headers */, + C9C741DD24FC4F0500EF9516 /* layout.hpp in Headers */, + C9C741A724FC4F0500EF9516 /* component_dirt.hpp in Headers */, + C9C741E124FC4F0500EF9516 /* core_context.hpp in Headers */, + C9C741AC24FC4F0500EF9516 /* cubic_interpolator.hpp in Headers */, + C9C741A824FC4F0500EF9516 /* renderer.hpp in Headers */, + C9C7418724FC4F0500EF9516 /* ellipse_base.hpp in Headers */, + C9601F88251004780032AA07 /* shape_paint.hpp in Headers */, + C9C7418E24FC4F0500EF9516 /* straight_vertex_base.hpp in Headers */, + C9C7417624FC4F0500EF9516 /* animation_base.hpp in Headers */, + C98F29782513FAAE0076E802 /* draw_rules.hpp in Headers */, + C98F29792513FAAE0076E802 /* draw_target_base.hpp in Headers */, + C9601F80251004780032AA07 /* stroke_effect.hpp in Headers */, + C9C741E424FC4F0500EF9516 /* weight.hpp in Headers */, + C9C7419C24FC4F0500EF9516 /* backboard_base.hpp in Headers */, + C9C7417B24FC4F0500EF9516 /* keyed_object_base.hpp in Headers */, + C9C741E324FC4F0500EF9516 /* skeletal_component.hpp in Headers */, + C9C741A224FC4F0500EF9516 /* core_double_type.hpp in Headers */, + C9C7419024FC4F0500EF9516 /* cubic_detached_vertex_base.hpp in Headers */, + C9C741AB24FC4F0500EF9516 /* container_component.hpp in Headers */, + C9601F7A251004780032AA07 /* fill.hpp in Headers */, + C9C7418024FC4F0500EF9516 /* shape_paint_base.hpp in Headers */, + C9601F84251004780032AA07 /* gradient_stop.hpp in Headers */, + C9C7417424FC4F0500EF9516 /* keyed_property_base.hpp in Headers */, + C9C7419824FC4F0500EF9516 /* bone_base.hpp in Headers */, + C9601F86251004780032AA07 /* shape_paint_mutator.hpp in Headers */, + C9C7418124FC4F0500EF9516 /* solid_color_base.hpp in Headers */, + C9C741DB24FC4F0500EF9516 /* component.hpp in Headers */, + C9C7417F24FC4F0500EF9516 /* fill_base.hpp in Headers */, + C9C741E924FC4F0500EF9516 /* cubic_weight.hpp in Headers */, + C9C741A524FC4F0500EF9516 /* binary_reader.hpp in Headers */, + C9C7418D24FC4F0500EF9516 /* cubic_mirrored_vertex_base.hpp in Headers */, + C9C741B124FC4F0500EF9516 /* keyframe.hpp in Headers */, + C9C7417324FC4F0500EF9516 /* keyframe_color_base.hpp in Headers */, + C9C7419D24FC4F0500EF9516 /* drawable_base.hpp in Headers */, + C9601F6D251004780032AA07 /* transform_components.hpp in Headers */, + C9C741E024FC4F0500EF9516 /* dependency_sorter.hpp in Headers */, + C9C7417C24FC4F0500EF9516 /* keyframe_double_base.hpp in Headers */, + C9601F94251004780032AA07 /* path_space.hpp in Headers */, + C9C7417E24FC4F0500EF9516 /* stroke_base.hpp in Headers */, + C9C741A424FC4F0500EF9516 /* core_bool_type.hpp in Headers */, + C9C741DE24FC4F0500EF9516 /* drawable.hpp in Headers */, + C9C7419224FC4F0500EF9516 /* path_vertex_base.hpp in Headers */, + C9C7417524FC4F0500EF9516 /* keyframe_base.hpp in Headers */, + C9C7417924FC4F0500EF9516 /* keyframe_draw_order_base.hpp in Headers */, + C9C741EB24FC4F0500EF9516 /* transform_component.hpp in Headers */, + C9C7419124FC4F0500EF9516 /* clipping_shape_base.hpp in Headers */, + C9C741B524FC4F0500EF9516 /* keyframe_double.hpp in Headers */, + C9C741A124FC4F0500EF9516 /* core_uint_type.hpp in Headers */, + C9C7417824FC4F0500EF9516 /* keyframe_draw_order_value_base.hpp in Headers */, + C9C7417124FC4F0500EF9516 /* transform_component_base.hpp in Headers */, + C9C7418C24FC4F0500EF9516 /* rectangle_base.hpp in Headers */, + C9C7418B24FC4F0500EF9516 /* shape_base.hpp in Headers */, + C9C741B724FC4F0500EF9516 /* keyframe_color.hpp in Headers */, + C9C741CF24FC4F0500EF9516 /* path_vertex.hpp in Headers */, + C9C73EE224FC478900EF9516 /* RiveRuntime.h in Headers */, + C9C741AD24FC4F0500EF9516 /* keyed_property.hpp in Headers */, + C9C7417A24FC4F0500EF9516 /* linear_animation_base.hpp in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + C9C73ED024FC478800EF9516 /* RiveRuntime */ = { + isa = PBXNativeTarget; + buildConfigurationList = C9C73EE524FC478900EF9516 /* Build configuration list for PBXNativeTarget "RiveRuntime" */; + buildPhases = ( + C9C73ECC24FC478800EF9516 /* Headers */, + C9C73ECD24FC478800EF9516 /* Sources */, + C9C73ECE24FC478800EF9516 /* Frameworks */, + C9C73ECF24FC478800EF9516 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RiveRuntime; + productName = RiveRuntime; + productReference = C9C73ED124FC478800EF9516 /* RiveRuntime.framework */; + productType = "com.apple.product-type.framework"; + }; + C9C73ED924FC478900EF9516 /* RiveRuntimeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C9C73EE824FC478900EF9516 /* Build configuration list for PBXNativeTarget "RiveRuntimeTests" */; + buildPhases = ( + C9C73ED624FC478900EF9516 /* Sources */, + C9C73ED724FC478900EF9516 /* Frameworks */, + C9C73ED824FC478900EF9516 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C9C73EDD24FC478900EF9516 /* PBXTargetDependency */, + ); + name = RiveRuntimeTests; + productName = RiveRuntimeTests; + productReference = C9C73EDA24FC478900EF9516 /* RiveRuntimeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C9C73EC824FC478800EF9516 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = Rive; + TargetAttributes = { + C9C73ED024FC478800EF9516 = { + CreatedOnToolsVersion = 11.6; + }; + C9C73ED924FC478900EF9516 = { + CreatedOnToolsVersion = 11.6; + }; + }; + }; + buildConfigurationList = C9C73ECB24FC478800EF9516 /* Build configuration list for PBXProject "RiveRuntime" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C9C73EC724FC478800EF9516; + productRefGroup = C9C73ED224FC478800EF9516 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C9C73ED024FC478800EF9516 /* RiveRuntime */, + C9C73ED924FC478900EF9516 /* RiveRuntimeTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C9C73ECF24FC478800EF9516 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C9C73ED824FC478900EF9516 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C9C73ECD24FC478800EF9516 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C9C7414124FC4F0500EF9516 /* keyframe_color.cpp in Sources */, + C9C7414F24FC4F0500EF9516 /* radial_gradient.cpp in Sources */, + C9601F2B250C25930032AA07 /* RiveRenderer.mm in Sources */, + C9C7416424FC4F0500EF9516 /* vec2d.cpp in Sources */, + C9C7416E24FC4F0500EF9516 /* tendon.cpp in Sources */, + C9C7416624FC4F0500EF9516 /* dependency_sorter.cpp in Sources */, + C9601FAF251004950032AA07 /* trim_path.cpp in Sources */, + C9C7414624FC4F0500EF9516 /* keyframe.cpp in Sources */, + C9C7413B24FC4F0500EF9516 /* core_color_type.cpp in Sources */, + C9C7416924FC4F0500EF9516 /* root_bone.cpp in Sources */, + C9C7413E24FC4F0500EF9516 /* component.cpp in Sources */, + C9601FB6251004950032AA07 /* color.cpp in Sources */, + C9C7413F24FC4F0500EF9516 /* node.cpp in Sources */, + C9C7415E24FC4F0500EF9516 /* path_composer.cpp in Sources */, + C9C7413924FC4F0500EF9516 /* core_double_type.cpp in Sources */, + C9C7413A24FC4F0500EF9516 /* core_string_type.cpp in Sources */, + C9C7415B24FC4F0500EF9516 /* path_vertex.cpp in Sources */, + C9C7414B24FC4F0500EF9516 /* solid_color.cpp in Sources */, + C9C741F524FC510200EF9516 /* Rive.mm in Sources */, + C9C7415724FC4F0500EF9516 /* cubic_vertex.cpp in Sources */, + C9C7414E24FC4F0500EF9516 /* fill.cpp in Sources */, + C9601FB3251004950032AA07 /* shape_paint.cpp in Sources */, + C9C7416124FC4F0500EF9516 /* ellipse.cpp in Sources */, + C9C7415124FC4F0500EF9516 /* shape_paint_mutator.cpp in Sources */, + C9C7416524FC4F0500EF9516 /* mat2d.cpp in Sources */, + C9C7414A24FC4F0500EF9516 /* drawable.cpp in Sources */, + C9C7415924FC4F0500EF9516 /* path.cpp in Sources */, + C9C7414024FC4F0500EF9516 /* layout.cpp in Sources */, + C9C7414C24FC4F0500EF9516 /* linear_gradient.cpp in Sources */, + C9C7415524FC4F0500EF9516 /* cubic_asymmetric_vertex.cpp in Sources */, + C98F29842513FAC30076E802 /* keyframe_id.cpp in Sources */, + C9C7416824FC4F0500EF9516 /* file.cpp in Sources */, + C9601F28250C14560032AA07 /* RiveView.mm in Sources */, + C9C7415F24FC4F0500EF9516 /* shape_paint_container.cpp in Sources */, + C9C7413C24FC4F0500EF9516 /* binary_reader.cpp in Sources */, + C9C7416D24FC4F0500EF9516 /* skin.cpp in Sources */, + C9C7414424FC4F0500EF9516 /* linear_animation_instance.cpp in Sources */, + C9601FB9251004950032AA07 /* gradient_stop.cpp in Sources */, + C9C7416A24FC4F0500EF9516 /* bone.cpp in Sources */, + C9C7415824FC4F0500EF9516 /* shape.cpp in Sources */, + C9601FB0251004950032AA07 /* metrics_path.cpp in Sources */, + C98F29832513FAC30076E802 /* draw_target.cpp in Sources */, + C9C7414524FC4F0500EF9516 /* keyframe_double.cpp in Sources */, + C9C7415C24FC4F0500EF9516 /* rectangle.cpp in Sources */, + C9601F24250C143A0032AA07 /* RiveViewController.mm in Sources */, + C9C7413D24FC4F0500EF9516 /* transform_component.cpp in Sources */, + C9C7414224FC4F0500EF9516 /* keyed_object.cpp in Sources */, + C9C7416C24FC4F0500EF9516 /* weight.cpp in Sources */, + C9601FBA251004950032AA07 /* stroke.cpp in Sources */, + C9C7414324FC4F0500EF9516 /* linear_animation.cpp in Sources */, + C9C7416B24FC4F0500EF9516 /* skinnable.cpp in Sources */, + C9C7413824FC4F0500EF9516 /* core_uint_type.cpp in Sources */, + C9C7414824FC4F0500EF9516 /* keyed_property.cpp in Sources */, + C9C7413724FC4F0500EF9516 /* core_bool_type.cpp in Sources */, + C9C7415D24FC4F0500EF9516 /* straight_vertex.cpp in Sources */, + C9C7416024FC4F0500EF9516 /* cubic_mirrored_vertex.cpp in Sources */, + C9C7415424FC4F0500EF9516 /* points_path.cpp in Sources */, + C9C7416324FC4F0500EF9516 /* aabb.cpp in Sources */, + C9C7414724FC4F0500EF9516 /* cubic_interpolator.cpp in Sources */, + C9C7415A24FC4F0500EF9516 /* parametric_path.cpp in Sources */, + C9C7416224FC4F0500EF9516 /* clipping_shape.cpp in Sources */, + C9C7416724FC4F0500EF9516 /* artboard.cpp in Sources */, + C9C7415624FC4F0500EF9516 /* cubic_detached_vertex.cpp in Sources */, + C98F29852513FAC30076E802 /* draw_rules.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C9C73ED624FC478900EF9516 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C9C73EE024FC478900EF9516 /* RiveRuntimeTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C9C73EDD24FC478900EF9516 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C9C73ED024FC478800EF9516 /* RiveRuntime */; + targetProxy = C9C73EDC24FC478900EF9516 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + C9C73EE324FC478900EF9516 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C9C73EE424FC478900EF9516 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + C9C73EE624FC478900EF9516 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + "HEADER_SEARCH_PATHS[arch=*]" = "submodules/rive-cpp/include"; + INFOPLIST_FILE = Source/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntime; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C9C73EE724FC478900EF9516 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + "HEADER_SEARCH_PATHS[arch=*]" = Rive/include; + INFOPLIST_FILE = Source/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntime; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C9C73EE924FC478900EF9516 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = RiveRuntimeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntimeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C9C73EEA24FC478900EF9516 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = RiveRuntimeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntimeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C9C73ECB24FC478800EF9516 /* Build configuration list for PBXProject "RiveRuntime" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9C73EE324FC478900EF9516 /* Debug */, + C9C73EE424FC478900EF9516 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C9C73EE524FC478900EF9516 /* Build configuration list for PBXNativeTarget "RiveRuntime" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9C73EE624FC478900EF9516 /* Debug */, + C9C73EE724FC478900EF9516 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C9C73EE824FC478900EF9516 /* Build configuration list for PBXNativeTarget "RiveRuntimeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9C73EE924FC478900EF9516 /* Debug */, + C9C73EEA24FC478900EF9516 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C9C73EC824FC478800EF9516 /* Project object */; +} diff --git a/RiveRuntime.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RiveRuntime.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1c8635f --- /dev/null +++ b/RiveRuntime.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RiveRuntime.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RiveRuntime.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RiveRuntime.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RiveRuntimeTests/Info.plist b/RiveRuntimeTests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/RiveRuntimeTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/RiveRuntimeTests/RiveRuntimeTests.m b/RiveRuntimeTests/RiveRuntimeTests.m new file mode 100644 index 0000000..872bca3 --- /dev/null +++ b/RiveRuntimeTests/RiveRuntimeTests.m @@ -0,0 +1,37 @@ +// +// RiveRuntimeTests.m +// RiveRuntimeTests +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import + +@interface RiveRuntimeTests : XCTestCase + +@end + +@implementation RiveRuntimeTests + +- (void)setUp { + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/Source/Info.plist b/Source/Info.plist new file mode 100644 index 0000000..9bcb244 --- /dev/null +++ b/Source/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/Source/RiveKit/Rive.h b/Source/RiveKit/Rive.h new file mode 100644 index 0000000..91e8506 --- /dev/null +++ b/Source/RiveKit/Rive.h @@ -0,0 +1,97 @@ +// +// RiveFile.h +// RiveRuntime +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +// Different fits for rendering a Rive animation in a View +typedef NS_ENUM(NSInteger, Fit) { + Fill, + Contain, + Cover, + FitHeight, + FitWidth, + ScaleDown, + None +}; + +// Different alignments for rendering a Rive animation in a View +typedef NS_ENUM(NSInteger, Alignment) { + TopLeft, + TopCenter, + TopRight, + CenterLeft, + Center, + CenterRight, + BottomLeft, + BottomCenter, + BottomRight +}; + +// Result of file importing +typedef NS_ENUM(NSInteger, ImportResult) { + success, + unsupportedVersion, + malformed +}; + +@class RiveArtboard; + +// Linear animation instance wrapper +@interface RiveLinearAnimationInstance : NSObject + +-(void) applyTo:(RiveArtboard*) artboard; +-(void) advanceBy:(double)elapsedSeconds; + +@end + +// Animation wrapper +@interface RiveAnimation : NSObject + +- (NSString *) name; +-(RiveLinearAnimationInstance *) instance; + +@end + +// Render wrapper +@interface RiveRenderer : NSObject + +-(instancetype) initWithContext:(nonnull CGContextRef) context; +-(void) alignWithRect:(CGRect)rect withContentRect:(CGRect)contentRect withAlignment:(Alignment)alignment withFit:(Fit)fit; + +@end + +// Artboard wrapper +@interface RiveArtboard : NSObject + +-(NSString *) name; +-(CGRect) bounds; +-(NSInteger) animationCount; +-(RiveAnimation *) animationAt:(NSInteger)index; +-(void) advanceBy:(double)elapsedSeconds; +-(void) draw:(RiveRenderer *)renderer; + +@end + +// File wrapper +@interface RiveFile : NSObject + +@property (class, readonly) uint majorVersion; +@property (class, readonly) uint minorVersion; + ++ (ImportResult) import:(nonnull UInt8*)bytes bytesLength:(UInt64)length toFile:(nonnull RiveFile*)riveFile; + +// Wraps: Artboard* artboard() const; +- (RiveArtboard *) artboard; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/RiveKit/Rive.mm b/Source/RiveKit/Rive.mm new file mode 100644 index 0000000..e6a42fc --- /dev/null +++ b/Source/RiveKit/Rive.mm @@ -0,0 +1,243 @@ +// +// RiveFile.m +// RiveRuntime +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import "Rive.h" +#import "RiveRenderer.hpp" + +#import "file.hpp" +#import "artboard.hpp" +#import "animation.hpp" +#import "linear_animation.hpp" +#import "linear_animation_instance.hpp" + + +@interface RiveLinearAnimationInstance() +-(instancetype) initWithAnimation:(rive::Animation *) riveAnimation; +@end + +@interface RiveAnimation () + -(instancetype) initWithAnimation:(rive::Animation *) riveAnimation; +@end + +@interface RiveArtboard () +@property (nonatomic, readonly) rive::Artboard* artboard; +-(instancetype) initWithArtboard:(rive::Artboard *) riveArtboard; +@end + +@interface RiveRenderer () +@property (nonatomic, readonly) rive::Renderer* renderer; +-(rive::Renderer *) renderer; +@end + +// RIVE RENDERER + +@implementation RiveRenderer + +CGContextRef ctx; + +-(instancetype) initWithContext:(CGContextRef) context { + if (self = [super init]) { + ctx = context; + _renderer = new rive::NewRiveRenderer(context); + return self; + } else { + return nil; + } +} + +-(void) alignWithRect:(CGRect)rect withContentRect:(CGRect)contentRect withAlignment:(Alignment)alignment withFit:(Fit)fit { +// NSLog(@"Rect in align %@", NSStringFromCGRect(rect)); + + // Calculate the AABBs + rive::AABB frame = rive::AABB(rect.origin.x, rect.origin.y, rect.size.width + rect.origin.x, rect.size.height + rect.origin.y); + rive::AABB content = rive::AABB(contentRect.origin.x, contentRect.origin.y, contentRect.size.width + contentRect.origin.x, rect.size.height + rect.origin.y); + + // Work out the fit + rive::Fit riveFit; + switch(fit) { + case Fill: + riveFit = rive::Fit::fill; + break; + case Contain: + riveFit = rive::Fit::contain; + break; + case Cover: + riveFit = rive::Fit::cover; + break; + case FitHeight: + riveFit = rive::Fit::fitHeight; + break; + case FitWidth: + riveFit = rive::Fit::fitWidth; + break; + case ScaleDown: + riveFit = rive::Fit::scaleDown; + break; + case None: + riveFit = rive::Fit::none; + break; + } + + // Work out the alignment + rive::Alignment riveAlignment = rive::Alignment(.0, .0); + switch(alignment) { + case TopLeft: + riveAlignment = rive::Alignment::topLeft; + break; + case TopCenter: + riveAlignment = rive::Alignment::topCenter; + break; + case TopRight: + riveAlignment = rive::Alignment::topRight; + break; + case CenterLeft: + riveAlignment = rive::Alignment::centerLeft; + break; + case Center: + riveAlignment = rive::Alignment::center; + break; + case CenterRight: + riveAlignment = rive::Alignment::centerRight; + break; + case BottomLeft: + riveAlignment = rive::Alignment::bottomLeft; + break; + case BottomCenter: + riveAlignment = rive::Alignment::bottomCenter; + break; + case BottomRight: + riveAlignment = rive::Alignment::bottomRight; + break; + } + + _renderer->align(riveFit, riveAlignment, frame, content); +} + +@end + +// RIVE FILE + +@implementation RiveFile + +rive::File *file; + ++ (uint) majorVersion { return UInt8(rive::File::majorVersion); } ++ (uint) minorVersion { return UInt8(rive::File::minorVersion); } + +// Imports a Rive file, through a parameter reference ++ (ImportResult) import:(nonnull UInt8 *)bytes bytesLength:(UInt64)length toFile:(nonnull RiveFile *)riveFile { + rive::BinaryReader reader = rive::BinaryReader(bytes, length); + rive::ImportResult result = rive::File::import(reader, &file); + if (result == rive::ImportResult::success) { + return success; + } + return malformed; +} + +- (RiveArtboard *) artboard { + return [[RiveArtboard alloc] initWithArtboard: file->artboard()]; +} + +@end + +// RIVE ARTBOARD + +@implementation RiveArtboard + +// rive::Artboard *artboard; + +-(instancetype) initWithArtboard:(rive::Artboard *) riveArtboard { + if (self = [super init]) { + _artboard = riveArtboard; + return self; + } else { + return nil; + } +} + +-(NSInteger) animationCount { + return _artboard->animationCount(); +} + +-(RiveAnimation *) animationAt:(NSInteger) index { + if (index >= [self animationCount]) { + return nil; + } + return [[RiveAnimation alloc] initWithAnimation: _artboard->animation(index)]; +} + +-(void) advanceBy:(double) elapsedSeconds { + _artboard->advance(elapsedSeconds); +} + +-(void) draw:(RiveRenderer *) renderer { + _artboard->draw([renderer renderer]); +} + +-(NSString *) name { + return [NSString stringWithUTF8String:_artboard->name().c_str()]; +} + +-(CGRect) bounds { + rive::AABB aabb = _artboard->bounds(); + return CGRectMake(aabb.minX, aabb.minY, aabb.width(), aabb.height()); +} + +@end + +// RIVE ANIMATION + +@implementation RiveAnimation + +rive::Animation *animation; + +-(instancetype) initWithAnimation:(rive::Animation *) riveAnimation { + if (self = [super init]) { + animation = riveAnimation; + return self; + } else { + return nil; + } +} + +- (NSString *) name { + std::string str = animation->name(); + return [NSString stringWithCString:str.c_str() encoding:[NSString defaultCStringEncoding]]; +} + +-(RiveLinearAnimationInstance *) instance { + return [[RiveLinearAnimationInstance alloc] initWithAnimation: animation]; +} + +@end + +// RIVE LINEAR ANIMATION INSTANCE + +@implementation RiveLinearAnimationInstance + +rive::LinearAnimationInstance *instance; + +-(instancetype) initWithAnimation:(rive::Animation *) riveAnimation { + if (self = [super init]) { + + instance = new rive::LinearAnimationInstance(reinterpret_cast(riveAnimation)); + return self; + } else { + return nil; + } +} + +-(void) applyTo:(RiveArtboard*) artboard { + instance->apply(artboard.artboard); +} + +-(void) advanceBy:(double)elapsedSeconds { + instance->advance(elapsedSeconds); +} + +@end diff --git a/Source/RiveKit/RiveRenderer.hpp b/Source/RiveKit/RiveRenderer.hpp new file mode 100644 index 0000000..a10d96e --- /dev/null +++ b/Source/RiveKit/RiveRenderer.hpp @@ -0,0 +1,162 @@ +// +// RiveRenderer.hpp +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#ifndef rive_renderer_hpp +#define rive_renderer_hpp + +#import + +#import + +#import "renderer.hpp" + +namespace rive +{ + + enum class RiveGradient + { + None, + Linear, + Radial + }; + + enum class RivePaintStyle + { + None, + Stroke, + Fill + }; + + enum class RiveStrokeJoin + { + None, + Miter, + Round, + Bevel + }; + + enum class RiveStrokeCap + { + None, + Butt, + Round, + Square + }; + + enum class RiveBlendMode : unsigned int + { + None = 0, + SrcOver = static_cast(BlendMode::srcOver), + Screen = static_cast(BlendMode::screen), + Overlay = static_cast(BlendMode::overlay), + Darken = static_cast(BlendMode::darken), + Lighten = static_cast(BlendMode::lighten), + ColorDodge = static_cast(BlendMode::colorDodge), + ColorBurn = static_cast(BlendMode::colorBurn), + HardLight = static_cast(BlendMode::hardLight), + SoftLight = static_cast(BlendMode::softLight), + Difference = static_cast(BlendMode::difference), + Exclusion = static_cast(BlendMode::exclusion), + Multiply = static_cast(BlendMode::multiply), + Hue = static_cast(BlendMode::hue), + Saturation = static_cast(BlendMode::saturation), + Color = static_cast(BlendMode::color), + Luminosity = static_cast(BlendMode::luminosity) + }; + + + class RiveRenderPaint : public RenderPaint + { + private: + public: + CGColorRef cgColor = NULL; + RivePaintStyle paintStyle = RivePaintStyle::None; + RiveStrokeJoin strokeJoin = RiveStrokeJoin::None; + RiveStrokeCap strokeCap = RiveStrokeCap::None; + RiveBlendMode currentBlendMode; + float paintThickness; + + // Gradient + RiveGradient gradient = RiveGradient::None; + CGPoint gradientStart; + CGPoint gradientEnd; + std::vector colorStops; + std::vector stops; + + + RiveRenderPaint(); + + void color(unsigned int value) override; + void style(RenderPaintStyle value) override; + void thickness(float value) override; + void join(StrokeJoin value) override; + void cap(StrokeCap value) override; + void blendMode(BlendMode value) override; + void linearGradient(float sx, float sy, float ex, float ey) override; + void radialGradient(float sx, float sy, float ex, float ey) override; + void addStop(unsigned int color, float stop) override; + void completeGradient() override; + }; + + enum class RivePathCommandType + { + MoveTo, + LineTo, + CubicTo, + Reset, + Close + }; + + struct RivePathCommand + { + RivePathCommandType command; + float x; + float y; + float inX; + float inY; + float outX; + float outY; + }; + + class RiveRenderPath : public RenderPath + { + private: + UIBezierPath *path; + FillRule m_FillRule; + + public: + RiveRenderPath(); + UIBezierPath *getBezierPath() { return path; } + FillRule getFillRule() { return m_FillRule; } + + void reset() override; + void addPath(CommandPath *path, const Mat2D &transform) override; + void fillRule(FillRule value) override; + void moveTo(float x, float y) override; + void lineTo(float x, float y) override; + void cubicTo(float ox, float oy, float ix, float iy, float x, float y) override; + void close() override; + }; + + class NewRiveRenderer : public Renderer + { + private: + CGContextRef ctx; + + public: + NewRiveRenderer(CGContextRef context) : ctx(context) {} + + void save() override; + void restore() override; + void transform(const Mat2D &transform) override; + void drawPath(RenderPath *path, RenderPaint *paint) override; + void clipPath(RenderPath *path) override; + }; +} // namespace rive + +#endif /* rive_renderer_hpp */ diff --git a/Source/RiveKit/RiveRenderer.mm b/Source/RiveKit/RiveRenderer.mm new file mode 100644 index 0000000..3ae3d53 --- /dev/null +++ b/Source/RiveKit/RiveRenderer.mm @@ -0,0 +1,451 @@ +// +// RiveRenderer.m +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + + +#include "RiveRenderer.hpp" +#include "renderer.hpp" + +// Creates a UIColor from an RGBA int value +#define UIColorFromRGB(rgbValue) \ +[UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/0xFF \ + green:((float)((rgbValue & 0xFF00) >> 8))/0xFF \ + blue:((float)(rgbValue & 0xFF))/0xFF \ + alpha:((float)((rgbValue & 0xFF000000) >> 24))/0xFF] + +#define opacityFromARGB(rgbValue) ((float)((rgbValue & 0xFF000000) >> 24))/0xFF + +using namespace rive; + +// Base color space used throughout the renderer +const CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); + +/* + * Render paint + */ + +RiveRenderPaint::RiveRenderPaint() { + // NSLog(@"INITIALIZING A NEW RENDER PAINT"); +} + +void RiveRenderPaint::style(RenderPaintStyle value) { +// NSLog(@" --- RenderPaint::style"); + switch(value) { + case RenderPaintStyle::fill: + paintStyle = RivePaintStyle::Fill; + break; + case RenderPaintStyle::stroke: +// NSLog(@"Ask for stroke"); + paintStyle = RivePaintStyle::Stroke; + break; + } +} + +void RiveRenderPaint::color(unsigned int value) { + // NSLog(@" --- RenderPaint::color -> %u", value); + CGFloat color [] = { + ((float)((value & 0xFF0000) >> 16))/0xFF, + ((float)((value & 0xFF00) >> 8))/0xFF, + ((float)(value & 0xFF))/0xFF, + ((float)((value & 0xFF000000) >> 24))/0xFF + }; + cgColor = CGColorCreate(baseSpace, color); +} + +void RiveRenderPaint::thickness(float value) { +// NSLog(@" --- RenderPaint::thickness %.1f", value); + paintThickness = value; +} + +void RiveRenderPaint::join(StrokeJoin value) { +// NSLog(@" --- RenderPaint::join"); + switch(value) { + case StrokeJoin::miter: + strokeJoin = RiveStrokeJoin::Miter; + break; + case StrokeJoin::round: + strokeJoin = RiveStrokeJoin::Round; + break; + case StrokeJoin::bevel: + strokeJoin = RiveStrokeJoin::Bevel; + break; + default: + strokeJoin = RiveStrokeJoin::None; + break; + } +} + +void RiveRenderPaint::cap(StrokeCap value) { +// NSLog(@" --- RenderPaint::cap"); + switch (value) { + case StrokeCap::butt: + strokeCap = RiveStrokeCap::Butt; + break; + case StrokeCap::round: + strokeCap = RiveStrokeCap::Round; + break; + case StrokeCap::square: + strokeCap = RiveStrokeCap::Square; + break; + default: + strokeCap = RiveStrokeCap::None; + break; + } +} + +void RiveRenderPaint::blendMode(BlendMode value) { +// NSLog(@" --- RenderPaint::blendMode -> %d", value); + switch (value) { + case BlendMode::srcOver: + currentBlendMode = RiveBlendMode::SrcOver; + break; + case BlendMode::screen: + currentBlendMode = RiveBlendMode::Screen; + break; + case BlendMode::overlay: + currentBlendMode = RiveBlendMode::Overlay; + break; + case BlendMode::darken: + currentBlendMode = RiveBlendMode::Darken; + break; + case BlendMode::lighten: + currentBlendMode = RiveBlendMode::Lighten; + break; + case BlendMode::colorDodge: + currentBlendMode = RiveBlendMode::ColorDodge; + break; + case BlendMode::colorBurn: + currentBlendMode = RiveBlendMode::ColorBurn; + break; + case BlendMode::hardLight: + currentBlendMode = RiveBlendMode::HardLight; + break; + case BlendMode::softLight: + currentBlendMode = RiveBlendMode::SoftLight; + break; + case BlendMode::difference: + currentBlendMode = RiveBlendMode::Difference; + break; + case BlendMode::exclusion: + currentBlendMode = RiveBlendMode::Exclusion; + break; + case BlendMode::multiply: + currentBlendMode = RiveBlendMode::Multiply; + break; + case BlendMode::hue: + currentBlendMode = RiveBlendMode::Hue; + break; + case BlendMode::saturation: + currentBlendMode = RiveBlendMode::Saturation; + break; + case BlendMode::color: + currentBlendMode = RiveBlendMode::Color; + break; + case BlendMode::luminosity: + currentBlendMode = RiveBlendMode::Luminosity; + break; + default: + break; + } +} + +void RiveRenderPaint::linearGradient(float sx, float sy, float ex, float ey) { +// NSLog(@" --- RenderPaint::linearGradient (%.1f,%.1f), (%.1f,%.1f)", sx, sy, ex, ey); + gradient = RiveGradient::Linear; + gradientStart = CGPointMake(sx, sy); + gradientEnd = CGPointMake(ex, ey); + +} +void RiveRenderPaint::radialGradient(float sx, float sy, float ex, float ey) { +// NSLog(@" --- RenderPaint::radialGradient"); + gradient = RiveGradient::Radial; + gradientStart = CGPointMake(sx, sy); + gradientEnd = CGPointMake(ex, ey); + +} +void RiveRenderPaint::addStop(unsigned int color, float stop) { +// NSLog(@" --- RenderPaint::addStop"); + colorStops.emplace_back(((float)((color & 0xFF0000) >> 16))/0xFF); + colorStops.emplace_back(((float)((color & 0xFF00) >> 8))/0xFF); + colorStops.emplace_back(((float)(color & 0xFF))/0xFF); + colorStops.emplace_back(((float)((color & 0xFF000000) >> 24))/0xFF); + stops.emplace_back(stop); +} +void RiveRenderPaint::completeGradient() { +// NSLog(@" --- RenderPaint::completeGradient"); +} + +/* + * Render path + */ + +RiveRenderPath::RiveRenderPath() { + path = [[UIBezierPath alloc] init]; +// NSLog(@"INITIALIZING A NEW RENDER PATH"); +} + +void RiveRenderPath::close() { + // NSLog(@" --- RenderPath::close"); + [path closePath]; +} + +void RiveRenderPath::reset() { +// NSLog(@" --- RenderPath::reset"); + path = [[UIBezierPath alloc] init]; + // [path removeAllPoints]; +} + +void RiveRenderPath::addPath(CommandPath* path, const Mat2D& transform) { + // NSLog(@" --- RenderPath::addPath"); + UIBezierPath *addPath = reinterpret_cast(path)->getBezierPath(); + + CGAffineTransform affineTransform = CGAffineTransformMake(transform.xx(), + transform.xy(), + transform.yx(), + transform.yy(), + transform.tx(), + transform.ty()); + + UIBezierPath *clonePath = [addPath copy]; + + [clonePath applyTransform:affineTransform]; + [this->path appendPath:clonePath]; +} + +void RiveRenderPath::fillRule(FillRule value) { + // NSLog(@" --- RenderPath::fillRule"); + m_FillRule = value; +} + +void RiveRenderPath::moveTo(float x, float y) { + // NSLog(@" --- RenderPath::moveTo x %.1f, y %.1f", x, y); + [path moveToPoint:CGPointMake(x, y)]; +} + +void RiveRenderPath::lineTo(float x, float y) { +// NSLog(@" --- RenderPath::lineTo x %.1f, y %.1f", x, y); + if (isnan(x) || isnan(y)) { + NSLog(@"Received NaN in lineTo!!!!"); + return; + } + [path addLineToPoint:CGPointMake(x, y)]; +} + +void RiveRenderPath::cubicTo(float ox, float oy, float ix, float iy, float x, float y) { + // NSLog(@" --- call to RenderPath::cubicTo %.1f, %.1f, %.1f, %.1f, %.1f, %.1f, ", ox, oy, ix, iy, x, y); + [path addCurveToPoint:CGPointMake(x, y) + controlPoint1:CGPointMake(ox, oy) + controlPoint2:CGPointMake(ix, iy) + ]; +} + +// Renderer + +// Implement save by creating a sublayer +void NewRiveRenderer::save() { +// NSLog(@" --- Renderer::save"); + CGContextSaveGState(ctx); +} + +// Implement restore by moving back up to the parent layer. If the parent +// layer is ctx, then there's been a restore without a save +void NewRiveRenderer::restore() { +// NSLog(@" -- Renderer::restore"); + CGContextRestoreGState(ctx); +} + +void NewRiveRenderer::drawPath(RenderPath* path, RenderPaint* paint) { + + RiveRenderPaint *rivePaint = reinterpret_cast(paint); + RiveRenderPath *rivePath = reinterpret_cast(path); + +// NSLog(@" --- Renderer::drawPath path for type %d", rivePaint->paintStyle); + + // Apply the stroke join + if (rivePaint->strokeJoin != RiveStrokeJoin::None) { + switch(rivePaint->strokeJoin) { + case RiveStrokeJoin::Miter: + CGContextSetLineJoin(ctx, kCGLineJoinMiter); + break; + case RiveStrokeJoin::Round: + CGContextSetLineJoin(ctx, kCGLineJoinRound); + break; + case RiveStrokeJoin::Bevel: + CGContextSetLineJoin(ctx, kCGLineJoinBevel); + break; + default: + break; + } + } + + // Apply the strokeCap + if (rivePaint->strokeCap != RiveStrokeCap::None) { + switch (rivePaint->strokeCap) { + case RiveStrokeCap::Butt: + CGContextSetLineCap(ctx, kCGLineCapButt); + break; + case RiveStrokeCap::Round: + CGContextSetLineCap(ctx, kCGLineCapRound); + break; + case RiveStrokeCap::Square: + CGContextSetLineCap(ctx, kCGLineCapSquare); + break; + default: + break; + } + } + + // Apply the blend mode + if (rivePaint->currentBlendMode != RiveBlendMode::None) { + switch (rivePaint->currentBlendMode) { + case RiveBlendMode::SrcOver: + CGContextSetBlendMode(ctx, kCGBlendModeNormal); + break; + case RiveBlendMode::Screen: + CGContextSetBlendMode(ctx, kCGBlendModeScreen); + break; + case RiveBlendMode::Overlay: + CGContextSetBlendMode(ctx, kCGBlendModeOverlay); + break; + case RiveBlendMode::Darken: + CGContextSetBlendMode(ctx, kCGBlendModeDarken); + break; + case RiveBlendMode::Lighten: + CGContextSetBlendMode(ctx, kCGBlendModeLighten); + break; + case RiveBlendMode::ColorDodge: + CGContextSetBlendMode(ctx, kCGBlendModeColorDodge); + break; + case RiveBlendMode::ColorBurn: + CGContextSetBlendMode(ctx, kCGBlendModeColorBurn); + break; + case RiveBlendMode::HardLight: + CGContextSetBlendMode(ctx, kCGBlendModeHardLight); + break; + case RiveBlendMode::SoftLight: + CGContextSetBlendMode(ctx, kCGBlendModeSoftLight); + break; + case RiveBlendMode::Difference: + CGContextSetBlendMode(ctx, kCGBlendModeDifference); + break; + case RiveBlendMode::Exclusion: + CGContextSetBlendMode(ctx, kCGBlendModeExclusion); + break; + case RiveBlendMode::Multiply: + CGContextSetBlendMode(ctx, kCGBlendModeMultiply); + break; + case RiveBlendMode::Hue: + CGContextSetBlendMode(ctx, kCGBlendModeHue); + break; + case RiveBlendMode::Saturation: + CGContextSetBlendMode(ctx, kCGBlendModeSaturation); + break; + case RiveBlendMode::Color: + CGContextSetBlendMode(ctx, kCGBlendModeColor); + break; + case RiveBlendMode::Luminosity: + CGContextSetBlendMode(ctx, kCGBlendModeLuminosity); + break; + default: + break; + } + } + + // Add the path and then paint it appropriately + CGPathRef cgPath = rivePath->getBezierPath().CGPath; + CGContextAddPath(ctx, cgPath); + + // If fill or stroke set, draw appropriately + if (rivePaint->cgColor != NULL) { + switch (rivePaint->paintStyle) { + case RivePaintStyle::Stroke: +// NSLog(@"Painting stroke"); + CGContextSetStrokeColorWithColor(ctx, rivePaint->cgColor); + CGContextSetLineWidth(ctx, rivePaint->paintThickness); + CGContextDrawPath(ctx, kCGPathStroke); + break; + case RivePaintStyle::Fill: +// NSLog(@"Painting fill"); + CGContextSetFillColorWithColor(ctx, rivePaint->cgColor); + CGContextDrawPath(ctx, kCGPathFill); + break; + case RivePaintStyle::None: + break; + default: + break; + } + } else { +// NSLog(@"Color is null!!!"); + } + + // Draw gradient + if (rivePaint->gradient != RiveGradient::None) { + NSLog(@"Drawing a gradient"); + CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, &rivePaint->colorStops[0], &rivePaint->stops[0], rivePaint->stops.size()); + + // If the path is a stroke, then convert the path to a stroked path to prevent the gradient from filling the path + if (rivePaint->paintStyle == RivePaintStyle::Stroke) { + CGContextSetLineWidth(ctx, rivePaint->paintThickness); + CGContextReplacePathWithStrokedPath(ctx); + } + CGContextClip(ctx); + + if (rivePaint->gradient == RiveGradient::Linear) { + CGContextDrawLinearGradient(ctx, gradient, rivePaint->gradientStart, rivePaint->gradientEnd, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + } else if (rivePaint->gradient == RiveGradient:: Radial) { + // Calculate the end radius + float dx = rivePaint->gradientEnd.x - rivePaint->gradientStart.x; + float dy = rivePaint->gradientEnd.y - rivePaint->gradientStart.y; + float endRadius = sqrt(dx*dx + dy*dy); + CGContextDrawRadialGradient(ctx, gradient, rivePaint->gradientStart, 0, rivePaint->gradientStart, endRadius, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + //CGContextSetFillColorWithColor(ctx, [UIColor yellowColor].CGColor); + } + CGGradientRelease(gradient); gradient = NULL; + + if (rivePaint->paintStyle == RivePaintStyle::Fill) { + CGContextDrawPath(ctx, kCGPathFill); + } else if (rivePaint->paintStyle == RivePaintStyle::Stroke) { + NSLog(@"Gradient paint with stroke"); + CGContextDrawPath(ctx, kCGPathStroke); + } + } +} + +void NewRiveRenderer::clipPath(RenderPath* path) { + const CGPath *clipPath = reinterpret_cast(path)->getBezierPath().CGPath; +// NSLog(@" --- Renderer::clipPath %@", clipPath); + + CGContextAddPath(ctx, clipPath); + CGContextClip(ctx); +} + +void NewRiveRenderer::transform(const Mat2D& transform) { +// NSLog(@" --- Renderer::transform %.1f, %.1f, %.1f, %.1f, %.1f, %.1f", +// transform.xx(), +// transform.xy(), +// transform.yx(), +// transform.yy(), +// transform.tx(), +// transform.ty()); + + CGContextConcatCTM(ctx, CGAffineTransformMake(transform.xx(), + transform.xy(), + transform.yx(), + transform.yy(), + transform.tx(), + transform.ty())); +} + +/* + * makeRenderPaint & makeRenderPath implementations + */ + +namespace rive { + RenderPaint* makeRenderPaint() { return new RiveRenderPaint(); } + + RenderPath* makeRenderPath() { return new RiveRenderPath(); } +} diff --git a/Source/RiveKit/RiveView.h b/Source/RiveKit/RiveView.h new file mode 100644 index 0000000..3220c8e --- /dev/null +++ b/Source/RiveKit/RiveView.h @@ -0,0 +1,19 @@ +// +// RiveView.h +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import "Rive.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RiveView : UIView + +- (void)updateArtboard:(RiveArtboard*)artboard; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/RiveKit/RiveView.mm b/Source/RiveKit/RiveView.mm new file mode 100644 index 0000000..fa40180 --- /dev/null +++ b/Source/RiveKit/RiveView.mm @@ -0,0 +1,30 @@ +// +// RiveView.m +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import "RiveView.h" +#import "RiveRenderer.hpp" + +@interface RiveView() + +@end + +@implementation RiveView + +RiveArtboard *riveArtboard; + +- (void)drawRect:(CGRect)rect { + RiveRenderer *renderer = [[RiveRenderer alloc] initWithContext:UIGraphicsGetCurrentContext()]; + [renderer alignWithRect:rect withContentRect:[riveArtboard bounds] withAlignment:Alignment::Center withFit:Fit::Contain]; + [riveArtboard draw:renderer]; +} + +- (void)updateArtboard:(RiveArtboard *)artboard { + riveArtboard = artboard; +} + +@end diff --git a/Source/RiveKit/RiveViewController.h b/Source/RiveKit/RiveViewController.h new file mode 100644 index 0000000..0881442 --- /dev/null +++ b/Source/RiveKit/RiveViewController.h @@ -0,0 +1,19 @@ +// +// RiveViewController.h +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface RiveViewController : UIViewController + +-(instancetype)initWithResource:(NSString *)resource withExtension:(NSString *)extension; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/RiveKit/RiveViewController.mm b/Source/RiveKit/RiveViewController.mm new file mode 100644 index 0000000..77f59e7 --- /dev/null +++ b/Source/RiveKit/RiveViewController.mm @@ -0,0 +1,114 @@ +// +// RiveViewController.m +// RiveRuntime +// +// Created by Matt Sullivan on 9/11/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import "Rive.h" +#import "RiveViewController.h" +#import "RiveView.h" + +@implementation RiveViewController + +NSString *_resource; +NSString *_extension; + +RiveArtboard *artboard; +RiveLinearAnimationInstance *_instance; + +CADisplayLink *displayLink = NULL; +CFTimeInterval lastTime = .0; + + +- (instancetype)initWithResource:(NSString *) resource withExtension:(NSString *)extension { + if (self = [super init]) { + _resource = resource; + _extension = extension; + return self; + } else { + return nil; + } +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self forResource:_resource withExtension:_extension]; +} + +- (void) loadView { + RiveView *riveView = [[RiveView alloc] init]; + [riveView setBackgroundColor:[UIColor blueColor]]; + self.view = riveView; +} + +- (void) forResource: (NSString *) resource withExtension: (NSString *) extension { + // load the Rive data + NSString *filepath = [[NSBundle mainBundle] pathForResource:resource ofType:extension]; + NSError *error; + NSData* data = [NSData dataWithContentsOfFile:filepath options:NSDataReadingUncached error:&error]; + // initialize the Rive file + RiveFile* riveFile = [[RiveFile alloc] init]; + UInt8 *bytes = (UInt8 *) data.bytes; + ImportResult result = [RiveFile import:bytes bytesLength:data.length toFile:riveFile]; + if (result != 0) { + NSLog(@"Unable to import file: result code %i", (uint)result); + return; + } + + artboard = [riveFile artboard]; + // update the artboard in the view + [(RiveView *)self.view updateArtboard: artboard]; + + NSInteger animationCount = [artboard animationCount]; +// NSLog(@"Animation count: %d", (uint)animationcount); + + if (animationCount > 0) { + RiveAnimation *animation = [artboard animationAt: 0]; + // NSLog(@"Animation name: %@", [animation name]); + _instance = [animation instance]; + [_instance advanceBy:.0]; // advance the animation + [_instance applyTo:artboard]; // apply to the artboard + [artboard advanceBy:.0]; // advance the artboard + + [self runTimer]; + } +} + +-(void) runTimer { + displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick)]; + [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; +} + +-(void) stopTimer { + if (displayLink != NULL) { + [displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + } +} + +-(void) tick { + if (displayLink == NULL) { + // Something's gone wrong, clean up and bug out + [self stopTimer]; + } + + double timestamp = [displayLink timestamp]; + + // Last time needs to be set on the first tick + if (lastTime == 0) { + lastTime = timestamp; + } + + // Calculate the time elapsed between ticks + double elapsedTime = timestamp - lastTime; + lastTime = timestamp; +// NSLog(@"Timestamp: %.1f, elapsed time: %.5f, framerate %.1f", [displayLink timestamp], elapsedTime, 1. / elapsedTime); + + [_instance advanceBy:elapsedTime]; // advance the animation + [_instance applyTo:artboard]; // apply to the artboard + [artboard advanceBy:elapsedTime]; // advance the artboard + + [self.view setNeedsDisplay]; +} +@end diff --git a/Source/RiveRuntime.h b/Source/RiveRuntime.h new file mode 100644 index 0000000..b0e8bd9 --- /dev/null +++ b/Source/RiveRuntime.h @@ -0,0 +1,20 @@ +// +// RiveRuntime.h +// RiveRuntime +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import + +//! Project version number for RiveRuntime. +FOUNDATION_EXPORT double RiveRuntimeVersionNumber; + +//! Project version string for RiveRuntime. +FOUNDATION_EXPORT const unsigned char RiveRuntimeVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import +#import +#import +#import diff --git a/Source/Runtime/RiveRenderer.h b/Source/Runtime/RiveRenderer.h new file mode 100644 index 0000000..198f436 --- /dev/null +++ b/Source/Runtime/RiveRenderer.h @@ -0,0 +1,20 @@ +// +// RiveRenderer.h +// RiveRuntime +// +// Created by Matt Sullivan on 8/31/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface RiveRenderer : NSObject + +-(instancetype) initWithContext:(UIBezierPath *) context; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/Runtime/RiveRenderer.mm b/Source/Runtime/RiveRenderer.mm new file mode 100644 index 0000000..7e25526 --- /dev/null +++ b/Source/Runtime/RiveRenderer.mm @@ -0,0 +1,26 @@ +// +// RiveRenderer.m +// RiveRuntime +// +// Created by Matt Sullivan on 8/31/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#import "RiveRenderer.h" + + +@implementation RiveRenderer + +//iOSRenderer *renderer; +UIBezierPath *renderContext; + +-(instancetype) initWithContext:(UIBezierPath *) context { + if (self = [super init]) { + renderContext = context; + return self; + } else { + return nil; + } +} + +@end diff --git a/Source/TestHeader.h b/Source/TestHeader.h new file mode 100644 index 0000000..1499e31 --- /dev/null +++ b/Source/TestHeader.h @@ -0,0 +1,15 @@ +// +// TestHeader.h +// RiveRuntime +// +// Created by Matt Sullivan on 8/30/20. +// Copyright © 2020 Rive. All rights reserved. +// + +#ifndef TestHeader_h +#define TestHeader_h + +#import "RiveRuntime/Runtime/RiveFile.h" + + +#endif /* TestHeader_h */